mirror of
				https://github.com/Jermolene/TiddlyWiki5
				synced 2025-10-30 23:23:02 +00:00 
			
		
		
		
	Add xmldom parser
Integrating this module allows us to do HTML/XML parsing under Node.js (there is no built-in support for Node.js; we can already do HTML/XML parsing in the browser). The implementation chosen is pure JavaScript, and will work in all configurations of TiddlyWiki.
This commit is contained in:
		
							
								
								
									
										8
									
								
								plugins/tiddlywiki/xmldom/files/LICENSE
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								plugins/tiddlywiki/xmldom/files/LICENSE
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| You can choose any one of those: | ||||
|  | ||||
| The MIT License (MIT): | ||||
|  | ||||
| link:http://opensource.org/licenses/MIT | ||||
|  | ||||
| LGPL: | ||||
| http://www.gnu.org/licenses/lgpl.html | ||||
							
								
								
									
										256
									
								
								plugins/tiddlywiki/xmldom/files/dom-parser.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										256
									
								
								plugins/tiddlywiki/xmldom/files/dom-parser.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,256 @@ | ||||
| function DOMParser(options){ | ||||
| 	this.options = options ||{locator:{}}; | ||||
| 	 | ||||
| } | ||||
| DOMParser.prototype.parseFromString = function(source,mimeType){	 | ||||
| 	var options = this.options; | ||||
| 	var sax =  new XMLReader(); | ||||
| 	var domBuilder = options.domBuilder || new DOMHandler();//contentHandler and LexicalHandler | ||||
| 	var errorHandler = options.errorHandler; | ||||
| 	var locator = options.locator; | ||||
| 	var defaultNSMap = options.xmlns||{}; | ||||
| 	var entityMap = {'lt':'<','gt':'>','amp':'&','quot':'"','apos':"'"} | ||||
| 	if(locator){ | ||||
| 		domBuilder.setDocumentLocator(locator) | ||||
| 	} | ||||
| 	 | ||||
| 	sax.errorHandler = buildErrorHandler(errorHandler,domBuilder,locator); | ||||
| 	sax.domBuilder = options.domBuilder || domBuilder; | ||||
| 	if(/\/x?html?$/.test(mimeType)){ | ||||
| 		entityMap.nbsp = '\xa0'; | ||||
| 		entityMap.copy = '\xa9'; | ||||
| 		defaultNSMap['']= 'http://www.w3.org/1999/xhtml'; | ||||
| 	} | ||||
| 	defaultNSMap.xml = defaultNSMap.xml || 'http://www.w3.org/XML/1998/namespace'; | ||||
| 	if(source){ | ||||
| 		sax.parse(source,defaultNSMap,entityMap); | ||||
| 	}else{ | ||||
| 		sax.errorHandler.error("invalid document source"); | ||||
| 	} | ||||
| 	return domBuilder.document; | ||||
| } | ||||
| function buildErrorHandler(errorImpl,domBuilder,locator){ | ||||
| 	if(!errorImpl){ | ||||
| 		if(domBuilder instanceof DOMHandler){ | ||||
| 			return domBuilder; | ||||
| 		} | ||||
| 		errorImpl = domBuilder ; | ||||
| 	} | ||||
| 	var errorHandler = {} | ||||
| 	var isCallback = errorImpl instanceof Function; | ||||
| 	locator = locator||{} | ||||
| 	function build(key){ | ||||
| 		var fn = errorImpl[key]; | ||||
| 		if(!fn){ | ||||
| 			if(isCallback){ | ||||
| 				fn = errorImpl.length == 2?function(msg){errorImpl(key,msg)}:errorImpl; | ||||
| 			}else{ | ||||
| 				var i=arguments.length; | ||||
| 				while(--i){ | ||||
| 					if(fn = errorImpl[arguments[i]]){ | ||||
| 						break; | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 		errorHandler[key] = fn && function(msg){ | ||||
| 			fn(msg+_locator(locator)); | ||||
| 		}||function(){}; | ||||
| 	} | ||||
| 	build('warning','warn'); | ||||
| 	build('error','warn','warning'); | ||||
| 	build('fatalError','warn','warning','error'); | ||||
| 	return errorHandler; | ||||
| } | ||||
| /** | ||||
|  * +ContentHandler+ErrorHandler | ||||
|  * +LexicalHandler+EntityResolver2 | ||||
|  * -DeclHandler-DTDHandler  | ||||
|  *  | ||||
|  * DefaultHandler:EntityResolver, DTDHandler, ContentHandler, ErrorHandler | ||||
|  * DefaultHandler2:DefaultHandler,LexicalHandler, DeclHandler, EntityResolver2 | ||||
|  * @link http://www.saxproject.org/apidoc/org/xml/sax/helpers/DefaultHandler.html | ||||
|  */ | ||||
| function DOMHandler() { | ||||
|     this.cdata = false; | ||||
| } | ||||
| function position(locator,node){ | ||||
| 	node.lineNumber = locator.lineNumber; | ||||
| 	node.columnNumber = locator.columnNumber; | ||||
| } | ||||
| /** | ||||
|  * @see org.xml.sax.ContentHandler#startDocument | ||||
|  * @link http://www.saxproject.org/apidoc/org/xml/sax/ContentHandler.html | ||||
|  */  | ||||
| DOMHandler.prototype = { | ||||
| 	startDocument : function() { | ||||
|     	this.document = new DOMImplementation().createDocument(null, null, null); | ||||
|     	if (this.locator) { | ||||
|         	this.document.documentURI = this.locator.systemId; | ||||
|     	} | ||||
| 	}, | ||||
| 	startElement:function(namespaceURI, localName, qName, attrs) { | ||||
| 		var doc = this.document; | ||||
| 	    var el = doc.createElementNS(namespaceURI, qName||localName); | ||||
| 	    var len = attrs.length; | ||||
| 	    appendElement(this, el); | ||||
| 	    this.currentElement = el; | ||||
| 	     | ||||
| 		this.locator && position(this.locator,el) | ||||
| 	    for (var i = 0 ; i < len; i++) { | ||||
| 	        var namespaceURI = attrs.getURI(i); | ||||
| 	        var value = attrs.getValue(i); | ||||
| 	        var qName = attrs.getQName(i); | ||||
| 			var attr = doc.createAttributeNS(namespaceURI, qName); | ||||
| 			if( attr.getOffset){ | ||||
| 				position(attr.getOffset(1),attr) | ||||
| 			} | ||||
| 			attr.value = attr.nodeValue = value; | ||||
| 			el.setAttributeNode(attr) | ||||
| 	    } | ||||
| 	}, | ||||
| 	endElement:function(namespaceURI, localName, qName) { | ||||
| 		var current = this.currentElement | ||||
| 	    var tagName = current.tagName; | ||||
| 	    this.currentElement = current.parentNode; | ||||
| 	}, | ||||
| 	startPrefixMapping:function(prefix, uri) { | ||||
| 	}, | ||||
| 	endPrefixMapping:function(prefix) { | ||||
| 	}, | ||||
| 	processingInstruction:function(target, data) { | ||||
| 	    var ins = this.document.createProcessingInstruction(target, data); | ||||
| 	    this.locator && position(this.locator,ins) | ||||
| 	    appendElement(this, ins); | ||||
| 	}, | ||||
| 	ignorableWhitespace:function(ch, start, length) { | ||||
| 	}, | ||||
| 	characters:function(chars, start, length) { | ||||
| 		chars = _toString.apply(this,arguments) | ||||
| 		//console.log(chars) | ||||
| 		if(this.currentElement && chars){ | ||||
| 			if (this.cdata) { | ||||
| 				var charNode = this.document.createCDATASection(chars); | ||||
| 				this.currentElement.appendChild(charNode); | ||||
| 			} else { | ||||
| 				var charNode = this.document.createTextNode(chars); | ||||
| 				this.currentElement.appendChild(charNode); | ||||
| 			} | ||||
| 			this.locator && position(this.locator,charNode) | ||||
| 		} | ||||
| 	}, | ||||
| 	skippedEntity:function(name) { | ||||
| 	}, | ||||
| 	endDocument:function() { | ||||
| 		this.document.normalize(); | ||||
| 	}, | ||||
| 	setDocumentLocator:function (locator) { | ||||
| 	    if(this.locator = locator){// && !('lineNumber' in locator)){ | ||||
| 	    	locator.lineNumber = 0; | ||||
| 	    } | ||||
| 	}, | ||||
| 	//LexicalHandler | ||||
| 	comment:function(chars, start, length) { | ||||
| 		chars = _toString.apply(this,arguments) | ||||
| 	    var comm = this.document.createComment(chars); | ||||
| 	    this.locator && position(this.locator,comm) | ||||
| 	    appendElement(this, comm); | ||||
| 	}, | ||||
| 	 | ||||
| 	startCDATA:function() { | ||||
| 	    //used in characters() methods | ||||
| 	    this.cdata = true; | ||||
| 	}, | ||||
| 	endCDATA:function() { | ||||
| 	    this.cdata = false; | ||||
| 	}, | ||||
| 	 | ||||
| 	startDTD:function(name, publicId, systemId) { | ||||
| 		var impl = this.document.implementation; | ||||
| 	    if (impl && impl.createDocumentType) { | ||||
| 	        var dt = impl.createDocumentType(name, publicId, systemId); | ||||
| 	        this.locator && position(this.locator,dt) | ||||
| 	        appendElement(this, dt); | ||||
| 	    } | ||||
| 	}, | ||||
| 	/** | ||||
| 	 * @see org.xml.sax.ErrorHandler | ||||
| 	 * @link http://www.saxproject.org/apidoc/org/xml/sax/ErrorHandler.html | ||||
| 	 */ | ||||
| 	warning:function(error) { | ||||
| 		console.warn(error,_locator(this.locator)); | ||||
| 	}, | ||||
| 	error:function(error) { | ||||
| 		console.error(error,_locator(this.locator)); | ||||
| 	}, | ||||
| 	fatalError:function(error) { | ||||
| 		console.error(error,_locator(this.locator)); | ||||
| 	    throw error; | ||||
| 	} | ||||
| } | ||||
| function _locator(l){ | ||||
| 	if(l){ | ||||
| 		return '\n@'+(l.systemId ||'')+'#[line:'+l.lineNumber+',col:'+l.columnNumber+']' | ||||
| 	} | ||||
| } | ||||
| function _toString(chars,start,length){ | ||||
| 	if(typeof chars == 'string'){ | ||||
| 		return chars.substr(start,length) | ||||
| 	}else{//java sax connect width xmldom on rhino(what about: "? && !(chars instanceof String)") | ||||
| 		if(chars.length >= start+length || start){ | ||||
| 			return new java.lang.String(chars,start,length)+''; | ||||
| 		} | ||||
| 		return chars; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/LexicalHandler.html | ||||
|  * used method of org.xml.sax.ext.LexicalHandler: | ||||
|  *  #comment(chars, start, length) | ||||
|  *  #startCDATA() | ||||
|  *  #endCDATA() | ||||
|  *  #startDTD(name, publicId, systemId) | ||||
|  * | ||||
|  * | ||||
|  * IGNORED method of org.xml.sax.ext.LexicalHandler: | ||||
|  *  #endDTD() | ||||
|  *  #startEntity(name) | ||||
|  *  #endEntity(name) | ||||
|  * | ||||
|  * | ||||
|  * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/DeclHandler.html | ||||
|  * IGNORED method of org.xml.sax.ext.DeclHandler | ||||
|  * 	#attributeDecl(eName, aName, type, mode, value) | ||||
|  *  #elementDecl(name, model) | ||||
|  *  #externalEntityDecl(name, publicId, systemId) | ||||
|  *  #internalEntityDecl(name, value) | ||||
|  * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/EntityResolver2.html | ||||
|  * IGNORED method of org.xml.sax.EntityResolver2 | ||||
|  *  #resolveEntity(String name,String publicId,String baseURI,String systemId) | ||||
|  *  #resolveEntity(publicId, systemId) | ||||
|  *  #getExternalSubset(name, baseURI) | ||||
|  * @link http://www.saxproject.org/apidoc/org/xml/sax/DTDHandler.html | ||||
|  * IGNORED method of org.xml.sax.DTDHandler | ||||
|  *  #notationDecl(name, publicId, systemId) {}; | ||||
|  *  #unparsedEntityDecl(name, publicId, systemId, notationName) {}; | ||||
|  */ | ||||
| "endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl".replace(/\w+/g,function(key){ | ||||
| 	DOMHandler.prototype[key] = function(){return null} | ||||
| }) | ||||
|  | ||||
| /* Private static helpers treated below as private instance methods, so don't need to add these to the public API; we might use a Relator to also get rid of non-standard public properties */ | ||||
| function appendElement (hander,node) { | ||||
|     if (!hander.currentElement) { | ||||
|         hander.document.appendChild(node); | ||||
|     } else { | ||||
|         hander.currentElement.appendChild(node); | ||||
|     } | ||||
| }//appendChild and setAttributeNS are preformance key | ||||
|  | ||||
| if(typeof require == 'function'){ | ||||
| 	var XMLReader = require('./sax').XMLReader; | ||||
| 	var DOMImplementation = exports.DOMImplementation = require('./dom').DOMImplementation; | ||||
| 	exports.XMLSerializer = require('./dom').XMLSerializer ; | ||||
| 	exports.DOMParser = DOMParser; | ||||
| } | ||||
							
								
								
									
										1141
									
								
								plugins/tiddlywiki/xmldom/files/dom.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1141
									
								
								plugins/tiddlywiki/xmldom/files/dom.js
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										219
									
								
								plugins/tiddlywiki/xmldom/files/readme.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										219
									
								
								plugins/tiddlywiki/xmldom/files/readme.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,219 @@ | ||||
| # XMLDOM [](http://travis-ci.org/bigeasy/xmldom) [](https://coveralls.io/r/bigeasy/xmldom) [](http://badge.fury.io/js/xmldom) | ||||
|  | ||||
| A JavaScript implementation of W3C DOM for Node.js, Rhino and the browser. Fully | ||||
| compatible with `W3C DOM level2`; and some compatible with `level3`. Supports | ||||
| `DOMParser` and `XMLSerializer` interface such as in browser. | ||||
|  | ||||
| Install: | ||||
| ------- | ||||
| >npm install xmldom | ||||
|  | ||||
| Example: | ||||
| ==== | ||||
| ```javascript | ||||
| var DOMParser = require('xmldom').DOMParser; | ||||
| var doc = new DOMParser().parseFromString( | ||||
|     '<xml xmlns="a" xmlns:c="./lite">\n'+ | ||||
|         '\t<child>test</child>\n'+ | ||||
|         '\t<child></child>\n'+ | ||||
|         '\t<child/>\n'+ | ||||
|     '</xml>' | ||||
|     ,'text/xml'); | ||||
| doc.documentElement.setAttribute('x','y'); | ||||
| doc.documentElement.setAttributeNS('./lite','c:x','y2'); | ||||
| var nsAttr = doc.documentElement.getAttributeNS('./lite','x') | ||||
| console.info(nsAttr) | ||||
| console.info(doc) | ||||
| ``` | ||||
| API Reference | ||||
| ===== | ||||
|  | ||||
|  * [DOMParser](https://developer.mozilla.org/en/DOMParser): | ||||
|  | ||||
| 	```javascript | ||||
| 	parseFromString(xmlsource,mimeType) | ||||
| 	``` | ||||
| 	* **options extension** _by xmldom_(not BOM standard!!) | ||||
|  | ||||
| 	```javascript | ||||
| 	//added the options argument | ||||
| 	new DOMParser(options) | ||||
| 	 | ||||
| 	//errorHandler is supported | ||||
| 	new DOMParser({ | ||||
| 		/** | ||||
| 		 * locator is always need for error position info | ||||
| 		 */ | ||||
| 		locator:{}, | ||||
| 		/** | ||||
| 		 * you can override the errorHandler for xml parser | ||||
| 		 * @link http://www.saxproject.org/apidoc/org/xml/sax/ErrorHandler.html | ||||
| 		 */ | ||||
| 		errorHandler:{warning:function(w){console.warn(w)},error:callback,fatalError:callback} | ||||
| 		//only callback model | ||||
| 		//errorHandler:function(level,msg){console.log(level,msg)} | ||||
| 	}) | ||||
| 		 | ||||
| 	``` | ||||
|  | ||||
|  * [XMLSerializer](https://developer.mozilla.org/en/XMLSerializer) | ||||
|   | ||||
| 	```javascript | ||||
| 	serializeToString(node) | ||||
| 	``` | ||||
| DOM level2 method and attribute: | ||||
| ------ | ||||
|  | ||||
|  * [Node](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247) | ||||
| 	 | ||||
| 		attribute: | ||||
| 			nodeValue|prefix | ||||
| 		readonly attribute: | ||||
| 			nodeName|nodeType|parentNode|childNodes|firstChild|lastChild|previousSibling|nextSibling|attributes|ownerDocument|namespaceURI|localName | ||||
| 		method:	 | ||||
| 			insertBefore(newChild, refChild) | ||||
| 			replaceChild(newChild, oldChild) | ||||
| 			removeChild(oldChild) | ||||
| 			appendChild(newChild) | ||||
| 			hasChildNodes() | ||||
| 			cloneNode(deep) | ||||
| 			normalize() | ||||
| 			isSupported(feature, version) | ||||
| 			hasAttributes() | ||||
|  | ||||
|  * [DOMImplementation](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-102161490) | ||||
| 		 | ||||
| 		method: | ||||
| 			hasFeature(feature, version) | ||||
| 			createDocumentType(qualifiedName, publicId, systemId) | ||||
| 			createDocument(namespaceURI, qualifiedName, doctype) | ||||
|  | ||||
|  * [Document](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#i-Document) : Node | ||||
| 		 | ||||
| 		readonly attribute: | ||||
| 			doctype|implementation|documentElement | ||||
| 		method: | ||||
| 			createElement(tagName) | ||||
| 			createDocumentFragment() | ||||
| 			createTextNode(data) | ||||
| 			createComment(data) | ||||
| 			createCDATASection(data) | ||||
| 			createProcessingInstruction(target, data) | ||||
| 			createAttribute(name) | ||||
| 			createEntityReference(name) | ||||
| 			getElementsByTagName(tagname) | ||||
| 			importNode(importedNode, deep) | ||||
| 			createElementNS(namespaceURI, qualifiedName) | ||||
| 			createAttributeNS(namespaceURI, qualifiedName) | ||||
| 			getElementsByTagNameNS(namespaceURI, localName) | ||||
| 			getElementById(elementId) | ||||
|  | ||||
|  * [DocumentFragment](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-B63ED1A3) : Node | ||||
|  * [Element](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-745549614) : Node | ||||
| 		 | ||||
| 		readonly attribute: | ||||
| 			tagName | ||||
| 		method: | ||||
| 			getAttribute(name) | ||||
| 			setAttribute(name, value) | ||||
| 			removeAttribute(name) | ||||
| 			getAttributeNode(name) | ||||
| 			setAttributeNode(newAttr) | ||||
| 			removeAttributeNode(oldAttr) | ||||
| 			getElementsByTagName(name) | ||||
| 			getAttributeNS(namespaceURI, localName) | ||||
| 			setAttributeNS(namespaceURI, qualifiedName, value) | ||||
| 			removeAttributeNS(namespaceURI, localName) | ||||
| 			getAttributeNodeNS(namespaceURI, localName) | ||||
| 			setAttributeNodeNS(newAttr) | ||||
| 			getElementsByTagNameNS(namespaceURI, localName) | ||||
| 			hasAttribute(name) | ||||
| 			hasAttributeNS(namespaceURI, localName) | ||||
|  | ||||
|  * [Attr](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-637646024) : Node | ||||
| 	 | ||||
| 		attribute: | ||||
| 			value | ||||
| 		readonly attribute: | ||||
| 			name|specified|ownerElement | ||||
|  | ||||
|  * [NodeList](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-536297177) | ||||
| 		 | ||||
| 		readonly attribute: | ||||
| 			length | ||||
| 		method: | ||||
| 			item(index) | ||||
| 	 | ||||
|  * [NamedNodeMap](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1780488922) | ||||
|  | ||||
| 		readonly attribute: | ||||
| 			length | ||||
| 		method: | ||||
| 			getNamedItem(name) | ||||
| 			setNamedItem(arg) | ||||
| 			removeNamedItem(name) | ||||
| 			item(index) | ||||
| 			getNamedItemNS(namespaceURI, localName) | ||||
| 			setNamedItemNS(arg) | ||||
| 			removeNamedItemNS(namespaceURI, localName) | ||||
| 		 | ||||
|  * [CharacterData](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-FF21A306) : Node | ||||
| 	 | ||||
| 		method: | ||||
| 			substringData(offset, count) | ||||
| 			appendData(arg) | ||||
| 			insertData(offset, arg) | ||||
| 			deleteData(offset, count) | ||||
| 			replaceData(offset, count, arg) | ||||
| 		 | ||||
|  * [Text](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1312295772) : CharacterData | ||||
| 	 | ||||
| 		method: | ||||
| 			splitText(offset) | ||||
| 			 | ||||
|  * [CDATASection](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-667469212) | ||||
|  * [Comment](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1728279322) : CharacterData | ||||
| 	 | ||||
|  * [DocumentType](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-412266927) | ||||
| 	 | ||||
| 		readonly attribute: | ||||
| 			name|entities|notations|publicId|systemId|internalSubset | ||||
| 			 | ||||
|  * Notation : Node | ||||
| 	 | ||||
| 		readonly attribute: | ||||
| 			publicId|systemId | ||||
| 			 | ||||
|  * Entity : Node | ||||
| 	 | ||||
| 		readonly attribute: | ||||
| 			publicId|systemId|notationName | ||||
| 			 | ||||
|  * EntityReference : Node  | ||||
|  * ProcessingInstruction : Node  | ||||
| 	 | ||||
| 		attribute: | ||||
| 			data | ||||
| 		readonly attribute: | ||||
| 			target | ||||
| 		 | ||||
| DOM level 3 support: | ||||
| ----- | ||||
|  | ||||
|  * [Node](http://www.w3.org/TR/DOM-Level-3-Core/core.html#Node3-textContent) | ||||
| 		 | ||||
| 		attribute: | ||||
| 			textContent | ||||
| 		method: | ||||
| 			isDefaultNamespace(namespaceURI){ | ||||
| 			lookupNamespaceURI(prefix) | ||||
|  | ||||
| DOM extension by xmldom | ||||
| --- | ||||
|  * [Node] Source position extension;  | ||||
| 		 | ||||
| 		attribute: | ||||
| 			//Numbered starting from '1' | ||||
| 			lineNumber | ||||
| 			//Numbered starting from '1' | ||||
| 			columnNumber | ||||
							
								
								
									
										586
									
								
								plugins/tiddlywiki/xmldom/files/sax.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										586
									
								
								plugins/tiddlywiki/xmldom/files/sax.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,586 @@ | ||||
| //[4]   	NameStartChar	   ::=   	":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF] | ||||
| //[4a]   	NameChar	   ::=   	NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040] | ||||
| //[5]   	Name	   ::=   	NameStartChar (NameChar)* | ||||
| var nameStartChar = /[A-Z_a-z\xC0-\xD6\xD8-\xF6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]///\u10000-\uEFFFF | ||||
| var nameChar = new RegExp("[\\-\\.0-9"+nameStartChar.source.slice(1,-1)+"\u00B7\u0300-\u036F\\u203F-\u2040]"); | ||||
| var tagNamePattern = new RegExp('^'+nameStartChar.source+nameChar.source+'*(?:\:'+nameStartChar.source+nameChar.source+'*)?$'); | ||||
| //var tagNamePattern = /^[a-zA-Z_][\w\-\.]*(?:\:[a-zA-Z_][\w\-\.]*)?$/ | ||||
| //var handlers = 'resolveEntity,getExternalSubset,characters,endDocument,endElement,endPrefixMapping,ignorableWhitespace,processingInstruction,setDocumentLocator,skippedEntity,startDocument,startElement,startPrefixMapping,notationDecl,unparsedEntityDecl,error,fatalError,warning,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,comment,endCDATA,endDTD,endEntity,startCDATA,startDTD,startEntity'.split(',') | ||||
|  | ||||
| //S_TAG,	S_ATTR,	S_EQ,	S_V | ||||
| //S_ATTR_S,	S_E,	S_S,	S_C | ||||
| var S_TAG = 0;//tag name offerring | ||||
| var S_ATTR = 1;//attr name offerring  | ||||
| var S_ATTR_S=2;//attr name end and space offer | ||||
| var S_EQ = 3;//=space? | ||||
| var S_V = 4;//attr value(no quot value only) | ||||
| var S_E = 5;//attr value end and no space(quot end) | ||||
| var S_S = 6;//(attr value end || tag end ) && (space offer) | ||||
| var S_C = 7;//closed el<el /> | ||||
|  | ||||
| function XMLReader(){ | ||||
| 	 | ||||
| } | ||||
|  | ||||
| XMLReader.prototype = { | ||||
| 	parse:function(source,defaultNSMap,entityMap){ | ||||
| 		var domBuilder = this.domBuilder; | ||||
| 		domBuilder.startDocument(); | ||||
| 		_copy(defaultNSMap ,defaultNSMap = {}) | ||||
| 		parse(source,defaultNSMap,entityMap, | ||||
| 				domBuilder,this.errorHandler); | ||||
| 		domBuilder.endDocument(); | ||||
| 	} | ||||
| } | ||||
| function parse(source,defaultNSMapCopy,entityMap,domBuilder,errorHandler){ | ||||
|   function fixedFromCharCode(code) { | ||||
| 		// String.prototype.fromCharCode does not supports | ||||
| 		// > 2 bytes unicode chars directly | ||||
| 		if (code > 0xffff) { | ||||
| 			code -= 0x10000; | ||||
| 			var surrogate1 = 0xd800 + (code >> 10) | ||||
| 				, surrogate2 = 0xdc00 + (code & 0x3ff); | ||||
|  | ||||
| 			return String.fromCharCode(surrogate1, surrogate2); | ||||
| 		} else { | ||||
| 			return String.fromCharCode(code); | ||||
| 		} | ||||
| 	} | ||||
| 	function entityReplacer(a){ | ||||
| 		var k = a.slice(1,-1); | ||||
| 		if(k in entityMap){ | ||||
| 			return entityMap[k];  | ||||
| 		}else if(k.charAt(0) === '#'){ | ||||
| 			return fixedFromCharCode(parseInt(k.substr(1).replace('x','0x'))) | ||||
| 		}else{ | ||||
| 			errorHandler.error('entity not found:'+a); | ||||
| 			return a; | ||||
| 		} | ||||
| 	} | ||||
| 	function appendText(end){//has some bugs | ||||
| 		if(end>start){ | ||||
| 			var xt = source.substring(start,end).replace(/&#?\w+;/g,entityReplacer); | ||||
| 			locator&&position(start); | ||||
| 			domBuilder.characters(xt,0,end-start); | ||||
| 			start = end | ||||
| 		} | ||||
| 	} | ||||
| 	function position(p,m){ | ||||
| 		while(p>=lineEnd && (m = linePattern.exec(source))){ | ||||
| 			lineStart = m.index; | ||||
| 			lineEnd = lineStart + m[0].length; | ||||
| 			locator.lineNumber++; | ||||
| 			//console.log('line++:',locator,startPos,endPos) | ||||
| 		} | ||||
| 		locator.columnNumber = p-lineStart+1; | ||||
| 	} | ||||
| 	var lineStart = 0; | ||||
| 	var lineEnd = 0; | ||||
| 	var linePattern = /.+(?:\r\n?|\n)|.*$/g | ||||
| 	var locator = domBuilder.locator; | ||||
| 	 | ||||
| 	var parseStack = [{currentNSMap:defaultNSMapCopy}] | ||||
| 	var closeMap = {}; | ||||
| 	var start = 0; | ||||
| 	while(true){ | ||||
| 		try{ | ||||
| 			var tagStart = source.indexOf('<',start); | ||||
| 			if(tagStart<0){ | ||||
| 				if(!source.substr(start).match(/^\s*$/)){ | ||||
| 					var doc = domBuilder.document; | ||||
| 	    			var text = doc.createTextNode(source.substr(start)); | ||||
| 	    			doc.appendChild(text); | ||||
| 	    			domBuilder.currentElement = text; | ||||
| 				} | ||||
| 				return; | ||||
| 			} | ||||
| 			if(tagStart>start){ | ||||
| 				appendText(tagStart); | ||||
| 			} | ||||
| 			switch(source.charAt(tagStart+1)){ | ||||
| 			case '/': | ||||
| 				var end = source.indexOf('>',tagStart+3); | ||||
| 				var tagName = source.substring(tagStart+2,end); | ||||
| 				var config = parseStack.pop(); | ||||
| 				var localNSMap = config.localNSMap; | ||||
| 		        if(config.tagName != tagName){ | ||||
| 		            errorHandler.fatalError("end tag name: "+tagName+' is not match the current start tagName:'+config.tagName ); | ||||
| 		        } | ||||
| 				domBuilder.endElement(config.uri,config.localName,tagName); | ||||
| 				if(localNSMap){ | ||||
| 					for(var prefix in localNSMap){ | ||||
| 						domBuilder.endPrefixMapping(prefix) ; | ||||
| 					} | ||||
| 				} | ||||
| 				end++; | ||||
| 				break; | ||||
| 				// end elment | ||||
| 			case '?':// <?...?> | ||||
| 				locator&&position(tagStart); | ||||
| 				end = parseInstruction(source,tagStart,domBuilder); | ||||
| 				break; | ||||
| 			case '!':// <!doctype,<![CDATA,<!-- | ||||
| 				locator&&position(tagStart); | ||||
| 				end = parseDCC(source,tagStart,domBuilder,errorHandler); | ||||
| 				break; | ||||
| 			default: | ||||
| 			 | ||||
| 				locator&&position(tagStart); | ||||
| 				 | ||||
| 				var el = new ElementAttributes(); | ||||
| 				 | ||||
| 				//elStartEnd | ||||
| 				var end = parseElementStartPart(source,tagStart,el,entityReplacer,errorHandler); | ||||
| 				var len = el.length; | ||||
| 				 | ||||
| 				if(locator){ | ||||
| 					if(len){ | ||||
| 						//attribute position fixed | ||||
| 						for(var i = 0;i<len;i++){ | ||||
| 							var a = el[i]; | ||||
| 							position(a.offset); | ||||
| 							a.offset = copyLocator(locator,{}); | ||||
| 						} | ||||
| 					} | ||||
| 					position(end); | ||||
| 				} | ||||
| 				if(!el.closed && fixSelfClosed(source,end,el.tagName,closeMap)){ | ||||
| 					el.closed = true; | ||||
| 					if(!entityMap.nbsp){ | ||||
| 						errorHandler.warning('unclosed xml attribute'); | ||||
| 					} | ||||
| 				} | ||||
| 				appendElement(el,domBuilder,parseStack); | ||||
| 				 | ||||
| 				 | ||||
| 				if(el.uri === 'http://www.w3.org/1999/xhtml' && !el.closed){ | ||||
| 					end = parseHtmlSpecialContent(source,end,el.tagName,entityReplacer,domBuilder) | ||||
| 				}else{ | ||||
| 					end++; | ||||
| 				} | ||||
| 			} | ||||
| 		}catch(e){ | ||||
| 			errorHandler.error('element parse error: '+e); | ||||
| 			end = -1; | ||||
| 		} | ||||
| 		if(end>start){ | ||||
| 			start = end; | ||||
| 		}else{ | ||||
| 			//TODO: 这里有可能sax回退,有位置错误风险 | ||||
| 			appendText(Math.max(tagStart,start)+1); | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| function copyLocator(f,t){ | ||||
| 	t.lineNumber = f.lineNumber; | ||||
| 	t.columnNumber = f.columnNumber; | ||||
| 	return t; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * @see #appendElement(source,elStartEnd,el,selfClosed,entityReplacer,domBuilder,parseStack); | ||||
|  * @return end of the elementStartPart(end of elementEndPart for selfClosed el) | ||||
|  */ | ||||
| function parseElementStartPart(source,start,el,entityReplacer,errorHandler){ | ||||
| 	var attrName; | ||||
| 	var value; | ||||
| 	var p = ++start; | ||||
| 	var s = S_TAG;//status | ||||
| 	while(true){ | ||||
| 		var c = source.charAt(p); | ||||
| 		switch(c){ | ||||
| 		case '=': | ||||
| 			if(s === S_ATTR){//attrName | ||||
| 				attrName = source.slice(start,p); | ||||
| 				s = S_EQ; | ||||
| 			}else if(s === S_ATTR_S){ | ||||
| 				s = S_EQ; | ||||
| 			}else{ | ||||
| 				//fatalError: equal must after attrName or space after attrName | ||||
| 				throw new Error('attribute equal must after attrName'); | ||||
| 			} | ||||
| 			break; | ||||
| 		case '\'': | ||||
| 		case '"': | ||||
| 			if(s === S_EQ){//equal | ||||
| 				start = p+1; | ||||
| 				p = source.indexOf(c,start) | ||||
| 				if(p>0){ | ||||
| 					value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer); | ||||
| 					el.add(attrName,value,start-1); | ||||
| 					s = S_E; | ||||
| 				}else{ | ||||
| 					//fatalError: no end quot match | ||||
| 					throw new Error('attribute value no end \''+c+'\' match'); | ||||
| 				} | ||||
| 			}else if(s == S_V){ | ||||
| 				value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer); | ||||
| 				//console.log(attrName,value,start,p) | ||||
| 				el.add(attrName,value,start); | ||||
| 				//console.dir(el) | ||||
| 				errorHandler.warning('attribute "'+attrName+'" missed start quot('+c+')!!'); | ||||
| 				start = p+1; | ||||
| 				s = S_E | ||||
| 			}else{ | ||||
| 				//fatalError: no equal before | ||||
| 				throw new Error('attribute value must after "="'); | ||||
| 			} | ||||
| 			break; | ||||
| 		case '/': | ||||
| 			switch(s){ | ||||
| 			case S_TAG: | ||||
| 				el.setTagName(source.slice(start,p)); | ||||
| 			case S_E: | ||||
| 			case S_S: | ||||
| 			case S_C: | ||||
| 				s = S_C; | ||||
| 				el.closed = true; | ||||
| 			case S_V: | ||||
| 			case S_ATTR: | ||||
| 			case S_ATTR_S: | ||||
| 				break; | ||||
| 			//case S_EQ: | ||||
| 			default: | ||||
| 				throw new Error("attribute invalid close char('/')") | ||||
| 			} | ||||
| 			break; | ||||
| 		case ''://end document | ||||
| 			//throw new Error('unexpected end of input') | ||||
| 			errorHandler.error('unexpected end of input'); | ||||
| 		case '>': | ||||
| 			switch(s){ | ||||
| 			case S_TAG: | ||||
| 				el.setTagName(source.slice(start,p)); | ||||
| 			case S_E: | ||||
| 			case S_S: | ||||
| 			case S_C: | ||||
| 				break;//normal | ||||
| 			case S_V://Compatible state | ||||
| 			case S_ATTR: | ||||
| 				value = source.slice(start,p); | ||||
| 				if(value.slice(-1) === '/'){ | ||||
| 					el.closed  = true; | ||||
| 					value = value.slice(0,-1) | ||||
| 				} | ||||
| 			case S_ATTR_S: | ||||
| 				if(s === S_ATTR_S){ | ||||
| 					value = attrName; | ||||
| 				} | ||||
| 				if(s == S_V){ | ||||
| 					errorHandler.warning('attribute "'+value+'" missed quot(")!!'); | ||||
| 					el.add(attrName,value.replace(/&#?\w+;/g,entityReplacer),start) | ||||
| 				}else{ | ||||
| 					errorHandler.warning('attribute "'+value+'" missed value!! "'+value+'" instead!!') | ||||
| 					el.add(value,value,start) | ||||
| 				} | ||||
| 				break; | ||||
| 			case S_EQ: | ||||
| 				throw new Error('attribute value missed!!'); | ||||
| 			} | ||||
| //			console.log(tagName,tagNamePattern,tagNamePattern.test(tagName)) | ||||
| 			return p; | ||||
| 		/*xml space '\x20' | #x9 | #xD | #xA; */ | ||||
| 		case '\u0080': | ||||
| 			c = ' '; | ||||
| 		default: | ||||
| 			if(c<= ' '){//space | ||||
| 				switch(s){ | ||||
| 				case S_TAG: | ||||
| 					el.setTagName(source.slice(start,p));//tagName | ||||
| 					s = S_S; | ||||
| 					break; | ||||
| 				case S_ATTR: | ||||
| 					attrName = source.slice(start,p) | ||||
| 					s = S_ATTR_S; | ||||
| 					break; | ||||
| 				case S_V: | ||||
| 					var value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer); | ||||
| 					errorHandler.warning('attribute "'+value+'" missed quot(")!!'); | ||||
| 					el.add(attrName,value,start) | ||||
| 				case S_E: | ||||
| 					s = S_S; | ||||
| 					break; | ||||
| 				//case S_S: | ||||
| 				//case S_EQ: | ||||
| 				//case S_ATTR_S: | ||||
| 				//	void();break; | ||||
| 				//case S_C: | ||||
| 					//ignore warning | ||||
| 				} | ||||
| 			}else{//not space | ||||
| //S_TAG,	S_ATTR,	S_EQ,	S_V | ||||
| //S_ATTR_S,	S_E,	S_S,	S_C | ||||
| 				switch(s){ | ||||
| 				//case S_TAG:void();break; | ||||
| 				//case S_ATTR:void();break; | ||||
| 				//case S_V:void();break; | ||||
| 				case S_ATTR_S: | ||||
| 					errorHandler.warning('attribute "'+attrName+'" missed value!! "'+attrName+'" instead!!') | ||||
| 					el.add(attrName,attrName,start); | ||||
| 					start = p; | ||||
| 					s = S_ATTR; | ||||
| 					break; | ||||
| 				case S_E: | ||||
| 					errorHandler.warning('attribute space is required"'+attrName+'"!!') | ||||
| 				case S_S: | ||||
| 					s = S_ATTR; | ||||
| 					start = p; | ||||
| 					break; | ||||
| 				case S_EQ: | ||||
| 					s = S_V; | ||||
| 					start = p; | ||||
| 					break; | ||||
| 				case S_C: | ||||
| 					throw new Error("elements closed character '/' and '>' must be connected to"); | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 		p++; | ||||
| 	} | ||||
| } | ||||
| /** | ||||
|  * @return end of the elementStartPart(end of elementEndPart for selfClosed el) | ||||
|  */ | ||||
| function appendElement(el,domBuilder,parseStack){ | ||||
| 	var tagName = el.tagName; | ||||
| 	var localNSMap = null; | ||||
| 	var currentNSMap = parseStack[parseStack.length-1].currentNSMap; | ||||
| 	var i = el.length; | ||||
| 	while(i--){ | ||||
| 		var a = el[i]; | ||||
| 		var qName = a.qName; | ||||
| 		var value = a.value; | ||||
| 		var nsp = qName.indexOf(':'); | ||||
| 		if(nsp>0){ | ||||
| 			var prefix = a.prefix = qName.slice(0,nsp); | ||||
| 			var localName = qName.slice(nsp+1); | ||||
| 			var nsPrefix = prefix === 'xmlns' && localName | ||||
| 		}else{ | ||||
| 			localName = qName; | ||||
| 			prefix = null | ||||
| 			nsPrefix = qName === 'xmlns' && '' | ||||
| 		} | ||||
| 		//can not set prefix,because prefix !== '' | ||||
| 		a.localName = localName ; | ||||
| 		//prefix == null for no ns prefix attribute  | ||||
| 		if(nsPrefix !== false){//hack!! | ||||
| 			if(localNSMap == null){ | ||||
| 				localNSMap = {} | ||||
| 				//console.log(currentNSMap,0) | ||||
| 				_copy(currentNSMap,currentNSMap={}) | ||||
| 				//console.log(currentNSMap,1) | ||||
| 			} | ||||
| 			currentNSMap[nsPrefix] = localNSMap[nsPrefix] = value; | ||||
| 			a.uri = 'http://www.w3.org/2000/xmlns/' | ||||
| 			domBuilder.startPrefixMapping(nsPrefix, value)  | ||||
| 		} | ||||
| 	} | ||||
| 	var i = el.length; | ||||
| 	while(i--){ | ||||
| 		a = el[i]; | ||||
| 		var prefix = a.prefix; | ||||
| 		if(prefix){//no prefix attribute has no namespace | ||||
| 			if(prefix === 'xml'){ | ||||
| 				a.uri = 'http://www.w3.org/XML/1998/namespace'; | ||||
| 			}if(prefix !== 'xmlns'){ | ||||
| 				a.uri = currentNSMap[prefix] | ||||
| 				 | ||||
| 				//{console.log('###'+a.qName,domBuilder.locator.systemId+'',currentNSMap,a.uri)} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	var nsp = tagName.indexOf(':'); | ||||
| 	if(nsp>0){ | ||||
| 		prefix = el.prefix = tagName.slice(0,nsp); | ||||
| 		localName = el.localName = tagName.slice(nsp+1); | ||||
| 	}else{ | ||||
| 		prefix = null;//important!! | ||||
| 		localName = el.localName = tagName; | ||||
| 	} | ||||
| 	//no prefix element has default namespace | ||||
| 	var ns = el.uri = currentNSMap[prefix || '']; | ||||
| 	domBuilder.startElement(ns,localName,tagName,el); | ||||
| 	//endPrefixMapping and startPrefixMapping have not any help for dom builder | ||||
| 	//localNSMap = null | ||||
| 	if(el.closed){ | ||||
| 		domBuilder.endElement(ns,localName,tagName); | ||||
| 		if(localNSMap){ | ||||
| 			for(prefix in localNSMap){ | ||||
| 				domBuilder.endPrefixMapping(prefix)  | ||||
| 			} | ||||
| 		} | ||||
| 	}else{ | ||||
| 		el.currentNSMap = currentNSMap; | ||||
| 		el.localNSMap = localNSMap; | ||||
| 		parseStack.push(el); | ||||
| 	} | ||||
| } | ||||
| function parseHtmlSpecialContent(source,elStartEnd,tagName,entityReplacer,domBuilder){ | ||||
| 	if(/^(?:script|textarea)$/i.test(tagName)){ | ||||
| 		var elEndStart =  source.indexOf('</'+tagName+'>',elStartEnd); | ||||
| 		var text = source.substring(elStartEnd+1,elEndStart); | ||||
| 		if(/[&<]/.test(text)){ | ||||
| 			if(/^script$/i.test(tagName)){ | ||||
| 				//if(!/\]\]>/.test(text)){ | ||||
| 					//lexHandler.startCDATA(); | ||||
| 					domBuilder.characters(text,0,text.length); | ||||
| 					//lexHandler.endCDATA(); | ||||
| 					return elEndStart; | ||||
| 				//} | ||||
| 			}//}else{//text area | ||||
| 				text = text.replace(/&#?\w+;/g,entityReplacer); | ||||
| 				domBuilder.characters(text,0,text.length); | ||||
| 				return elEndStart; | ||||
| 			//} | ||||
| 			 | ||||
| 		} | ||||
| 	} | ||||
| 	return elStartEnd+1; | ||||
| } | ||||
| function fixSelfClosed(source,elStartEnd,tagName,closeMap){ | ||||
| 	//if(tagName in closeMap){ | ||||
| 	var pos = closeMap[tagName]; | ||||
| 	if(pos == null){ | ||||
| 		//console.log(tagName) | ||||
| 		pos = closeMap[tagName] = source.lastIndexOf('</'+tagName+'>') | ||||
| 	} | ||||
| 	return pos<elStartEnd; | ||||
| 	//}  | ||||
| } | ||||
| function _copy(source,target){ | ||||
| 	for(var n in source){target[n] = source[n]} | ||||
| } | ||||
| function parseDCC(source,start,domBuilder,errorHandler){//sure start with '<!' | ||||
| 	var next= source.charAt(start+2) | ||||
| 	switch(next){ | ||||
| 	case '-': | ||||
| 		if(source.charAt(start + 3) === '-'){ | ||||
| 			var end = source.indexOf('-->',start+4); | ||||
| 			//append comment source.substring(4,end)//<!-- | ||||
| 			if(end>start){ | ||||
| 				domBuilder.comment(source,start+4,end-start-4); | ||||
| 				return end+3; | ||||
| 			}else{ | ||||
| 				errorHandler.error("Unclosed comment"); | ||||
| 				return -1; | ||||
| 			} | ||||
| 		}else{ | ||||
| 			//error | ||||
| 			return -1; | ||||
| 		} | ||||
| 	default: | ||||
| 		if(source.substr(start+3,6) == 'CDATA['){ | ||||
| 			var end = source.indexOf(']]>',start+9); | ||||
| 			domBuilder.startCDATA(); | ||||
| 			domBuilder.characters(source,start+9,end-start-9); | ||||
| 			domBuilder.endCDATA()  | ||||
| 			return end+3; | ||||
| 		} | ||||
| 		//<!DOCTYPE | ||||
| 		//startDTD(java.lang.String name, java.lang.String publicId, java.lang.String systemId)  | ||||
| 		var matchs = split(source,start); | ||||
| 		var len = matchs.length; | ||||
| 		if(len>1 && /!doctype/i.test(matchs[0][0])){ | ||||
| 			var name = matchs[1][0]; | ||||
| 			var pubid = len>3 && /^public$/i.test(matchs[2][0]) && matchs[3][0] | ||||
| 			var sysid = len>4 && matchs[4][0]; | ||||
| 			var lastMatch = matchs[len-1] | ||||
| 			domBuilder.startDTD(name,pubid && pubid.replace(/^(['"])(.*?)\1$/,'$2'), | ||||
| 					sysid && sysid.replace(/^(['"])(.*?)\1$/,'$2')); | ||||
| 			domBuilder.endDTD(); | ||||
| 			 | ||||
| 			return lastMatch.index+lastMatch[0].length | ||||
| 		} | ||||
| 	} | ||||
| 	return -1; | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| function parseInstruction(source,start,domBuilder){ | ||||
| 	var end = source.indexOf('?>',start); | ||||
| 	if(end){ | ||||
| 		var match = source.substring(start,end).match(/^<\?(\S*)\s*([\s\S]*?)\s*$/); | ||||
| 		if(match){ | ||||
| 			var len = match[0].length; | ||||
| 			domBuilder.processingInstruction(match[1], match[2]) ; | ||||
| 			return end+2; | ||||
| 		}else{//error | ||||
| 			return -1; | ||||
| 		} | ||||
| 	} | ||||
| 	return -1; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * @param source | ||||
|  */ | ||||
| function ElementAttributes(source){ | ||||
| 	 | ||||
| } | ||||
| ElementAttributes.prototype = { | ||||
| 	setTagName:function(tagName){ | ||||
| 		if(!tagNamePattern.test(tagName)){ | ||||
| 			throw new Error('invalid tagName:'+tagName) | ||||
| 		} | ||||
| 		this.tagName = tagName | ||||
| 	}, | ||||
| 	add:function(qName,value,offset){ | ||||
| 		if(!tagNamePattern.test(qName)){ | ||||
| 			throw new Error('invalid attribute:'+qName) | ||||
| 		} | ||||
| 		this[this.length++] = {qName:qName,value:value,offset:offset} | ||||
| 	}, | ||||
| 	length:0, | ||||
| 	getLocalName:function(i){return this[i].localName}, | ||||
| 	getOffset:function(i){return this[i].offset}, | ||||
| 	getQName:function(i){return this[i].qName}, | ||||
| 	getURI:function(i){return this[i].uri}, | ||||
| 	getValue:function(i){return this[i].value} | ||||
| //	,getIndex:function(uri, localName)){ | ||||
| //		if(localName){ | ||||
| //			 | ||||
| //		}else{ | ||||
| //			var qName = uri | ||||
| //		} | ||||
| //	}, | ||||
| //	getValue:function(){return this.getValue(this.getIndex.apply(this,arguments))}, | ||||
| //	getType:function(uri,localName){} | ||||
| //	getType:function(i){}, | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| function _set_proto_(thiz,parent){ | ||||
| 	thiz.__proto__ = parent; | ||||
| 	return thiz; | ||||
| } | ||||
| if(!(_set_proto_({},_set_proto_.prototype) instanceof _set_proto_)){ | ||||
| 	_set_proto_ = function(thiz,parent){ | ||||
| 		function p(){}; | ||||
| 		p.prototype = parent; | ||||
| 		p = new p(); | ||||
| 		for(parent in thiz){ | ||||
| 			p[parent] = thiz[parent]; | ||||
| 		} | ||||
| 		return p; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| function split(source,start){ | ||||
| 	var match; | ||||
| 	var buf = []; | ||||
| 	var reg = /'[^']+'|"[^"]+"|[^\s<>\/=]+=?|(\/?\s*>|<)/g; | ||||
| 	reg.lastIndex = start; | ||||
| 	reg.exec(source);//skip < | ||||
| 	while(match = reg.exec(source)){ | ||||
| 		buf.push(match); | ||||
| 		if(match[1])return buf; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| if(typeof require == 'function'){ | ||||
| 	exports.XMLReader = XMLReader; | ||||
| } | ||||
|  | ||||
							
								
								
									
										38
									
								
								plugins/tiddlywiki/xmldom/files/tiddlywiki.files
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								plugins/tiddlywiki/xmldom/files/tiddlywiki.files
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,38 @@ | ||||
| { | ||||
| 	"tiddlers": [ | ||||
| 		{ | ||||
| 			"file": "dom.js", | ||||
| 			"fields": { | ||||
| 				"type": "application/javascript", | ||||
| 				"title": "$:/plugins/tiddlywiki/xmldom/dom", | ||||
| 				"module-type": "library" | ||||
| 			}, | ||||
| 			"prefix": "", | ||||
| 			"suffix": "" | ||||
| 		},{ | ||||
| 			"file": "dom-parser.js", | ||||
| 			"fields": { | ||||
| 				"type": "application/javascript", | ||||
| 				"title": "$:/plugins/tiddlywiki/xmldom/dom-parser", | ||||
| 				"module-type": "library" | ||||
| 			}, | ||||
| 			"prefix": "", | ||||
| 			"suffix": "" | ||||
| 		},{ | ||||
| 			"file": "sax.js", | ||||
| 			"fields": { | ||||
| 				"type": "application/javascript", | ||||
| 				"title": "$:/plugins/tiddlywiki/xmldom/sax", | ||||
| 				"module-type": "library" | ||||
| 			}, | ||||
| 			"prefix": "", | ||||
| 			"suffix": "" | ||||
| 		},{ | ||||
| 			"file": "LICENSE", | ||||
| 			"fields": { | ||||
| 				"type": "text/plain", | ||||
| 				"title": "$:/plugins/tiddlywiki/xmldom/license" | ||||
| 			} | ||||
| 		} | ||||
| 	] | ||||
| } | ||||
							
								
								
									
										7
									
								
								plugins/tiddlywiki/xmldom/plugin.info
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								plugins/tiddlywiki/xmldom/plugin.info
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| { | ||||
| 	"title": "$:/plugins/tiddlywiki/xmldom", | ||||
| 	"description": "Wrapper for xmldom", | ||||
| 	"author": "JeremyRuston", | ||||
| 	"core-version": ">=5.0.0", | ||||
| 	"list": "readme license" | ||||
| } | ||||
							
								
								
									
										3
									
								
								plugins/tiddlywiki/xmldom/readme.tid
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								plugins/tiddlywiki/xmldom/readme.tid
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| title: $:/plugins/tiddlywiki/xmldom/readme | ||||
|  | ||||
| This plugin packages [[xmldom|https://github.com/jindw/xmldom]] for use by other plugins. It does not provide any end-user visible features. | ||||
		Reference in New Issue
	
	Block a user
	 Jermolene
					Jermolene