mediawiki-extensions-Visual.../modules/parser/ext.core.PostExpandParagraphHandler.js
Gabriel Wicke 36084c5d93 Preserve original newlines in HTML and serialization
254 round-trip tests (up from 184) are now passing.

Also:
* tweaked runtests.sh slightly (use less -R instead of -r).
* made sure the EOFTk is preserved in phase 3 transforms

Change-Id: I1de22186bdb78e52019370e43f096877005b8f5a
2012-05-29 23:29:03 +02:00

101 lines
2.8 KiB
JavaScript

/*
* Insert paragraphs for comment-only lines after template expansion
*
* @author Gabriel Wicke <gwicke@wikimedia.org>
*/
// Include general utilities
var Util = require('./ext.Util.js').Util,
u = new Util();
function PostExpandParagraphHandler ( dispatcher ) {
this.tokens = [];
this.newLines = 0;
this.register( dispatcher );
}
// constants
PostExpandParagraphHandler.prototype.newlineRank = 2.5;
PostExpandParagraphHandler.prototype.anyRank = 2.501; // Just after regular quote and newline
// Register this transformer with the TokenTransformer
PostExpandParagraphHandler.prototype.register = function ( dispatcher ) {
this.dispatcher = dispatcher;
// Register for NEWLINE tokens
dispatcher.addTransform( this.onNewLine.bind(this),
this.newlineRank, 'newline' );
// Reset internal state when we are done
dispatcher.addTransform( this.onEnd.bind(this),
this.newlineRank, 'end' );
};
PostExpandParagraphHandler.prototype.reset = function ( token, frame, cb ) {
//console.warn( 'PostExpandParagraphHandler.reset ' + JSON.stringify( this.tokens ) );
if ( this.newLines ) {
return { tokens: this._finish() };
} else {
return { token: token };
}
};
PostExpandParagraphHandler.prototype._finish = function ( ) {
var tokens = this.tokens;
this.tokens = [];
// remove 'any' registration
this.dispatcher.removeTransform( this.anyRank, 'any' );
this.newLines = 0;
return tokens;
};
// Handle NEWLINE tokens
PostExpandParagraphHandler.prototype.onNewLine = function ( token, frame, cb ) {
//console.warn( 'PostExpandParagraphHandler.onNewLine: ' + JSON.stringify( token, null , 2 ) );
var res;
this.tokens.push( token );
if( ! this.newLines ) {
this.dispatcher.addTransform( this.onAny.bind(this),
this.anyRank, 'any' );
}
this.newLines++;
return {};
};
PostExpandParagraphHandler.prototype.onEnd = function ( token, frame, cb ) {
var tokens = this.tokens;
this.reset();
return { tokens: tokens.concat( [token] ) };
}
PostExpandParagraphHandler.prototype.onAny = function ( token, frame, cb ) {
//console.warn( 'PostExpandParagraphHandler.onAny' );
this.tokens.push( token );
if ( token.constructor === CommentTk ||
( token.constructor === String && token.match( /^[\t ]*$/ ) )
)
{
// Continue with collection..
return {};
} else {
// XXX: Only open paragraph if inline token follows!
// None of the tokens we are interested in, so abort processing..
//console.warn( 'PostExpandParagraphHandler.onAny: ' + JSON.stringify( this.tokens, null , 2 ) );
if ( this.newLines >= 2 && ! u.isBlockToken( token ) ) {
//console.warn( 'insert p:' + JSON.stringify( token, null, 2 ) );
return { tokens: [ new TagTk( 'p' ) ].concat( this._finish() ) };
} else {
return { tokens: this._finish() };
}
}
};
if (typeof module == "object") {
module.exports.PostExpandParagraphHandler = PostExpandParagraphHandler;
}