X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=matitaB%2Fmatita%2Fmatitaweb.js;h=6e6b905dba52173bdac9fc007b5ec872a413f4c5;hb=f5b9e1d5511a13ca5bb424c149781087aa0c8e31;hp=f0563928234812f20f980c467fc9b671784a1e6a;hpb=866590ce137ec8fbbaf83fa8ba572177c30dbdd8;p=helm.git diff --git a/matitaB/matita/matitaweb.js b/matitaB/matita/matitaweb.js index f05639282..6e6b905db 100644 --- a/matitaB/matita/matitaweb.js +++ b/matitaB/matita/matitaweb.js @@ -16,6 +16,7 @@ var dialogTitle; var dialogContent; var metasenv = ""; var lockedbackup = ""; +var matita; function text_of_html(h) { @@ -33,16 +34,32 @@ function unescape_html(s) return text_of_html(u) } +function filterByClass (elements,cname){ + var itemsfound = new Array; + for(var i=0;i 0) { + tags[0].parentNode.removeChild(tags[0]); + } +} + +function strip_interpr() { + strip_tags("A"); + alert("strip_interpr ended"); +} function keypress(e) { if (!e) e= event; pressmesg('keypress',e); var s = string_of_key(e.charCode); + strip_tags("span","error"); if (s == " ") { j = getCursorPos(); - i = unlocked.innerHTML.lastIndexOf('\\',j); + i = unlocked.innerHTML.html_to_matita().lastIndexOf('\\',j); if (i >= 0) { - match = unlocked.innerHTML.substring(i,j); + match = unlocked.innerHTML.html_to_matita().substring(i,j); sym = unescape_html(lookup_tex(match)); if (sym != "undefined") { if (window.getSelection) { // non IE @@ -210,7 +279,7 @@ function debug(txt) // but google chrome's innerText is, in a sense, "write only" // what should we do? // logarea.innerText = txt + "\n" + logarea.innerText; - logtxt = logtxt + "\n" + txt; + logtxt = /* logtxt + "\n" +*/ txt; } function showLog() { @@ -248,6 +317,9 @@ function listnil() return (""); } +function list_append(l1,l2) +{ return (l1 + l2) } + function is_nil(l) { return (l == ""); @@ -512,24 +584,101 @@ function advanceForm1() { processor = function(xml) { if (is_defined(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"); - parsed = xml.getElementsByTagName("parsed")[0]; - len = parseInt(parsed.getAttribute("length")); - // len0 = unlocked.innerHTML.length; - unescaped = unlocked.innerHTML.html_to_matita(); - parsedtxt = parsed.childNodes[0].nodeValue; - //parsedtxt = unescaped.substr(0,len); - unparsedtxt = unescaped.substr(len); - lockedbackup += parsedtxt; - locked.innerHTML = lockedbackup; - unlocked.innerHTML = unparsedtxt.matita_to_html(); - // len1 = unlocked.innerHTML.length; - // len2 = len0 - len1; - len2 = parsedtxt.length; - metasenv = xml.getElementsByTagName("meta"); - populate_goalarray(metasenv); - statements = listcons(len2,statements); - unlocked.scrollIntoView(true); + 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"); + + 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 + + "" + + mid + "" + post; + + var title = "

Ambiguous input

"; + 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")); + } + + 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); + + disable_toparea(); + + matita.disambMode = true; + updateSide(); + } + else if (is_defined(disamberr)) { + set_cps(disamberr.childNodes); + matita.unlockedbackup = unlocked.innerHTML.html_to_matita(); + matita.disambMode = true; + disable_toparea(); + next_cp(0); + } + else { + var error = xml.getElementsByTagName("error")[0]; + unlocked.innerHTML = error.childNodes[0].wholeText; + // debug(xml.childNodes[0].nodeValue); + } } else { debug("advance failed"); } @@ -540,31 +689,276 @@ function advanceForm1() } +// get or set 's (in case of disamb error) +function get_cps() { + return matita.choicepoints +} + +function set_cps(cps) { + matita.choicepoints = cps; +} + +// get radio buttons for '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 '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 + + "" + + mid + "" + post; + + var title = "

Disambiguation failed

"; + 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 = "

Disambiguation failed

"; + var subtitle = "

Errors at node " + cpno + " = " + choicedesc + "

"; + + 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 + + "" + + mid + "" + post; + break; + } + } +} + function gotoBottom() { processor = function(xml) { if (is_defined(xml)) { // debug("goto bottom: received response\nBEGIN\n" + req.responseText + "\nEND"); - parsed = xml.getElementsByTagName("parsed")[0]; - len = parseInt(parsed.getAttribute("length")); - if (len > 0) { + var parsed = xml.getElementsByTagName("parsed"); + var localized = xml.getElementsByTagName("localized")[0]; + var ambiguity = xml.getElementsByTagName("ambiguity")[0]; + var generic_err = xml.getElementsByTagName("error")[0]; + for (var i = 0;i < parsed.length; i++) { + var len = parsed[i].getAttribute("length"); // len0 = unlocked.innerHTML.length; - unescaped = unlocked.innerHTML.html_to_matita(); - // not working in mozilla - // parsedtxt = parsed.childNodes[0].nodeValue; - parsedtxt = parsed.childNodes[0].wholeText; + var unescaped = unlocked.innerHTML.html_to_matita(); + // the browser may decide to split textnodes: use wholeText! + var parsedtxt = parsed[i].childNodes[0].wholeText; //parsedtxt = unescaped.substr(0,len); - unparsedtxt = unescaped.substr(len); + var unparsedtxt = unescaped.substr(len); lockedbackup += parsedtxt; locked.innerHTML = lockedbackup; //.matita_to_html(); unlocked.innerHTML = unparsedtxt.matita_to_html(); // len1 = unlocked.innerHTML.length; - len2 = parsedtxt.length; - metasenv = xml.getElementsByTagName("meta"); - populate_goalarray(metasenv); - if (len2 > 0) - statements = listcons(len2,statements); - unlocked.scrollIntoView(true); + var len2 = parsedtxt.length; + statements = listcons(len2,statements); + } + unlocked.scrollIntoView(true); + metasenv = xml.getElementsByTagName("meta"); + init_autotraces(); + populate_goalarray(metasenv); + + 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 + + "" + + mid + "" + post; + + var title = "

Ambiguous input

"; + 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")); + } + + 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); + + disable_toparea(); + + matita.disambMode = true; + updateSide(); + } + if (is_defined(localized)) { + unlocked.innerHTML = localized.wholeText; + } + if (is_defined(generic_err)) { + debug("Unmanaged error:\n" ^ generic_err.wholeText); } } else { debug("goto bottom failed"); @@ -573,7 +967,6 @@ function gotoBottom() }; pause(); callServer("bottom",processor,"body=" + (unlocked.innerHTML.html_to_matita()).sescape()); - } @@ -595,6 +988,7 @@ function gotoTop() unlocked.innerHTML = lockedbackup + unlocked.innerHTML; lockedbackup = ""; locked.innerHTML = lockedbackup; + init_autotraces(); hideSequent(); unlocked.scrollIntoView(true); } else { @@ -617,7 +1011,7 @@ function gotoPos(offset) len = parseInt(parsed.getAttribute("length")); // len0 = unlocked.innerHTML.length; unescaped = unlocked.innerHTML.html_to_matita(); - parsedtxt = parsed.childNodes[0].nodeValue; + parsedtxt = parsed.childNodes[0].wholeText; //parsedtxt = unescaped.substr(0,len); unparsedtxt = unescaped.substr(len); lockedbackup += parsedtxt; @@ -631,12 +1025,14 @@ function gotoPos(offset) unlocked.scrollIntoView(true); // la populate non andrebbe fatta a ogni passo if (offset <= len) { + init_autotraces(); populate_goalarray(metasenv); resume(); } else { gotoPos(offset - len); } } else { + init_autotraces(); unlocked.scrollIntoView(true); populate_goalarray(metasenv); resume(); @@ -665,6 +1061,7 @@ function retract() locked.innerHTML = lockedbackup; unlocked.innerHTML = statement + unlocked.innerHTML; metasenv = xml.getElementsByTagName("meta"); + init_autotraces(); populate_goalarray(metasenv); unlocked.scrollIntoView(true); } else { @@ -710,12 +1107,13 @@ function retrieveFile(thefile) } else { unlocked.innerHTML = xml.childNodes[0].textContent; } + init_autotraces(); } else { debug("file open failed"); } }; - dialogBox.style.display = "none"; + abortDialog(); callServer("open",processor,"file=" + escape(thefile)); } @@ -800,7 +1198,7 @@ function openDialog() function saveDialog() { callback = function (fname) { - dialogBox.style.display = "none"; + abortDialog(); saveFile(fname, (locked.innerHTML.html_to_matita()).sescape(), (unlocked.innerHTML.html_to_matita()).sescape(), @@ -812,7 +1210,7 @@ function saveDialog() function newDialog() { callback = function (fname) { - dialogBox.style.display = "none"; + abortDialog(); saveFile(fname,"","",false,newDialog,true); }; showLibrary("Create new file", callback, newDialog); @@ -914,34 +1312,50 @@ function updateAll() var goalcell; function hideSequent() { - goalcell.style.display = "none"; - scriptcell.style.width = "100%"; - scriptcell.style.minWidth = "100%"; - scriptcell.style.maxWidth = "100%"; + matita.proofMode = false; + updateSide(); } function showSequent() { - scriptcell.style.width = "67%"; - scriptcell.style.minWidth = "67%"; - scriptcell.style.maxWidth = "67%"; - goalcell.style.display = "inline-block"; + matita.proofMode = true; + updateSide(); } function showDialog(title,content,callback) { dialogTitle.innerHTML = title; dialogContent.innerHTML = content; dialogBox.callback = callback; + + //Get the screen height and width + var maskHeight = $(document).height(); + var maskWidth = $(window).width(); + + //Set heigth and width to mask to fill up the whole screen + $('#mask').css({'width':maskWidth,'height':maskHeight}); + + //transition effect + $('#mask').fadeIn(100); + $('#mask').fadeTo(200,0.8); + + //Get the window height and width + var winH = $(window).height(); + var winW = $(window).width(); + + //Set the popup window to center + $('#dialogBox').css('top', winH/2-$('#dialogBox').height()/2); + $('#dialogBox').css('left', winW/2-$('#dialogBox').width()/2); + + //transition effect + $('#dialogBox').fadeIn(200); + dialogBox.style.display = "block"; } -function abortDialog() { +function abortDialog(dialog) { + $('#mask').hide(); dialogBox.style.display = "none"; } -function abortUpload() { - uploadBox.style.display = "none"; -} - function removeElement(id) { var element = document.getElementById(id); element.parentNode.removeChild(element); @@ -988,7 +1402,7 @@ function findNode(list, node, acc) { dup = list[i].cloneNode(true); sandbox.appendChild(dup); // debug("fail " + i + ": " + sandbox.innerHTML); - acc += sandbox.innerHTML.length; + acc += sandbox.innerHTML.html_to_matita().length; sandbox.removeChild(dup); } throw "not found"; @@ -998,6 +1412,75 @@ function test () { debug("cursor test: " + unlocked.innerHTML.substr(0,getCursorPos())); } +function get_checked_index(name) { + var radios = document.getElementsByName(name); + for (i = 0; i < radios.length; i++) { + if (radios[i].checked) { + return i; + } + } + return null; +} + +function cancel_disambiguate() { + matita.disambMode = false; + $('#whitemask').hide(); + updateSide(); +} + +function do_disambiguate() { + var i = get_checked_index("interpr"); + 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 = "" + mid + ""; + } else { + mid = "" + mid + ""; + } + + unlocked.innerHTML = pre + mid + post; + + matita.disambMode = false; + $('#whitemask').hide(); + 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 = "" + mid + ""; + } else { + mid = "" + mid + ""; + } + + unlocked.innerHTML = pre + mid + post; + + } +} + function readCookie(name) { var nameEQ = name + "="; var ca = document.cookie.split(';'); @@ -1020,3 +1503,12 @@ function delete_session() { delete_cookie("session"); } + +function disable_toparea() { + var offset = $('#toparea').offset(); + $('#whitemask').css('top',offset.top); + $('#whitemask').css('left',offset.left); + $('#whitemask').css('width',$('#toparea').outerWidth() + "px"); + $('#whitemask').css('height',$('#toparea').outerHeight() + "px"); + $('#whitemask').fadeTo('fast',0.7); +}