Changeset 4135

Show
Ignore:
Timestamp:
08/12/08 12:03:40 (5 months ago)
Author:
jun66j5
Message:
  • fixed "Newline handling awkward" problem.
  • press "Enter" at the end of headers inserts a paragraph on Firefox.
  • fixed a problem that line-break isn't inserted with "Shift-Enter" on Safari.
  • modified test tool.
Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • tracwysiwygplugin/0.10/tests/index.html

    r2759 r4135  
    1212  html { font-size: 13px; *font-size: small; } 
    1313  body { font-family: Arial, Helvetica, sans-serif; font-size: 100%; } 
    14   textarea { font-size: 11px;
     14  textarea { font-size: 11px; width: 100%; border: 1px solid #999;
    1515  #testunit .current { background-color: #FFFF80; } 
    1616  #testunit .success { background-color: #33dd88; } 
    1717  #testunit .failure textarea { background-color: #ff3333; border-style: none; } 
     18  #wysiwyg-html { 
     19    width: 100%; 
     20    border: 1px solid #999; 
     21    font-size: 11px; 
     22    white-space: -moz-pre-wrap; 
     23    white-space: -pre-wrap; 
     24    white-space: -o-pre-wrap; 
     25    white-space: pre-wrap; 
     26    word-wrap: break-word; 
     27  } 
    1828  </style> 
    1929</head> 
    2030<body> 
    2131  <form method="post"> 
    22     <textarea id="textarea" class="wikitext" cols="50" rows="5" wrap="off"></textarea> 
     32    <textarea id="textarea" class="wikitext" cols="50" rows="20" wrap="off"></textarea> 
     33    <div> 
     34      <label><input type="checkbox" id="show-wysiwyg-html" value="1" 
     35        onclick="document.getElementById('wysiwyg-html').style.display=this.checked?'':'none'" 
     36        />show html</label> 
     37      <textarea id="wysiwyg-html" cols="50" rows="12" style="display:none;"></textarea> 
     38    </div> 
    2339  </form> 
    2440</body> 
  • tracwysiwygplugin/0.10/tests/testcase.js

    r3847 r4135  
    33    var instance = new TracWysiwyg(document.getElementById("textarea")); 
    44    var contentDocument = instance.contentDocument; 
     5 
     6    var d = document; 
     7    var wysiwygHtml = d.getElementById("wysiwyg-html"); 
     8    var showWysiwygHtml = d.getElementById("show-wysiwyg-html"); 
     9    setTimeout(function() { 
     10        if (showWysiwygHtml.checked) { 
     11            var body = contentDocument.body; 
     12            var browserIE = body.attachEvent ? true : false; 
     13            var elements = body.getElementsByTagName("br"); 
     14            var count = 0; 
     15            var html = body.innerHTML.replace(/<[Bb][Rr] *[^>\/]*/g, function(value) { 
     16                var element = elements[count++]; 
     17                var attributes = element.attributes; 
     18                var length = attributes.length; 
     19                if (length == 0) 
     20                    return value; 
     21                var texts = [ value ]; 
     22                for (var i = 0; i < length; i++) { 
     23                    var attr = attributes[i]; 
     24                    if (!browserIE || !!element[attr.name]) { 
     25                        texts.push(' ', attr.name, '="', attr.value, '"'); 
     26                    } 
     27                } 
     28                return texts.join(""); 
     29            }); 
     30            if (wysiwygHtml.value != html) { 
     31                wysiwygHtml.value = html; 
     32            } 
     33        } 
     34        setTimeout(arguments.callee, 500); 
     35    }, 500); 
    536 
    637    function generate(dom, wikitext, withoutDomToWikitext, withoutWikitextToFragment) { 
     
    674705            unit.add("block + br", function() { 
    675706                function br() { return element("br"); } 
    676                 function br_moz() { return element("br", { "type": "_moz" }); } 
    677707                var wikitext = [ 
    678                     "text, br{_moz}", 
     708                    "text, br", 
    679709                    "", 
    680710                    "text'', br[[BR]]''", 
     
    684714                    "", 
    685715                    " * list, br[[BR]]", 
    686                     " * list, br{_moz}", 
     716                    " * list, br", 
    687717                    " * ", 
    688718                    "", 
     
    690720                generateWikitext.call(this, 
    691721                    fragment( 
    692                         element("p", "text, br{_moz}", br_moz()), 
    693                         element("p", "text", element("i", ", br", br()), br_moz()), 
     722                        element("p", "text, br", br()), 
     723                        element("p", "text", element("i", ", br", br()), br()), 
    694724                        element("table", { "class": "wiki" }, 
    695725                            element("tbody", 
    696726                                element("tr", 
    697                                     element("td", "1,1", br(), br_moz()), 
    698                                     element("td", br_moz()), 
    699                                     element("td", "1,3", br_moz())), 
     727                                    element("td", "1,1", br(), br()), 
     728                                    element("td", br()), 
     729                                    element("td", "1,3", br())), 
    700730                                element("tr", 
    701                                     element("td", br_moz()), 
    702                                     element("td", "2,2", br(), br(), br_moz())))), 
     731                                    element("td", br()), 
     732                                    element("td", "2,2", br(), br(), br())))), 
    703733                        element("ul", 
     734                            element("li", "list, br", br(), br()), 
    704735                            element("li", "list, br", br()), 
    705                             element("li", "list, br{_moz}", br_moz()), 
    706736                            element("li")), 
    707                         element("p", "text, br", br())), 
     737                        element("p", "text, br", br(), br())), 
    708738                    wikitext); 
    709739                generateFragment.call(this, 
    710740                    fragment( 
    711                         element("p", "text, br{_moz}"), 
    712                         element("p", "text", element("i", ", br", br()), br_moz()), 
     741                        element("p", "text, br"), 
     742                        element("p", "text", element("i", ", br", br()), br()), 
    713743                        element("table", { "class": "wiki" }, 
    714744                            element("tbody", 
    715745                                element("tr", 
    716                                     element("td", "1,1", br(), br_moz()), 
    717                                     element("td", br_moz()), 
     746                                    element("td", "1,1", br(), br()), 
     747                                    element("td", br()), 
    718748                                    element("td", "1,3")), 
    719749                                element("tr", 
    720                                     element("td", br_moz()), 
    721                                     element("td", "2,2", br(), br(), br_moz())))), 
     750                                    element("td", br()), 
     751                                    element("td", "2,2", br(), br(), br())))), 
    722752                        element("ul", 
    723                             element("li", "list, br", br(), br_moz()), 
    724                             element("li", "list, br{_moz}"), 
    725                             element("li", br_moz())), 
    726                         element("p", "text, br", br(), br_moz())), 
     753                            element("li", "list, br", br(), br()), 
     754                            element("li", "list, br"), 
     755                            element("li", br())), 
     756                        element("p", "text, br", br(), br())), 
    727757                    wikitext); 
    728758            }); 
     
    732762                function br() { return element("br"); } 
    733763                var wikitext = [ 
    734                     "text, br{_moz}", 
     764                    "text, br", 
    735765                    "", 
    736766                    "text'', br[[BR]]''", 
     
    740770                    "", 
    741771                    " * list, br[[BR]]", 
    742                     " * list, br{_moz}", 
     772                    " * list, br", 
    743773                    " * ", 
    744774                    "", 
     
    746776                generate.call(this, 
    747777                    fragment( 
    748                         element("p", "text, br{_moz}"), 
     778                        element("p", "text, br"), 
    749779                        element("p", "text", element("i", ", br", br())), 
    750780                        element("table", { "class": "wiki" }, 
     
    759789                        element("ul", 
    760790                            element("li", "list, br", br()), 
    761                             element("li", "list, br{_moz}"), 
     791                            element("li", "list, br"), 
    762792                            element("li")), 
    763793                        element("p", "text, br", br())), 
     
    13641394            } 
    13651395            var body = d.body; 
     1396            while (body.childNodes.length > 0) { 
     1397                body.removeChild(body.lastChild); 
     1398            } 
    13661399            body.appendChild(fragment(d, 
    13671400                _element("p", 
  • tracwysiwygplugin/0.10/tracwysiwyg/htdocs/wysiwyg.js

    r3856 r4135  
    347347        case "quote":       return [ self.formatQuoteBlock ]; 
    348348        case "hr":          return [ self.insertHorizontalRule ]; 
    349         case "br":          return [ self.insertHTML, "<br />" ]; 
     349        case "br":          return [ self.insertLineBreak ]; 
    350350        } 
    351351        return null; 
     
    403403    var position = this.getSelectionPosition(); 
    404404    var ancestor = {}; 
    405     ancestor.start = getSelfOrAncestor(position.start, "a") || getSelfOrAncestor(position.start, "tt"); 
    406     ancestor.end = getSelfOrAncestor(position.end, "a") || getSelfOrAncestor(position.end, "tt"); 
     405    ancestor.start = getSelfOrAncestor(position.start, /^(?:a|tt)$/); 
     406    ancestor.end = getSelfOrAncestor(position.end, /^(?:a|tt)$/); 
    407407    this.expandSelectionToElement(ancestor); 
    408408 
     
    488488    function listenerKeypress(event) { 
    489489        event = event || self.contentWindow.event; 
     490        var modifier = (event.ctrlKey ? 0x40000000 : 0) 
     491            | (event.shiftKey ? 0x20000000 : 0) | (event.altKey ? 0x10000000 : 0); 
    490492        switch (event.charCode || event.keyCode) { 
    491493        case 0x20:  // SPACE 
     
    494496        case 0x0d:  // ENTER 
    495497            self.detectTracLink(event); 
     498            switch (modifier) { 
     499            case 0: 
     500                if (self.insertParagraphOnEnter) { 
     501                    self.insertParagraphOnEnter(event); 
     502                } 
     503                break; 
     504            case 0x20000000:    // Shift 
     505                if (self.insertLineBreakOnShiftEnter) { 
     506                    self.insertLineBreakOnShiftEnter(event); 
     507                } 
     508                break; 
     509            } 
    496510            return; 
    497511        } 
     
    500514 
    501515    function listenerKeyup(event) { 
     516        var keyCode = event.keyCode; 
    502517        if (ime) { 
    503             switch (event.keyCode) { 
     518            switch (keyCode) { 
    504519            case 0x20:  // SPACE 
    505520                self.detectTracLink(event); 
     
    626641    } 
    627642    var getSelfOrAncestor = TracWysiwyg.getSelfOrAncestor; 
    628     if (getSelfOrAncestor(node, "a") || getSelfOrAncestor(node, "tt") || getSelfOrAncestor(node, "pre")) { 
     643    if (getSelfOrAncestor(node, /^(?:a|tt|pre)$/)) { 
    629644        return; 
    630645    } 
     
    710725            if (event.shiftKey) { 
    711726                if (window.opera || !anonymous.addEventListener) { 
    712                     this.insertHTML(html + "<br />"); 
     727                    this.insertHTML(html + "<br>"); 
    713728                    if (window.opera) { 
    714729                        anchor = this.contentDocument.getElementById(id); 
     
    810825    var hash = { node: null, cell: null, row: null, table: null }; 
    811826    hash.node = this.getFocusNode(); 
    812     hash.cell = hash.node 
    813         ? TracWysiwyg.getSelfOrAncestor(hash.node, "td") || TracWysiwyg.getSelfOrAncestor(hash.node, "th") 
    814         : null; 
     827    hash.cell = hash.node ? TracWysiwyg.getSelfOrAncestor(hash.node, /^t[dh]$/) : null; 
    815828    hash.row = hash.cell ? TracWysiwyg.getSelfOrAncestor(hash.cell, "tr") : null; 
    816829    hash.table = hash.row ? TracWysiwyg.getSelfOrAncestor(hash.row, "table") : null; 
     
    12421255}; 
    12431256 
     1257(function() { 
     1258    var blocks = { 
     1259        p: true, blockquote: true, div: true, 
     1260        li: true, ul: true, ol: true, 
     1261        dl: true, dt: true, dd: true, 
     1262        h1: true, h2: true, h3: true, h4: true, h5: true, h6: true, 
     1263        table: true, thead: true, tbody: true, tr: true, td: true, th: true }; 
     1264 
     1265    function generator(prop, blocks) { 
     1266        return function (node) { 
     1267            if (!node) { 
     1268                return false; 
     1269            } 
     1270            for ( ; ; ) { 
     1271                if (node[prop]) { 
     1272                    return false; 
     1273                } 
     1274                node = node.parentNode; 
     1275                if (!node) { 
     1276                    return false; 
     1277                } 
     1278                if (node.tagName.toLowerCase() in blocks) { 
     1279                    return true; 
     1280                } 
     1281            } 
     1282            return false; 
     1283        }; 
     1284    } 
     1285 
     1286    TracWysiwyg.prototype.isLastChildInBlockNode = generator("nextSibling", blocks); 
     1287    TracWysiwyg.prototype.isFirstChildInBlockNode = generator("previousSibling", blocks); 
     1288})(); 
     1289 
    12441290TracWysiwyg.prototype.wikitextToFragment = function(wikitext, contentDocument) { 
    12451291    var getSelfOrAncestor = TracWysiwyg.getSelfOrAncestor; 
     
    23812427                break; 
    23822428            case "br": 
    2383                 if (node.getAttribute("type") != "_moz") { 
     2429                if (!self.isBogusLineBreak(node)) { 
    23842430                    var value; 
    23852431                    if (inCodeBlock) { 
     
    26472693            } 
    26482694            var name = last.tagName.toLowerCase(); 
    2649             if (name == "br" && last.getAttribute("type") != "_moz") { 
     2695            if (name == "br") { 
    26502696                break; 
    26512697            } 
     
    26562702        } 
    26572703        var br = this.contentDocument.createElement("br"); 
    2658         br.setAttribute("type", "_moz"); 
    26592704        element.appendChild(br); 
     2705    }; 
     2706    TracWysiwyg.prototype.isBogusLineBreak = TracWysiwyg.prototype.isLastChildInBlockNode; 
     2707    TracWysiwyg.prototype.insertParagraphOnEnter = function(event) { 
     2708        var range = this.getSelectionRange(); 
     2709        var node = range.endContainer; 
     2710        var header = null; 
     2711        if (node && node.nodeType == 3 && range.endOffset == node.nodeValue.length) { 
     2712            var nextSibling = node.nextSibling; 
     2713            if (!nextSibling || nextSibling.tagName.toLowerCase() == "br") { 
     2714                while (node) { 
     2715                    if (node.nodeType == 1 && /^h[1-6]$/i.exec(node.tagName)) { 
     2716                        header = node; 
     2717                        break; 
     2718                    } 
     2719                    node = node.parentNode; 
     2720                } 
     2721                if (header) { 
     2722                    var parent = header.parentNode; 
     2723                    var childNodes = parent.childNodes; 
     2724                    var length = childNodes.length; 
     2725                    for (var offset = 0; offset < length; offset++) { 
     2726                        if (childNodes[offset] == header) { 
     2727                            offset++; 
     2728                            break; 
     2729                        } 
     2730                    } 
     2731                    this.selectRange(parent, offset, parent, offset); 
     2732                    this.insertHTML('<p><br></p>'); 
     2733                    TracWysiwyg.stopEvent(event); 
     2734                } 
     2735            } 
     2736        } 
    26602737    }; 
    26612738    TracWysiwyg.prototype.tableHTML = function(id, row, col) { 
    26622739        var html = this._tableHTML(row, col); 
    2663         return html.replace(/<td><\/td>/g, '<td><br type="_moz" /></td>').replace(/<td>/, '<td id="' + id + '">'); 
     2740        return html.replace(/<td><\/td>/g, '<td><br></td>').replace(/<td>/, '<td id="' + id + '">'); 
    26642741    }; 
    26652742    TracWysiwyg.prototype.insertTableCell = function(row, index) { 
     
    26712748        return this.contentWindow.getSelection().focusNode; 
    26722749    }; 
     2750    if (window.opera) { 
     2751        TracWysiwyg.prototype.insertLineBreak = function() { 
     2752            this.execCommand("inserthtml", "<br>"); 
     2753        }; 
     2754        TracWysiwyg.prototype.insertLineBreakOnShiftEnter = null; 
     2755    } 
     2756    else if (window.getSelection().setBaseAndExtent) {  // Safari 2+ 
     2757        TracWysiwyg.prototype.insertLineBreak = function() { 
     2758            this.execCommand("insertlinebreak"); 
     2759        }; 
     2760        TracWysiwyg.prototype.insertLineBreakOnShiftEnter = function(event) { 
     2761            this.insertLineBreak(); 
     2762            TracWysiwyg.stopEvent(event); 
     2763        }; 
     2764    } 
     2765    else {  // Firefox 2+ 
     2766        TracWysiwyg.prototype.insertLineBreak = function() { 
     2767            var d = this.contentDocument; 
     2768            var event = d.createEvent("KeyboardEvent"); 
     2769            event.initKeyEvent("keypress", true, true, null, false, false, true, false, 0x000d, 0); 
     2770            d.body.dispatchEvent(event); 
     2771        }; 
     2772        TracWysiwyg.prototype.insertLineBreakOnShiftEnter = null; 
     2773    } 
    26732774    if (window.getSelection().removeAllRanges) { 
    26742775        TracWysiwyg.prototype.selectNode = function(node) { 
     
    28262927else if (document.selection) { 
    28272928    TracWysiwyg.prototype.appendBogusLineBreak = function(element) { }; 
     2929    TracWysiwyg.prototype.isBogusLineBreak = function(node) { return false }; 
     2930    TracWysiwyg.prototype.insertParagraphOnEnter = null; 
     2931    TracWysiwyg.prototype.insertLineBreak = function() { 
     2932        this.insertHTML("<br>"); 
     2933    }; 
     2934    TracWysiwyg.prototype.insertLineBreakOnShiftEnter = null; 
    28282935    TracWysiwyg.prototype.tableHTML = function(id, row, col) { 
    28292936        var html = this._tableHTML(row, col); 
     
    30773184else { 
    30783185    TracWysiwyg.prototype.appendBogusLineBreak = function(element) { }; 
     3186    TracWysiwyg.prototype.insertParagraphOnEnter = null; 
     3187    TracWysiwyg.prototype.insertLineBreak = function() { }; 
    30793188    TracWysiwyg.prototype.insertTableCell = function(row, index) { return null }; 
    30803189    TracWysiwyg.prototype.getFocusNode = function() { return null }; 
     
    32853394TracWysiwyg.getSelfOrAncestor = function(element, name) { 
    32863395    var target = element; 
    3287     name = name.toLowerCase(); 
    3288     if ((target.tagName || "").toLowerCase() != name) { 
    3289         target = getAncestorByTagName(element, name); 
    3290     } 
    3291     return target; 
     3396    var d = element.ownerDocument; 
     3397    if (name instanceof RegExp) { 
     3398        while (target && target != d) { 
     3399            switch (target.nodeType) { 
     3400            case 1: // element 
     3401                if (name.test(target.tagName.toLowerCase())) { 
     3402                    return target; 
     3403                } 
     3404                break; 
     3405            case 11: // fragment 
     3406                return null; 
     3407            } 
     3408            target = target.parentNode; 
     3409        } 
     3410    } 
     3411    else { 
     3412        name = name.toLowerCase(); 
     3413        while (target && target != d) { 
     3414            switch (target.nodeType) { 
     3415            case 1: // element 
     3416                if (target.tagName.toLowerCase() == name) { 
     3417                    return target; 
     3418                } 
     3419                break; 
     3420            case 11: // fragment 
     3421                return null; 
     3422            } 
     3423            target = target.parentNode; 
     3424        } 
     3425    } 
     3426    return null; 
    32923427}; 
    32933428 
  • tracwysiwygplugin/0.11/tests/index.html

    r2761 r4135  
    1212  html { font-size: 13px; *font-size: small; } 
    1313  body { font-family: Arial, Helvetica, sans-serif; font-size: 100%; } 
    14   textarea { font-size: 11px;
     14  textarea { font-size: 11px; width: 100%; border: 1px solid #999;
    1515  #testunit .current { background-color: #FFFF80; } 
    1616  #testunit .success { background-color: #33dd88; } 
    1717  #testunit .failure textarea { background-color: #ff3333; border-style: none; } 
     18  #wysiwyg-html { 
     19    width: 100%; 
     20    border: 1px solid #999; 
     21    font-size: 11px; 
     22    white-space: -moz-pre-wrap; 
     23    white-space: -pre-wrap; 
     24    white-space: -o-pre-wrap; 
     25    white-space: pre-wrap; 
     26    word-wrap: break-word; 
     27  } 
    1828  </style> 
    1929</head> 
    2030<body> 
    2131  <form method="post"> 
    22     <textarea id="textarea" class="wikitext" cols="50" rows="5" wrap="off"></textarea> 
     32    <textarea id="textarea" class="wikitext" cols="50" rows="20" wrap="off"></textarea> 
     33    <div> 
     34      <label><input type="checkbox" id="show-wysiwyg-html" value="1" 
     35        onclick="document.getElementById('wysiwyg-html').style.display=this.checked?'':'none'" 
     36        />show html</label> 
     37      <textarea id="wysiwyg-html" cols="50" rows="12" style="display:none;"></textarea> 
     38    </div> 
    2339  </form> 
    2440</body> 
  • tracwysiwygplugin/0.11/tests/testcase.js

    r3847 r4135  
    33    var instance = new TracWysiwyg(document.getElementById("textarea")); 
    44    var contentDocument = instance.contentDocument; 
     5 
     6    var d = document; 
     7    var wysiwygHtml = d.getElementById("wysiwyg-html"); 
     8    var showWysiwygHtml = d.getElementById("show-wysiwyg-html"); 
     9    setTimeout(function() { 
     10        if (showWysiwygHtml.checked) { 
     11            var body = contentDocument.body; 
     12            var browserIE = body.attachEvent ? true : false; 
     13            var elements = body.getElementsByTagName("br"); 
     14            var count = 0; 
     15            var html = body.innerHTML.replace(/<[Bb][Rr] *[^>\/]*/g, function(value) { 
     16                var element = elements[count++]; 
     17                var attributes = element.attributes; 
     18                var length = attributes.length; 
     19                if (length == 0) 
     20                    return value; 
     21                var texts = [ value ]; 
     22                for (var i = 0; i < length; i++) { 
     23                    var attr = attributes[i]; 
     24                    if (!browserIE || !!element[attr.name]) { 
     25                        texts.push(' ', attr.name, '="', attr.value, '"'); 
     26                    } 
     27                } 
     28                return texts.join(""); 
     29            }); 
     30            if (wysiwygHtml.value != html) { 
     31                wysiwygHtml.value = html; 
     32            } 
     33        } 
     34        setTimeout(arguments.callee, 500); 
     35    }, 500); 
    536 
    637    function generate(dom, wikitext, withoutDomToWikitext, withoutWikitextToFragment) { 
     
    674705            unit.add("block + br", function() { 
    675706                function br() { return element("br"); } 
    676                 function br_moz() { return element("br", { "type": "_moz" }); } 
    677707                var wikitext = [ 
    678                     "text, br{_moz}", 
     708                    "text, br", 
    679709                    "", 
    680710                    "text'', br[[BR]]''", 
     
    684714                    "", 
    685715                    " * list, br[[BR]]", 
    686                     " * list, br{_moz}", 
     716                    " * list, br", 
    687717                    " * ", 
    688718                    "", 
     
    690720                generateWikitext.call(this, 
    691721                    fragment( 
    692                         element("p", "text, br{_moz}", br_moz()), 
    693                         element("p", "text", element("i", ", br", br()), br_moz()), 
     722                        element("p", "text, br", br()), 
     723                        element("p", "text", element("i", ", br", br()), br()), 
    694724                        element("table", { "class": "wiki" }, 
    695725                            element("tbody", 
    696726                                element("tr", 
    697                                     element("td", "1,1", br(), br_moz()), 
    698                                     element("td", br_moz()), 
    699                                     element("td", "1,3", br_moz())), 
     727                                    element("td", "1,1", br(), br()), 
     728                                    element("td", br()), 
     729                                    element("td", "1,3", br())), 
    700730                                element("tr", 
    701                                     element("td", br_moz()), 
    702                                     element("td", "2,2", br(), br(), br_moz())))), 
     731                                    element("td", br()), 
     732                                    element("td", "2,2", br(), br(), br())))), 
    703733                        element("ul", 
     734                            element("li", "list, br", br(), br()), 
    704735                            element("li", "list, br", br()), 
    705                             element("li", "list, br{_moz}", br_moz()), 
    706736                            element("li")), 
    707                         element("p", "text, br", br())), 
     737                        element("p", "text, br", br(), br())), 
    708738                    wikitext); 
    709739                generateFragment.call(this, 
    710740                    fragment( 
    711                         element("p", "text, br{_moz}"), 
    712                         element("p", "text", element("i", ", br", br()), br_moz()), 
     741                        element("p", "text, br"), 
     742                        element("p", "text", element("i", ", br", br()), br()), 
    713743                        element("table", { "class": "wiki" }, 
    714744                            element("tbody", 
    715745                                element("tr", 
    716                                     element("td", "1,1", br(), br_moz()), 
    717                                     element("td", br_moz()), 
     746                                    element("td", "1,1", br(), br()), 
     747                                    element("td", br()), 
    718748                                    element("td", "1,3")), 
    719749                                element("tr", 
    720                                     element("td", br_moz()), 
    721                                     element("td", "2,2", br(), br(), br_moz())))), 
     750                                    element("td", br()), 
     751                                    element("td", "2,2", br(), br(), br())))), 
    722752                        element("ul", 
    723                             element("li", "list, br", br(), br_moz()), 
    724                             element("li", "list, br{_moz}"), 
    725                             element("li", br_moz())), 
    726                         element("p", "text, br", br(), br_moz())), 
     753                            element("li", "list, br", br(), br()), 
     754                            element("li", "list, br"), 
     755                            element("li", br())), 
     756                        element("p", "text, br", br(), br())), 
    727757                    wikitext); 
    728758            }); 
     
    732762                function br() { return element("br"); } 
    733763                var wikitext = [ 
    734                     "text, br{_moz}", 
     764                    "text, br", 
    735765                    "", 
    736766                    "text'', br[[BR]]''", 
     
    740770                    "", 
    741771                    " * list, br[[BR]]", 
    742                     " * list, br{_moz}", 
     772                    " * list, br", 
    743773                    " * ", 
    744774                    "", 
     
    746776                generate.call(this, 
    747777                    fragment( 
    748                         element("p", "text, br{_moz}"), 
     778                        element("p", "text, br"), 
    749779                        element("p", "text", element("i", ", br", br())), 
    750780                        element("table", { "class": "wiki" }, 
     
    759789                        element("ul", 
    760790                            element("li", "list, br", br()), 
    761                             element("li", "list, br{_moz}"), 
     791                            element("li", "list, br"), 
    762792                            element("li")), 
    763793                        element("p", "text, br", br())), 
     
    13641394            } 
    13651395            var body = d.body; 
     1396            while (body.childNodes.length > 0) { 
     1397                body.removeChild(body.lastChild); 
     1398            } 
    13661399            body.appendChild(fragment(d, 
    13671400                _element("p", 
  • tracwysiwygplugin/0.11/tracwysiwyg/htdocs/wysiwyg.js

    r3856 r4135  
    347347        case "quote":       return [ self.formatQuoteBlock ]; 
    348348        case "hr":          return [ self.insertHorizontalRule ]; 
    349         case "br":          return [ self.insertHTML, "<br />" ]; 
     349        case "br":          return [ self.insertLineBreak ]; 
    350350        } 
    351351        return null; 
     
    403403    var position = this.getSelectionPosition(); 
    404404    var ancestor = {}; 
    405     ancestor.start = getSelfOrAncestor(position.start, "a") || getSelfOrAncestor(position.start, "tt"); 
    406     ancestor.end = getSelfOrAncestor(position.end, "a") || getSelfOrAncestor(position.end, "tt"); 
     405    ancestor.start = getSelfOrAncestor(position.start, /^(?:a|tt)$/); 
     406    ancestor.end = getSelfOrAncestor(position.end, /^(?:a|tt)$/); 
    407407    this.expandSelectionToElement(ancestor); 
    408408 
     
    488488    function listenerKeypress(event) { 
    489489        event = event || self.contentWindow.event; 
     490        var modifier = (event.ctrlKey ? 0x40000000 : 0) 
     491            | (event.shiftKey ? 0x20000000 : 0) | (event.altKey ? 0x10000000 : 0); 
    490492        switch (event.charCode || event.keyCode) { 
    491493        case 0x20:  // SPACE 
     
    494496        case 0x0d:  // ENTER 
    495497            self.detectTracLink(event); 
     498            switch (modifier) { 
     499            case 0: 
     500                if (self.insertParagraphOnEnter) { 
     501                    self.insertParagraphOnEnter(event); 
     502                } 
     503                break; 
     504            case 0x20000000:    // Shift 
     505                if (self.insertLineBreakOnShiftEnter) { 
     506                    self.insertLineBreakOnShiftEnter(event); 
     507                } 
     508                break; 
     509            } 
    496510            return; 
    497511        } 
     
    500514 
    501515    function listenerKeyup(event) { 
     516        var keyCode = event.keyCode; 
    502517        if (ime) { 
    503             switch (event.keyCode) { 
     518            switch (keyCode) { 
    504519            case 0x20:  // SPACE 
    505520                self.detectTracLink(event); 
     
    626641    } 
    627642    var getSelfOrAncestor = TracWysiwyg.getSelfOrAncestor; 
    628     if (getSelfOrAncestor(node, "a") || getSelfOrAncestor(node, "tt") || getSelfOrAncestor(node, "pre")) { 
     643    if (getSelfOrAncestor(node, /^(?:a|tt|pre)$/)) { 
    629644        return; 
    630645    } 
     
    710725            if (event.shiftKey) { 
    711726                if (window.opera || !anonymous.addEventListener) { 
    712                     this.insertHTML(html + "<br />"); 
     727                    this.insertHTML(html + "<br>"); 
    713728                    if (window.opera) { 
    714729                        anchor = this.contentDocument.getElementById(id); 
     
    810825    var hash = { node: null, cell: null, row: null, table: null }; 
    811826    hash.node = this.getFocusNode(); 
    812     hash.cell = hash.node 
    813         ? TracWysiwyg.getSelfOrAncestor(hash.node, "td") || TracWysiwyg.getSelfOrAncestor(hash.node, "th") 
    814         : null; 
     827    hash.cell = hash.node ? TracWysiwyg.getSelfOrAncestor(hash.node, /^t[dh]$/) : null; 
    815828    hash.row = hash.cell ? TracWysiwyg.getSelfOrAncestor(hash.cell, "tr") : null; 
    816829    hash.table = hash.row ? TracWysiwyg.getSelfOrAncestor(hash.row, "table") : null; 
     
    12421255}; 
    12431256 
     1257(function() { 
     1258    var blocks = { 
     1259        p: true, blockquote: true, div: true, 
     1260        li: true, ul: true, ol: true, 
     1261        dl: true, dt: true, dd: true, 
     1262        h1: true, h2: true, h3: true, h4: true, h5: true, h6: true, 
     1263        table: true, thead: true, tbody: true, tr: true, td: true, th: true }; 
     1264 
     1265    function generator(prop, blocks) { 
     1266        return function (node) { 
     1267            if (!node) { 
     1268                return false; 
     1269            } 
     1270            for ( ; ; ) { 
     1271                if (node[prop]) { 
     1272                    return false; 
     1273                } 
     1274                node = node.parentNode; 
     1275                if (!node) { 
     1276                    return false; 
     1277                } 
     1278                if (node.tagName.toLowerCase() in blocks) { 
     1279                    return true; 
     1280                } 
     1281            } 
     1282            return false; 
     1283        }; 
     1284    } 
     1285 
     1286    TracWysiwyg.prototype.isLastChildInBlockNode = generator("nextSibling", blocks); 
     1287    TracWysiwyg.prototype.isFirstChildInBlockNode = generator("previousSibling", blocks); 
     1288})(); 
     1289 
    12441290TracWysiwyg.prototype.wikitextToFragment = function(wikitext, contentDocument) { 
    12451291    var getSelfOrAncestor = TracWysiwyg.getSelfOrAncestor; 
     
    23812427                break; 
    23822428            case "br": 
    2383                 if (node.getAttribute("type") != "_moz") { 
     2429                if (!self.isBogusLineBreak(node)) { 
    23842430                    var value; 
    23852431                    if (inCodeBlock) { 
     
    26472693            } 
    26482694            var name = last.tagName.toLowerCase(); 
    2649             if (name == "br" && last.getAttribute("type") != "_moz") { 
     2695            if (name == "br") { 
    26502696                break; 
    26512697            } 
     
    26562702        } 
    26572703        var br = this.contentDocument.createElement("br"); 
    2658         br.setAttribute("type", "_moz"); 
    26592704        element.appendChild(br); 
     2705    }; 
     2706    TracWysiwyg.prototype.isBogusLineBreak = TracWysiwyg.prototype.isLastChildInBlockNode; 
     2707    TracWysiwyg.prototype.insertParagraphOnEnter = function(event) { 
     2708        var range = this.getSelectionRange(); 
     2709        var node = range.endContainer; 
     2710        var header = null; 
     2711        if (node && node.nodeType == 3 && range.endOffset == node.nodeValue.length) { 
     2712            var nextSibling = node.nextSibling; 
     2713            if (!nextSibling || nextSibling.tagName.toLowerCase() == "br") { 
     2714                while (node) { 
     2715                    if (node.nodeType == 1 && /^h[1-6]$/i.exec(node.tagName)) { 
     2716                        header = node; 
     2717                        break; 
     2718                    } 
     2719                    node = node.parentNode; 
     2720                } 
     2721                if (header) { 
     2722                    var parent = header.parentNode; 
     2723                    var childNodes = parent.childNodes; 
     2724                    var length = childNodes.length; 
     2725                    for (var offset = 0; offset < length; offset++) { 
     2726                        if (childNodes[offset] == header) { 
     2727