Add link support to mediawiki grammer. Fix a bug in rr.Node()

This commit is contained in:
Ian Gulliver
2014-06-30 21:12:12 -07:00
parent 1586375bba
commit 7affa466d4
3 changed files with 33 additions and 3 deletions

View File

@@ -99,6 +99,12 @@ var mediawiki = {
rr.Ref('singleline-wikichunk'), rr.Ref('singleline-wikichunk'),
rr.EndOfLine())), 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( 'multiline-b': rr.Node('b', rr.Sequence(
rr.Literal("'''"), rr.Literal("'''"),
rr.Ref('multiline-wikichunk'), rr.Ref('multiline-wikichunk'),
@@ -152,6 +158,12 @@ var mediawiki = {
rr.Ref('multiline-wikichunk'), rr.Ref('multiline-wikichunk'),
rr.Literal('</ins>'))), rr.Literal('</ins>'))),
'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( 'singleline-b': rr.Node('b', rr.Sequence(
rr.Literal("'''"), rr.Literal("'''"),
rr.Ref('singleline-wikichunk'), rr.Ref('singleline-wikichunk'),
@@ -224,7 +236,8 @@ var mediawiki = {
rr.Ref('list-ulli2'), rr.Ref('list-ulli2'),
rr.Ref('list-ulli3'), 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-b'),
rr.Ref('multiline-blockquote'), rr.Ref('multiline-blockquote'),
rr.Ref('multiline-code'), rr.Ref('multiline-code'),
@@ -243,7 +256,8 @@ var mediawiki = {
rr.MultiLineText())), rr.MultiLineText())),
'singleline-wikichunk': rr.ZeroOrMore(rr.Or( '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-b'),
rr.Ref('singleline-code'), rr.Ref('singleline-code'),
rr.Ref('singleline-comment'), rr.Ref('singleline-comment'),

View File

@@ -304,7 +304,7 @@ rr.Node_.prototype.match = function(context) {
var node = document.createElement(this.name_); var node = document.createElement(this.name_);
var nodes = next['value']['nodes']; var nodes = next['value']['nodes'];
for (var i = 0; i < nodes.length; i++) { for (var i = 0; i < nodes.length; i++) {
node.appendChild(nodes[i]); node.appendChild(nodes[i].cloneNode(true));
} }
node.normalize(); node.normalize();
return { return {

16
test.js
View File

@@ -81,3 +81,19 @@ QUnit.test('singleline-wikichunk', function(assert) {
var iterable = context.rules['wikidoc'].match(context); var iterable = context.rules['wikidoc'].match(context);
assert.equal(iterable.next().value.nodes[0].innerHTML, expected); 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 = [
'<p><a><href>http://www.example.com/foo</href>',
'Test text <i>with formatting</i></a></p>'
].join('');
var context = new rr.Context(mediawiki, content);
var iterable = context.rules['wikidoc'].match(context);
assert.equal(iterable.next().value.nodes[0].innerHTML, expected);
});