JavaScript: change filter application strategy and grouping/extraction code to work around ordering issues.

This commit is contained in:
Ian Gulliver
2014-07-03 01:11:39 -04:00
parent ae2828b2c2
commit 71a687cc25
4 changed files with 32 additions and 17 deletions

View File

@@ -1,5 +1,5 @@
mediawiki = rr.Parser({ mediawiki = rr.Parser({
'list-blockquote1': rr.Node('blockquote', rr.Sequence( 'list-blockquote1': rr.Node('blockquote1', rr.Sequence(
rr.StartOfLine(), rr.StartOfLine(),
rr.Literal(': '), rr.Literal(': '),
rr.Ref('singleline-wikichunk'), rr.Ref('singleline-wikichunk'),
@@ -313,5 +313,18 @@ mediawiki = rr.Parser({
rr.SplitElementAndNest('src', ['imgtemp', 'src']), rr.SplitElementAndNest('src', ['imgtemp', 'src']),
rr.ChildToAttribute('imgtemp', 'src'), rr.ChildToAttribute('imgtemp', 'src'),
rr.RenameElement('imgtemp', 'img'), 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')
]); ]);

View File

@@ -761,7 +761,7 @@ rr.ExtractElement = function(nodeName) {
} }
var parentNode = node.parentNode; var parentNode = node.parentNode;
for (var i = 0; i < node.childNodes.length; i++) { for (var i = 0; i < node.childNodes.length; i++) {
parentNode.appendChild(node.childNodes[i]); parentNode.insertBefore(node.childNodes[i], node);
} }
parentNode.removeChild(node); parentNode.removeChild(node);
parentNode.normalize(); parentNode.normalize();
@@ -783,15 +783,17 @@ rr.GroupSiblings = function(parentName, childNames) {
if (childNames.indexOf(node.nodeName) == -1) { if (childNames.indexOf(node.nodeName) == -1) {
return; return;
} }
if (node.previousSibling && var nodes = [];
node.previousSibling.nodeName == parentName) { for (var iterNode = node;
// Group with previous node. iterNode && childNames.indexOf(iterNode.nodeName) != -1;
node.previousSibling.appendChild(node); iterNode = iterNode.nextSibling) {
return; nodes.push(iterNode);
} }
var newNode = document.createElement(parentName); var newNode = document.createElement(parentName);
node.parentNode.replaceChild(newNode, node); 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) { rr.ApplyFilter = function(node, filter) {
filter(node); filter(node);
var children = Array.prototype.slice.call(node.childNodes); for (var i = 0; i < node.childNodes.length; i++) {
for (var i = 0; i < children.length; i++) { rr.ApplyFilter(node.childNodes[i], filter);
rr.ApplyFilter(children[i], filter);
} }
}; };

View File

@@ -54,10 +54,11 @@ QUnit.test('Base', function(assert) {
'</li></ul></ul><li>Item 1c</li></ul><ol><li>Item 1a</li><li>Item 1b</li>', '</li></ul></ul><li>Item 1c</li></ul><ol><li>Item 1a</li><li>Item 1b</li>',
'<ol><li>Item 2</li><ol><li>Item 3</li></ol></ol><li>Item 1c</li></ol>', '<ol><li>Item 2</li><ol><li>Item 3</li></ol></ol><li>Item 1c</li></ol>',
"<def>I don't really understand what a definition is</def><blockquote>", "<def>I don't really understand what a definition is</def><blockquote>",
'But blockquotes are easy</blockquote><blockquote2>Even larger ones', 'But blockquotes are easy<blockquote>Even larger ones<blockquote>',
'</blockquote2><blockquote5>And really huge ones</blockquote5><pre>This ', '<blockquote><blockquote>And really huge ones</blockquote></blockquote>',
'line is pre-formatted and &lt;del&gt;not interpolated&lt;/del&gt;\nThis ', '</blockquote></blockquote></blockquote><pre>This line is pre-formatted ',
'line is also pre-formatted\n</pre></p>' 'and &lt;del&gt;not interpolated&lt;/del&gt;\nThis line is also ',
'pre-formatted\n</pre></p>'
].join(''); ].join('');
assert.equal(mediawiki.parseFromString(content).innerHTML, expected); assert.equal(mediawiki.parseFromString(content).innerHTML, expected);

View File

@@ -50,4 +50,4 @@ code looks like <code>this</code>. Fixed width text looks like
stop &lt;u&gt;this from being underlined&lt;/u&gt;, or just try stop &lt;u&gt;this from being underlined&lt;/u&gt;, or just try
&lt;pre&gt;interrupting cow style.&lt;/pre&gt;<blockquote>This is a blockquote</blockquote></p><p><h2>Header 2</h2><h3>Header 3 <i>with italics</i></h3><h4>Header 4</h4><h5>Header 5</h5><h6>Header 6</h6><hr></hr><ul><li>Item 1a</li><li>Item 1b</li><ul><li>Item 2</li><ul><li>Item 3</li></ul></ul><li>Item 1c</li></ul><ol><li>Item 1a</li><li>Item 1b</li><ol><li>Item 2</li><ol><li>Item 3</li></ol></ol><li>Item 1c</li></ol><def>I don't really understand what a definition is</def><blockquote>But blockquotes are easy</blockquote><blockquote2>Even larger ones</blockquote2><blockquote5>And really huge ones</blockquote5><pre>This line is pre-formatted and &lt;del&gt;not interpolated&lt;/del&gt; &lt;pre&gt;interrupting cow style.&lt;/pre&gt;<blockquote>This is a blockquote</blockquote></p><p><h2>Header 2</h2><h3>Header 3 <i>with italics</i></h3><h4>Header 4</h4><h5>Header 5</h5><h6>Header 6</h6><hr></hr><ul><li>Item 1a</li><li>Item 1b</li><ul><li>Item 2</li><ul><li>Item 3</li></ul></ul><li>Item 1c</li></ul><ol><li>Item 1a</li><li>Item 1b</li><ol><li>Item 2</li><ol><li>Item 3</li></ol></ol><li>Item 1c</li></ol><def>I don't really understand what a definition is</def><blockquote>But blockquotes are easy</blockquote><blockquote2>Even larger ones</blockquote2><blockquote5>And really huge ones</blockquote5><pre>This line is pre-formatted and &lt;del&gt;not interpolated&lt;/del&gt;
This line is also pre-formatted This line is also pre-formatted
</pre></p></wikidoc>""" </pre></p></wikidoc>""", result