mediawiki-extensions-Visual.../modules/parser/mediawiki.HTML5TreeBuilder.node.js

87 lines
2.2 KiB
JavaScript
Raw Normal View History

/* 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(). */
2011-11-18 14:00:14 +00:00
var events = require('events');
2011-11-18 14:00:14 +00:00
var HTML5 = require('./html5/index');
FauxHTML5 = {};
2011-11-18 14:00:14 +00:00
FauxHTML5.TreeBuilder = function ( ) {
// The parser we are going to emit our tokens to
2011-11-18 14:00:14 +00:00
this.parser = new HTML5.Parser();
// Sets up the parser
2011-11-18 14:00:14 +00:00
this.parser.parse(this);
this.document = this.parser.document;
2011-11-18 14:00:14 +00:00
return this;
};
2011-11-18 14:00:14 +00:00
FauxHTML5.TreeBuilder.prototype = new events.EventEmitter();
2011-11-18 14:00:14 +00:00
// 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) {
2011-11-18 14:00:14 +00:00
var att = function (maybeAttribs) {
if ( $.isArray( maybeAttribs ) ) {
2011-11-18 14:00:14 +00:00
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',
2011-11-18 14:00:14 +00:00
name: token.name,
data: att(token.attribs)});
break;
case "COMMENT":
this.emit('token', {type: 'Comment',
2011-11-18 14:00:14 +00:00
data: token.value});
break;
case "END":
this.emit('end');
console.log("at 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];
}
2011-11-18 14:00:14 +00:00
break;
case "NEWLINE":
//this.emit('end');
this.emit('token', {type: 'Characters', data: "\n"});
2011-11-18 14:00:14 +00:00
break;
default:
console.log("Unhandled token: " + JSON.stringify(token));
break;
}
};
if (typeof module == "object") {
module.exports.FauxHTML5 = FauxHTML5;
2011-11-18 14:00:14 +00:00
}