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- Item 1a
- Item 1b
',
'- Item 2
- Item 3
- Item 1c
',
"I don't really understand what a definition is",
- 'But blockquotes are easy
Even larger ones',
- 'And really huge onesThis ',
- 'line is pre-formatted and <del>not interpolated</del>\nThis ',
- 'line is also pre-formatted\n
'
+ 'But blockquotes are easyEven 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
- Item 1a
- Item 1b
- Item 2
- Item 3
- Item 1c
I don't really understand what a definition isBut blockquotes are easy
Even larger onesAnd really huge onesThis line is pre-formatted and <del>not interpolated</del>
This line is also pre-formatted
-
"""
+""", result