List of pre-formatted line support. Real image conversion to figure support.

This commit is contained in:
Ian Gulliver
2014-07-02 09:57:45 -07:00
parent fc5dc49e72
commit d37ef27e8a
3 changed files with 66 additions and 11 deletions

View File

@@ -78,10 +78,11 @@ mediawiki = rr.Parser({
rr.Literal('### '), rr.Literal('### '),
rr.Ref('singleline-wikichunk'), rr.Ref('singleline-wikichunk'),
rr.EndOfLine())), rr.EndOfLine())),
'list-pre': rr.Node('pre', rr.Sequence( 'list-pre': rr.Node('preline', rr.Sequence(
rr.StartOfLine(), rr.StartOfLine(),
rr.Literal(' '), rr.Literal(' '),
rr.SingleLineText(), rr.SingleLineText(),
rr.Insert('\n'),
rr.EndOfLine())), rr.EndOfLine())),
'list-ulli1': rr.Node('ulli1', rr.Sequence( 'list-ulli1': rr.Node('ulli1', rr.Sequence(
rr.StartOfLine(), rr.StartOfLine(),
@@ -137,14 +138,14 @@ mediawiki = rr.Parser({
rr.Literal("''"), rr.Literal("''"),
rr.Ref('multiline-wikichunk'), rr.Ref('multiline-wikichunk'),
rr.Literal("''"))), rr.Literal("''"))),
'multiline-img': rr.Node('imgtemp', rr.Sequence( 'multiline-figure': rr.Node('figure', rr.Sequence(
rr.Literal('[[File:'), rr.Literal('[[File:'),
rr.Node('src', rr.SingleLineText()), rr.Node('src', rr.SingleLineText()),
rr.ZeroOrMore(rr.Sequence( rr.ZeroOrMore(rr.Sequence(
rr.Literal('|'), rr.Literal('|'),
rr.Node('option', rr.SingleLineText()))), rr.Node('option', rr.SingleLineText()))),
rr.Literal('|'), rr.Literal('|'),
rr.Node('caption', rr.Ref('multiline-wikichunk')), rr.Node('figcaption', rr.Ref('multiline-wikichunk')),
rr.Literal(']]'))), rr.Literal(']]'))),
'multiline-nowiki': rr.Sequence( 'multiline-nowiki': rr.Sequence(
rr.Literal('<nowiki>'), rr.Literal('<nowiki>'),
@@ -245,7 +246,7 @@ mediawiki = rr.Parser({
rr.Ref('list-ulli2'), rr.Ref('list-ulli2'),
rr.Ref('list-ulli3'), rr.Ref('list-ulli3'),
rr.Ref('multiline-img'), rr.Ref('multiline-figure'),
rr.Ref('multiline-a'), rr.Ref('multiline-a'),
rr.Ref('multiline-bi'), rr.Ref('multiline-bi'),
rr.Ref('multiline-b'), rr.Ref('multiline-b'),
@@ -306,5 +307,10 @@ mediawiki = rr.Parser({
rr.GroupSiblings('ol', ['olli3']), rr.GroupSiblings('ol', ['olli3']),
rr.RenameElement('olli1', 'li'), rr.RenameElement('olli1', 'li'),
rr.RenameElement('olli2', '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')
]); ]);

View File

@@ -725,6 +725,50 @@ rr.SingleLineText = function() {
/* ============ Filter factories ============ */ /* ============ 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} parentName
* @param {string} childNames * @param {string} childNames
@@ -767,6 +811,10 @@ rr.RenameElement = function(oldName, newName) {
for (var i = 0; i < node.childNodes.length; i++) { for (var i = 0; i < node.childNodes.length; i++) {
newNode.appendChild(node.childNodes[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); node.parentNode.replaceChild(newNode, node);
}; };
}; };

13
test.js
View File

@@ -34,7 +34,8 @@ QUnit.test('Base', function(assert) {
': But blockquotes are easy', ': But blockquotes are easy',
':: Even larger ones', ':: Even larger ones',
'::::: And really huge ones', '::::: And really huge ones',
' This line is pre-formatted and <del>not interpolated</del>' ' This line is pre-formatted and <del>not interpolated</del>',
' This line is also pre-formatted'
].join('\n'); ].join('\n');
var expected = [ var expected = [
@@ -55,8 +56,8 @@ QUnit.test('Base', function(assert) {
"<def>I don't really understand what a definition is</def><blockquote>", "<def>I don't really understand what a definition is</def><blockquote>",
'But blockquotes are easy</blockquote><blockquote2>Even larger ones', 'But blockquotes are easy</blockquote><blockquote2>Even larger ones',
'</blockquote2><blockquote5>And really huge ones</blockquote5><pre>This ', '</blockquote2><blockquote5>And really huge ones</blockquote5><pre>This ',
'line is pre-formatted and &lt;del&gt;not interpolated&lt;/del&gt;', 'line is pre-formatted and &lt;del&gt;not interpolated&lt;/del&gt;\nThis ',
'</pre></p>' 'line is also pre-formatted\n</pre></p>'
].join(''); ].join('');
assert.equal(mediawiki.parseFromString(content).innerHTML, expected); assert.equal(mediawiki.parseFromString(content).innerHTML, expected);
@@ -91,15 +92,15 @@ QUnit.test('Link', function(assert) {
assert.equal(mediawiki.parseFromString(content).innerHTML, expected); assert.equal(mediawiki.parseFromString(content).innerHTML, expected);
}); });
QUnit.test('Image', function(assert) { QUnit.test('Figure', function(assert) {
assert.expect(1); assert.expect(1);
var content = [ var content = [
"[[File:http://www.example.com/foo|Test image ''with formatting'']]" "[[File:http://www.example.com/foo|Test image ''with formatting'']]"
].join('\n'); ].join('\n');
var expected = [ var expected = [
'<p><imgtemp><src>http://www.example.com/foo</src>', '<p><figure><img src=\"http://www.example.com/foo\"><figcaption>Test ',
'<caption>Test image <i>with formatting</i></caption></imgtemp></p>' 'image <i>with formatting</i></figcaption></figure></p>'
].join(''); ].join('');
assert.equal(mediawiki.parseFromString(content).innerHTML, expected); assert.equal(mediawiki.parseFromString(content).innerHTML, expected);