From d37ef27e8a2788af3568daaf2e8a30c5e1a00555 Mon Sep 17 00:00:00 2001
From: Ian Gulliver
Date: Wed, 2 Jul 2014 09:57:45 -0700
Subject: [PATCH] List of pre-formatted line support. Real image conversion to
figure support.
---
grammars/mediawiki.js | 16 ++++++++++-----
recentrunes.js | 48 +++++++++++++++++++++++++++++++++++++++++++
test.js | 13 ++++++------
3 files changed, 66 insertions(+), 11 deletions(-)
diff --git a/grammars/mediawiki.js b/grammars/mediawiki.js
index 30cfb36..e9aa8e6 100644
--- a/grammars/mediawiki.js
+++ b/grammars/mediawiki.js
@@ -78,10 +78,11 @@ mediawiki = rr.Parser({
rr.Literal('### '),
rr.Ref('singleline-wikichunk'),
rr.EndOfLine())),
- 'list-pre': rr.Node('pre', rr.Sequence(
+ 'list-pre': rr.Node('preline', rr.Sequence(
rr.StartOfLine(),
rr.Literal(' '),
rr.SingleLineText(),
+ rr.Insert('\n'),
rr.EndOfLine())),
'list-ulli1': rr.Node('ulli1', rr.Sequence(
rr.StartOfLine(),
@@ -137,14 +138,14 @@ mediawiki = rr.Parser({
rr.Literal("''"),
rr.Ref('multiline-wikichunk'),
rr.Literal("''"))),
- 'multiline-img': rr.Node('imgtemp', rr.Sequence(
+ 'multiline-figure': rr.Node('figure', rr.Sequence(
rr.Literal('[[File:'),
rr.Node('src', rr.SingleLineText()),
rr.ZeroOrMore(rr.Sequence(
rr.Literal('|'),
rr.Node('option', rr.SingleLineText()))),
rr.Literal('|'),
- rr.Node('caption', rr.Ref('multiline-wikichunk')),
+ rr.Node('figcaption', rr.Ref('multiline-wikichunk')),
rr.Literal(']]'))),
'multiline-nowiki': rr.Sequence(
rr.Literal(''),
@@ -245,7 +246,7 @@ mediawiki = rr.Parser({
rr.Ref('list-ulli2'),
rr.Ref('list-ulli3'),
- rr.Ref('multiline-img'),
+ rr.Ref('multiline-figure'),
rr.Ref('multiline-a'),
rr.Ref('multiline-bi'),
rr.Ref('multiline-b'),
@@ -306,5 +307,10 @@ mediawiki = rr.Parser({
rr.GroupSiblings('ol', ['olli3']),
rr.RenameElement('olli1', 'li'),
rr.RenameElement('olli2', 'li'),
- rr.RenameElement('olli3', 'li')
+ rr.RenameElement('olli3', 'li'),
+ rr.GroupSiblings('pre', ['preline']),
+ rr.ExtractElement('preline'),
+ rr.SplitElementAndNest('src', ['imgtemp', 'src']),
+ rr.ChildToAttribute('imgtemp', 'src'),
+ rr.RenameElement('imgtemp', 'img')
]);
diff --git a/recentrunes.js b/recentrunes.js
index 1703072..95029a2 100644
--- a/recentrunes.js
+++ b/recentrunes.js
@@ -725,6 +725,50 @@ rr.SingleLineText = function() {
/* ============ Filter factories ============ */
+/**
+ * @param {string} parentName
+ * @param {string} childName
+ * @return {rr.typeFilter}
+ */
+rr.ChildToAttribute = function(parentName, childName) {
+ parentName = parentName.toUpperCase();
+ childName = childName.toUpperCase();
+ return function(node) {
+ if (node.nodeName != parentName) {
+ return;
+ }
+ for (var i = 0; i < node.childNodes.length; i++) {
+ var childNode = node.childNodes[i];
+ if (childNode.nodeName == childName) {
+ node.setAttribute(childName, childNode.textContent);
+ node.removeChild(childNode);
+ break;
+ }
+ }
+ };
+};
+
+
+/**
+ * @param {string} nodeName
+ * @return {rr.typeFilter}
+ */
+rr.ExtractElement = function(nodeName) {
+ nodeName = nodeName.toUpperCase();
+ return function(node) {
+ if (node.nodeName != nodeName) {
+ return;
+ }
+ var parentNode = node.parentNode;
+ for (var i = 0; i < node.childNodes.length; i++) {
+ parentNode.appendChild(node.childNodes[i]);
+ }
+ parentNode.removeChild(node);
+ parentNode.normalize();
+ };
+};
+
+
/**
* @param {string} parentName
* @param {string} childNames
@@ -767,6 +811,10 @@ rr.RenameElement = function(oldName, newName) {
for (var i = 0; i < node.childNodes.length; i++) {
newNode.appendChild(node.childNodes[i]);
}
+ for (var i = 0; i < node.attributes.length; i++) {
+ var attribute = node.attributes[i];
+ newNode.setAttribute(attribute.name, attribute.value);
+ }
node.parentNode.replaceChild(newNode, node);
};
};
diff --git a/test.js b/test.js
index 202327d..0d2450d 100644
--- a/test.js
+++ b/test.js
@@ -34,7 +34,8 @@ QUnit.test('Base', function(assert) {
': But blockquotes are easy',
':: Even larger ones',
'::::: And really huge ones',
- ' This line is pre-formatted and not interpolated'
+ ' This line is pre-formatted and not interpolated',
+ ' This line is also pre-formatted'
].join('\n');
var expected = [
@@ -55,8 +56,8 @@ QUnit.test('Base', function(assert) {
"I don't really understand what a definition is",
'But blockquotes are easy
Even larger ones',
'And really huge onesThis ',
- 'line is pre-formatted and <del>not interpolated</del>',
- '
'
+ 'line is pre-formatted and <del>not interpolated</del>\nThis ',
+ 'line is also pre-formatted\n'
].join('');
assert.equal(mediawiki.parseFromString(content).innerHTML, expected);
@@ -91,15 +92,15 @@ QUnit.test('Link', function(assert) {
assert.equal(mediawiki.parseFromString(content).innerHTML, expected);
});
-QUnit.test('Image', function(assert) {
+QUnit.test('Figure', function(assert) {
assert.expect(1);
var content = [
"[[File:http://www.example.com/foo|Test image ''with formatting'']]"
].join('\n');
var expected = [
- 'http://www.example.com/foo',
- 'Test image with formatting
'
+ '
Test ',
+ 'image with formatting
'
].join('');
assert.equal(mediawiki.parseFromString(content).innerHTML, expected);