| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345 | /* * Copyright (C)2005-2012 Haxe Foundation * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */@:native("_Xml.RealXmlType")extern enum XmlType {}private enum RealXmlType {        Element;        PCData;        CData;        Comment;        DocType;        ProcessingInstruction;        Document;}@:coreApi class Xml {	public static var Element(default,null) : XmlType;	public static var PCData(default,null) : XmlType;	public static var CData(default,null) : XmlType;	public static var Comment(default,null) : XmlType;	public static var DocType(default,null) : XmlType;	public static var ProcessingInstruction(default,null) : XmlType;	public static var Document(default,null) : XmlType;	public var nodeType(default,null) : XmlType;	public var nodeName(get,set) : String;	public var nodeValue(get,set) : String;	public var parent(get,null) : Xml;	var _nodeName : String;	var _nodeValue : String;	var _attributes : haxe.ds.StringMap<String>;	var _children : Array<Xml>;	var _parent : Xml;	public static function parse( str : String ) : Xml {		return haxe.xml.Parser.parse(str);	}	private function new() : Void {	}	public static function createElement( name : String ) : Xml {		var r = new Xml();		r.nodeType = Xml.Element;		r._children = new Array();		r._attributes = new haxe.ds.StringMap();		r.set_nodeName( name );		return r;	}	public static function createPCData( data : String ) : Xml {		var r = new Xml();		r.nodeType = Xml.PCData;		r.set_nodeValue( data );		return r;	}	public static function createCData( data : String ) : Xml {		var r = new Xml();		r.nodeType = Xml.CData;		r.set_nodeValue( data );		return r;	}	public static function createComment( data : String ) : Xml {		var r = new Xml();		r.nodeType = Xml.Comment;		r.set_nodeValue( data );		return r;	}	public static function createDocType( data : String ) : Xml {		var r = new Xml();		r.nodeType = Xml.DocType;		r.set_nodeValue( data );		return r;	}	public static function createProcessingInstruction( data : String ) : Xml {		var r = new Xml();		r.nodeType = Xml.ProcessingInstruction;		r.set_nodeValue( data );		return r;	}	public static function createDocument() : Xml {		var r = new Xml();		r.nodeType = Xml.Document;		r._children = new Array();		return r;	}	private function get_nodeName() : String {		if( nodeType != Xml.Element )			throw "bad nodeType";		return _nodeName;	}	private function set_nodeName( n : String ) : String {		if( nodeType != Xml.Element )			throw "bad nodeType";		return _nodeName = n;	}	private function get_nodeValue() : String {		if( nodeType == Xml.Element || nodeType == Xml.Document )			throw "bad nodeType";		return _nodeValue;	}	private function set_nodeValue( v : String ) : String {		if( nodeType == Xml.Element || nodeType == Xml.Document )			throw "bad nodeType";		return _nodeValue = v;	}	private function get_parent() : Xml {		return _parent;	}	public function get( att : String ) : String {		if( nodeType != Xml.Element )			throw "bad nodeType";		return _attributes.get( att );	}	public function set( att : String, value : String ) : Void {		if( nodeType != Xml.Element )			throw "bad nodeType";		_attributes.set( att, value );	}	public function remove( att : String ) : Void{		if( nodeType != Xml.Element )			throw "bad nodeType";		_attributes.remove( att );	}	public function exists( att : String ) : Bool {		if( nodeType != Xml.Element )			throw "bad nodeType";		return _attributes.exists( att );	}	public function attributes() : Iterator<String> {		if( nodeType != Xml.Element )			throw "bad nodeType";		return _attributes.keys();	}	public function iterator() : Iterator<Xml> {		if ( _children == null ) throw "bad nodetype";		var cur = 0;		var x = this._children;		return {			hasNext : function(){				return cur < x.length;			},			next : function(){				return x[cur++];			}		}	}	public function elements() : Iterator<Xml> {		if ( _children == null ) throw "bad nodetype";		var cur = 0;		var x = _children;		return untyped {			hasNext : function() {				var k = cur;				var l = x.length;				while( k < l ) {					if( x[k].nodeType == Xml.Element )						break;					k += 1;				}				cur = k;				return k < l;			},			next : function() {				var k = cur;				var l = x.length;				while( k < l ) {					var n = x[k];					k += 1;					if( n.nodeType == Xml.Element ) {						cur = k;						return n;					}				}				return null;			}		}	}	public function elementsNamed( name : String ) : Iterator<Xml> {		if ( _children == null ) throw "bad nodetype";		var x = _children;		var cur = 0;		return untyped {			cur: 0,			x: this._children,			hasNext : function() {				var k = cur;				var l = x.length;				while( k < l ) {					var n = x[k];					if( n.nodeType == Xml.Element && n._nodeName == name )						break;					k++;				}				cur = k;				return k < l;			},			next : function() {				var k = cur;				var l = x.length;				while( k < l ) {					var n = x[k];					k++;					if( n.nodeType == Xml.Element && n._nodeName == name ) {						cur = k;						return n;					}				}				return null;			}		}	}	public function firstChild() : Xml {		if( _children == null ) throw "bad nodetype";		return _children[0];	}	public function firstElement() : Xml {		if( _children == null ) throw "bad nodetype";		var cur = 0;		var l = _children.length;		while( cur < l ) {			var n = _children[cur];			if( n.nodeType == Xml.Element )				return n;			cur++;		}		return null;	}	public function addChild( x : Xml ) : Void {		if( _children == null ) throw "bad nodetype";		if( x._parent != null ) x._parent._children.remove(x);		x._parent = this;		_children.push( x );	}	public function removeChild( x : Xml ) : Bool {		if( _children == null ) throw "bad nodetype";		var b = _children.remove( x );		if( b )			x._parent = null;		return b;	}	public function insertChild( x : Xml, pos : Int ) : Void {		if( _children == null ) throw "bad nodetype";		if( x._parent != null ) x._parent._children.remove(x);		x._parent = this;		_children.insert( pos, x );	}	public function toString() : String {		if( nodeType == Xml.PCData )			return StringTools.htmlEscape(_nodeValue);		if( nodeType == Xml.CData )			return "<![CDATA["+_nodeValue+"]]>";		if( nodeType == Xml.Comment )			return "<!--"+_nodeValue+"-->";		if( nodeType == Xml.DocType )			return "<!DOCTYPE "+_nodeValue+">";		if( nodeType == Xml.ProcessingInstruction )			return "<?"+_nodeValue+"?>";		var s = new StringBuf();		if( nodeType == Xml.Element ) {			s.add("<");			s.add(_nodeName);			for( k in _attributes.keys() ){				s.add(" ");				s.add(k);				s.add("=\"");				s.add(_attributes.get(k));				s.add("\"");			}			if( _children.length == 0 ) {				s.add("/>");				return s.toString();			}			s.add(">");		}		for( x in iterator() )			s.add(x.toString());		if( nodeType == Xml.Element ) {			s.add("</");			s.add(_nodeName);			s.add(">");		}		return s.toString();	}	static function __init__() : Void untyped {		Xml.Element = cast RealXmlType.Element;		Xml.PCData = cast RealXmlType.PCData;		Xml.CData = cast RealXmlType.CData;		Xml.Comment = cast RealXmlType.Comment;		Xml.DocType = cast RealXmlType.DocType;		Xml.ProcessingInstruction = cast RealXmlType.ProcessingInstruction;		Xml.Document = cast RealXmlType.Document;	}}
 |