Files
codeocean/vendor/assets/javascripts/ace/worker-html.js
Sebastian Serth 735a74901f Update ACE Editor to version 1.2.0
Previously, we were at an ACE editor published between 1.1.8 and 1.1.9. This caused multiple issues and was especially a problem for the upcoming pair programming feature. Further, updating ace is a long-time priority, see https://github.com/openHPI/codeocean/issues/250.

Now, we are not yet updating to the latest version, but rather to the next minor version. This already contains breaking changes, and we are currently interested to keep the number of changes as low as possible. Further updating ACE might be still a future task.

The new ACE version 1.2.0 is taken from this tag: https://github.com/ajaxorg/ace-builds/releases/tag/v1.2.0.
We are using the src build (not minified, not in the noconflict version), since the same was used before as well.

Further, we need to change our migration for storing editor events. Since the table is not yet used (in production), we also update the enum.
2023-09-12 16:41:33 +02:00

11607 lines
330 KiB
JavaScript

"no use strict";
;(function(window) {
if (typeof window.window != "undefined" && window.document)
return;
if (window.require && window.define)
return;
window.console = function() {
var msgs = Array.prototype.slice.call(arguments, 0);
postMessage({type: "log", data: msgs});
};
window.console.error =
window.console.warn =
window.console.log =
window.console.trace = window.console;
window.window = window;
window.ace = window;
window.onerror = function(message, file, line, col, err) {
postMessage({type: "error", data: {
message: message,
data: err.data,
file: file,
line: line,
col: col,
stack: err.stack
}});
};
window.normalizeModule = function(parentId, moduleName) {
// normalize plugin requires
if (moduleName.indexOf("!") !== -1) {
var chunks = moduleName.split("!");
return window.normalizeModule(parentId, chunks[0]) + "!" + window.normalizeModule(parentId, chunks[1]);
}
// normalize relative requires
if (moduleName.charAt(0) == ".") {
var base = parentId.split("/").slice(0, -1).join("/");
moduleName = (base ? base + "/" : "") + moduleName;
while (moduleName.indexOf(".") !== -1 && previous != moduleName) {
var previous = moduleName;
moduleName = moduleName.replace(/^\.\//, "").replace(/\/\.\//, "/").replace(/[^\/]+\/\.\.\//, "");
}
}
return moduleName;
};
window.require = function require(parentId, id) {
if (!id) {
id = parentId;
parentId = null;
}
if (!id.charAt)
throw new Error("worker.js require() accepts only (parentId, id) as arguments");
id = window.normalizeModule(parentId, id);
var module = window.require.modules[id];
if (module) {
if (!module.initialized) {
module.initialized = true;
module.exports = module.factory().exports;
}
return module.exports;
}
if (!window.require.tlns)
return console.log("unable to load " + id);
var path = resolveModuleId(id, window.require.tlns);
if (path.slice(-3) != ".js") path += ".js";
window.require.id = id;
window.require.modules[id] = {}; // prevent infinite loop on broken modules
importScripts(path);
return window.require(parentId, id);
};
function resolveModuleId(id, paths) {
var testPath = id, tail = "";
while (testPath) {
var alias = paths[testPath];
if (typeof alias == "string") {
return alias + tail;
} else if (alias) {
return alias.location.replace(/\/*$/, "/") + (tail || alias.main || alias.name);
} else if (alias === false) {
return "";
}
var i = testPath.lastIndexOf("/");
if (i === -1) break;
tail = testPath.substr(i) + tail;
testPath = testPath.slice(0, i);
}
return id;
}
window.require.modules = {};
window.require.tlns = {};
window.define = function(id, deps, factory) {
if (arguments.length == 2) {
factory = deps;
if (typeof id != "string") {
deps = id;
id = window.require.id;
}
} else if (arguments.length == 1) {
factory = id;
deps = [];
id = window.require.id;
}
if (typeof factory != "function") {
window.require.modules[id] = {
exports: factory,
initialized: true
};
return;
}
if (!deps.length)
// If there is no dependencies, we inject "require", "exports" and
// "module" as dependencies, to provide CommonJS compatibility.
deps = ["require", "exports", "module"];
var req = function(childId) {
return window.require(id, childId);
};
window.require.modules[id] = {
exports: {},
factory: function() {
var module = this;
var returnExports = factory.apply(this, deps.map(function(dep) {
switch (dep) {
// Because "require", "exports" and "module" aren't actual
// dependencies, we must handle them seperately.
case "require": return req;
case "exports": return module.exports;
case "module": return module;
// But for all other dependencies, we can just go ahead and
// require them.
default: return req(dep);
}
}));
if (returnExports)
module.exports = returnExports;
return module;
}
};
};
window.define.amd = {};
require.tlns = {};
window.initBaseUrls = function initBaseUrls(topLevelNamespaces) {
for (var i in topLevelNamespaces)
require.tlns[i] = topLevelNamespaces[i];
};
window.initSender = function initSender() {
var EventEmitter = window.require("ace/lib/event_emitter").EventEmitter;
var oop = window.require("ace/lib/oop");
var Sender = function() {};
(function() {
oop.implement(this, EventEmitter);
this.callback = function(data, callbackId) {
postMessage({
type: "call",
id: callbackId,
data: data
});
};
this.emit = function(name, data) {
postMessage({
type: "event",
name: name,
data: data
});
};
}).call(Sender.prototype);
return new Sender();
};
var main = window.main = null;
var sender = window.sender = null;
window.onmessage = function(e) {
var msg = e.data;
if (msg.event && sender) {
sender._signal(msg.event, msg.data);
}
else if (msg.command) {
if (main[msg.command])
main[msg.command].apply(main, msg.args);
else if (window[msg.command])
window[msg.command].apply(window, msg.args);
else
throw new Error("Unknown command:" + msg.command);
}
else if (msg.init) {
window.initBaseUrls(msg.tlns);
require("ace/lib/es5-shim");
sender = window.sender = window.initSender();
var clazz = require(msg.module)[msg.classname];
main = window.main = new clazz(sender);
}
};
})(this);
define("ace/lib/oop",["require","exports","module"], function(require, exports, module) {
"use strict";
exports.inherits = function(ctor, superCtor) {
ctor.super_ = superCtor;
ctor.prototype = Object.create(superCtor.prototype, {
constructor: {
value: ctor,
enumerable: false,
writable: true,
configurable: true
}
});
};
exports.mixin = function(obj, mixin) {
for (var key in mixin) {
obj[key] = mixin[key];
}
return obj;
};
exports.implement = function(proto, mixin) {
exports.mixin(proto, mixin);
};
});
define("ace/lib/lang",["require","exports","module"], function(require, exports, module) {
"use strict";
exports.last = function(a) {
return a[a.length - 1];
};
exports.stringReverse = function(string) {
return string.split("").reverse().join("");
};
exports.stringRepeat = function (string, count) {
var result = '';
while (count > 0) {
if (count & 1)
result += string;
if (count >>= 1)
string += string;
}
return result;
};
var trimBeginRegexp = /^\s\s*/;
var trimEndRegexp = /\s\s*$/;
exports.stringTrimLeft = function (string) {
return string.replace(trimBeginRegexp, '');
};
exports.stringTrimRight = function (string) {
return string.replace(trimEndRegexp, '');
};
exports.copyObject = function(obj) {
var copy = {};
for (var key in obj) {
copy[key] = obj[key];
}
return copy;
};
exports.copyArray = function(array){
var copy = [];
for (var i=0, l=array.length; i<l; i++) {
if (array[i] && typeof array[i] == "object")
copy[i] = this.copyObject( array[i] );
else
copy[i] = array[i];
}
return copy;
};
exports.deepCopy = function deepCopy(obj) {
if (typeof obj !== "object" || !obj)
return obj;
var copy;
if (Array.isArray(obj)) {
copy = [];
for (var key = 0; key < obj.length; key++) {
copy[key] = deepCopy(obj[key]);
}
return copy;
}
var cons = obj.constructor;
if (cons === RegExp)
return obj;
copy = cons();
for (var key in obj) {
copy[key] = deepCopy(obj[key]);
}
return copy;
};
exports.arrayToMap = function(arr) {
var map = {};
for (var i=0; i<arr.length; i++) {
map[arr[i]] = 1;
}
return map;
};
exports.createMap = function(props) {
var map = Object.create(null);
for (var i in props) {
map[i] = props[i];
}
return map;
};
exports.arrayRemove = function(array, value) {
for (var i = 0; i <= array.length; i++) {
if (value === array[i]) {
array.splice(i, 1);
}
}
};
exports.escapeRegExp = function(str) {
return str.replace(/([.*+?^${}()|[\]\/\\])/g, '\\$1');
};
exports.escapeHTML = function(str) {
return str.replace(/&/g, "&#38;").replace(/"/g, "&#34;").replace(/'/g, "&#39;").replace(/</g, "&#60;");
};
exports.getMatchOffsets = function(string, regExp) {
var matches = [];
string.replace(regExp, function(str) {
matches.push({
offset: arguments[arguments.length-2],
length: str.length
});
});
return matches;
};
exports.deferredCall = function(fcn) {
var timer = null;
var callback = function() {
timer = null;
fcn();
};
var deferred = function(timeout) {
deferred.cancel();
timer = setTimeout(callback, timeout || 0);
return deferred;
};
deferred.schedule = deferred;
deferred.call = function() {
this.cancel();
fcn();
return deferred;
};
deferred.cancel = function() {
clearTimeout(timer);
timer = null;
return deferred;
};
deferred.isPending = function() {
return timer;
};
return deferred;
};
exports.delayedCall = function(fcn, defaultTimeout) {
var timer = null;
var callback = function() {
timer = null;
fcn();
};
var _self = function(timeout) {
if (timer == null)
timer = setTimeout(callback, timeout || defaultTimeout);
};
_self.delay = function(timeout) {
timer && clearTimeout(timer);
timer = setTimeout(callback, timeout || defaultTimeout);
};
_self.schedule = _self;
_self.call = function() {
this.cancel();
fcn();
};
_self.cancel = function() {
timer && clearTimeout(timer);
timer = null;
};
_self.isPending = function() {
return timer;
};
return _self;
};
});
define("ace/range",["require","exports","module"], function(require, exports, module) {
"use strict";
var comparePoints = function(p1, p2) {
return p1.row - p2.row || p1.column - p2.column;
};
var Range = function(startRow, startColumn, endRow, endColumn) {
this.start = {
row: startRow,
column: startColumn
};
this.end = {
row: endRow,
column: endColumn
};
};
(function() {
this.isEqual = function(range) {
return this.start.row === range.start.row &&
this.end.row === range.end.row &&
this.start.column === range.start.column &&
this.end.column === range.end.column;
};
this.toString = function() {
return ("Range: [" + this.start.row + "/" + this.start.column +
"] -> [" + this.end.row + "/" + this.end.column + "]");
};
this.contains = function(row, column) {
return this.compare(row, column) == 0;
};
this.compareRange = function(range) {
var cmp,
end = range.end,
start = range.start;
cmp = this.compare(end.row, end.column);
if (cmp == 1) {
cmp = this.compare(start.row, start.column);
if (cmp == 1) {
return 2;
} else if (cmp == 0) {
return 1;
} else {
return 0;
}
} else if (cmp == -1) {
return -2;
} else {
cmp = this.compare(start.row, start.column);
if (cmp == -1) {
return -1;
} else if (cmp == 1) {
return 42;
} else {
return 0;
}
}
};
this.comparePoint = function(p) {
return this.compare(p.row, p.column);
};
this.containsRange = function(range) {
return this.comparePoint(range.start) == 0 && this.comparePoint(range.end) == 0;
};
this.intersects = function(range) {
var cmp = this.compareRange(range);
return (cmp == -1 || cmp == 0 || cmp == 1);
};
this.isEnd = function(row, column) {
return this.end.row == row && this.end.column == column;
};
this.isStart = function(row, column) {
return this.start.row == row && this.start.column == column;
};
this.setStart = function(row, column) {
if (typeof row == "object") {
this.start.column = row.column;
this.start.row = row.row;
} else {
this.start.row = row;
this.start.column = column;
}
};
this.setEnd = function(row, column) {
if (typeof row == "object") {
this.end.column = row.column;
this.end.row = row.row;
} else {
this.end.row = row;
this.end.column = column;
}
};
this.inside = function(row, column) {
if (this.compare(row, column) == 0) {
if (this.isEnd(row, column) || this.isStart(row, column)) {
return false;
} else {
return true;
}
}
return false;
};
this.insideStart = function(row, column) {
if (this.compare(row, column) == 0) {
if (this.isEnd(row, column)) {
return false;
} else {
return true;
}
}
return false;
};
this.insideEnd = function(row, column) {
if (this.compare(row, column) == 0) {
if (this.isStart(row, column)) {
return false;
} else {
return true;
}
}
return false;
};
this.compare = function(row, column) {
if (!this.isMultiLine()) {
if (row === this.start.row) {
return column < this.start.column ? -1 : (column > this.end.column ? 1 : 0);
};
}
if (row < this.start.row)
return -1;
if (row > this.end.row)
return 1;
if (this.start.row === row)
return column >= this.start.column ? 0 : -1;
if (this.end.row === row)
return column <= this.end.column ? 0 : 1;
return 0;
};
this.compareStart = function(row, column) {
if (this.start.row == row && this.start.column == column) {
return -1;
} else {
return this.compare(row, column);
}
};
this.compareEnd = function(row, column) {
if (this.end.row == row && this.end.column == column) {
return 1;
} else {
return this.compare(row, column);
}
};
this.compareInside = function(row, column) {
if (this.end.row == row && this.end.column == column) {
return 1;
} else if (this.start.row == row && this.start.column == column) {
return -1;
} else {
return this.compare(row, column);
}
};
this.clipRows = function(firstRow, lastRow) {
if (this.end.row > lastRow)
var end = {row: lastRow + 1, column: 0};
else if (this.end.row < firstRow)
var end = {row: firstRow, column: 0};
if (this.start.row > lastRow)
var start = {row: lastRow + 1, column: 0};
else if (this.start.row < firstRow)
var start = {row: firstRow, column: 0};
return Range.fromPoints(start || this.start, end || this.end);
};
this.extend = function(row, column) {
var cmp = this.compare(row, column);
if (cmp == 0)
return this;
else if (cmp == -1)
var start = {row: row, column: column};
else
var end = {row: row, column: column};
return Range.fromPoints(start || this.start, end || this.end);
};
this.isEmpty = function() {
return (this.start.row === this.end.row && this.start.column === this.end.column);
};
this.isMultiLine = function() {
return (this.start.row !== this.end.row);
};
this.clone = function() {
return Range.fromPoints(this.start, this.end);
};
this.collapseRows = function() {
if (this.end.column == 0)
return new Range(this.start.row, 0, Math.max(this.start.row, this.end.row-1), 0)
else
return new Range(this.start.row, 0, this.end.row, 0)
};
this.toScreenRange = function(session) {
var screenPosStart = session.documentToScreenPosition(this.start);
var screenPosEnd = session.documentToScreenPosition(this.end);
return new Range(
screenPosStart.row, screenPosStart.column,
screenPosEnd.row, screenPosEnd.column
);
};
this.moveBy = function(row, column) {
this.start.row += row;
this.start.column += column;
this.end.row += row;
this.end.column += column;
};
}).call(Range.prototype);
Range.fromPoints = function(start, end) {
return new Range(start.row, start.column, end.row, end.column);
};
Range.comparePoints = comparePoints;
Range.comparePoints = function(p1, p2) {
return p1.row - p2.row || p1.column - p2.column;
};
exports.Range = Range;
});
define("ace/apply_delta",["require","exports","module"], function(require, exports, module) {
"use strict";
function throwDeltaError(delta, errorText){
console.log("Invalid Delta:", delta);
throw "Invalid Delta: " + errorText;
}
function positionInDocument(docLines, position) {
return position.row >= 0 && position.row < docLines.length &&
position.column >= 0 && position.column <= docLines[position.row].length;
}
function validateDelta(docLines, delta) {
if (delta.action != "insert" && delta.action != "remove")
throwDeltaError(delta, "delta.action must be 'insert' or 'remove'");
if (!(delta.lines instanceof Array))
throwDeltaError(delta, "delta.lines must be an Array");
if (!delta.start || !delta.end)
throwDeltaError(delta, "delta.start/end must be an present");
var start = delta.start;
if (!positionInDocument(docLines, delta.start))
throwDeltaError(delta, "delta.start must be contained in document");
var end = delta.end;
if (delta.action == "remove" && !positionInDocument(docLines, end))
throwDeltaError(delta, "delta.end must contained in document for 'remove' actions");
var numRangeRows = end.row - start.row;
var numRangeLastLineChars = (end.column - (numRangeRows == 0 ? start.column : 0));
if (numRangeRows != delta.lines.length - 1 || delta.lines[numRangeRows].length != numRangeLastLineChars)
throwDeltaError(delta, "delta.range must match delta lines");
}
exports.applyDelta = function(docLines, delta, doNotValidate) {
var row = delta.start.row;
var startColumn = delta.start.column;
var line = docLines[row] || "";
switch (delta.action) {
case "insert":
var lines = delta.lines;
if (lines.length === 1) {
docLines[row] = line.substring(0, startColumn) + delta.lines[0] + line.substring(startColumn);
} else {
var args = [row, 1].concat(delta.lines);
docLines.splice.apply(docLines, args);
docLines[row] = line.substring(0, startColumn) + docLines[row];
docLines[row + delta.lines.length - 1] += line.substring(startColumn);
}
break;
case "remove":
var endColumn = delta.end.column;
var endRow = delta.end.row;
if (row === endRow) {
docLines[row] = line.substring(0, startColumn) + line.substring(endColumn);
} else {
docLines.splice(
row, endRow - row + 1,
line.substring(0, startColumn) + docLines[endRow].substring(endColumn)
);
}
break;
}
}
});
define("ace/lib/event_emitter",["require","exports","module"], function(require, exports, module) {
"use strict";
var EventEmitter = {};
var stopPropagation = function() { this.propagationStopped = true; };
var preventDefault = function() { this.defaultPrevented = true; };
EventEmitter._emit =
EventEmitter._dispatchEvent = function(eventName, e) {
this._eventRegistry || (this._eventRegistry = {});
this._defaultHandlers || (this._defaultHandlers = {});
var listeners = this._eventRegistry[eventName] || [];
var defaultHandler = this._defaultHandlers[eventName];
if (!listeners.length && !defaultHandler)
return;
if (typeof e != "object" || !e)
e = {};
if (!e.type)
e.type = eventName;
if (!e.stopPropagation)
e.stopPropagation = stopPropagation;
if (!e.preventDefault)
e.preventDefault = preventDefault;
listeners = listeners.slice();
for (var i=0; i<listeners.length; i++) {
listeners[i](e, this);
if (e.propagationStopped)
break;
}
if (defaultHandler && !e.defaultPrevented)
return defaultHandler(e, this);
};
EventEmitter._signal = function(eventName, e) {
var listeners = (this._eventRegistry || {})[eventName];
if (!listeners)
return;
listeners = listeners.slice();
for (var i=0; i<listeners.length; i++)
listeners[i](e, this);
};
EventEmitter.once = function(eventName, callback) {
var _self = this;
callback && this.addEventListener(eventName, function newCallback() {
_self.removeEventListener(eventName, newCallback);
callback.apply(null, arguments);
});
};
EventEmitter.setDefaultHandler = function(eventName, callback) {
var handlers = this._defaultHandlers
if (!handlers)
handlers = this._defaultHandlers = {_disabled_: {}};
if (handlers[eventName]) {
var old = handlers[eventName];
var disabled = handlers._disabled_[eventName];
if (!disabled)
handlers._disabled_[eventName] = disabled = [];
disabled.push(old);
var i = disabled.indexOf(callback);
if (i != -1)
disabled.splice(i, 1);
}
handlers[eventName] = callback;
};
EventEmitter.removeDefaultHandler = function(eventName, callback) {
var handlers = this._defaultHandlers
if (!handlers)
return;
var disabled = handlers._disabled_[eventName];
if (handlers[eventName] == callback) {
var old = handlers[eventName];
if (disabled)
this.setDefaultHandler(eventName, disabled.pop());
} else if (disabled) {
var i = disabled.indexOf(callback);
if (i != -1)
disabled.splice(i, 1);
}
};
EventEmitter.on =
EventEmitter.addEventListener = function(eventName, callback, capturing) {
this._eventRegistry = this._eventRegistry || {};
var listeners = this._eventRegistry[eventName];
if (!listeners)
listeners = this._eventRegistry[eventName] = [];
if (listeners.indexOf(callback) == -1)
listeners[capturing ? "unshift" : "push"](callback);
return callback;
};
EventEmitter.off =
EventEmitter.removeListener =
EventEmitter.removeEventListener = function(eventName, callback) {
this._eventRegistry = this._eventRegistry || {};
var listeners = this._eventRegistry[eventName];
if (!listeners)
return;
var index = listeners.indexOf(callback);
if (index !== -1)
listeners.splice(index, 1);
};
EventEmitter.removeAllListeners = function(eventName) {
if (this._eventRegistry) this._eventRegistry[eventName] = [];
};
exports.EventEmitter = EventEmitter;
});
define("ace/anchor",["require","exports","module","ace/lib/oop","ace/lib/event_emitter"], function(require, exports, module) {
"use strict";
var oop = require("./lib/oop");
var EventEmitter = require("./lib/event_emitter").EventEmitter;
var Anchor = exports.Anchor = function(doc, row, column) {
this.$onChange = this.onChange.bind(this);
this.attach(doc);
if (typeof column == "undefined")
this.setPosition(row.row, row.column);
else
this.setPosition(row, column);
};
(function() {
oop.implement(this, EventEmitter);
this.getPosition = function() {
return this.$clipPositionToDocument(this.row, this.column);
};
this.getDocument = function() {
return this.document;
};
this.$insertRight = false;
this.onChange = function(delta) {
if (delta.start.row == delta.end.row && delta.start.row != this.row)
return;
if (delta.start.row > this.row)
return;
var point = $getTransformedPoint(delta, {row: this.row, column: this.column}, this.$insertRight);
this.setPosition(point.row, point.column, true);
};
function $pointsInOrder(point1, point2, equalPointsInOrder) {
var bColIsAfter = equalPointsInOrder ? point1.column <= point2.column : point1.column < point2.column;
return (point1.row < point2.row) || (point1.row == point2.row && bColIsAfter);
}
function $getTransformedPoint(delta, point, moveIfEqual) {
var deltaIsInsert = delta.action == "insert";
var deltaRowShift = (deltaIsInsert ? 1 : -1) * (delta.end.row - delta.start.row);
var deltaColShift = (deltaIsInsert ? 1 : -1) * (delta.end.column - delta.start.column);
var deltaStart = delta.start;
var deltaEnd = deltaIsInsert ? deltaStart : delta.end; // Collapse insert range.
if ($pointsInOrder(point, deltaStart, moveIfEqual)) {
return {
row: point.row,
column: point.column
};
}
if ($pointsInOrder(deltaEnd, point, !moveIfEqual)) {
return {
row: point.row + deltaRowShift,
column: point.column + (point.row == deltaEnd.row ? deltaColShift : 0)
};
}
return {
row: deltaStart.row,
column: deltaStart.column
};
}
this.setPosition = function(row, column, noClip) {
var pos;
if (noClip) {
pos = {
row: row,
column: column
};
} else {
pos = this.$clipPositionToDocument(row, column);
}
if (this.row == pos.row && this.column == pos.column)
return;
var old = {
row: this.row,
column: this.column
};
this.row = pos.row;
this.column = pos.column;
this._signal("change", {
old: old,
value: pos
});
};
this.detach = function() {
this.document.removeEventListener("change", this.$onChange);
};
this.attach = function(doc) {
this.document = doc || this.document;
this.document.on("change", this.$onChange);
};
this.$clipPositionToDocument = function(row, column) {
var pos = {};
if (row >= this.document.getLength()) {
pos.row = Math.max(0, this.document.getLength() - 1);
pos.column = this.document.getLine(pos.row).length;
}
else if (row < 0) {
pos.row = 0;
pos.column = 0;
}
else {
pos.row = row;
pos.column = Math.min(this.document.getLine(pos.row).length, Math.max(0, column));
}
if (column < 0)
pos.column = 0;
return pos;
};
}).call(Anchor.prototype);
});
define("ace/document",["require","exports","module","ace/lib/oop","ace/apply_delta","ace/lib/event_emitter","ace/range","ace/anchor"], function(require, exports, module) {
"use strict";
var oop = require("./lib/oop");
var applyDelta = require("./apply_delta").applyDelta;
var EventEmitter = require("./lib/event_emitter").EventEmitter;
var Range = require("./range").Range;
var Anchor = require("./anchor").Anchor;
var Document = function(textOrLines) {
this.$lines = [""];
if (textOrLines.length === 0) {
this.$lines = [""];
} else if (Array.isArray(textOrLines)) {
this.insertMergedLines({row: 0, column: 0}, textOrLines);
} else {
this.insert({row: 0, column:0}, textOrLines);
}
};
(function() {
oop.implement(this, EventEmitter);
this.setValue = function(text) {
var len = this.getLength() - 1;
this.remove(new Range(0, 0, len, this.getLine(len).length));
this.insert({row: 0, column: 0}, text);
};
this.getValue = function() {
return this.getAllLines().join(this.getNewLineCharacter());
};
this.createAnchor = function(row, column) {
return new Anchor(this, row, column);
};
if ("aaa".split(/a/).length === 0) {
this.$split = function(text) {
return text.replace(/\r\n|\r/g, "\n").split("\n");
};
} else {
this.$split = function(text) {
return text.split(/\r\n|\r|\n/);
};
}
this.$detectNewLine = function(text) {
var match = text.match(/^.*?(\r\n|\r|\n)/m);
this.$autoNewLine = match ? match[1] : "\n";
this._signal("changeNewLineMode");
};
this.getNewLineCharacter = function() {
switch (this.$newLineMode) {
case "windows":
return "\r\n";
case "unix":
return "\n";
default:
return this.$autoNewLine || "\n";
}
};
this.$autoNewLine = "";
this.$newLineMode = "auto";
this.setNewLineMode = function(newLineMode) {
if (this.$newLineMode === newLineMode)
return;
this.$newLineMode = newLineMode;
this._signal("changeNewLineMode");
};
this.getNewLineMode = function() {
return this.$newLineMode;
};
this.isNewLine = function(text) {
return (text == "\r\n" || text == "\r" || text == "\n");
};
this.getLine = function(row) {
return this.$lines[row] || "";
};
this.getLines = function(firstRow, lastRow) {
return this.$lines.slice(firstRow, lastRow + 1);
};
this.getAllLines = function() {
return this.getLines(0, this.getLength());
};
this.getLength = function() {
return this.$lines.length;
};
this.getTextRange = function(range) {
return this.getLinesForRange(range).join(this.getNewLineCharacter());
};
this.getLinesForRange = function(range) {
var lines;
if (range.start.row === range.end.row) {
lines = [this.getLine(range.start.row).substring(range.start.column, range.end.column)];
} else {
lines = this.getLines(range.start.row, range.end.row);
lines[0] = (lines[0] || "").substring(range.start.column);
var l = lines.length - 1;
if (range.end.row - range.start.row == l)
lines[l] = lines[l].substring(0, range.end.column);
}
return lines;
};
this.insertLines = function(row, lines) {
console.warn("Use of document.insertLines is deprecated. Use the insertFullLines method instead.");
return this.insertFullLines(row, lines);
};
this.removeLines = function(firstRow, lastRow) {
console.warn("Use of document.removeLines is deprecated. Use the removeFullLines method instead.");
return this.removeFullLines(firstRow, lastRow);
};
this.insertNewLine = function(position) {
console.warn("Use of document.insertNewLine is deprecated. Use insertMergedLines(position, [\'\', \'\']) instead.");
return this.insertMergedLines(position, ["", ""]);
};
this.insert = function(position, text) {
if (this.getLength() <= 1)
this.$detectNewLine(text);
return this.insertMergedLines(position, this.$split(text));
};
this.insertInLine = function(position, text) {
var start = this.clippedPos(position.row, position.column);
var end = this.pos(position.row, position.column + text.length);
this.applyDelta({
start: start,
end: end,
action: "insert",
lines: [text]
}, true);
return this.clonePos(end);
};
this.clippedPos = function(row, column) {
var length = this.getLength();
if (row === undefined) {
row = length;
} else if (row < 0) {
row = 0;
} else if (row >= length) {
row = length - 1;
column = undefined;
}
var line = this.getLine(row);
if (column == undefined)
column = line.length;
column = Math.min(Math.max(column, 0), line.length);
return {row: row, column: column};
};
this.clonePos = function(pos) {
return {row: pos.row, column: pos.column};
};
this.pos = function(row, column) {
return {row: row, column: column};
};
this.$clipPosition = function(position) {
var length = this.getLength();
if (position.row >= length) {
position.row = Math.max(0, length - 1);
position.column = this.getLine(length - 1).length;
} else {
position.row = Math.max(0, position.row);
position.column = Math.min(Math.max(position.column, 0), this.getLine(position.row).length);
}
return position;
};
this.insertFullLines = function(row, lines) {
row = Math.min(Math.max(row, 0), this.getLength());
var column = 0;
if (row < this.getLength()) {
lines = lines.concat([""]);
column = 0;
} else {
lines = [""].concat(lines);
row--;
column = this.$lines[row].length;
}
this.insertMergedLines({row: row, column: column}, lines);
};
this.insertMergedLines = function(position, lines) {
var start = this.clippedPos(position.row, position.column);
var end = {
row: start.row + lines.length - 1,
column: (lines.length == 1 ? start.column : 0) + lines[lines.length - 1].length
};
this.applyDelta({
start: start,
end: end,
action: "insert",
lines: lines
});
return this.clonePos(end);
};
this.remove = function(range) {
var start = this.clippedPos(range.start.row, range.start.column);
var end = this.clippedPos(range.end.row, range.end.column);
this.applyDelta({
start: start,
end: end,
action: "remove",
lines: this.getLinesForRange({start: start, end: end})
});
return this.clonePos(start);
};
this.removeInLine = function(row, startColumn, endColumn) {
var start = this.clippedPos(row, startColumn);
var end = this.clippedPos(row, endColumn);
this.applyDelta({
start: start,
end: end,
action: "remove",
lines: this.getLinesForRange({start: start, end: end})
}, true);
return this.clonePos(start);
};
this.removeFullLines = function(firstRow, lastRow) {
firstRow = Math.min(Math.max(0, firstRow), this.getLength() - 1);
lastRow = Math.min(Math.max(0, lastRow ), this.getLength() - 1);
var deleteFirstNewLine = lastRow == this.getLength() - 1 && firstRow > 0;
var deleteLastNewLine = lastRow < this.getLength() - 1;
var startRow = ( deleteFirstNewLine ? firstRow - 1 : firstRow );
var startCol = ( deleteFirstNewLine ? this.getLine(startRow).length : 0 );
var endRow = ( deleteLastNewLine ? lastRow + 1 : lastRow );
var endCol = ( deleteLastNewLine ? 0 : this.getLine(endRow).length );
var range = new Range(startRow, startCol, endRow, endCol);
var deletedLines = this.$lines.slice(firstRow, lastRow + 1);
this.applyDelta({
start: range.start,
end: range.end,
action: "remove",
lines: this.getLinesForRange(range)
});
return deletedLines;
};
this.removeNewLine = function(row) {
if (row < this.getLength() - 1 && row >= 0) {
this.applyDelta({
start: this.pos(row, this.getLine(row).length),
end: this.pos(row + 1, 0),
action: "remove",
lines: ["", ""]
});
}
};
this.replace = function(range, text) {
if (!range instanceof Range)
range = Range.fromPoints(range.start, range.end);
if (text.length === 0 && range.isEmpty())
return range.start;
if (text == this.getTextRange(range))
return range.end;
this.remove(range);
var end;
if (text) {
end = this.insert(range.start, text);
}
else {
end = range.start;
}
return end;
};
this.applyDeltas = function(deltas) {
for (var i=0; i<deltas.length; i++) {
this.applyDelta(deltas[i]);
}
};
this.revertDeltas = function(deltas) {
for (var i=deltas.length-1; i>=0; i--) {
this.revertDelta(deltas[i]);
}
};
this.applyDelta = function(delta, doNotValidate) {
var isInsert = delta.action == "insert";
if (isInsert ? delta.lines.length <= 1 && !delta.lines[0]
: !Range.comparePoints(delta.start, delta.end)) {
return;
}
if (isInsert && delta.lines.length > 20000)
this.$splitAndapplyLargeDelta(delta, 20000);
applyDelta(this.$lines, delta, doNotValidate);
this._signal("change", delta);
};
this.$splitAndapplyLargeDelta = function(delta, MAX) {
var lines = delta.lines;
var l = lines.length;
var row = delta.start.row;
var column = delta.start.column;
var from = 0, to = 0;
do {
from = to;
to += MAX - 1;
var chunk = lines.slice(from, to);
if (to > l) {
delta.lines = chunk;
delta.start.row = row + from;
delta.start.column = column;
break;
}
chunk.push("");
this.applyDelta({
start: this.pos(row + from, column),
end: this.pos(row + to, column = 0),
action: delta.action,
lines: chunk
}, true);
} while(true);
};
this.revertDelta = function(delta) {
this.applyDelta({
start: this.clonePos(delta.start),
end: this.clonePos(delta.end),
action: (delta.action == "insert" ? "remove" : "insert"),
lines: delta.lines.slice()
});
};
this.indexToPosition = function(index, startRow) {
var lines = this.$lines || this.getAllLines();
var newlineLength = this.getNewLineCharacter().length;
for (var i = startRow || 0, l = lines.length; i < l; i++) {
index -= lines[i].length + newlineLength;
if (index < 0)
return {row: i, column: index + lines[i].length + newlineLength};
}
return {row: l-1, column: lines[l-1].length};
};
this.positionToIndex = function(pos, startRow) {
var lines = this.$lines || this.getAllLines();
var newlineLength = this.getNewLineCharacter().length;
var index = 0;
var row = Math.min(pos.row, lines.length);
for (var i = startRow || 0; i < row; ++i)
index += lines[i].length + newlineLength;
return index + pos.column;
};
}).call(Document.prototype);
exports.Document = Document;
});
define("ace/worker/mirror",["require","exports","module","ace/range","ace/document","ace/lib/lang"], function(require, exports, module) {
"use strict";
var Range = require("../range").Range;
var Document = require("../document").Document;
var lang = require("../lib/lang");
var Mirror = exports.Mirror = function(sender) {
this.sender = sender;
var doc = this.doc = new Document("");
var deferredUpdate = this.deferredUpdate = lang.delayedCall(this.onUpdate.bind(this));
var _self = this;
sender.on("change", function(e) {
var data = e.data;
if (data[0].start) {
doc.applyDeltas(data);
} else {
for (var i = 0; i < data.length; i += 2) {
if (Array.isArray(data[i+1])) {
var d = {action: "insert", start: data[i], lines: data[i+1]};
} else {
var d = {action: "remove", start: data[i], end: data[i+1]};
}
doc.applyDelta(d, true);
}
}
if (_self.$timeout)
return deferredUpdate.schedule(_self.$timeout);
_self.onUpdate();
});
};
(function() {
this.$timeout = 500;
this.setTimeout = function(timeout) {
this.$timeout = timeout;
};
this.setValue = function(value) {
this.doc.setValue(value);
this.deferredUpdate.schedule(this.$timeout);
};
this.getValue = function(callbackId) {
this.sender.callback(this.doc.getValue(), callbackId);
};
this.onUpdate = function() {
};
this.isPending = function() {
return this.deferredUpdate.isPending();
};
}).call(Mirror.prototype);
});
define("ace/mode/html/saxparser",["require","exports","module"], function(require, exports, module) {
module.exports = (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({
1:[function(_dereq_,module,exports){
function isScopeMarker(node) {
if (node.namespaceURI === "http://www.w3.org/1999/xhtml") {
return node.localName === "applet"
|| node.localName === "caption"
|| node.localName === "marquee"
|| node.localName === "object"
|| node.localName === "table"
|| node.localName === "td"
|| node.localName === "th";
}
if (node.namespaceURI === "http://www.w3.org/1998/Math/MathML") {
return node.localName === "mi"
|| node.localName === "mo"
|| node.localName === "mn"
|| node.localName === "ms"
|| node.localName === "mtext"
|| node.localName === "annotation-xml";
}
if (node.namespaceURI === "http://www.w3.org/2000/svg") {
return node.localName === "foreignObject"
|| node.localName === "desc"
|| node.localName === "title";
}
}
function isListItemScopeMarker(node) {
return isScopeMarker(node)
|| (node.namespaceURI === "http://www.w3.org/1999/xhtml" && node.localName === 'ol')
|| (node.namespaceURI === "http://www.w3.org/1999/xhtml" && node.localName === 'ul');
}
function isTableScopeMarker(node) {
return (node.namespaceURI === "http://www.w3.org/1999/xhtml" && node.localName === 'table')
|| (node.namespaceURI === "http://www.w3.org/1999/xhtml" && node.localName === 'html');
}
function isTableBodyScopeMarker(node) {
return (node.namespaceURI === "http://www.w3.org/1999/xhtml" && node.localName === 'tbody')
|| (node.namespaceURI === "http://www.w3.org/1999/xhtml" && node.localName === 'tfoot')
|| (node.namespaceURI === "http://www.w3.org/1999/xhtml" && node.localName === 'thead')
|| (node.namespaceURI === "http://www.w3.org/1999/xhtml" && node.localName === 'html');
}
function isTableRowScopeMarker(node) {
return (node.namespaceURI === "http://www.w3.org/1999/xhtml" && node.localName === 'tr')
|| (node.namespaceURI === "http://www.w3.org/1999/xhtml" && node.localName === 'html');
}
function isButtonScopeMarker(node) {
return isScopeMarker(node)
|| (node.namespaceURI === "http://www.w3.org/1999/xhtml" && node.localName === 'button');
}
function isSelectScopeMarker(node) {
return !(node.namespaceURI === "http://www.w3.org/1999/xhtml" && node.localName === 'optgroup')
&& !(node.namespaceURI === "http://www.w3.org/1999/xhtml" && node.localName === 'option');
}
function ElementStack() {
this.elements = [];
this.rootNode = null;
this.headElement = null;
this.bodyElement = null;
}
ElementStack.prototype._inScope = function(localName, isMarker) {
for (var i = this.elements.length - 1; i >= 0; i--) {
var node = this.elements[i];
if (node.localName === localName)
return true;
if (isMarker(node))
return false;
}
};
ElementStack.prototype.push = function(item) {
this.elements.push(item);
};
ElementStack.prototype.pushHtmlElement = function(item) {
this.rootNode = item.node;
this.push(item);
};
ElementStack.prototype.pushHeadElement = function(item) {
this.headElement = item.node;
this.push(item);
};
ElementStack.prototype.pushBodyElement = function(item) {
this.bodyElement = item.node;
this.push(item);
};
ElementStack.prototype.pop = function() {
return this.elements.pop();
};
ElementStack.prototype.remove = function(item) {
this.elements.splice(this.elements.indexOf(item), 1);
};
ElementStack.prototype.popUntilPopped = function(localName) {
var element;
do {
element = this.pop();
} while (element.localName != localName);
};
ElementStack.prototype.popUntilTableScopeMarker = function() {
while (!isTableScopeMarker(this.top))
this.pop();
};
ElementStack.prototype.popUntilTableBodyScopeMarker = function() {
while (!isTableBodyScopeMarker(this.top))
this.pop();
};
ElementStack.prototype.popUntilTableRowScopeMarker = function() {
while (!isTableRowScopeMarker(this.top))
this.pop();
};
ElementStack.prototype.item = function(index) {
return this.elements[index];
};
ElementStack.prototype.contains = function(element) {
return this.elements.indexOf(element) !== -1;
};
ElementStack.prototype.inScope = function(localName) {
return this._inScope(localName, isScopeMarker);
};
ElementStack.prototype.inListItemScope = function(localName) {
return this._inScope(localName, isListItemScopeMarker);
};
ElementStack.prototype.inTableScope = function(localName) {
return this._inScope(localName, isTableScopeMarker);
};
ElementStack.prototype.inButtonScope = function(localName) {
return this._inScope(localName, isButtonScopeMarker);
};
ElementStack.prototype.inSelectScope = function(localName) {
return this._inScope(localName, isSelectScopeMarker);
};
ElementStack.prototype.hasNumberedHeaderElementInScope = function() {
for (var i = this.elements.length - 1; i >= 0; i--) {
var node = this.elements[i];
if (node.isNumberedHeader())
return true;
if (isScopeMarker(node))
return false;
}
};
ElementStack.prototype.furthestBlockForFormattingElement = function(element) {
var furthestBlock = null;
for (var i = this.elements.length - 1; i >= 0; i--) {
var node = this.elements[i];
if (node.node === element)
break;
if (node.isSpecial())
furthestBlock = node;
}
return furthestBlock;
};
ElementStack.prototype.findIndex = function(localName) {
for (var i = this.elements.length - 1; i >= 0; i--) {
if (this.elements[i].localName == localName)
return i;
}
return -1;
};
ElementStack.prototype.remove_openElements_until = function(callback) {
var finished = false;
var element;
while (!finished) {
element = this.elements.pop();
finished = callback(element);
}
return element;
};
Object.defineProperty(ElementStack.prototype, 'top', {
get: function() {
return this.elements[this.elements.length - 1];
}
});
Object.defineProperty(ElementStack.prototype, 'length', {
get: function() {
return this.elements.length;
}
});
exports.ElementStack = ElementStack;
},
{}],
2:[function(_dereq_,module,exports){
var entities = _dereq_('html5-entities');
var InputStream = _dereq_('./InputStream').InputStream;
var namedEntityPrefixes = {};
Object.keys(entities).forEach(function (entityKey) {
for (var i = 0; i < entityKey.length; i++) {
namedEntityPrefixes[entityKey.substring(0, i + 1)] = true;
}
});
function isAlphaNumeric(c) {
return (c >= '0' && c <= '9') || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');
}
function isHexDigit(c) {
return (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F');
}
function isDecimalDigit(c) {
return (c >= '0' && c <= '9');
}
var EntityParser = {};
EntityParser.consumeEntity = function(buffer, tokenizer, additionalAllowedCharacter) {
var decodedCharacter = '';
var consumedCharacters = '';
var ch = buffer.char();
if (ch === InputStream.EOF)
return false;
consumedCharacters += ch;
if (ch == '\t' || ch == '\n' || ch == '\v' || ch == ' ' || ch == '<' || ch == '&') {
buffer.unget(consumedCharacters);
return false;
}
if (additionalAllowedCharacter === ch) {
buffer.unget(consumedCharacters);
return false;
}
if (ch == '#') {
ch = buffer.shift(1);
if (ch === InputStream.EOF) {
tokenizer._parseError("expected-numeric-entity-but-got-eof");
buffer.unget(consumedCharacters);
return false;
}
consumedCharacters += ch;
var radix = 10;
var isDigit = isDecimalDigit;
if (ch == 'x' || ch == 'X') {
radix = 16;
isDigit = isHexDigit;
ch = buffer.shift(1);
if (ch === InputStream.EOF) {
tokenizer._parseError("expected-numeric-entity-but-got-eof");
buffer.unget(consumedCharacters);
return false;
}
consumedCharacters += ch;
}
if (isDigit(ch)) {
var code = '';
while (ch !== InputStream.EOF && isDigit(ch)) {
code += ch;
ch = buffer.char();
}
code = parseInt(code, radix);
var replacement = this.replaceEntityNumbers(code);
if (replacement) {
tokenizer._parseError("invalid-numeric-entity-replaced");
code = replacement;
}
if (code > 0xFFFF && code <= 0x10FFFF) {
code -= 0x10000;
var first = ((0xffc00 & code) >> 10) + 0xD800;
var second = (0x3ff & code) + 0xDC00;
decodedCharacter = String.fromCharCode(first, second);
} else
decodedCharacter = String.fromCharCode(code);
if (ch !== ';') {
tokenizer._parseError("numeric-entity-without-semicolon");
buffer.unget(ch);
}
return decodedCharacter;
}
buffer.unget(consumedCharacters);
tokenizer._parseError("expected-numeric-entity");
return false;
}
if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')) {
var mostRecentMatch = '';
while (namedEntityPrefixes[consumedCharacters]) {
if (entities[consumedCharacters]) {
mostRecentMatch = consumedCharacters;
}
if (ch == ';')
break;
ch = buffer.char();
if (ch === InputStream.EOF)
break;
consumedCharacters += ch;
}
if (!mostRecentMatch) {
tokenizer._parseError("expected-named-entity");
buffer.unget(consumedCharacters);
return false;
}
decodedCharacter = entities[mostRecentMatch];
if (ch === ';' || !additionalAllowedCharacter || !(isAlphaNumeric(ch) || ch === '=')) {
if (consumedCharacters.length > mostRecentMatch.length) {
buffer.unget(consumedCharacters.substring(mostRecentMatch.length));
}
if (ch !== ';') {
tokenizer._parseError("named-entity-without-semicolon");
}
return decodedCharacter;
}
buffer.unget(consumedCharacters);
return false;
}
};
EntityParser.replaceEntityNumbers = function(c) {
switch(c) {
case 0x00: return 0xFFFD; // REPLACEMENT CHARACTER
case 0x13: return 0x0010; // Carriage return
case 0x80: return 0x20AC; // EURO SIGN
case 0x81: return 0x0081; // <control>
case 0x82: return 0x201A; // SINGLE LOW-9 QUOTATION MARK
case 0x83: return 0x0192; // LATIN SMALL LETTER F WITH HOOK
case 0x84: return 0x201E; // DOUBLE LOW-9 QUOTATION MARK
case 0x85: return 0x2026; // HORIZONTAL ELLIPSIS
case 0x86: return 0x2020; // DAGGER
case 0x87: return 0x2021; // DOUBLE DAGGER
case 0x88: return 0x02C6; // MODIFIER LETTER CIRCUMFLEX ACCENT
case 0x89: return 0x2030; // PER MILLE SIGN
case 0x8A: return 0x0160; // LATIN CAPITAL LETTER S WITH CARON
case 0x8B: return 0x2039; // SINGLE LEFT-POINTING ANGLE QUOTATION MARK
case 0x8C: return 0x0152; // LATIN CAPITAL LIGATURE OE
case 0x8D: return 0x008D; // <control>
case 0x8E: return 0x017D; // LATIN CAPITAL LETTER Z WITH CARON
case 0x8F: return 0x008F; // <control>
case 0x90: return 0x0090; // <control>
case 0x91: return 0x2018; // LEFT SINGLE QUOTATION MARK
case 0x92: return 0x2019; // RIGHT SINGLE QUOTATION MARK
case 0x93: return 0x201C; // LEFT DOUBLE QUOTATION MARK
case 0x94: return 0x201D; // RIGHT DOUBLE QUOTATION MARK
case 0x95: return 0x2022; // BULLET
case 0x96: return 0x2013; // EN DASH
case 0x97: return 0x2014; // EM DASH
case 0x98: return 0x02DC; // SMALL TILDE
case 0x99: return 0x2122; // TRADE MARK SIGN
case 0x9A: return 0x0161; // LATIN SMALL LETTER S WITH CARON
case 0x9B: return 0x203A; // SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
case 0x9C: return 0x0153; // LATIN SMALL LIGATURE OE
case 0x9D: return 0x009D; // <control>
case 0x9E: return 0x017E; // LATIN SMALL LETTER Z WITH CARON
case 0x9F: return 0x0178; // LATIN CAPITAL LETTER Y WITH DIAERESIS
default:
if ((c >= 0xD800 && c <= 0xDFFF) || c > 0x10FFFF) {
return 0xFFFD;
} else if ((c >= 0x0001 && c <= 0x0008) || (c >= 0x000E && c <= 0x001F) ||
(c >= 0x007F && c <= 0x009F) || (c >= 0xFDD0 && c <= 0xFDEF) ||
c == 0x000B || c == 0xFFFE || c == 0x1FFFE || c == 0x2FFFFE ||
c == 0x2FFFF || c == 0x3FFFE || c == 0x3FFFF || c == 0x4FFFE ||
c == 0x4FFFF || c == 0x5FFFE || c == 0x5FFFF || c == 0x6FFFE ||
c == 0x6FFFF || c == 0x7FFFE || c == 0x7FFFF || c == 0x8FFFE ||
c == 0x8FFFF || c == 0x9FFFE || c == 0x9FFFF || c == 0xAFFFE ||
c == 0xAFFFF || c == 0xBFFFE || c == 0xBFFFF || c == 0xCFFFE ||
c == 0xCFFFF || c == 0xDFFFE || c == 0xDFFFF || c == 0xEFFFE ||
c == 0xEFFFF || c == 0xFFFFE || c == 0xFFFFF || c == 0x10FFFE ||
c == 0x10FFFF) {
return c;
}
}
};
exports.EntityParser = EntityParser;
},
{"./InputStream":3,"html5-entities":12}],
3:[function(_dereq_,module,exports){
function InputStream() {
this.data = '';
this.start = 0;
this.committed = 0;
this.eof = false;
this.lastLocation = {line: 0, column: 0};
}
InputStream.EOF = -1;
InputStream.DRAIN = -2;
InputStream.prototype = {
slice: function() {
if(this.start >= this.data.length) {
if(!this.eof) throw InputStream.DRAIN;
return InputStream.EOF;
}
return this.data.slice(this.start, this.data.length);
},
char: function() {
if(!this.eof && this.start >= this.data.length - 1) throw InputStream.DRAIN;
if(this.start >= this.data.length) {
return InputStream.EOF;
}
var ch = this.data[this.start++];
if (ch === '\r')
ch = '\n';
return ch;
},
advance: function(amount) {
this.start += amount;
if(this.start >= this.data.length) {
if(!this.eof) throw InputStream.DRAIN;
return InputStream.EOF;
} else {
if(this.committed > this.data.length / 2) {
this.lastLocation = this.location();
this.data = this.data.slice(this.committed);
this.start = this.start - this.committed;
this.committed = 0;
}
}
},
matchWhile: function(re) {
if(this.eof && this.start >= this.data.length ) return '';
var r = new RegExp("^"+re+"+");
var m = r.exec(this.slice());
if(m) {
if(!this.eof && m[0].length == this.data.length - this.start) throw InputStream.DRAIN;
this.advance(m[0].length);
return m[0];
} else {
return '';
}
},
matchUntil: function(re) {
var m, s;
s = this.slice();
if(s === InputStream.EOF) {
return '';
} else if(m = new RegExp(re + (this.eof ? "|$" : "")).exec(s)) {
var t = this.data.slice(this.start, this.start + m.index);
this.advance(m.index);
return t.replace(/\r/g, '\n').replace(/\n{2,}/g, '\n');
} else {
throw InputStream.DRAIN;
}
},
append: function(data) {
this.data += data;
},
shift: function(n) {
if(!this.eof && this.start + n >= this.data.length) throw InputStream.DRAIN;
if(this.eof && this.start >= this.data.length) return InputStream.EOF;
var d = this.data.slice(this.start, this.start + n).toString();
this.advance(Math.min(n, this.data.length - this.start));
return d;
},
peek: function(n) {
if(!this.eof && this.start + n >= this.data.length) throw InputStream.DRAIN;
if(this.eof && this.start >= this.data.length) return InputStream.EOF;
return this.data.slice(this.start, Math.min(this.start + n, this.data.length)).toString();
},
length: function() {
return this.data.length - this.start - 1;
},
unget: function(d) {
if(d === InputStream.EOF) return;
this.start -= (d.length);
},
undo: function() {
this.start = this.committed;
},
commit: function() {
this.committed = this.start;
},
location: function() {
var lastLine = this.lastLocation.line;
var lastColumn = this.lastLocation.column;
var read = this.data.slice(0, this.committed);
var newlines = read.match(/\n/g);
var line = newlines ? lastLine + newlines.length : lastLine;
var column = newlines ? read.length - read.lastIndexOf('\n') - 1 : lastColumn + read.length;
return {line: line, column: column};
}
};
exports.InputStream = InputStream;
},
{}],
4:[function(_dereq_,module,exports){
var SpecialElements = {
"http://www.w3.org/1999/xhtml": [
'address',
'applet',
'area',
'article',
'aside',
'base',
'basefont',
'bgsound',
'blockquote',
'body',
'br',
'button',
'caption',
'center',
'col',
'colgroup',
'dd',
'details',
'dir',
'div',
'dl',
'dt',
'embed',
'fieldset',
'figcaption',
'figure',
'footer',
'form',
'frame',
'frameset',
'h1',
'h2',
'h3',
'h4',
'h5',
'h6',
'head',
'header',
'hgroup',
'hr',
'html',
'iframe',
'img',
'input',
'isindex',
'li',
'link',
'listing',
'main',
'marquee',
'menu',
'menuitem',
'meta',
'nav',
'noembed',
'noframes',
'noscript',
'object',
'ol',
'p',
'param',
'plaintext',
'pre',
'script',
'section',
'select',
'source',
'style',
'summary',
'table',
'tbody',
'td',
'textarea',
'tfoot',
'th',
'thead',
'title',
'tr',
'track',
'ul',
'wbr',
'xmp'
],
"http://www.w3.org/1998/Math/MathML": [
'mi',
'mo',
'mn',
'ms',
'mtext',
'annotation-xml'
],
"http://www.w3.org/2000/svg": [
'foreignObject',
'desc',
'title'
]
};
function StackItem(namespaceURI, localName, attributes, node) {
this.localName = localName;
this.namespaceURI = namespaceURI;
this.attributes = attributes;
this.node = node;
}
StackItem.prototype.isSpecial = function() {
return this.namespaceURI in SpecialElements &&
SpecialElements[this.namespaceURI].indexOf(this.localName) > -1;
};
StackItem.prototype.isFosterParenting = function() {
if (this.namespaceURI === "http://www.w3.org/1999/xhtml") {
return this.localName === 'table' ||
this.localName === 'tbody' ||
this.localName === 'tfoot' ||
this.localName === 'thead' ||
this.localName === 'tr';
}
return false;
};
StackItem.prototype.isNumberedHeader = function() {
if (this.namespaceURI === "http://www.w3.org/1999/xhtml") {
return this.localName === 'h1' ||
this.localName === 'h2' ||
this.localName === 'h3' ||
this.localName === 'h4' ||
this.localName === 'h5' ||
this.localName === 'h6';
}
return false;
};
StackItem.prototype.isForeign = function() {
return this.namespaceURI != "http://www.w3.org/1999/xhtml";
};
function getAttribute(item, name) {
for (var i = 0; i < item.attributes.length; i++) {
if (item.attributes[i].nodeName == name)
return item.attributes[i].nodeValue;
}
return null;
}
StackItem.prototype.isHtmlIntegrationPoint = function() {
if (this.namespaceURI === "http://www.w3.org/1998/Math/MathML") {
if (this.localName !== "annotation-xml")
return false;
var encoding = getAttribute(this, 'encoding');
if (!encoding)
return false;
encoding = encoding.toLowerCase();
return encoding === "text/html" || encoding === "application/xhtml+xml";
}
if (this.namespaceURI === "http://www.w3.org/2000/svg") {
return this.localName === "foreignObject"
|| this.localName === "desc"
|| this.localName === "title";
}
return false;
};
StackItem.prototype.isMathMLTextIntegrationPoint = function() {
if (this.namespaceURI === "http://www.w3.org/1998/Math/MathML") {
return this.localName === "mi"
|| this.localName === "mo"
|| this.localName === "mn"
|| this.localName === "ms"
|| this.localName === "mtext";
}
return false;
};
exports.StackItem = StackItem;
},
{}],
5:[function(_dereq_,module,exports){
var InputStream = _dereq_('./InputStream').InputStream;
var EntityParser = _dereq_('./EntityParser').EntityParser;
function isWhitespace(c){
return c === " " || c === "\n" || c === "\t" || c === "\r" || c === "\f";
}
function isAlpha(c) {
return (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z');
}
function Tokenizer(tokenHandler) {
this._tokenHandler = tokenHandler;
this._state = Tokenizer.DATA;
this._inputStream = new InputStream();
this._currentToken = null;
this._temporaryBuffer = '';
this._additionalAllowedCharacter = '';
}
Tokenizer.prototype._parseError = function(code, args) {
this._tokenHandler.parseError(code, args);
};
Tokenizer.prototype._emitToken = function(token) {
if (token.type === 'StartTag') {
for (var i = 1; i < token.data.length; i++) {
if (!token.data[i].nodeName)
token.data.splice(i--, 1);
}
} else if (token.type === 'EndTag') {
if (token.selfClosing) {
this._parseError('self-closing-flag-on-end-tag');
}
if (token.data.length !== 0) {
this._parseError('attributes-in-end-tag');
}
}
this._tokenHandler.processToken(token);
if (token.type === 'StartTag' && token.selfClosing && !this._tokenHandler.isSelfClosingFlagAcknowledged()) {
this._parseError('non-void-element-with-trailing-solidus', {name: token.name});
}
};
Tokenizer.prototype._emitCurrentToken = function() {
this._state = Tokenizer.DATA;
this._emitToken(this._currentToken);
};
Tokenizer.prototype._currentAttribute = function() {
return this._currentToken.data[this._currentToken.data.length - 1];
};
Tokenizer.prototype.setState = function(state) {
this._state = state;
};
Tokenizer.prototype.tokenize = function(source) {
Tokenizer.DATA = data_state;
Tokenizer.RCDATA = rcdata_state;
Tokenizer.RAWTEXT = rawtext_state;
Tokenizer.SCRIPT_DATA = script_data_state;
Tokenizer.PLAINTEXT = plaintext_state;
this._state = Tokenizer.DATA;
this._inputStream.append(source);
this._tokenHandler.startTokenization(this);
this._inputStream.eof = true;
var tokenizer = this;
while (this._state.call(this, this._inputStream));
function data_state(buffer) {
var data = buffer.char();
if (data === InputStream.EOF) {
tokenizer._emitToken({type: 'EOF', data: null});
return false;
} else if (data === '&') {
tokenizer.setState(character_reference_in_data_state);
} else if (data === '<') {
tokenizer.setState(tag_open_state);
} else if (data === '\u0000') {
tokenizer._emitToken({type: 'Characters', data: data});
buffer.commit();
} else {
var chars = buffer.matchUntil("&|<|\u0000");
tokenizer._emitToken({type: 'Characters', data: data + chars});
buffer.commit();
}
return true;
}
function character_reference_in_data_state(buffer) {
var character = EntityParser.consumeEntity(buffer, tokenizer);
tokenizer.setState(data_state);
tokenizer._emitToken({type: 'Characters', data: character || '&'});
return true;
}
function rcdata_state(buffer) {
var data = buffer.char();
if (data === InputStream.EOF) {
tokenizer._emitToken({type: 'EOF', data: null});
return false;
} else if (data === '&') {
tokenizer.setState(character_reference_in_rcdata_state);
} else if (data === '<') {
tokenizer.setState(rcdata_less_than_sign_state);
} else if (data === "\u0000") {
tokenizer._parseError("invalid-codepoint");
tokenizer._emitToken({type: 'Characters', data: '\uFFFD'});
buffer.commit();
} else {
var chars = buffer.matchUntil("&|<|\u0000");
tokenizer._emitToken({type: 'Characters', data: data + chars});
buffer.commit();
}
return true;
}
function character_reference_in_rcdata_state(buffer) {
var character = EntityParser.consumeEntity(buffer, tokenizer);
tokenizer.setState(rcdata_state);
tokenizer._emitToken({type: 'Characters', data: character || '&'});
return true;
}
function rawtext_state(buffer) {
var data = buffer.char();
if (data === InputStream.EOF) {
tokenizer._emitToken({type: 'EOF', data: null});
return false;
} else if (data === '<') {
tokenizer.setState(rawtext_less_than_sign_state);
} else if (data === "\u0000") {
tokenizer._parseError("invalid-codepoint");
tokenizer._emitToken({type: 'Characters', data: '\uFFFD'});
buffer.commit();
} else {
var chars = buffer.matchUntil("<|\u0000");
tokenizer._emitToken({type: 'Characters', data: data + chars});
}
return true;
}
function plaintext_state(buffer) {
var data = buffer.char();
if (data === InputStream.EOF) {
tokenizer._emitToken({type: 'EOF', data: null});
return false;
} else if (data === "\u0000") {
tokenizer._parseError("invalid-codepoint");
tokenizer._emitToken({type: 'Characters', data: '\uFFFD'});
buffer.commit();
} else {
var chars = buffer.matchUntil("\u0000");
tokenizer._emitToken({type: 'Characters', data: data + chars});
}
return true;
}
function script_data_state(buffer) {
var data = buffer.char();
if (data === InputStream.EOF) {
tokenizer._emitToken({type: 'EOF', data: null});
return false;
} else if (data === '<') {
tokenizer.setState(script_data_less_than_sign_state);
} else if (data === '\u0000') {
tokenizer._parseError("invalid-codepoint");
tokenizer._emitToken({type: 'Characters', data: '\uFFFD'});
buffer.commit();
} else {
var chars = buffer.matchUntil("<|\u0000");
tokenizer._emitToken({type: 'Characters', data: data + chars});
}
return true;
}
function rcdata_less_than_sign_state(buffer) {
var data = buffer.char();
if (data === "/") {
this._temporaryBuffer = '';
tokenizer.setState(rcdata_end_tag_open_state);
} else {
tokenizer._emitToken({type: 'Characters', data: '<'});
buffer.unget(data);
tokenizer.setState(rcdata_state);
}
return true;
}
function rcdata_end_tag_open_state(buffer) {
var data = buffer.char();
if (isAlpha(data)) {
this._temporaryBuffer += data;
tokenizer.setState(rcdata_end_tag_name_state);
} else {
tokenizer._emitToken({type: 'Characters', data: '</'});
buffer.unget(data);
tokenizer.setState(rcdata_state);
}
return true;
}
function rcdata_end_tag_name_state(buffer) {
var appropriate = tokenizer._currentToken && (tokenizer._currentToken.name === this._temporaryBuffer.toLowerCase());
var data = buffer.char();
if (isWhitespace(data) && appropriate) {
tokenizer._currentToken = {type: 'EndTag', name: this._temporaryBuffer, data: [], selfClosing: false};
tokenizer.setState(before_attribute_name_state);
} else if (data === '/' && appropriate) {
tokenizer._currentToken = {type: 'EndTag', name: this._temporaryBuffer, data: [], selfClosing: false};
tokenizer.setState(self_closing_tag_state);
} else if (data === '>' && appropriate) {
tokenizer._currentToken = {type: 'EndTag', name: this._temporaryBuffer, data: [], selfClosing: false};
tokenizer._emitCurrentToken();
tokenizer.setState(data_state);
} else if (isAlpha(data)) {
this._temporaryBuffer += data;
buffer.commit();
} else {
tokenizer._emitToken({type: 'Characters', data: '</' + this._temporaryBuffer});
buffer.unget(data);
tokenizer.setState(rcdata_state);
}
return true;
}
function rawtext_less_than_sign_state(buffer) {
var data = buffer.char();
if (data === "/") {
this._temporaryBuffer = '';
tokenizer.setState(rawtext_end_tag_open_state);
} else {
tokenizer._emitToken({type: 'Characters', data: '<'});
buffer.unget(data);
tokenizer.setState(rawtext_state);
}
return true;
}
function rawtext_end_tag_open_state(buffer) {
var data = buffer.char();
if (isAlpha(data)) {
this._temporaryBuffer += data;
tokenizer.setState(rawtext_end_tag_name_state);
} else {
tokenizer._emitToken({type: 'Characters', data: '</'});
buffer.unget(data);
tokenizer.setState(rawtext_state);
}
return true;
}
function rawtext_end_tag_name_state(buffer) {
var appropriate = tokenizer._currentToken && (tokenizer._currentToken.name === this._temporaryBuffer.toLowerCase());
var data = buffer.char();
if (isWhitespace(data) && appropriate) {
tokenizer._currentToken = {type: 'EndTag', name: this._temporaryBuffer, data: [], selfClosing: false};
tokenizer.setState(before_attribute_name_state);
} else if (data === '/' && appropriate) {
tokenizer._currentToken = {type: 'EndTag', name: this._temporaryBuffer, data: [], selfClosing: false};
tokenizer.setState(self_closing_tag_state);
} else if (data === '>' && appropriate) {
tokenizer._currentToken = {type: 'EndTag', name: this._temporaryBuffer, data: [], selfClosing: false};
tokenizer._emitCurrentToken();
tokenizer.setState(data_state);
} else if (isAlpha(data)) {
this._temporaryBuffer += data;
buffer.commit();
} else {
tokenizer._emitToken({type: 'Characters', data: '</' + this._temporaryBuffer});
buffer.unget(data);
tokenizer.setState(rawtext_state);
}
return true;
}
function script_data_less_than_sign_state(buffer) {
var data = buffer.char();
if (data === "/") {
this._temporaryBuffer = '';
tokenizer.setState(script_data_end_tag_open_state);
} else if (data === '!') {
tokenizer._emitToken({type: 'Characters', data: '<!'});
tokenizer.setState(script_data_escape_start_state);
} else {
tokenizer._emitToken({type: 'Characters', data: '<'});
buffer.unget(data);
tokenizer.setState(script_data_state);
}
return true;
}
function script_data_end_tag_open_state(buffer) {
var data = buffer.char();
if (isAlpha(data)) {
this._temporaryBuffer += data;
tokenizer.setState(script_data_end_tag_name_state);
} else {
tokenizer._emitToken({type: 'Characters', data: '</'});
buffer.unget(data);
tokenizer.setState(script_data_state);
}
return true;
}
function script_data_end_tag_name_state(buffer) {
var appropriate = tokenizer._currentToken && (tokenizer._currentToken.name === this._temporaryBuffer.toLowerCase());
var data = buffer.char();
if (isWhitespace(data) && appropriate) {
tokenizer._currentToken = {type: 'EndTag', name: 'script', data: [], selfClosing: false};
tokenizer.setState(before_attribute_name_state);
} else if (data === '/' && appropriate) {
tokenizer._currentToken = {type: 'EndTag', name: 'script', data: [], selfClosing: false};
tokenizer.setState(self_closing_tag_state);
} else if (data === '>' && appropriate) {
tokenizer._currentToken = {type: 'EndTag', name: 'script', data: [], selfClosing: false};
tokenizer._emitCurrentToken();
} else if (isAlpha(data)) {
this._temporaryBuffer += data;
buffer.commit();
} else {
tokenizer._emitToken({type: 'Characters', data: '</' + this._temporaryBuffer});
buffer.unget(data);
tokenizer.setState(script_data_state);
}
return true;
}
function script_data_escape_start_state(buffer) {
var data = buffer.char();
if (data === '-') {
tokenizer._emitToken({type: 'Characters', data: '-'});
tokenizer.setState(script_data_escape_start_dash_state);
} else {
buffer.unget(data);
tokenizer.setState(script_data_state);
}
return true;
}
function script_data_escape_start_dash_state(buffer) {
var data = buffer.char();
if (data === '-') {
tokenizer._emitToken({type: 'Characters', data: '-'});
tokenizer.setState(script_data_escaped_dash_dash_state);
} else {
buffer.unget(data);
tokenizer.setState(script_data_state);
}
return true;
}
function script_data_escaped_state(buffer) {
var data = buffer.char();
if (data === InputStream.EOF) {
buffer.unget(data);
tokenizer.setState(data_state);
} else if (data === '-') {
tokenizer._emitToken({type: 'Characters', data: '-'});
tokenizer.setState(script_data_escaped_dash_state);
} else if (data === '<') {
tokenizer.setState(script_data_escaped_less_then_sign_state);
} else if (data === '\u0000') {
tokenizer._parseError("invalid-codepoint");
tokenizer._emitToken({type: 'Characters', data: '\uFFFD'});
buffer.commit();
} else {
var chars = buffer.matchUntil('<|-|\u0000');
tokenizer._emitToken({type: 'Characters', data: data + chars});
}
return true;
}
function script_data_escaped_dash_state(buffer) {
var data = buffer.char();
if (data === InputStream.EOF) {
buffer.unget(data);
tokenizer.setState(data_state);
} else if (data === '-') {
tokenizer._emitToken({type: 'Characters', data: '-'});
tokenizer.setState(script_data_escaped_dash_dash_state);
} else if (data === '<') {
tokenizer.setState(script_data_escaped_less_then_sign_state);
} else if (data === '\u0000') {
tokenizer._parseError("invalid-codepoint");
tokenizer._emitToken({type: 'Characters', data: '\uFFFD'});
tokenizer.setState(script_data_escaped_state);
} else {
tokenizer._emitToken({type: 'Characters', data: data});
tokenizer.setState(script_data_escaped_state);
}
return true;
}
function script_data_escaped_dash_dash_state(buffer) {
var data = buffer.char();
if (data === InputStream.EOF) {
tokenizer._parseError('eof-in-script');
buffer.unget(data);
tokenizer.setState(data_state);
} else if (data === '<') {
tokenizer.setState(script_data_escaped_less_then_sign_state);
} else if (data === '>') {
tokenizer._emitToken({type: 'Characters', data: '>'});
tokenizer.setState(script_data_state);
} else if (data === '\u0000') {
tokenizer._parseError("invalid-codepoint");
tokenizer._emitToken({type: 'Characters', data: '\uFFFD'});
tokenizer.setState(script_data_escaped_state);
} else {
tokenizer._emitToken({type: 'Characters', data: data});
tokenizer.setState(script_data_escaped_state);
}
return true;
}
function script_data_escaped_less_then_sign_state(buffer) {
var data = buffer.char();
if (data === '/') {
this._temporaryBuffer = '';
tokenizer.setState(script_data_escaped_end_tag_open_state);
} else if (isAlpha(data)) {
tokenizer._emitToken({type: 'Characters', data: '<' + data});
this._temporaryBuffer = data;
tokenizer.setState(script_data_double_escape_start_state);
} else {
tokenizer._emitToken({type: 'Characters', data: '<'});
buffer.unget(data);
tokenizer.setState(script_data_escaped_state);
}
return true;
}
function script_data_escaped_end_tag_open_state(buffer) {
var data = buffer.char();
if (isAlpha(data)) {
this._temporaryBuffer = data;
tokenizer.setState(script_data_escaped_end_tag_name_state);
} else {
tokenizer._emitToken({type: 'Characters', data: '</'});
buffer.unget(data);
tokenizer.setState(script_data_escaped_state);
}
return true;
}
function script_data_escaped_end_tag_name_state(buffer) {
var appropriate = tokenizer._currentToken && (tokenizer._currentToken.name === this._temporaryBuffer.toLowerCase());
var data = buffer.char();
if (isWhitespace(data) && appropriate) {
tokenizer._currentToken = {type: 'EndTag', name: 'script', data: [], selfClosing: false};
tokenizer.setState(before_attribute_name_state);
} else if (data === '/' && appropriate) {
tokenizer._currentToken = {type: 'EndTag', name: 'script', data: [], selfClosing: false};
tokenizer.setState(self_closing_tag_state);
} else if (data === '>' && appropriate) {
tokenizer._currentToken = {type: 'EndTag', name: 'script', data: [], selfClosing: false};
tokenizer.setState(data_state);
tokenizer._emitCurrentToken();
} else if (isAlpha(data)) {
this._temporaryBuffer += data;
buffer.commit();
} else {
tokenizer._emitToken({type: 'Characters', data: '</' + this._temporaryBuffer});
buffer.unget(data);
tokenizer.setState(script_data_escaped_state);
}
return true;
}
function script_data_double_escape_start_state(buffer) {
var data = buffer.char();
if (isWhitespace(data) || data === '/' || data === '>') {
tokenizer._emitToken({type: 'Characters', data: data});
if (this._temporaryBuffer.toLowerCase() === 'script')
tokenizer.setState(script_data_double_escaped_state);
else
tokenizer.setState(script_data_escaped_state);
} else if (isAlpha(data)) {
tokenizer._emitToken({type: 'Characters', data: data});
this._temporaryBuffer += data;
buffer.commit();
} else {
buffer.unget(data);
tokenizer.setState(script_data_escaped_state);
}
return true;
}
function script_data_double_escaped_state(buffer) {
var data = buffer.char();
if (data === InputStream.EOF) {
tokenizer._parseError('eof-in-script');
buffer.unget(data);
tokenizer.setState(data_state);
} else if (data === '-') {
tokenizer._emitToken({type: 'Characters', data: '-'});
tokenizer.setState(script_data_double_escaped_dash_state);
} else if (data === '<') {
tokenizer._emitToken({type: 'Characters', data: '<'});
tokenizer.setState(script_data_double_escaped_less_than_sign_state);
} else if (data === '\u0000') {
tokenizer._parseError('invalid-codepoint');
tokenizer._emitToken({type: 'Characters', data: '\uFFFD'});
buffer.commit();
} else {
tokenizer._emitToken({type: 'Characters', data: data});
buffer.commit();
}
return true;
}
function script_data_double_escaped_dash_state(buffer) {
var data = buffer.char();
if (data === InputStream.EOF) {
tokenizer._parseError('eof-in-script');
buffer.unget(data);
tokenizer.setState(data_state);
} else if (data === '-') {
tokenizer._emitToken({type: 'Characters', data: '-'});
tokenizer.setState(script_data_double_escaped_dash_dash_state);
} else if (data === '<') {
tokenizer._emitToken({type: 'Characters', data: '<'});
tokenizer.setState(script_data_double_escaped_less_than_sign_state);
} else if (data === '\u0000') {
tokenizer._parseError('invalid-codepoint');
tokenizer._emitToken({type: 'Characters', data: '\uFFFD'});
tokenizer.setState(script_data_double_escaped_state);
} else {
tokenizer._emitToken({type: 'Characters', data: data});
tokenizer.setState(script_data_double_escaped_state);
}
return true;
}
function script_data_double_escaped_dash_dash_state(buffer) {
var data = buffer.char();
if (data === InputStream.EOF) {
tokenizer._parseError('eof-in-script');
buffer.unget(data);
tokenizer.setState(data_state);
} else if (data === '-') {
tokenizer._emitToken({type: 'Characters', data: '-'});
buffer.commit();
} else if (data === '<') {
tokenizer._emitToken({type: 'Characters', data: '<'});
tokenizer.setState(script_data_double_escaped_less_than_sign_state);
} else if (data === '>') {
tokenizer._emitToken({type: 'Characters', data: '>'});
tokenizer.setState(script_data_state);
} else if (data === '\u0000') {
tokenizer._parseError('invalid-codepoint');
tokenizer._emitToken({type: 'Characters', data: '\uFFFD'});
tokenizer.setState(script_data_double_escaped_state);
} else {
tokenizer._emitToken({type: 'Characters', data: data});
tokenizer.setState(script_data_double_escaped_state);
}
return true;
}
function script_data_double_escaped_less_than_sign_state(buffer) {
var data = buffer.char();
if (data === '/') {
tokenizer._emitToken({type: 'Characters', data: '/'});
this._temporaryBuffer = '';
tokenizer.setState(script_data_double_escape_end_state);
} else {
buffer.unget(data);
tokenizer.setState(script_data_double_escaped_state);
}
return true;
}
function script_data_double_escape_end_state(buffer) {
var data = buffer.char();
if (isWhitespace(data) || data === '/' || data === '>') {
tokenizer._emitToken({type: 'Characters', data: data});
if (this._temporaryBuffer.toLowerCase() === 'script')
tokenizer.setState(script_data_escaped_state);
else
tokenizer.setState(script_data_double_escaped_state);
} else if (isAlpha(data)) {
tokenizer._emitToken({type: 'Characters', data: data});
this._temporaryBuffer += data;
buffer.commit();
} else {
buffer.unget(data);
tokenizer.setState(script_data_double_escaped_state);
}
return true;
}
function tag_open_state(buffer) {
var data = buffer.char();
if (data === InputStream.EOF) {
tokenizer._parseError("bare-less-than-sign-at-eof");
tokenizer._emitToken({type: 'Characters', data: '<'});
buffer.unget(data);
tokenizer.setState(data_state);
} else if (isAlpha(data)) {
tokenizer._currentToken = {type: 'StartTag', name: data.toLowerCase(), data: []};
tokenizer.setState(tag_name_state);
} else if (data === '!') {
tokenizer.setState(markup_declaration_open_state);
} else if (data === '/') {
tokenizer.setState(close_tag_open_state);
} else if (data === '>') {
tokenizer._parseError("expected-tag-name-but-got-right-bracket");
tokenizer._emitToken({type: 'Characters', data: "<>"});
tokenizer.setState(data_state);
} else if (data === '?') {
tokenizer._parseError("expected-tag-name-but-got-question-mark");
buffer.unget(data);
tokenizer.setState(bogus_comment_state);
} else {
tokenizer._parseError("expected-tag-name");
tokenizer._emitToken({type: 'Characters', data: "<"});
buffer.unget(data);
tokenizer.setState(data_state);
}
return true;
}
function close_tag_open_state(buffer) {
var data = buffer.char();
if (data === InputStream.EOF) {
tokenizer._parseError("expected-closing-tag-but-got-eof");
tokenizer._emitToken({type: 'Characters', data: '</'});
buffer.unget(data);
tokenizer.setState(data_state);
} else if (isAlpha(data)) {
tokenizer._currentToken = {type: 'EndTag', name: data.toLowerCase(), data: []};
tokenizer.setState(tag_name_state);
} else if (data === '>') {
tokenizer._parseError("expected-closing-tag-but-got-right-bracket");
tokenizer.setState(data_state);
} else {
tokenizer._parseError("expected-closing-tag-but-got-char", {data: data}); // param 1 is datavars:
buffer.unget(data);
tokenizer.setState(bogus_comment_state);
}
return true;
}
function tag_name_state(buffer) {
var data = buffer.char();
if (data === InputStream.EOF) {
tokenizer._parseError('eof-in-tag-name');
buffer.unget(data);
tokenizer.setState(data_state);
} else if (isWhitespace(data)) {
tokenizer.setState(before_attribute_name_state);
} else if (isAlpha(data)) {
tokenizer._currentToken.name += data.toLowerCase();
} else if (data === '>') {
tokenizer._emitCurrentToken();
} else if (data === '/') {
tokenizer.setState(self_closing_tag_state);
} else if (data === '\u0000') {
tokenizer._parseError("invalid-codepoint");
tokenizer._currentToken.name += "\uFFFD";
} else {
tokenizer._currentToken.name += data;
}
buffer.commit();
return true;
}
function before_attribute_name_state(buffer) {
var data = buffer.char();
if (data === InputStream.EOF) {
tokenizer._parseError("expected-attribute-name-but-got-eof");
buffer.unget(data);
tokenizer.setState(data_state);
} else if (isWhitespace(data)) {
return true;
} else if (isAlpha(data)) {
tokenizer._currentToken.data.push({nodeName: data.toLowerCase(), nodeValue: ""});
tokenizer.setState(attribute_name_state);
} else if (data === '>') {
tokenizer._emitCurrentToken();
} else if (data === '/') {
tokenizer.setState(self_closing_tag_state);
} else if (data === "'" || data === '"' || data === '=' || data === '<') {
tokenizer._parseError("invalid-character-in-attribute-name");
tokenizer._currentToken.data.push({nodeName: data, nodeValue: ""});
tokenizer.setState(attribute_name_state);
} else if (data === '\u0000') {
tokenizer._parseError("invalid-codepoint");
tokenizer._currentToken.data.push({nodeName: "\uFFFD", nodeValue: ""});
} else {
tokenizer._currentToken.data.push({nodeName: data, nodeValue: ""});
tokenizer.setState(attribute_name_state);
}
return true;
}
function attribute_name_state(buffer) {
var data = buffer.char();
var leavingThisState = true;
var shouldEmit = false;
if (data === InputStream.EOF) {
tokenizer._parseError("eof-in-attribute-name");
buffer.unget(data);
tokenizer.setState(data_state);
shouldEmit = true;
} else if (data === '=') {
tokenizer.setState(before_attribute_value_state);
} else if (isAlpha(data)) {
tokenizer._currentAttribute().nodeName += data.toLowerCase();
leavingThisState = false;
} else if (data === '>') {
shouldEmit = true;
} else if (isWhitespace(data)) {
tokenizer.setState(after_attribute_name_state);
} else if (data === '/') {
tokenizer.setState(self_closing_tag_state);
} else if (data === "'" || data === '"') {
tokenizer._parseError("invalid-character-in-attribute-name");
tokenizer._currentAttribute().nodeName += data;
leavingThisState = false;
} else if (data === '\u0000') {
tokenizer._parseError("invalid-codepoint");
tokenizer._currentAttribute().nodeName += "\uFFFD";
} else {
tokenizer._currentAttribute().nodeName += data;
leavingThisState = false;
}
if (leavingThisState) {
var attributes = tokenizer._currentToken.data;
var currentAttribute = attributes[attributes.length - 1];
for (var i = attributes.length - 2; i >= 0; i--) {
if (currentAttribute.nodeName === attributes[i].nodeName) {
tokenizer._parseError("duplicate-attribute", {name: currentAttribute.nodeName});
currentAttribute.nodeName = null;
break;
}
}
if (shouldEmit)
tokenizer._emitCurrentToken();
} else {
buffer.commit();
}
return true;
}
function after_attribute_name_state(buffer) {
var data = buffer.char();
if (data === InputStream.EOF) {
tokenizer._parseError("expected-end-of-tag-but-got-eof");
buffer.unget(data);
tokenizer.setState(data_state);
} else if (isWhitespace(data)) {
return true;
} else if (data === '=') {
tokenizer.setState(before_attribute_value_state);
} else if (data === '>') {
tokenizer._emitCurrentToken();
} else if (isAlpha(data)) {
tokenizer._currentToken.data.push({nodeName: data, nodeValue: ""});
tokenizer.setState(attribute_name_state);
} else if (data === '/') {
tokenizer.setState(self_closing_tag_state);
} else if (data === "'" || data === '"' || data === '<') {
tokenizer._parseError("invalid-character-after-attribute-name");
tokenizer._currentToken.data.push({nodeName: data, nodeValue: ""});
tokenizer.setState(attribute_name_state);
} else if (data === '\u0000') {
tokenizer._parseError("invalid-codepoint");
tokenizer._currentToken.data.push({nodeName: "\uFFFD", nodeValue: ""});
} else {
tokenizer._currentToken.data.push({nodeName: data, nodeValue: ""});
tokenizer.setState(attribute_name_state);
}
return true;
}
function before_attribute_value_state(buffer) {
var data = buffer.char();
if (data === InputStream.EOF) {
tokenizer._parseError("expected-attribute-value-but-got-eof");
buffer.unget(data);
tokenizer.setState(data_state);
} else if (isWhitespace(data)) {
return true;
} else if (data === '"') {
tokenizer.setState(attribute_value_double_quoted_state);
} else if (data === '&') {
tokenizer.setState(attribute_value_unquoted_state);
buffer.unget(data);
} else if (data === "'") {
tokenizer.setState(attribute_value_single_quoted_state);
} else if (data === '>') {
tokenizer._parseError("expected-attribute-value-but-got-right-bracket");
tokenizer._emitCurrentToken();
} else if (data === '=' || data === '<' || data === '`') {
tokenizer._parseError("unexpected-character-in-unquoted-attribute-value");
tokenizer._currentAttribute().nodeValue += data;
tokenizer.setState(attribute_value_unquoted_state);
} else if (data === '\u0000') {
tokenizer._parseError("invalid-codepoint");
tokenizer._currentAttribute().nodeValue += "\uFFFD";
} else {
tokenizer._currentAttribute().nodeValue += data;
tokenizer.setState(attribute_value_unquoted_state);
}
return true;
}
function attribute_value_double_quoted_state(buffer) {
var data = buffer.char();
if (data === InputStream.EOF) {
tokenizer._parseError("eof-in-attribute-value-double-quote");
buffer.unget(data);
tokenizer.setState(data_state);
} else if (data === '"') {
tokenizer.setState(after_attribute_value_state);
} else if (data === '&') {
this._additionalAllowedCharacter = '"';
tokenizer.setState(character_reference_in_attribute_value_state);
} else if (data === '\u0000') {
tokenizer._parseError("invalid-codepoint");
tokenizer._currentAttribute().nodeValue += "\uFFFD";
} else {
var s = buffer.matchUntil('[\0"&]');
data = data + s;
tokenizer._currentAttribute().nodeValue += data;
}
return true;
}
function attribute_value_single_quoted_state(buffer) {
var data = buffer.char();
if (data === InputStream.EOF) {
tokenizer._parseError("eof-in-attribute-value-single-quote");
buffer.unget(data);
tokenizer.setState(data_state);
} else if (data === "'") {
tokenizer.setState(after_attribute_value_state);
} else if (data === '&') {
this._additionalAllowedCharacter = "'";
tokenizer.setState(character_reference_in_attribute_value_state);
} else if (data === '\u0000') {
tokenizer._parseError("invalid-codepoint");
tokenizer._currentAttribute().nodeValue += "\uFFFD";
} else {
tokenizer._currentAttribute().nodeValue += data + buffer.matchUntil("\u0000|['&]");
}
return true;
}
function attribute_value_unquoted_state(buffer) {
var data = buffer.char();
if (data === InputStream.EOF) {
tokenizer._parseError("eof-after-attribute-value");
buffer.unget(data);
tokenizer.setState(data_state);
} else if (isWhitespace(data)) {
tokenizer.setState(before_attribute_name_state);
} else if (data === '&') {
this._additionalAllowedCharacter = ">";
tokenizer.setState(character_reference_in_attribute_value_state);
} else if (data === '>') {
tokenizer._emitCurrentToken();
} else if (data === '"' || data === "'" || data === '=' || data === '`' || data === '<') {
tokenizer._parseError("unexpected-character-in-unquoted-attribute-value");
tokenizer._currentAttribute().nodeValue += data;
buffer.commit();
} else if (data === '\u0000') {
tokenizer._parseError("invalid-codepoint");
tokenizer._currentAttribute().nodeValue += "\uFFFD";
} else {
var o = buffer.matchUntil("\u0000|["+ "\t\n\v\f\x20\r" + "&<>\"'=`" +"]");
if (o === InputStream.EOF) {
tokenizer._parseError("eof-in-attribute-value-no-quotes");
tokenizer._emitCurrentToken();
}
buffer.commit();
tokenizer._currentAttribute().nodeValue += data + o;
}
return true;
}
function character_reference_in_attribute_value_state(buffer) {
var character = EntityParser.consumeEntity(buffer, tokenizer, this._additionalAllowedCharacter);
this._currentAttribute().nodeValue += character || '&';
if (this._additionalAllowedCharacter === '"')
tokenizer.setState(attribute_value_double_quoted_state);
else if (this._additionalAllowedCharacter === '\'')
tokenizer.setState(attribute_value_single_quoted_state);
else if (this._additionalAllowedCharacter === '>')
tokenizer.setState(attribute_value_unquoted_state);
return true;
}
function after_attribute_value_state(buffer) {
var data = buffer.char();
if (data === InputStream.EOF) {
tokenizer._parseError("eof-after-attribute-value");
buffer.unget(data);
tokenizer.setState(data_state);
} else if (isWhitespace(data)) {
tokenizer.setState(before_attribute_name_state);
} else if (data === '>') {
tokenizer.setState(data_state);
tokenizer._emitCurrentToken();
} else if (data === '/') {
tokenizer.setState(self_closing_tag_state);
} else {
tokenizer._parseError("unexpected-character-after-attribute-value");
buffer.unget(data);
tokenizer.setState(before_attribute_name_state);
}
return true;
}
function self_closing_tag_state(buffer) {
var c = buffer.char();
if (c === InputStream.EOF) {
tokenizer._parseError("unexpected-eof-after-solidus-in-tag");
buffer.unget(c);
tokenizer.setState(data_state);
} else if (c === '>') {
tokenizer._currentToken.selfClosing = true;
tokenizer.setState(data_state);
tokenizer._emitCurrentToken();
} else {
tokenizer._parseError("unexpected-character-after-solidus-in-tag");
buffer.unget(c);
tokenizer.setState(before_attribute_name_state);
}
return true;
}
function bogus_comment_state(buffer) {
var data = buffer.matchUntil('>');
data = data.replace(/\u0000/g, "\uFFFD");
buffer.char();
tokenizer._emitToken({type: 'Comment', data: data});
tokenizer.setState(data_state);
return true;
}
function markup_declaration_open_state(buffer) {
var chars = buffer.shift(2);
if (chars === '--') {
tokenizer._currentToken = {type: 'Comment', data: ''};
tokenizer.setState(comment_start_state);
} else {
var newchars = buffer.shift(5);
if (newchars === InputStream.EOF || chars === InputStream.EOF) {
tokenizer._parseError("expected-dashes-or-doctype");
tokenizer.setState(bogus_comment_state);
buffer.unget(chars);
return true;
}
chars += newchars;
if (chars.toUpperCase() === 'DOCTYPE') {
tokenizer._currentToken = {type: 'Doctype', name: '', publicId: null, systemId: null, forceQuirks: false};
tokenizer.setState(doctype_state);
} else if (tokenizer._tokenHandler.isCdataSectionAllowed() && chars === '[CDATA[') {
tokenizer.setState(cdata_section_state);
} else {
tokenizer._parseError("expected-dashes-or-doctype");
buffer.unget(chars);
tokenizer.setState(bogus_comment_state);
}
}
return true;
}
function cdata_section_state(buffer) {
var data = buffer.matchUntil(']]>');
buffer.shift(3);
if (data) {
tokenizer._emitToken({type: 'Characters', data: data});
}
tokenizer.setState(data_state);
return true;
}
function comment_start_state(buffer) {
var data = buffer.char();
if (data === InputStream.EOF) {
tokenizer._parseError("eof-in-comment");
tokenizer._emitToken(tokenizer._currentToken);
buffer.unget(data);
tokenizer.setState(data_state);
} else if (data === '-') {
tokenizer.setState(comment_start_dash_state);
} else if (data === '>') {
tokenizer._parseError("incorrect-comment");
tokenizer._emitToken(tokenizer._currentToken);
tokenizer.setState(data_state);
} else if (data === '\u0000') {
tokenizer._parseError("invalid-codepoint");
tokenizer._currentToken.data += "\uFFFD";
} else {
tokenizer._currentToken.data += data;
tokenizer.setState(comment_state);
}
return true;
}
function comment_start_dash_state(buffer) {
var data = buffer.char();
if (data === InputStream.EOF) {
tokenizer._parseError("eof-in-comment");
tokenizer._emitToken(tokenizer._currentToken);
buffer.unget(data);
tokenizer.setState(data_state);
} else if (data === '-') {
tokenizer.setState(comment_end_state);
} else if (data === '>') {
tokenizer._parseError("incorrect-comment");
tokenizer._emitToken(tokenizer._currentToken);
tokenizer.setState(data_state);
} else if (data === '\u0000') {
tokenizer._parseError("invalid-codepoint");
tokenizer._currentToken.data += "\uFFFD";
} else {
tokenizer._currentToken.data += '-' + data;
tokenizer.setState(comment_state);
}
return true;
}
function comment_state(buffer) {
var data = buffer.char();
if (data === InputStream.EOF) {
tokenizer._parseError("eof-in-comment");
tokenizer._emitToken(tokenizer._currentToken);
buffer.unget(data);
tokenizer.setState(data_state);
} else if (data === '-') {
tokenizer.setState(comment_end_dash_state);
} else if (data === '\u0000') {
tokenizer._parseError("invalid-codepoint");
tokenizer._currentToken.data += "\uFFFD";
} else {
tokenizer._currentToken.data += data;
buffer.commit();
}
return true;
}
function comment_end_dash_state(buffer) {
var data = buffer.char();
if (data === InputStream.EOF) {
tokenizer._parseError("eof-in-comment-end-dash");
tokenizer._emitToken(tokenizer._currentToken);
buffer.unget(data);
tokenizer.setState(data_state);
} else if (data === '-') {
tokenizer.setState(comment_end_state);
} else if (data === '\u0000') {
tokenizer._parseError("invalid-codepoint");
tokenizer._currentToken.data += "-\uFFFD";
tokenizer.setState(comment_state);
} else {
tokenizer._currentToken.data += '-' + data + buffer.matchUntil('\u0000|-');
buffer.char();
}
return true;
}
function comment_end_state(buffer) {
var data = buffer.char();
if (data === InputStream.EOF) {
tokenizer._parseError("eof-in-comment-double-dash");
tokenizer._emitToken(tokenizer._currentToken);
buffer.unget(data);
tokenizer.setState(data_state);
} else if (data === '>') {
tokenizer._emitToken(tokenizer._currentToken);
tokenizer.setState(data_state);
} else if (data === '!') {
tokenizer._parseError("unexpected-bang-after-double-dash-in-comment");
tokenizer.setState(comment_end_bang_state);
} else if (data === '-') {
tokenizer._parseError("unexpected-dash-after-double-dash-in-comment");
tokenizer._currentToken.data += data;
} else if (data === '\u0000') {
tokenizer._parseError("invalid-codepoint");
tokenizer._currentToken.data += "--\uFFFD";
tokenizer.setState(comment_state);
} else {
tokenizer._parseError("unexpected-char-in-comment");
tokenizer._currentToken.data += '--' + data;
tokenizer.setState(comment_state);
}
return true;
}
function comment_end_bang_state(buffer) {
var data = buffer.char();
if (data === InputStream.EOF) {
tokenizer._parseError("eof-in-comment-end-bang-state");
tokenizer._emitToken(tokenizer._currentToken);
buffer.unget(data);
tokenizer.setState(data_state);
} else if (data === '>') {
tokenizer._emitToken(tokenizer._currentToken);
tokenizer.setState(data_state);
} else if (data === '-') {
tokenizer._currentToken.data += '--!';
tokenizer.setState(comment_end_dash_state);
} else {
tokenizer._currentToken.data += '--!' + data;
tokenizer.setState(comment_state);
}
return true;
}
function doctype_state(buffer) {
var data = buffer.char();
if (data === InputStream.EOF) {
tokenizer._parseError("expected-doctype-name-but-got-eof");
tokenizer._currentToken.forceQuirks = true;
buffer.unget(data);
tokenizer.setState(data_state);
tokenizer._emitCurrentToken();
} else if (isWhitespace(data)) {
tokenizer.setState(before_doctype_name_state);
} else {
tokenizer._parseError("need-space-after-doctype");
buffer.unget(data);
tokenizer.setState(before_doctype_name_state);
}
return true;
}
function before_doctype_name_state(buffer) {
var data = buffer.char();
if (data === InputStream.EOF) {
tokenizer._parseError("expected-doctype-name-but-got-eof");
tokenizer._currentToken.forceQuirks = true;
buffer.unget(data);
tokenizer.setState(data_state);
tokenizer._emitCurrentToken();
} else if (isWhitespace(data)) {
} else if (data === '>') {
tokenizer._parseError("expected-doctype-name-but-got-right-bracket");
tokenizer._currentToken.forceQuirks = true;
tokenizer.setState(data_state);
tokenizer._emitCurrentToken();
} else {
if (isAlpha(data))
data = data.toLowerCase();
tokenizer._currentToken.name = data;
tokenizer.setState(doctype_name_state);
}
return true;
}
function doctype_name_state(buffer) {
var data = buffer.char();
if (data === InputStream.EOF) {
tokenizer._currentToken.forceQuirks = true;
buffer.unget(data);
tokenizer._parseError("eof-in-doctype-name");
tokenizer.setState(data_state);
tokenizer._emitCurrentToken();
} else if (isWhitespace(data)) {
tokenizer.setState(after_doctype_name_state);
} else if (data === '>') {
tokenizer.setState(data_state);
tokenizer._emitCurrentToken();
} else {
if (isAlpha(data))
data = data.toLowerCase();
tokenizer._currentToken.name += data;
buffer.commit();
}
return true;
}
function after_doctype_name_state(buffer) {
var data = buffer.char();
if (data === InputStream.EOF) {
tokenizer._currentToken.forceQuirks = true;
buffer.unget(data);
tokenizer._parseError("eof-in-doctype");
tokenizer.setState(data_state);
tokenizer._emitCurrentToken();
} else if (isWhitespace(data)) {
} else if (data === '>') {
tokenizer.setState(data_state);
tokenizer._emitCurrentToken();
} else {
if (['p', 'P'].indexOf(data) > -1) {
var expected = [['u', 'U'], ['b', 'B'], ['l', 'L'], ['i', 'I'], ['c', 'C']];
var matched = expected.every(function(expected){
data = buffer.char();
return expected.indexOf(data) > -1;
});
if (matched) {
tokenizer.setState(after_doctype_public_keyword_state);
return true;
}
} else if (['s', 'S'].indexOf(data) > -1) {
var expected = [['y', 'Y'], ['s', 'S'], ['t', 'T'], ['e', 'E'], ['m', 'M']];
var matched = expected.every(function(expected){
data = buffer.char();
return expected.indexOf(data) > -1;
});
if (matched) {
tokenizer.setState(after_doctype_system_keyword_state);
return true;
}
}
buffer.unget(data);
tokenizer._currentToken.forceQuirks = true;
if (data === InputStream.EOF) {
tokenizer._parseError("eof-in-doctype");
buffer.unget(data);
tokenizer.setState(data_state);
tokenizer._emitCurrentToken();
} else {
tokenizer._parseError("expected-space-or-right-bracket-in-doctype", {data: data});
tokenizer.setState(bogus_doctype_state);
}
}
return true;
}
function after_doctype_public_keyword_state(buffer) {
var data = buffer.char();
if (data === InputStream.EOF) {
tokenizer._parseError("eof-in-doctype");
tokenizer._currentToken.forceQuirks = true;
buffer.unget(data);
tokenizer.setState(data_state);
tokenizer._emitCurrentToken();
} else if (isWhitespace(data)) {
tokenizer.setState(before_doctype_public_identifier_state);
} else if (data === "'" || data === '"') {
tokenizer._parseError("unexpected-char-in-doctype");
buffer.unget(data);
tokenizer.setState(before_doctype_public_identifier_state);
} else {
buffer.unget(data);
tokenizer.setState(before_doctype_public_identifier_state);
}
return true;
}
function before_doctype_public_identifier_state(buffer) {
var data = buffer.char();
if (data === InputStream.EOF) {
tokenizer._parseError("eof-in-doctype");
tokenizer._currentToken.forceQuirks = true;
buffer.unget(data);
tokenizer.setState(data_state);
tokenizer._emitCurrentToken();
} else if (isWhitespace(data)) {
} else if (data === '"') {
tokenizer._currentToken.publicId = '';
tokenizer.setState(doctype_public_identifier_double_quoted_state);
} else if (data === "'") {
tokenizer._currentToken.publicId = '';
tokenizer.setState(doctype_public_identifier_single_quoted_state);
} else if (data === '>') {
tokenizer._parseError("unexpected-end-of-doctype");
tokenizer._currentToken.forceQuirks = true;
tokenizer.setState(data_state);
tokenizer._emitCurrentToken();
} else {
tokenizer._parseError("unexpected-char-in-doctype");
tokenizer._currentToken.forceQuirks = true;
tokenizer.setState(bogus_doctype_state);
}
return true;
}
function doctype_public_identifier_double_quoted_state(buffer) {
var data = buffer.char();
if (data === InputStream.EOF) {
tokenizer._parseError("eof-in-doctype");
tokenizer._currentToken.forceQuirks = true;
buffer.unget(data);
tokenizer.setState(data_state);
tokenizer._emitCurrentToken();
} else if (data === '"') {
tokenizer.setState(after_doctype_public_identifier_state);
} else if (data === '>') {
tokenizer._parseError("unexpected-end-of-doctype");
tokenizer._currentToken.forceQuirks = true;
tokenizer.setState(data_state);
tokenizer._emitCurrentToken();
} else {
tokenizer._currentToken.publicId += data;
}
return true;
}
function doctype_public_identifier_single_quoted_state(buffer) {
var data = buffer.char();
if (data === InputStream.EOF) {
tokenizer._parseError("eof-in-doctype");
tokenizer._currentToken.forceQuirks = true;
buffer.unget(data);
tokenizer.setState(data_state);
tokenizer._emitCurrentToken();
} else if (data === "'") {
tokenizer.setState(after_doctype_public_identifier_state);
} else if (data === '>') {
tokenizer._parseError("unexpected-end-of-doctype");
tokenizer._currentToken.forceQuirks = true;
tokenizer.setState(data_state);
tokenizer._emitCurrentToken();
} else {
tokenizer._currentToken.publicId += data;
}
return true;
}
function after_doctype_public_identifier_state(buffer) {
var data = buffer.char();
if (data === InputStream.EOF) {
tokenizer._parseError("eof-in-doctype");
tokenizer._currentToken.forceQuirks = true;
tokenizer._emitCurrentToken();
buffer.unget(data);
tokenizer.setState(data_state);
} else if (isWhitespace(data)) {
tokenizer.setState(between_doctype_public_and_system_identifiers_state);
} else if (data === '>') {
tokenizer.setState(data_state);
tokenizer._emitCurrentToken();
} else if (data === '"') {
tokenizer._parseError("unexpected-char-in-doctype");
tokenizer._currentToken.systemId = '';
tokenizer.setState(doctype_system_identifier_double_quoted_state);
} else if (data === "'") {
tokenizer._parseError("unexpected-char-in-doctype");
tokenizer._currentToken.systemId = '';
tokenizer.setState(doctype_system_identifier_single_quoted_state);
} else {
tokenizer._parseError("unexpected-char-in-doctype");
tokenizer._currentToken.forceQuirks = true;
tokenizer.setState(bogus_doctype_state);
}
return true;
}
function between_doctype_public_and_system_identifiers_state(buffer) {
var data = buffer.char();
if (data === InputStream.EOF) {
tokenizer._parseError("eof-in-doctype");
tokenizer._currentToken.forceQuirks = true;
tokenizer._emitCurrentToken();
buffer.unget(data);
tokenizer.setState(data_state);
} else if (isWhitespace(data)) {
} else if (data === '>') {
tokenizer._emitCurrentToken();
tokenizer.setState(data_state);
} else if (data === '"') {
tokenizer._currentToken.systemId = '';
tokenizer.setState(doctype_system_identifier_double_quoted_state);
} else if (data === "'") {
tokenizer._currentToken.systemId = '';
tokenizer.setState(doctype_system_identifier_single_quoted_state);
} else {
tokenizer._parseError("unexpected-char-in-doctype");
tokenizer._currentToken.forceQuirks = true;
tokenizer.setState(bogus_doctype_state);
}
return true;
}
function after_doctype_system_keyword_state(buffer) {
var data = buffer.char();
if (data === InputStream.EOF) {
tokenizer._parseError("eof-in-doctype");
tokenizer._currentToken.forceQuirks = true;
tokenizer._emitCurrentToken();
buffer.unget(data);
tokenizer.setState(data_state);
} else if (isWhitespace(data)) {
tokenizer.setState(before_doctype_system_identifier_state);
} else if (data === "'" || data === '"') {
tokenizer._parseError("unexpected-char-in-doctype");
buffer.unget(data);
tokenizer.setState(before_doctype_system_identifier_state);
} else {
buffer.unget(data);
tokenizer.setState(before_doctype_system_identifier_state);
}
return true;
}
function before_doctype_system_identifier_state(buffer) {
var data = buffer.char();
if (data === InputStream.EOF) {
tokenizer._parseError("eof-in-doctype");
tokenizer._currentToken.forceQuirks = true;
tokenizer._emitCurrentToken();
buffer.unget(data);
tokenizer.setState(data_state);
} else if (isWhitespace(data)) {
} else if (data === '"') {
tokenizer._currentToken.systemId = '';
tokenizer.setState(doctype_system_identifier_double_quoted_state);
} else if (data === "'") {
tokenizer._currentToken.systemId = '';
tokenizer.setState(doctype_system_identifier_single_quoted_state);
} else if (data === '>') {
tokenizer._parseError("unexpected-end-of-doctype");
tokenizer._currentToken.forceQuirks = true;
tokenizer._emitCurrentToken();
tokenizer.setState(data_state);
} else {
tokenizer._parseError("unexpected-char-in-doctype");
tokenizer._currentToken.forceQuirks = true;
tokenizer.setState(bogus_doctype_state);
}
return true;
}
function doctype_system_identifier_double_quoted_state(buffer) {
var data = buffer.char();
if (data === InputStream.EOF) {
tokenizer._parseError("eof-in-doctype");
tokenizer._currentToken.forceQuirks = true;
tokenizer._emitCurrentToken();
buffer.unget(data);
tokenizer.setState(data_state);
} else if (data === '"') {
tokenizer.setState(after_doctype_system_identifier_state);
} else if (data === '>') {
tokenizer._parseError("unexpected-end-of-doctype");
tokenizer._currentToken.forceQuirks = true;
tokenizer._emitCurrentToken();
tokenizer.setState(data_state);
} else {
tokenizer._currentToken.systemId += data;
}
return true;
}
function doctype_system_identifier_single_quoted_state(buffer) {
var data = buffer.char();
if (data === InputStream.EOF) {
tokenizer._parseError("eof-in-doctype");
tokenizer._currentToken.forceQuirks = true;
tokenizer._emitCurrentToken();
buffer.unget(data);
tokenizer.setState(data_state);
} else if (data === "'") {
tokenizer.setState(after_doctype_system_identifier_state);
} else if (data === '>') {
tokenizer._parseError("unexpected-end-of-doctype");
tokenizer._currentToken.forceQuirks = true;
tokenizer._emitCurrentToken();
tokenizer.setState(data_state);
} else {
tokenizer._currentToken.systemId += data;
}
return true;
}
function after_doctype_system_identifier_state(buffer) {
var data = buffer.char();
if (data === InputStream.EOF) {
tokenizer._parseError("eof-in-doctype");
tokenizer._currentToken.forceQuirks = true;
tokenizer._emitCurrentToken();
buffer.unget(data);
tokenizer.setState(data_state);
} else if (isWhitespace(data)) {
} else if (data === '>') {
tokenizer._emitCurrentToken();
tokenizer.setState(data_state);
} else {
tokenizer._parseError("unexpected-char-in-doctype");
tokenizer.setState(bogus_doctype_state);
}
return true;
}
function bogus_doctype_state(buffer) {
var data = buffer.char();
if (data === InputStream.EOF) {
buffer.unget(data);
tokenizer._emitCurrentToken();
tokenizer.setState(data_state);
} else if (data === '>') {
tokenizer._emitCurrentToken();
tokenizer.setState(data_state);
}
return true;
}
};
Object.defineProperty(Tokenizer.prototype, 'lineNumber', {
get: function() {
return this._inputStream.location().line;
}
});
Object.defineProperty(Tokenizer.prototype, 'columnNumber', {
get: function() {
return this._inputStream.location().column;
}
});
exports.Tokenizer = Tokenizer;
},
{"./EntityParser":2,"./InputStream":3}],
6:[function(_dereq_,module,exports){
var assert = _dereq_('assert');
var messages = _dereq_('./messages.json');
var constants = _dereq_('./constants');
var EventEmitter = _dereq_('events').EventEmitter;
var Tokenizer = _dereq_('./Tokenizer').Tokenizer;
var ElementStack = _dereq_('./ElementStack').ElementStack;
var StackItem = _dereq_('./StackItem').StackItem;
var Marker = {};
function isWhitespace(ch) {
return ch === " " || ch === "\n" || ch === "\t" || ch === "\r" || ch === "\f";
}
function isWhitespaceOrReplacementCharacter(ch) {
return isWhitespace(ch) || ch === '\uFFFD';
}
function isAllWhitespace(characters) {
for (var i = 0; i < characters.length; i++) {
var ch = characters[i];
if (!isWhitespace(ch))
return false;
}
return true;
}
function isAllWhitespaceOrReplacementCharacters(characters) {
for (var i = 0; i < characters.length; i++) {
var ch = characters[i];
if (!isWhitespaceOrReplacementCharacter(ch))
return false;
}
return true;
}
function getAttribute(node, name) {
for (var i = 0; i < node.attributes.length; i++) {
var attribute = node.attributes[i];
if (attribute.nodeName === name) {
return attribute;
}
}
return null;
}
function CharacterBuffer(characters) {
this.characters = characters;
this.current = 0;
this.end = this.characters.length;
}
CharacterBuffer.prototype.skipAtMostOneLeadingNewline = function() {
if (this.characters[this.current] === '\n')
this.current++;
};
CharacterBuffer.prototype.skipLeadingWhitespace = function() {
while (isWhitespace(this.characters[this.current])) {
if (++this.current == this.end)
return;
}
};
CharacterBuffer.prototype.skipLeadingNonWhitespace = function() {
while (!isWhitespace(this.characters[this.current])) {
if (++this.current == this.end)
return;
}
};
CharacterBuffer.prototype.takeRemaining = function() {
return this.characters.substring(this.current);
};
CharacterBuffer.prototype.takeLeadingWhitespace = function() {
var start = this.current;
this.skipLeadingWhitespace();
if (start === this.current)
return "";
return this.characters.substring(start, this.current - start);
};
Object.defineProperty(CharacterBuffer.prototype, 'length', {
get: function(){
return this.end - this.current;
}
});
function TreeBuilder() {
this.tokenizer = null;
this.errorHandler = null;
this.scriptingEnabled = false;
this.document = null;
this.head = null;
this.form = null;
this.openElements = new ElementStack();
this.activeFormattingElements = [];
this.insertionMode = null;
this.insertionModeName = "";
this.originalInsertionMode = "";
this.inQuirksMode = false; // TODO quirks mode
this.compatMode = "no quirks";
this.framesetOk = true;
this.redirectAttachToFosterParent = false;
this.selfClosingFlagAcknowledged = false;
this.context = "";
this.pendingTableCharacters = [];
this.shouldSkipLeadingNewline = false;
var tree = this;
var modes = this.insertionModes = {};
modes.base = {
end_tag_handlers: {"-default": 'endTagOther'},
start_tag_handlers: {"-default": 'startTagOther'},
processEOF: function() {
tree.generateImpliedEndTags();
if (tree.openElements.length > 2) {
tree.parseError('expected-closing-tag-but-got-eof');
} else if (tree.openElements.length == 2 &&
tree.openElements.item(1).localName != 'body') {
tree.parseError('expected-closing-tag-but-got-eof');
} else if (tree.context && tree.openElements.length > 1) {
}
},
processComment: function(data) {
tree.insertComment(data, tree.currentStackItem().node);
},
processDoctype: function(name, publicId, systemId, forceQuirks) {
tree.parseError('unexpected-doctype');
},
processStartTag: function(name, attributes, selfClosing) {
if (this[this.start_tag_handlers[name]]) {
this[this.start_tag_handlers[name]](name, attributes, selfClosing);
} else if (this[this.start_tag_handlers["-default"]]) {
this[this.start_tag_handlers["-default"]](name, attributes, selfClosing);
} else {
throw(new Error("No handler found for "+name));
}
},
processEndTag: function(name) {
if (this[this.end_tag_handlers[name]]) {
this[this.end_tag_handlers[name]](name);
} else if (this[this.end_tag_handlers["-default"]]) {
this[this.end_tag_handlers["-default"]](name);
} else {
throw(new Error("No handler found for "+name));
}
},
startTagHtml: function(name, attributes) {
modes.inBody.startTagHtml(name, attributes);
}
};
modes.initial = Object.create(modes.base);
modes.initial.processEOF = function() {
tree.parseError("expected-doctype-but-got-eof");
this.anythingElse();
tree.insertionMode.processEOF();
};
modes.initial.processComment = function(data) {
tree.insertComment(data, tree.document);
};
modes.initial.processDoctype = function(name, publicId, systemId, forceQuirks) {
tree.insertDoctype(name || '', publicId || '', systemId || '');
if (forceQuirks || name != 'html' || (publicId != null && ([
"+//silmaril//dtd html pro v0r11 19970101//",
"-//advasoft ltd//dtd html 3.0 aswedit + extensions//",
"-//as//dtd html 3.0 aswedit + extensions//",
"-//ietf//dtd html 2.0 level 1//",
"-//ietf//dtd html 2.0 level 2//",
"-//ietf//dtd html 2.0 strict level 1//",
"-//ietf//dtd html 2.0 strict level 2//",
"-//ietf//dtd html 2.0 strict//",
"-//ietf//dtd html 2.0//",
"-//ietf//dtd html 2.1e//",
"-//ietf//dtd html 3.0//",
"-//ietf//dtd html 3.0//",
"-//ietf//dtd html 3.2 final//",
"-//ietf//dtd html 3.2//",
"-//ietf//dtd html 3//",
"-//ietf//dtd html level 0//",
"-//ietf//dtd html level 0//",
"-//ietf//dtd html level 1//",
"-//ietf//dtd html level 1//",
"-//ietf//dtd html level 2//",
"-//ietf//dtd html level 2//",
"-//ietf//dtd html level 3//",
"-//ietf//dtd html level 3//",
"-//ietf//dtd html strict level 0//",
"-//ietf//dtd html strict level 0//",
"-//ietf//dtd html strict level 1//",
"-//ietf//dtd html strict level 1//",
"-//ietf//dtd html strict level 2//",
"-//ietf//dtd html strict level 2//",
"-//ietf//dtd html strict level 3//",
"-//ietf//dtd html strict level 3//",
"-//ietf//dtd html strict//",
"-//ietf//dtd html strict//",
"-//ietf//dtd html strict//",
"-//ietf//dtd html//",
"-//ietf//dtd html//",
"-//ietf//dtd html//",
"-//metrius//dtd metrius presentational//",
"-//microsoft//dtd internet explorer 2.0 html strict//",
"-//microsoft//dtd internet explorer 2.0 html//",
"-//microsoft//dtd internet explorer 2.0 tables//",
"-//microsoft//dtd internet explorer 3.0 html strict//",
"-//microsoft//dtd internet explorer 3.0 html//",
"-//microsoft//dtd internet explorer 3.0 tables//",
"-//netscape comm. corp.//dtd html//",
"-//netscape comm. corp.//dtd strict html//",
"-//o'reilly and associates//dtd html 2.0//",
"-//o'reilly and associates//dtd html extended 1.0//",
"-//spyglass//dtd html 2.0 extended//",
"-//sq//dtd html 2.0 hotmetal + extensions//",
"-//sun microsystems corp.//dtd hotjava html//",
"-//sun microsystems corp.//dtd hotjava strict html//",
"-//w3c//dtd html 3 1995-03-24//",
"-//w3c//dtd html 3.2 draft//",
"-//w3c//dtd html 3.2 final//",
"-//w3c//dtd html 3.2//",
"-//w3c//dtd html 3.2s draft//",
"-//w3c//dtd html 4.0 frameset//",
"-//w3c//dtd html 4.0 transitional//",
"-//w3c//dtd html experimental 19960712//",
"-//w3c//dtd html experimental 970421//",
"-//w3c//dtd w3 html//",
"-//w3o//dtd w3 html 3.0//",
"-//webtechs//dtd mozilla html 2.0//",
"-//webtechs//dtd mozilla html//",
"html"
].some(publicIdStartsWith)
|| [
"-//w3o//dtd w3 html strict 3.0//en//",
"-/w3c/dtd html 4.0 transitional/en",
"html"
].indexOf(publicId.toLowerCase()) > -1
|| (systemId == null && [
"-//w3c//dtd html 4.01 transitional//",
"-//w3c//dtd html 4.01 frameset//"
].some(publicIdStartsWith)))
)
|| (systemId != null && (systemId.toLowerCase() == "http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd"))
) {
tree.compatMode = "quirks";
tree.parseError("quirky-doctype");
} else if (publicId != null && ([
"-//w3c//dtd xhtml 1.0 transitional//",
"-//w3c//dtd xhtml 1.0 frameset//"
].some(publicIdStartsWith)
|| (systemId != null && [
"-//w3c//dtd html 4.01 transitional//",
"-//w3c//dtd html 4.01 frameset//"
].indexOf(publicId.toLowerCase()) > -1))
) {
tree.compatMode = "limited quirks";
tree.parseError("almost-standards-doctype");
} else {
if ((publicId == "-//W3C//DTD HTML 4.0//EN" && (systemId == null || systemId == "http://www.w3.org/TR/REC-html40/strict.dtd"))
|| (publicId == "-//W3C//DTD HTML 4.01//EN" && (systemId == null || systemId == "http://www.w3.org/TR/html4/strict.dtd"))
|| (publicId == "-//W3C//DTD XHTML 1.0 Strict//EN" && (systemId == "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"))
|| (publicId == "-//W3C//DTD XHTML 1.1//EN" && (systemId == "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"))
) {
} else if (!((systemId == null || systemId == "about:legacy-compat") && publicId == null)) {
tree.parseError("unknown-doctype");
}
}
tree.setInsertionMode('beforeHTML');
function publicIdStartsWith(string) {
return publicId.toLowerCase().indexOf(string) === 0;
}
};
modes.initial.processCharacters = function(buffer) {
buffer.skipLeadingWhitespace();
if (!buffer.length)
return;
tree.parseError('expected-doctype-but-got-chars');
this.anythingElse();
tree.insertionMode.processCharacters(buffer);
};
modes.initial.processStartTag = function(name, attributes, selfClosing) {
tree.parseError('expected-doctype-but-got-start-tag', {name: name});
this.anythingElse();
tree.insertionMode.processStartTag(name, attributes, selfClosing);
};
modes.initial.processEndTag = function(name) {
tree.parseError('expected-doctype-but-got-end-tag', {name: name});
this.anythingElse();
tree.insertionMode.processEndTag(name);
};
modes.initial.anythingElse = function() {
tree.compatMode = 'quirks';
tree.setInsertionMode('beforeHTML');
};
modes.beforeHTML = Object.create(modes.base);
modes.beforeHTML.start_tag_handlers = {
html: 'startTagHtml',
'-default': 'startTagOther'
};
modes.beforeHTML.processEOF = function() {
this.anythingElse();
tree.insertionMode.processEOF();
};
modes.beforeHTML.processComment = function(data) {
tree.insertComment(data, tree.document);
};
modes.beforeHTML.processCharacters = function(buffer) {
buffer.skipLeadingWhitespace();
if (!buffer.length)
return;
this.anythingElse();
tree.insertionMode.processCharacters(buffer);
};
modes.beforeHTML.startTagHtml = function(name, attributes, selfClosing) {
tree.insertHtmlElement(attributes);
tree.setInsertionMode('beforeHead');
};
modes.beforeHTML.startTagOther = function(name, attributes, selfClosing) {
this.anythingElse();
tree.insertionMode.processStartTag(name, attributes, selfClosing);
};
modes.beforeHTML.processEndTag = function(name) {
this.anythingElse();
tree.insertionMode.processEndTag(name);
};
modes.beforeHTML.anythingElse = function() {
tree.insertHtmlElement();
tree.setInsertionMode('beforeHead');
};
modes.afterAfterBody = Object.create(modes.base);
modes.afterAfterBody.start_tag_handlers = {
html: 'startTagHtml',
'-default': 'startTagOther'
};
modes.afterAfterBody.processComment = function(data) {
tree.insertComment(data, tree.document);
};
modes.afterAfterBody.processDoctype = function(data) {
modes.inBody.processDoctype(data);
};
modes.afterAfterBody.startTagHtml = function(data, attributes) {
modes.inBody.startTagHtml(data, attributes);
};
modes.afterAfterBody.startTagOther = function(name, attributes, selfClosing) {
tree.parseError('unexpected-start-tag', {name: name});
tree.setInsertionMode('inBody');
tree.insertionMode.processStartTag(name, attributes, selfClosing);
};
modes.afterAfterBody.endTagOther = function(name) {
tree.parseError('unexpected-end-tag', {name: name});
tree.setInsertionMode('inBody');
tree.insertionMode.processEndTag(name);
};
modes.afterAfterBody.processCharacters = function(data) {
if (!isAllWhitespace(data.characters)) {
tree.parseError('unexpected-char-after-body');
tree.setInsertionMode('inBody');
return tree.insertionMode.processCharacters(data);
}
modes.inBody.processCharacters(data);
};
modes.afterBody = Object.create(modes.base);
modes.afterBody.end_tag_handlers = {
html: 'endTagHtml',
'-default': 'endTagOther'
};
modes.afterBody.processComment = function(data) {
tree.insertComment(data, tree.openElements.rootNode);
};
modes.afterBody.processCharacters = function(data) {
if (!isAllWhitespace(data.characters)) {
tree.parseError('unexpected-char-after-body');
tree.setInsertionMode('inBody');
return tree.insertionMode.processCharacters(data);
}
modes.inBody.processCharacters(data);
};
modes.afterBody.processStartTag = function(name, attributes, selfClosing) {
tree.parseError('unexpected-start-tag-after-body', {name: name});
tree.setInsertionMode('inBody');
tree.insertionMode.processStartTag(name, attributes, selfClosing);
};
modes.afterBody.endTagHtml = function(name) {
if (tree.context) {
tree.parseError('end-html-in-innerhtml');
} else {
tree.setInsertionMode('afterAfterBody');
}
};
modes.afterBody.endTagOther = function(name) {
tree.parseError('unexpected-end-tag-after-body', {name: name});
tree.setInsertionMode('inBody');
tree.insertionMode.processEndTag(name);
};
modes.afterFrameset = Object.create(modes.base);
modes.afterFrameset.start_tag_handlers = {
html: 'startTagHtml',
noframes: 'startTagNoframes',
'-default': 'startTagOther'
};
modes.afterFrameset.end_tag_handlers = {
html: 'endTagHtml',
'-default': 'endTagOther'
};
modes.afterFrameset.processCharacters = function(buffer) {
var characters = buffer.takeRemaining();
var whitespace = "";
for (var i = 0; i < characters.length; i++) {
var ch = characters[i];
if (isWhitespace(ch))
whitespace += ch;
}
if (whitespace) {
tree.insertText(whitespace);
}
if (whitespace.length < characters.length)
tree.parseError('expected-eof-but-got-char');
};
modes.afterFrameset.startTagNoframes = function(name, attributes) {
modes.inHead.processStartTag(name, attributes);
};
modes.afterFrameset.startTagOther = function(name, attributes) {
tree.parseError("unexpected-start-tag-after-frameset", {name: name});
};
modes.afterFrameset.endTagHtml = function(name) {
tree.setInsertionMode('afterAfterFrameset');
};
modes.afterFrameset.endTagOther = function(name) {
tree.parseError("unexpected-end-tag-after-frameset", {name: name});
};
modes.beforeHead = Object.create(modes.base);
modes.beforeHead.start_tag_handlers = {
html: 'startTagHtml',
head: 'startTagHead',
'-default': 'startTagOther'
};
modes.beforeHead.end_tag_handlers = {
html: 'endTagImplyHead',
head: 'endTagImplyHead',
body: 'endTagImplyHead',
br: 'endTagImplyHead',
'-default': 'endTagOther'
};
modes.beforeHead.processEOF = function() {
this.startTagHead('head', []);
tree.insertionMode.processEOF();
};
modes.beforeHead.processCharacters = function(buffer) {
buffer.skipLeadingWhitespace();
if (!buffer.length)
return;
this.startTagHead('head', []);
tree.insertionMode.processCharacters(buffer);
};
modes.beforeHead.startTagHead = function(name, attributes) {
tree.insertHeadElement(attributes);
tree.setInsertionMode('inHead');
};
modes.beforeHead.startTagOther = function(name, attributes, selfClosing) {
this.startTagHead('head', []);
tree.insertionMode.processStartTag(name, attributes, selfClosing);
};
modes.beforeHead.endTagImplyHead = function(name) {
this.startTagHead('head', []);
tree.insertionMode.processEndTag(name);
};
modes.beforeHead.endTagOther = function(name) {
tree.parseError('end-tag-after-implied-root', {name: name});
};
modes.inHead = Object.create(modes.base);
modes.inHead.start_tag_handlers = {
html: 'startTagHtml',
head: 'startTagHead',
title: 'startTagTitle',
script: 'startTagScript',
style: 'startTagNoFramesStyle',
noscript: 'startTagNoScript',
noframes: 'startTagNoFramesStyle',
base: 'startTagBaseBasefontBgsoundLink',
basefont: 'startTagBaseBasefontBgsoundLink',
bgsound: 'startTagBaseBasefontBgsoundLink',
link: 'startTagBaseBasefontBgsoundLink',
meta: 'startTagMeta',
"-default": 'startTagOther'
};
modes.inHead.end_tag_handlers = {
head: 'endTagHead',
html: 'endTagHtmlBodyBr',
body: 'endTagHtmlBodyBr',
br: 'endTagHtmlBodyBr',
"-default": 'endTagOther'
};
modes.inHead.processEOF = function() {
var name = tree.currentStackItem().localName;
if (['title', 'style', 'script'].indexOf(name) != -1) {
tree.parseError("expected-named-closing-tag-but-got-eof", {name: name});
tree.popElement();
}
this.anythingElse();
tree.insertionMode.processEOF();
};
modes.inHead.processCharacters = function(buffer) {
var leadingWhitespace = buffer.takeLeadingWhitespace();
if (leadingWhitespace)
tree.insertText(leadingWhitespace);
if (!buffer.length)
return;
this.anythingElse();
tree.insertionMode.processCharacters(buffer);
};
modes.inHead.startTagHtml = function(name, attributes) {
modes.inBody.processStartTag(name, attributes);
};
modes.inHead.startTagHead = function(name, attributes) {
tree.parseError('two-heads-are-not-better-than-one');
};
modes.inHead.startTagTitle = function(name, attributes) {
tree.processGenericRCDATAStartTag(name, attributes);
};
modes.inHead.startTagNoScript = function(name, attributes) {
if (tree.scriptingEnabled)
return tree.processGenericRawTextStartTag(name, attributes);
tree.insertElement(name, attributes);
tree.setInsertionMode('inHeadNoscript');
};
modes.inHead.startTagNoFramesStyle = function(name, attributes) {
tree.processGenericRawTextStartTag(name, attributes);
};
modes.inHead.startTagScript = function(name, attributes) {
tree.insertElement(name, attributes);
tree.tokenizer.setState(Tokenizer.SCRIPT_DATA);
tree.originalInsertionMode = tree.insertionModeName;
tree.setInsertionMode('text');
};
modes.inHead.startTagBaseBasefontBgsoundLink = function(name, attributes) {
tree.insertSelfClosingElement(name, attributes);
};
modes.inHead.startTagMeta = function(name, attributes) {
tree.insertSelfClosingElement(name, attributes);
};
modes.inHead.startTagOther = function(name, attributes, selfClosing) {
this.anythingElse();
tree.insertionMode.processStartTag(name, attributes, selfClosing);
};
modes.inHead.endTagHead = function(name) {
if (tree.openElements.item(tree.openElements.length - 1).localName == 'head') {
tree.openElements.pop();
} else {
tree.parseError('unexpected-end-tag', {name: 'head'});
}
tree.setInsertionMode('afterHead');
};
modes.inHead.endTagHtmlBodyBr = function(name) {
this.anythingElse();
tree.insertionMode.processEndTag(name);
};
modes.inHead.endTagOther = function(name) {
tree.parseError('unexpected-end-tag', {name: name});
};
modes.inHead.anythingElse = function() {
this.endTagHead('head');
};
modes.afterHead = Object.create(modes.base);
modes.afterHead.start_tag_handlers = {
html: 'startTagHtml',
head: 'startTagHead',
body: 'startTagBody',
frameset: 'startTagFrameset',
base: 'startTagFromHead',
link: 'startTagFromHead',
meta: 'startTagFromHead',
script: 'startTagFromHead',
style: 'startTagFromHead',
title: 'startTagFromHead',
"-default": 'startTagOther'
};
modes.afterHead.end_tag_handlers = {
body: 'endTagBodyHtmlBr',
html: 'endTagBodyHtmlBr',
br: 'endTagBodyHtmlBr',
"-default": 'endTagOther'
};
modes.afterHead.processEOF = function() {
this.anythingElse();
tree.insertionMode.processEOF();
};
modes.afterHead.processCharacters = function(buffer) {
var leadingWhitespace = buffer.takeLeadingWhitespace();
if (leadingWhitespace)
tree.insertText(leadingWhitespace);
if (!buffer.length)
return;
this.anythingElse();
tree.insertionMode.processCharacters(buffer);
};
modes.afterHead.startTagHtml = function(name, attributes) {
modes.inBody.processStartTag(name, attributes);
};
modes.afterHead.startTagBody = function(name, attributes) {
tree.framesetOk = false;
tree.insertBodyElement(attributes);
tree.setInsertionMode('inBody');
};
modes.afterHead.startTagFrameset = function(name, attributes) {
tree.insertElement(name, attributes);
tree.setInsertionMode('inFrameset');
};
modes.afterHead.startTagFromHead = function(name, attributes, selfClosing) {
tree.parseError("unexpected-start-tag-out-of-my-head", {name: name});
tree.openElements.push(tree.head);
modes.inHead.processStartTag(name, attributes, selfClosing);
tree.openElements.remove(tree.head);
};
modes.afterHead.startTagHead = function(name, attributes, selfClosing) {
tree.parseError('unexpected-start-tag', {name: name});
};
modes.afterHead.startTagOther = function(name, attributes, selfClosing) {
this.anythingElse();
tree.insertionMode.processStartTag(name, attributes, selfClosing);
};
modes.afterHead.endTagBodyHtmlBr = function(name) {
this.anythingElse();
tree.insertionMode.processEndTag(name);
};
modes.afterHead.endTagOther = function(name) {
tree.parseError('unexpected-end-tag', {name: name});
};
modes.afterHead.anythingElse = function() {
tree.insertBodyElement([]);
tree.setInsertionMode('inBody');
tree.framesetOk = true;
}
modes.inBody = Object.create(modes.base);
modes.inBody.start_tag_handlers = {
html: 'startTagHtml',
head: 'startTagMisplaced',
base: 'startTagProcessInHead',
basefont: 'startTagProcessInHead',
bgsound: 'startTagProcessInHead',
link: 'startTagProcessInHead',
meta: 'startTagProcessInHead',
noframes: 'startTagProcessInHead',
script: 'startTagProcessInHead',
style: 'startTagProcessInHead',
title: 'startTagProcessInHead',
body: 'startTagBody',
form: 'startTagForm',
plaintext: 'startTagPlaintext',
a: 'startTagA',
button: 'startTagButton',
xmp: 'startTagXmp',
table: 'startTagTable',
hr: 'startTagHr',
image: 'startTagImage',
input: 'startTagInput',
textarea: 'startTagTextarea',
select: 'startTagSelect',
isindex: 'startTagIsindex',
applet: 'startTagAppletMarqueeObject',
marquee: 'startTagAppletMarqueeObject',
object: 'startTagAppletMarqueeObject',
li: 'startTagListItem',
dd: 'startTagListItem',
dt: 'startTagListItem',
address: 'startTagCloseP',
article: 'startTagCloseP',
aside: 'startTagCloseP',
blockquote: 'startTagCloseP',
center: 'startTagCloseP',
details: 'startTagCloseP',
dir: 'startTagCloseP',
div: 'startTagCloseP',
dl: 'startTagCloseP',
fieldset: 'startTagCloseP',
figcaption: 'startTagCloseP',
figure: 'startTagCloseP',
footer: 'startTagCloseP',
header: 'startTagCloseP',
hgroup: 'startTagCloseP',
main: 'startTagCloseP',
menu: 'startTagCloseP',
nav: 'startTagCloseP',
ol: 'startTagCloseP',
p: 'startTagCloseP',
section: 'startTagCloseP',
summary: 'startTagCloseP',
ul: 'startTagCloseP',
listing: 'startTagPreListing',
pre: 'startTagPreListing',
b: 'startTagFormatting',
big: 'startTagFormatting',
code: 'startTagFormatting',
em: 'startTagFormatting',
font: 'startTagFormatting',
i: 'startTagFormatting',
s: 'startTagFormatting',
small: 'startTagFormatting',
strike: 'startTagFormatting',
strong: 'startTagFormatting',
tt: 'startTagFormatting',
u: 'startTagFormatting',
nobr: 'startTagNobr',
area: 'startTagVoidFormatting',
br: 'startTagVoidFormatting',
embed: 'startTagVoidFormatting',
img: 'startTagVoidFormatting',
keygen: 'startTagVoidFormatting',
wbr: 'startTagVoidFormatting',
param: 'startTagParamSourceTrack',
source: 'startTagParamSourceTrack',
track: 'startTagParamSourceTrack',
iframe: 'startTagIFrame',
noembed: 'startTagRawText',
noscript: 'startTagRawText',
h1: 'startTagHeading',
h2: 'startTagHeading',
h3: 'startTagHeading',
h4: 'startTagHeading',
h5: 'startTagHeading',
h6: 'startTagHeading',
caption: 'startTagMisplaced',
col: 'startTagMisplaced',
colgroup: 'startTagMisplaced',
frame: 'startTagMisplaced',
frameset: 'startTagFrameset',
tbody: 'startTagMisplaced',
td: 'startTagMisplaced',
tfoot: 'startTagMisplaced',
th: 'startTagMisplaced',
thead: 'startTagMisplaced',
tr: 'startTagMisplaced',
option: 'startTagOptionOptgroup',
optgroup: 'startTagOptionOptgroup',
math: 'startTagMath',
svg: 'startTagSVG',
rt: 'startTagRpRt',
rp: 'startTagRpRt',
"-default": 'startTagOther'
};
modes.inBody.end_tag_handlers = {
p: 'endTagP',
body: 'endTagBody',
html: 'endTagHtml',
address: 'endTagBlock',
article: 'endTagBlock',
aside: 'endTagBlock',
blockquote: 'endTagBlock',
button: 'endTagBlock',
center: 'endTagBlock',
details: 'endTagBlock',
dir: 'endTagBlock',
div: 'endTagBlock',
dl: 'endTagBlock',
fieldset: 'endTagBlock',
figcaption: 'endTagBlock',
figure: 'endTagBlock',
footer: 'endTagBlock',
header: 'endTagBlock',
hgroup: 'endTagBlock',
listing: 'endTagBlock',
main: 'endTagBlock',
menu: 'endTagBlock',
nav: 'endTagBlock',
ol: 'endTagBlock',
pre: 'endTagBlock',
section: 'endTagBlock',
summary: 'endTagBlock',
ul: 'endTagBlock',
form: 'endTagForm',
applet: 'endTagAppletMarqueeObject',
marquee: 'endTagAppletMarqueeObject',
object: 'endTagAppletMarqueeObject',
dd: 'endTagListItem',
dt: 'endTagListItem',
li: 'endTagListItem',
h1: 'endTagHeading',
h2: 'endTagHeading',
h3: 'endTagHeading',
h4: 'endTagHeading',
h5: 'endTagHeading',
h6: 'endTagHeading',
a: 'endTagFormatting',
b: 'endTagFormatting',
big: 'endTagFormatting',
code: 'endTagFormatting',
em: 'endTagFormatting',
font: 'endTagFormatting',
i: 'endTagFormatting',
nobr: 'endTagFormatting',
s: 'endTagFormatting',
small: 'endTagFormatting',
strike: 'endTagFormatting',
strong: 'endTagFormatting',
tt: 'endTagFormatting',
u: 'endTagFormatting',
br: 'endTagBr',
"-default": 'endTagOther'
};
modes.inBody.processCharacters = function(buffer) {
if (tree.shouldSkipLeadingNewline) {
tree.shouldSkipLeadingNewline = false;
buffer.skipAtMostOneLeadingNewline();
}
tree.reconstructActiveFormattingElements();
var characters = buffer.takeRemaining();
characters = characters.replace(/\u0000/g, function(match, index){
tree.parseError("invalid-codepoint");
return '';
});
if (!characters)
return;
tree.insertText(characters);
if (tree.framesetOk && !isAllWhitespaceOrReplacementCharacters(characters))
tree.framesetOk = false;
};
modes.inBody.startTagHtml = function(name, attributes) {
tree.parseError('non-html-root');
tree.addAttributesToElement(tree.openElements.rootNode, attributes);
};
modes.inBody.startTagProcessInHead = function(name, attributes) {
modes.inHead.processStartTag(name, attributes);
};
modes.inBody.startTagBody = function(name, attributes) {
tree.parseError('unexpected-start-tag', {name: 'body'});
if (tree.openElements.length == 1 ||
tree.openElements.item(1).localName != 'body') {
assert.ok(tree.context);
} else {
tree.framesetOk = false;
tree.addAttributesToElement(tree.openElements.bodyElement, attributes);
}
};
modes.inBody.startTagFrameset = function(name, attributes) {
tree.parseError('unexpected-start-tag', {name: 'frameset'});
if (tree.openElements.length == 1 ||
tree.openElements.item(1).localName != 'body') {
assert.ok(tree.context);
} else if (tree.framesetOk) {
tree.detachFromParent(tree.openElements.bodyElement);
while (tree.openElements.length > 1)
tree.openElements.pop();
tree.insertElement(name, attributes);
tree.setInsertionMode('inFrameset');
}
};
modes.inBody.startTagCloseP = function(name, attributes) {
if (tree.openElements.inButtonScope('p'))
this.endTagP('p');
tree.insertElement(name, attributes);
};
modes.inBody.startTagPreListing = function(name, attributes) {
if (tree.openElements.inButtonScope('p'))
this.endTagP('p');
tree.insertElement(name, attributes);
tree.framesetOk = false;
tree.shouldSkipLeadingNewline = true;
};
modes.inBody.startTagForm = function(name, attributes) {
if (tree.form) {
tree.parseError('unexpected-start-tag', {name: name});
} else {
if (tree.openElements.inButtonScope('p'))
this.endTagP('p');
tree.insertElement(name, attributes);
tree.form = tree.currentStackItem();
}
};
modes.inBody.startTagRpRt = function(name, attributes) {
if (tree.openElements.inScope('ruby')) {
tree.generateImpliedEndTags();
if (tree.currentStackItem().localName != 'ruby') {
tree.parseError('unexpected-start-tag', {name: name});
}
}
tree.insertElement(name, attributes);
};
modes.inBody.startTagListItem = function(name, attributes) {
var stopNames = {li: ['li'], dd: ['dd', 'dt'], dt: ['dd', 'dt']};
var stopName = stopNames[name];
var els = tree.openElements;
for (var i = els.length - 1; i >= 0; i--) {
var node = els.item(i);
if (stopName.indexOf(node.localName) != -1) {
tree.insertionMode.processEndTag(node.localName);
break;
}
if (node.isSpecial() && node.localName !== 'p' && node.localName !== 'address' && node.localName !== 'div')
break;
}
if (tree.openElements.inButtonScope('p'))
this.endTagP('p');
tree.insertElement(name, attributes);
tree.framesetOk = false;
};
modes.inBody.startTagPlaintext = function(name, attributes) {
if (tree.openElements.inButtonScope('p'))
this.endTagP('p');
tree.insertElement(name, attributes);
tree.tokenizer.setState(Tokenizer.PLAINTEXT);
};
modes.inBody.startTagHeading = function(name, attributes) {
if (tree.openElements.inButtonScope('p'))
this.endTagP('p');
if (tree.currentStackItem().isNumberedHeader()) {
tree.parseError('unexpected-start-tag', {name: name});
tree.popElement();
}
tree.insertElement(name, attributes);
};
modes.inBody.startTagA = function(name, attributes) {
var activeA = tree.elementInActiveFormattingElements('a');
if (activeA) {
tree.parseError("unexpected-start-tag-implies-end-tag", {startName: "a", endName: "a"});
tree.adoptionAgencyEndTag('a');
if (tree.openElements.contains(activeA))
tree.openElements.remove(activeA);
tree.removeElementFromActiveFormattingElements(activeA);
}
tree.reconstructActiveFormattingElements();
tree.insertFormattingElement(name, attributes);
};
modes.inBody.startTagFormatting = function(name, attributes) {
tree.reconstructActiveFormattingElements();
tree.insertFormattingElement(name, attributes);
};
modes.inBody.startTagNobr = function(name, attributes) {
tree.reconstructActiveFormattingElements();
if (tree.openElements.inScope('nobr')) {
tree.parseError("unexpected-start-tag-implies-end-tag", {startName: 'nobr', endName: 'nobr'});
this.processEndTag('nobr');
tree.reconstructActiveFormattingElements();
}
tree.insertFormattingElement(name, attributes);
};
modes.inBody.startTagButton = function(name, attributes) {
if (tree.openElements.inScope('button')) {
tree.parseError('unexpected-start-tag-implies-end-tag', {startName: 'button', endName: 'button'});
this.processEndTag('button');
tree.insertionMode.processStartTag(name, attributes);
} else {
tree.framesetOk = false;
tree.reconstructActiveFormattingElements();
tree.insertElement(name, attributes);
}
};
modes.inBody.startTagAppletMarqueeObject = function(name, attributes) {
tree.reconstructActiveFormattingElements();
tree.insertElement(name, attributes);
tree.activeFormattingElements.push(Marker);
tree.framesetOk = false;
};
modes.inBody.endTagAppletMarqueeObject = function(name) {
if (!tree.openElements.inScope(name)) {
tree.parseError("unexpected-end-tag", {name: name});
} else {
tree.generateImpliedEndTags();
if (tree.currentStackItem().localName != name) {
tree.parseError('end-tag-too-early', {name: name});
}
tree.openElements.popUntilPopped(name);
tree.clearActiveFormattingElements();
}
};
modes.inBody.startTagXmp = function(name, attributes) {
if (tree.openElements.inButtonScope('p'))
this.processEndTag('p');
tree.reconstructActiveFormattingElements();
tree.processGenericRawTextStartTag(name, attributes);
tree.framesetOk = false;
};
modes.inBody.startTagTable = function(name, attributes) {
if (tree.compatMode !== "quirks")
if (tree.openElements.inButtonScope('p'))
this.processEndTag('p');
tree.insertElement(name, attributes);
tree.setInsertionMode('inTable');
tree.framesetOk = false;
};
modes.inBody.startTagVoidFormatting = function(name, attributes) {
tree.reconstructActiveFormattingElements();
tree.insertSelfClosingElement(name, attributes);
tree.framesetOk = false;
};
modes.inBody.startTagParamSourceTrack = function(name, attributes) {
tree.insertSelfClosingElement(name, attributes);
};
modes.inBody.startTagHr = function(name, attributes) {
if (tree.openElements.inButtonScope('p'))
this.endTagP('p');
tree.insertSelfClosingElement(name, attributes);
tree.framesetOk = false;
};
modes.inBody.startTagImage = function(name, attributes) {
tree.parseError('unexpected-start-tag-treated-as', {originalName: 'image', newName: 'img'});
this.processStartTag('img', attributes);
};
modes.inBody.startTagInput = function(name, attributes) {
var currentFramesetOk = tree.framesetOk;
this.startTagVoidFormatting(name, attributes);
for (var key in attributes) {
if (attributes[key].nodeName == 'type') {
if (attributes[key].nodeValue.toLowerCase() == 'hidden')
tree.framesetOk = currentFramesetOk;
break;
}
}
};
modes.inBody.startTagIsindex = function(name, attributes) {
tree.parseError('deprecated-tag', {name: 'isindex'});
tree.selfClosingFlagAcknowledged = true;
if (tree.form)
return;
var formAttributes = [];
var inputAttributes = [];
var prompt = "This is a searchable index. Enter search keywords: ";
for (var key in attributes) {
switch (attributes[key].nodeName) {
case 'action':
formAttributes.push({nodeName: 'action',
nodeValue: attributes[key].nodeValue});
break;
case 'prompt':
prompt = attributes[key].nodeValue;
break;
case 'name':
break;
default:
inputAttributes.push({nodeName: attributes[key].nodeName,
nodeValue: attributes[key].nodeValue});
}
}
inputAttributes.push({nodeName: 'name', nodeValue: 'isindex'});
this.processStartTag('form', formAttributes);
this.processStartTag('hr');
this.processStartTag('label');
this.processCharacters(new CharacterBuffer(prompt));
this.processStartTag('input', inputAttributes);
this.processEndTag('label');
this.processStartTag('hr');
this.processEndTag('form');
};
modes.inBody.startTagTextarea = function(name, attributes) {
tree.insertElement(name, attributes);
tree.tokenizer.setState(Tokenizer.RCDATA);
tree.originalInsertionMode = tree.insertionModeName;
tree.shouldSkipLeadingNewline = true;
tree.framesetOk = false;
tree.setInsertionMode('text');
};
modes.inBody.startTagIFrame = function(name, attributes) {
tree.framesetOk = false;
this.startTagRawText(name, attributes);
};
modes.inBody.startTagRawText = function(name, attributes) {
tree.processGenericRawTextStartTag(name, attributes);
};
modes.inBody.startTagSelect = function(name, attributes) {
tree.reconstructActiveFormattingElements();
tree.insertElement(name, attributes);
tree.framesetOk = false;
var insertionModeName = tree.insertionModeName;
if (insertionModeName == 'inTable' ||
insertionModeName == 'inCaption' ||
insertionModeName == 'inColumnGroup' ||
insertionModeName == 'inTableBody' ||
insertionModeName == 'inRow' ||
insertionModeName == 'inCell') {
tree.setInsertionMode('inSelectInTable');
} else {
tree.setInsertionMode('inSelect');
}
};
modes.inBody.startTagMisplaced = function(name, attributes) {
tree.parseError('unexpected-start-tag-ignored', {name: name});
};
modes.inBody.endTagMisplaced = function(name) {
tree.parseError("unexpected-end-tag", {name: name});
};
modes.inBody.endTagBr = function(name) {
tree.parseError("unexpected-end-tag-treated-as", {originalName: "br", newName: "br element"});
tree.reconstructActiveFormattingElements();
tree.insertElement(name, []);
tree.popElement();
};
modes.inBody.startTagOptionOptgroup = function(name, attributes) {
if (tree.currentStackItem().localName == 'option')
tree.popElement();
tree.reconstructActiveFormattingElements();
tree.insertElement(name, attributes);
};
modes.inBody.startTagOther = function(name, attributes) {
tree.reconstructActiveFormattingElements();
tree.insertElement(name, attributes);
};
modes.inBody.endTagOther = function(name) {
var node;
for (var i = tree.openElements.length - 1; i > 0; i--) {
node = tree.openElements.item(i);
if (node.localName == name) {
tree.generateImpliedEndTags(name);
if (tree.currentStackItem().localName != name)
tree.parseError('unexpected-end-tag', {name: name});
tree.openElements.remove_openElements_until(function(x) {return x === node;});
break;
}
if (node.isSpecial()) {
tree.parseError('unexpected-end-tag', {name: name});
break;
}
}
};
modes.inBody.startTagMath = function(name, attributes, selfClosing) {
tree.reconstructActiveFormattingElements();
attributes = tree.adjustMathMLAttributes(attributes);
attributes = tree.adjustForeignAttributes(attributes);
tree.insertForeignElement(name, attributes, "http://www.w3.org/1998/Math/MathML", selfClosing);
};
modes.inBody.startTagSVG = function(name, attributes, selfClosing) {
tree.reconstructActiveFormattingElements();
attributes = tree.adjustSVGAttributes(attributes);
attributes = tree.adjustForeignAttributes(attributes);
tree.insertForeignElement(name, attributes, "http://www.w3.org/2000/svg", selfClosing);
};
modes.inBody.endTagP = function(name) {
if (!tree.openElements.inButtonScope('p')) {
tree.parseError('unexpected-end-tag', {name: 'p'});
this.startTagCloseP('p', []);
this.endTagP('p');
} else {
tree.generateImpliedEndTags('p');
if (tree.currentStackItem().localName != 'p')
tree.parseError('unexpected-implied-end-tag', {name: 'p'});
tree.openElements.popUntilPopped(name);
}
};
modes.inBody.endTagBody = function(name) {
if (!tree.openElements.inScope('body')) {
tree.parseError('unexpected-end-tag', {name: name});
return;
}
if (tree.currentStackItem().localName != 'body') {
tree.parseError('expected-one-end-tag-but-got-another', {
expectedName: tree.currentStackItem().localName,
gotName: name
});
}
tree.setInsertionMode('afterBody');
};
modes.inBody.endTagHtml = function(name) {
if (!tree.openElements.inScope('body')) {
tree.parseError('unexpected-end-tag', {name: name});
return;
}
if (tree.currentStackItem().localName != 'body') {
tree.parseError('expected-one-end-tag-but-got-another', {
expectedName: tree.currentStackItem().localName,
gotName: name
});
}
tree.setInsertionMode('afterBody');
tree.insertionMode.processEndTag(name);
};
modes.inBody.endTagBlock = function(name) {
if (!tree.openElements.inScope(name)) {
tree.parseError('unexpected-end-tag', {name: name});
} else {
tree.generateImpliedEndTags();
if (tree.currentStackItem().localName != name) {
tree.parseError('end-tag-too-early', {name: name});
}
tree.openElements.popUntilPopped(name);
}
};
modes.inBody.endTagForm = function(name) {
var node = tree.form;
tree.form = null;
if (!node || !tree.openElements.inScope(name)) {
tree.parseError('unexpected-end-tag', {name: name});
} else {
tree.generateImpliedEndTags();
if (tree.currentStackItem() != node) {
tree.parseError('end-tag-too-early-ignored', {name: 'form'});
}
tree.openElements.remove(node);
}
};
modes.inBody.endTagListItem = function(name) {
if (!tree.openElements.inListItemScope(name)) {
tree.parseError('unexpected-end-tag', {name: name});
} else {
tree.generateImpliedEndTags(name);
if (tree.currentStackItem().localName != name)
tree.parseError('end-tag-too-early', {name: name});
tree.openElements.popUntilPopped(name);
}
};
modes.inBody.endTagHeading = function(name) {
if (!tree.openElements.hasNumberedHeaderElementInScope()) {
tree.parseError('unexpected-end-tag', {name: name});
return;
}
tree.generateImpliedEndTags();
if (tree.currentStackItem().localName != name)
tree.parseError('end-tag-too-early', {name: name});
tree.openElements.remove_openElements_until(function(e) {
return e.isNumberedHeader();
});
};
modes.inBody.endTagFormatting = function(name, attributes) {
if (!tree.adoptionAgencyEndTag(name))
this.endTagOther(name, attributes);
};
modes.inCaption = Object.create(modes.base);
modes.inCaption.start_tag_handlers = {
html: 'startTagHtml',
caption: 'startTagTableElement',
col: 'startTagTableElement',
colgroup: 'startTagTableElement',
tbody: 'startTagTableElement',
td: 'startTagTableElement',
tfoot: 'startTagTableElement',
thead: 'startTagTableElement',
tr: 'startTagTableElement',
'-default': 'startTagOther'
};
modes.inCaption.end_tag_handlers = {
caption: 'endTagCaption',
table: 'endTagTable',
body: 'endTagIgnore',
col: 'endTagIgnore',
colgroup: 'endTagIgnore',
html: 'endTagIgnore',
tbody: 'endTagIgnore',
td: 'endTagIgnore',
tfood: 'endTagIgnore',
thead: 'endTagIgnore',
tr: 'endTagIgnore',
'-default': 'endTagOther'
};
modes.inCaption.processCharacters = function(data) {
modes.inBody.processCharacters(data);
};
modes.inCaption.startTagTableElement = function(name, attributes) {
tree.parseError('unexpected-end-tag', {name: name});
var ignoreEndTag = !tree.openElements.inTableScope('caption');
tree.insertionMode.processEndTag('caption');
if (!ignoreEndTag) tree.insertionMode.processStartTag(name, attributes);
};
modes.inCaption.startTagOther = function(name, attributes, selfClosing) {
modes.inBody.processStartTag(name, attributes, selfClosing);
};
modes.inCaption.endTagCaption = function(name) {
if (!tree.openElements.inTableScope('caption')) {
assert.ok(tree.context);
tree.parseError('unexpected-end-tag', {name: name});
} else {
tree.generateImpliedEndTags();
if (tree.currentStackItem().localName != 'caption') {
tree.parseError('expected-one-end-tag-but-got-another', {
gotName: "caption",
expectedName: tree.currentStackItem().localName
});
}
tree.openElements.popUntilPopped('caption');
tree.clearActiveFormattingElements();
tree.setInsertionMode('inTable');
}
};
modes.inCaption.endTagTable = function(name) {
tree.parseError("unexpected-end-table-in-caption");
var ignoreEndTag = !tree.openElements.inTableScope('caption');
tree.insertionMode.processEndTag('caption');
if (!ignoreEndTag) tree.insertionMode.processEndTag(name);
};
modes.inCaption.endTagIgnore = function(name) {
tree.parseError('unexpected-end-tag', {name: name});
};
modes.inCaption.endTagOther = function(name) {
modes.inBody.processEndTag(name);
};
modes.inCell = Object.create(modes.base);
modes.inCell.start_tag_handlers = {
html: 'startTagHtml',
caption: 'startTagTableOther',
col: 'startTagTableOther',
colgroup: 'startTagTableOther',
tbody: 'startTagTableOther',
td: 'startTagTableOther',
tfoot: 'startTagTableOther',
th: 'startTagTableOther',
thead: 'startTagTableOther',
tr: 'startTagTableOther',
'-default': 'startTagOther'
};
modes.inCell.end_tag_handlers = {
td: 'endTagTableCell',
th: 'endTagTableCell',
body: 'endTagIgnore',
caption: 'endTagIgnore',
col: 'endTagIgnore',
colgroup: 'endTagIgnore',
html: 'endTagIgnore',
table: 'endTagImply',
tbody: 'endTagImply',
tfoot: 'endTagImply',
thead: 'endTagImply',
tr: 'endTagImply',
'-default': 'endTagOther'
};
modes.inCell.processCharacters = function(data) {
modes.inBody.processCharacters(data);
};
modes.inCell.startTagTableOther = function(name, attributes, selfClosing) {
if (tree.openElements.inTableScope('td') || tree.openElements.inTableScope('th')) {
this.closeCell();
tree.insertionMode.processStartTag(name, attributes, selfClosing);
} else {
tree.parseError('unexpected-start-tag', {name: name});
}
};
modes.inCell.startTagOther = function(name, attributes, selfClosing) {
modes.inBody.processStartTag(name, attributes, selfClosing);
};
modes.inCell.endTagTableCell = function(name) {
if (tree.openElements.inTableScope(name)) {
tree.generateImpliedEndTags(name);
if (tree.currentStackItem().localName != name.toLowerCase()) {
tree.parseError('unexpected-cell-end-tag', {name: name});
tree.openElements.popUntilPopped(name);
} else {
tree.popElement();
}
tree.clearActiveFormattingElements();
tree.setInsertionMode('inRow');
} else {
tree.parseError('unexpected-end-tag', {name: name});
}
};
modes.inCell.endTagIgnore = function(name) {
tree.parseError('unexpected-end-tag', {name: name});
};
modes.inCell.endTagImply = function(name) {
if (tree.openElements.inTableScope(name)) {
this.closeCell();
tree.insertionMode.processEndTag(name);
} else {
tree.parseError('unexpected-end-tag', {name: name});
}
};
modes.inCell.endTagOther = function(name) {
modes.inBody.processEndTag(name);
};
modes.inCell.closeCell = function() {
if (tree.openElements.inTableScope('td')) {
this.endTagTableCell('td');
} else if (tree.openElements.inTableScope('th')) {
this.endTagTableCell('th');
}
};
modes.inColumnGroup = Object.create(modes.base);
modes.inColumnGroup.start_tag_handlers = {
html: 'startTagHtml',
col: 'startTagCol',
'-default': 'startTagOther'
};
modes.inColumnGroup.end_tag_handlers = {
colgroup: 'endTagColgroup',
col: 'endTagCol',
'-default': 'endTagOther'
};
modes.inColumnGroup.ignoreEndTagColgroup = function() {
return tree.currentStackItem().localName == 'html';
};
modes.inColumnGroup.processCharacters = function(buffer) {
var leadingWhitespace = buffer.takeLeadingWhitespace();
if (leadingWhitespace)
tree.insertText(leadingWhitespace);
if (!buffer.length)
return;
var ignoreEndTag = this.ignoreEndTagColgroup();
this.endTagColgroup('colgroup');
if (!ignoreEndTag) tree.insertionMode.processCharacters(buffer);
};
modes.inColumnGroup.startTagCol = function(name, attributes) {
tree.insertSelfClosingElement(name, attributes);
};
modes.inColumnGroup.startTagOther = function(name, attributes, selfClosing) {
var ignoreEndTag = this.ignoreEndTagColgroup();
this.endTagColgroup('colgroup');
if (!ignoreEndTag) tree.insertionMode.processStartTag(name, attributes, selfClosing);
};
modes.inColumnGroup.endTagColgroup = function(name) {
if (this.ignoreEndTagColgroup()) {
assert.ok(tree.context);
tree.parseError('unexpected-end-tag', {name: name});
} else {
tree.popElement();
tree.setInsertionMode('inTable');
}
};
modes.inColumnGroup.endTagCol = function(name) {
tree.parseError("no-end-tag", {name: 'col'});
};
modes.inColumnGroup.endTagOther = function(name) {
var ignoreEndTag = this.ignoreEndTagColgroup();
this.endTagColgroup('colgroup');
if (!ignoreEndTag) tree.insertionMode.processEndTag(name) ;
};
modes.inForeignContent = Object.create(modes.base);
modes.inForeignContent.processStartTag = function(name, attributes, selfClosing) {
if (['b', 'big', 'blockquote', 'body', 'br', 'center', 'code', 'dd', 'div', 'dl', 'dt', 'em', 'embed', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'hr', 'i', 'img', 'li', 'listing', 'menu', 'meta', 'nobr', 'ol', 'p', 'pre', 'ruby', 's', 'small', 'span', 'strong', 'strike', 'sub', 'sup', 'table', 'tt', 'u', 'ul', 'var'].indexOf(name) != -1
|| (name == 'font' && attributes.some(function(attr){ return ['color', 'face', 'size'].indexOf(attr.nodeName) >= 0 }))) {
tree.parseError('unexpected-html-element-in-foreign-content', {name: name});
while (tree.currentStackItem().isForeign()
&& !tree.currentStackItem().isHtmlIntegrationPoint()
&& !tree.currentStackItem().isMathMLTextIntegrationPoint()) {
tree.openElements.pop();
}
tree.insertionMode.processStartTag(name, attributes, selfClosing);
return;
}
if (tree.currentStackItem().namespaceURI == "http://www.w3.org/1998/Math/MathML") {
attributes = tree.adjustMathMLAttributes(attributes);
}
if (tree.currentStackItem().namespaceURI == "http://www.w3.org/2000/svg") {
name = tree.adjustSVGTagNameCase(name);
attributes = tree.adjustSVGAttributes(attributes);
}
attributes = tree.adjustForeignAttributes(attributes);
tree.insertForeignElement(name, attributes, tree.currentStackItem().namespaceURI, selfClosing);
};
modes.inForeignContent.processEndTag = function(name) {
var node = tree.currentStackItem();
var index = tree.openElements.length - 1;
if (node.localName.toLowerCase() != name)
tree.parseError("unexpected-end-tag", {name: name});
while (true) {
if (index === 0)
break;
if (node.localName.toLowerCase() == name) {
while (tree.openElements.pop() != node);
break;
}
index -= 1;
node = tree.openElements.item(index);
if (node.isForeign()) {
continue;
} else {
tree.insertionMode.processEndTag(name);
break;
}
}
};
modes.inForeignContent.processCharacters = function(buffer) {
var characters = buffer.takeRemaining();
characters = characters.replace(/\u0000/g, function(match, index){
tree.parseError('invalid-codepoint');
return '\uFFFD';
});
if (tree.framesetOk && !isAllWhitespaceOrReplacementCharacters(characters))
tree.framesetOk = false;
tree.insertText(characters);
};
modes.inHeadNoscript = Object.create(modes.base);
modes.inHeadNoscript.start_tag_handlers = {
html: 'startTagHtml',
basefont: 'startTagBasefontBgsoundLinkMetaNoframesStyle',
bgsound: 'startTagBasefontBgsoundLinkMetaNoframesStyle',
link: 'startTagBasefontBgsoundLinkMetaNoframesStyle',
meta: 'startTagBasefontBgsoundLinkMetaNoframesStyle',
noframes: 'startTagBasefontBgsoundLinkMetaNoframesStyle',
style: 'startTagBasefontBgsoundLinkMetaNoframesStyle',
head: 'startTagHeadNoscript',
noscript: 'startTagHeadNoscript',
"-default": 'startTagOther'
};
modes.inHeadNoscript.end_tag_handlers = {
noscript: 'endTagNoscript',
br: 'endTagBr',
'-default': 'endTagOther'
};
modes.inHeadNoscript.processCharacters = function(buffer) {
var leadingWhitespace = buffer.takeLeadingWhitespace();
if (leadingWhitespace)
tree.insertText(leadingWhitespace);
if (!buffer.length)
return;
tree.parseError("unexpected-char-in-frameset");
this.anythingElse();
tree.insertionMode.processCharacters(buffer);
};
modes.inHeadNoscript.processComment = function(data) {
modes.inHead.processComment(data);
};
modes.inHeadNoscript.startTagBasefontBgsoundLinkMetaNoframesStyle = function(name, attributes) {
modes.inHead.processStartTag(name, attributes);
};
modes.inHeadNoscript.startTagHeadNoscript = function(name, attributes) {
tree.parseError("unexpected-start-tag-in-frameset", {name: name});
};
modes.inHeadNoscript.startTagOther = function(name, attributes) {
tree.parseError("unexpected-start-tag-in-frameset", {name: name});
this.anythingElse();
tree.insertionMode.processStartTag(name, attributes);
};
modes.inHeadNoscript.endTagBr = function(name, attributes) {
tree.parseError("unexpected-end-tag-in-frameset", {name: name});
this.anythingElse();
tree.insertionMode.processEndTag(name, attributes);
};
modes.inHeadNoscript.endTagNoscript = function(name, attributes) {
tree.popElement();
tree.setInsertionMode('inHead');
};
modes.inHeadNoscript.endTagOther = function(name, attributes) {
tree.parseError("unexpected-end-tag-in-frameset", {name: name});
};
modes.inHeadNoscript.anythingElse = function() {
tree.popElement();
tree.setInsertionMode('inHead');
};
modes.inFrameset = Object.create(modes.base);
modes.inFrameset.start_tag_handlers = {
html: 'startTagHtml',
frameset: 'startTagFrameset',
frame: 'startTagFrame',
noframes: 'startTagNoframes',
"-default": 'startTagOther'
};
modes.inFrameset.end_tag_handlers = {
frameset: 'endTagFrameset',
noframes: 'endTagNoframes',
'-default': 'endTagOther'
};
modes.inFrameset.processCharacters = function(data) {
tree.parseError("unexpected-char-in-frameset");
};
modes.inFrameset.startTagFrameset = function(name, attributes) {
tree.insertElement(name, attributes);
};
modes.inFrameset.startTagFrame = function(name, attributes) {
tree.insertSelfClosingElement(name, attributes);
};
modes.inFrameset.startTagNoframes = function(name, attributes) {
modes.inBody.processStartTag(name, attributes);
};
modes.inFrameset.startTagOther = function(name, attributes) {
tree.parseError("unexpected-start-tag-in-frameset", {name: name});
};
modes.inFrameset.endTagFrameset = function(name, attributes) {
if (tree.currentStackItem().localName == 'html') {
tree.parseError("unexpected-frameset-in-frameset-innerhtml");
} else {
tree.popElement();
}
if (!tree.context && tree.currentStackItem().localName != 'frameset') {
tree.setInsertionMode('afterFrameset');
}
};
modes.inFrameset.endTagNoframes = function(name) {
modes.inBody.processEndTag(name);
};
modes.inFrameset.endTagOther = function(name) {
tree.parseError("unexpected-end-tag-in-frameset", {name: name});
};
modes.inTable = Object.create(modes.base);
modes.inTable.start_tag_handlers = {
html: 'startTagHtml',
caption: 'startTagCaption',
colgroup: 'startTagColgroup',
col: 'startTagCol',
table: 'startTagTable',
tbody: 'startTagRowGroup',
tfoot: 'startTagRowGroup',
thead: 'startTagRowGroup',
td: 'startTagImplyTbody',
th: 'startTagImplyTbody',
tr: 'startTagImplyTbody',
style: 'startTagStyleScript',
script: 'startTagStyleScript',
input: 'startTagInput',
form: 'startTagForm',
'-default': 'startTagOther'
};
modes.inTable.end_tag_handlers = {
table: 'endTagTable',
body: 'endTagIgnore',
caption: 'endTagIgnore',
col: 'endTagIgnore',
colgroup: 'endTagIgnore',
html: 'endTagIgnore',
tbody: 'endTagIgnore',
td: 'endTagIgnore',
tfoot: 'endTagIgnore',
th: 'endTagIgnore',
thead: 'endTagIgnore',
tr: 'endTagIgnore',
'-default': 'endTagOther'
};
modes.inTable.processCharacters = function(data) {
if (tree.currentStackItem().isFosterParenting()) {
var originalInsertionMode = tree.insertionModeName;
tree.setInsertionMode('inTableText');
tree.originalInsertionMode = originalInsertionMode;
tree.insertionMode.processCharacters(data);
} else {
tree.redirectAttachToFosterParent = true;
modes.inBody.processCharacters(data);
tree.redirectAttachToFosterParent = false;
}
};
modes.inTable.startTagCaption = function(name, attributes) {
tree.openElements.popUntilTableScopeMarker();
tree.activeFormattingElements.push(Marker);
tree.insertElement(name, attributes);
tree.setInsertionMode('inCaption');
};
modes.inTable.startTagColgroup = function(name, attributes) {
tree.openElements.popUntilTableScopeMarker();
tree.insertElement(name, attributes);
tree.setInsertionMode('inColumnGroup');
};
modes.inTable.startTagCol = function(name, attributes) {
this.startTagColgroup('colgroup', []);
tree.insertionMode.processStartTag(name, attributes);
};
modes.inTable.startTagRowGroup = function(name, attributes) {
tree.openElements.popUntilTableScopeMarker();
tree.insertElement(name, attributes);
tree.setInsertionMode('inTableBody');
};
modes.inTable.startTagImplyTbody = function(name, attributes) {
this.startTagRowGroup('tbody', []);
tree.insertionMode.processStartTag(name, attributes);
};
modes.inTable.startTagTable = function(name, attributes) {
tree.parseError("unexpected-start-tag-implies-end-tag",
{startName: "table", endName: "table"});
tree.insertionMode.processEndTag('table');
if (!tree.context) tree.insertionMode.processStartTag(name, attributes);
};
modes.inTable.startTagStyleScript = function(name, attributes) {
modes.inHead.processStartTag(name, attributes);
};
modes.inTable.startTagInput = function(name, attributes) {
for (var key in attributes) {
if (attributes[key].nodeName.toLowerCase() == 'type') {
if (attributes[key].nodeValue.toLowerCase() == 'hidden') {
tree.parseError("unexpected-hidden-input-in-table");
tree.insertElement(name, attributes);
tree.openElements.pop();
return;
}
break;
}
}
this.startTagOther(name, attributes);
};
modes.inTable.startTagForm = function(name, attributes) {
tree.parseError("unexpected-form-in-table");
if (!tree.form) {
tree.insertElement(name, attributes);
tree.form = tree.currentStackItem();
tree.openElements.pop();
}
};
modes.inTable.startTagOther = function(name, attributes, selfClosing) {
tree.parseError("unexpected-start-tag-implies-table-voodoo", {name: name});
tree.redirectAttachToFosterParent = true;
modes.inBody.processStartTag(name, attributes, selfClosing);
tree.redirectAttachToFosterParent = false;
};
modes.inTable.endTagTable = function(name) {
if (tree.openElements.inTableScope(name)) {
tree.generateImpliedEndTags();
if (tree.currentStackItem().localName != name) {
tree.parseError("end-tag-too-early-named", {gotName: 'table', expectedName: tree.currentStackItem().localName});
}
tree.openElements.popUntilPopped('table');
tree.resetInsertionMode();
} else {
assert.ok(tree.context);
tree.parseError('unexpected-end-tag', {name: name});
}
};
modes.inTable.endTagIgnore = function(name) {
tree.parseError("unexpected-end-tag", {name: name});
};
modes.inTable.endTagOther = function(name) {
tree.parseError("unexpected-end-tag-implies-table-voodoo", {name: name});
tree.redirectAttachToFosterParent = true;
modes.inBody.processEndTag(name);
tree.redirectAttachToFosterParent = false;
};
modes.inTableText = Object.create(modes.base);
modes.inTableText.flushCharacters = function() {
var characters = tree.pendingTableCharacters.join('');
if (!isAllWhitespace(characters)) {
tree.redirectAttachToFosterParent = true;
tree.reconstructActiveFormattingElements();
tree.insertText(characters);
tree.framesetOk = false;
tree.redirectAttachToFosterParent = false;
} else {
tree.insertText(characters);
}
tree.pendingTableCharacters = [];
};
modes.inTableText.processComment = function(data) {
this.flushCharacters();
tree.setInsertionMode(tree.originalInsertionMode);
tree.insertionMode.processComment(data);
};
modes.inTableText.processEOF = function(data) {
this.flushCharacters();
tree.setInsertionMode(tree.originalInsertionMode);
tree.insertionMode.processEOF();
};
modes.inTableText.processCharacters = function(buffer) {
var characters = buffer.takeRemaining();
characters = characters.replace(/\u0000/g, function(match, index){
tree.parseError("invalid-codepoint");
return '';
});
if (!characters)
return;
tree.pendingTableCharacters.push(characters);
};
modes.inTableText.processStartTag = function(name, attributes, selfClosing) {
this.flushCharacters();
tree.setInsertionMode(tree.originalInsertionMode);
tree.insertionMode.processStartTag(name, attributes, selfClosing);
};
modes.inTableText.processEndTag = function(name, attributes) {
this.flushCharacters();
tree.setInsertionMode(tree.originalInsertionMode);
tree.insertionMode.processEndTag(name, attributes);
};
modes.inTableBody = Object.create(modes.base);
modes.inTableBody.start_tag_handlers = {
html: 'startTagHtml',
tr: 'startTagTr',
td: 'startTagTableCell',
th: 'startTagTableCell',
caption: 'startTagTableOther',
col: 'startTagTableOther',
colgroup: 'startTagTableOther',
tbody: 'startTagTableOther',
tfoot: 'startTagTableOther',
thead: 'startTagTableOther',
'-default': 'startTagOther'
};
modes.inTableBody.end_tag_handlers = {
table: 'endTagTable',
tbody: 'endTagTableRowGroup',
tfoot: 'endTagTableRowGroup',
thead: 'endTagTableRowGroup',
body: 'endTagIgnore',
caption: 'endTagIgnore',
col: 'endTagIgnore',
colgroup: 'endTagIgnore',
html: 'endTagIgnore',
td: 'endTagIgnore',
th: 'endTagIgnore',
tr: 'endTagIgnore',
'-default': 'endTagOther'
};
modes.inTableBody.processCharacters = function(data) {
modes.inTable.processCharacters(data);
};
modes.inTableBody.startTagTr = function(name, attributes) {
tree.openElements.popUntilTableBodyScopeMarker();
tree.insertElement(name, attributes);
tree.setInsertionMode('inRow');
};
modes.inTableBody.startTagTableCell = function(name, attributes) {
tree.parseError("unexpected-cell-in-table-body", {name: name});
this.startTagTr('tr', []);
tree.insertionMode.processStartTag(name, attributes);
};
modes.inTableBody.startTagTableOther = function(name, attributes) {
if (tree.openElements.inTableScope('tbody') || tree.openElements.inTableScope('thead') || tree.openElements.inTableScope('tfoot')) {
tree.openElements.popUntilTableBodyScopeMarker();
this.endTagTableRowGroup(tree.currentStackItem().localName);
tree.insertionMode.processStartTag(name, attributes);
} else {
tree.parseError('unexpected-start-tag', {name: name});
}
};
modes.inTableBody.startTagOther = function(name, attributes) {
modes.inTable.processStartTag(name, attributes);
};
modes.inTableBody.endTagTableRowGroup = function(name) {
if (tree.openElements.inTableScope(name)) {
tree.openElements.popUntilTableBodyScopeMarker();
tree.popElement();
tree.setInsertionMode('inTable');
} else {
tree.parseError('unexpected-end-tag-in-table-body', {name: name});
}
};
modes.inTableBody.endTagTable = function(name) {
if (tree.openElements.inTableScope('tbody') || tree.openElements.inTableScope('thead') || tree.openElements.inTableScope('tfoot')) {
tree.openElements.popUntilTableBodyScopeMarker();
this.endTagTableRowGroup(tree.currentStackItem().localName);
tree.insertionMode.processEndTag(name);
} else {
tree.parseError('unexpected-end-tag', {name: name});
}
};
modes.inTableBody.endTagIgnore = function(name) {
tree.parseError("unexpected-end-tag-in-table-body", {name: name});
};
modes.inTableBody.endTagOther = function(name) {
modes.inTable.processEndTag(name);
};
modes.inSelect = Object.create(modes.base);
modes.inSelect.start_tag_handlers = {
html: 'startTagHtml',
option: 'startTagOption',
optgroup: 'startTagOptgroup',
select: 'startTagSelect',
input: 'startTagInput',
keygen: 'startTagInput',
textarea: 'startTagInput',
script: 'startTagScript',
'-default': 'startTagOther'
};
modes.inSelect.end_tag_handlers = {
option: 'endTagOption',
optgroup: 'endTagOptgroup',
select: 'endTagSelect',
caption: 'endTagTableElements',
table: 'endTagTableElements',
tbody: 'endTagTableElements',
tfoot: 'endTagTableElements',
thead: 'endTagTableElements',
tr: 'endTagTableElements',
td: 'endTagTableElements',
th: 'endTagTableElements',
'-default': 'endTagOther'
};
modes.inSelect.processCharacters = function(buffer) {
var data = buffer.takeRemaining();
data = data.replace(/\u0000/g, function(match, index){
tree.parseError("invalid-codepoint");
return '';
});
if (!data)
return;
tree.insertText(data);
};
modes.inSelect.startTagOption = function(name, attributes) {
if (tree.currentStackItem().localName == 'option')
tree.popElement();
tree.insertElement(name, attributes);
};
modes.inSelect.startTagOptgroup = function(name, attributes) {
if (tree.currentStackItem().localName == 'option')
tree.popElement();
if (tree.currentStackItem().localName == 'optgroup')
tree.popElement();
tree.insertElement(name, attributes);
};
modes.inSelect.endTagOption = function(name) {
if (tree.currentStackItem().localName !== 'option') {
tree.parseError('unexpected-end-tag-in-select', {name: name});
return;
}
tree.popElement();
};
modes.inSelect.endTagOptgroup = function(name) {
if (tree.currentStackItem().localName == 'option' && tree.openElements.item(tree.openElements.length - 2).localName == 'optgroup') {
tree.popElement();
}
if (tree.currentStackItem().localName == 'optgroup') {
tree.popElement();
} else {
tree.parseError('unexpected-end-tag-in-select', {name: 'optgroup'});
}
};
modes.inSelect.startTagSelect = function(name) {
tree.parseError("unexpected-select-in-select");
this.endTagSelect('select');
};
modes.inSelect.endTagSelect = function(name) {
if (tree.openElements.inTableScope('select')) {
tree.openElements.popUntilPopped('select');
tree.resetInsertionMode();
} else {
tree.parseError('unexpected-end-tag', {name: name});
}
};
modes.inSelect.startTagInput = function(name, attributes) {
tree.parseError("unexpected-input-in-select");
if (tree.openElements.inSelectScope('select')) {
this.endTagSelect('select');
tree.insertionMode.processStartTag(name, attributes);
}
};
modes.inSelect.startTagScript = function(name, attributes) {
modes.inHead.processStartTag(name, attributes);
};
modes.inSelect.endTagTableElements = function(name) {
tree.parseError('unexpected-end-tag-in-select', {name: name});
if (tree.openElements.inTableScope(name)) {
this.endTagSelect('select');
tree.insertionMode.processEndTag(name);
}
};
modes.inSelect.startTagOther = function(name, attributes) {
tree.parseError("unexpected-start-tag-in-select", {name: name});
};
modes.inSelect.endTagOther = function(name) {
tree.parseError('unexpected-end-tag-in-select', {name: name});
};
modes.inSelectInTable = Object.create(modes.base);
modes.inSelectInTable.start_tag_handlers = {
caption: 'startTagTable',
table: 'startTagTable',
tbody: 'startTagTable',
tfoot: 'startTagTable',
thead: 'startTagTable',
tr: 'startTagTable',
td: 'startTagTable',
th: 'startTagTable',
'-default': 'startTagOther'
};
modes.inSelectInTable.end_tag_handlers = {
caption: 'endTagTable',
table: 'endTagTable',
tbody: 'endTagTable',
tfoot: 'endTagTable',
thead: 'endTagTable',
tr: 'endTagTable',
td: 'endTagTable',
th: 'endTagTable',
'-default': 'endTagOther'
};
modes.inSelectInTable.processCharacters = function(data) {
modes.inSelect.processCharacters(data);
};
modes.inSelectInTable.startTagTable = function(name, attributes) {
tree.parseError("unexpected-table-element-start-tag-in-select-in-table", {name: name});
this.endTagOther("select");
tree.insertionMode.processStartTag(name, attributes);
};
modes.inSelectInTable.startTagOther = function(name, attributes, selfClosing) {
modes.inSelect.processStartTag(name, attributes, selfClosing);
};
modes.inSelectInTable.endTagTable = function(name) {
tree.parseError("unexpected-table-element-end-tag-in-select-in-table", {name: name});
if (tree.openElements.inTableScope(name)) {
this.endTagOther("select");
tree.insertionMode.processEndTag(name);
}
};
modes.inSelectInTable.endTagOther = function(name) {
modes.inSelect.processEndTag(name);
};
modes.inRow = Object.create(modes.base);
modes.inRow.start_tag_handlers = {
html: 'startTagHtml',
td: 'startTagTableCell',
th: 'startTagTableCell',
caption: 'startTagTableOther',
col: 'startTagTableOther',
colgroup: 'startTagTableOther',
tbody: 'startTagTableOther',
tfoot: 'startTagTableOther',
thead: 'startTagTableOther',
tr: 'startTagTableOther',
'-default': 'startTagOther'
};
modes.inRow.end_tag_handlers = {
tr: 'endTagTr',
table: 'endTagTable',
tbody: 'endTagTableRowGroup',
tfoot: 'endTagTableRowGroup',
thead: 'endTagTableRowGroup',
body: 'endTagIgnore',
caption: 'endTagIgnore',
col: 'endTagIgnore',
colgroup: 'endTagIgnore',
html: 'endTagIgnore',
td: 'endTagIgnore',
th: 'endTagIgnore',
'-default': 'endTagOther'
};
modes.inRow.processCharacters = function(data) {
modes.inTable.processCharacters(data);
};
modes.inRow.startTagTableCell = function(name, attributes) {
tree.openElements.popUntilTableRowScopeMarker();
tree.insertElement(name, attributes);
tree.setInsertionMode('inCell');
tree.activeFormattingElements.push(Marker);
};
modes.inRow.startTagTableOther = function(name, attributes) {
var ignoreEndTag = this.ignoreEndTagTr();
this.endTagTr('tr');
if (!ignoreEndTag) tree.insertionMode.processStartTag(name, attributes);
};
modes.inRow.startTagOther = function(name, attributes, selfClosing) {
modes.inTable.processStartTag(name, attributes, selfClosing);
};
modes.inRow.endTagTr = function(name) {
if (this.ignoreEndTagTr()) {
assert.ok(tree.context);
tree.parseError('unexpected-end-tag', {name: name});
} else {
tree.openElements.popUntilTableRowScopeMarker();
tree.popElement();
tree.setInsertionMode('inTableBody');
}
};
modes.inRow.endTagTable = function(name) {
var ignoreEndTag = this.ignoreEndTagTr();
this.endTagTr('tr');
if (!ignoreEndTag) tree.insertionMode.processEndTag(name);
};
modes.inRow.endTagTableRowGroup = function(name) {
if (tree.openElements.inTableScope(name)) {
this.endTagTr('tr');
tree.insertionMode.processEndTag(name);
} else {
tree.parseError('unexpected-end-tag', {name: name});
}
};
modes.inRow.endTagIgnore = function(name) {
tree.parseError("unexpected-end-tag-in-table-row", {name: name});
};
modes.inRow.endTagOther = function(name) {
modes.inTable.processEndTag(name);
};
modes.inRow.ignoreEndTagTr = function() {
return !tree.openElements.inTableScope('tr');
};
modes.afterAfterFrameset = Object.create(modes.base);
modes.afterAfterFrameset.start_tag_handlers = {
html: 'startTagHtml',
noframes: 'startTagNoFrames',
'-default': 'startTagOther'
};
modes.afterAfterFrameset.processEOF = function() {};
modes.afterAfterFrameset.processComment = function(data) {
tree.insertComment(data, tree.document);
};
modes.afterAfterFrameset.processCharacters = function(buffer) {
var characters = buffer.takeRemaining();
var whitespace = "";
for (var i = 0; i < characters.length; i++) {
var ch = characters[i];
if (isWhitespace(ch))
whitespace += ch;
}
if (whitespace) {
tree.reconstructActiveFormattingElements();
tree.insertText(whitespace);
}
if (whitespace.length < characters.length)
tree.parseError('expected-eof-but-got-char');
};
modes.afterAfterFrameset.startTagNoFrames = function(name, attributes) {
modes.inHead.processStartTag(name, attributes);
};
modes.afterAfterFrameset.startTagOther = function(name, attributes, selfClosing) {
tree.parseError('expected-eof-but-got-start-tag', {name: name});
};
modes.afterAfterFrameset.processEndTag = function(name, attributes) {
tree.parseError('expected-eof-but-got-end-tag', {name: name});
};
modes.text = Object.create(modes.base);
modes.text.start_tag_handlers = {
'-default': 'startTagOther'
};
modes.text.end_tag_handlers = {
script: 'endTagScript',
'-default': 'endTagOther'
};
modes.text.processCharacters = function(buffer) {
if (tree.shouldSkipLeadingNewline) {
tree.shouldSkipLeadingNewline = false;
buffer.skipAtMostOneLeadingNewline();
}
var data = buffer.takeRemaining();
if (!data)
return;
tree.insertText(data);
};
modes.text.processEOF = function() {
tree.parseError("expected-named-closing-tag-but-got-eof",
{name: tree.currentStackItem().localName});
tree.openElements.pop();
tree.setInsertionMode(tree.originalInsertionMode);
tree.insertionMode.processEOF();
};
modes.text.startTagOther = function(name) {
throw "Tried to process start tag " + name + " in RCDATA/RAWTEXT mode";
};
modes.text.endTagScript = function(name) {
var node = tree.openElements.pop();
assert.ok(node.localName == 'script');
tree.setInsertionMode(tree.originalInsertionMode);
};
modes.text.endTagOther = function(name) {
tree.openElements.pop();
tree.setInsertionMode(tree.originalInsertionMode);
};
}
TreeBuilder.prototype.setInsertionMode = function(name) {
this.insertionMode = this.insertionModes[name];
this.insertionModeName = name;
};
TreeBuilder.prototype.adoptionAgencyEndTag = function(name) {
var outerIterationLimit = 8;
var innerIterationLimit = 3;
var formattingElement;
function isActiveFormattingElement(el) {
return el === formattingElement;
}
var outerLoopCounter = 0;
while (outerLoopCounter++ < outerIterationLimit) {
formattingElement = this.elementInActiveFormattingElements(name);
if (!formattingElement || (this.openElements.contains(formattingElement) && !this.openElements.inScope(formattingElement.localName))) {
this.parseError('adoption-agency-1.1', {name: name});
return false;
}
if (!this.openElements.contains(formattingElement)) {
this.parseError('adoption-agency-1.2', {name: name});
this.removeElementFromActiveFormattingElements(formattingElement);
return true;
}
if (!this.openElements.inScope(formattingElement.localName)) {
this.parseError('adoption-agency-4.4', {name: name});
}
if (formattingElement != this.currentStackItem()) {
this.parseError('adoption-agency-1.3', {name: name});
}
var furthestBlock = this.openElements.furthestBlockForFormattingElement(formattingElement.node);
if (!furthestBlock) {
this.openElements.remove_openElements_until(isActiveFormattingElement);
this.removeElementFromActiveFormattingElements(formattingElement);
return true;
}
var afeIndex = this.openElements.elements.indexOf(formattingElement);
var commonAncestor = this.openElements.item(afeIndex - 1);
var bookmark = this.activeFormattingElements.indexOf(formattingElement);
var node = furthestBlock;
var lastNode = furthestBlock;
var index = this.openElements.elements.indexOf(node);
var innerLoopCounter = 0;
while (innerLoopCounter++ < innerIterationLimit) {
index -= 1;
node = this.openElements.item(index);
if (this.activeFormattingElements.indexOf(node) < 0) {
this.openElements.elements.splice(index, 1);
continue;
}
if (node == formattingElement)
break;
if (lastNode == furthestBlock)
bookmark = this.activeFormattingElements.indexOf(node) + 1;
var clone = this.createElement(node.namespaceURI, node.localName, node.attributes);
var newNode = new StackItem(node.namespaceURI, node.localName, node.attributes, clone);
this.activeFormattingElements[this.activeFormattingElements.indexOf(node)] = newNode;
this.openElements.elements[this.openElements.elements.indexOf(node)] = newNode;
node = newNode;
this.detachFromParent(lastNode.node);
this.attachNode(lastNode.node, node.node);
lastNode = node;
}
this.detachFromParent(lastNode.node);
if (commonAncestor.isFosterParenting()) {
this.insertIntoFosterParent(lastNode.node);
} else {
this.attachNode(lastNode.node, commonAncestor.node);
}
var clone = this.createElement("http://www.w3.org/1999/xhtml", formattingElement.localName, formattingElement.attributes);
var formattingClone = new StackItem(formattingElement.namespaceURI, formattingElement.localName, formattingElement.attributes, clone);
this.reparentChildren(furthestBlock.node, clone);
this.attachNode(clone, furthestBlock.node);
this.removeElementFromActiveFormattingElements(formattingElement);
this.activeFormattingElements.splice(Math.min(bookmark, this.activeFormattingElements.length), 0, formattingClone);
this.openElements.remove(formattingElement);
this.openElements.elements.splice(this.openElements.elements.indexOf(furthestBlock) + 1, 0, formattingClone);
}
return true;
};
TreeBuilder.prototype.start = function() {
throw "Not mplemented";
};
TreeBuilder.prototype.startTokenization = function(tokenizer) {
this.tokenizer = tokenizer;
this.compatMode = "no quirks";
this.originalInsertionMode = "initial";
this.framesetOk = true;
this.openElements = new ElementStack();
this.activeFormattingElements = [];
this.start();
if (this.context) {
switch(this.context) {
case 'title':
case 'textarea':
this.tokenizer.setState(Tokenizer.RCDATA);
break;
case 'style':
case 'xmp':
case 'iframe':
case 'noembed':
case 'noframes':
this.tokenizer.setState(Tokenizer.RAWTEXT);
break;
case 'script':
this.tokenizer.setState(Tokenizer.SCRIPT_DATA);
break;
case 'noscript':
if (this.scriptingEnabled)
this.tokenizer.setState(Tokenizer.RAWTEXT);
break;
case 'plaintext':
this.tokenizer.setState(Tokenizer.PLAINTEXT);
break;
}
this.insertHtmlElement();
this.resetInsertionMode();
} else {
this.setInsertionMode('initial');
}
};
TreeBuilder.prototype.processToken = function(token) {
this.selfClosingFlagAcknowledged = false;
var currentNode = this.openElements.top || null;
var insertionMode;
if (!currentNode || !currentNode.isForeign() ||
(currentNode.isMathMLTextIntegrationPoint() &&
((token.type == 'StartTag' &&
!(token.name in {mglyph:0, malignmark:0})) ||
(token.type === 'Characters'))
) ||
(currentNode.namespaceURI == "http://www.w3.org/1998/Math/MathML" &&
currentNode.localName == 'annotation-xml' &&
token.type == 'StartTag' && token.name == 'svg'
) ||
(currentNode.isHtmlIntegrationPoint() &&
token.type in {StartTag:0, Characters:0}
) ||
token.type == 'EOF'
) {
insertionMode = this.insertionMode;
} else {
insertionMode = this.insertionModes.inForeignContent;
}
switch(token.type) {
case 'Characters':
var buffer = new CharacterBuffer(token.data);
insertionMode.processCharacters(buffer);
break;
case 'Comment':
insertionMode.processComment(token.data);
break;
case 'StartTag':
insertionMode.processStartTag(token.name, token.data, token.selfClosing);
break;
case 'EndTag':
insertionMode.processEndTag(token.name);
break;
case 'Doctype':
insertionMode.processDoctype(token.name, token.publicId, token.systemId, token.forceQuirks);
break;
case 'EOF':
insertionMode.processEOF();
break;
}
};
TreeBuilder.prototype.isCdataSectionAllowed = function() {
return this.openElements.length > 0 && this.currentStackItem().isForeign();
};
TreeBuilder.prototype.isSelfClosingFlagAcknowledged = function() {
return this.selfClosingFlagAcknowledged;
};
TreeBuilder.prototype.createElement = function(namespaceURI, localName, attributes) {
throw new Error("Not implemented");
};
TreeBuilder.prototype.attachNode = function(child, parent) {
throw new Error("Not implemented");
};
TreeBuilder.prototype.attachNodeToFosterParent = function(child, table, stackParent) {
throw new Error("Not implemented");
};
TreeBuilder.prototype.detachFromParent = function(node) {
throw new Error("Not implemented");
};
TreeBuilder.prototype.addAttributesToElement = function(element, attributes) {
throw new Error("Not implemented");
};
TreeBuilder.prototype.insertHtmlElement = function(attributes) {
var root = this.createElement("http://www.w3.org/1999/xhtml", 'html', attributes);
this.attachNode(root, this.document);
this.openElements.pushHtmlElement(new StackItem("http://www.w3.org/1999/xhtml", 'html', attributes, root));
return root;
};
TreeBuilder.prototype.insertHeadElement = function(attributes) {
var element = this.createElement("http://www.w3.org/1999/xhtml", "head", attributes);
this.head = new StackItem("http://www.w3.org/1999/xhtml", "head", attributes, element);
this.attachNode(element, this.openElements.top.node);
this.openElements.pushHeadElement(this.head);
return element;
};
TreeBuilder.prototype.insertBodyElement = function(attributes) {
var element = this.createElement("http://www.w3.org/1999/xhtml", "body", attributes);
this.attachNode(element, this.openElements.top.node);
this.openElements.pushBodyElement(new StackItem("http://www.w3.org/1999/xhtml", "body", attributes, element));
return element;
};
TreeBuilder.prototype.insertIntoFosterParent = function(node) {
var tableIndex = this.openElements.findIndex('table');
var tableElement = this.openElements.item(tableIndex).node;
if (tableIndex === 0)
return this.attachNode(node, tableElement);
this.attachNodeToFosterParent(node, tableElement, this.openElements.item(tableIndex - 1).node);
};
TreeBuilder.prototype.insertElement = function(name, attributes, namespaceURI, selfClosing) {
if (!namespaceURI)
namespaceURI = "http://www.w3.org/1999/xhtml";
var element = this.createElement(namespaceURI, name, attributes);
if (this.shouldFosterParent())
this.insertIntoFosterParent(element);
else
this.attachNode(element, this.openElements.top.node);
if (!selfClosing)
this.openElements.push(new StackItem(namespaceURI, name, attributes, element));
};
TreeBuilder.prototype.insertFormattingElement = function(name, attributes) {
this.insertElement(name, attributes, "http://www.w3.org/1999/xhtml");
this.appendElementToActiveFormattingElements(this.currentStackItem());
};
TreeBuilder.prototype.insertSelfClosingElement = function(name, attributes) {
this.selfClosingFlagAcknowledged = true;
this.insertElement(name, attributes, "http://www.w3.org/1999/xhtml", true);
};
TreeBuilder.prototype.insertForeignElement = function(name, attributes, namespaceURI, selfClosing) {
if (selfClosing)
this.selfClosingFlagAcknowledged = true;
this.insertElement(name, attributes, namespaceURI, selfClosing);
};
TreeBuilder.prototype.insertComment = function(data, parent) {
throw new Error("Not implemented");
};
TreeBuilder.prototype.insertDoctype = function(name, publicId, systemId) {
throw new Error("Not implemented");
};
TreeBuilder.prototype.insertText = function(data) {
throw new Error("Not implemented");
};
TreeBuilder.prototype.currentStackItem = function() {
return this.openElements.top;
};
TreeBuilder.prototype.popElement = function() {
return this.openElements.pop();
};
TreeBuilder.prototype.shouldFosterParent = function() {
return this.redirectAttachToFosterParent && this.currentStackItem().isFosterParenting();
};
TreeBuilder.prototype.generateImpliedEndTags = function(exclude) {
var name = this.openElements.top.localName;
if (['dd', 'dt', 'li', 'option', 'optgroup', 'p', 'rp', 'rt'].indexOf(name) != -1 && name != exclude) {
this.popElement();
this.generateImpliedEndTags(exclude);
}
};
TreeBuilder.prototype.reconstructActiveFormattingElements = function() {
if (this.activeFormattingElements.length === 0)
return;
var i = this.activeFormattingElements.length - 1;
var entry = this.activeFormattingElements[i];
if (entry == Marker || this.openElements.contains(entry))
return;
while (entry != Marker && !this.openElements.contains(entry)) {
i -= 1;
entry = this.activeFormattingElements[i];
if (!entry)
break;
}
while (true) {
i += 1;
entry = this.activeFormattingElements[i];
this.insertElement(entry.localName, entry.attributes);
var element = this.currentStackItem();
this.activeFormattingElements[i] = element;
if (element == this.activeFormattingElements[this.activeFormattingElements.length -1])
break;
}
};
TreeBuilder.prototype.ensureNoahsArkCondition = function(item) {
var kNoahsArkCapacity = 3;
if (this.activeFormattingElements.length < kNoahsArkCapacity)
return;
var candidates = [];
var newItemAttributeCount = item.attributes.length;
for (var i = this.activeFormattingElements.length - 1; i >= 0; i--) {
var candidate = this.activeFormattingElements[i];
if (candidate === Marker)
break;
if (item.localName !== candidate.localName || item.namespaceURI !== candidate.namespaceURI)
continue;
if (candidate.attributes.length != newItemAttributeCount)
continue;
candidates.push(candidate);
}
if (candidates.length < kNoahsArkCapacity)
return;
var remainingCandidates = [];
var attributes = item.attributes;
for (var i = 0; i < attributes.length; i++) {
var attribute = attributes[i];
for (var j = 0; j < candidates.length; j++) {
var candidate = candidates[j];
var candidateAttribute = getAttribute(candidate, attribute.nodeName);
if (candidateAttribute && candidateAttribute.nodeValue === attribute.nodeValue)
remainingCandidates.push(candidate);
}
if (remainingCandidates.length < kNoahsArkCapacity)
return;
candidates = remainingCandidates;
remainingCandidates = [];
}
for (var i = kNoahsArkCapacity - 1; i < candidates.length; i++)
this.removeElementFromActiveFormattingElements(candidates[i]);
};
TreeBuilder.prototype.appendElementToActiveFormattingElements = function(item) {
this.ensureNoahsArkCondition(item);
this.activeFormattingElements.push(item);
};
TreeBuilder.prototype.removeElementFromActiveFormattingElements = function(item) {
var index = this.activeFormattingElements.indexOf(item);
if (index >= 0)
this.activeFormattingElements.splice(index, 1);
};
TreeBuilder.prototype.elementInActiveFormattingElements = function(name) {
var els = this.activeFormattingElements;
for (var i = els.length - 1; i >= 0; i--) {
if (els[i] == Marker) break;
if (els[i].localName == name) return els[i];
}
return false;
};
TreeBuilder.prototype.clearActiveFormattingElements = function() {
while (!(this.activeFormattingElements.length === 0 || this.activeFormattingElements.pop() == Marker));
};
TreeBuilder.prototype.reparentChildren = function(oldParent, newParent) {
throw new Error("Not implemented");
};
TreeBuilder.prototype.setFragmentContext = function(context) {
this.context = context;
};
TreeBuilder.prototype.parseError = function(code, args) {
if (!this.errorHandler)
return;
var message = formatMessage(messages[code], args);
this.errorHandler.error(message, this.tokenizer._inputStream.location(), code);
};
TreeBuilder.prototype.resetInsertionMode = function() {
var last = false;
var node = null;
for (var i = this.openElements.length - 1; i >= 0; i--) {
node = this.openElements.item(i);
if (i === 0) {
assert.ok(this.context);
last = true;
node = new StackItem("http://www.w3.org/1999/xhtml", this.context, [], null);
}
if (node.namespaceURI === "http://www.w3.org/1999/xhtml") {
if (node.localName === 'select')
return this.setInsertionMode('inSelect');
if (node.localName === 'td' || node.localName === 'th')
return this.setInsertionMode('inCell');
if (node.localName === 'tr')
return this.setInsertionMode('inRow');
if (node.localName === 'tbody' || node.localName === 'thead' || node.localName === 'tfoot')
return this.setInsertionMode('inTableBody');
if (node.localName === 'caption')
return this.setInsertionMode('inCaption');
if (node.localName === 'colgroup')
return this.setInsertionMode('inColumnGroup');
if (node.localName === 'table')
return this.setInsertionMode('inTable');
if (node.localName === 'head' && !last)
return this.setInsertionMode('inHead');
if (node.localName === 'body')
return this.setInsertionMode('inBody');
if (node.localName === 'frameset')
return this.setInsertionMode('inFrameset');
if (node.localName === 'html')
if (!this.openElements.headElement)
return this.setInsertionMode('beforeHead');
else
return this.setInsertionMode('afterHead');
}
if (last)
return this.setInsertionMode('inBody');
}
};
TreeBuilder.prototype.processGenericRCDATAStartTag = function(name, attributes) {
this.insertElement(name, attributes);
this.tokenizer.setState(Tokenizer.RCDATA);
this.originalInsertionMode = this.insertionModeName;
this.setInsertionMode('text');
};
TreeBuilder.prototype.processGenericRawTextStartTag = function(name, attributes) {
this.insertElement(name, attributes);
this.tokenizer.setState(Tokenizer.RAWTEXT);
this.originalInsertionMode = this.insertionModeName;
this.setInsertionMode('text');
};
TreeBuilder.prototype.adjustMathMLAttributes = function(attributes) {
attributes.forEach(function(a) {
a.namespaceURI = "http://www.w3.org/1998/Math/MathML";
if (constants.MATHMLAttributeMap[a.nodeName])
a.nodeName = constants.MATHMLAttributeMap[a.nodeName];
});
return attributes;
};
TreeBuilder.prototype.adjustSVGTagNameCase = function(name) {
return constants.SVGTagMap[name] || name;
};
TreeBuilder.prototype.adjustSVGAttributes = function(attributes) {
attributes.forEach(function(a) {
a.namespaceURI = "http://www.w3.org/2000/svg";
if (constants.SVGAttributeMap[a.nodeName])
a.nodeName = constants.SVGAttributeMap[a.nodeName];
});
return attributes;
};
TreeBuilder.prototype.adjustForeignAttributes = function(attributes) {
for (var i = 0; i < attributes.length; i++) {
var attribute = attributes[i];
var adjusted = constants.ForeignAttributeMap[attribute.nodeName];
if (adjusted) {
attribute.nodeName = adjusted.localName;
attribute.prefix = adjusted.prefix;
attribute.namespaceURI = adjusted.namespaceURI;
}
}
return attributes;
};
function formatMessage(format, args) {
return format.replace(new RegExp('{[0-9a-z-]+}', 'gi'), function(match) {
return args[match.slice(1, -1)] || match;
});
}
exports.TreeBuilder = TreeBuilder;
},
{"./ElementStack":1,"./StackItem":4,"./Tokenizer":5,"./constants":7,"./messages.json":8,"assert":13,"events":16}],
7:[function(_dereq_,module,exports){
exports.SVGTagMap = {
"altglyph": "altGlyph",
"altglyphdef": "altGlyphDef",
"altglyphitem": "altGlyphItem",
"animatecolor": "animateColor",
"animatemotion": "animateMotion",
"animatetransform": "animateTransform",
"clippath": "clipPath",
"feblend": "feBlend",
"fecolormatrix": "feColorMatrix",
"fecomponenttransfer": "feComponentTransfer",
"fecomposite": "feComposite",
"feconvolvematrix": "feConvolveMatrix",
"fediffuselighting": "feDiffuseLighting",
"fedisplacementmap": "feDisplacementMap",
"fedistantlight": "feDistantLight",
"feflood": "feFlood",
"fefunca": "feFuncA",
"fefuncb": "feFuncB",
"fefuncg": "feFuncG",
"fefuncr": "feFuncR",
"fegaussianblur": "feGaussianBlur",
"feimage": "feImage",
"femerge": "feMerge",
"femergenode": "feMergeNode",
"femorphology": "feMorphology",
"feoffset": "feOffset",
"fepointlight": "fePointLight",
"fespecularlighting": "feSpecularLighting",
"fespotlight": "feSpotLight",
"fetile": "feTile",
"feturbulence": "feTurbulence",
"foreignobject": "foreignObject",
"glyphref": "glyphRef",
"lineargradient": "linearGradient",
"radialgradient": "radialGradient",
"textpath": "textPath"
};
exports.MATHMLAttributeMap = {
definitionurl: 'definitionURL'
};
exports.SVGAttributeMap = {
attributename: 'attributeName',
attributetype: 'attributeType',
basefrequency: 'baseFrequency',
baseprofile: 'baseProfile',
calcmode: 'calcMode',
clippathunits: 'clipPathUnits',
contentscripttype: 'contentScriptType',
contentstyletype: 'contentStyleType',
diffuseconstant: 'diffuseConstant',
edgemode: 'edgeMode',
externalresourcesrequired: 'externalResourcesRequired',
filterres: 'filterRes',
filterunits: 'filterUnits',
glyphref: 'glyphRef',
gradienttransform: 'gradientTransform',
gradientunits: 'gradientUnits',
kernelmatrix: 'kernelMatrix',
kernelunitlength: 'kernelUnitLength',
keypoints: 'keyPoints',
keysplines: 'keySplines',
keytimes: 'keyTimes',
lengthadjust: 'lengthAdjust',
limitingconeangle: 'limitingConeAngle',
markerheight: 'markerHeight',
markerunits: 'markerUnits',
markerwidth: 'markerWidth',
maskcontentunits: 'maskContentUnits',
maskunits: 'maskUnits',
numoctaves: 'numOctaves',
pathlength: 'pathLength',
patterncontentunits: 'patternContentUnits',
patterntransform: 'patternTransform',
patternunits: 'patternUnits',
pointsatx: 'pointsAtX',
pointsaty: 'pointsAtY',
pointsatz: 'pointsAtZ',
preservealpha: 'preserveAlpha',
preserveaspectratio: 'preserveAspectRatio',
primitiveunits: 'primitiveUnits',
refx: 'refX',
refy: 'refY',
repeatcount: 'repeatCount',
repeatdur: 'repeatDur',
requiredextensions: 'requiredExtensions',
requiredfeatures: 'requiredFeatures',
specularconstant: 'specularConstant',
specularexponent: 'specularExponent',
spreadmethod: 'spreadMethod',
startoffset: 'startOffset',
stddeviation: 'stdDeviation',
stitchtiles: 'stitchTiles',
surfacescale: 'surfaceScale',
systemlanguage: 'systemLanguage',
tablevalues: 'tableValues',
targetx: 'targetX',
targety: 'targetY',
textlength: 'textLength',
viewbox: 'viewBox',
viewtarget: 'viewTarget',
xchannelselector: 'xChannelSelector',
ychannelselector: 'yChannelSelector',
zoomandpan: 'zoomAndPan'
};
exports.ForeignAttributeMap = {
"xlink:actuate": {prefix: "xlink", localName: "actuate", namespaceURI: "http://www.w3.org/1999/xlink"},
"xlink:arcrole": {prefix: "xlink", localName: "arcrole", namespaceURI: "http://www.w3.org/1999/xlink"},
"xlink:href": {prefix: "xlink", localName: "href", namespaceURI: "http://www.w3.org/1999/xlink"},
"xlink:role": {prefix: "xlink", localName: "role", namespaceURI: "http://www.w3.org/1999/xlink"},
"xlink:show": {prefix: "xlink", localName: "show", namespaceURI: "http://www.w3.org/1999/xlink"},
"xlink:title": {prefix: "xlink", localName: "title", namespaceURI: "http://www.w3.org/1999/xlink"},
"xlink:type": {prefix: "xlink", localName: "title", namespaceURI: "http://www.w3.org/1999/xlink"},
"xml:base": {prefix: "xml", localName: "base", namespaceURI: "http://www.w3.org/XML/1998/namespace"},
"xml:lang": {prefix: "xml", localName: "lang", namespaceURI: "http://www.w3.org/XML/1998/namespace"},
"xml:space": {prefix: "xml", localName: "space", namespaceURI: "http://www.w3.org/XML/1998/namespace"},
"xmlns": {prefix: null, localName: "xmlns", namespaceURI: "http://www.w3.org/2000/xmlns/"},
"xmlns:xlink": {prefix: "xmlns", localName: "xlink", namespaceURI: "http://www.w3.org/2000/xmlns/"},
};
},
{}],
8:[function(_dereq_,module,exports){
module.exports={
"null-character":
"Null character in input stream, replaced with U+FFFD.",
"invalid-codepoint":
"Invalid codepoint in stream",
"incorrectly-placed-solidus":
"Solidus (/) incorrectly placed in tag.",
"incorrect-cr-newline-entity":
"Incorrect CR newline entity, replaced with LF.",
"illegal-windows-1252-entity":
"Entity used with illegal number (windows-1252 reference).",
"cant-convert-numeric-entity":
"Numeric entity couldn't be converted to character (codepoint U+{charAsInt}).",
"invalid-numeric-entity-replaced":
"Numeric entity represents an illegal codepoint. Expanded to the C1 controls range.",
"numeric-entity-without-semicolon":
"Numeric entity didn't end with ';'.",
"expected-numeric-entity-but-got-eof":
"Numeric entity expected. Got end of file instead.",
"expected-numeric-entity":
"Numeric entity expected but none found.",
"named-entity-without-semicolon":
"Named entity didn't end with ';'.",
"expected-named-entity":
"Named entity expected. Got none.",
"attributes-in-end-tag":
"End tag contains unexpected attributes.",
"self-closing-flag-on-end-tag":
"End tag contains unexpected self-closing flag.",
"bare-less-than-sign-at-eof":
"End of file after <.",
"expected-tag-name-but-got-right-bracket":
"Expected tag name. Got '>' instead.",
"expected-tag-name-but-got-question-mark":
"Expected tag name. Got '?' instead. (HTML doesn't support processing instructions.)",
"expected-tag-name":
"Expected tag name. Got something else instead.",
"expected-closing-tag-but-got-right-bracket":
"Expected closing tag. Got '>' instead. Ignoring '</>'.",
"expected-closing-tag-but-got-eof":
"Expected closing tag. Unexpected end of file.",
"expected-closing-tag-but-got-char":
"Expected closing tag. Unexpected character '{data}' found.",
"eof-in-tag-name":
"Unexpected end of file in the tag name.",
"expected-attribute-name-but-got-eof":
"Unexpected end of file. Expected attribute name instead.",
"eof-in-attribute-name":
"Unexpected end of file in attribute name.",
"invalid-character-in-attribute-name":
"Invalid character in attribute name.",
"duplicate-attribute":
"Dropped duplicate attribute '{name}' on tag.",
"expected-end-of-tag-but-got-eof":
"Unexpected end of file. Expected = or end of tag.",
"expected-attribute-value-but-got-eof":
"Unexpected end of file. Expected attribute value.",
"expected-attribute-value-but-got-right-bracket":
"Expected attribute value. Got '>' instead.",
"unexpected-character-in-unquoted-attribute-value":
"Unexpected character in unquoted attribute",
"invalid-character-after-attribute-name":
"Unexpected character after attribute name.",
"unexpected-character-after-attribute-value":
"Unexpected character after attribute value.",
"eof-in-attribute-value-double-quote":
"Unexpected end of file in attribute value (\").",
"eof-in-attribute-value-single-quote":
"Unexpected end of file in attribute value (').",
"eof-in-attribute-value-no-quotes":
"Unexpected end of file in attribute value.",
"eof-after-attribute-value":
"Unexpected end of file after attribute value.",
"unexpected-eof-after-solidus-in-tag":
"Unexpected end of file in tag. Expected >.",
"unexpected-character-after-solidus-in-tag":
"Unexpected character after / in tag. Expected >.",
"expected-dashes-or-doctype":
"Expected '--' or 'DOCTYPE'. Not found.",
"unexpected-bang-after-double-dash-in-comment":
"Unexpected ! after -- in comment.",
"incorrect-comment":
"Incorrect comment.",
"eof-in-comment":
"Unexpected end of file in comment.",
"eof-in-comment-end-dash":
"Unexpected end of file in comment (-).",
"unexpected-dash-after-double-dash-in-comment":
"Unexpected '-' after '--' found in comment.",
"eof-in-comment-double-dash":
"Unexpected end of file in comment (--).",
"eof-in-comment-end-bang-state":
"Unexpected end of file in comment.",
"unexpected-char-in-comment":
"Unexpected character in comment found.",
"need-space-after-doctype":
"No space after literal string 'DOCTYPE'.",
"expected-doctype-name-but-got-right-bracket":
"Unexpected > character. Expected DOCTYPE name.",
"expected-doctype-name-but-got-eof":
"Unexpected end of file. Expected DOCTYPE name.",
"eof-in-doctype-name":
"Unexpected end of file in DOCTYPE name.",
"eof-in-doctype":
"Unexpected end of file in DOCTYPE.",
"expected-space-or-right-bracket-in-doctype":
"Expected space or '>'. Got '{data}'.",
"unexpected-end-of-doctype":
"Unexpected end of DOCTYPE.",
"unexpected-char-in-doctype":
"Unexpected character in DOCTYPE.",
"eof-in-bogus-doctype":
"Unexpected end of file in bogus doctype.",
"eof-in-innerhtml":
"Unexpected EOF in inner html mode.",
"unexpected-doctype":
"Unexpected DOCTYPE. Ignored.",
"non-html-root":
"html needs to be the first start tag.",
"expected-doctype-but-got-eof":
"Unexpected End of file. Expected DOCTYPE.",
"unknown-doctype":
"Erroneous DOCTYPE. Expected <!DOCTYPE html>.",
"quirky-doctype":
"Quirky doctype. Expected <!DOCTYPE html>.",
"almost-standards-doctype":
"Almost standards mode doctype. Expected <!DOCTYPE html>.",
"obsolete-doctype":
"Obsolete doctype. Expected <!DOCTYPE html>.",
"expected-doctype-but-got-chars":
"Non-space characters found without seeing a doctype first. Expected e.g. <!DOCTYPE html>.",
"expected-doctype-but-got-start-tag":
"Start tag seen without seeing a doctype first. Expected e.g. <!DOCTYPE html>.",
"expected-doctype-but-got-end-tag":
"End tag seen without seeing a doctype first. Expected e.g. <!DOCTYPE html>.",
"end-tag-after-implied-root":
"Unexpected end tag ({name}) after the (implied) root element.",
"expected-named-closing-tag-but-got-eof":
"Unexpected end of file. Expected end tag ({name}).",
"two-heads-are-not-better-than-one":
"Unexpected start tag head in existing head. Ignored.",
"unexpected-end-tag":
"Unexpected end tag ({name}). Ignored.",
"unexpected-implied-end-tag":
"End tag {name} implied, but there were open elements.",
"unexpected-start-tag-out-of-my-head":
"Unexpected start tag ({name}) that can be in head. Moved.",
"unexpected-start-tag":
"Unexpected start tag ({name}).",
"missing-end-tag":
"Missing end tag ({name}).",
"missing-end-tags":
"Missing end tags ({name}).",
"unexpected-start-tag-implies-end-tag":
"Unexpected start tag ({startName}) implies end tag ({endName}).",
"unexpected-start-tag-treated-as":
"Unexpected start tag ({originalName}). Treated as {newName}.",
"deprecated-tag":
"Unexpected start tag {name}. Don't use it!",
"unexpected-start-tag-ignored":
"Unexpected start tag {name}. Ignored.",
"expected-one-end-tag-but-got-another":
"Unexpected end tag ({gotName}). Missing end tag ({expectedName}).",
"end-tag-too-early":
"End tag ({name}) seen too early. Expected other end tag.",
"end-tag-too-early-named":
"Unexpected end tag ({gotName}). Expected end tag ({expectedName}.",
"end-tag-too-early-ignored":
"End tag ({name}) seen too early. Ignored.",
"adoption-agency-1.1":
"End tag ({name}) violates step 1, paragraph 1 of the adoption agency algorithm.",
"adoption-agency-1.2":
"End tag ({name}) violates step 1, paragraph 2 of the adoption agency algorithm.",
"adoption-agency-1.3":
"End tag ({name}) violates step 1, paragraph 3 of the adoption agency algorithm.",
"adoption-agency-4.4":
"End tag ({name}) violates step 4, paragraph 4 of the adoption agency algorithm.",
"unexpected-end-tag-treated-as":
"Unexpected end tag ({originalName}). Treated as {newName}.",
"no-end-tag":
"This element ({name}) has no end tag.",
"unexpected-implied-end-tag-in-table":
"Unexpected implied end tag ({name}) in the table phase.",
"unexpected-implied-end-tag-in-table-body":
"Unexpected implied end tag ({name}) in the table body phase.",
"unexpected-char-implies-table-voodoo":
"Unexpected non-space characters in table context caused voodoo mode.",
"unexpected-hidden-input-in-table":
"Unexpected input with type hidden in table context.",
"unexpected-form-in-table":
"Unexpected form in table context.",
"unexpected-start-tag-implies-table-voodoo":
"Unexpected start tag ({name}) in table context caused voodoo mode.",
"unexpected-end-tag-implies-table-voodoo":
"Unexpected end tag ({name}) in table context caused voodoo mode.",
"unexpected-cell-in-table-body":
"Unexpected table cell start tag ({name}) in the table body phase.",
"unexpected-cell-end-tag":
"Got table cell end tag ({name}) while required end tags are missing.",
"unexpected-end-tag-in-table-body":
"Unexpected end tag ({name}) in the table body phase. Ignored.",
"unexpected-implied-end-tag-in-table-row":
"Unexpected implied end tag ({name}) in the table row phase.",
"unexpected-end-tag-in-table-row":
"Unexpected end tag ({name}) in the table row phase. Ignored.",
"unexpected-select-in-select":
"Unexpected select start tag in the select phase treated as select end tag.",
"unexpected-input-in-select":
"Unexpected input start tag in the select phase.",
"unexpected-start-tag-in-select":
"Unexpected start tag token ({name}) in the select phase. Ignored.",
"unexpected-end-tag-in-select":
"Unexpected end tag ({name}) in the select phase. Ignored.",
"unexpected-table-element-start-tag-in-select-in-table":
"Unexpected table element start tag ({name}) in the select in table phase.",
"unexpected-table-element-end-tag-in-select-in-table":
"Unexpected table element end tag ({name}) in the select in table phase.",
"unexpected-char-after-body":
"Unexpected non-space characters in the after body phase.",
"unexpected-start-tag-after-body":
"Unexpected start tag token ({name}) in the after body phase.",
"unexpected-end-tag-after-body":
"Unexpected end tag token ({name}) in the after body phase.",
"unexpected-char-in-frameset":
"Unepxected characters in the frameset phase. Characters ignored.",
"unexpected-start-tag-in-frameset":
"Unexpected start tag token ({name}) in the frameset phase. Ignored.",
"unexpected-frameset-in-frameset-innerhtml":
"Unexpected end tag token (frameset in the frameset phase (innerHTML).",
"unexpected-end-tag-in-frameset":
"Unexpected end tag token ({name}) in the frameset phase. Ignored.",
"unexpected-char-after-frameset":
"Unexpected non-space characters in the after frameset phase. Ignored.",
"unexpected-start-tag-after-frameset":
"Unexpected start tag ({name}) in the after frameset phase. Ignored.",
"unexpected-end-tag-after-frameset":
"Unexpected end tag ({name}) in the after frameset phase. Ignored.",
"expected-eof-but-got-char":
"Unexpected non-space characters. Expected end of file.",
"expected-eof-but-got-start-tag":
"Unexpected start tag ({name}). Expected end of file.",
"expected-eof-but-got-end-tag":
"Unexpected end tag ({name}). Expected end of file.",
"unexpected-end-table-in-caption":
"Unexpected end table tag in caption. Generates implied end caption.",
"end-html-in-innerhtml":
"Unexpected html end tag in inner html mode.",
"eof-in-table":
"Unexpected end of file. Expected table content.",
"eof-in-script":
"Unexpected end of file. Expected script content.",
"non-void-element-with-trailing-solidus":
"Trailing solidus not allowed on element {name}.",
"unexpected-html-element-in-foreign-content":
"HTML start tag \"{name}\" in a foreign namespace context.",
"unexpected-start-tag-in-table":
"Unexpected {name}. Expected table content."
}
},
{}],
9:[function(_dereq_,module,exports){
var SAXTreeBuilder = _dereq_('./SAXTreeBuilder').SAXTreeBuilder;
var Tokenizer = _dereq_('../Tokenizer').Tokenizer;
var TreeParser = _dereq_('./TreeParser').TreeParser;
function SAXParser() {
this.contentHandler = null;
this._errorHandler = null;
this._treeBuilder = new SAXTreeBuilder();
this._tokenizer = new Tokenizer(this._treeBuilder);
this._scriptingEnabled = false;
}
SAXParser.prototype.parse = function(source) {
this._tokenizer.tokenize(source);
var document = this._treeBuilder.document;
if (document) {
new TreeParser(this.contentHandler).parse(document);
}
};
SAXParser.prototype.parseFragment = function(source, context) {
this._treeBuilder.setFragmentContext(context);
this._tokenizer.tokenize(source);
var fragment = this._treeBuilder.getFragment();
if (fragment) {
new TreeParser(this.contentHandler).parse(fragment);
}
};
Object.defineProperty(SAXParser.prototype, 'scriptingEnabled', {
get: function() {
return this._scriptingEnabled;
},
set: function(value) {
this._scriptingEnabled = value;
this._treeBuilder.scriptingEnabled = value;
}
});
Object.defineProperty(SAXParser.prototype, 'errorHandler', {
get: function() {
return this._errorHandler;
},
set: function(value) {
this._errorHandler = value;
this._treeBuilder.errorHandler = value;
}
});
exports.SAXParser = SAXParser;
},
{"../Tokenizer":5,"./SAXTreeBuilder":10,"./TreeParser":11}],
10:[function(_dereq_,module,exports){
var util = _dereq_('util');
var TreeBuilder = _dereq_('../TreeBuilder').TreeBuilder;
function SAXTreeBuilder() {
TreeBuilder.call(this);
}
util.inherits(SAXTreeBuilder, TreeBuilder);
SAXTreeBuilder.prototype.start = function(tokenizer) {
this.document = new Document(this.tokenizer);
};
SAXTreeBuilder.prototype.end = function() {
this.document.endLocator = this.tokenizer;
};
SAXTreeBuilder.prototype.insertDoctype = function(name, publicId, systemId) {
var doctype = new DTD(this.tokenizer, name, publicId, systemId);
doctype.endLocator = this.tokenizer;
this.document.appendChild(doctype);
};
SAXTreeBuilder.prototype.createElement = function(namespaceURI, localName, attributes) {
var element = new Element(this.tokenizer, namespaceURI, localName, localName, attributes || []);
return element;
};
SAXTreeBuilder.prototype.insertComment = function(data, parent) {
if (!parent)
parent = this.currentStackItem();
var comment = new Comment(this.tokenizer, data);
parent.appendChild(comment);
};
SAXTreeBuilder.prototype.appendCharacters = function(parent, data) {
var text = new Characters(this.tokenizer, data);
parent.appendChild(text);
};
SAXTreeBuilder.prototype.insertText = function(data) {
if (this.redirectAttachToFosterParent && this.openElements.top.isFosterParenting()) {
var tableIndex = this.openElements.findIndex('table');
var tableItem = this.openElements.item(tableIndex);
var table = tableItem.node;
if (tableIndex === 0) {
return this.appendCharacters(table, data);
}
var text = new Characters(this.tokenizer, data);
var parent = table.parentNode;
if (parent) {
parent.insertBetween(text, table.previousSibling, table);
return;
}
var stackParent = this.openElements.item(tableIndex - 1).node;
stackParent.appendChild(text);
return;
}
this.appendCharacters(this.currentStackItem().node, data);
};
SAXTreeBuilder.prototype.attachNode = function(node, parent) {
parent.appendChild(node);
};
SAXTreeBuilder.prototype.attachNodeToFosterParent = function(child, table, stackParent) {
var parent = table.parentNode;
if (parent)
parent.insertBetween(child, table.previousSibling, table);
else
stackParent.appendChild(child);
};
SAXTreeBuilder.prototype.detachFromParent = function(element) {
element.detach();
};
SAXTreeBuilder.prototype.reparentChildren = function(oldParent, newParent) {
newParent.appendChildren(oldParent.firstChild);
};
SAXTreeBuilder.prototype.getFragment = function() {
var fragment = new DocumentFragment();
this.reparentChildren(this.openElements.rootNode, fragment);
return fragment;
};
function getAttribute(node, name) {
for (var i = 0; i < node.attributes.length; i++) {
var attribute = node.attributes[i];
if (attribute.nodeName === name)
return attribute.nodeValue;
}
}
SAXTreeBuilder.prototype.addAttributesToElement = function(element, attributes) {
for (var i = 0; i < attributes.length; i++) {
var attribute = attributes[i];
if (!getAttribute(element, attribute.nodeName))
element.attributes.push(attribute);
}
};
var NodeType = {
CDATA: 1,
CHARACTERS: 2,
COMMENT: 3,
DOCUMENT: 4,
DOCUMENT_FRAGMENT: 5,
DTD: 6,
ELEMENT: 7,
ENTITY: 8,
IGNORABLE_WHITESPACE: 9,
PROCESSING_INSTRUCTION: 10,
SKIPPED_ENTITY: 11
};
function Node(locator) {
if (!locator) {
this.columnNumber = -1;
this.lineNumber = -1;
} else {
this.columnNumber = locator.columnNumber;
this.lineNumber = locator.lineNumber;
}
this.parentNode = null;
this.nextSibling = null;
this.firstChild = null;
}
Node.prototype.visit = function(treeParser) {
throw new Error("Not Implemented");
};
Node.prototype.revisit = function(treeParser) {
return;
};
Node.prototype.detach = function() {
if (this.parentNode !== null) {
this.parentNode.removeChild(this);
this.parentNode = null;
}
};
Object.defineProperty(Node.prototype, 'previousSibling', {
get: function() {
var prev = null;
var next = this.parentNode.firstChild;
for(;;) {
if (this == next) {
return prev;
}
prev = next;
next = next.nextSibling;
}
}
});
function ParentNode(locator) {
Node.call(this, locator);
this.lastChild = null;
this._endLocator = null;
}
ParentNode.prototype = Object.create(Node.prototype);
ParentNode.prototype.insertBefore = function(child, sibling) {
if (!sibling) {
return this.appendChild(child);
}
child.detach();
child.parentNode = this;
if (this.firstChild == sibling) {
child.nextSibling = sibling;
this.firstChild = child;
} else {
var prev = this.firstChild;
var next = this.firstChild.nextSibling;
while (next != sibling) {
prev = next;
next = next.nextSibling;
}
prev.nextSibling = child;
child.nextSibling = next;
}
return child;
};
ParentNode.prototype.insertBetween = function(child, prev, next) {
if (!next) {
return this.appendChild(child);
}
child.detach();
child.parentNode = this;
child.nextSibling = next;
if (!prev) {
firstChild = child;
} else {
prev.nextSibling = child;
}
return child;
};
ParentNode.prototype.appendChild = function(child) {
child.detach();
child.parentNode = this;
if (!this.firstChild) {
this.firstChild = child;
} else {
this.lastChild.nextSibling = child;
}
this.lastChild = child;
return child;
};
ParentNode.prototype.appendChildren = function(parent) {
var child = parent.firstChild;
if (!child) {
return;
}
var another = parent;
if (!this.firstChild) {
this.firstChild = child;
} else {
this.lastChild.nextSibling = child;
}
this.lastChild = another.lastChild;
do {
child.parentNode = this;
} while ((child = child.nextSibling));
another.firstChild = null;
another.lastChild = null;
};
ParentNode.prototype.removeChild = function(node) {
if (this.firstChild == node) {
this.firstChild = node.nextSibling;
if (this.lastChild == node) {
this.lastChild = null;
}
} else {
var prev = this.firstChild;
var next = this.firstChild.nextSibling;
while (next != node) {
prev = next;
next = next.nextSibling;
}
prev.nextSibling = node.nextSibling;
if (this.lastChild == node) {
this.lastChild = prev;
}
}
node.parentNode = null;
return node;
};
Object.defineProperty(ParentNode.prototype, 'endLocator', {
get: function() {
return this._endLocator;
},
set: function(endLocator) {
this._endLocator = {
lineNumber: endLocator.lineNumber,
columnNumber: endLocator.columnNumber
};
}
});
function Document (locator) {
ParentNode.call(this, locator);
this.nodeType = NodeType.DOCUMENT;
}
Document.prototype = Object.create(ParentNode.prototype);
Document.prototype.visit = function(treeParser) {
treeParser.startDocument(this);
};
Document.prototype.revisit = function(treeParser) {
treeParser.endDocument(this.endLocator);
};
function DocumentFragment() {
ParentNode.call(this, new Locator());
this.nodeType = NodeType.DOCUMENT_FRAGMENT;
}
DocumentFragment.prototype = Object.create(ParentNode.prototype);
DocumentFragment.prototype.visit = function(treeParser) {
};
function Element(locator, uri, localName, qName, atts, prefixMappings) {
ParentNode.call(this, locator);
this.uri = uri;
this.localName = localName;
this.qName = qName;
this.attributes = atts;
this.prefixMappings = prefixMappings;
this.nodeType = NodeType.ELEMENT;
}
Element.prototype = Object.create(ParentNode.prototype);
Element.prototype.visit = function(treeParser) {
if (this.prefixMappings) {
for (var key in prefixMappings) {
var mapping = prefixMappings[key];
treeParser.startPrefixMapping(mapping.getPrefix(),
mapping.getUri(), this);
}
}
treeParser.startElement(this.uri, this.localName, this.qName, this.attributes, this);
};
Element.prototype.revisit = function(treeParser) {
treeParser.endElement(this.uri, this.localName, this.qName, this.endLocator);
if (this.prefixMappings) {
for (var key in prefixMappings) {
var mapping = prefixMappings[key];
treeParser.endPrefixMapping(mapping.getPrefix(), this.endLocator);
}
}
};
function Characters(locator, data){
Node.call(this, locator);
this.data = data;
this.nodeType = NodeType.CHARACTERS;
}
Characters.prototype = Object.create(Node.prototype);
Characters.prototype.visit = function (treeParser) {
treeParser.characters(this.data, 0, this.data.length, this);
};
function IgnorableWhitespace(locator, data) {
Node.call(this, locator);
this.data = data;
this.nodeType = NodeType.IGNORABLE_WHITESPACE;
}
IgnorableWhitespace.prototype = Object.create(Node.prototype);
IgnorableWhitespace.prototype.visit = function(treeParser) {
treeParser.ignorableWhitespace(this.data, 0, this.data.length, this);
};
function Comment(locator, data) {
Node.call(this, locator);
this.data = data;
this.nodeType = NodeType.COMMENT;
}
Comment.prototype = Object.create(Node.prototype);
Comment.prototype.visit = function(treeParser) {
treeParser.comment(this.data, 0, this.data.length, this);
};
function CDATA(locator) {
ParentNode.call(this, locator);
this.nodeType = NodeType.CDATA;
}
CDATA.prototype = Object.create(ParentNode.prototype);
CDATA.prototype.visit = function(treeParser) {
treeParser.startCDATA(this);
};
CDATA.prototype.revisit = function(treeParser) {
treeParser.endCDATA(this.endLocator);
};
function Entity(name) {
ParentNode.call(this);
this.name = name;
this.nodeType = NodeType.ENTITY;
}
Entity.prototype = Object.create(ParentNode.prototype);
Entity.prototype.visit = function(treeParser) {
treeParser.startEntity(this.name, this);
};
Entity.prototype.revisit = function(treeParser) {
treeParser.endEntity(this.name);
};
function SkippedEntity(name) {
Node.call(this);
this.name = name;
this.nodeType = NodeType.SKIPPED_ENTITY;
}
SkippedEntity.prototype = Object.create(Node.prototype);
SkippedEntity.prototype.visit = function(treeParser) {
treeParser.skippedEntity(this.name, this);
};
function ProcessingInstruction(target, data) {
Node.call(this);
this.target = target;
this.data = data;
}
ProcessingInstruction.prototype = Object.create(Node.prototype);
ProcessingInstruction.prototype.visit = function(treeParser) {
treeParser.processingInstruction(this.target, this.data, this);
};
ProcessingInstruction.prototype.getNodeType = function() {
return NodeType.PROCESSING_INSTRUCTION;
};
function DTD(name, publicIdentifier, systemIdentifier) {
ParentNode.call(this);
this.name = name;
this.publicIdentifier = publicIdentifier;
this.systemIdentifier = systemIdentifier;
this.nodeType = NodeType.DTD;
}
DTD.prototype = Object.create(ParentNode.prototype);
DTD.prototype.visit = function(treeParser) {
treeParser.startDTD(this.name, this.publicIdentifier, this.systemIdentifier, this);
};
DTD.prototype.revisit = function(treeParser) {
treeParser.endDTD();
};
exports.SAXTreeBuilder = SAXTreeBuilder;
},
{"../TreeBuilder":6,"util":20}],
11:[function(_dereq_,module,exports){
function TreeParser(contentHandler, lexicalHandler){
this.contentHandler;
this.lexicalHandler;
this.locatorDelegate;
if (!contentHandler) {
throw new IllegalArgumentException("contentHandler was null.");
}
this.contentHandler = contentHandler;
if (!lexicalHandler) {
this.lexicalHandler = new NullLexicalHandler();
} else {
this.lexicalHandler = lexicalHandler;
}
}
TreeParser.prototype.parse = function(node) {
this.contentHandler.documentLocator = this;
var current = node;
var next;
for (;;) {
current.visit(this);
if (next = current.firstChild) {
current = next;
continue;
}
for (;;) {
current.revisit(this);
if (current == node) {
return;
}
if (next = current.nextSibling) {
current = next;
break;
}
current = current.parentNode;
}
}
};
TreeParser.prototype.characters = function(ch, start, length, locator) {
this.locatorDelegate = locator;
this.contentHandler.characters(ch, start, length);
};
TreeParser.prototype.endDocument = function(locator) {
this.locatorDelegate = locator;
this.contentHandler.endDocument();
};
TreeParser.prototype.endElement = function(uri, localName, qName, locator) {
this.locatorDelegate = locator;
this.contentHandler.endElement(uri, localName, qName);
};
TreeParser.prototype.endPrefixMapping = function(prefix, locator) {
this.locatorDelegate = locator;
this.contentHandler.endPrefixMapping(prefix);
};
TreeParser.prototype.ignorableWhitespace = function(ch, start, length, locator) {
this.locatorDelegate = locator;
this.contentHandler.ignorableWhitespace(ch, start, length);
};
TreeParser.prototype.processingInstruction = function(target, data, locator) {
this.locatorDelegate = locator;
this.contentHandler.processingInstruction(target, data);
};
TreeParser.prototype.skippedEntity = function(name, locator) {
this.locatorDelegate = locator;
this.contentHandler.skippedEntity(name);
};
TreeParser.prototype.startDocument = function(locator) {
this.locatorDelegate = locator;
this.contentHandler.startDocument();
};
TreeParser.prototype.startElement = function(uri, localName, qName, atts, locator) {
this.locatorDelegate = locator;
this.contentHandler.startElement(uri, localName, qName, atts);
};
TreeParser.prototype.startPrefixMapping = function(prefix, uri, locator) {
this.locatorDelegate = locator;
this.contentHandler.startPrefixMapping(prefix, uri);
};
TreeParser.prototype.comment = function(ch, start, length, locator) {
this.locatorDelegate = locator;
this.lexicalHandler.comment(ch, start, length);
};
TreeParser.prototype.endCDATA = function(locator) {
this.locatorDelegate = locator;
this.lexicalHandler.endCDATA();
};
TreeParser.prototype.endDTD = function(locator) {
this.locatorDelegate = locator;
this.lexicalHandler.endDTD();
};
TreeParser.prototype.endEntity = function(name, locator) {
this.locatorDelegate = locator;
this.lexicalHandler.endEntity(name);
};
TreeParser.prototype.startCDATA = function(locator) {
this.locatorDelegate = locator;
this.lexicalHandler.startCDATA();
};
TreeParser.prototype.startDTD = function(name, publicId, systemId, locator) {
this.locatorDelegate = locator;
this.lexicalHandler.startDTD(name, publicId, systemId);
};
TreeParser.prototype.startEntity = function(name, locator) {
this.locatorDelegate = locator;
this.lexicalHandler.startEntity(name);
};
Object.defineProperty(TreeParser.prototype, 'columnNumber', {
get: function() {
if (!this.locatorDelegate)
return -1;
else
return this.locatorDelegate.columnNumber;
}
});
Object.defineProperty(TreeParser.prototype, 'lineNumber', {
get: function() {
if (!this.locatorDelegate)
return -1;
else
return this.locatorDelegate.lineNumber;
}
});
function NullLexicalHandler() {
}
NullLexicalHandler.prototype.comment = function() {};
NullLexicalHandler.prototype.endCDATA = function() {};
NullLexicalHandler.prototype.endDTD = function() {};
NullLexicalHandler.prototype.endEntity = function() {};
NullLexicalHandler.prototype.startCDATA = function() {};
NullLexicalHandler.prototype.startDTD = function() {};
NullLexicalHandler.prototype.startEntity = function() {};
exports.TreeParser = TreeParser;
},
{}],
12:[function(_dereq_,module,exports){
module.exports = {
"Aacute;": "\u00C1",
"Aacute": "\u00C1",
"aacute;": "\u00E1",
"aacute": "\u00E1",
"Abreve;": "\u0102",
"abreve;": "\u0103",
"ac;": "\u223E",
"acd;": "\u223F",
"acE;": "\u223E\u0333",
"Acirc;": "\u00C2",
"Acirc": "\u00C2",
"acirc;": "\u00E2",
"acirc": "\u00E2",
"acute;": "\u00B4",
"acute": "\u00B4",
"Acy;": "\u0410",
"acy;": "\u0430",
"AElig;": "\u00C6",
"AElig": "\u00C6",
"aelig;": "\u00E6",
"aelig": "\u00E6",
"af;": "\u2061",
"Afr;": "\uD835\uDD04",
"afr;": "\uD835\uDD1E",
"Agrave;": "\u00C0",
"Agrave": "\u00C0",
"agrave;": "\u00E0",
"agrave": "\u00E0",
"alefsym;": "\u2135",
"aleph;": "\u2135",
"Alpha;": "\u0391",
"alpha;": "\u03B1",
"Amacr;": "\u0100",
"amacr;": "\u0101",
"amalg;": "\u2A3F",
"amp;": "\u0026",
"amp": "\u0026",
"AMP;": "\u0026",
"AMP": "\u0026",
"andand;": "\u2A55",
"And;": "\u2A53",
"and;": "\u2227",
"andd;": "\u2A5C",
"andslope;": "\u2A58",
"andv;": "\u2A5A",
"ang;": "\u2220",
"ange;": "\u29A4",
"angle;": "\u2220",
"angmsdaa;": "\u29A8",
"angmsdab;": "\u29A9",
"angmsdac;": "\u29AA",
"angmsdad;": "\u29AB",
"angmsdae;": "\u29AC",
"angmsdaf;": "\u29AD",
"angmsdag;": "\u29AE",
"angmsdah;": "\u29AF",
"angmsd;": "\u2221",
"angrt;": "\u221F",
"angrtvb;": "\u22BE",
"angrtvbd;": "\u299D",
"angsph;": "\u2222",
"angst;": "\u00C5",
"angzarr;": "\u237C",
"Aogon;": "\u0104",
"aogon;": "\u0105",
"Aopf;": "\uD835\uDD38",
"aopf;": "\uD835\uDD52",
"apacir;": "\u2A6F",
"ap;": "\u2248",
"apE;": "\u2A70",
"ape;": "\u224A",
"apid;": "\u224B",
"apos;": "\u0027",
"ApplyFunction;": "\u2061",
"approx;": "\u2248",
"approxeq;": "\u224A",
"Aring;": "\u00C5",
"Aring": "\u00C5",
"aring;": "\u00E5",
"aring": "\u00E5",
"Ascr;": "\uD835\uDC9C",
"ascr;": "\uD835\uDCB6",
"Assign;": "\u2254",
"ast;": "\u002A",
"asymp;": "\u2248",
"asympeq;": "\u224D",
"Atilde;": "\u00C3",
"Atilde": "\u00C3",
"atilde;": "\u00E3",
"atilde": "\u00E3",
"Auml;": "\u00C4",
"Auml": "\u00C4",
"auml;": "\u00E4",
"auml": "\u00E4",
"awconint;": "\u2233",
"awint;": "\u2A11",
"backcong;": "\u224C",
"backepsilon;": "\u03F6",
"backprime;": "\u2035",
"backsim;": "\u223D",
"backsimeq;": "\u22CD",
"Backslash;": "\u2216",
"Barv;": "\u2AE7",
"barvee;": "\u22BD",
"barwed;": "\u2305",
"Barwed;": "\u2306",
"barwedge;": "\u2305",
"bbrk;": "\u23B5",
"bbrktbrk;": "\u23B6",
"bcong;": "\u224C",
"Bcy;": "\u0411",
"bcy;": "\u0431",
"bdquo;": "\u201E",
"becaus;": "\u2235",
"because;": "\u2235",
"Because;": "\u2235",
"bemptyv;": "\u29B0",
"bepsi;": "\u03F6",
"bernou;": "\u212C",
"Bernoullis;": "\u212C",
"Beta;": "\u0392",
"beta;": "\u03B2",
"beth;": "\u2136",
"between;": "\u226C",
"Bfr;": "\uD835\uDD05",
"bfr;": "\uD835\uDD1F",
"bigcap;": "\u22C2",
"bigcirc;": "\u25EF",
"bigcup;": "\u22C3",
"bigodot;": "\u2A00",
"bigoplus;": "\u2A01",
"bigotimes;": "\u2A02",
"bigsqcup;": "\u2A06",
"bigstar;": "\u2605",
"bigtriangledown;": "\u25BD",
"bigtriangleup;": "\u25B3",
"biguplus;": "\u2A04",
"bigvee;": "\u22C1",
"bigwedge;": "\u22C0",
"bkarow;": "\u290D",
"blacklozenge;": "\u29EB",
"blacksquare;": "\u25AA",
"blacktriangle;": "\u25B4",
"blacktriangledown;": "\u25BE",
"blacktriangleleft;": "\u25C2",
"blacktriangleright;": "\u25B8",
"blank;": "\u2423",
"blk12;": "\u2592",
"blk14;": "\u2591",
"blk34;": "\u2593",
"block;": "\u2588",
"bne;": "\u003D\u20E5",
"bnequiv;": "\u2261\u20E5",
"bNot;": "\u2AED",
"bnot;": "\u2310",
"Bopf;": "\uD835\uDD39",
"bopf;": "\uD835\uDD53",
"bot;": "\u22A5",
"bottom;": "\u22A5",
"bowtie;": "\u22C8",
"boxbox;": "\u29C9",
"boxdl;": "\u2510",
"boxdL;": "\u2555",
"boxDl;": "\u2556",
"boxDL;": "\u2557",
"boxdr;": "\u250C",
"boxdR;": "\u2552",
"boxDr;": "\u2553",
"boxDR;": "\u2554",
"boxh;": "\u2500",
"boxH;": "\u2550",
"boxhd;": "\u252C",
"boxHd;": "\u2564",
"boxhD;": "\u2565",
"boxHD;": "\u2566",
"boxhu;": "\u2534",
"boxHu;": "\u2567",
"boxhU;": "\u2568",
"boxHU;": "\u2569",
"boxminus;": "\u229F",
"boxplus;": "\u229E",
"boxtimes;": "\u22A0",
"boxul;": "\u2518",
"boxuL;": "\u255B",
"boxUl;": "\u255C",
"boxUL;": "\u255D",
"boxur;": "\u2514",
"boxuR;": "\u2558",
"boxUr;": "\u2559",
"boxUR;": "\u255A",
"boxv;": "\u2502",
"boxV;": "\u2551",
"boxvh;": "\u253C",
"boxvH;": "\u256A",
"boxVh;": "\u256B",
"boxVH;": "\u256C",
"boxvl;": "\u2524",
"boxvL;": "\u2561",
"boxVl;": "\u2562",
"boxVL;": "\u2563",
"boxvr;": "\u251C",
"boxvR;": "\u255E",
"boxVr;": "\u255F",
"boxVR;": "\u2560",
"bprime;": "\u2035",
"breve;": "\u02D8",
"Breve;": "\u02D8",
"brvbar;": "\u00A6",
"brvbar": "\u00A6",
"bscr;": "\uD835\uDCB7",
"Bscr;": "\u212C",
"bsemi;": "\u204F",
"bsim;": "\u223D",
"bsime;": "\u22CD",
"bsolb;": "\u29C5",
"bsol;": "\u005C",
"bsolhsub;": "\u27C8",
"bull;": "\u2022",
"bullet;": "\u2022",
"bump;": "\u224E",
"bumpE;": "\u2AAE",
"bumpe;": "\u224F",
"Bumpeq;": "\u224E",
"bumpeq;": "\u224F",
"Cacute;": "\u0106",
"cacute;": "\u0107",
"capand;": "\u2A44",
"capbrcup;": "\u2A49",
"capcap;": "\u2A4B",
"cap;": "\u2229",
"Cap;": "\u22D2",
"capcup;": "\u2A47",
"capdot;": "\u2A40",
"CapitalDifferentialD;": "\u2145",
"caps;": "\u2229\uFE00",
"caret;": "\u2041",
"caron;": "\u02C7",
"Cayleys;": "\u212D",
"ccaps;": "\u2A4D",
"Ccaron;": "\u010C",
"ccaron;": "\u010D",
"Ccedil;": "\u00C7",
"Ccedil": "\u00C7",
"ccedil;": "\u00E7",
"ccedil": "\u00E7",
"Ccirc;": "\u0108",
"ccirc;": "\u0109",
"Cconint;": "\u2230",
"ccups;": "\u2A4C",
"ccupssm;": "\u2A50",
"Cdot;": "\u010A",
"cdot;": "\u010B",
"cedil;": "\u00B8",
"cedil": "\u00B8",
"Cedilla;": "\u00B8",
"cemptyv;": "\u29B2",
"cent;": "\u00A2",
"cent": "\u00A2",
"centerdot;": "\u00B7",
"CenterDot;": "\u00B7",
"cfr;": "\uD835\uDD20",
"Cfr;": "\u212D",
"CHcy;": "\u0427",
"chcy;": "\u0447",
"check;": "\u2713",
"checkmark;": "\u2713",
"Chi;": "\u03A7",
"chi;": "\u03C7",
"circ;": "\u02C6",
"circeq;": "\u2257",
"circlearrowleft;": "\u21BA",
"circlearrowright;": "\u21BB",
"circledast;": "\u229B",
"circledcirc;": "\u229A",
"circleddash;": "\u229D",
"CircleDot;": "\u2299",
"circledR;": "\u00AE",
"circledS;": "\u24C8",
"CircleMinus;": "\u2296",
"CirclePlus;": "\u2295",
"CircleTimes;": "\u2297",
"cir;": "\u25CB",
"cirE;": "\u29C3",
"cire;": "\u2257",
"cirfnint;": "\u2A10",
"cirmid;": "\u2AEF",
"cirscir;": "\u29C2",
"ClockwiseContourIntegral;": "\u2232",
"CloseCurlyDoubleQuote;": "\u201D",
"CloseCurlyQuote;": "\u2019",
"clubs;": "\u2663",
"clubsuit;": "\u2663",
"colon;": "\u003A",
"Colon;": "\u2237",
"Colone;": "\u2A74",
"colone;": "\u2254",
"coloneq;": "\u2254",
"comma;": "\u002C",
"commat;": "\u0040",
"comp;": "\u2201",
"compfn;": "\u2218",
"complement;": "\u2201",
"complexes;": "\u2102",
"cong;": "\u2245",
"congdot;": "\u2A6D",
"Congruent;": "\u2261",
"conint;": "\u222E",
"Conint;": "\u222F",
"ContourIntegral;": "\u222E",
"copf;": "\uD835\uDD54",
"Copf;": "\u2102",
"coprod;": "\u2210",
"Coproduct;": "\u2210",
"copy;": "\u00A9",
"copy": "\u00A9",
"COPY;": "\u00A9",
"COPY": "\u00A9",
"copysr;": "\u2117",
"CounterClockwiseContourIntegral;": "\u2233",
"crarr;": "\u21B5",
"cross;": "\u2717",
"Cross;": "\u2A2F",
"Cscr;": "\uD835\uDC9E",
"cscr;": "\uD835\uDCB8",
"csub;": "\u2ACF",
"csube;": "\u2AD1",
"csup;": "\u2AD0",
"csupe;": "\u2AD2",
"ctdot;": "\u22EF",
"cudarrl;": "\u2938",
"cudarrr;": "\u2935",
"cuepr;": "\u22DE",
"cuesc;": "\u22DF",
"cularr;": "\u21B6",
"cularrp;": "\u293D",
"cupbrcap;": "\u2A48",
"cupcap;": "\u2A46",
"CupCap;": "\u224D",
"cup;": "\u222A",
"Cup;": "\u22D3",
"cupcup;": "\u2A4A",
"cupdot;": "\u228D",
"cupor;": "\u2A45",
"cups;": "\u222A\uFE00",
"curarr;": "\u21B7",
"curarrm;": "\u293C",
"curlyeqprec;": "\u22DE",
"curlyeqsucc;": "\u22DF",
"curlyvee;": "\u22CE",
"curlywedge;": "\u22CF",
"curren;": "\u00A4",
"curren": "\u00A4",
"curvearrowleft;": "\u21B6",
"curvearrowright;": "\u21B7",
"cuvee;": "\u22CE",
"cuwed;": "\u22CF",
"cwconint;": "\u2232",
"cwint;": "\u2231",
"cylcty;": "\u232D",
"dagger;": "\u2020",
"Dagger;": "\u2021",
"daleth;": "\u2138",
"darr;": "\u2193",
"Darr;": "\u21A1",
"dArr;": "\u21D3",
"dash;": "\u2010",
"Dashv;": "\u2AE4",
"dashv;": "\u22A3",
"dbkarow;": "\u290F",
"dblac;": "\u02DD",
"Dcaron;": "\u010E",
"dcaron;": "\u010F",
"Dcy;": "\u0414",
"dcy;": "\u0434",
"ddagger;": "\u2021",
"ddarr;": "\u21CA",
"DD;": "\u2145",
"dd;": "\u2146",
"DDotrahd;": "\u2911",
"ddotseq;": "\u2A77",
"deg;": "\u00B0",
"deg": "\u00B0",
"Del;": "\u2207",
"Delta;": "\u0394",
"delta;": "\u03B4",
"demptyv;": "\u29B1",
"dfisht;": "\u297F",
"Dfr;": "\uD835\uDD07",
"dfr;": "\uD835\uDD21",
"dHar;": "\u2965",
"dharl;": "\u21C3",
"dharr;": "\u21C2",
"DiacriticalAcute;": "\u00B4",
"DiacriticalDot;": "\u02D9",
"DiacriticalDoubleAcute;": "\u02DD",
"DiacriticalGrave;": "\u0060",
"DiacriticalTilde;": "\u02DC",
"diam;": "\u22C4",
"diamond;": "\u22C4",
"Diamond;": "\u22C4",
"diamondsuit;": "\u2666",
"diams;": "\u2666",
"die;": "\u00A8",
"DifferentialD;": "\u2146",
"digamma;": "\u03DD",
"disin;": "\u22F2",
"div;": "\u00F7",
"divide;": "\u00F7",
"divide": "\u00F7",
"divideontimes;": "\u22C7",
"divonx;": "\u22C7",
"DJcy;": "\u0402",
"djcy;": "\u0452",
"dlcorn;": "\u231E",
"dlcrop;": "\u230D",
"dollar;": "\u0024",
"Dopf;": "\uD835\uDD3B",
"dopf;": "\uD835\uDD55",
"Dot;": "\u00A8",
"dot;": "\u02D9",
"DotDot;": "\u20DC",
"doteq;": "\u2250",
"doteqdot;": "\u2251",
"DotEqual;": "\u2250",
"dotminus;": "\u2238",
"dotplus;": "\u2214",
"dotsquare;": "\u22A1",
"doublebarwedge;": "\u2306",
"DoubleContourIntegral;": "\u222F",
"DoubleDot;": "\u00A8",
"DoubleDownArrow;": "\u21D3",
"DoubleLeftArrow;": "\u21D0",
"DoubleLeftRightArrow;": "\u21D4",
"DoubleLeftTee;": "\u2AE4",
"DoubleLongLeftArrow;": "\u27F8",
"DoubleLongLeftRightArrow;": "\u27FA",
"DoubleLongRightArrow;": "\u27F9",
"DoubleRightArrow;": "\u21D2",
"DoubleRightTee;": "\u22A8",
"DoubleUpArrow;": "\u21D1",
"DoubleUpDownArrow;": "\u21D5",
"DoubleVerticalBar;": "\u2225",
"DownArrowBar;": "\u2913",
"downarrow;": "\u2193",
"DownArrow;": "\u2193",
"Downarrow;": "\u21D3",
"DownArrowUpArrow;": "\u21F5",
"DownBreve;": "\u0311",
"downdownarrows;": "\u21CA",
"downharpoonleft;": "\u21C3",
"downharpoonright;": "\u21C2",
"DownLeftRightVector;": "\u2950",
"DownLeftTeeVector;": "\u295E",
"DownLeftVectorBar;": "\u2956",
"DownLeftVector;": "\u21BD",
"DownRightTeeVector;": "\u295F",
"DownRightVectorBar;": "\u2957",
"DownRightVector;": "\u21C1",
"DownTeeArrow;": "\u21A7",
"DownTee;": "\u22A4",
"drbkarow;": "\u2910",
"drcorn;": "\u231F",
"drcrop;": "\u230C",
"Dscr;": "\uD835\uDC9F",
"dscr;": "\uD835\uDCB9",
"DScy;": "\u0405",
"dscy;": "\u0455",
"dsol;": "\u29F6",
"Dstrok;": "\u0110",
"dstrok;": "\u0111",
"dtdot;": "\u22F1",
"dtri;": "\u25BF",
"dtrif;": "\u25BE",
"duarr;": "\u21F5",
"duhar;": "\u296F",
"dwangle;": "\u29A6",
"DZcy;": "\u040F",
"dzcy;": "\u045F",
"dzigrarr;": "\u27FF",
"Eacute;": "\u00C9",
"Eacute": "\u00C9",
"eacute;": "\u00E9",
"eacute": "\u00E9",
"easter;": "\u2A6E",
"Ecaron;": "\u011A",
"ecaron;": "\u011B",
"Ecirc;": "\u00CA",
"Ecirc": "\u00CA",
"ecirc;": "\u00EA",
"ecirc": "\u00EA",
"ecir;": "\u2256",
"ecolon;": "\u2255",
"Ecy;": "\u042D",
"ecy;": "\u044D",
"eDDot;": "\u2A77",
"Edot;": "\u0116",
"edot;": "\u0117",
"eDot;": "\u2251",
"ee;": "\u2147",
"efDot;": "\u2252",
"Efr;": "\uD835\uDD08",
"efr;": "\uD835\uDD22",
"eg;": "\u2A9A",
"Egrave;": "\u00C8",
"Egrave": "\u00C8",
"egrave;": "\u00E8",
"egrave": "\u00E8",
"egs;": "\u2A96",
"egsdot;": "\u2A98",
"el;": "\u2A99",
"Element;": "\u2208",
"elinters;": "\u23E7",
"ell;": "\u2113",
"els;": "\u2A95",
"elsdot;": "\u2A97",
"Emacr;": "\u0112",
"emacr;": "\u0113",
"empty;": "\u2205",
"emptyset;": "\u2205",
"EmptySmallSquare;": "\u25FB",
"emptyv;": "\u2205",
"EmptyVerySmallSquare;": "\u25AB",
"emsp13;": "\u2004",
"emsp14;": "\u2005",
"emsp;": "\u2003",
"ENG;": "\u014A",
"eng;": "\u014B",
"ensp;": "\u2002",
"Eogon;": "\u0118",
"eogon;": "\u0119",
"Eopf;": "\uD835\uDD3C",
"eopf;": "\uD835\uDD56",
"epar;": "\u22D5",
"eparsl;": "\u29E3",
"eplus;": "\u2A71",
"epsi;": "\u03B5",
"Epsilon;": "\u0395",
"epsilon;": "\u03B5",
"epsiv;": "\u03F5",
"eqcirc;": "\u2256",
"eqcolon;": "\u2255",
"eqsim;": "\u2242",
"eqslantgtr;": "\u2A96",
"eqslantless;": "\u2A95",
"Equal;": "\u2A75",
"equals;": "\u003D",
"EqualTilde;": "\u2242",
"equest;": "\u225F",
"Equilibrium;": "\u21CC",
"equiv;": "\u2261",
"equivDD;": "\u2A78",
"eqvparsl;": "\u29E5",
"erarr;": "\u2971",
"erDot;": "\u2253",
"escr;": "\u212F",
"Escr;": "\u2130",
"esdot;": "\u2250",
"Esim;": "\u2A73",
"esim;": "\u2242",
"Eta;": "\u0397",
"eta;": "\u03B7",
"ETH;": "\u00D0",
"ETH": "\u00D0",
"eth;": "\u00F0",
"eth": "\u00F0",
"Euml;": "\u00CB",
"Euml": "\u00CB",
"euml;": "\u00EB",
"euml": "\u00EB",
"euro;": "\u20AC",
"excl;": "\u0021",
"exist;": "\u2203",
"Exists;": "\u2203",
"expectation;": "\u2130",
"exponentiale;": "\u2147",
"ExponentialE;": "\u2147",
"fallingdotseq;": "\u2252",
"Fcy;": "\u0424",
"fcy;": "\u0444",
"female;": "\u2640",
"ffilig;": "\uFB03",
"fflig;": "\uFB00",
"ffllig;": "\uFB04",
"Ffr;": "\uD835\uDD09",
"ffr;": "\uD835\uDD23",
"filig;": "\uFB01",
"FilledSmallSquare;": "\u25FC",
"FilledVerySmallSquare;": "\u25AA",
"fjlig;": "\u0066\u006A",
"flat;": "\u266D",
"fllig;": "\uFB02",
"fltns;": "\u25B1",
"fnof;": "\u0192",
"Fopf;": "\uD835\uDD3D",
"fopf;": "\uD835\uDD57",
"forall;": "\u2200",
"ForAll;": "\u2200",
"fork;": "\u22D4",
"forkv;": "\u2AD9",
"Fouriertrf;": "\u2131",
"fpartint;": "\u2A0D",
"frac12;": "\u00BD",
"frac12": "\u00BD",
"frac13;": "\u2153",
"frac14;": "\u00BC",
"frac14": "\u00BC",
"frac15;": "\u2155",
"frac16;": "\u2159",
"frac18;": "\u215B",
"frac23;": "\u2154",
"frac25;": "\u2156",
"frac34;": "\u00BE",
"frac34": "\u00BE",
"frac35;": "\u2157",
"frac38;": "\u215C",
"frac45;": "\u2158",
"frac56;": "\u215A",
"frac58;": "\u215D",
"frac78;": "\u215E",
"frasl;": "\u2044",
"frown;": "\u2322",
"fscr;": "\uD835\uDCBB",
"Fscr;": "\u2131",
"gacute;": "\u01F5",
"Gamma;": "\u0393",
"gamma;": "\u03B3",
"Gammad;": "\u03DC",
"gammad;": "\u03DD",
"gap;": "\u2A86",
"Gbreve;": "\u011E",
"gbreve;": "\u011F",
"Gcedil;": "\u0122",
"Gcirc;": "\u011C",
"gcirc;": "\u011D",
"Gcy;": "\u0413",
"gcy;": "\u0433",
"Gdot;": "\u0120",
"gdot;": "\u0121",
"ge;": "\u2265",
"gE;": "\u2267",
"gEl;": "\u2A8C",
"gel;": "\u22DB",
"geq;": "\u2265",
"geqq;": "\u2267",
"geqslant;": "\u2A7E",
"gescc;": "\u2AA9",
"ges;": "\u2A7E",
"gesdot;": "\u2A80",
"gesdoto;": "\u2A82",
"gesdotol;": "\u2A84",
"gesl;": "\u22DB\uFE00",
"gesles;": "\u2A94",
"Gfr;": "\uD835\uDD0A",
"gfr;": "\uD835\uDD24",
"gg;": "\u226B",
"Gg;": "\u22D9",
"ggg;": "\u22D9",
"gimel;": "\u2137",
"GJcy;": "\u0403",
"gjcy;": "\u0453",
"gla;": "\u2AA5",
"gl;": "\u2277",
"glE;": "\u2A92",
"glj;": "\u2AA4",
"gnap;": "\u2A8A",
"gnapprox;": "\u2A8A",
"gne;": "\u2A88",
"gnE;": "\u2269",
"gneq;": "\u2A88",
"gneqq;": "\u2269",
"gnsim;": "\u22E7",
"Gopf;": "\uD835\uDD3E",
"gopf;": "\uD835\uDD58",
"grave;": "\u0060",
"GreaterEqual;": "\u2265",
"GreaterEqualLess;": "\u22DB",
"GreaterFullEqual;": "\u2267",
"GreaterGreater;": "\u2AA2",
"GreaterLess;": "\u2277",
"GreaterSlantEqual;": "\u2A7E",
"GreaterTilde;": "\u2273",
"Gscr;": "\uD835\uDCA2",
"gscr;": "\u210A",
"gsim;": "\u2273",
"gsime;": "\u2A8E",
"gsiml;": "\u2A90",
"gtcc;": "\u2AA7",
"gtcir;": "\u2A7A",
"gt;": "\u003E",
"gt": "\u003E",
"GT;": "\u003E",
"GT": "\u003E",
"Gt;": "\u226B",
"gtdot;": "\u22D7",
"gtlPar;": "\u2995",
"gtquest;": "\u2A7C",
"gtrapprox;": "\u2A86",
"gtrarr;": "\u2978",
"gtrdot;": "\u22D7",
"gtreqless;": "\u22DB",
"gtreqqless;": "\u2A8C",
"gtrless;": "\u2277",
"gtrsim;": "\u2273",
"gvertneqq;": "\u2269\uFE00",
"gvnE;": "\u2269\uFE00",
"Hacek;": "\u02C7",
"hairsp;": "\u200A",
"half;": "\u00BD",
"hamilt;": "\u210B",
"HARDcy;": "\u042A",
"hardcy;": "\u044A",
"harrcir;": "\u2948",
"harr;": "\u2194",
"hArr;": "\u21D4",
"harrw;": "\u21AD",
"Hat;": "\u005E",
"hbar;": "\u210F",
"Hcirc;": "\u0124",
"hcirc;": "\u0125",
"hearts;": "\u2665",
"heartsuit;": "\u2665",
"hellip;": "\u2026",
"hercon;": "\u22B9",
"hfr;": "\uD835\uDD25",
"Hfr;": "\u210C",
"HilbertSpace;": "\u210B",
"hksearow;": "\u2925",
"hkswarow;": "\u2926",
"hoarr;": "\u21FF",
"homtht;": "\u223B",
"hookleftarrow;": "\u21A9",
"hookrightarrow;": "\u21AA",
"hopf;": "\uD835\uDD59",
"Hopf;": "\u210D",
"horbar;": "\u2015",
"HorizontalLine;": "\u2500",
"hscr;": "\uD835\uDCBD",
"Hscr;": "\u210B",
"hslash;": "\u210F",
"Hstrok;": "\u0126",
"hstrok;": "\u0127",
"HumpDownHump;": "\u224E",
"HumpEqual;": "\u224F",
"hybull;": "\u2043",
"hyphen;": "\u2010",
"Iacute;": "\u00CD",
"Iacute": "\u00CD",
"iacute;": "\u00ED",
"iacute": "\u00ED",
"ic;": "\u2063",
"Icirc;": "\u00CE",
"Icirc": "\u00CE",
"icirc;": "\u00EE",
"icirc": "\u00EE",
"Icy;": "\u0418",
"icy;": "\u0438",
"Idot;": "\u0130",
"IEcy;": "\u0415",
"iecy;": "\u0435",
"iexcl;": "\u00A1",
"iexcl": "\u00A1",
"iff;": "\u21D4",
"ifr;": "\uD835\uDD26",
"Ifr;": "\u2111",
"Igrave;": "\u00CC",
"Igrave": "\u00CC",
"igrave;": "\u00EC",
"igrave": "\u00EC",
"ii;": "\u2148",
"iiiint;": "\u2A0C",
"iiint;": "\u222D",
"iinfin;": "\u29DC",
"iiota;": "\u2129",
"IJlig;": "\u0132",
"ijlig;": "\u0133",
"Imacr;": "\u012A",
"imacr;": "\u012B",
"image;": "\u2111",
"ImaginaryI;": "\u2148",
"imagline;": "\u2110",
"imagpart;": "\u2111",
"imath;": "\u0131",
"Im;": "\u2111",
"imof;": "\u22B7",
"imped;": "\u01B5",
"Implies;": "\u21D2",
"incare;": "\u2105",
"in;": "\u2208",
"infin;": "\u221E",
"infintie;": "\u29DD",
"inodot;": "\u0131",
"intcal;": "\u22BA",
"int;": "\u222B",
"Int;": "\u222C",
"integers;": "\u2124",
"Integral;": "\u222B",
"intercal;": "\u22BA",
"Intersection;": "\u22C2",
"intlarhk;": "\u2A17",
"intprod;": "\u2A3C",
"InvisibleComma;": "\u2063",
"InvisibleTimes;": "\u2062",
"IOcy;": "\u0401",
"iocy;": "\u0451",
"Iogon;": "\u012E",
"iogon;": "\u012F",
"Iopf;": "\uD835\uDD40",
"iopf;": "\uD835\uDD5A",
"Iota;": "\u0399",
"iota;": "\u03B9",
"iprod;": "\u2A3C",
"iquest;": "\u00BF",
"iquest": "\u00BF",
"iscr;": "\uD835\uDCBE",
"Iscr;": "\u2110",
"isin;": "\u2208",
"isindot;": "\u22F5",
"isinE;": "\u22F9",
"isins;": "\u22F4",
"isinsv;": "\u22F3",
"isinv;": "\u2208",
"it;": "\u2062",
"Itilde;": "\u0128",
"itilde;": "\u0129",
"Iukcy;": "\u0406",
"iukcy;": "\u0456",
"Iuml;": "\u00CF",
"Iuml": "\u00CF",
"iuml;": "\u00EF",
"iuml": "\u00EF",
"Jcirc;": "\u0134",
"jcirc;": "\u0135",
"Jcy;": "\u0419",
"jcy;": "\u0439",
"Jfr;": "\uD835\uDD0D",
"jfr;": "\uD835\uDD27",
"jmath;": "\u0237",
"Jopf;": "\uD835\uDD41",
"jopf;": "\uD835\uDD5B",
"Jscr;": "\uD835\uDCA5",
"jscr;": "\uD835\uDCBF",
"Jsercy;": "\u0408",
"jsercy;": "\u0458",
"Jukcy;": "\u0404",
"jukcy;": "\u0454",
"Kappa;": "\u039A",
"kappa;": "\u03BA",
"kappav;": "\u03F0",
"Kcedil;": "\u0136",
"kcedil;": "\u0137",
"Kcy;": "\u041A",
"kcy;": "\u043A",
"Kfr;": "\uD835\uDD0E",
"kfr;": "\uD835\uDD28",
"kgreen;": "\u0138",
"KHcy;": "\u0425",
"khcy;": "\u0445",
"KJcy;": "\u040C",
"kjcy;": "\u045C",
"Kopf;": "\uD835\uDD42",
"kopf;": "\uD835\uDD5C",
"Kscr;": "\uD835\uDCA6",
"kscr;": "\uD835\uDCC0",
"lAarr;": "\u21DA",
"Lacute;": "\u0139",
"lacute;": "\u013A",
"laemptyv;": "\u29B4",
"lagran;": "\u2112",
"Lambda;": "\u039B",
"lambda;": "\u03BB",
"lang;": "\u27E8",
"Lang;": "\u27EA",
"langd;": "\u2991",
"langle;": "\u27E8",
"lap;": "\u2A85",
"Laplacetrf;": "\u2112",
"laquo;": "\u00AB",
"laquo": "\u00AB",
"larrb;": "\u21E4",
"larrbfs;": "\u291F",
"larr;": "\u2190",
"Larr;": "\u219E",
"lArr;": "\u21D0",
"larrfs;": "\u291D",
"larrhk;": "\u21A9",
"larrlp;": "\u21AB",
"larrpl;": "\u2939",
"larrsim;": "\u2973",
"larrtl;": "\u21A2",
"latail;": "\u2919",
"lAtail;": "\u291B",
"lat;": "\u2AAB",
"late;": "\u2AAD",
"lates;": "\u2AAD\uFE00",
"lbarr;": "\u290C",
"lBarr;": "\u290E",
"lbbrk;": "\u2772",
"lbrace;": "\u007B",
"lbrack;": "\u005B",
"lbrke;": "\u298B",
"lbrksld;": "\u298F",
"lbrkslu;": "\u298D",
"Lcaron;": "\u013D",
"lcaron;": "\u013E",
"Lcedil;": "\u013B",
"lcedil;": "\u013C",
"lceil;": "\u2308",
"lcub;": "\u007B",
"Lcy;": "\u041B",
"lcy;": "\u043B",
"ldca;": "\u2936",
"ldquo;": "\u201C",
"ldquor;": "\u201E",
"ldrdhar;": "\u2967",
"ldrushar;": "\u294B",
"ldsh;": "\u21B2",
"le;": "\u2264",
"lE;": "\u2266",
"LeftAngleBracket;": "\u27E8",
"LeftArrowBar;": "\u21E4",
"leftarrow;": "\u2190",
"LeftArrow;": "\u2190",
"Leftarrow;": "\u21D0",
"LeftArrowRightArrow;": "\u21C6",
"leftarrowtail;": "\u21A2",
"LeftCeiling;": "\u2308",
"LeftDoubleBracket;": "\u27E6",
"LeftDownTeeVector;": "\u2961",
"LeftDownVectorBar;": "\u2959",
"LeftDownVector;": "\u21C3",
"LeftFloor;": "\u230A",
"leftharpoondown;": "\u21BD",
"leftharpoonup;": "\u21BC",
"leftleftarrows;": "\u21C7",
"leftrightarrow;": "\u2194",
"LeftRightArrow;": "\u2194",
"Leftrightarrow;": "\u21D4",
"leftrightarrows;": "\u21C6",
"leftrightharpoons;": "\u21CB",
"leftrightsquigarrow;": "\u21AD",
"LeftRightVector;": "\u294E",
"LeftTeeArrow;": "\u21A4",
"LeftTee;": "\u22A3",
"LeftTeeVector;": "\u295A",
"leftthreetimes;": "\u22CB",
"LeftTriangleBar;": "\u29CF",
"LeftTriangle;": "\u22B2",
"LeftTriangleEqual;": "\u22B4",
"LeftUpDownVector;": "\u2951",
"LeftUpTeeVector;": "\u2960",
"LeftUpVectorBar;": "\u2958",
"LeftUpVector;": "\u21BF",
"LeftVectorBar;": "\u2952",
"LeftVector;": "\u21BC",
"lEg;": "\u2A8B",
"leg;": "\u22DA",
"leq;": "\u2264",
"leqq;": "\u2266",
"leqslant;": "\u2A7D",
"lescc;": "\u2AA8",
"les;": "\u2A7D",
"lesdot;": "\u2A7F",
"lesdoto;": "\u2A81",
"lesdotor;": "\u2A83",
"lesg;": "\u22DA\uFE00",
"lesges;": "\u2A93",
"lessapprox;": "\u2A85",
"lessdot;": "\u22D6",
"lesseqgtr;": "\u22DA",
"lesseqqgtr;": "\u2A8B",
"LessEqualGreater;": "\u22DA",
"LessFullEqual;": "\u2266",
"LessGreater;": "\u2276",
"lessgtr;": "\u2276",
"LessLess;": "\u2AA1",
"lesssim;": "\u2272",
"LessSlantEqual;": "\u2A7D",
"LessTilde;": "\u2272",
"lfisht;": "\u297C",
"lfloor;": "\u230A",
"Lfr;": "\uD835\uDD0F",
"lfr;": "\uD835\uDD29",
"lg;": "\u2276",
"lgE;": "\u2A91",
"lHar;": "\u2962",
"lhard;": "\u21BD",
"lharu;": "\u21BC",
"lharul;": "\u296A",
"lhblk;": "\u2584",
"LJcy;": "\u0409",
"ljcy;": "\u0459",
"llarr;": "\u21C7",
"ll;": "\u226A",
"Ll;": "\u22D8",
"llcorner;": "\u231E",
"Lleftarrow;": "\u21DA",
"llhard;": "\u296B",
"lltri;": "\u25FA",
"Lmidot;": "\u013F",
"lmidot;": "\u0140",
"lmoustache;": "\u23B0",
"lmoust;": "\u23B0",
"lnap;": "\u2A89",
"lnapprox;": "\u2A89",
"lne;": "\u2A87",
"lnE;": "\u2268",
"lneq;": "\u2A87",
"lneqq;": "\u2268",
"lnsim;": "\u22E6",
"loang;": "\u27EC",
"loarr;": "\u21FD",
"lobrk;": "\u27E6",
"longleftarrow;": "\u27F5",
"LongLeftArrow;": "\u27F5",
"Longleftarrow;": "\u27F8",
"longleftrightarrow;": "\u27F7",
"LongLeftRightArrow;": "\u27F7",
"Longleftrightarrow;": "\u27FA",
"longmapsto;": "\u27FC",
"longrightarrow;": "\u27F6",
"LongRightArrow;": "\u27F6",
"Longrightarrow;": "\u27F9",
"looparrowleft;": "\u21AB",
"looparrowright;": "\u21AC",
"lopar;": "\u2985",
"Lopf;": "\uD835\uDD43",
"lopf;": "\uD835\uDD5D",
"loplus;": "\u2A2D",
"lotimes;": "\u2A34",
"lowast;": "\u2217",
"lowbar;": "\u005F",
"LowerLeftArrow;": "\u2199",
"LowerRightArrow;": "\u2198",
"loz;": "\u25CA",
"lozenge;": "\u25CA",
"lozf;": "\u29EB",
"lpar;": "\u0028",
"lparlt;": "\u2993",
"lrarr;": "\u21C6",
"lrcorner;": "\u231F",
"lrhar;": "\u21CB",
"lrhard;": "\u296D",
"lrm;": "\u200E",
"lrtri;": "\u22BF",
"lsaquo;": "\u2039",
"lscr;": "\uD835\uDCC1",
"Lscr;": "\u2112",
"lsh;": "\u21B0",
"Lsh;": "\u21B0",
"lsim;": "\u2272",
"lsime;": "\u2A8D",
"lsimg;": "\u2A8F",
"lsqb;": "\u005B",
"lsquo;": "\u2018",
"lsquor;": "\u201A",
"Lstrok;": "\u0141",
"lstrok;": "\u0142",
"ltcc;": "\u2AA6",
"ltcir;": "\u2A79",
"lt;": "\u003C",
"lt": "\u003C",
"LT;": "\u003C",
"LT": "\u003C",
"Lt;": "\u226A",
"ltdot;": "\u22D6",
"lthree;": "\u22CB",
"ltimes;": "\u22C9",
"ltlarr;": "\u2976",
"ltquest;": "\u2A7B",
"ltri;": "\u25C3",
"ltrie;": "\u22B4",
"ltrif;": "\u25C2",
"ltrPar;": "\u2996",
"lurdshar;": "\u294A",
"luruhar;": "\u2966",
"lvertneqq;": "\u2268\uFE00",
"lvnE;": "\u2268\uFE00",
"macr;": "\u00AF",
"macr": "\u00AF",
"male;": "\u2642",
"malt;": "\u2720",
"maltese;": "\u2720",
"Map;": "\u2905",
"map;": "\u21A6",
"mapsto;": "\u21A6",
"mapstodown;": "\u21A7",
"mapstoleft;": "\u21A4",
"mapstoup;": "\u21A5",
"marker;": "\u25AE",
"mcomma;": "\u2A29",
"Mcy;": "\u041C",
"mcy;": "\u043C",
"mdash;": "\u2014",
"mDDot;": "\u223A",
"measuredangle;": "\u2221",
"MediumSpace;": "\u205F",
"Mellintrf;": "\u2133",
"Mfr;": "\uD835\uDD10",
"mfr;": "\uD835\uDD2A",
"mho;": "\u2127",
"micro;": "\u00B5",
"micro": "\u00B5",
"midast;": "\u002A",
"midcir;": "\u2AF0",
"mid;": "\u2223",
"middot;": "\u00B7",
"middot": "\u00B7",
"minusb;": "\u229F",
"minus;": "\u2212",
"minusd;": "\u2238",
"minusdu;": "\u2A2A",
"MinusPlus;": "\u2213",
"mlcp;": "\u2ADB",
"mldr;": "\u2026",
"mnplus;": "\u2213",
"models;": "\u22A7",
"Mopf;": "\uD835\uDD44",
"mopf;": "\uD835\uDD5E",
"mp;": "\u2213",
"mscr;": "\uD835\uDCC2",
"Mscr;": "\u2133",
"mstpos;": "\u223E",
"Mu;": "\u039C",
"mu;": "\u03BC",
"multimap;": "\u22B8",
"mumap;": "\u22B8",
"nabla;": "\u2207",
"Nacute;": "\u0143",
"nacute;": "\u0144",
"nang;": "\u2220\u20D2",
"nap;": "\u2249",
"napE;": "\u2A70\u0338",
"napid;": "\u224B\u0338",
"napos;": "\u0149",
"napprox;": "\u2249",
"natural;": "\u266E",
"naturals;": "\u2115",
"natur;": "\u266E",
"nbsp;": "\u00A0",
"nbsp": "\u00A0",
"nbump;": "\u224E\u0338",
"nbumpe;": "\u224F\u0338",
"ncap;": "\u2A43",
"Ncaron;": "\u0147",
"ncaron;": "\u0148",
"Ncedil;": "\u0145",
"ncedil;": "\u0146",
"ncong;": "\u2247",
"ncongdot;": "\u2A6D\u0338",
"ncup;": "\u2A42",
"Ncy;": "\u041D",
"ncy;": "\u043D",
"ndash;": "\u2013",
"nearhk;": "\u2924",
"nearr;": "\u2197",
"neArr;": "\u21D7",
"nearrow;": "\u2197",
"ne;": "\u2260",
"nedot;": "\u2250\u0338",
"NegativeMediumSpace;": "\u200B",
"NegativeThickSpace;": "\u200B",
"NegativeThinSpace;": "\u200B",
"NegativeVeryThinSpace;": "\u200B",
"nequiv;": "\u2262",
"nesear;": "\u2928",
"nesim;": "\u2242\u0338",
"NestedGreaterGreater;": "\u226B",
"NestedLessLess;": "\u226A",
"NewLine;": "\u000A",
"nexist;": "\u2204",
"nexists;": "\u2204",
"Nfr;": "\uD835\uDD11",
"nfr;": "\uD835\uDD2B",
"ngE;": "\u2267\u0338",
"nge;": "\u2271",
"ngeq;": "\u2271",
"ngeqq;": "\u2267\u0338",
"ngeqslant;": "\u2A7E\u0338",
"nges;": "\u2A7E\u0338",
"nGg;": "\u22D9\u0338",
"ngsim;": "\u2275",
"nGt;": "\u226B\u20D2",
"ngt;": "\u226F",
"ngtr;": "\u226F",
"nGtv;": "\u226B\u0338",
"nharr;": "\u21AE",
"nhArr;": "\u21CE",
"nhpar;": "\u2AF2",
"ni;": "\u220B",
"nis;": "\u22FC",
"nisd;": "\u22FA",
"niv;": "\u220B",
"NJcy;": "\u040A",
"njcy;": "\u045A",
"nlarr;": "\u219A",
"nlArr;": "\u21CD",
"nldr;": "\u2025",
"nlE;": "\u2266\u0338",
"nle;": "\u2270",
"nleftarrow;": "\u219A",
"nLeftarrow;": "\u21CD",
"nleftrightarrow;": "\u21AE",
"nLeftrightarrow;": "\u21CE",
"nleq;": "\u2270",
"nleqq;": "\u2266\u0338",
"nleqslant;": "\u2A7D\u0338",
"nles;": "\u2A7D\u0338",
"nless;": "\u226E",
"nLl;": "\u22D8\u0338",
"nlsim;": "\u2274",
"nLt;": "\u226A\u20D2",
"nlt;": "\u226E",
"nltri;": "\u22EA",
"nltrie;": "\u22EC",
"nLtv;": "\u226A\u0338",
"nmid;": "\u2224",
"NoBreak;": "\u2060",
"NonBreakingSpace;": "\u00A0",
"nopf;": "\uD835\uDD5F",
"Nopf;": "\u2115",
"Not;": "\u2AEC",
"not;": "\u00AC",
"not": "\u00AC",
"NotCongruent;": "\u2262",
"NotCupCap;": "\u226D",
"NotDoubleVerticalBar;": "\u2226",
"NotElement;": "\u2209",
"NotEqual;": "\u2260",
"NotEqualTilde;": "\u2242\u0338",
"NotExists;": "\u2204",
"NotGreater;": "\u226F",
"NotGreaterEqual;": "\u2271",
"NotGreaterFullEqual;": "\u2267\u0338",
"NotGreaterGreater;": "\u226B\u0338",
"NotGreaterLess;": "\u2279",
"NotGreaterSlantEqual;": "\u2A7E\u0338",
"NotGreaterTilde;": "\u2275",
"NotHumpDownHump;": "\u224E\u0338",
"NotHumpEqual;": "\u224F\u0338",
"notin;": "\u2209",
"notindot;": "\u22F5\u0338",
"notinE;": "\u22F9\u0338",
"notinva;": "\u2209",
"notinvb;": "\u22F7",
"notinvc;": "\u22F6",
"NotLeftTriangleBar;": "\u29CF\u0338",
"NotLeftTriangle;": "\u22EA",
"NotLeftTriangleEqual;": "\u22EC",
"NotLess;": "\u226E",
"NotLessEqual;": "\u2270",
"NotLessGreater;": "\u2278",
"NotLessLess;": "\u226A\u0338",
"NotLessSlantEqual;": "\u2A7D\u0338",
"NotLessTilde;": "\u2274",
"NotNestedGreaterGreater;": "\u2AA2\u0338",
"NotNestedLessLess;": "\u2AA1\u0338",
"notni;": "\u220C",
"notniva;": "\u220C",
"notnivb;": "\u22FE",
"notnivc;": "\u22FD",
"NotPrecedes;": "\u2280",
"NotPrecedesEqual;": "\u2AAF\u0338",
"NotPrecedesSlantEqual;": "\u22E0",
"NotReverseElement;": "\u220C",
"NotRightTriangleBar;": "\u29D0\u0338",
"NotRightTriangle;": "\u22EB",
"NotRightTriangleEqual;": "\u22ED",
"NotSquareSubset;": "\u228F\u0338",
"NotSquareSubsetEqual;": "\u22E2",
"NotSquareSuperset;": "\u2290\u0338",
"NotSquareSupersetEqual;": "\u22E3",
"NotSubset;": "\u2282\u20D2",
"NotSubsetEqual;": "\u2288",
"NotSucceeds;": "\u2281",
"NotSucceedsEqual;": "\u2AB0\u0338",
"NotSucceedsSlantEqual;": "\u22E1",
"NotSucceedsTilde;": "\u227F\u0338",
"NotSuperset;": "\u2283\u20D2",
"NotSupersetEqual;": "\u2289",
"NotTilde;": "\u2241",
"NotTildeEqual;": "\u2244",
"NotTildeFullEqual;": "\u2247",
"NotTildeTilde;": "\u2249",
"NotVerticalBar;": "\u2224",
"nparallel;": "\u2226",
"npar;": "\u2226",
"nparsl;": "\u2AFD\u20E5",
"npart;": "\u2202\u0338",
"npolint;": "\u2A14",
"npr;": "\u2280",
"nprcue;": "\u22E0",
"nprec;": "\u2280",
"npreceq;": "\u2AAF\u0338",
"npre;": "\u2AAF\u0338",
"nrarrc;": "\u2933\u0338",
"nrarr;": "\u219B",
"nrArr;": "\u21CF",
"nrarrw;": "\u219D\u0338",
"nrightarrow;": "\u219B",
"nRightarrow;": "\u21CF",
"nrtri;": "\u22EB",
"nrtrie;": "\u22ED",
"nsc;": "\u2281",
"nsccue;": "\u22E1",
"nsce;": "\u2AB0\u0338",
"Nscr;": "\uD835\uDCA9",
"nscr;": "\uD835\uDCC3",
"nshortmid;": "\u2224",
"nshortparallel;": "\u2226",
"nsim;": "\u2241",
"nsime;": "\u2244",
"nsimeq;": "\u2244",
"nsmid;": "\u2224",
"nspar;": "\u2226",
"nsqsube;": "\u22E2",
"nsqsupe;": "\u22E3",
"nsub;": "\u2284",
"nsubE;": "\u2AC5\u0338",
"nsube;": "\u2288",
"nsubset;": "\u2282\u20D2",
"nsubseteq;": "\u2288",
"nsubseteqq;": "\u2AC5\u0338",
"nsucc;": "\u2281",
"nsucceq;": "\u2AB0\u0338",
"nsup;": "\u2285",
"nsupE;": "\u2AC6\u0338",
"nsupe;": "\u2289",
"nsupset;": "\u2283\u20D2",
"nsupseteq;": "\u2289",
"nsupseteqq;": "\u2AC6\u0338",
"ntgl;": "\u2279",
"Ntilde;": "\u00D1",
"Ntilde": "\u00D1",
"ntilde;": "\u00F1",
"ntilde": "\u00F1",
"ntlg;": "\u2278",
"ntriangleleft;": "\u22EA",
"ntrianglelefteq;": "\u22EC",
"ntriangleright;": "\u22EB",
"ntrianglerighteq;": "\u22ED",
"Nu;": "\u039D",
"nu;": "\u03BD",
"num;": "\u0023",
"numero;": "\u2116",
"numsp;": "\u2007",
"nvap;": "\u224D\u20D2",
"nvdash;": "\u22AC",
"nvDash;": "\u22AD",
"nVdash;": "\u22AE",
"nVDash;": "\u22AF",
"nvge;": "\u2265\u20D2",
"nvgt;": "\u003E\u20D2",
"nvHarr;": "\u2904",
"nvinfin;": "\u29DE",
"nvlArr;": "\u2902",
"nvle;": "\u2264\u20D2",
"nvlt;": "\u003C\u20D2",
"nvltrie;": "\u22B4\u20D2",
"nvrArr;": "\u2903",
"nvrtrie;": "\u22B5\u20D2",
"nvsim;": "\u223C\u20D2",
"nwarhk;": "\u2923",
"nwarr;": "\u2196",
"nwArr;": "\u21D6",
"nwarrow;": "\u2196",
"nwnear;": "\u2927",
"Oacute;": "\u00D3",
"Oacute": "\u00D3",
"oacute;": "\u00F3",
"oacute": "\u00F3",
"oast;": "\u229B",
"Ocirc;": "\u00D4",
"Ocirc": "\u00D4",
"ocirc;": "\u00F4",
"ocirc": "\u00F4",
"ocir;": "\u229A",
"Ocy;": "\u041E",
"ocy;": "\u043E",
"odash;": "\u229D",
"Odblac;": "\u0150",
"odblac;": "\u0151",
"odiv;": "\u2A38",
"odot;": "\u2299",
"odsold;": "\u29BC",
"OElig;": "\u0152",
"oelig;": "\u0153",
"ofcir;": "\u29BF",
"Ofr;": "\uD835\uDD12",
"ofr;": "\uD835\uDD2C",
"ogon;": "\u02DB",
"Ograve;": "\u00D2",
"Ograve": "\u00D2",
"ograve;": "\u00F2",
"ograve": "\u00F2",
"ogt;": "\u29C1",
"ohbar;": "\u29B5",
"ohm;": "\u03A9",
"oint;": "\u222E",
"olarr;": "\u21BA",
"olcir;": "\u29BE",
"olcross;": "\u29BB",
"oline;": "\u203E",
"olt;": "\u29C0",
"Omacr;": "\u014C",
"omacr;": "\u014D",
"Omega;": "\u03A9",
"omega;": "\u03C9",
"Omicron;": "\u039F",
"omicron;": "\u03BF",
"omid;": "\u29B6",
"ominus;": "\u2296",
"Oopf;": "\uD835\uDD46",
"oopf;": "\uD835\uDD60",
"opar;": "\u29B7",
"OpenCurlyDoubleQuote;": "\u201C",
"OpenCurlyQuote;": "\u2018",
"operp;": "\u29B9",
"oplus;": "\u2295",
"orarr;": "\u21BB",
"Or;": "\u2A54",
"or;": "\u2228",
"ord;": "\u2A5D",
"order;": "\u2134",
"orderof;": "\u2134",
"ordf;": "\u00AA",
"ordf": "\u00AA",
"ordm;": "\u00BA",
"ordm": "\u00BA",
"origof;": "\u22B6",
"oror;": "\u2A56",
"orslope;": "\u2A57",
"orv;": "\u2A5B",
"oS;": "\u24C8",
"Oscr;": "\uD835\uDCAA",
"oscr;": "\u2134",
"Oslash;": "\u00D8",
"Oslash": "\u00D8",
"oslash;": "\u00F8",
"oslash": "\u00F8",
"osol;": "\u2298",
"Otilde;": "\u00D5",
"Otilde": "\u00D5",
"otilde;": "\u00F5",
"otilde": "\u00F5",
"otimesas;": "\u2A36",
"Otimes;": "\u2A37",
"otimes;": "\u2297",
"Ouml;": "\u00D6",
"Ouml": "\u00D6",
"ouml;": "\u00F6",
"ouml": "\u00F6",
"ovbar;": "\u233D",
"OverBar;": "\u203E",
"OverBrace;": "\u23DE",
"OverBracket;": "\u23B4",
"OverParenthesis;": "\u23DC",
"para;": "\u00B6",
"para": "\u00B6",
"parallel;": "\u2225",
"par;": "\u2225",
"parsim;": "\u2AF3",
"parsl;": "\u2AFD",
"part;": "\u2202",
"PartialD;": "\u2202",
"Pcy;": "\u041F",
"pcy;": "\u043F",
"percnt;": "\u0025",
"period;": "\u002E",
"permil;": "\u2030",
"perp;": "\u22A5",
"pertenk;": "\u2031",
"Pfr;": "\uD835\uDD13",
"pfr;": "\uD835\uDD2D",
"Phi;": "\u03A6",
"phi;": "\u03C6",
"phiv;": "\u03D5",
"phmmat;": "\u2133",
"phone;": "\u260E",
"Pi;": "\u03A0",
"pi;": "\u03C0",
"pitchfork;": "\u22D4",
"piv;": "\u03D6",
"planck;": "\u210F",
"planckh;": "\u210E",
"plankv;": "\u210F",
"plusacir;": "\u2A23",
"plusb;": "\u229E",
"pluscir;": "\u2A22",
"plus;": "\u002B",
"plusdo;": "\u2214",
"plusdu;": "\u2A25",
"pluse;": "\u2A72",
"PlusMinus;": "\u00B1",
"plusmn;": "\u00B1",
"plusmn": "\u00B1",
"plussim;": "\u2A26",
"plustwo;": "\u2A27",
"pm;": "\u00B1",
"Poincareplane;": "\u210C",
"pointint;": "\u2A15",
"popf;": "\uD835\uDD61",
"Popf;": "\u2119",
"pound;": "\u00A3",
"pound": "\u00A3",
"prap;": "\u2AB7",
"Pr;": "\u2ABB",
"pr;": "\u227A",
"prcue;": "\u227C",
"precapprox;": "\u2AB7",
"prec;": "\u227A",
"preccurlyeq;": "\u227C",
"Precedes;": "\u227A",
"PrecedesEqual;": "\u2AAF",
"PrecedesSlantEqual;": "\u227C",
"PrecedesTilde;": "\u227E",
"preceq;": "\u2AAF",
"precnapprox;": "\u2AB9",
"precneqq;": "\u2AB5",
"precnsim;": "\u22E8",
"pre;": "\u2AAF",
"prE;": "\u2AB3",
"precsim;": "\u227E",
"prime;": "\u2032",
"Prime;": "\u2033",
"primes;": "\u2119",
"prnap;": "\u2AB9",
"prnE;": "\u2AB5",
"prnsim;": "\u22E8",
"prod;": "\u220F",
"Product;": "\u220F",
"profalar;": "\u232E",
"profline;": "\u2312",
"profsurf;": "\u2313",
"prop;": "\u221D",
"Proportional;": "\u221D",
"Proportion;": "\u2237",
"propto;": "\u221D",
"prsim;": "\u227E",
"prurel;": "\u22B0",
"Pscr;": "\uD835\uDCAB",
"pscr;": "\uD835\uDCC5",
"Psi;": "\u03A8",
"psi;": "\u03C8",
"puncsp;": "\u2008",
"Qfr;": "\uD835\uDD14",
"qfr;": "\uD835\uDD2E",
"qint;": "\u2A0C",
"qopf;": "\uD835\uDD62",
"Qopf;": "\u211A",
"qprime;": "\u2057",
"Qscr;": "\uD835\uDCAC",
"qscr;": "\uD835\uDCC6",
"quaternions;": "\u210D",
"quatint;": "\u2A16",
"quest;": "\u003F",
"questeq;": "\u225F",
"quot;": "\u0022",
"quot": "\u0022",
"QUOT;": "\u0022",
"QUOT": "\u0022",
"rAarr;": "\u21DB",
"race;": "\u223D\u0331",
"Racute;": "\u0154",
"racute;": "\u0155",
"radic;": "\u221A",
"raemptyv;": "\u29B3",
"rang;": "\u27E9",
"Rang;": "\u27EB",
"rangd;": "\u2992",
"range;": "\u29A5",
"rangle;": "\u27E9",
"raquo;": "\u00BB",
"raquo": "\u00BB",
"rarrap;": "\u2975",
"rarrb;": "\u21E5",
"rarrbfs;": "\u2920",
"rarrc;": "\u2933",
"rarr;": "\u2192",
"Rarr;": "\u21A0",
"rArr;": "\u21D2",
"rarrfs;": "\u291E",
"rarrhk;": "\u21AA",
"rarrlp;": "\u21AC",
"rarrpl;": "\u2945",
"rarrsim;": "\u2974",
"Rarrtl;": "\u2916",
"rarrtl;": "\u21A3",
"rarrw;": "\u219D",
"ratail;": "\u291A",
"rAtail;": "\u291C",
"ratio;": "\u2236",
"rationals;": "\u211A",
"rbarr;": "\u290D",
"rBarr;": "\u290F",
"RBarr;": "\u2910",
"rbbrk;": "\u2773",
"rbrace;": "\u007D",
"rbrack;": "\u005D",
"rbrke;": "\u298C",
"rbrksld;": "\u298E",
"rbrkslu;": "\u2990",
"Rcaron;": "\u0158",
"rcaron;": "\u0159",
"Rcedil;": "\u0156",
"rcedil;": "\u0157",
"rceil;": "\u2309",
"rcub;": "\u007D",
"Rcy;": "\u0420",
"rcy;": "\u0440",
"rdca;": "\u2937",
"rdldhar;": "\u2969",
"rdquo;": "\u201D",
"rdquor;": "\u201D",
"rdsh;": "\u21B3",
"real;": "\u211C",
"realine;": "\u211B",
"realpart;": "\u211C",
"reals;": "\u211D",
"Re;": "\u211C",
"rect;": "\u25AD",
"reg;": "\u00AE",
"reg": "\u00AE",
"REG;": "\u00AE",
"REG": "\u00AE",
"ReverseElement;": "\u220B",
"ReverseEquilibrium;": "\u21CB",
"ReverseUpEquilibrium;": "\u296F",
"rfisht;": "\u297D",
"rfloor;": "\u230B",
"rfr;": "\uD835\uDD2F",
"Rfr;": "\u211C",
"rHar;": "\u2964",
"rhard;": "\u21C1",
"rharu;": "\u21C0",
"rharul;": "\u296C",
"Rho;": "\u03A1",
"rho;": "\u03C1",
"rhov;": "\u03F1",
"RightAngleBracket;": "\u27E9",
"RightArrowBar;": "\u21E5",
"rightarrow;": "\u2192",
"RightArrow;": "\u2192",
"Rightarrow;": "\u21D2",
"RightArrowLeftArrow;": "\u21C4",
"rightarrowtail;": "\u21A3",
"RightCeiling;": "\u2309",
"RightDoubleBracket;": "\u27E7",
"RightDownTeeVector;": "\u295D",
"RightDownVectorBar;": "\u2955",
"RightDownVector;": "\u21C2",
"RightFloor;": "\u230B",
"rightharpoondown;": "\u21C1",
"rightharpoonup;": "\u21C0",
"rightleftarrows;": "\u21C4",
"rightleftharpoons;": "\u21CC",
"rightrightarrows;": "\u21C9",
"rightsquigarrow;": "\u219D",
"RightTeeArrow;": "\u21A6",
"RightTee;": "\u22A2",
"RightTeeVector;": "\u295B",
"rightthreetimes;": "\u22CC",
"RightTriangleBar;": "\u29D0",
"RightTriangle;": "\u22B3",
"RightTriangleEqual;": "\u22B5",
"RightUpDownVector;": "\u294F",
"RightUpTeeVector;": "\u295C",
"RightUpVectorBar;": "\u2954",
"RightUpVector;": "\u21BE",
"RightVectorBar;": "\u2953",
"RightVector;": "\u21C0",
"ring;": "\u02DA",
"risingdotseq;": "\u2253",
"rlarr;": "\u21C4",
"rlhar;": "\u21CC",
"rlm;": "\u200F",
"rmoustache;": "\u23B1",
"rmoust;": "\u23B1",
"rnmid;": "\u2AEE",
"roang;": "\u27ED",
"roarr;": "\u21FE",
"robrk;": "\u27E7",
"ropar;": "\u2986",
"ropf;": "\uD835\uDD63",
"Ropf;": "\u211D",
"roplus;": "\u2A2E",
"rotimes;": "\u2A35",
"RoundImplies;": "\u2970",
"rpar;": "\u0029",
"rpargt;": "\u2994",
"rppolint;": "\u2A12",
"rrarr;": "\u21C9",
"Rrightarrow;": "\u21DB",
"rsaquo;": "\u203A",
"rscr;": "\uD835\uDCC7",
"Rscr;": "\u211B",
"rsh;": "\u21B1",
"Rsh;": "\u21B1",
"rsqb;": "\u005D",
"rsquo;": "\u2019",
"rsquor;": "\u2019",
"rthree;": "\u22CC",
"rtimes;": "\u22CA",
"rtri;": "\u25B9",
"rtrie;": "\u22B5",
"rtrif;": "\u25B8",
"rtriltri;": "\u29CE",
"RuleDelayed;": "\u29F4",
"ruluhar;": "\u2968",
"rx;": "\u211E",
"Sacute;": "\u015A",
"sacute;": "\u015B",
"sbquo;": "\u201A",
"scap;": "\u2AB8",
"Scaron;": "\u0160",
"scaron;": "\u0161",
"Sc;": "\u2ABC",
"sc;": "\u227B",
"sccue;": "\u227D",
"sce;": "\u2AB0",
"scE;": "\u2AB4",
"Scedil;": "\u015E",
"scedil;": "\u015F",
"Scirc;": "\u015C",
"scirc;": "\u015D",
"scnap;": "\u2ABA",
"scnE;": "\u2AB6",
"scnsim;": "\u22E9",
"scpolint;": "\u2A13",
"scsim;": "\u227F",
"Scy;": "\u0421",
"scy;": "\u0441",
"sdotb;": "\u22A1",
"sdot;": "\u22C5",
"sdote;": "\u2A66",
"searhk;": "\u2925",
"searr;": "\u2198",
"seArr;": "\u21D8",
"searrow;": "\u2198",
"sect;": "\u00A7",
"sect": "\u00A7",
"semi;": "\u003B",
"seswar;": "\u2929",
"setminus;": "\u2216",
"setmn;": "\u2216",
"sext;": "\u2736",
"Sfr;": "\uD835\uDD16",
"sfr;": "\uD835\uDD30",
"sfrown;": "\u2322",
"sharp;": "\u266F",
"SHCHcy;": "\u0429",
"shchcy;": "\u0449",
"SHcy;": "\u0428",
"shcy;": "\u0448",
"ShortDownArrow;": "\u2193",
"ShortLeftArrow;": "\u2190",
"shortmid;": "\u2223",
"shortparallel;": "\u2225",
"ShortRightArrow;": "\u2192",
"ShortUpArrow;": "\u2191",
"shy;": "\u00AD",
"shy": "\u00AD",
"Sigma;": "\u03A3",
"sigma;": "\u03C3",
"sigmaf;": "\u03C2",
"sigmav;": "\u03C2",
"sim;": "\u223C",
"simdot;": "\u2A6A",
"sime;": "\u2243",
"simeq;": "\u2243",
"simg;": "\u2A9E",
"simgE;": "\u2AA0",
"siml;": "\u2A9D",
"simlE;": "\u2A9F",
"simne;": "\u2246",
"simplus;": "\u2A24",
"simrarr;": "\u2972",
"slarr;": "\u2190",
"SmallCircle;": "\u2218",
"smallsetminus;": "\u2216",
"smashp;": "\u2A33",
"smeparsl;": "\u29E4",
"smid;": "\u2223",
"smile;": "\u2323",
"smt;": "\u2AAA",
"smte;": "\u2AAC",
"smtes;": "\u2AAC\uFE00",
"SOFTcy;": "\u042C",
"softcy;": "\u044C",
"solbar;": "\u233F",
"solb;": "\u29C4",
"sol;": "\u002F",
"Sopf;": "\uD835\uDD4A",
"sopf;": "\uD835\uDD64",
"spades;": "\u2660",
"spadesuit;": "\u2660",
"spar;": "\u2225",
"sqcap;": "\u2293",
"sqcaps;": "\u2293\uFE00",
"sqcup;": "\u2294",
"sqcups;": "\u2294\uFE00",
"Sqrt;": "\u221A",
"sqsub;": "\u228F",
"sqsube;": "\u2291",
"sqsubset;": "\u228F",
"sqsubseteq;": "\u2291",
"sqsup;": "\u2290",
"sqsupe;": "\u2292",
"sqsupset;": "\u2290",
"sqsupseteq;": "\u2292",
"square;": "\u25A1",
"Square;": "\u25A1",
"SquareIntersection;": "\u2293",
"SquareSubset;": "\u228F",
"SquareSubsetEqual;": "\u2291",
"SquareSuperset;": "\u2290",
"SquareSupersetEqual;": "\u2292",
"SquareUnion;": "\u2294",
"squarf;": "\u25AA",
"squ;": "\u25A1",
"squf;": "\u25AA",
"srarr;": "\u2192",
"Sscr;": "\uD835\uDCAE",
"sscr;": "\uD835\uDCC8",
"ssetmn;": "\u2216",
"ssmile;": "\u2323",
"sstarf;": "\u22C6",
"Star;": "\u22C6",
"star;": "\u2606",
"starf;": "\u2605",
"straightepsilon;": "\u03F5",
"straightphi;": "\u03D5",
"strns;": "\u00AF",
"sub;": "\u2282",
"Sub;": "\u22D0",
"subdot;": "\u2ABD",
"subE;": "\u2AC5",
"sube;": "\u2286",
"subedot;": "\u2AC3",
"submult;": "\u2AC1",
"subnE;": "\u2ACB",
"subne;": "\u228A",
"subplus;": "\u2ABF",
"subrarr;": "\u2979",
"subset;": "\u2282",
"Subset;": "\u22D0",
"subseteq;": "\u2286",
"subseteqq;": "\u2AC5",
"SubsetEqual;": "\u2286",
"subsetneq;": "\u228A",
"subsetneqq;": "\u2ACB",
"subsim;": "\u2AC7",
"subsub;": "\u2AD5",
"subsup;": "\u2AD3",
"succapprox;": "\u2AB8",
"succ;": "\u227B",
"succcurlyeq;": "\u227D",
"Succeeds;": "\u227B",
"SucceedsEqual;": "\u2AB0",
"SucceedsSlantEqual;": "\u227D",
"SucceedsTilde;": "\u227F",
"succeq;": "\u2AB0",
"succnapprox;": "\u2ABA",
"succneqq;": "\u2AB6",
"succnsim;": "\u22E9",
"succsim;": "\u227F",
"SuchThat;": "\u220B",
"sum;": "\u2211",
"Sum;": "\u2211",
"sung;": "\u266A",
"sup1;": "\u00B9",
"sup1": "\u00B9",
"sup2;": "\u00B2",
"sup2": "\u00B2",
"sup3;": "\u00B3",
"sup3": "\u00B3",
"sup;": "\u2283",
"Sup;": "\u22D1",
"supdot;": "\u2ABE",
"supdsub;": "\u2AD8",
"supE;": "\u2AC6",
"supe;": "\u2287",
"supedot;": "\u2AC4",
"Superset;": "\u2283",
"SupersetEqual;": "\u2287",
"suphsol;": "\u27C9",
"suphsub;": "\u2AD7",
"suplarr;": "\u297B",
"supmult;": "\u2AC2",
"supnE;": "\u2ACC",
"supne;": "\u228B",
"supplus;": "\u2AC0",
"supset;": "\u2283",
"Supset;": "\u22D1",
"supseteq;": "\u2287",
"supseteqq;": "\u2AC6",
"supsetneq;": "\u228B",
"supsetneqq;": "\u2ACC",
"supsim;": "\u2AC8",
"supsub;": "\u2AD4",
"supsup;": "\u2AD6",
"swarhk;": "\u2926",
"swarr;": "\u2199",
"swArr;": "\u21D9",
"swarrow;": "\u2199",
"swnwar;": "\u292A",
"szlig;": "\u00DF",
"szlig": "\u00DF",
"Tab;": "\u0009",
"target;": "\u2316",
"Tau;": "\u03A4",
"tau;": "\u03C4",
"tbrk;": "\u23B4",
"Tcaron;": "\u0164",
"tcaron;": "\u0165",
"Tcedil;": "\u0162",
"tcedil;": "\u0163",
"Tcy;": "\u0422",
"tcy;": "\u0442",
"tdot;": "\u20DB",
"telrec;": "\u2315",
"Tfr;": "\uD835\uDD17",
"tfr;": "\uD835\uDD31",
"there4;": "\u2234",
"therefore;": "\u2234",
"Therefore;": "\u2234",
"Theta;": "\u0398",
"theta;": "\u03B8",
"thetasym;": "\u03D1",
"thetav;": "\u03D1",
"thickapprox;": "\u2248",
"thicksim;": "\u223C",
"ThickSpace;": "\u205F\u200A",
"ThinSpace;": "\u2009",
"thinsp;": "\u2009",
"thkap;": "\u2248",
"thksim;": "\u223C",
"THORN;": "\u00DE",
"THORN": "\u00DE",
"thorn;": "\u00FE",
"thorn": "\u00FE",
"tilde;": "\u02DC",
"Tilde;": "\u223C",
"TildeEqual;": "\u2243",
"TildeFullEqual;": "\u2245",
"TildeTilde;": "\u2248",
"timesbar;": "\u2A31",
"timesb;": "\u22A0",
"times;": "\u00D7",
"times": "\u00D7",
"timesd;": "\u2A30",
"tint;": "\u222D",
"toea;": "\u2928",
"topbot;": "\u2336",
"topcir;": "\u2AF1",
"top;": "\u22A4",
"Topf;": "\uD835\uDD4B",
"topf;": "\uD835\uDD65",
"topfork;": "\u2ADA",
"tosa;": "\u2929",
"tprime;": "\u2034",
"trade;": "\u2122",
"TRADE;": "\u2122",
"triangle;": "\u25B5",
"triangledown;": "\u25BF",
"triangleleft;": "\u25C3",
"trianglelefteq;": "\u22B4",
"triangleq;": "\u225C",
"triangleright;": "\u25B9",
"trianglerighteq;": "\u22B5",
"tridot;": "\u25EC",
"trie;": "\u225C",
"triminus;": "\u2A3A",
"TripleDot;": "\u20DB",
"triplus;": "\u2A39",
"trisb;": "\u29CD",
"tritime;": "\u2A3B",
"trpezium;": "\u23E2",
"Tscr;": "\uD835\uDCAF",
"tscr;": "\uD835\uDCC9",
"TScy;": "\u0426",
"tscy;": "\u0446",
"TSHcy;": "\u040B",
"tshcy;": "\u045B",
"Tstrok;": "\u0166",
"tstrok;": "\u0167",
"twixt;": "\u226C",
"twoheadleftarrow;": "\u219E",
"twoheadrightarrow;": "\u21A0",
"Uacute;": "\u00DA",
"Uacute": "\u00DA",
"uacute;": "\u00FA",
"uacute": "\u00FA",
"uarr;": "\u2191",
"Uarr;": "\u219F",
"uArr;": "\u21D1",
"Uarrocir;": "\u2949",
"Ubrcy;": "\u040E",
"ubrcy;": "\u045E",
"Ubreve;": "\u016C",
"ubreve;": "\u016D",
"Ucirc;": "\u00DB",
"Ucirc": "\u00DB",
"ucirc;": "\u00FB",
"ucirc": "\u00FB",
"Ucy;": "\u0423",
"ucy;": "\u0443",
"udarr;": "\u21C5",
"Udblac;": "\u0170",
"udblac;": "\u0171",
"udhar;": "\u296E",
"ufisht;": "\u297E",
"Ufr;": "\uD835\uDD18",
"ufr;": "\uD835\uDD32",
"Ugrave;": "\u00D9",
"Ugrave": "\u00D9",
"ugrave;": "\u00F9",
"ugrave": "\u00F9",
"uHar;": "\u2963",
"uharl;": "\u21BF",
"uharr;": "\u21BE",
"uhblk;": "\u2580",
"ulcorn;": "\u231C",
"ulcorner;": "\u231C",
"ulcrop;": "\u230F",
"ultri;": "\u25F8",
"Umacr;": "\u016A",
"umacr;": "\u016B",
"uml;": "\u00A8",
"uml": "\u00A8",
"UnderBar;": "\u005F",
"UnderBrace;": "\u23DF",
"UnderBracket;": "\u23B5",
"UnderParenthesis;": "\u23DD",
"Union;": "\u22C3",
"UnionPlus;": "\u228E",
"Uogon;": "\u0172",
"uogon;": "\u0173",
"Uopf;": "\uD835\uDD4C",
"uopf;": "\uD835\uDD66",
"UpArrowBar;": "\u2912",
"uparrow;": "\u2191",
"UpArrow;": "\u2191",
"Uparrow;": "\u21D1",
"UpArrowDownArrow;": "\u21C5",
"updownarrow;": "\u2195",
"UpDownArrow;": "\u2195",
"Updownarrow;": "\u21D5",
"UpEquilibrium;": "\u296E",
"upharpoonleft;": "\u21BF",
"upharpoonright;": "\u21BE",
"uplus;": "\u228E",
"UpperLeftArrow;": "\u2196",
"UpperRightArrow;": "\u2197",
"upsi;": "\u03C5",
"Upsi;": "\u03D2",
"upsih;": "\u03D2",
"Upsilon;": "\u03A5",
"upsilon;": "\u03C5",
"UpTeeArrow;": "\u21A5",
"UpTee;": "\u22A5",
"upuparrows;": "\u21C8",
"urcorn;": "\u231D",
"urcorner;": "\u231D",
"urcrop;": "\u230E",
"Uring;": "\u016E",
"uring;": "\u016F",
"urtri;": "\u25F9",
"Uscr;": "\uD835\uDCB0",
"uscr;": "\uD835\uDCCA",
"utdot;": "\u22F0",
"Utilde;": "\u0168",
"utilde;": "\u0169",
"utri;": "\u25B5",
"utrif;": "\u25B4",
"uuarr;": "\u21C8",
"Uuml;": "\u00DC",
"Uuml": "\u00DC",
"uuml;": "\u00FC",
"uuml": "\u00FC",
"uwangle;": "\u29A7",
"vangrt;": "\u299C",
"varepsilon;": "\u03F5",
"varkappa;": "\u03F0",
"varnothing;": "\u2205",
"varphi;": "\u03D5",
"varpi;": "\u03D6",
"varpropto;": "\u221D",
"varr;": "\u2195",
"vArr;": "\u21D5",
"varrho;": "\u03F1",
"varsigma;": "\u03C2",
"varsubsetneq;": "\u228A\uFE00",
"varsubsetneqq;": "\u2ACB\uFE00",
"varsupsetneq;": "\u228B\uFE00",
"varsupsetneqq;": "\u2ACC\uFE00",
"vartheta;": "\u03D1",
"vartriangleleft;": "\u22B2",
"vartriangleright;": "\u22B3",
"vBar;": "\u2AE8",
"Vbar;": "\u2AEB",
"vBarv;": "\u2AE9",
"Vcy;": "\u0412",
"vcy;": "\u0432",
"vdash;": "\u22A2",
"vDash;": "\u22A8",
"Vdash;": "\u22A9",
"VDash;": "\u22AB",
"Vdashl;": "\u2AE6",
"veebar;": "\u22BB",
"vee;": "\u2228",
"Vee;": "\u22C1",
"veeeq;": "\u225A",
"vellip;": "\u22EE",
"verbar;": "\u007C",
"Verbar;": "\u2016",
"vert;": "\u007C",
"Vert;": "\u2016",
"VerticalBar;": "\u2223",
"VerticalLine;": "\u007C",
"VerticalSeparator;": "\u2758",
"VerticalTilde;": "\u2240",
"VeryThinSpace;": "\u200A",
"Vfr;": "\uD835\uDD19",
"vfr;": "\uD835\uDD33",
"vltri;": "\u22B2",
"vnsub;": "\u2282\u20D2",
"vnsup;": "\u2283\u20D2",
"Vopf;": "\uD835\uDD4D",
"vopf;": "\uD835\uDD67",
"vprop;": "\u221D",
"vrtri;": "\u22B3",
"Vscr;": "\uD835\uDCB1",
"vscr;": "\uD835\uDCCB",
"vsubnE;": "\u2ACB\uFE00",
"vsubne;": "\u228A\uFE00",
"vsupnE;": "\u2ACC\uFE00",
"vsupne;": "\u228B\uFE00",
"Vvdash;": "\u22AA",
"vzigzag;": "\u299A",
"Wcirc;": "\u0174",
"wcirc;": "\u0175",
"wedbar;": "\u2A5F",
"wedge;": "\u2227",
"Wedge;": "\u22C0",
"wedgeq;": "\u2259",
"weierp;": "\u2118",
"Wfr;": "\uD835\uDD1A",
"wfr;": "\uD835\uDD34",
"Wopf;": "\uD835\uDD4E",
"wopf;": "\uD835\uDD68",
"wp;": "\u2118",
"wr;": "\u2240",
"wreath;": "\u2240",
"Wscr;": "\uD835\uDCB2",
"wscr;": "\uD835\uDCCC",
"xcap;": "\u22C2",
"xcirc;": "\u25EF",
"xcup;": "\u22C3",
"xdtri;": "\u25BD",
"Xfr;": "\uD835\uDD1B",
"xfr;": "\uD835\uDD35",
"xharr;": "\u27F7",
"xhArr;": "\u27FA",
"Xi;": "\u039E",
"xi;": "\u03BE",
"xlarr;": "\u27F5",
"xlArr;": "\u27F8",
"xmap;": "\u27FC",
"xnis;": "\u22FB",
"xodot;": "\u2A00",
"Xopf;": "\uD835\uDD4F",
"xopf;": "\uD835\uDD69",
"xoplus;": "\u2A01",
"xotime;": "\u2A02",
"xrarr;": "\u27F6",
"xrArr;": "\u27F9",
"Xscr;": "\uD835\uDCB3",
"xscr;": "\uD835\uDCCD",
"xsqcup;": "\u2A06",
"xuplus;": "\u2A04",
"xutri;": "\u25B3",
"xvee;": "\u22C1",
"xwedge;": "\u22C0",
"Yacute;": "\u00DD",
"Yacute": "\u00DD",
"yacute;": "\u00FD",
"yacute": "\u00FD",
"YAcy;": "\u042F",
"yacy;": "\u044F",
"Ycirc;": "\u0176",
"ycirc;": "\u0177",
"Ycy;": "\u042B",
"ycy;": "\u044B",
"yen;": "\u00A5",
"yen": "\u00A5",
"Yfr;": "\uD835\uDD1C",
"yfr;": "\uD835\uDD36",
"YIcy;": "\u0407",
"yicy;": "\u0457",
"Yopf;": "\uD835\uDD50",
"yopf;": "\uD835\uDD6A",
"Yscr;": "\uD835\uDCB4",
"yscr;": "\uD835\uDCCE",
"YUcy;": "\u042E",
"yucy;": "\u044E",
"yuml;": "\u00FF",
"yuml": "\u00FF",
"Yuml;": "\u0178",
"Zacute;": "\u0179",
"zacute;": "\u017A",
"Zcaron;": "\u017D",
"zcaron;": "\u017E",
"Zcy;": "\u0417",
"zcy;": "\u0437",
"Zdot;": "\u017B",
"zdot;": "\u017C",
"zeetrf;": "\u2128",
"ZeroWidthSpace;": "\u200B",
"Zeta;": "\u0396",
"zeta;": "\u03B6",
"zfr;": "\uD835\uDD37",
"Zfr;": "\u2128",
"ZHcy;": "\u0416",
"zhcy;": "\u0436",
"zigrarr;": "\u21DD",
"zopf;": "\uD835\uDD6B",
"Zopf;": "\u2124",
"Zscr;": "\uD835\uDCB5",
"zscr;": "\uD835\uDCCF",
"zwj;": "\u200D",
"zwnj;": "\u200C"
};
},
{}],
13:[function(_dereq_,module,exports){
var util = _dereq_('util/');
var pSlice = Array.prototype.slice;
var hasOwn = Object.prototype.hasOwnProperty;
var assert = module.exports = ok;
assert.AssertionError = function AssertionError(options) {
this.name = 'AssertionError';
this.actual = options.actual;
this.expected = options.expected;
this.operator = options.operator;
if (options.message) {
this.message = options.message;
this.generatedMessage = false;
} else {
this.message = getMessage(this);
this.generatedMessage = true;
}
var stackStartFunction = options.stackStartFunction || fail;
if (Error.captureStackTrace) {
Error.captureStackTrace(this, stackStartFunction);
}
else {
var err = new Error();
if (err.stack) {
var out = err.stack;
var fn_name = stackStartFunction.name;
var idx = out.indexOf('\n' + fn_name);
if (idx >= 0) {
var next_line = out.indexOf('\n', idx + 1);
out = out.substring(next_line + 1);
}
this.stack = out;
}
}
};
util.inherits(assert.AssertionError, Error);
function replacer(key, value) {
if (util.isUndefined(value)) {
return '' + value;
}
if (util.isNumber(value) && (isNaN(value) || !isFinite(value))) {
return value.toString();
}
if (util.isFunction(value) || util.isRegExp(value)) {
return value.toString();
}
return value;
}
function truncate(s, n) {
if (util.isString(s)) {
return s.length < n ? s : s.slice(0, n);
} else {
return s;
}
}
function getMessage(self) {
return truncate(JSON.stringify(self.actual, replacer), 128) + ' ' +
self.operator + ' ' +
truncate(JSON.stringify(self.expected, replacer), 128);
}
function fail(actual, expected, message, operator, stackStartFunction) {
throw new assert.AssertionError({
message: message,
actual: actual,
expected: expected,
operator: operator,
stackStartFunction: stackStartFunction
});
}
assert.fail = fail;
function ok(value, message) {
if (!value) fail(value, true, message, '==', assert.ok);
}
assert.ok = ok;
assert.equal = function equal(actual, expected, message) {
if (actual != expected) fail(actual, expected, message, '==', assert.equal);
};
assert.notEqual = function notEqual(actual, expected, message) {
if (actual == expected) {
fail(actual, expected, message, '!=', assert.notEqual);
}
};
assert.deepEqual = function deepEqual(actual, expected, message) {
if (!_deepEqual(actual, expected)) {
fail(actual, expected, message, 'deepEqual', assert.deepEqual);
}
};
function _deepEqual(actual, expected) {
if (actual === expected) {
return true;
} else if (util.isBuffer(actual) && util.isBuffer(expected)) {
if (actual.length != expected.length) return false;
for (var i = 0; i < actual.length; i++) {
if (actual[i] !== expected[i]) return false;
}
return true;
} else if (util.isDate(actual) && util.isDate(expected)) {
return actual.getTime() === expected.getTime();
} else if (util.isRegExp(actual) && util.isRegExp(expected)) {
return actual.source === expected.source &&
actual.global === expected.global &&
actual.multiline === expected.multiline &&
actual.lastIndex === expected.lastIndex &&
actual.ignoreCase === expected.ignoreCase;
} else if (!util.isObject(actual) && !util.isObject(expected)) {
return actual == expected;
} else {
return objEquiv(actual, expected);
}
}
function isArguments(object) {
return Object.prototype.toString.call(object) == '[object Arguments]';
}
function objEquiv(a, b) {
if (util.isNullOrUndefined(a) || util.isNullOrUndefined(b))
return false;
if (a.prototype !== b.prototype) return false;
if (isArguments(a)) {
if (!isArguments(b)) {
return false;
}
a = pSlice.call(a);
b = pSlice.call(b);
return _deepEqual(a, b);
}
try {
var ka = objectKeys(a),
kb = objectKeys(b),
key, i;
} catch (e) {//happens when one is a string literal and the other isn't
return false;
}
if (ka.length != kb.length)
return false;
ka.sort();
kb.sort();
for (i = ka.length - 1; i >= 0; i--) {
if (ka[i] != kb[i])
return false;
}
for (i = ka.length - 1; i >= 0; i--) {
key = ka[i];
if (!_deepEqual(a[key], b[key])) return false;
}
return true;
}
assert.notDeepEqual = function notDeepEqual(actual, expected, message) {
if (_deepEqual(actual, expected)) {
fail(actual, expected, message, 'notDeepEqual', assert.notDeepEqual);
}
};
assert.strictEqual = function strictEqual(actual, expected, message) {
if (actual !== expected) {
fail(actual, expected, message, '===', assert.strictEqual);
}
};
assert.notStrictEqual = function notStrictEqual(actual, expected, message) {
if (actual === expected) {
fail(actual, expected, message, '!==', assert.notStrictEqual);
}
};
function expectedException(actual, expected) {
if (!actual || !expected) {
return false;
}
if (Object.prototype.toString.call(expected) == '[object RegExp]') {
return expected.test(actual);
} else if (actual instanceof expected) {
return true;
} else if (expected.call({}, actual) === true) {
return true;
}
return false;
}
function _throws(shouldThrow, block, expected, message) {
var actual;
if (util.isString(expected)) {
message = expected;
expected = null;
}
try {
block();
} catch (e) {
actual = e;
}
message = (expected && expected.name ? ' (' + expected.name + ').' : '.') +
(message ? ' ' + message : '.');
if (shouldThrow && !actual) {
fail(actual, expected, 'Missing expected exception' + message);
}
if (!shouldThrow && expectedException(actual, expected)) {
fail(actual, expected, 'Got unwanted exception' + message);
}
if ((shouldThrow && actual && expected &&
!expectedException(actual, expected)) || (!shouldThrow && actual)) {
throw actual;
}
}
assert.throws = function(block, /*optional*/error, /*optional*/message) {
_throws.apply(this, [true].concat(pSlice.call(arguments)));
};
assert.doesNotThrow = function(block, /*optional*/message) {
_throws.apply(this, [false].concat(pSlice.call(arguments)));
};
assert.ifError = function(err) { if (err) {throw err;}};
var objectKeys = Object.keys || function (obj) {
var keys = [];
for (var key in obj) {
if (hasOwn.call(obj, key)) keys.push(key);
}
return keys;
};
},
{"util/":15}],
14:[function(_dereq_,module,exports){
module.exports = function isBuffer(arg) {
return arg && typeof arg === 'object'
&& typeof arg.copy === 'function'
&& typeof arg.fill === 'function'
&& typeof arg.readUInt8 === 'function';
}
},
{}],
15:[function(_dereq_,module,exports){
(function (process,global){
var formatRegExp = /%[sdj%]/g;
exports.format = function(f) {
if (!isString(f)) {
var objects = [];
for (var i = 0; i < arguments.length; i++) {
objects.push(inspect(arguments[i]));
}
return objects.join(' ');
}
var i = 1;
var args = arguments;
var len = args.length;
var str = String(f).replace(formatRegExp, function(x) {
if (x === '%%') return '%';
if (i >= len) return x;
switch (x) {
case '%s': return String(args[i++]);
case '%d': return Number(args[i++]);
case '%j':
try {
return JSON.stringify(args[i++]);
} catch (_) {
return '[Circular]';
}
default:
return x;
}
});
for (var x = args[i]; i < len; x = args[++i]) {
if (isNull(x) || !isObject(x)) {
str += ' ' + x;
} else {
str += ' ' + inspect(x);
}
}
return str;
};
exports.deprecate = function(fn, msg) {
if (isUndefined(global.process)) {
return function() {
return exports.deprecate(fn, msg).apply(this, arguments);
};
}
if (process.noDeprecation === true) {
return fn;
}
var warned = false;
function deprecated() {
if (!warned) {
if (process.throwDeprecation) {
throw new Error(msg);
} else if (process.traceDeprecation) {
console.trace(msg);
} else {
console.error(msg);
}
warned = true;
}
return fn.apply(this, arguments);
}
return deprecated;
};
var debugs = {};
var debugEnviron;
exports.debuglog = function(set) {
if (isUndefined(debugEnviron))
debugEnviron = process.env.NODE_DEBUG || '';
set = set.toUpperCase();
if (!debugs[set]) {
if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) {
var pid = process.pid;
debugs[set] = function() {
var msg = exports.format.apply(exports, arguments);
console.error('%s %d: %s', set, pid, msg);
};
} else {
debugs[set] = function() {};
}
}
return debugs[set];
};
function inspect(obj, opts) {
var ctx = {
seen: [],
stylize: stylizeNoColor
};
if (arguments.length >= 3) ctx.depth = arguments[2];
if (arguments.length >= 4) ctx.colors = arguments[3];
if (isBoolean(opts)) {
ctx.showHidden = opts;
} else if (opts) {
exports._extend(ctx, opts);
}
if (isUndefined(ctx.showHidden)) ctx.showHidden = false;
if (isUndefined(ctx.depth)) ctx.depth = 2;
if (isUndefined(ctx.colors)) ctx.colors = false;
if (isUndefined(ctx.customInspect)) ctx.customInspect = true;
if (ctx.colors) ctx.stylize = stylizeWithColor;
return formatValue(ctx, obj, ctx.depth);
}
exports.inspect = inspect;
inspect.colors = {
'bold' : [1, 22],
'italic' : [3, 23],
'underline' : [4, 24],
'inverse' : [7, 27],
'white' : [37, 39],
'grey' : [90, 39],
'black' : [30, 39],
'blue' : [34, 39],
'cyan' : [36, 39],
'green' : [32, 39],
'magenta' : [35, 39],
'red' : [31, 39],
'yellow' : [33, 39]
};
inspect.styles = {
'special': 'cyan',
'number': 'yellow',
'boolean': 'yellow',
'undefined': 'grey',
'null': 'bold',
'string': 'green',
'date': 'magenta',
'regexp': 'red'
};
function stylizeWithColor(str, styleType) {
var style = inspect.styles[styleType];
if (style) {
return '\u001b[' + inspect.colors[style][0] + 'm' + str +
'\u001b[' + inspect.colors[style][1] + 'm';
} else {
return str;
}
}
function stylizeNoColor(str, styleType) {
return str;
}
function arrayToHash(array) {
var hash = {};
array.forEach(function(val, idx) {
hash[val] = true;
});
return hash;
}
function formatValue(ctx, value, recurseTimes) {
if (ctx.customInspect &&
value &&
isFunction(value.inspect) &&
value.inspect !== exports.inspect &&
!(value.constructor && value.constructor.prototype === value)) {
var ret = value.inspect(recurseTimes, ctx);
if (!isString(ret)) {
ret = formatValue(ctx, ret, recurseTimes);
}
return ret;
}
var primitive = formatPrimitive(ctx, value);
if (primitive) {
return primitive;
}
var keys = Object.keys(value);
var visibleKeys = arrayToHash(keys);
if (ctx.showHidden) {
keys = Object.getOwnPropertyNames(value);
}
if (isError(value)
&& (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) {
return formatError(value);
}
if (keys.length === 0) {
if (isFunction(value)) {
var name = value.name ? ': ' + value.name : '';
return ctx.stylize('[Function' + name + ']', 'special');
}
if (isRegExp(value)) {
return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
}
if (isDate(value)) {
return ctx.stylize(Date.prototype.toString.call(value), 'date');
}
if (isError(value)) {
return formatError(value);
}
}
var base = '', array = false, braces = ['{', '}'];
if (isArray(value)) {
array = true;
braces = ['[', ']'];
}
if (isFunction(value)) {
var n = value.name ? ': ' + value.name : '';
base = ' [Function' + n + ']';
}
if (isRegExp(value)) {
base = ' ' + RegExp.prototype.toString.call(value);
}
if (isDate(value)) {
base = ' ' + Date.prototype.toUTCString.call(value);
}
if (isError(value)) {
base = ' ' + formatError(value);
}
if (keys.length === 0 && (!array || value.length == 0)) {
return braces[0] + base + braces[1];
}
if (recurseTimes < 0) {
if (isRegExp(value)) {
return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
} else {
return ctx.stylize('[Object]', 'special');
}
}
ctx.seen.push(value);
var output;
if (array) {
output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);
} else {
output = keys.map(function(key) {
return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);
});
}
ctx.seen.pop();
return reduceToSingleString(output, base, braces);
}
function formatPrimitive(ctx, value) {
if (isUndefined(value))
return ctx.stylize('undefined', 'undefined');
if (isString(value)) {
var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '')
.replace(/'/g, "\\'")
.replace(/\\"/g, '"') + '\'';
return ctx.stylize(simple, 'string');
}
if (isNumber(value))
return ctx.stylize('' + value, 'number');
if (isBoolean(value))
return ctx.stylize('' + value, 'boolean');
if (isNull(value))
return ctx.stylize('null', 'null');
}
function formatError(value) {
return '[' + Error.prototype.toString.call(value) + ']';
}
function formatArray(ctx, value, recurseTimes, visibleKeys, keys) {
var output = [];
for (var i = 0, l = value.length; i < l; ++i) {
if (hasOwnProperty(value, String(i))) {
output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
String(i), true));
} else {
output.push('');
}
}
keys.forEach(function(key) {
if (!key.match(/^\d+$/)) {
output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
key, true));
}
});
return output;
}
function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {
var name, str, desc;
desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };
if (desc.get) {
if (desc.set) {
str = ctx.stylize('[Getter/Setter]', 'special');
} else {
str = ctx.stylize('[Getter]', 'special');
}
} else {
if (desc.set) {
str = ctx.stylize('[Setter]', 'special');
}
}
if (!hasOwnProperty(visibleKeys, key)) {
name = '[' + key + ']';
}
if (!str) {
if (ctx.seen.indexOf(desc.value) < 0) {
if (isNull(recurseTimes)) {
str = formatValue(ctx, desc.value, null);
} else {
str = formatValue(ctx, desc.value, recurseTimes - 1);
}
if (str.indexOf('\n') > -1) {
if (array) {
str = str.split('\n').map(function(line) {
return ' ' + line;
}).join('\n').substr(2);
} else {
str = '\n' + str.split('\n').map(function(line) {
return ' ' + line;
}).join('\n');
}
}
} else {
str = ctx.stylize('[Circular]', 'special');
}
}
if (isUndefined(name)) {
if (array && key.match(/^\d+$/)) {
return str;
}
name = JSON.stringify('' + key);
if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) {
name = name.substr(1, name.length - 2);
name = ctx.stylize(name, 'name');
} else {
name = name.replace(/'/g, "\\'")
.replace(/\\"/g, '"')
.replace(/(^"|"$)/g, "'");
name = ctx.stylize(name, 'string');
}
}
return name + ': ' + str;
}
function reduceToSingleString(output, base, braces) {
var numLinesEst = 0;
var length = output.reduce(function(prev, cur) {
numLinesEst++;
if (cur.indexOf('\n') >= 0) numLinesEst++;
return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1;
}, 0);
if (length > 60) {
return braces[0] +
(base === '' ? '' : base + '\n ') +
' ' +
output.join(',\n ') +
' ' +
braces[1];
}
return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];
}
function isArray(ar) {
return Array.isArray(ar);
}
exports.isArray = isArray;
function isBoolean(arg) {
return typeof arg === 'boolean';
}
exports.isBoolean = isBoolean;
function isNull(arg) {
return arg === null;
}
exports.isNull = isNull;
function isNullOrUndefined(arg) {
return arg == null;
}
exports.isNullOrUndefined = isNullOrUndefined;
function isNumber(arg) {
return typeof arg === 'number';
}
exports.isNumber = isNumber;
function isString(arg) {
return typeof arg === 'string';
}
exports.isString = isString;
function isSymbol(arg) {
return typeof arg === 'symbol';
}
exports.isSymbol = isSymbol;
function isUndefined(arg) {
return arg === void 0;
}
exports.isUndefined = isUndefined;
function isRegExp(re) {
return isObject(re) && objectToString(re) === '[object RegExp]';
}
exports.isRegExp = isRegExp;
function isObject(arg) {
return typeof arg === 'object' && arg !== null;
}
exports.isObject = isObject;
function isDate(d) {
return isObject(d) && objectToString(d) === '[object Date]';
}
exports.isDate = isDate;
function isError(e) {
return isObject(e) &&
(objectToString(e) === '[object Error]' || e instanceof Error);
}
exports.isError = isError;
function isFunction(arg) {
return typeof arg === 'function';
}
exports.isFunction = isFunction;
function isPrimitive(arg) {
return arg === null ||
typeof arg === 'boolean' ||
typeof arg === 'number' ||
typeof arg === 'string' ||
typeof arg === 'symbol' || // ES6 symbol
typeof arg === 'undefined';
}
exports.isPrimitive = isPrimitive;
exports.isBuffer = _dereq_('./support/isBuffer');
function objectToString(o) {
return Object.prototype.toString.call(o);
}
function pad(n) {
return n < 10 ? '0' + n.toString(10) : n.toString(10);
}
var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',
'Oct', 'Nov', 'Dec'];
function timestamp() {
var d = new Date();
var time = [pad(d.getHours()),
pad(d.getMinutes()),
pad(d.getSeconds())].join(':');
return [d.getDate(), months[d.getMonth()], time].join(' ');
}
exports.log = function() {
console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));
};
exports.inherits = _dereq_('inherits');
exports._extend = function(origin, add) {
if (!add || !isObject(add)) return origin;
var keys = Object.keys(add);
var i = keys.length;
while (i--) {
origin[keys[i]] = add[keys[i]];
}
return origin;
};
function hasOwnProperty(obj, prop) {
return Object.prototype.hasOwnProperty.call(obj, prop);
}
}).call(this,_dereq_("/usr/local/lib/node_modules/browserify/node_modules/insert-module-globals/node_modules/process/browser.js"),typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
},
{"./support/isBuffer":14,"/usr/local/lib/node_modules/browserify/node_modules/insert-module-globals/node_modules/process/browser.js":18,"inherits":17}],
16:[function(_dereq_,module,exports){
function EventEmitter() {
this._events = this._events || {};
this._maxListeners = this._maxListeners || undefined;
}
module.exports = EventEmitter;
EventEmitter.EventEmitter = EventEmitter;
EventEmitter.prototype._events = undefined;
EventEmitter.prototype._maxListeners = undefined;
EventEmitter.defaultMaxListeners = 10;
EventEmitter.prototype.setMaxListeners = function(n) {
if (!isNumber(n) || n < 0 || isNaN(n))
throw TypeError('n must be a positive number');
this._maxListeners = n;
return this;
};
EventEmitter.prototype.emit = function(type) {
var er, handler, len, args, i, listeners;
if (!this._events)
this._events = {};
if (type === 'error') {
if (!this._events.error ||
(isObject(this._events.error) && !this._events.error.length)) {
er = arguments[1];
if (er instanceof Error) {
throw er; // Unhandled 'error' event
} else {
throw TypeError('Uncaught, unspecified "error" event.');
}
return false;
}
}
handler = this._events[type];
if (isUndefined(handler))
return false;
if (isFunction(handler)) {
switch (arguments.length) {
case 1:
handler.call(this);
break;
case 2:
handler.call(this, arguments[1]);
break;
case 3:
handler.call(this, arguments[1], arguments[2]);
break;
default:
len = arguments.length;
args = new Array(len - 1);
for (i = 1; i < len; i++)
args[i - 1] = arguments[i];
handler.apply(this, args);
}
} else if (isObject(handler)) {
len = arguments.length;
args = new Array(len - 1);
for (i = 1; i < len; i++)
args[i - 1] = arguments[i];
listeners = handler.slice();
len = listeners.length;
for (i = 0; i < len; i++)
listeners[i].apply(this, args);
}
return true;
};
EventEmitter.prototype.addListener = function(type, listener) {
var m;
if (!isFunction(listener))
throw TypeError('listener must be a function');
if (!this._events)
this._events = {};
if (this._events.newListener)
this.emit('newListener', type,
isFunction(listener.listener) ?
listener.listener : listener);
if (!this._events[type])
this._events[type] = listener;
else if (isObject(this._events[type]))
this._events[type].push(listener);
else
this._events[type] = [this._events[type], listener];
if (isObject(this._events[type]) && !this._events[type].warned) {
var m;
if (!isUndefined(this._maxListeners)) {
m = this._maxListeners;
} else {
m = EventEmitter.defaultMaxListeners;
}
if (m && m > 0 && this._events[type].length > m) {
this._events[type].warned = true;
console.error('(node) warning: possible EventEmitter memory ' +
'leak detected. %d listeners added. ' +
'Use emitter.setMaxListeners() to increase limit.',
this._events[type].length);
console.trace();
}
}
return this;
};
EventEmitter.prototype.on = EventEmitter.prototype.addListener;
EventEmitter.prototype.once = function(type, listener) {
if (!isFunction(listener))
throw TypeError('listener must be a function');
var fired = false;
function g() {
this.removeListener(type, g);
if (!fired) {
fired = true;
listener.apply(this, arguments);
}
}
g.listener = listener;
this.on(type, g);
return this;
};
EventEmitter.prototype.removeListener = function(type, listener) {
var list, position, length, i;
if (!isFunction(listener))
throw TypeError('listener must be a function');
if (!this._events || !this._events[type])
return this;
list = this._events[type];
length = list.length;
position = -1;
if (list === listener ||
(isFunction(list.listener) && list.listener === listener)) {
delete this._events[type];
if (this._events.removeListener)
this.emit('removeListener', type, listener);
} else if (isObject(list)) {
for (i = length; i-- > 0;) {
if (list[i] === listener ||
(list[i].listener && list[i].listener === listener)) {
position = i;
break;
}
}
if (position < 0)
return this;
if (list.length === 1) {
list.length = 0;
delete this._events[type];
} else {
list.splice(position, 1);
}
if (this._events.removeListener)
this.emit('removeListener', type, listener);
}
return this;
};
EventEmitter.prototype.removeAllListeners = function(type) {
var key, listeners;
if (!this._events)
return this;
if (!this._events.removeListener) {
if (arguments.length === 0)
this._events = {};
else if (this._events[type])
delete this._events[type];
return this;
}
if (arguments.length === 0) {
for (key in this._events) {
if (key === 'removeListener') continue;
this.removeAllListeners(key);
}
this.removeAllListeners('removeListener');
this._events = {};
return this;
}
listeners = this._events[type];
if (isFunction(listeners)) {
this.removeListener(type, listeners);
} else {
while (listeners.length)
this.removeListener(type, listeners[listeners.length - 1]);
}
delete this._events[type];
return this;
};
EventEmitter.prototype.listeners = function(type) {
var ret;
if (!this._events || !this._events[type])
ret = [];
else if (isFunction(this._events[type]))
ret = [this._events[type]];
else
ret = this._events[type].slice();
return ret;
};
EventEmitter.listenerCount = function(emitter, type) {
var ret;
if (!emitter._events || !emitter._events[type])
ret = 0;
else if (isFunction(emitter._events[type]))
ret = 1;
else
ret = emitter._events[type].length;
return ret;
};
function isFunction(arg) {
return typeof arg === 'function';
}
function isNumber(arg) {
return typeof arg === 'number';
}
function isObject(arg) {
return typeof arg === 'object' && arg !== null;
}
function isUndefined(arg) {
return arg === void 0;
}
},
{}],
17:[function(_dereq_,module,exports){
if (typeof Object.create === 'function') {
module.exports = function inherits(ctor, superCtor) {
ctor.super_ = superCtor
ctor.prototype = Object.create(superCtor.prototype, {
constructor: {
value: ctor,
enumerable: false,
writable: true,
configurable: true
}
});
};
} else {
module.exports = function inherits(ctor, superCtor) {
ctor.super_ = superCtor
var TempCtor = function () {}
TempCtor.prototype = superCtor.prototype
ctor.prototype = new TempCtor()
ctor.prototype.constructor = ctor
}
}
},
{}],
18:[function(_dereq_,module,exports){
var process = module.exports = {};
process.nextTick = (function () {
var canSetImmediate = typeof window !== 'undefined'
&& window.setImmediate;
var canPost = typeof window !== 'undefined'
&& window.postMessage && window.addEventListener
;
if (canSetImmediate) {
return function (f) { return window.setImmediate(f) };
}
if (canPost) {
var queue = [];
window.addEventListener('message', function (ev) {
var source = ev.source;
if ((source === window || source === null) && ev.data === 'process-tick') {
ev.stopPropagation();
if (queue.length > 0) {
var fn = queue.shift();
fn();
}
}
}, true);
return function nextTick(fn) {
queue.push(fn);
window.postMessage('process-tick', '*');
};
}
return function nextTick(fn) {
setTimeout(fn, 0);
};
})();
process.title = 'browser';
process.browser = true;
process.env = {};
process.argv = [];
function noop() {}
process.on = noop;
process.once = noop;
process.off = noop;
process.emit = noop;
process.binding = function (name) {
throw new Error('process.binding is not supported');
}
process.cwd = function () { return '/' };
process.chdir = function (dir) {
throw new Error('process.chdir is not supported');
};
},
{}],
19:[function(_dereq_,module,exports){
module.exports=_dereq_(14)
},
{}],
20:[function(_dereq_,module,exports){
module.exports=_dereq_(15)
},
{"./support/isBuffer":19,"/usr/local/lib/node_modules/browserify/node_modules/insert-module-globals/node_modules/process/browser.js":18,"inherits":17}]},{},[9])
(9)
});
define("ace/mode/html_worker",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/worker/mirror","ace/mode/html/saxparser"], function(require, exports, module) {
"use strict";
var oop = require("../lib/oop");
var lang = require("../lib/lang");
var Mirror = require("../worker/mirror").Mirror;
var SAXParser = require("./html/saxparser").SAXParser;
var errorTypes = {
"expected-doctype-but-got-start-tag": "info",
"expected-doctype-but-got-chars": "info",
"non-html-root": "info",
}
var Worker = exports.Worker = function(sender) {
Mirror.call(this, sender);
this.setTimeout(400);
this.context = null;
};
oop.inherits(Worker, Mirror);
(function() {
this.setOptions = function(options) {
this.context = options.context;
};
this.onUpdate = function() {
var value = this.doc.getValue();
if (!value)
return;
var parser = new SAXParser();
var errors = [];
var noop = function(){};
parser.contentHandler = {
startDocument: noop,
endDocument: noop,
startElement: noop,
endElement: noop,
characters: noop
};
parser.errorHandler = {
error: function(message, location, code) {
errors.push({
row: location.line,
column: location.column,
text: message,
type: errorTypes[code] || "error"
});
}
};
if (this.context)
parser.parseFragment(value, this.context);
else
parser.parse(value);
this.sender.emit("error", errors);
};
}).call(Worker.prototype);
});
define("ace/lib/es5-shim",["require","exports","module"], function(require, exports, module) {
function Empty() {}
if (!Function.prototype.bind) {
Function.prototype.bind = function bind(that) { // .length is 1
var target = this;
if (typeof target != "function") {
throw new TypeError("Function.prototype.bind called on incompatible " + target);
}
var args = slice.call(arguments, 1); // for normal call
var bound = function () {
if (this instanceof bound) {
var result = target.apply(
this,
args.concat(slice.call(arguments))
);
if (Object(result) === result) {
return result;
}
return this;
} else {
return target.apply(
that,
args.concat(slice.call(arguments))
);
}
};
if(target.prototype) {
Empty.prototype = target.prototype;
bound.prototype = new Empty();
Empty.prototype = null;
}
return bound;
};
}
var call = Function.prototype.call;
var prototypeOfArray = Array.prototype;
var prototypeOfObject = Object.prototype;
var slice = prototypeOfArray.slice;
var _toString = call.bind(prototypeOfObject.toString);
var owns = call.bind(prototypeOfObject.hasOwnProperty);
var defineGetter;
var defineSetter;
var lookupGetter;
var lookupSetter;
var supportsAccessors;
if ((supportsAccessors = owns(prototypeOfObject, "__defineGetter__"))) {
defineGetter = call.bind(prototypeOfObject.__defineGetter__);
defineSetter = call.bind(prototypeOfObject.__defineSetter__);
lookupGetter = call.bind(prototypeOfObject.__lookupGetter__);
lookupSetter = call.bind(prototypeOfObject.__lookupSetter__);
}
if ([1,2].splice(0).length != 2) {
if(function() { // test IE < 9 to splice bug - see issue #138
function makeArray(l) {
var a = new Array(l+2);
a[0] = a[1] = 0;
return a;
}
var array = [], lengthBefore;
array.splice.apply(array, makeArray(20));
array.splice.apply(array, makeArray(26));
lengthBefore = array.length; //46
array.splice(5, 0, "XXX"); // add one element
lengthBefore + 1 == array.length
if (lengthBefore + 1 == array.length) {
return true;// has right splice implementation without bugs
}
}()) {//IE 6/7
var array_splice = Array.prototype.splice;
Array.prototype.splice = function(start, deleteCount) {
if (!arguments.length) {
return [];
} else {
return array_splice.apply(this, [
start === void 0 ? 0 : start,
deleteCount === void 0 ? (this.length - start) : deleteCount
].concat(slice.call(arguments, 2)))
}
};
} else {//IE8
Array.prototype.splice = function(pos, removeCount){
var length = this.length;
if (pos > 0) {
if (pos > length)
pos = length;
} else if (pos == void 0) {
pos = 0;
} else if (pos < 0) {
pos = Math.max(length + pos, 0);
}
if (!(pos+removeCount < length))
removeCount = length - pos;
var removed = this.slice(pos, pos+removeCount);
var insert = slice.call(arguments, 2);
var add = insert.length;
if (pos === length) {
if (add) {
this.push.apply(this, insert);
}
} else {
var remove = Math.min(removeCount, length - pos);
var tailOldPos = pos + remove;
var tailNewPos = tailOldPos + add - remove;
var tailCount = length - tailOldPos;
var lengthAfterRemove = length - remove;
if (tailNewPos < tailOldPos) { // case A
for (var i = 0; i < tailCount; ++i) {
this[tailNewPos+i] = this[tailOldPos+i];
}
} else if (tailNewPos > tailOldPos) { // case B
for (i = tailCount; i--; ) {
this[tailNewPos+i] = this[tailOldPos+i];
}
} // else, add == remove (nothing to do)
if (add && pos === lengthAfterRemove) {
this.length = lengthAfterRemove; // truncate array
this.push.apply(this, insert);
} else {
this.length = lengthAfterRemove + add; // reserves space
for (i = 0; i < add; ++i) {
this[pos+i] = insert[i];
}
}
}
return removed;
};
}
}
if (!Array.isArray) {
Array.isArray = function isArray(obj) {
return _toString(obj) == "[object Array]";
};
}
var boxedString = Object("a"),
splitString = boxedString[0] != "a" || !(0 in boxedString);
if (!Array.prototype.forEach) {
Array.prototype.forEach = function forEach(fun /*, thisp*/) {
var object = toObject(this),
self = splitString && _toString(this) == "[object String]" ?
this.split("") :
object,
thisp = arguments[1],
i = -1,
length = self.length >>> 0;
if (_toString(fun) != "[object Function]") {
throw new TypeError(); // TODO message
}
while (++i < length) {
if (i in self) {
fun.call(thisp, self[i], i, object);
}
}
};
}
if (!Array.prototype.map) {
Array.prototype.map = function map(fun /*, thisp*/) {
var object = toObject(this),
self = splitString && _toString(this) == "[object String]" ?
this.split("") :
object,
length = self.length >>> 0,
result = Array(length),
thisp = arguments[1];
if (_toString(fun) != "[object Function]") {
throw new TypeError(fun + " is not a function");
}
for (var i = 0; i < length; i++) {
if (i in self)
result[i] = fun.call(thisp, self[i], i, object);
}
return result;
};
}
if (!Array.prototype.filter) {
Array.prototype.filter = function filter(fun /*, thisp */) {
var object = toObject(this),
self = splitString && _toString(this) == "[object String]" ?
this.split("") :
object,
length = self.length >>> 0,
result = [],
value,
thisp = arguments[1];
if (_toString(fun) != "[object Function]") {
throw new TypeError(fun + " is not a function");
}
for (var i = 0; i < length; i++) {
if (i in self) {
value = self[i];
if (fun.call(thisp, value, i, object)) {
result.push(value);
}
}
}
return result;
};
}
if (!Array.prototype.every) {
Array.prototype.every = function every(fun /*, thisp */) {
var object = toObject(this),
self = splitString && _toString(this) == "[object String]" ?
this.split("") :
object,
length = self.length >>> 0,
thisp = arguments[1];
if (_toString(fun) != "[object Function]") {
throw new TypeError(fun + " is not a function");
}
for (var i = 0; i < length; i++) {
if (i in self && !fun.call(thisp, self[i], i, object)) {
return false;
}
}
return true;
};
}
if (!Array.prototype.some) {
Array.prototype.some = function some(fun /*, thisp */) {
var object = toObject(this),
self = splitString && _toString(this) == "[object String]" ?
this.split("") :
object,
length = self.length >>> 0,
thisp = arguments[1];
if (_toString(fun) != "[object Function]") {
throw new TypeError(fun + " is not a function");
}
for (var i = 0; i < length; i++) {
if (i in self && fun.call(thisp, self[i], i, object)) {
return true;
}
}
return false;
};
}
if (!Array.prototype.reduce) {
Array.prototype.reduce = function reduce(fun /*, initial*/) {
var object = toObject(this),
self = splitString && _toString(this) == "[object String]" ?
this.split("") :
object,
length = self.length >>> 0;
if (_toString(fun) != "[object Function]") {
throw new TypeError(fun + " is not a function");
}
if (!length && arguments.length == 1) {
throw new TypeError("reduce of empty array with no initial value");
}
var i = 0;
var result;
if (arguments.length >= 2) {
result = arguments[1];
} else {
do {
if (i in self) {
result = self[i++];
break;
}
if (++i >= length) {
throw new TypeError("reduce of empty array with no initial value");
}
} while (true);
}
for (; i < length; i++) {
if (i in self) {
result = fun.call(void 0, result, self[i], i, object);
}
}
return result;
};
}
if (!Array.prototype.reduceRight) {
Array.prototype.reduceRight = function reduceRight(fun /*, initial*/) {
var object = toObject(this),
self = splitString && _toString(this) == "[object String]" ?
this.split("") :
object,
length = self.length >>> 0;
if (_toString(fun) != "[object Function]") {
throw new TypeError(fun + " is not a function");
}
if (!length && arguments.length == 1) {
throw new TypeError("reduceRight of empty array with no initial value");
}
var result, i = length - 1;
if (arguments.length >= 2) {
result = arguments[1];
} else {
do {
if (i in self) {
result = self[i--];
break;
}
if (--i < 0) {
throw new TypeError("reduceRight of empty array with no initial value");
}
} while (true);
}
do {
if (i in this) {
result = fun.call(void 0, result, self[i], i, object);
}
} while (i--);
return result;
};
}
if (!Array.prototype.indexOf || ([0, 1].indexOf(1, 2) != -1)) {
Array.prototype.indexOf = function indexOf(sought /*, fromIndex */ ) {
var self = splitString && _toString(this) == "[object String]" ?
this.split("") :
toObject(this),
length = self.length >>> 0;
if (!length) {
return -1;
}
var i = 0;
if (arguments.length > 1) {
i = toInteger(arguments[1]);
}
i = i >= 0 ? i : Math.max(0, length + i);
for (; i < length; i++) {
if (i in self && self[i] === sought) {
return i;
}
}
return -1;
};
}
if (!Array.prototype.lastIndexOf || ([0, 1].lastIndexOf(0, -3) != -1)) {
Array.prototype.lastIndexOf = function lastIndexOf(sought /*, fromIndex */) {
var self = splitString && _toString(this) == "[object String]" ?
this.split("") :
toObject(this),
length = self.length >>> 0;
if (!length) {
return -1;
}
var i = length - 1;
if (arguments.length > 1) {
i = Math.min(i, toInteger(arguments[1]));
}
i = i >= 0 ? i : length - Math.abs(i);
for (; i >= 0; i--) {
if (i in self && sought === self[i]) {
return i;
}
}
return -1;
};
}
if (!Object.getPrototypeOf) {
Object.getPrototypeOf = function getPrototypeOf(object) {
return object.__proto__ || (
object.constructor ?
object.constructor.prototype :
prototypeOfObject
);
};
}
if (!Object.getOwnPropertyDescriptor) {
var ERR_NON_OBJECT = "Object.getOwnPropertyDescriptor called on a " +
"non-object: ";
Object.getOwnPropertyDescriptor = function getOwnPropertyDescriptor(object, property) {
if ((typeof object != "object" && typeof object != "function") || object === null)
throw new TypeError(ERR_NON_OBJECT + object);
if (!owns(object, property))
return;
var descriptor, getter, setter;
descriptor = { enumerable: true, configurable: true };
if (supportsAccessors) {
var prototype = object.__proto__;
object.__proto__ = prototypeOfObject;
var getter = lookupGetter(object, property);
var setter = lookupSetter(object, property);
object.__proto__ = prototype;
if (getter || setter) {
if (getter) descriptor.get = getter;
if (setter) descriptor.set = setter;
return descriptor;
}
}
descriptor.value = object[property];
return descriptor;
};
}
if (!Object.getOwnPropertyNames) {
Object.getOwnPropertyNames = function getOwnPropertyNames(object) {
return Object.keys(object);
};
}
if (!Object.create) {
var createEmpty;
if (Object.prototype.__proto__ === null) {
createEmpty = function () {
return { "__proto__": null };
};
} else {
createEmpty = function () {
var empty = {};
for (var i in empty)
empty[i] = null;
empty.constructor =
empty.hasOwnProperty =
empty.propertyIsEnumerable =
empty.isPrototypeOf =
empty.toLocaleString =
empty.toString =
empty.valueOf =
empty.__proto__ = null;
return empty;
}
}
Object.create = function create(prototype, properties) {
var object;
if (prototype === null) {
object = createEmpty();
} else {
if (typeof prototype != "object")
throw new TypeError("typeof prototype["+(typeof prototype)+"] != 'object'");
var Type = function () {};
Type.prototype = prototype;
object = new Type();
object.__proto__ = prototype;
}
if (properties !== void 0)
Object.defineProperties(object, properties);
return object;
};
}
function doesDefinePropertyWork(object) {
try {
Object.defineProperty(object, "sentinel", {});
return "sentinel" in object;
} catch (exception) {
}
}
if (Object.defineProperty) {
var definePropertyWorksOnObject = doesDefinePropertyWork({});
var definePropertyWorksOnDom = typeof document == "undefined" ||
doesDefinePropertyWork(document.createElement("div"));
if (!definePropertyWorksOnObject || !definePropertyWorksOnDom) {
var definePropertyFallback = Object.defineProperty;
}
}
if (!Object.defineProperty || definePropertyFallback) {
var ERR_NON_OBJECT_DESCRIPTOR = "Property description must be an object: ";
var ERR_NON_OBJECT_TARGET = "Object.defineProperty called on non-object: "
var ERR_ACCESSORS_NOT_SUPPORTED = "getters & setters can not be defined " +
"on this javascript engine";
Object.defineProperty = function defineProperty(object, property, descriptor) {
if ((typeof object != "object" && typeof object != "function") || object === null)
throw new TypeError(ERR_NON_OBJECT_TARGET + object);
if ((typeof descriptor != "object" && typeof descriptor != "function") || descriptor === null)
throw new TypeError(ERR_NON_OBJECT_DESCRIPTOR + descriptor);
if (definePropertyFallback) {
try {
return definePropertyFallback.call(Object, object, property, descriptor);
} catch (exception) {
}
}
if (owns(descriptor, "value")) {
if (supportsAccessors && (lookupGetter(object, property) ||
lookupSetter(object, property)))
{
var prototype = object.__proto__;
object.__proto__ = prototypeOfObject;
delete object[property];
object[property] = descriptor.value;
object.__proto__ = prototype;
} else {
object[property] = descriptor.value;
}
} else {
if (!supportsAccessors)
throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED);
if (owns(descriptor, "get"))
defineGetter(object, property, descriptor.get);
if (owns(descriptor, "set"))
defineSetter(object, property, descriptor.set);
}
return object;
};
}
if (!Object.defineProperties) {
Object.defineProperties = function defineProperties(object, properties) {
for (var property in properties) {
if (owns(properties, property))
Object.defineProperty(object, property, properties[property]);
}
return object;
};
}
if (!Object.seal) {
Object.seal = function seal(object) {
return object;
};
}
if (!Object.freeze) {
Object.freeze = function freeze(object) {
return object;
};
}
try {
Object.freeze(function () {});
} catch (exception) {
Object.freeze = (function freeze(freezeObject) {
return function freeze(object) {
if (typeof object == "function") {
return object;
} else {
return freezeObject(object);
}
};
})(Object.freeze);
}
if (!Object.preventExtensions) {
Object.preventExtensions = function preventExtensions(object) {
return object;
};
}
if (!Object.isSealed) {
Object.isSealed = function isSealed(object) {
return false;
};
}
if (!Object.isFrozen) {
Object.isFrozen = function isFrozen(object) {
return false;
};
}
if (!Object.isExtensible) {
Object.isExtensible = function isExtensible(object) {
if (Object(object) === object) {
throw new TypeError(); // TODO message
}
var name = '';
while (owns(object, name)) {
name += '?';
}
object[name] = true;
var returnValue = owns(object, name);
delete object[name];
return returnValue;
};
}
if (!Object.keys) {
var hasDontEnumBug = true,
dontEnums = [
"toString",
"toLocaleString",
"valueOf",
"hasOwnProperty",
"isPrototypeOf",
"propertyIsEnumerable",
"constructor"
],
dontEnumsLength = dontEnums.length;
for (var key in {"toString": null}) {
hasDontEnumBug = false;
}
Object.keys = function keys(object) {
if (
(typeof object != "object" && typeof object != "function") ||
object === null
) {
throw new TypeError("Object.keys called on a non-object");
}
var keys = [];
for (var name in object) {
if (owns(object, name)) {
keys.push(name);
}
}
if (hasDontEnumBug) {
for (var i = 0, ii = dontEnumsLength; i < ii; i++) {
var dontEnum = dontEnums[i];
if (owns(object, dontEnum)) {
keys.push(dontEnum);
}
}
}
return keys;
};
}
if (!Date.now) {
Date.now = function now() {
return new Date().getTime();
};
}
var ws = "\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003" +
"\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028" +
"\u2029\uFEFF";
if (!String.prototype.trim || ws.trim()) {
ws = "[" + ws + "]";
var trimBeginRegexp = new RegExp("^" + ws + ws + "*"),
trimEndRegexp = new RegExp(ws + ws + "*$");
String.prototype.trim = function trim() {
return String(this).replace(trimBeginRegexp, "").replace(trimEndRegexp, "");
};
}
function toInteger(n) {
n = +n;
if (n !== n) { // isNaN
n = 0;
} else if (n !== 0 && n !== (1/0) && n !== -(1/0)) {
n = (n > 0 || -1) * Math.floor(Math.abs(n));
}
return n;
}
function isPrimitive(input) {
var type = typeof input;
return (
input === null ||
type === "undefined" ||
type === "boolean" ||
type === "number" ||
type === "string"
);
}
function toPrimitive(input) {
var val, valueOf, toString;
if (isPrimitive(input)) {
return input;
}
valueOf = input.valueOf;
if (typeof valueOf === "function") {
val = valueOf.call(input);
if (isPrimitive(val)) {
return val;
}
}
toString = input.toString;
if (typeof toString === "function") {
val = toString.call(input);
if (isPrimitive(val)) {
return val;
}
}
throw new TypeError();
}
var toObject = function (o) {
if (o == null) { // this matches both null and undefined
throw new TypeError("can't convert "+o+" to object");
}
return Object(o);
};
});