From 7affa466d41ef1a45322e3aad6290f3fca271e01 Mon Sep 17 00:00:00 2001 From: Ian Gulliver Date: Mon, 30 Jun 2014 21:12:12 -0700 Subject: [PATCH] Add link support to mediawiki grammer. Fix a bug in rr.Node() --- grammars/mediawiki.js | 18 ++++++++++++++++-- recentrunes.js | 2 +- test.js | 16 ++++++++++++++++ 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/grammars/mediawiki.js b/grammars/mediawiki.js index 0cee575..099e58e 100644 --- a/grammars/mediawiki.js +++ b/grammars/mediawiki.js @@ -99,6 +99,12 @@ var mediawiki = { rr.Ref('singleline-wikichunk'), rr.EndOfLine())), + 'multiline-a': rr.Node('a', rr.Sequence( + rr.Literal('[['), + rr.Node('href', rr.SingleLineText()), + rr.Literal('|'), + rr.Ref('multiline-wikichunk'), + rr.Literal(']]'))), 'multiline-b': rr.Node('b', rr.Sequence( rr.Literal("'''"), rr.Ref('multiline-wikichunk'), @@ -152,6 +158,12 @@ var mediawiki = { rr.Ref('multiline-wikichunk'), rr.Literal(''))), + 'singleline-a': rr.Node('a', rr.Sequence( + rr.Literal('[['), + rr.Node('href', rr.SingleLineText()), + rr.Literal('|'), + rr.Ref('singleline-wikichunk'), + rr.Literal(']]'))), 'singleline-b': rr.Node('b', rr.Sequence( rr.Literal("'''"), rr.Ref('singleline-wikichunk'), @@ -224,7 +236,8 @@ var mediawiki = { rr.Ref('list-ulli2'), rr.Ref('list-ulli3'), - rr.Ref('multiline-bi'), + rr.Ref('multiline-a'), + rr.Ref('multiline-bi'), // before b and i rr.Ref('multiline-b'), rr.Ref('multiline-blockquote'), rr.Ref('multiline-code'), @@ -243,7 +256,8 @@ var mediawiki = { rr.MultiLineText())), 'singleline-wikichunk': rr.ZeroOrMore(rr.Or( - rr.Ref('singleline-bi'), + rr.Ref('singleline-a'), + rr.Ref('singleline-bi'), // before b and i rr.Ref('singleline-b'), rr.Ref('singleline-code'), rr.Ref('singleline-comment'), diff --git a/recentrunes.js b/recentrunes.js index 439f8c1..6f3496b 100644 --- a/recentrunes.js +++ b/recentrunes.js @@ -304,7 +304,7 @@ rr.Node_.prototype.match = function(context) { var node = document.createElement(this.name_); var nodes = next['value']['nodes']; for (var i = 0; i < nodes.length; i++) { - node.appendChild(nodes[i]); + node.appendChild(nodes[i].cloneNode(true)); } node.normalize(); return { diff --git a/test.js b/test.js index fbfd9d2..4b76718 100644 --- a/test.js +++ b/test.js @@ -81,3 +81,19 @@ QUnit.test('singleline-wikichunk', function(assert) { var iterable = context.rules['wikidoc'].match(context); assert.equal(iterable.next().value.nodes[0].innerHTML, expected); }); + +QUnit.test('Link', function(assert) { + assert.expect(1); + var content = [ + "[[http://www.example.com/foo|Test text ''with formatting'']]" + ].join('\n'); + + var expected = [ + '

http://www.example.com/foo', + 'Test text with formatting

' + ].join(''); + + var context = new rr.Context(mediawiki, content); + var iterable = context.rules['wikidoc'].match(context); + assert.equal(iterable.next().value.nodes[0].innerHTML, expected); +});