mediawiki-extensions-Visual.../modules/parser/html5/parser/before_html_phase.js
Gabriel Wicke b750ce38b8 Add node.js-compatible HTML5 parser and hook it up to the PEG tokenizer.
Builds a DOM tree (jsdom) from the tokens and then serializes that using
document.innerHTML. This is all very experimental, so don't be surprised by
rough edges.
2011-11-18 13:57:07 +00:00

53 lines
1.4 KiB
JavaScript

var Phase = require('./phase').Phase;
var HTML5 = require('../../html5');
exports.Phase = p = function BeforeHtmlPhase(parser, tree) {
Phase.call(this, parser, tree);
this.name = 'before_html_phase'
}
p.prototype = new Phase;
p.prototype.processEOF = function() {
this.insert_html_element();
this.parser.phase.processEOF();
}
p.prototype.processComment = function(data) {
this.tree.insert_comment(data, this.tree.document);
}
p.prototype.processSpaceCharacters = function(data) {
}
p.prototype.processCharacters = function(data) {
this.insert_html_element();
this.parser.phase.processCharacters(data);
}
p.prototype.processStartTag = function(name, attributes, self_closing) {
if(name == 'html') this.parser.first_start_tag = true;
this.insert_html_element();
this.parser.phase.processStartTag(name, attributes);
}
p.prototype.processEndTag = function(name) {
this.insert_html_element();
this.parser.phase.processEndTag(name);
}
p.prototype.insert_html_element = function() {
var de
if(de = this.tree.document.documentElement) {
if(de.tagName != 'HTML')
HTML5.debug('parser.before_html_phase', 'Non-HTML root element!')
this.tree.open_elements.push(de)
while(de.childNodes.length >= 1) de.removeChild(de.firstChild)
} else {
var element = this.tree.createElement('html', []);
this.tree.open_elements.push(element);
this.tree.document.appendChild(element);
}
this.parser.newPhase('beforeHead');
}