More filters needed to support mediawiki list parsing.

This commit is contained in:
Ian Gulliver
2014-07-01 23:16:39 -07:00
parent e34bdfc96d
commit ccc13f7a20
3 changed files with 76 additions and 12 deletions

View File

@@ -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')
]);

View File

@@ -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.<string>} newNames
@@ -759,14 +801,24 @@ rr.SplitTagAndNest = function(originalName, newNames) {
/**
* @param {Node} node
* @param {Object.<string, rr.typeFilter>} 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.<rr.typeFilter>} 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.<string, rr.typeMatcher>} rules
* @param {Object.<string, rr.typeFilter>} filters
* @param {Array.<rr.typeFilter>} filters
* @private
*/
rr.Parser_ = function(rules, filters) {
@@ -891,7 +943,7 @@ rr.Parser_.prototype.parseFromString = function(input) {
/**
* @param {Object.<string, rr.typeMatcher>} rules
* @param {Object.<string, rr.typeFilter>} filters
* @param {Array.<rr.typeFilter>} filters
* @return {rr.Parser_}
*/
rr.Parser = function(rules, filters) {

View File

@@ -49,9 +49,9 @@ QUnit.test('Base', function(assert) {
'&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>',
'<ulli1>Item 1a</ulli1><ulli1>Item 1b</ulli1><ulli2>Item 2</ulli2><ulli3>',
'Item 3</ulli3><ulli1>Item 1c</ulli1><olli1>Item 1a</olli1><olli1>Item 1b',
'</olli1><olli2>Item 2</olli2><olli3>Item 3</olli3><olli1>Item 1c</olli1>',
'<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 ',