XUL-App
view release on metacpan or search on metacpan
share/js/jslib/utils/sax.js view on Meta::CPAN
this.handler.endElement(this.cname[this.curr])
this.curr--;
if(this.curr == 0)
{
this.doc = false;
this.handler.endDocument();
return;
}
continue;
}
// check for <![CDATA[ start
if (this.str.indexOf("<![CDATA[") == 0) {
this.notToBeParsed_CDATA.running = true;
this.notToBeParsed_CDATA.string = "";
this.str = this.str.substring(9, this.str.length);
continue;
}
// check last for tags
var estart = this.str.indexOf("<");
if(estart == 0)
{ // new element
close = this.indexEndElement(this.str);
if(close == -1)
{
return;
}
var empty = (this.str.substring(close - 1,close) == "/");
if(empty)
{
var starttag = this.str.substring(1,close - 1);
}else{
starttag = this.str.substring(1,close);
}
var nextspace = starttag.indexOf(" ");
var attribs = new String();
var name = new String();
if(nextspace != -1)
{
name = starttag.substring(0,nextspace);
attribs = starttag.substring(nextspace + 1,starttag.length);
}else{
name = starttag;
}
this.handler.startElement(name, this.attribution(attribs));
if(empty)
{
this.handler.endElement(name);
}else{
this.curr++;
this.cname[this.curr] = name;
}
this.str = this.str.substring(close + 1,this.str.length);
continue;
}
// leftovers are cdata
if(estart == -1)
{
this.handler.characters(this.entityCheck(this.str));
this.str = "";
}else{
this.handler.characters(this.entityCheck(this.str.substring(0,estart)));
this.str = this.str.substring(estart,this.str.length);
}
}
}
/**
* indexEndElement(aStr)
*
* Internal function used to determing the index of the end of
* the tag.
*
* Returns the index or -1 if there is no close to the tag
*
*/
SAXParser.prototype.indexEndElement = function(aStr)
{
var eq = sp = gt = 0;
sp = aStr.indexOf(" ");
gt = aStr.indexOf(">");
if(sp < gt) {
if(sp == -1) {
return gt;
}
if(aStr.charAt(sp+1) == ">")
{
return sp;
}
} else {
return gt;
}
var end = 0;
// we didn't so we keep collecting attributes.
while(1)
{
//dump("in indexEndElement\n");
eq = aStr.indexOf("=", end);
id = aStr.charAt(eq+1);
end = aStr.indexOf(id, eq+2);
if(aStr.charAt(end+1) == "/" && aStr.charAt(end+2) == ">") {
return end+2;
}
if(aStr.charAt(end+1) == ">") {
return end+1;
}
end = end+1;
}
return end;
}
/**
( run in 0.741 second using v1.01-cache-2.11-cpan-39bf76dae61 )