openfl
Version:
A fast, productive library for 2D cross-platform development.
390 lines (373 loc) • 10.9 kB
JavaScript
// Class: haxe.xml.Parser
var $global = typeof window != "undefined" ? window : typeof global != "undefined" ? global : typeof self != "undefined" ? self : this
$global.Object.defineProperty(exports, "__esModule", {value: true});
var __map_reserved = {};
// Imports
var $hxClasses = require("./../../hxClasses_stub").default;
var $hxEnums = require("./../../hxEnums_stub").default;
var $import = require("./../../import_stub").default;
function haxe_ds_StringMap() {return require("./../../haxe/ds/StringMap");}
function Xml() {return require("./../../Xml");}
function StringTools() {return require("./../../StringTools");}
function StringBuf() {return require("./../../StringBuf");}
function HxOverrides() {return require("./../../HxOverrides");}
function js__$Boot_HaxeError() {return require("./../../js/_Boot/HaxeError");}
function haxe_xml_XmlParserException() {return require("./../../haxe/xml/XmlParserException");}
function Std() {return require("./../../Std");}
// Constructor
var Parser = function(){}
// Meta
Parser.__name__ = "haxe.xml.Parser";
Parser.__isInterface__ = false;
Parser.prototype = {
};
Parser.prototype.__class__ = Parser.prototype.constructor = $hxClasses["haxe.xml.Parser"] = Parser;
// Init
// Statics
Parser.parse = function(str,strict) {
if(strict == null) {
strict = false;
}
var doc = (Xml().default).createDocument();
Parser.doParse(str,strict,0,doc);
return doc;
}
Parser.doParse = function(str,strict,p,parent) {
if(p == null) {
p = 0;
}
var xml = null;
var state = 1;
var next = 1;
var aname = null;
var start = 0;
var nsubs = 0;
var nbrackets = 0;
var c = (StringTools().default).fastCodeAt(str,p);
var buf = new (StringBuf().default)();
var escapeNext = 1;
var attrValQuote = -1;
while(!(StringTools().default).isEof(c)) {
switch(state) {
case 0:
switch(c) {
case 9:case 10:case 13:case 32:
break;
default:
state = next;
continue;
}
break;
case 1:
if(c == 60) {
state = 0;
next = 2;
} else {
start = p;
state = 13;
continue;
}
break;
case 2:
switch(c) {
case 33:
if((StringTools().default).fastCodeAt(str,p + 1) == 91) {
p += 2;
if((HxOverrides().default).substr(str,p,6).toUpperCase() != "CDATA[") {
throw new (js__$Boot_HaxeError().default)(new (haxe_xml_XmlParserException().default)("Expected <![CDATA[",str,p));
}
p += 5;
state = 17;
start = p + 1;
} else if((StringTools().default).fastCodeAt(str,p + 1) == 68 || (StringTools().default).fastCodeAt(str,p + 1) == 100) {
if((HxOverrides().default).substr(str,p + 2,6).toUpperCase() != "OCTYPE") {
throw new (js__$Boot_HaxeError().default)(new (haxe_xml_XmlParserException().default)("Expected <!DOCTYPE",str,p));
}
p += 8;
state = 16;
start = p + 1;
} else if((StringTools().default).fastCodeAt(str,p + 1) != 45 || (StringTools().default).fastCodeAt(str,p + 2) != 45) {
throw new (js__$Boot_HaxeError().default)(new (haxe_xml_XmlParserException().default)("Expected <!--",str,p));
} else {
p += 2;
state = 15;
start = p + 1;
}
break;
case 47:
if(parent == null) {
throw new (js__$Boot_HaxeError().default)(new (haxe_xml_XmlParserException().default)("Expected node name",str,p));
}
start = p + 1;
state = 0;
next = 10;
break;
case 63:
state = 14;
start = p;
break;
default:
state = 3;
start = p;
continue;
}
break;
case 3:
if(!Parser.isValidChar(c)) {
if(p == start) {
throw new (js__$Boot_HaxeError().default)(new (haxe_xml_XmlParserException().default)("Expected node name",str,p));
}
xml = (Xml().default).createElement((HxOverrides().default).substr(str,start,p - start));
parent.addChild(xml);
++nsubs;
state = 0;
next = 4;
continue;
}
break;
case 4:
switch(c) {
case 47:
state = 11;
break;
case 62:
state = 9;
break;
default:
state = 5;
start = p;
continue;
}
break;
case 5:
if(!Parser.isValidChar(c)) {
if(start == p) {
throw new (js__$Boot_HaxeError().default)(new (haxe_xml_XmlParserException().default)("Expected attribute name",str,p));
}
var tmp = (HxOverrides().default).substr(str,start,p - start);
aname = tmp;
if(xml.exists(aname)) {
throw new (js__$Boot_HaxeError().default)(new (haxe_xml_XmlParserException().default)("Duplicate attribute [" + aname + "]",str,p));
}
state = 0;
next = 6;
continue;
}
break;
case 6:
if(c == 61) {
state = 0;
next = 7;
} else {
throw new (js__$Boot_HaxeError().default)(new (haxe_xml_XmlParserException().default)("Expected =",str,p));
}
break;
case 7:
switch(c) {
case 34:case 39:
buf = new (StringBuf().default)();
state = 8;
start = p + 1;
attrValQuote = c;
break;
default:
throw new (js__$Boot_HaxeError().default)(new (haxe_xml_XmlParserException().default)("Expected \"",str,p));
}
break;
case 8:
switch(c) {
case 38:
buf.addSub(str,start,p - start);
state = 18;
escapeNext = 8;
start = p + 1;
break;
case 60:case 62:
if(strict) {
throw new (js__$Boot_HaxeError().default)(new (haxe_xml_XmlParserException().default)("Invalid unescaped " + String.fromCodePoint(c) + " in attribute value",str,p));
} else if(c == attrValQuote) {
buf.addSub(str,start,p - start);
var val = buf.toString();
buf = new (StringBuf().default)();
xml.set(aname,val);
state = 0;
next = 4;
}
break;
default:
if(c == attrValQuote) {
buf.addSub(str,start,p - start);
var val1 = buf.toString();
buf = new (StringBuf().default)();
xml.set(aname,val1);
state = 0;
next = 4;
}
}
break;
case 9:
p = Parser.doParse(str,strict,p,xml);
start = p;
state = 1;
break;
case 10:
if(!Parser.isValidChar(c)) {
if(start == p) {
throw new (js__$Boot_HaxeError().default)(new (haxe_xml_XmlParserException().default)("Expected node name",str,p));
}
var v = (HxOverrides().default).substr(str,start,p - start);
if(parent == null || parent.nodeType != 0) {
throw new (js__$Boot_HaxeError().default)(new (haxe_xml_XmlParserException().default)("Unexpected </" + v + ">, tag is not open",str,p));
}
if(v != parent.get_nodeName()) {
throw new (js__$Boot_HaxeError().default)(new (haxe_xml_XmlParserException().default)("Expected </" + parent.get_nodeName() + ">",str,p));
}
state = 0;
next = 12;
continue;
}
break;
case 11:
if(c == 62) {
state = 1;
} else {
throw new (js__$Boot_HaxeError().default)(new (haxe_xml_XmlParserException().default)("Expected >",str,p));
}
break;
case 12:
if(c == 62) {
if(nsubs == 0) {
parent.addChild((Xml().default).createPCData(""));
}
return p;
} else {
throw new (js__$Boot_HaxeError().default)(new (haxe_xml_XmlParserException().default)("Expected >",str,p));
}
break;
case 13:
if(c == 60) {
buf.addSub(str,start,p - start);
var child = (Xml().default).createPCData(buf.toString());
buf = new (StringBuf().default)();
parent.addChild(child);
++nsubs;
state = 0;
next = 2;
} else if(c == 38) {
buf.addSub(str,start,p - start);
state = 18;
escapeNext = 13;
start = p + 1;
}
break;
case 14:
if(c == 63 && (StringTools().default).fastCodeAt(str,p + 1) == 62) {
++p;
var str1 = (HxOverrides().default).substr(str,start + 1,p - start - 2);
parent.addChild((Xml().default).createProcessingInstruction(str1));
++nsubs;
state = 1;
}
break;
case 15:
if(c == 45 && (StringTools().default).fastCodeAt(str,p + 1) == 45 && (StringTools().default).fastCodeAt(str,p + 2) == 62) {
parent.addChild((Xml().default).createComment((HxOverrides().default).substr(str,start,p - start)));
++nsubs;
p += 2;
state = 1;
}
break;
case 16:
if(c == 91) {
++nbrackets;
} else if(c == 93) {
--nbrackets;
} else if(c == 62 && nbrackets == 0) {
parent.addChild((Xml().default).createDocType((HxOverrides().default).substr(str,start,p - start)));
++nsubs;
state = 1;
}
break;
case 17:
if(c == 93 && (StringTools().default).fastCodeAt(str,p + 1) == 93 && (StringTools().default).fastCodeAt(str,p + 2) == 62) {
var child1 = (Xml().default).createCData((HxOverrides().default).substr(str,start,p - start));
parent.addChild(child1);
++nsubs;
p += 2;
state = 1;
}
break;
case 18:
if(c == 59) {
var s = (HxOverrides().default).substr(str,start,p - start);
if((StringTools().default).fastCodeAt(s,0) == 35) {
var c1 = (StringTools().default).fastCodeAt(s,1) == 120 ? (Std().default).parseInt("0" + (HxOverrides().default).substr(s,1,s.length - 1)) : (Std().default).parseInt((HxOverrides().default).substr(s,1,s.length - 1));
buf.addChar(c1);
} else if(!Parser.escapes.exists(s)) {
if(strict) {
throw new (js__$Boot_HaxeError().default)(new (haxe_xml_XmlParserException().default)("Undefined entity: " + s,str,p));
}
buf.add("&" + s + ";");
} else {
buf.add(Parser.escapes.get(s));
}
start = p + 1;
state = escapeNext;
} else if(!Parser.isValidChar(c) && c != 35) {
if(strict) {
throw new (js__$Boot_HaxeError().default)(new (haxe_xml_XmlParserException().default)("Invalid character in entity: " + String.fromCodePoint(c),str,p));
}
buf.addChar(38);
buf.addSub(str,start,p - start);
--p;
start = p + 1;
state = escapeNext;
}
break;
}
c = (StringTools().default).fastCodeAt(str,++p);
}
if(state == 1) {
start = p;
state = 13;
}
if(state == 13) {
if(parent.nodeType == 0) {
throw new (js__$Boot_HaxeError().default)(new (haxe_xml_XmlParserException().default)("Unclosed node <" + parent.get_nodeName() + ">",str,p));
}
if(p != start || nsubs == 0) {
buf.addSub(str,start,p - start);
parent.addChild((Xml().default).createPCData(buf.toString()));
++nsubs;
}
return p;
}
if(!strict && state == 18 && escapeNext == 13) {
buf.addChar(38);
buf.addSub(str,start,p - start);
parent.addChild((Xml().default).createPCData(buf.toString()));
++nsubs;
return p;
}
throw new (js__$Boot_HaxeError().default)(new (haxe_xml_XmlParserException().default)("Unexpected end",str,p));
}
Parser.isValidChar = function(c) {
if(!(c >= 97 && c <= 122 || c >= 65 && c <= 90 || c >= 48 && c <= 57 || c == 58 || c == 46 || c == 95)) {
return c == 45;
} else {
return true;
}
}
Parser.escapes = (function($this) {
var $r;
var h = new (haxe_ds_StringMap().default)();
h.set("lt","<");
h.set("gt",">");
h.set("amp","&");
h.set("quot","\"");
h.set("apos","'");
$r = h;
return $r;
}(this))
// Export
exports.default = Parser;