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
  1. Item 1a
  2. Item 1b
  3. ', + '
    1. Item 2
      1. Item 3
  4. Item 1c
', "I don't really understand what a definition is
", 'But blockquotes are easy
Even larger ones', 'And really huge ones
This ',