From ccc13f7a200d9896fe25b86baf2bff83c01c070c Mon Sep 17 00:00:00 2001
From: Ian Gulliver
Date: Tue, 1 Jul 2014 23:16:39 -0700
Subject: [PATCH] More filters needed to support mediawiki list parsing.
---
grammars/mediawiki.js | 14 ++++++++-
recentrunes.js | 68 ++++++++++++++++++++++++++++++++++++++-----
test.js | 6 ++--
3 files changed, 76 insertions(+), 12 deletions(-)
diff --git a/grammars/mediawiki.js b/grammars/mediawiki.js
index 25800db..e03b967 100644
--- a/grammars/mediawiki.js
+++ b/grammars/mediawiki.js
@@ -294,5 +294,17 @@ mediawiki = rr.Parser({
rr.ZeroOrMore(rr.Ref('paragraph')),
rr.EndOfText()))
}, [
- rr.SplitTagAndNest('bi', ['b', 'i'])
+ rr.SplitTagAndNest('bi', ['b', 'i']),
+ rr.GroupSiblings('ul', ['ulli1', 'ulli2', 'ulli3']),
+ rr.GroupSiblings('ul', ['ulli2', 'ulli3']),
+ rr.GroupSiblings('ul', ['ulli3']),
+ rr.RenameTag('ulli1', 'li'),
+ rr.RenameTag('ulli2', 'li'),
+ rr.RenameTag('ulli3', 'li'),
+ rr.GroupSiblings('ol', ['olli1', 'olli2', 'olli3']),
+ rr.GroupSiblings('ol', ['olli2', 'olli3']),
+ rr.GroupSiblings('ol', ['olli3']),
+ rr.RenameTag('olli1', 'li'),
+ rr.RenameTag('olli2', 'li'),
+ rr.RenameTag('olli3', 'li')
]);
diff --git a/recentrunes.js b/recentrunes.js
index 91fddae..90d9d87 100644
--- a/recentrunes.js
+++ b/recentrunes.js
@@ -424,7 +424,7 @@ rr.Or_.prototype.match = function(context) {
* @return {rr.Or_}
*/
rr.Or = function() {
- return new rr.Or_(Array.prototype.slice.call(arguments, 0));
+ return new rr.Or_(Array.prototype.slice.call(arguments));
};
@@ -725,6 +725,48 @@ rr.SingleLineText = function() {
/* ============ Filter factories ============ */
+/**
+ * @param {string} parentName
+ * @param {string} childNames
+ * @return {rr.typeFilter}
+ */
+rr.GroupSiblings = function(parentName, childNames) {
+ return function(node) {
+ if (childNames.indexOf(node.nodeName.toLowerCase()) == -1) {
+ return;
+ }
+ if (node.previousSibling &&
+ node.previousSibling.nodeName.toLowerCase() == parentName) {
+ // Group with previous node.
+ node.previousSibling.appendChild(node);
+ return;
+ }
+ var newNode = document.createElement(parentName);
+ node.parentNode.replaceChild(newNode, node);
+ newNode.appendChild(node);
+ };
+};
+
+
+/**
+ * @param {string} oldName
+ * @param {string} newName
+ * @return {rr.typeFilter}
+ */
+rr.RenameTag = function(oldName, newName) {
+ return function(node) {
+ if (node.nodeName.toLowerCase() != oldName) {
+ return;
+ }
+ var newNode = document.createElement(newName);
+ for (var i = 0; i < node.childNodes.length; i++) {
+ newNode.appendChild(node.childNodes[i]);
+ }
+ node.parentNode.replaceChild(newNode, node);
+ };
+};
+
+
/**
* @param {string} originalName
* @param {Array.} newNames
@@ -759,14 +801,24 @@ rr.SplitTagAndNest = function(originalName, newNames) {
/**
* @param {Node} node
- * @param {Object.} filters
+ * @param {rr.typeFilter} filter
+ */
+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);
+ }
+};
+
+
+/**
+ * @param {Node} node
+ * @param {Array.} filters
*/
rr.ApplyFilters = function(node, filters) {
for (var i = 0; i < filters.length; i++) {
- filters[i](node);
- }
- for (var i = 0; i < node.childNodes.length; i++) {
- rr.ApplyFilters(node.childNodes[i], filters);
+ rr.ApplyFilter(node, filters[i]);
}
};
@@ -863,7 +915,7 @@ rr.Context.prototype.advance = function(numChars) {
* @constructor
*
* @param {Object.} rules
- * @param {Object.} filters
+ * @param {Array.} filters
* @private
*/
rr.Parser_ = function(rules, filters) {
@@ -891,7 +943,7 @@ rr.Parser_.prototype.parseFromString = function(input) {
/**
* @param {Object.} rules
- * @param {Object.} filters
+ * @param {Array.} filters
* @return {rr.Parser_}
*/
rr.Parser = function(rules, filters) {
diff --git a/test.js b/test.js
index bb45546..202327d 100644
--- a/test.js
+++ b/test.js
@@ -49,9 +49,9 @@ QUnit.test('Base', function(assert) {
'<pre>interrupting cow style.</pre>This is a ',
'blockquote
Header 2
Header 3 with ',
'italics
Header 4
Header 5
Header 6
',
- 'Item 1aItem 1bItem 2',
- 'Item 3Item 1cItem 1aItem 1b',
- 'Item 2Item 3Item 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 ',