mirror of
https://github.com/NativeScript/NativeScript.git
synced 2025-08-16 03:31:45 +08:00
feat(xml parser): Only allow angular syntax extensions if configured.
Configure via the public `angularSyntax` property on EasySAXParser and the XmlParser wrapper.
This commit is contained in:
1
js-libs/easysax/easysax.d.ts
vendored
1
js-libs/easysax/easysax.d.ts
vendored
@ -5,6 +5,7 @@ declare module "js-libs/easysax" {
|
||||
parse(xml: string): void;
|
||||
on(name: string, cb: Function): void;
|
||||
ns(root: string, ns: any): void;
|
||||
public angularSyntax: boolean;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -54,17 +54,11 @@
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
*/
|
||||
|
||||
// << ------------------------------------------------------------------------ >> //
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
if (typeof exports === 'object' /*&& this == exports*/) {
|
||||
module.exports.EasySAXParser = EasySAXParser;
|
||||
};
|
||||
@ -74,37 +68,53 @@ function EasySAXParser() {
|
||||
|
||||
if (!this) return null;
|
||||
|
||||
this.angularSyntax = false;
|
||||
|
||||
function nullFunc() {};
|
||||
|
||||
var onTextNode = nullFunc, onStartNode = nullFunc, onEndNode = nullFunc, onCDATA = nullFunc, onError = nullFunc, onComment, onQuestion, onAttention;
|
||||
var is_onComment, is_onQuestion, is_onAttention;
|
||||
this.onTextNode = nullFunc;
|
||||
this.onStartNode = nullFunc;
|
||||
this.onEndNode = nullFunc;
|
||||
this.onCDATA = nullFunc;
|
||||
this.onError = nullFunc;
|
||||
this.onComment = null;
|
||||
this.onQuestion = null;
|
||||
this.onAttention = null;
|
||||
this.is_onComment = this.is_onQuestion = this.is_onAttention = false;
|
||||
|
||||
var isNamespace = false, useNS , default_xmlns, xmlns
|
||||
, nsmatrix = {xmlns: xmlns}
|
||||
, hasSurmiseNS = false
|
||||
this.isNamespace = false;
|
||||
this.useNS = null;
|
||||
this.default_xmlns = null;
|
||||
this.xmlns = null;
|
||||
this.nsmatrix = {xmlns: this.xmlns};
|
||||
this.hasSurmiseNS = false;
|
||||
;
|
||||
|
||||
|
||||
this.on = function(name, cb) {
|
||||
this.attr_string = ''; // строка атрибутов
|
||||
this.attr_posstart = 0; //
|
||||
this.attr_res; // закешированный результат разбора атрибутов , null - разбор не проводился, object - хеш атрибутов, true - нет атрибутов, false - невалидный xml
|
||||
}
|
||||
|
||||
EasySAXParser.prototype.on = function(name, cb) {
|
||||
if (typeof cb !== 'function') {
|
||||
if (cb !== null) return;
|
||||
};
|
||||
|
||||
switch(name) {
|
||||
case 'error': onError = cb || nullFunc; break;
|
||||
case 'startNode': onStartNode = cb || nullFunc; break;
|
||||
case 'endNode': onEndNode = cb || nullFunc; break;
|
||||
case 'error': this.onError = cb || nullFunc; break;
|
||||
case 'startNode': this.onStartNode = cb || nullFunc; break;
|
||||
case 'endNode': this.onEndNode = cb || nullFunc; break;
|
||||
case 'textNode': onTextNode = cb || nullFunc; break;
|
||||
case 'cdata': onCDATA = cb || nullFunc; break;
|
||||
|
||||
case 'comment': onComment = cb; is_onComment = !!cb; break;
|
||||
case 'question': onQuestion = cb; is_onQuestion = !!cb; break; // <? .... ?>
|
||||
case 'attention': onAttention = cb; is_onAttention = !!cb; break; // <!XXXXX zzzz="eeee">
|
||||
case 'cdata': this.onCDATA = cb || nullFunc; break;
|
||||
|
||||
case 'comment': this.onComment = cb; this.is_onComment = !!cb; break;
|
||||
case 'question': this.onQuestion = cb; this.is_onQuestion = !!cb; break; // <? .... ?>
|
||||
case 'attention': this.onAttention = cb; this.is_onAttention = !!cb; break; // <!XXXXX zzzz="eeee">
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
this.ns = function(root, ns) {
|
||||
EasySAXParser.prototype.ns = function(root, ns) {
|
||||
if (!root || typeof root !== 'string' || !ns) {
|
||||
return;
|
||||
};
|
||||
@ -120,34 +130,35 @@ function EasySAXParser() {
|
||||
};
|
||||
|
||||
if (ok) {
|
||||
isNamespace = true;
|
||||
default_xmlns = root;
|
||||
useNS = x;
|
||||
};
|
||||
this.isNamespace = true;
|
||||
this.default_xmlns = root;
|
||||
this.useNS = x;
|
||||
};
|
||||
};
|
||||
|
||||
this.parse = function(xml) {
|
||||
|
||||
EasySAXParser.prototype.parse = function(xml) {
|
||||
if (typeof xml !== 'string') {
|
||||
return;
|
||||
};
|
||||
|
||||
if (isNamespace) {
|
||||
nsmatrix = {xmlns: default_xmlns};
|
||||
if (this.isNamespace) {
|
||||
this.nsmatrix = {xmlns: this.default_xmlns};
|
||||
|
||||
parse(xml);
|
||||
|
||||
nsmatrix = false;
|
||||
this.nsmatrix = false;
|
||||
|
||||
} else {
|
||||
parse(xml);
|
||||
};
|
||||
|
||||
attr_res = true;
|
||||
};
|
||||
this.attr_res = true;
|
||||
};
|
||||
|
||||
// -----------------------------------------------------
|
||||
// -----------------------------------------------------
|
||||
|
||||
var xharsQuot={constructor: false, hasOwnProperty: false, isPrototypeOf: false, propertyIsEnumerable: false, toLocaleString: false, toString: false, valueOf: false
|
||||
var xharsQuot={constructor: false, hasOwnProperty: false, isPrototypeOf: false, propertyIsEnumerable: false, toLocaleString: false, toString: false, valueOf: false
|
||||
, quot: '"'
|
||||
, QUOT: '"'
|
||||
, amp: '&'
|
||||
@ -168,10 +179,10 @@ function EasySAXParser() {
|
||||
, sup3: '\u00B3'
|
||||
, micro: '\u00B5'
|
||||
, para: '\u00B6'
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
function rpEntities(s, d, x, z) {
|
||||
function rpEntities(s, d, x, z) {
|
||||
if (z) {
|
||||
return xharsQuot[z] || '\x01';
|
||||
};
|
||||
@ -181,9 +192,9 @@ function EasySAXParser() {
|
||||
};
|
||||
|
||||
return String.fromCharCode(parseInt(x, 16));
|
||||
};
|
||||
};
|
||||
|
||||
function unEntities(s, i) {
|
||||
function unEntities(s, i) {
|
||||
s = String(s);
|
||||
if (s.length > 3 && s.indexOf('&') !== -1) {
|
||||
if (s.indexOf('>') !== -1) s = s.replace(/>/g, '>');
|
||||
@ -196,11 +207,23 @@ function EasySAXParser() {
|
||||
};
|
||||
|
||||
return s;
|
||||
};
|
||||
};
|
||||
|
||||
var attr_string = ''; // строка атрибутов
|
||||
var attr_posstart = 0; //
|
||||
var attr_res; // закешированный результат разбора атрибутов , null - разбор не проводился, object - хеш атрибутов, true - нет атрибутов, false - невалидный xml
|
||||
|
||||
EasySAXParser.prototype.allowedAngularAttributeChars = function(w) {
|
||||
if (!this.angularSyntax) {
|
||||
return false;
|
||||
} else {
|
||||
return (
|
||||
w === 40 || // (
|
||||
w === 41 || // )
|
||||
w === 91 || // [
|
||||
w === 93 || // ]
|
||||
w === 94 || // ^
|
||||
w === 35 // #
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
/*
|
||||
парсит атрибуты по требованию. Важно! - функция не генерирует исключения.
|
||||
@ -210,11 +233,9 @@ function EasySAXParser() {
|
||||
если есть атрибуты то возврашается обьект(хеш)
|
||||
*/
|
||||
|
||||
var RGX_ATTR_NAME = /[^\w:-]+/g;
|
||||
|
||||
function getAttrs() {
|
||||
if (attr_res !== null) {
|
||||
return attr_res;
|
||||
EasySAXParser.prototype.getAttrs = function() {
|
||||
if (this.attr_res !== null) {
|
||||
return this.attr_res;
|
||||
};
|
||||
|
||||
/*
|
||||
@ -231,10 +252,10 @@ function EasySAXParser() {
|
||||
|
||||
var u
|
||||
, res = {}
|
||||
, s = attr_string
|
||||
, i = attr_posstart
|
||||
, s = this.attr_string
|
||||
, i = this.attr_posstart
|
||||
, l = s.length
|
||||
, attr_list = hasSurmiseNS ? [] : false
|
||||
, attr_list = this.hasSurmiseNS ? [] : false
|
||||
, name, value = ''
|
||||
, ok = false
|
||||
, noValueAttribute = false
|
||||
@ -251,9 +272,10 @@ function EasySAXParser() {
|
||||
continue
|
||||
};
|
||||
|
||||
if ((w < 65 && w !== 40 && w !== 41 && w !== 35) || // allow parens () -- used for angular syntax
|
||||
w > 122 || (w === 92 || (w > 93 && w < 97)) ) { // ожидаем символ
|
||||
return attr_res = false; // error. invalid char
|
||||
// Check for valid attribute start char
|
||||
if ((w < 65 && !this.allowedAngularAttributeChars(w)) ||
|
||||
w > 122 || (w > 90 && w < 97 && !this.allowedAngularAttributeChars(w)) ) { // ожидаем символ
|
||||
return this.attr_res = false; // error. invalid char
|
||||
};
|
||||
|
||||
for(j = i + 1; j < l; j++) { // проверяем все символы имени атрибута
|
||||
@ -268,7 +290,7 @@ function EasySAXParser() {
|
||||
}
|
||||
};
|
||||
|
||||
if (w === 91 || w === 93 || w === 40 || w === 41 || w === 94 || w === 35) { // Angular special attribute chars:[]()^
|
||||
if (this.allowedAngularAttributeChars(w)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -281,7 +303,7 @@ function EasySAXParser() {
|
||||
} else {
|
||||
//console.log('error 2');
|
||||
if (!noValueAttribute)
|
||||
return attr_res = false; // error. invalid char
|
||||
return this.attr_res = false; // error. invalid char
|
||||
};
|
||||
|
||||
break;
|
||||
@ -292,7 +314,7 @@ function EasySAXParser() {
|
||||
|
||||
if (name === 'xmlns:xmlns') {
|
||||
//console.log('error 6')
|
||||
return attr_res = false; // error. invalid name
|
||||
return this.attr_res = false; // error. invalid name
|
||||
};
|
||||
|
||||
w = s.charCodeAt(j+1);
|
||||
@ -314,14 +336,14 @@ function EasySAXParser() {
|
||||
j = s.indexOf('\'', i = j+2 );
|
||||
|
||||
} else { // "'"
|
||||
return attr_res = false; // error. invalid char
|
||||
return this.attr_res = false; // error. invalid char
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
if (j === -1) {
|
||||
//console.log('error 4')
|
||||
return attr_res = false; // error. invalid char
|
||||
return this.attr_res = false; // error. invalid char
|
||||
};
|
||||
|
||||
|
||||
@ -331,7 +353,7 @@ function EasySAXParser() {
|
||||
if (w > 32 || w < 9 || (w < 32 && w > 13)) {
|
||||
// error. invalid char
|
||||
//console.log('error 5')
|
||||
return attr_res = false;
|
||||
return this.attr_res = false;
|
||||
};
|
||||
};
|
||||
|
||||
@ -345,32 +367,32 @@ function EasySAXParser() {
|
||||
//i = j + 1; // след. семвол уже проверен потому проверять нужно следуюший
|
||||
i = j; // след. семвол уже проверен потому проверять нужно следуюший
|
||||
|
||||
if (isNamespace) { //
|
||||
if (hasSurmiseNS) {
|
||||
if (this.isNamespace) { //
|
||||
if (this.hasSurmiseNS) {
|
||||
// есть подозрение что в атрибутах присутствует xmlns
|
||||
|
||||
if (newalias = name === 'xmlns' ? 'xmlns' : name.charCodeAt(0) === 120 && name.substr(0, 6) === 'xmlns:' && name.substr(6) ) {
|
||||
alias = useNS[unEntities(value)];
|
||||
alias = this.useNS[unEntities(value)];
|
||||
|
||||
if (alias) {
|
||||
if (nsmatrix[newalias] !== alias) {
|
||||
if (this.nsmatrix[newalias] !== alias) {
|
||||
if (!hasNewMatrix) {
|
||||
hasNewMatrix = true;
|
||||
nn = {}; for (n in nsmatrix) nn[n] = nsmatrix[n];
|
||||
nsmatrix = nn;
|
||||
nn = {}; for (n in this.nsmatrix) nn[n] = this.nsmatrix[n];
|
||||
this.nsmatrix = nn;
|
||||
};
|
||||
|
||||
nsmatrix[newalias] = alias;
|
||||
this.nsmatrix[newalias] = alias;
|
||||
};
|
||||
} else {
|
||||
if (nsmatrix[newalias]) {
|
||||
if (this.nsmatrix[newalias]) {
|
||||
if (!hasNewMatrix) {
|
||||
hasNewMatrix = true;
|
||||
nn = {}; for (n in nsmatrix) nn[n] = nsmatrix[n];
|
||||
nsmatrix = nn;
|
||||
nn = {}; for (n in this.nsmatrix) nn[n] = this.nsmatrix[n];
|
||||
this.nsmatrix = nn;
|
||||
};
|
||||
|
||||
nsmatrix[newalias] = false;
|
||||
this.nsmatrix[newalias] = false;
|
||||
};
|
||||
};
|
||||
|
||||
@ -385,7 +407,7 @@ function EasySAXParser() {
|
||||
w = name.length;
|
||||
while(--w) {
|
||||
if (name.charCodeAt(w) === 58) { // ':'
|
||||
if (w = nsmatrix[name.substring(0, w)] ) {
|
||||
if (w = this.nsmatrix[name.substring(0, w)] ) {
|
||||
res[w + name.substr(w)] = value;
|
||||
};
|
||||
continue aa;
|
||||
@ -401,11 +423,11 @@ function EasySAXParser() {
|
||||
|
||||
|
||||
if (!ok) {
|
||||
return attr_res = true; // атрибутов нет, ошибок тоже нет
|
||||
return this.attr_res = true; // атрибутов нет, ошибок тоже нет
|
||||
};
|
||||
|
||||
|
||||
if (hasSurmiseNS) {
|
||||
if (this.hasSurmiseNS) {
|
||||
bb:
|
||||
|
||||
for (i = 0, l = attr_list.length; i < l; i++) {
|
||||
@ -414,7 +436,7 @@ function EasySAXParser() {
|
||||
w = name.length;
|
||||
while(--w) { // name.indexOf(':')
|
||||
if (name.charCodeAt(w) === 58) { // ':'
|
||||
if (w = nsmatrix[name.substring(0, w)]) {
|
||||
if (w = this.nsmatrix[name.substring(0, w)]) {
|
||||
res[w + name.substr(w)] = attr_list[i];
|
||||
};
|
||||
continue bb;
|
||||
@ -426,12 +448,12 @@ function EasySAXParser() {
|
||||
};
|
||||
};
|
||||
|
||||
return attr_res = res;
|
||||
};
|
||||
return this.attr_res = res;
|
||||
};
|
||||
|
||||
|
||||
// xml - string
|
||||
function parse(xml) {
|
||||
// xml - string
|
||||
EasySAXParser.prototype.parse = function(xml) {
|
||||
var u
|
||||
, xml = String(xml)
|
||||
, nodestack = []
|
||||
@ -465,7 +487,7 @@ function EasySAXParser() {
|
||||
if (i === -1) { // конец разбора
|
||||
|
||||
if (nodestack.length) {
|
||||
onError('end file');
|
||||
this.onError('end file');
|
||||
return;
|
||||
};
|
||||
|
||||
@ -473,7 +495,7 @@ function EasySAXParser() {
|
||||
};
|
||||
|
||||
if (j !== i && !stop) {
|
||||
ok = onTextNode(xml.substring(j, i), unEntities);
|
||||
ok = this.onTextNode(xml.substring(j, i), unEntities);
|
||||
if (ok === false) return;
|
||||
};
|
||||
|
||||
@ -484,32 +506,30 @@ function EasySAXParser() {
|
||||
if (w === 91 && xml.substr(i+3, 6) === 'CDATA[') { // 91 == "["
|
||||
j = xml.indexOf(']]>', i);
|
||||
if (j === -1) {
|
||||
onError('cdata');
|
||||
this.onError('cdata');
|
||||
return;
|
||||
};
|
||||
|
||||
//x = xml.substring(i+9, j);
|
||||
if (!stop) {
|
||||
ok = onCDATA(xml.substring(i+9, j), false);
|
||||
ok = this.onCDATA(xml.substring(i+9, j), false);
|
||||
if (ok === false) return;
|
||||
};
|
||||
|
||||
|
||||
j += 3;
|
||||
continue;
|
||||
};
|
||||
|
||||
|
||||
if (w === 45 && xml.charCodeAt(i+3) === 45) { // 45 == "-"
|
||||
j = xml.indexOf('-->', i);
|
||||
if (j === -1) {
|
||||
onError('expected -->');
|
||||
this.onError('expected -->');
|
||||
return;
|
||||
};
|
||||
|
||||
|
||||
if (is_onComment && !stop) {
|
||||
ok = onComment(xml.substring(i+4, j), unEntities);
|
||||
if (this.is_onComment && !stop) {
|
||||
ok = this.onComment(xml.substring(i+4, j), unEntities);
|
||||
if (ok === false) return;
|
||||
};
|
||||
|
||||
@ -519,12 +539,12 @@ function EasySAXParser() {
|
||||
|
||||
j = xml.indexOf('>', i+1);
|
||||
if (j === -1) {
|
||||
onError('expected ">"');
|
||||
this.onError('expected ">"');
|
||||
return;
|
||||
};
|
||||
|
||||
if (is_onAttention && !stop) {
|
||||
ok = onAttention(xml.substring(i, j+1), unEntities);
|
||||
if (this.is_onAttention && !stop) {
|
||||
ok = this.onAttention(xml.substring(i, j+1), unEntities);
|
||||
if (ok === false) return;
|
||||
};
|
||||
|
||||
@ -535,12 +555,12 @@ function EasySAXParser() {
|
||||
if (w === 63) { // "?"
|
||||
j = xml.indexOf('?>', i);
|
||||
if (j === -1) { // error
|
||||
onError('...?>');
|
||||
this.onError('...?>');
|
||||
return;
|
||||
};
|
||||
|
||||
if (is_onQuestion) {
|
||||
ok = onQuestion(xml.substring(i, j+2));
|
||||
if (this.is_onQuestion) {
|
||||
ok = this.onQuestion(xml.substring(i, j+2));
|
||||
if (ok === false) return;
|
||||
};
|
||||
|
||||
@ -552,11 +572,11 @@ function EasySAXParser() {
|
||||
j = xml.indexOf('>', i+1);
|
||||
|
||||
if (j == -1) { // error
|
||||
onError('...>');
|
||||
this.onError('...>');
|
||||
return;
|
||||
};
|
||||
|
||||
attr_res = true; // атрибутов нет
|
||||
this.attr_res = true; // атрибутов нет
|
||||
|
||||
//if (xml.charCodeAt(i+1) === 47) { // </...
|
||||
if (w === 47) { // </...
|
||||
@ -569,7 +589,7 @@ function EasySAXParser() {
|
||||
|
||||
//console.log()
|
||||
if (xml.substring(i+2, q) !== x) {
|
||||
onError('close tagname');
|
||||
this.onError('close tagname');
|
||||
return;
|
||||
};
|
||||
|
||||
@ -581,7 +601,7 @@ function EasySAXParser() {
|
||||
continue;
|
||||
};
|
||||
|
||||
onError('close tag');
|
||||
this.onError('close tag');
|
||||
return;
|
||||
};
|
||||
|
||||
@ -599,7 +619,7 @@ function EasySAXParser() {
|
||||
};
|
||||
|
||||
if ( !(w > 96 && w < 123 || w > 64 && w <91) ) {
|
||||
onError('first char nodeName');
|
||||
this.onError('first char nodeName');
|
||||
return;
|
||||
};
|
||||
|
||||
@ -612,11 +632,11 @@ function EasySAXParser() {
|
||||
|
||||
if (w===32 || (w<14 && w > 8)) { // \f\n\r\t\v пробел
|
||||
elem = x.substring(0, q)
|
||||
attr_res = null; // возможно есть атирибуты
|
||||
this.attr_res = null; // возможно есть атирибуты
|
||||
break;
|
||||
};
|
||||
|
||||
onError('invalid nodeName');
|
||||
this.onError('invalid nodeName');
|
||||
return;
|
||||
};
|
||||
|
||||
@ -626,12 +646,12 @@ function EasySAXParser() {
|
||||
};
|
||||
|
||||
|
||||
if (isNamespace) {
|
||||
if (this.isNamespace) {
|
||||
if (stop) {
|
||||
if (tagend) {
|
||||
if (!tagstart) {
|
||||
if (--stopIndex === 0) {
|
||||
nsmatrix = stacknsmatrix.pop();
|
||||
this.nsmatrix = stacknsmatrix.pop();
|
||||
};
|
||||
};
|
||||
|
||||
@ -644,19 +664,19 @@ function EasySAXParser() {
|
||||
continue;
|
||||
};
|
||||
|
||||
_nsmatrix = nsmatrix;
|
||||
_nsmatrix = this.nsmatrix;
|
||||
|
||||
if (!tagend) {
|
||||
stacknsmatrix.push(nsmatrix);
|
||||
stacknsmatrix.push(this.nsmatrix);
|
||||
|
||||
if (attr_res !== true) {
|
||||
if (hasSurmiseNS = x.indexOf('xmlns', q) !== -1) {
|
||||
attr_string = x;
|
||||
attr_posstart = q;
|
||||
if (this.attr_res !== true) {
|
||||
if (this.hasSurmiseNS = x.indexOf('xmlns', q) !== -1) {
|
||||
this.attr_string = x;
|
||||
this.attr_posstart = q;
|
||||
|
||||
getAttrs();
|
||||
this.getAttrs();
|
||||
|
||||
hasSurmiseNS = false;
|
||||
this.hasSurmiseNS = false;
|
||||
};
|
||||
};
|
||||
};
|
||||
@ -664,25 +684,23 @@ function EasySAXParser() {
|
||||
|
||||
w = elem.indexOf(':');
|
||||
if (w !== -1) {
|
||||
xmlns = nsmatrix[elem.substring(0, w)];
|
||||
xmlns = this.nsmatrix[elem.substring(0, w)];
|
||||
elem = elem.substr(w+1);
|
||||
|
||||
|
||||
} else {
|
||||
xmlns = nsmatrix.xmlns;
|
||||
xmlns = this.nsmatrix.xmlns;
|
||||
};
|
||||
|
||||
|
||||
if (!xmlns) {
|
||||
if (tagend) {
|
||||
if (tagstart) {
|
||||
nsmatrix = _nsmatrix;
|
||||
this.nsmatrix = _nsmatrix;
|
||||
} else {
|
||||
nsmatrix = stacknsmatrix.pop();
|
||||
this.nsmatrix = stacknsmatrix.pop();
|
||||
};
|
||||
} else {
|
||||
stopIndex = 1; // первый элемент для которого не определено пространство имен
|
||||
attr_res = true;
|
||||
this.attr_res = true;
|
||||
};
|
||||
|
||||
j += 1;
|
||||
@ -694,12 +712,12 @@ function EasySAXParser() {
|
||||
|
||||
//string_node = xml.substring(i, j+1); // текст ноды как есть
|
||||
|
||||
|
||||
if (tagstart) { // is_onStartNode
|
||||
attr_string = x;
|
||||
attr_posstart = q;
|
||||
this.attr_string = x;
|
||||
this.attr_posstart = q;
|
||||
|
||||
ok = onStartNode(elem, getAttrs, unEntities, tagend
|
||||
var that = this;
|
||||
ok = this.onStartNode(elem, function() { return that.getAttrs() }, unEntities, tagend
|
||||
, getStringNode
|
||||
);
|
||||
|
||||
@ -707,11 +725,11 @@ function EasySAXParser() {
|
||||
return;
|
||||
};
|
||||
|
||||
attr_res = true;
|
||||
this.attr_res = true;
|
||||
};
|
||||
|
||||
if (tagend) {
|
||||
ok = onEndNode(elem, unEntities, tagstart
|
||||
ok = this.onEndNode(elem, unEntities, tagstart
|
||||
, getStringNode
|
||||
);
|
||||
|
||||
@ -719,21 +737,15 @@ function EasySAXParser() {
|
||||
return;
|
||||
};
|
||||
|
||||
if (isNamespace) {
|
||||
if (this.isNamespace) {
|
||||
if (tagstart) {
|
||||
nsmatrix = _nsmatrix;
|
||||
this.nsmatrix = _nsmatrix;
|
||||
} else {
|
||||
nsmatrix = stacknsmatrix.pop();
|
||||
this.nsmatrix = stacknsmatrix.pop();
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
j += 1;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -15,6 +15,7 @@ describe("angular xml parser", () => {
|
||||
break;
|
||||
}
|
||||
});
|
||||
parser.angularSyntax = true;
|
||||
});
|
||||
|
||||
it("parses [property] binding", () => {
|
||||
@ -53,7 +54,6 @@ describe("angular xml parser", () => {
|
||||
assert.equal(last_attrs['text'], 'Name');
|
||||
});
|
||||
|
||||
return
|
||||
it("detects equals without value", () => {
|
||||
parser.parse("<TextField brokenTag= />");
|
||||
|
||||
@ -71,4 +71,11 @@ describe("angular xml parser", () => {
|
||||
|
||||
assert.isFalse(last_attrs);
|
||||
});
|
||||
|
||||
it("rejects angular properties if syntax disabled", () => {
|
||||
parser.angularSyntax = false;
|
||||
parser.parse("<TextField [text]='somevalue' />");
|
||||
|
||||
assert.isFalse(last_attrs);
|
||||
});
|
||||
});
|
||||
|
2
xml/xml.d.ts
vendored
2
xml/xml.d.ts
vendored
@ -86,7 +86,7 @@ declare module "xml" {
|
||||
* @param onError The callback to execute when a parser error occurs. The 'error' parameter contains the error.
|
||||
* @param processNamespaces Specifies whether namespaces should be processed.
|
||||
*/
|
||||
constructor(onEvent: (event: ParserEvent) => void, onError?: (error: Error) => void, processNamespaces?: boolean);
|
||||
constructor(onEvent: (event: ParserEvent) => void, onError?: (error: Error) => void, processNamespaces?: boolean, angularSyntax?: boolean);
|
||||
|
||||
/**
|
||||
* Parses the supplied xml string.
|
||||
|
@ -148,6 +148,14 @@ export class XmlParser implements definition.XmlParser {
|
||||
}
|
||||
}
|
||||
|
||||
public get angularSyntax() : boolean {
|
||||
return this._parser.angularSyntax;
|
||||
}
|
||||
|
||||
public set angularSyntax(value: boolean) {
|
||||
this._parser.angularSyntax = value;
|
||||
}
|
||||
|
||||
public parse(xmlString: string): void {
|
||||
if (this._processNamespaces) {
|
||||
this._namespaceStack = [];
|
||||
|
Reference in New Issue
Block a user