From 71a687cc25566ebbdf2515d73e7fd513cb163093 Mon Sep 17 00:00:00 2001 From: Ian Gulliver Date: Thu, 3 Jul 2014 01:11:39 -0400 Subject: [PATCH] JavaScript: change filter application strategy and grouping/extraction code to work around ordering issues. --- grammars/mediawiki.js | 17 +++++++++++++++-- recentrunes.js | 21 +++++++++++---------- test.js | 9 +++++---- test.py | 2 +- 4 files changed, 32 insertions(+), 17 deletions(-) diff --git a/grammars/mediawiki.js b/grammars/mediawiki.js index 28ce9ea..2977c26 100644 --- a/grammars/mediawiki.js +++ b/grammars/mediawiki.js @@ -1,5 +1,5 @@ mediawiki = rr.Parser({ - 'list-blockquote1': rr.Node('blockquote', rr.Sequence( + 'list-blockquote1': rr.Node('blockquote1', rr.Sequence( rr.StartOfLine(), rr.Literal(': '), rr.Ref('singleline-wikichunk'), @@ -313,5 +313,18 @@ mediawiki = rr.Parser({ rr.SplitElementAndNest('src', ['imgtemp', 'src']), rr.ChildToAttribute('imgtemp', 'src'), rr.RenameElement('imgtemp', 'img'), - rr.ChildToAttribute('a', 'href') + rr.ChildToAttribute('a', 'href'), + rr.GroupSiblings('blockquote', [ + 'blockquote1', 'blockquote2', 'blockquote3', 'blockquote4', + 'blockquote5']), + rr.GroupSiblings('blockquote', [ + 'blockquote2', 'blockquote3', 'blockquote4', 'blockquote5']), + rr.GroupSiblings('blockquote', ['blockquote3', 'blockquote4', 'blockquote5']), + rr.GroupSiblings('blockquote', ['blockquote4', 'blockquote5']), + rr.GroupSiblings('blockquote', ['blockquote5']), + rr.ExtractElement('blockquote1'), + rr.ExtractElement('blockquote2'), + rr.ExtractElement('blockquote3'), + rr.ExtractElement('blockquote4'), + rr.ExtractElement('blockquote5') ]); diff --git a/recentrunes.js b/recentrunes.js index 9e0349e..8931370 100644 --- a/recentrunes.js +++ b/recentrunes.js @@ -761,7 +761,7 @@ rr.ExtractElement = function(nodeName) { } var parentNode = node.parentNode; for (var i = 0; i < node.childNodes.length; i++) { - parentNode.appendChild(node.childNodes[i]); + parentNode.insertBefore(node.childNodes[i], node); } parentNode.removeChild(node); parentNode.normalize(); @@ -783,15 +783,17 @@ rr.GroupSiblings = function(parentName, childNames) { if (childNames.indexOf(node.nodeName) == -1) { return; } - if (node.previousSibling && - node.previousSibling.nodeName == parentName) { - // Group with previous node. - node.previousSibling.appendChild(node); - return; + var nodes = []; + for (var iterNode = node; + iterNode && childNames.indexOf(iterNode.nodeName) != -1; + iterNode = iterNode.nextSibling) { + nodes.push(iterNode); } var newNode = document.createElement(parentName); node.parentNode.replaceChild(newNode, node); - newNode.appendChild(node); + for (var i = 0; i < nodes.length; i++) { + newNode.appendChild(nodes[i]); + } }; }; @@ -859,9 +861,8 @@ rr.SplitElementAndNest = function(originalName, newNames) { */ rr.ApplyFilter = function(node, filter) { filter(node); - var children = Array.prototype.slice.call(node.childNodes); - for (var i = 0; i < children.length; i++) { - rr.ApplyFilter(children[i], filter); + for (var i = 0; i < node.childNodes.length; i++) { + rr.ApplyFilter(node.childNodes[i], filter); } }; diff --git a/test.js b/test.js index 6f41a58..536c7dc 100644 --- a/test.js +++ b/test.js @@ -54,10 +54,11 @@ QUnit.test('Base', function(assert) { '
  • Item 1c
    1. Item 1a
    2. Item 1b
    3. ', '
      1. Item 2
        1. Item 3
    4. Item 1c
    ', "I don't really understand what a definition is
    ", - 'But blockquotes are easy
    Even larger ones', - 'And really huge ones
    This ',
    -    'line is pre-formatted and <del>not interpolated</del>\nThis ',
    -    'line is also pre-formatted\n

    ' + 'But blockquotes are easy
    Even larger ones
    ', + '
    And really huge ones
    ', + '
    This line is pre-formatted ',
    +    'and <del>not interpolated</del>\nThis line is also ',
    +    'pre-formatted\n

    ' ].join(''); assert.equal(mediawiki.parseFromString(content).innerHTML, expected); diff --git a/test.py b/test.py index 63a4d5e..692023c 100755 --- a/test.py +++ b/test.py @@ -50,4 +50,4 @@ code looks like this. Fixed width text looks like stop <u>this from being underlined</u>, or just try <pre>interrupting cow style.</pre>
    This is a blockquote

    Header 2

    Header 3 with italics

    Header 4

    Header 5
    Header 6

    1. Item 1a
    2. Item 1b
      1. Item 2
        1. Item 3
    3. Item 1c
    I don't really understand what a definition is
    But blockquotes are easy
    Even larger onesAnd really huge ones
    This line is pre-formatted and <del>not interpolated</del>
     This line is also pre-formatted
    -

    """ +

    """, result