/* minisax.js -- Minimum SAX in JavaScript * by M.Hiyama (hiyama{at}chimaira{dot}org) 2005 * URL: http://www.chimaira.org/ */ /* * Attributes */ function Attributes(attrs) { // attrs:[Attr*] this._attrs = attrs; } Attributes.prototype.toString = function() { var attrs = this._attrs; var s = ""; for (var i = 0; i < attrs.length; i++) { if (i !== 0) s += " "; s += attrs[i].toString(); } return s; }; /* getQName */ Attributes.prototype.getQName = function(index) { if (index < 0 || this._attrs.length <= index) { return null; } return this._attrs[index].name; }; /* getValueFromIndex */ Attributes.prototype.getValueFromIndex = function(index) { if (index < 0 || this._attrs.length <= index) { return null; } return this._attrs[index].value; }; /* getValueFromQName */ Attributes.prototype.getValueFromQName = function(qname) { // return:string var attrs = this._attrs; for (var i = 0; i < attrs.length; i++) { if (attrs[i].name == qname) return attrs[i].value; } return null; }; /* getValue (index or qname) */ Attributes.prototype.getValue = function(key) { if (typeof key == 'number') { return this.getValueFromIndex(key); } else if (typeof key == 'string') { return this.getValueFromQName(key); } else { return null; } }; /* getIndexFromQName */ Attributes.prototype.getIndexFromQName = function(qname) { var attrs = this._attrs; for (var i = 0; i < attrs.length; i++) { if (attrs[i].name == qname) return i; } return -1; }; /* * DOMReader */ function DOMReader() { this.contentHandler = null; } DOMReader.prototype.toString = function() { return "[object DOMReader]"; }; DOMReader.prototype.parseNode = function(node) { // return:void if (!this.contentHandler) { return; } var handler = this.contentHandler; if (handler.startParsing) { handler.startParsing(); } this._parseNode(node); if (handler.endParsing) { handler.endParsing(); } }; DOMReader.prototype._parseNode = function(node) { var handler = this.contentHandler; switch(node.nodeType) { case 1: // element if (handler.startElement) { var attrs = new Attributes(node.attributes); handler.startElement(node.tagName, attrs); } var children = node.childNodes; for (var i = 0; i < children.length; i++) { this._parseNode(children[i]); } if (handler.endElement) { handler.endElement(node.tagName); } break; case 3: // text if (handler.characters) { handler.characters(node.data); } break; case 9: // document if (handler.startDocument) { handler.startDocument(); } var children = node.childNodes; for (var i = 0; i < children.length; i++) { this._parseNode(children[i]); } if (handler.endDocument) { handler.endDocument(); } break; case 11: // document fragment if (handler.startDocumentFragment) { handler.startDocumentFragment(); } var children = node.childNodes; for (var i = 0; i < children.length; i++) { this._parseNode(children[i]); } if (handler.endDocumentFragment) { handler.endDocumentFragment(); } break; default: ; // do nothing break; } };