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 )