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 ones
This ',
-    '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);