mediawiki-extensions-Visual.../modules/parser/mediawiki.HTML5TreeBuilder.node.js
Gabriel Wicke 1c7fe0eb34 Refactor table productions to support table fragments in templates (table
start / row / table end). The old productions are not deleted yet to make it
easy to compare the output on more complex articles. 181 tests passing after
adding two table tests with whitespace-only differences to the whitelist.
2011-12-22 11:43:55 +00:00

89 lines
2.3 KiB
JavaScript

/* Front-end/Wrapper for a particular tree builder, in this case the
* parser/tree builder from the node 'html5' module. Feed it tokens using
* processToken, and it will build you a DOM tree retrievable using .document
* or .body(). */
var events = require('events');
var HTML5 = require('./html5/index');
FauxHTML5 = {};
FauxHTML5.TreeBuilder = function ( ) {
// The parser we are going to emit our tokens to
this.parser = new HTML5.Parser();
// Sets up the parser
this.parser.parse(this);
this.document = this.parser.document;
return this;
};
FauxHTML5.TreeBuilder.prototype = new events.EventEmitter();
// Adapt the token format to internal HTML tree builder format, call the actual
// html tree builder by emitting the token.
FauxHTML5.TreeBuilder.prototype.processToken = function (token) {
var att = function (maybeAttribs) {
if ( $.isArray( maybeAttribs ) ) {
var atts = [];
for(var i = 0, length = maybeAttribs.length; i < length; i++) {
var att = maybeAttribs[i];
atts.push({nodeName: att[0], nodeValue: att[1]});
}
return atts;
} else {
return [];
}
};
switch (token.type) {
case "TEXT":
this.emit('token', {type: 'Characters', data: token.value});
break;
case "TAG":
this.emit('token', {type: 'StartTag',
name: token.name,
data: att(token.attribs)});
break;
case "ENDTAG":
this.emit('token', {type: 'EndTag',
name: token.name,
data: att(token.attribs)});
break;
case "SELFCLOSINGTAG":
this.emit('token', {type: 'StartTag',
name: token.name,
data: att(token.attribs)});
this.emit('token', {type: 'EndTag',
name: token.name,
data: att(token.attribs)});
break;
case "COMMENT":
this.emit('token', {type: 'Comment',
data: token.value});
break;
case "END":
this.emit('end');
this.document = this.parser.document;
if ( ! this.document.body ) {
// HACK: This should not be needed really.
this.document.body = this.parser.document.getElementsByTagName('body')[0];
}
break;
case "NEWLINE":
//this.emit('end');
//this.emit('token', {type: 'Characters', data: "\n"});
break;
default:
console.log("Unhandled token: " + JSON.stringify(token));
break;
}
};
if (typeof module == "object") {
module.exports.FauxHTML5 = FauxHTML5;
}