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.This is a ',
'blockquote
", 'But blockquotes are easy
This ',