http://www.mediawiki.org/wiki/Special:Code/MediaWiki/88760
Revision: 88760
Author: tparscal
Date: 2011-05-24 22:05:00 +0000 (Tue, 24 May 2011)
Log Message:
-----------
Broke wikidom code into separate files.
Modified Paths:
--------------
trunk/parsers/wikidom/demos/renderers/index.html
trunk/parsers/wikidom/tests/index.html
trunk/parsers/wikidom/tests/wikidom.test.js
Added Paths:
-----------
trunk/parsers/wikidom/lib/wiki.AnnotationRenderer.js
trunk/parsers/wikidom/lib/wiki.HtmlRenderer.js
trunk/parsers/wikidom/lib/wiki.WikitextRenderer.js
trunk/parsers/wikidom/lib/wiki.js
trunk/parsers/wikidom/lib/wiki.util.js
Removed Paths:
-------------
trunk/parsers/wikidom/wikidom.js
Modified: trunk/parsers/wikidom/demos/renderers/index.html
===================================================================
--- trunk/parsers/wikidom/demos/renderers/index.html 2011-05-24 21:58:15 UTC
(rev 88759)
+++ trunk/parsers/wikidom/demos/renderers/index.html 2011-05-24 22:05:00 UTC
(rev 88760)
@@ -56,7 +56,11 @@
<div id="json-source" class="source"></div>
<script src="../../lib/jquery.js"></script>
<script src="../../lib/jquery.json.js"></script>
- <script src="../../wikidom.js"></script>
+ <script src="../../lib/wiki.js" type="text/javascript"></script>
+ <script src="../../lib/wiki.util.js"
type="text/javascript"></script>
+ <script src="../../lib/wiki.AnnotationRenderer.js"
type="text/javascript"></script>
+ <script src="../../lib/wiki.HtmlRenderer.js"
type="text/javascript"></script>
+ <script src="../../lib/wiki.WikitextRenderer.js"
type="text/javascript"></script>
<script>
$( document ).ready( function() {
$.getJSON( 'document.js', function( data ) {
Added: trunk/parsers/wikidom/lib/wiki.AnnotationRenderer.js
===================================================================
--- trunk/parsers/wikidom/lib/wiki.AnnotationRenderer.js
(rev 0)
+++ trunk/parsers/wikidom/lib/wiki.AnnotationRenderer.js 2011-05-24
22:05:00 UTC (rev 88760)
@@ -0,0 +1,46 @@
+/**
+ * Serializes offset-based annotations.
+ */
+wiki.AnnotationRenderer = function() {
+
+ /* Private Members */
+
+ var that = this;
+ var insertions = {};
+
+ /* Methods */
+
+ this.wrapWithText = function( range, pre, post ) {
+ var start = range.offset;
+ if ( !( start in insertions ) ) {
+ insertions[start] = [pre];
+ } else {
+ insertions[start].push( pre );
+ }
+ var end = range.offset + range.length;
+ if ( !( end in insertions ) ) {
+ insertions[end] = [post];
+ } else {
+ insertions[end].unshift( post );
+ }
+ };
+
+ this.wrapWithXml = function( range, tag, attributes ) {
+ that.wrapWithText(
+ range, wiki.util.xml.open( tag, attributes ),
wiki.util.xml.close( tag )
+ );
+ };
+
+ this.apply = function( text ) {
+ var out = '';
+ for ( var i = 0, iMax = text.length; i <= iMax; i++ ) {
+ if ( i in insertions ) {
+ out += insertions[i].join( '' );
+ }
+ if ( i < iMax ) {
+ out += text[i];
+ }
+ }
+ return out;
+ };
+};
Property changes on: trunk/parsers/wikidom/lib/wiki.AnnotationRenderer.js
___________________________________________________________________
Added: svn:mime-type
+ text/plain
Added: svn:eol-style
+ native
Added: trunk/parsers/wikidom/lib/wiki.HtmlRenderer.js
===================================================================
--- trunk/parsers/wikidom/lib/wiki.HtmlRenderer.js
(rev 0)
+++ trunk/parsers/wikidom/lib/wiki.HtmlRenderer.js 2011-05-24 22:05:00 UTC
(rev 88760)
@@ -0,0 +1,144 @@
+/**
+ * Serializes a WikiDom into HTML.
+ */
+wiki.HtmlRenderer = function() {
+
+ /* Private Members */
+
+ var that = this;
+ var blockRenderers = {
+ 'comment': renderComment,
+ 'horizontal-rule': renderHorizontalRule,
+ 'heading': renderHeading,
+ 'paragraph': renderParagraph,
+ 'list': renderList,
+ 'table': renderTable
+ };
+
+ /* Private Methods */
+
+ function renderDocument( doc, rawFirstParagraph ) {
+ var out = [];
+ for ( var b = 0, bMax = doc.blocks.length; b < bMax; b++ ) {
+ var block = doc.blocks[b];
+ if ( block.type in blockRenderers ) {
+ if ( block.type === 'paragraph' ) {
+ out.push(
+ renderParagraph( block,
rawFirstParagraph && b === 0 )
+ );
+ } else {
+ out.push( blockRenderers[block.type](
block ) );
+ }
+ }
+ }
+ return out.join( '\n' );
+ }
+
+ function renderComment( comment ) {
+ return '<!--' + comment.text + '-->';
+ }
+
+ function renderHorizontalRule( rule ) {
+ return wiki.util.xml.tag( 'hr', {}, false );
+ }
+
+ function renderHeading( heading ) {
+ return wiki.util.xml.tag( 'h' + heading.level, {}, renderLine(
heading.line ) );
+ }
+
+ function renderParagraph( paragraph, raw ) {
+ var out = [];
+ for ( var l = 0, lMax = paragraph.lines.length; l < lMax; l++ )
{
+ out.push( renderLine( paragraph.lines[l] ) );
+ }
+ if ( raw ) {
+ return out.join( '\n' );
+ } else {
+ return wiki.util.xml.tag( 'p', {}, out.join( '\n' ) );
+ }
+ }
+
+ function renderList( list ) {
+ var tags = {
+ 'bullet': 'ul',
+ 'number': 'ol'
+ };
+ var out = [];
+ out.push( wiki.util.xml.open( tags[list.style] ) );
+ for ( var i = 0, iMax = list.items.length; i < iMax; i++ ) {
+ out.push( renderItem( list.items[i] ) );
+ }
+ out.push( wiki.util.xml.close( tags[list.style] ) );
+ return out.join( '\n' );
+ }
+
+ function renderTable( table ) {
+ var out = [];
+ var types = {
+ 'heading': 'th',
+ 'data': 'td'
+ };
+ out.push( wiki.util.xml.open( 'table', table.attributes ) );
+ for ( var r = 0, rMax = table.rows.length; r < rMax; r++ ) {
+ out.push( wiki.util.xml.open( 'tr' ) );
+ var row = table.rows[r];
+ for ( var c = 0, cMax = row.length; c < cMax; c++ ) {
+ var type = types[row[c].type || 'data'];
+ out.push( wiki.util.xml.tag(
+ type,
+ row[c].attributes,
+ renderDocument( row[c].document, true )
+ ) );
+ }
+ out.push( wiki.util.xml.close( 'tr' ) );
+ }
+ out.push( wiki.util.xml.close( 'table' ) );
+ return out.join( '\n' );
+ }
+
+ function renderItem( item ) {
+ if ( 'lists' in item && item.lists.length ) {
+ var out = [];
+ out.push( wiki.util.xml.open( 'li' ) + renderLine(
item.line ) );
+ for ( var l = 0, lMax = item.lists.length; l < lMax;
l++ ) {
+ out.push( renderList( item.lists[l] ) );
+ }
+ out.push( wiki.util.xml.close( 'li' ) )
+ return out.join( '\n' );
+ } else {
+ return wiki.util.xml.tag( 'li', {}, renderLine(
item.line ) );
+ }
+ }
+
+ function renderLine( line ) {
+ if ( 'annotations' in line && line.annotations.length ) {
+ var ar = new wiki.AnnotationRenderer();
+ for ( var a = 0, aMax = line.annotations.length; a <
aMax; a++ ) {
+ var an = line.annotations[a];
+ switch ( an.type ) {
+ case 'bold':
+ ar.wrapWithXml( an.range,
'strong' );
+ break;
+ case 'italic':
+ ar.wrapWithXml( an.range, 'em'
);
+ break;
+ case 'xlink':
+ ar.wrapWithXml( an.range, 'a',
{ 'href': an.data.url } );
+ break;
+ case 'ilink':
+ ar.wrapWithXml( an.range, 'a',
{ 'href': '/wiki/' + an.data.title } );
+ break;
+ }
+ }
+ return ar.apply( line.text );
+ } else {
+ return line.text;
+ }
+ }
+
+ /* Methods */
+
+ this.render = function( doc ) {
+ return renderDocument( doc );
+ };
+};
Property changes on: trunk/parsers/wikidom/lib/wiki.HtmlRenderer.js
___________________________________________________________________
Added: svn:mime-type
+ text/plain
Added: svn:eol-style
+ native
Added: trunk/parsers/wikidom/lib/wiki.WikitextRenderer.js
===================================================================
--- trunk/parsers/wikidom/lib/wiki.WikitextRenderer.js
(rev 0)
+++ trunk/parsers/wikidom/lib/wiki.WikitextRenderer.js 2011-05-24 22:05:00 UTC
(rev 88760)
@@ -0,0 +1,146 @@
+/**
+ * Serializes a WikiDom into Wikitext.
+ */
+wiki.WikitextRenderer = function() {
+
+ /* Private Members */
+
+ var that = this;
+ var blockRenderers = {
+ 'comment': renderComment,
+ 'horizontal-rule': renderHorizontalRule,
+ 'heading': renderHeading,
+ 'paragraph': renderParagraph,
+ 'list': renderList,
+ 'table': renderTable
+ };
+
+ /* Private Methods */
+
+ function renderDocument( doc, rawFirstParagraph ) {
+ var out = [];
+ for ( var b = 0, bMax = doc.blocks.length; b < bMax; b++ ) {
+ var block = doc.blocks[b];
+ if ( block.type in blockRenderers ) {
+ if ( block.type === 'paragraph' ) {
+ out.push(
+ renderParagraph( block,
rawFirstParagraph && b === 0 )
+ );
+ if ( b + 1 < bMax /* && doc.blocks[b +
1].type === 'paragraph' */ ) {
+ out.push( '' );
+ }
+ } else {
+ out.push( blockRenderers[block.type](
block ) );
+ }
+ }
+ }
+ return out.join( '\n' );
+ }
+
+ function renderComment( comment ) {
+ return '<!--' + comment.text + '-->';
+ }
+
+ function renderHorizontalRule( rule ) {
+ return '----';
+ }
+
+ function renderHeading( heading ) {
+ var symbols = wiki.util.str.repeat( '=', heading.level );
+ return symbols + renderLine( heading.line ) + symbols;
+ }
+
+ function renderParagraph( paragraph ) {
+ var out = [];
+ for ( var l = 0, lMax = paragraph.lines.length; l < lMax; l++ )
{
+ out.push( renderLine( paragraph.lines[l] ) );
+ }
+ return out.join( '\n' );
+ }
+
+ function renderList( list, path ) {
+ if ( typeof path === 'undefined' ) {
+ path = '';
+ }
+ var symbols = {
+ 'bullet': '*',
+ 'number': '#'
+ };
+ path += symbols[list.style];
+ var out = [];
+ for ( var i = 0, iMax = list.items.length; i < iMax; i++ ) {
+ out.push( renderItem( list.items[i], path ) );
+ }
+ return out.join( '\n' );
+ }
+
+ function renderTable( table ) {
+ var out = [];
+ var types = {
+ 'heading': '!',
+ 'data': '|'
+ };
+ out.push( '{|' + wiki.util.xml.attr( table.attributes ) );
+ for ( var r = 0, rMax = table.rows.length; r < rMax; r++ ) {
+ var row = table.rows[r];
+ if ( r ) {
+ out.push( '|-' );
+ }
+ for ( var c = 0, cMax = row.length; c < cMax; c++ ) {
+ var type = types[row[c].type || 'data'];
+ out.push(
+ type
+ + ( row[c].attributes ?
wiki.util.xml.attr( row[c].attributes ) + '|' : '' )
+ + renderDocument( row[c].document, true
)
+ );
+ }
+ }
+ out.push( '|}' );
+ return out.join( '\n' );
+ }
+
+ function renderItem( item, path ) {
+ if ( 'lists' in item && item.lists.length ) {
+ var out = [];
+ out.push( path + ' ' + renderLine( item.line ) );
+ for ( var l = 0, lMax = item.lists.length; l < lMax;
l++ ) {
+ out.push( renderList( item.lists[l], path ) );
+ }
+ return out.join( '\n' );
+ } else {
+ return path + ' ' + renderLine( item.line );
+ }
+ }
+
+ function renderLine( line ) {
+ if ( 'annotations' in line && line.annotations.length ) {
+ var ar = new wiki.AnnotationRenderer();
+ for ( var a = 0, aMax = line.annotations.length; a <
aMax; a++ ) {
+ var an = line.annotations[a];
+ switch ( an.type ) {
+ case 'bold':
+ ar.wrapWithText( an.range,
'\'\'\'', '\'\'\'' );
+ break;
+ case 'italic':
+ ar.wrapWithText( an.range,
'\'\'', '\'\'' );
+ break;
+ case 'xlink':
+ ar.wrapWithText( an.range, '['
+ an.data.url + ' ', ']' );
+ break;
+ case 'ilink':
+ ar.wrapWithText( an.range, '[['
+ an.data.title + '|', ']]' );
+ break;
+ }
+ }
+ return ar.apply( line.text );
+ } else {
+ return line.text;
+ }
+ }
+
+ /* Methods */
+
+ this.render = function( doc ) {
+ return renderDocument( doc );
+ };
+};
Property changes on: trunk/parsers/wikidom/lib/wiki.WikitextRenderer.js
___________________________________________________________________
Added: svn:mime-type
+ text/plain
Added: svn:eol-style
+ native
Copied: trunk/parsers/wikidom/lib/wiki.js (from rev 88751,
trunk/parsers/wikidom/wikidom.js)
===================================================================
--- trunk/parsers/wikidom/lib/wiki.js (rev 0)
+++ trunk/parsers/wikidom/lib/wiki.js 2011-05-24 22:05:00 UTC (rev 88760)
@@ -0,0 +1,45 @@
+/*
+ * Wikitext document object models
+ *
+ * document
+ * blocks: Array
+ * attributes: Plain object
+ *
+ * // Blocks
+ *
+ * comment
+ * text: String
+ * horizontal-rule
+ * heading
+ * level: Integer (1..6)
+ * line: Line object
+ * paragraph
+ * lines: Array of line objects
+ * list
+ * style: String ("bullet" or "number")
+ * items: Array of item objects
+ * table
+ * rows: Array of arrays of cell objects
+ * attributes: Plain object
+ *
+ * // Components
+ *
+ * line
+ * text: String
+ * item
+ * line: Line object
+ * lists: Array of list objects
+ * range
+ * offset: Integer
+ * length: Integer
+ * annotation
+ * type: String
+ * range: Range object
+ * data: Plain object
+ * cell
+ * document: Object
+ * attributes: Plain object
+ */
+
+// Global object - other modules will attach to this
+var wiki = {};
Property changes on: trunk/parsers/wikidom/lib/wiki.js
___________________________________________________________________
Added: svn:mime-type
+ text/plain
Added: svn:eol-style
+ native
Added: trunk/parsers/wikidom/lib/wiki.util.js
===================================================================
--- trunk/parsers/wikidom/lib/wiki.util.js (rev 0)
+++ trunk/parsers/wikidom/lib/wiki.util.js 2011-05-24 22:05:00 UTC (rev
88760)
@@ -0,0 +1,52 @@
+/**
+ * Utilities used by WikiDom renderers and parsers.
+ */
+wiki.util = {
+ 'str': {
+ 'repeat': function( pattern, count ) {
+ if ( count < 1 ) return '';
+ var result = '';
+ while ( count > 0 ) {
+ if ( count & 1 ) result += pattern;
+ count >>= 1, pattern += pattern;
+ };
+ return result;
+ }
+ },
+ 'xml': {
+ 'esc': function( text ) {
+ return text
+ .replace( /&/g, '&' )
+ .replace( /</g, '<' )
+ .replace( />/g, '>' )
+ .replace( /"/g, '"' )
+ .replace( /'/g, ''' );
+ },
+ 'attr': function( attributes, prespace ) {
+ var attr = [];
+ if ( attributes ) {
+ for ( var name in attributes ) {
+ attr.push( name + '="' +
attributes[name] + '"' );
+ }
+ }
+ return ( prespace && attr.length ? ' ' : '' ) +
attr.join( ' ' );
+ },
+ 'open': function( tag, attributes ) {
+ return '<' + tag + wiki.util.xml.attr( attributes, true
) + '>';
+ },
+ 'close': function( tag ) {
+ return '</' + tag + '>';
+ },
+ 'tag': function( tag, attributes, value, escape ) {
+ if ( value === false ) {
+ return '<' + tag + wiki.util.xml.attr(
attributes, true ) + ' />';
+ } else {
+ if ( escape ) {
+ value = wiki.util.xml.esc( value );
+ }
+ return '<' + tag + wiki.util.xml.attr(
attributes, true ) + '>' + value
+ + '</' + tag + '>';
+ }
+ }
+ }
+};
Property changes on: trunk/parsers/wikidom/lib/wiki.util.js
___________________________________________________________________
Added: svn:mime-type
+ text/plain
Added: svn:eol-style
+ native
Modified: trunk/parsers/wikidom/tests/index.html
===================================================================
--- trunk/parsers/wikidom/tests/index.html 2011-05-24 21:58:15 UTC (rev
88759)
+++ trunk/parsers/wikidom/tests/index.html 2011-05-24 22:05:00 UTC (rev
88760)
@@ -12,7 +12,11 @@
<ol id="qunit-tests"></ol>
<script src="../lib/jquery.js" type="text/javascript"></script>
<script src="../lib/qunit.js" type="text/javascript"></script>
- <script src="../wikidom.js" type="text/javascript"></script>
+ <script src="../lib/wiki.js" type="text/javascript"></script>
+ <script src="../lib/wiki.util.js"
type="text/javascript"></script>
+ <script src="../lib/wiki.AnnotationRenderer.js"
type="text/javascript"></script>
+ <script src="../lib/wiki.HtmlRenderer.js"
type="text/javascript"></script>
+ <script src="../lib/wiki.WikitextRenderer.js"
type="text/javascript"></script>
<script src="wikidom.test.js" type="text/javascript"></script>
</body>
</html>
Modified: trunk/parsers/wikidom/tests/wikidom.test.js
===================================================================
--- trunk/parsers/wikidom/tests/wikidom.test.js 2011-05-24 21:58:15 UTC (rev
88759)
+++ trunk/parsers/wikidom/tests/wikidom.test.js 2011-05-24 22:05:00 UTC (rev
88760)
@@ -238,7 +238,7 @@
assertSerializations( [
{
'subject': 'table with headings and data',
- 'dom': { 'blocks': [ {
+ 'dom': { 'blocks': [{
'type': 'table',
'rows': [
[
@@ -274,10 +274,35 @@
}
]
]
- } ] },
+ }] },
'html':
'<table>\n<tr>\n<th>A</th>\n<th>B</th>\n</tr>\n<tr>\n'
+ '<td>1</td>\n<td>2</td>\n</tr>\n</table>',
'wikitext': '{|\n!A\n!B\n|-\n|1\n|2\n|}'
+ },
+ {
+ 'subject': 'table with attributes',
+ 'dom': { 'blocks': [{
+ 'type': 'table',
+ 'attributes': {
+ 'class': 'wikitable'
+ },
+ 'rows': [
+ [
+ {
+ 'type': 'data',
+ 'attributes': {
+ 'class': 'abc'
+ },
+ 'document': { 'blocks':
[{
+ 'type':
'paragraph',
+ 'lines': [{
'text': 'abc' }]
+ }] }
+ }
+ ]
+ ]
+ }] },
+ 'html': '<table class="wikitable">\n<tr>\n<td
class="abc">abc</td>\n</tr>\n</table>',
+ 'wikitext': '{|class="wikitable"\n|class="abc"|abc\n|}'
}
] );
} );
Deleted: trunk/parsers/wikidom/wikidom.js
===================================================================
--- trunk/parsers/wikidom/wikidom.js 2011-05-24 21:58:15 UTC (rev 88759)
+++ trunk/parsers/wikidom/wikidom.js 2011-05-24 22:05:00 UTC (rev 88760)
@@ -1,436 +0,0 @@
-/*
- * Wikitext document object models
- *
- * document
- * blocks: Array
- * attributes: Plain object
- *
- * // Blocks
- *
- * comment
- * text: String
- * horizontal-rule
- * heading
- * level: Integer (1..6)
- * line: Line object
- * paragraph
- * lines: Array of line objects
- * list
- * style: String ("bullet" or "number")
- * items: Array of item objects
- * table
- * rows: Array of arrays of cell objects
- * attributes: Plain object
- *
- * // Components
- *
- * line
- * text: String
- * item
- * line: Line object
- * lists: Array of list objects
- * range
- * offset: Integer
- * length: Integer
- * annotation
- * type: String
- * range: Range object
- * data: Plain object
- * cell
- * document: Object
- * attributes: Plain object
- */
-
-var wiki = {};
-
-/**
- * Serializes offset-based annotations.
- */
-wiki.AnnotationRenderer = function() {
-
- /* Private Members */
-
- var that = this;
- var insertions = {};
-
- /* Methods */
-
- this.wrapWithText = function( range, pre, post ) {
- var start = range.offset;
- if ( !( start in insertions ) ) {
- insertions[start] = [pre];
- } else {
- insertions[start].push( pre );
- }
- var end = range.offset + range.length;
- if ( !( end in insertions ) ) {
- insertions[end] = [post];
- } else {
- insertions[end].unshift( post );
- }
- };
-
- this.wrapWithXml = function( range, tag, attributes ) {
- that.wrapWithText(
- range, wiki.util.xml.open( tag, attributes ),
wiki.util.xml.close( tag )
- );
- };
-
- this.apply = function( text ) {
- var out = '';
- for ( var i = 0, iMax = text.length; i <= iMax; i++ ) {
- if ( i in insertions ) {
- out += insertions[i].join( '' );
- }
- if ( i < iMax ) {
- out += text[i];
- }
- }
- return out;
- };
-};
-
-/**
- * Serializes a WikiDom into HTML.
- */
-wiki.HtmlRenderer = function() {
-
- /* Private Members */
-
- var that = this;
- var blockRenderers = {
- 'comment': renderComment,
- 'horizontal-rule': renderHorizontalRule,
- 'heading': renderHeading,
- 'paragraph': renderParagraph,
- 'list': renderList,
- 'table': renderTable
- };
-
- /* Private Methods */
-
- function renderDocument( doc, rawFirstParagraph ) {
- var out = [];
- for ( var b = 0, bMax = doc.blocks.length; b < bMax; b++ ) {
- var block = doc.blocks[b];
- if ( block.type in blockRenderers ) {
- if ( block.type === 'paragraph' ) {
- out.push(
- renderParagraph( block,
rawFirstParagraph && b === 0 )
- );
- } else {
- out.push( blockRenderers[block.type](
block ) );
- }
- }
- }
- return out.join( '\n' );
- }
-
- function renderComment( comment ) {
- return '<!--' + comment.text + '-->';
- }
-
- function renderHorizontalRule( rule ) {
- return wiki.util.xml.tag( 'hr', {}, false );
- }
-
- function renderHeading( heading ) {
- return wiki.util.xml.tag( 'h' + heading.level, {}, renderLine(
heading.line ) );
- }
-
- function renderParagraph( paragraph, raw ) {
- var out = [];
- for ( var l = 0, lMax = paragraph.lines.length; l < lMax; l++ )
{
- out.push( renderLine( paragraph.lines[l] ) );
- }
- if ( raw ) {
- return out.join( '\n' );
- } else {
- return wiki.util.xml.tag( 'p', {}, out.join( '\n' ) );
- }
- }
-
- function renderList( list ) {
- var tags = {
- 'bullet': 'ul',
- 'number': 'ol'
- };
- var out = [];
- out.push( wiki.util.xml.open( tags[list.style] ) );
- for ( var i = 0, iMax = list.items.length; i < iMax; i++ ) {
- out.push( renderItem( list.items[i] ) );
- }
- out.push( wiki.util.xml.close( tags[list.style] ) );
- return out.join( '\n' );
- }
-
- function renderTable( table ) {
- var out = [];
- var types = {
- 'heading': 'th',
- 'data': 'td'
- };
- out.push( wiki.util.xml.open( 'table', table.attributes ) );
- for ( var r = 0, rMax = table.rows.length; r < rMax; r++ ) {
- out.push( wiki.util.xml.open( 'tr' ) );
- var row = table.rows[r];
- for ( var c = 0, cMax = row.length; c < cMax; c++ ) {
- var type = types[row[c].type || 'data'];
- out.push( wiki.util.xml.tag(
- type,
- row[c].attributes,
- renderDocument( row[c].document, true )
- ) );
- }
- out.push( wiki.util.xml.close( 'tr' ) );
- }
- out.push( wiki.util.xml.close( 'table' ) );
- return out.join( '\n' );
- }
-
- function renderItem( item ) {
- if ( 'lists' in item && item.lists.length ) {
- var out = [];
- out.push( wiki.util.xml.open( 'li' ) + renderLine(
item.line ) );
- for ( var l = 0, lMax = item.lists.length; l < lMax;
l++ ) {
- out.push( renderList( item.lists[l] ) );
- }
- out.push( wiki.util.xml.close( 'li' ) )
- return out.join( '\n' );
- } else {
- return wiki.util.xml.tag( 'li', {}, renderLine(
item.line ) );
- }
- }
-
- function renderLine( line ) {
- if ( 'annotations' in line && line.annotations.length ) {
- var ar = new wiki.AnnotationRenderer();
- for ( var a = 0, aMax = line.annotations.length; a <
aMax; a++ ) {
- var an = line.annotations[a];
- switch ( an.type ) {
- case 'bold':
- ar.wrapWithXml( an.range,
'strong' );
- break;
- case 'italic':
- ar.wrapWithXml( an.range, 'em'
);
- break;
- case 'xlink':
- ar.wrapWithXml( an.range, 'a',
{ 'href': an.data.url } );
- break;
- case 'ilink':
- ar.wrapWithXml( an.range, 'a',
{ 'href': '/wiki/' + an.data.title } );
- break;
- }
- }
- return ar.apply( line.text );
- } else {
- return line.text;
- }
- }
-
- /* Methods */
-
- this.render = function( doc ) {
- return renderDocument( doc );
- };
-};
-
-/**
- * Serializes a WikiDom into Wikitext.
- */
-wiki.WikitextRenderer = function() {
-
- /* Private Members */
-
- var that = this;
- var blockRenderers = {
- 'comment': renderComment,
- 'horizontal-rule': renderHorizontalRule,
- 'heading': renderHeading,
- 'paragraph': renderParagraph,
- 'list': renderList,
- 'table': renderTable
- };
-
- /* Private Methods */
-
- function renderDocument( doc, rawFirstParagraph ) {
- var out = [];
- for ( var b = 0, bMax = doc.blocks.length; b < bMax; b++ ) {
- var block = doc.blocks[b];
- if ( block.type in blockRenderers ) {
- if ( block.type === 'paragraph' ) {
- out.push(
- renderParagraph( block,
rawFirstParagraph && b === 0 )
- );
- if ( b + 1 < bMax /* && doc.blocks[b +
1].type === 'paragraph' */ ) {
- out.push( '' );
- }
- } else {
- out.push( blockRenderers[block.type](
block ) );
- }
- }
- }
- return out.join( '\n' );
- }
-
- function renderComment( comment ) {
- return '<!--' + comment.text + '-->';
- }
-
- function renderHorizontalRule( rule ) {
- return '----';
- }
-
- function renderHeading( heading ) {
- var symbols = wiki.util.str.repeat( '=', heading.level );
- return symbols + renderLine( heading.line ) + symbols;
- }
-
- function renderParagraph( paragraph ) {
- var out = [];
- for ( var l = 0, lMax = paragraph.lines.length; l < lMax; l++ )
{
- out.push( renderLine( paragraph.lines[l] ) );
- }
- return out.join( '\n' );
- }
-
- function renderList( list, path ) {
- if ( typeof path === 'undefined' ) {
- path = '';
- }
- var symbols = {
- 'bullet': '*',
- 'number': '#'
- };
- path += symbols[list.style];
- var out = [];
- for ( var i = 0, iMax = list.items.length; i < iMax; i++ ) {
- out.push( renderItem( list.items[i], path ) );
- }
- return out.join( '\n' );
- }
-
- function renderTable( table ) {
- var out = [];
- var types = {
- 'heading': '!',
- 'data': '|'
- };
- out.push( '{|' + wiki.util.xml.attr( table.attributes ) );
- for ( var r = 0, rMax = table.rows.length; r < rMax; r++ ) {
- var row = table.rows[r];
- if ( r ) {
- out.push( '|-' );
- }
- for ( var c = 0, cMax = row.length; c < cMax; c++ ) {
- var type = types[row[c].type || 'data'];
- out.push(
- type
- + ( row[c].attributes ?
wiki.util.xml.attr( row[c].attributes ) + '|' : '' )
- + renderDocument( row[c].document, true
)
- );
- }
- }
- out.push( '|}' );
- return out.join( '\n' );
- }
-
- function renderItem( item, path ) {
- if ( 'lists' in item && item.lists.length ) {
- var out = [];
- out.push( path + ' ' + renderLine( item.line ) );
- for ( var l = 0, lMax = item.lists.length; l < lMax;
l++ ) {
- out.push( renderList( item.lists[l], path ) );
- }
- return out.join( '\n' );
- } else {
- return path + ' ' + renderLine( item.line );
- }
- }
-
- function renderLine( line ) {
- if ( 'annotations' in line && line.annotations.length ) {
- var ar = new wiki.AnnotationRenderer();
- for ( var a = 0, aMax = line.annotations.length; a <
aMax; a++ ) {
- var an = line.annotations[a];
- switch ( an.type ) {
- case 'bold':
- ar.wrapWithText( an.range,
'\'\'\'', '\'\'\'' );
- break;
- case 'italic':
- ar.wrapWithText( an.range,
'\'\'', '\'\'' );
- break;
- case 'xlink':
- ar.wrapWithText( an.range, '['
+ an.data.url + ' ', ']' );
- break;
- case 'ilink':
- ar.wrapWithText( an.range, '[['
+ an.data.title + '|', ']]' );
- break;
- }
- }
- return ar.apply( line.text );
- } else {
- return line.text;
- }
- }
-
- /* Methods */
-
- this.render = function( doc ) {
- return renderDocument( doc );
- };
-};
-
-/**
- * Utilities used by WikiDom renderers and parsers.
- */
-wiki.util = {
- 'str': {
- 'repeat': function( pattern, count ) {
- if ( count < 1 ) return '';
- var result = '';
- while ( count > 0 ) {
- if ( count & 1 ) result += pattern;
- count >>= 1, pattern += pattern;
- };
- return result;
- }
- },
- 'xml': {
- 'esc': function( text ) {
- return text
- .replace( /&/g, '&' )
- .replace( /</g, '<' )
- .replace( />/g, '>' )
- .replace( /"/g, '"' )
- .replace( /'/g, ''' );
- },
- 'attr': function( attributes ) {
- var attr = '';
- if ( attributes ) {
- for ( var name in attributes ) {
- attr += ' ' + name + '="' +
attributes[name] + '"';
- }
- }
- return attr;
- },
- 'open': function( tag, attributes ) {
- return '<' + tag + wiki.util.xml.attr( attributes ) +
'>';
- },
- 'close': function( tag ) {
- return '</' + tag + '>';
- },
- 'tag': function( tag, attributes, value, escape ) {
- if ( value === false ) {
- return '<' + tag + wiki.util.xml.attr(
attributes ) + ' />';
- } else {
- if ( escape ) {
- value = wiki.util.xml.esc( value );
- }
- return '<' + tag + wiki.util.xml.attr(
attributes ) + '>' + value
- + '</' + tag + '>';
- }
- }
- }
-};
_______________________________________________
MediaWiki-CVS mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-cvs