]> matita.cs.unibo.it Git - helm.git/blobdiff - matitaB/matita/matitaweb.js
Matitaweb: large commit porting to the new Matita 0.95 syntax.
[helm.git] / matitaB / matita / matitaweb.js
index d1480e72d744088a41881c32c6f4b33f9caaf502..30c138385e33b659b9c5f323273f7e79a8a2d8f7 100644 (file)
@@ -497,22 +497,6 @@ String.prototype.matita_to_html = function()
        return (unescape(result));
 }
 
-function pause()
-{
-       advanceButton.disabled = true;
-        retractButton.disabled = true;
-        cursorButton.disabled = true;
-        bottomButton.disabled = true;
-}
-
-function resume()
-{
-       advanceButton.disabled = false;
-        retractButton.disabled = false;
-        cursorButton.disabled = false;
-        bottomButton.disabled = false;
-}
-
 function is_defined(x)
 {
        return (typeof x != "undefined");
@@ -580,107 +564,304 @@ function callServer(servicename,processResponse,reqbody)
   
 }
 
-function advanceForm1()
-{
-       processor = function(xml) {
-               if (is_defined(xml)) {
-                        var parsed = xml.getElementsByTagName("parsed")[0];
-                       var ambiguity = xml.getElementsByTagName("ambiguity")[0];
-                        if (is_defined(parsed)) {
-                       // debug("advance: received response\nBEGIN\n" + req.responseText + "\nEND");
-                           var len = parseInt(parsed.getAttribute("length"));
-                           // len0 = unlocked.innerHTML.length;
-                           var unescaped = unlocked.innerHTML.html_to_matita();
-                           var parsedtxt = parsed.childNodes[0].wholeText;
-                           //parsedtxt = unescaped.substr(0,len); 
-                           var unparsedtxt = unescaped.substr(len);
-                           lockedbackup += parsedtxt;
-                           locked.innerHTML = lockedbackup;
-                           unlocked.innerHTML = unparsedtxt.matita_to_html();
-                           // len1 = unlocked.innerHTML.length;
-                           // len2 = len0 - len1;
-                           var len2 = parsedtxt.length;
-                           var metasenv = xml.getElementsByTagName("meta");
-                           populate_goalarray(metasenv);
-                           init_autotraces();
-                           statements = listcons(len2,statements);
-                           unlocked.scrollIntoView(true);
-                       }
-                       else if (is_defined(ambiguity)) {
-                           var start = parseInt(ambiguity.getAttribute("start"));
-                           var stop = parseInt(ambiguity.getAttribute("stop"));
-                           var choices = xml.getElementsByTagName("choice");
+function advOneStep(xml) {
+        var parsed = xml.getElementsByTagName("parsed")[0];
+       var ambiguity = xml.getElementsByTagName("ambiguity")[0];
+       var disamberr = xml.getElementsByTagName("disamberror")[0];
+        if (is_defined(parsed)) {
+       // debug("advance: received response\nBEGIN\n" + req.responseText + "\nEND");
+           var len = parseInt(parsed.getAttribute("length"));
+            // len0 = unlocked.innerHTML.length;
+           var unescaped = unlocked.innerHTML.html_to_matita();
+           var parsedtxt = parsed.childNodes[0].wholeText;
+           //parsedtxt = unescaped.substr(0,len); 
+           var unparsedtxt = unescaped.substr(len);
+           lockedbackup += parsedtxt;
+           locked.innerHTML = lockedbackup;
+           unlocked.innerHTML = unparsedtxt.matita_to_html();
+           // len1 = unlocked.innerHTML.length;
+           // len2 = len0 - len1;
+           var len2 = parsedtxt.length;
+           var metasenv = xml.getElementsByTagName("meta");
+           statements = listcons(len2,statements);
+           unlocked.scrollIntoView(true);
+           return len;
+       }
+       else if (is_defined(ambiguity)) {
+           var start = parseInt(ambiguity.getAttribute("start"));
+           var stop = parseInt(ambiguity.getAttribute("stop"));
+           var choices = xml.getElementsByTagName("choice");
+
+           matita.ambiguityStart = start;
+           matita.ambiguityStop = stop;
+           matita.unlockedbackup = unlocked.innerHTML.html_to_matita();
+           matita.interpretations = [];
+       
+           var unlockedtxt = unlocked.innerHTML.html_to_matita();
+           var pre = unlockedtxt.substring(0,start).matita_to_html();
+           var mid = unlockedtxt.substring(start,stop).matita_to_html();
+           var post = unlockedtxt.substring(stop).matita_to_html();
+           unlocked.innerHTML = pre + 
+                   "<span class=\"error\" title=\"disambiguation error\">" +
+                   mid + "</span>" + post;
+
+           var title = "<H3>Ambiguous input</H3>";
+           disambcell.innerHTML = title;
+           for (i = 0;i < choices.length;i++) {
+               matita.interpretations[i] = new Object();
+
+               var href = choices[i].getAttribute("href");
+               var title = choices[i].getAttribute("title");
+               var desc = choices[i].childNodes[0].nodeValue;
+
+               matita.interpretations[i].href = href;
+               matita.interpretations[i].title = title;
+               matita.interpretations[i].desc = desc;
+               
+               var choice = document.createElement("input");
+               choice.setAttribute("type","radio");
+               choice.setAttribute("name","interpr");
+               choice.setAttribute("href",href);
+               choice.setAttribute("title",title);
+               if (i == 0) choice.setAttribute("checked","");
+               
+               disambcell.appendChild(choice);
+               disambcell.appendChild(document.createTextNode(desc));
+               disambcell.appendChild(document.createElement("br"));
+           }
 
-                           matita.ambiguityStart = start;
-                           matita.ambiguityStop = stop;
-                           matita.unlockedbackup = unlocked.innerHTML.html_to_matita();
-                           matita.interpretations = [];
-                       
-                           var unlockedtxt = unlocked.innerHTML.html_to_matita();
-                           var pre = unlockedtxt.substring(0,start).matita_to_html();
-                           var mid = unlockedtxt.substring(start,stop).matita_to_html();
-                           var post = unlockedtxt.substring(stop).matita_to_html();
-                           unlocked.innerHTML = pre + 
-                                   "<span class=\"error\" title=\"disambiguation error\">" +
-                                   mid + "</span>" + post;
+           var okbutton = document.createElement("input");
+           okbutton.setAttribute("type","button");
+           okbutton.setAttribute("value","OK");
+           okbutton.setAttribute("onclick","do_disambiguate()");
+           var cancelbutton = document.createElement("input");
+           cancelbutton.setAttribute("type","button");
+           cancelbutton.setAttribute("value","Cancel");
+           cancelbutton.setAttribute("onclick","cancel_disambiguate()");
 
-                           var title = "<H3>Ambiguous input</H3>";
-                           disambcell.innerHTML = title;
-                           for (i = 0;i < choices.length;i++) {
-                               matita.interpretations[i] = new Object();
+           disambcell.appendChild(okbutton);
+           disambcell.appendChild(cancelbutton);
 
-                               var href = choices[i].getAttribute("href");
-                               var title = choices[i].getAttribute("title");
-                               var desc = choices[i].childNodes[0].nodeValue;
+           disable_toparea();
 
-                               matita.interpretations[i].href = href;
-                               matita.interpretations[i].title = title;
-                               matita.interpretations[i].desc = desc;
-                               
-                               var choice = document.createElement("input");
-                               choice.setAttribute("type","radio");
-                               choice.setAttribute("name","interpr");
-                               choice.setAttribute("href",href);
-                               choice.setAttribute("title",title);
-                               if (i == 0) choice.setAttribute("checked","");
-                               
-                               disambcell.appendChild(choice);
-                               disambcell.appendChild(document.createTextNode(desc));
-                               disambcell.appendChild(document.createElement("br"));
-                           }
-
-                           var okbutton = document.createElement("input");
-                           okbutton.setAttribute("type","button");
-                           okbutton.setAttribute("value","OK");
-                           okbutton.setAttribute("onclick","do_disambiguate()");
-                           var cancelbutton = document.createElement("input");
-                           cancelbutton.setAttribute("type","button");
-                           cancelbutton.setAttribute("value","Cancel");
-                           cancelbutton.setAttribute("onclick","cancel_disambiguate()");
-
-                           disambcell.appendChild(okbutton);
-                           disambcell.appendChild(cancelbutton);
+           matita.disambMode = true;
+           updateSide();
+           throw "Stop";
+       }
+       else if (is_defined(disamberr)) {
+            set_cps(disamberr.childNodes);
+            matita.unlockedbackup = unlocked.innerHTML.html_to_matita();
+            matita.disambMode = true;
+            disable_toparea();
+            next_cp(0);
+           throw "Stop";
+       }
+        else {
+            var error = xml.getElementsByTagName("error")[0]; 
+           unlocked.innerHTML = error.childNodes[0].wholeText;
+           // debug(xml.childNodes[0].nodeValue);
+           throw "Stop";
+       }
 
-                           disable_toparea();
+}
 
-                           matita.disambMode = true;
-                           updateSide();
-                       }
-                       else {
-                            var error = xml.getElementsByTagName("error")[0]; 
-                           unlocked.innerHTML = error.childNodes[0].wholeText;
-                           // debug(xml.childNodes[0].nodeValue);
-                       }
+function advanceForm1()
+{
+       processor = function(xml) {
+           try {
+               if (is_defined(xml)) {
+                   advOneStep(xml);
+                    populate_goalarray(metasenv);
+                   init_autotraces();
                } else {
                        debug("advance failed");
                }
-               resume();
+           } catch (e) { 
+                   // nothing to do 
+           };
+            resume();
        };
        pause();
         callServer("advance",processor,"body=" + (unlocked.innerHTML.html_to_matita()).sescape());
   
 }
 
+// get or set <choicepoint>'s (in case of disamb error)
+function get_cps() {
+       return matita.choicepoints
+}
+
+function set_cps(cps) {
+       matita.choicepoints = cps;
+}
+
+// get radio buttons for <choice>'s in a given cp
+function get_choice_opts(i) {
+   var res = [];
+   var choices = get_cps()[i].childNodes;
+   for (var j = 0;j < choices.length;j++) {
+      var href = choices[j].getAttribute("href");
+      var title = choices[j].getAttribute("title");
+      var desc;
+      if (is_defined(title)) {
+          desc = title;
+      } else if (is_defined(href)) {
+          desc = href;
+      } else {
+          desc = "Preliminary error";
+      }
+  
+      res[j] = document.createElement("input");
+      res[j].setAttribute("type","radio");
+      res[j].setAttribute("name","choice");
+      res[j].setAttribute("choicepointno",i);
+      res[j].setAttribute("choiceno",j);
+      res[j].setAttribute("href",href);
+      res[j].setAttribute("title",title);
+      res[j].setAttribute("desc",desc);
+      
+      if (j == 0) res[j].setAttribute("checked","");
+  }
+  return res;
+}
+
+// get radio buttons for <failure>'s in a given choice
+function get_failure_opts(i,j) {
+   var res = [];
+   var failures = get_cps()[i].childNodes[j].childNodes;
+   for (var k = 0;k < failures.length;k++) {
+      var start = failures[k].getAttribute("start");
+      var stop = failures[k].getAttribute("stop");
+      var title = failures[k].getAttribute("title");
+  
+      res[k] = document.createElement("input");
+      res[k].setAttribute("type","radio");
+      res[k].setAttribute("name","failure");
+      res[k].setAttribute("choicepointno",i);
+      res[k].setAttribute("choiceno",j);
+      res[k].setAttribute("failureno",k);
+      res[k].setAttribute("start",start);
+      res[k].setAttribute("stop",stop);
+      res[k].setAttribute("title",title);
+      
+      if (k == 0) res[k].setAttribute("checked","");
+  }
+  return res;
+}
+
+function next_cp(curcp) {
+       var cp = get_cps()[curcp];
+       var start = parseInt(cp.getAttribute("start"));
+       var stop = parseInt(cp.getAttribute("stop"));
+
+       matita.errorStart = start;
+       matita.errorStop = stop;
+       // matita.unlockedbackup = unlocked.innerHTML.html_to_matita();
+       
+       var unlockedtxt = matita.unlockedbackup;
+       var pre = unlockedtxt.substring(0,start).matita_to_html();
+       var mid = unlockedtxt.substring(start,stop).matita_to_html();
+       var post = unlockedtxt.substring(stop).matita_to_html();
+       unlocked.innerHTML = pre + 
+               "<span class=\"error\" title=\"disambiguation failed\">" +
+               mid + "</span>" + post;
+
+       var title = "<H3>Disambiguation failed</H3>";
+       disambcell.innerHTML = title;
+       var choices = get_choice_opts(curcp);
+       for (var i = 0;i < choices.length;i++) {
+           disambcell.appendChild(choices[i]);
+           disambcell.appendChild(document.createTextNode(choices[i].getAttribute("desc")));
+           disambcell.appendChild(document.createElement("br"));
+       }
+       
+       // update index of the next choicepoint
+       new_curcp = (curcp + 1) % get_cps().length;
+
+       var okbutton = document.createElement("input");
+       okbutton.setAttribute("type","button");
+       okbutton.setAttribute("value","OK");
+       okbutton.setAttribute("onclick","show_failures()");
+       var cancelbutton = document.createElement("input");
+       cancelbutton.setAttribute("type","button");
+       cancelbutton.setAttribute("value","Close");
+       cancelbutton.setAttribute("onclick","cancel_disambiguate()");
+       var tryagainbutton = document.createElement("input");
+       tryagainbutton.setAttribute("type","button");
+       if (new_curcp > 0) {
+            tryagainbutton.setAttribute("value","Try something else");
+       } else {
+           tryagainbutton.setAttribute("value","Restart");
+       }
+       tryagainbutton.setAttribute("onclick","next_cp(" + new_curcp + ")");
+
+       disambcell.appendChild(okbutton);
+       disambcell.appendChild(tryagainbutton);
+       disambcell.appendChild(cancelbutton);
+
+       //disable_toparea();
+
+       //matita.disambMode = true;
+       updateSide();
+       
+}
+
+function show_failures() {
+
+       var choice = document.getElementsByName("choice")[get_checked_index("choice")];
+       var cpno = parseInt(choice.getAttribute("choicepointno"));
+       var choiceno = parseInt(choice.getAttribute("choiceno"));
+       var choicedesc = choice.getAttribute("desc");
+
+       var title = "<H3>Disambiguation failed</H3>";
+       var subtitle = "<p>Errors at node " + cpno + " = " + choicedesc + "</p>";
+
+       disambcell.innerHTML = title + subtitle;
+       var failures = get_failure_opts(cpno,choiceno);
+       for (var i = 0;i < failures.length;i++) {
+           disambcell.appendChild(failures[i]);
+           disambcell.appendChild(document.createTextNode(failures[i].getAttribute("title")));
+           disambcell.appendChild(document.createElement("br"));
+       }
+       
+       var okbutton = document.createElement("input");
+       okbutton.setAttribute("type","button");
+       okbutton.setAttribute("value","Show error loc");
+       okbutton.setAttribute("onclick","show_err()");
+       var cancelbutton = document.createElement("input");
+       cancelbutton.setAttribute("type","button");
+       cancelbutton.setAttribute("value","Close");
+       cancelbutton.setAttribute("onclick","cancel_disambiguate()");
+       var backbutton = document.createElement("input");
+       backbutton.setAttribute("type","button");
+        backbutton.setAttribute("value","<< Back");
+       backbutton.setAttribute("onclick","next_cp(" + cpno + ")");
+
+       disambcell.appendChild(backbutton);
+       disambcell.appendChild(okbutton);
+       disambcell.appendChild(cancelbutton);
+       
+}
+
+function show_err() {
+       var radios = document.getElementsByName("failure");
+       for (i = 0; i < radios.length; i++) {
+           if (radios[i].checked) {
+               var start = radios[i].getAttribute("start");
+               var stop = radios[i].getAttribute("stop");
+               var title = radios[i].getAttribute("title");
+               var unlockedtxt = matita.unlockedbackup;
+               var pre = unlockedtxt.substring(0,start).matita_to_html();
+               var mid = unlockedtxt.substring(start,stop).matita_to_html();
+               var post = unlockedtxt.substring(stop).matita_to_html();
+               unlocked.innerHTML = pre + 
+                       "<span class=\"error\" title=\"Disambiguation failure\">" +
+                       mid + "</span>" + post;
+               break;
+           }
+       }
+}
+
 function gotoBottom()
 {
        processor = function(xml) {
@@ -816,6 +997,7 @@ function gotoTop()
        callServer("top",processor,"body=" + (unlocked.innerHTML.html_to_matita()).sescape());
   
 }
+
 function gotoPos(offset)
 {
         if (!is_defined(offset)) {
@@ -823,6 +1005,8 @@ function gotoPos(offset)
         }
        processor = function(xml) {
                if (is_defined(xml)) {
+                   try {
+                       /*
                        parsed = xml.getElementsByTagName("parsed")[0];
                        len = parseInt(parsed.getAttribute("length"));
                        // len0 = unlocked.innerHTML.length;
@@ -840,6 +1024,8 @@ function gotoPos(offset)
                        statements = listcons(len2,statements);
                        unlocked.scrollIntoView(true);
                        // la populate non andrebbe fatta a ogni passo
+                       */
+                       var len = advOneStep(xml);
                        if (offset <= len) {
                                init_autotraces();
                                populate_goalarray(metasenv);
@@ -847,6 +1033,11 @@ function gotoPos(offset)
                        } else {
                                gotoPos(offset - len);
                        }
+                   } catch (er) {
+                       init_autotraces();
+                       populate_goalarray(metasenv);
+                       resume();
+                   }
                } else {
                        init_autotraces();
                        unlocked.scrollIntoView(true);
@@ -1240,7 +1431,8 @@ function get_checked_index(name) {
 
 function cancel_disambiguate() {
        matita.disambMode = false;
-       $('#whitemask').hide();
+       enable_toparea();
+       enable_editing();
        updateSide();
 }
 
@@ -1267,11 +1459,37 @@ function do_disambiguate() {
            unlocked.innerHTML = pre + mid + post;
 
            matita.disambMode = false;
-           $('#whitemask').hide();
+           enable_toparea();
+           enable_editing();
            updateSide();
        }
 }
 
+function do_showerror() {
+       var i = get_checked_index("choice");
+       if (i != null) {
+           var pre = matita.unlockedbackup
+                     .substring(0,matita.ambiguityStart).matita_to_html();
+           var mid = matita.unlockedbackup
+                     .substring(matita.ambiguityStart,matita.ambiguityStop)
+                     .matita_to_html();
+           var post = matita.unlockedbackup
+                      .substring(matita.ambiguityStop).matita_to_html();
+
+           var href = matita.interpretations[i].href;
+           var title = matita.interpretations[i].title;
+
+           if (is_defined(title)) {
+                mid = "<A href=\"" + href + "\" title=\"" + title + "\">" + mid + "</A>";
+           } else {
+                mid = "<A href=\"" + href + "\">" + mid + "</A>";
+           }
+
+           unlocked.innerHTML = pre + mid + post;
+
+       }
+}
+
 function readCookie(name) {
        var nameEQ = name + "=";
        var ca = document.cookie.split(';');
@@ -1303,3 +1521,36 @@ function disable_toparea() {
         $('#whitemask').css('height',$('#toparea').outerHeight() + "px");
        $('#whitemask').fadeTo('fast',0.7);
 }
+
+function enable_toparea() {
+       $('#whitemask').hide();
+}
+
+function disable_editing() {
+       unlocked.contentEditable = false;
+}
+
+function enable_editing() {
+       unlocked.contentEditable = true;
+}
+
+function pause()
+{
+       // advanceButton.disabled = true;
+        // retractButton.disabled = true;
+        // cursorButton.disabled = true;
+        // bottomButton.disabled = true;
+       disable_toparea();
+       disable_editing();
+}
+
+function resume()
+{
+       // advanceButton.disabled = false;
+        // retractButton.disabled = false;
+        // cursorButton.disabled = false;
+        // bottomButton.disabled = false;
+       enable_toparea();
+       enable_editing();
+}
+