More filters needed to support mediawiki list parsing.
This commit is contained in:
@@ -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')
|
||||
]);
|
||||
|
||||
@@ -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) {
|
||||
|
||||
6
test.js
6
test.js
@@ -49,9 +49,9 @@ QUnit.test('Base', function(assert) {
|
||||
'<pre>interrupting cow style.</pre><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 ',
|
||||
|
||||
Reference in New Issue
Block a user