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.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('<nowiki>'),
@@ -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')
]);

View File

@@ -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);
};
};

13
test.js
View File

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