svnno****@sourc*****
svnno****@sourc*****
2010年 4月 11日 (日) 22:14:43 JST
Revision: 1789 http://sourceforge.jp/projects/sie/svn/view?view=rev&revision=1789 Author: dhrname Date: 2010-04-11 22:14:43 +0900 (Sun, 11 Apr 2010) Log Message: ----------- ufltimateをテスト用に統合 Modified Paths: -------------- trunk/org/w3c/core.js Modified: trunk/org/w3c/core.js =================================================================== --- trunk/org/w3c/core.js 2010-04-11 12:16:53 UTC (rev 1788) +++ trunk/org/w3c/core.js 2010-04-11 13:14:43 UTC (rev 1789) @@ -76,35 +76,28 @@ interface NodeList; interface NamedNodeMap; interface Element; - - exception DOMException { - unsigned short code; - }; - // ExceptionCode - const unsigned short INDEX_SIZE_ERR = 1; - const unsigned short DOMSTRING_SIZE_ERR = 2; - const unsigned short HIERARCHY_REQUEST_ERR = 3; - const unsigned short WRONG_DOCUMENT_ERR = 4; - const unsigned short INVALID_CHARACTER_ERR = 5; - const unsigned short NO_DATA_ALLOWED_ERR = 6; - const unsigned short NO_MODIFICATION_ALLOWED_ERR = 7; - const unsigned short NOT_FOUND_ERR = 8; - const unsigned short NOT_SUPPORTED_ERR = 9; - const unsigned short INUSE_ATTRIBUTE_ERR = 10; - // Introduced in DOM Level 2: - const unsigned short INVALID_STATE_ERR = 11; - // Introduced in DOM Level 2: - const unsigned short SYNTAX_ERR = 12; - // Introduced in DOM Level 2: - const unsigned short INVALID_MODIFICATION_ERR = 13; - // Introduced in DOM Level 2: - const unsigned short NAMESPACE_ERR = 14; - // Introduced in DOM Level 2: - const unsigned short INVALID_ACCESS_ERR = 15; */ function DOMException(n){ Error.apply(this, arguments); this.code = n; + var s = [ + "Index Size Error (入力値が大きすぎるか、マイナスの値ではありませんか)", + "DOMString Size Error (テキストの指定範囲が文字数を超えていませんか)", + "Hierarchy Request Error (先祖ノードを子ノードとして付け加えることができないようです)", + "Wrong Document Error (ノードがどこのドキュメントノードに属しているかお確かめください)", + "Invalid Character Error (入力された文字列に認識できない記号を使っているか、文字列が空ではないでしょうか)", + "No Data Allowed Error", + "No Modification Allowed Error", + "Not Found Error (お探しになっているノードが見つかりませんでした)", + "Not Supported Error (指定されたノード型とは別の型をご用意ください)", + "Inuse Attribute Error (その属性ノードはすでに他の要素へ属していないでしょうか)", + "Invalid State Error", + "Syntax Error", + "Invalid Modification Error", + "Namespace Error", + "Invalid Access Error" + ]; + this.message = s[n]; return this; /*DOMSTRING_SIZE_ERR テキストの指定された範囲がDOMStringに合致しない。 2 @@ -158,78 +151,79 @@ /*DOMImplementation *DOMの基本的な機能をつかさどる */ -DOMImplementation = {}; - -/* hasFeature - *文字列によって、機能をサポートしているかどうかをチェックする。削除不可。 - */ -/*boolean*/ DOMImplementation.hasFeature = function(/*string*/ feature, version) { - switch (feature) { - case "CORE" : - case "XML" : - case "Events" : //DOM level2 Eventを参照 - case "StyleSheets" : //DOM level2 StyleSheetを参照 - case "org.w3c.svg.static" : //SVG1.1の仕様を参照 - case "org.w3c.dom.svg.static" : - return true; - default : - if (version === "2.0") { //DOM level2 Coreにおいて策定されたバージョン情報 - return true; - } else { - return false; +DOMImplementation = { + /* hasFeature + *文字列によって、機能をサポートしているかどうかをチェックする。削除不可。 + */ + /*boolean*/ hasFeature : function(/*string*/ feature, version) { + switch (feature) { + case "CORE" : + case "XML" : + case "Events" : //DOM level2 Eventを参照 + case "StyleSheets" : //DOM level2 StyleSheetを参照 + case "org.w3c.svg.static" : //SVG1.1の仕様を参照 + case "org.w3c.dom.svg.static" : + return true; + default : + if (version === "2.0") { //DOM level2 Coreにおいて策定されたバージョン情報 + return true; + } else { + return false; + } } - } -}; + }, -/* createDocumentType - *ドキュメントタイプを作るためのもの。削除可。 - */ -/*DocumentType*/ DOMImplementation.createDocumentType = function(/*string*/ qualifiedName, publicId, systemId) { - var s = new Node(); - s.publicId = publicId; - s.systemId = systemId; - return s; -}; + /* createDocumentType + *ドキュメントタイプを作るためのもの。削除可。 + */ + /*DocumentType*/ createDocumentType : function(/*string*/ qualifiedName, publicId, systemId) { + var s = new Node(); + s.publicId = publicId; + s.systemId = systemId; + return s; + }, + /* createDocument + * ドキュメントオブジェクトを作るためのもの。削除不可。 + */ + /*Document*/ createDocument : function( /*string*/ ns, qname, /*DocumentType*/ doctype) { + try { + var s; + if (ns) { + s = new (DOMImplementation[ns].Document); + } else { + s = new Document(); + } + s.implementation = this; + s.doctype = doctype; + s.documentElement = s.createElementNS(ns,qname); //ルート要素を作る + return s; + } catch(e){alert(e.message);} + }, + "http://www.w3.org/2000/xmlns": {} +} -/* createDocument - * ドキュメントオブジェクトを作るためのもの。削除不可。 - */ -/*Document*/ DOMImplementation.createDocument = function( /*string*/ ns, qname, /*DocumentType*/ doctype) { - try { - if (ns === "http://www.w3.org/svg/2000") { //名前空間がSVGに属しているのであれば、 - var s = new SVGDocument(); //SVGDocumentを作る(要svg.js) - } else { - var s = new Document(); - } - s.documentElement = s.rootElement = s.createElementNS(ns,qname); //ルート要素を作る - s.implementation = this; - s.doctype = doctype; - return s; - } catch(e){alert(e.message);} -}; - /* Node *ノード(節)はすべての雛形となる重要なものである。削除不可。 - * - // NodeType - const unsigned short ELEMENT_NODE = 1; - const unsigned short ATTRIBUTE_NODE = 2; - const unsigned short TEXT_NODE = 3; - const unsigned short CDATA_SECTION_NODE = 4; - const unsigned short ENTITY_REFERENCE_NODE = 5; - const unsigned short ENTITY_NODE = 6; - const unsigned short PROCESSING_INSTRUCTION_NODE = 7; - const unsigned short COMMENT_NODE = 8; - const unsigned short DOCUMENT_NODE = 9; - const unsigned short DOCUMENT_TYPE_NODE = 10; - const unsigned short DOCUMENT_FRAGMENT_NODE = 11; - const unsigned short NOTATION_NODE = 12; -*/ + */ + function Node(){ this.childNodes = []; this._capter = []; //eventで利用 return this; } +// NodeType +/*const unsigned short*/ Node.ELEMENT_NODE = 1; +/*const unsigned short*/ Node.ATTRIBUTE_NODE = 2; +/*const unsigned short*/ Node.TEXT_NODE = 3; +/*const unsigned short*/ Node.CDATA_SECTION_NODE = 4; +/*const unsigned short*/ Node.ENTITY_REFERENCE_NODE = 5; +/*const unsigned short*/ Node.ENTITY_NODE = 6; +/*const unsigned short*/ Node.PROCESSING_INSTRUCTION_NODE = 7; +/*const unsigned short*/ Node.COMMENT_NODE = 8; +/*const unsigned short*/ Node.DOCUMENT_NODE = 9; +/*const unsigned short*/ Node.DOCUMENT_TYPE_NODE = 10; +/*const unsigned short*/ Node.DOCUMENT_FRAGMENT_NODE = 11; +/*const unsigned short*/ Node.NOTATION_NODE = 12; Node.prototype = { //以下は初期値として設定 tar : null, @@ -276,9 +270,6 @@ this.firstChild = this.childNodes[0]; this.lastChild = this.childNodes[this.childNodes.length-1]; n.parentNode = this; - if (n.tar && ref.tar){ - this.tar.insertBefore(n.tar,ref.tar); - } return n; }, /*replaceChildメソッド @@ -304,9 +295,6 @@ if (ele.ownerDocument !== this.ownerDocument) { //所属ドキュメントが違う場合 throw (new Error()); } - if (this instanceof SVGElement){ //ノードがSVGElementならば、 - this.tar.removeChild(ele.tar); - } return ele; }, /*appendChildメソッド @@ -314,11 +302,6 @@ */ /*Node*/ appendChild : function( /*Node*/ ele) { this.insertBefore(ele,null); - if (this.namespaceURI === "http://www.w3.org/2000/svg") { //SVG関連要素ならば - if (ele.tar){ - this.tar.appendChild(ele.tar); - } - } return ele; }, /*hasChildNodesメソッド @@ -337,12 +320,12 @@ /*Node*/ cloneNode : function( /*boolean*/ deep) { var s; switch (this.nodeType) { - case 1: + case Node.ELEMENT_NODE: s = new Element(); s.tagName = this.tagName; s.attributes._copyNode(this.attributes,false); //NamedNodeMapのコピーを行う break; - case 9: + case Node.DOCUMENT_NODE: s = new Document(); break; default: @@ -354,9 +337,6 @@ if (deep) { s.childNodes._copyNode(this.childNodes,true); } - if (this instanceof SVGElement && this.tar){ - this.tar = this.tar.cloneNode(deep); - } return s; }, /*normalizeメソッド @@ -367,11 +347,11 @@ try { for (var i=tcn.length-1;i<0;--i) { var tcni = tcn[i], tcnip = tcni.nextSibling; - if (tcnip) { //次ノードがnullではなく、かつ、 - if (tcni.nodeType === 3 && tcnip.nodeType === 3) { //現ノードがテキストノード、かつ、次ノードもテキストノードならば - tcni.appendData(tcnip.data); //次ノードの文字列データを、現ノード文字列の前に付け加える + if (tcnip) { + if (tcni.nodeType === Node.TEXT_NODE && tcnip.nodeType === Node.TEXT_NODE) { + tcni.appendData(tcnip.data); //次ノードの文字列データを、現ノード文字列の後に付け加える tcni.legnth = tcni.data.length; - this.removeChild(tcnip); //次ノードを排除 + this.removeChild(tcnip); //次ノードを排除 } else { tcni.normalize(); } @@ -459,7 +439,7 @@ var tgans = this.getNamedItemNS(arg.namespaceURI, arg.localName); if (tgans) { //ノードがすでにあるならば、 var s = this[this._num]; - this[this._num] = node; + this[this._num] = arg; return s; } else { if ( arg.ownerElement !== void 0) { //ノードがもはや別の要素で使われている @@ -484,7 +464,7 @@ return s; } }, - _copyNode : __nnmp_c //上記のArrayの_copyNodeを参照 + _copyNode : Array.prototype._copyNode //上記のArrayの_copyNodeを参照 }; /*CharacterData @@ -507,7 +487,7 @@ if (offset + count > this.length) { //offsetとcountの和が文字全体の長さを超える場合、offsetから最後までのを取り出す count = this.length - offset; } - var s = this.data.substr(offset, count); //Stringのsubstrを用いて、count分の文字列を取り出す + var s = this.data.substr(offset, count); return s; }; /*void*/ CharacterData.prototype.appendData = function( /*string*/ arg) { @@ -542,7 +522,7 @@ */ function Attr() { Node.apply(this, arguments); - this.nodeType = 2; + this.nodeType = Node.ATTRIBUTE_NODE; return this; }; Attr.prototype = new Node(); //ノードのプロトタイプチェーンを作って、継承 @@ -553,7 +533,7 @@ */ function Element() { Node.apply(this, arguments); - this.nodeType = 1; + this.nodeType = Node.ELEMENT_NODE; this.nodeValue = null; this.attributes = new NamedNodeMap(); //属性を収納 return this; @@ -588,64 +568,10 @@ } }; /*void*/ Element.prototype.setAttributeNS = function( /*string*/ namespaceURI, /*string*/ qualifiedName, /*string*/ value) { - var localName = ""; - if (qualifiedName.indexOf(":") !== -1){ //もし、:が文字内に含まれていれば - var p = qualifiedName.split(":"); //:を区分に切り分けて、配列pに - localName = p[1]; - } else { - localName = qualifiedName; - } - var n = this.getAttributeNodeNS(namespaceURI, localName); //属性ノードを取得する - if (n) { //該当する属性ノードがあれば、 - n.nodeValue = value; - n.value = value; - /*注意 - *ここで接頭語(属性ノードのprefix)も、qualifiedNameの接頭語にあわせて書き換えられるべきであるが、軽量化のため、省略する - */ - } else { - var atn = this.ownerDocument.createAttributeNS(namespaceURI, qualifiedName); - atn.nodeValue = value; - atn.value = value; - this.setAttributeNodeNS(atn); - atn.ownerElement = this; - if (qualifiedName === "id" && !namespaceURI) { //id属性であったならば - this.ownerDocument._id[value] = this; //ドキュメントに登録しておく - } - this.ownerDocument.dispatch = this; - } - localName = null; - if(this.namespaceURI === "http://www.w3.org/svg/2000") { - try{ //以下でfill,storke要素のリセットが必要 - if (this instanceof STGroupElement) { //g要素ならば - this.paint = NAIBU.PaintColor.prototype.cache[this.tar.uniqueID]; - this.setProperty(localName, value) - } else { - var tgebtfill = this.tar.getElementsByTagName("fill"), tgebtstroke = this.tar.getElementsByTagName("stroke"); - if (tgebtfill.length > 0) { - this.tar.removeChild(tgebtfill[0]); - } - if (tgebtstroke.length > 0) { - this.tar.removeChild(tgebtstroke[0]); - } - this.setProperty(localName, value) - } - if (localName === "transform") { - var tar = {getAttribute : (function(n){return value})}; - this.transformable = NAIBU.transformToCTM(tar, this.partransformable); - tar = null; - this.set(this.w, this.h); - } - var tn = this[localName]; - if (tn !== void 0) { //属性が定義されていれば - if (typeof tn === "string"){ //文字列の場合 - this[tn] = value; - } else if (tn instanceof STLength) { //長さの場合 - this[tn].newValueSpecifiedUnits(this[tn].uniType, parseFloat(value)); - } - this.set(this.w, this.h); - } - }catch(e){} - } + var atn = this.ownerDocument.createAttributeNS(namespaceURI, qualifiedName); + atn.nodeValue = value; + atn.value = value; + this.setAttributeNodeNS(atn); }; /*void*/ Element.prototype.removeAttributeNS = function( /*string*/ namespaceURI, /*string*/ localName) { }; @@ -654,32 +580,37 @@ return s; }; /*Attr*/ Element.prototype.setAttributeNodeNS = function( /*Attr*/ newAttr){ - if (newAttr.ownerElement !== void 0) { - if (newAttr.ownerElement.ownerDocument !== this.ownerDocument) { //所属ドキュメントが違う場合 - throw (new DOMException(DOMException.WRONG_DOCUMENT_ERR)); - } + if (newAttr.ownerDocument !== this.ownerDocument) { //所属ドキュメントが違う場合 + throw (new DOMException(DOMException.WRONG_DOCUMENT_ERR)); } var s = this.attributes.setNamedItemNS(newAttr); + newAttr.ownerElement = this; + if (newAttr.localName === "id") { //id属性であったならば + this.ownerDocument._id[newAttr.nodeValue] = this; //ドキュメントに登録しておく + } return s; }; /*NodeList(Array)*/ Element.prototype.getElementsByTagNameNS = function( /*string*/ namespaceURI, /*string*/ localName) { var s = [], n = 0; var tno = this.childNodes; for (var i=0,tcli = tno.length;i<tcli;i++) { - namespaceURI = (namespaceURI === "*") ? tno[i].namespceURI : namespaceURI; - localName = (localName === "*") ? tno[i].localName : localName; - if(tno[i].namespaceURI == namespaceURI && tno[i].localName == localName) { - s[n] = tno[i]; - n++; - } else { - var d = tno[i].getElementsByTagNameNS(namespaceURI, localName); + var tnoi = tno[i]; + if (tnoi.nodeType === Node.ELEMENT_NODE) { + var ns = (namespaceURI === "*") ? tnoi.namespceURI : namespaceURI; + var ln = (localName === "*") ? tnoi.localName : localName; + if(tnoi.namespaceURI == ns && tnoi.localName == ln) { + s[n] = tnoi; + n++; + } + var d = tnoi.getElementsByTagNameNS(namespaceURI, localName); if (d) { - s.concat(d); + s = s.concat(d); n += d.length; } + ns = ln = d = null; } } - if (n==0) { + if (n === 0) { return null; //該当する要素なし } return s; @@ -687,30 +618,19 @@ /*boolean*/ Element.prototype.hasAttribute = function( /*string*/ name) { }; /*boolean*/ Element.prototype.hasAttributeNS = function( /*string*/ namespaceURI, /*string*/ localName) { - if (this.getNamedItemNS(namespaceURI, localName)) { //ノードの取得に成功した場合 + if (this.getAttributeNodeNS(namespaceURI, localName)) { //ノードの取得に成功した場合 return true; } else { return false; } }; -Element.prototype.setProperty = function(attr,value) { - try{ - attr = attr.replace(/(fill|stroke)-/, "$1"); - if (this.paint.defaults[attr] !== void 0) { - this.paint[attr] = value; - this.paint.set(this.w, this.h, this.transformable); - } - } catch(e){} - attr = value = null; -} - /*Text *テキストノード。削除不可。 */ function Text() { CharacterData.apply(this, arguments); - this.nodeType = 3; + this.nodeType = Node.TEXT_NODE; this.nodeName = "#text"; return this; }; @@ -726,7 +646,7 @@ } var nnode = this.ownerDocument.createTextNode(next); if (this.parentNode) { - this.parentNode.insertBefore(nnode, this.nextSibling); //親要素があれば、このノードの次の兄弟ノードとしてnnodeを入れる + this.parentNode.insertBefore(nnode, this.nextSibling); } return nnode; }; @@ -735,7 +655,7 @@ *コメントノード。<!-- --!>で表現される。削除不可。 */ function Comment() { - this.nodeType = 8; + this.nodeType = Node.COMMENT_NODE; this.nodeName = "#comment"; return this; }; @@ -746,7 +666,7 @@ *CDATA領域を示すノード。<![CDATA[ ]]!>で表現される。削除不可。 */ function CDATASection() { - this.nodeType = 4; + this.nodeType = Node.CDATA_SECTION_NODE; this.nodeName = "#cdata-section"; return this; }; @@ -765,7 +685,7 @@ this.systemId = ""; //上同のシステム識別子 this.internalSubset = ""; //内部サブセットの内容(文字列) this.nodeValue = null; - this.nodeType = 10; + this.nodeType = Node.DOCUMENT_TYPE_NODE; return this; }; DocumentType.prototype = new Node(); //ノードのプロトタイプチェーンを作って、継承 @@ -778,7 +698,7 @@ this.publicId = null; this.systemId = null; this.nodeValue = null; - this.nodeType = 12; + this.nodeType = Node.NOTATION_NODE; return this; }; Notation.prototype = new Node(); //ノードのプロトタイプチェーンを作って、継承 @@ -795,7 +715,7 @@ this.systemId = null; this.notationName = null; //解析対象外実体のための記法名。解析対象実体ではnull this.nodeValue = null; - this.nodeType = 6; + this.nodeType = Node.ENTITY_NODE; return this; }; Entity.prototype = new Node(); //ノードのプロトタイプチェーンを作って、継承 @@ -806,7 +726,7 @@ */ function EntityReference() { this.nodeValue = null; - this.nodeType = 5; + this.nodeType = Node.ENTITY_REFERENCE_NODE ; return this; }; EntityReference.prototype = new Node(); //ノードのプロトタイプチェーンを作って、継承 @@ -816,7 +736,7 @@ *処理命令ノード。スタイルシート処理命令で使うので、削除不可 */ function ProcessingInstruction() { - this.nodeType = 7; + this.nodeType = Node.PROCESSING_INSTRUCTION_NODE; return this; }; ProcessingInstruction.prototype = new Node(); //ノードのプロトタイプチェーンを作って、継承 @@ -828,7 +748,7 @@ function DocumentFragment() { this.nodeName = "#document-fragment"; this.nodeValue = null; - this.nodeType = 11; + this.nodeType = Node.DOCUMENT_FRAGMENT_NODE; return this; }; DocumentFragment.prototype = new Node(); //ノードのプロトタイプチェーンを作って、継承 @@ -840,10 +760,8 @@ function Document() { this.nodeName = "#document"; this.nodeValue = null; - this.nodeType = 9; + this.nodeType = Node.DOCUMENT_NODE; this._id = {}; //getElementByIdで使う - this._arr = []; //setAttributeNSで使う - var tf = this._fireEvent; return this; }; Document.prototype = new Node(); //ノードのプロトタイプチェーンを作って、継承 @@ -870,6 +788,7 @@ /*Text*/ Document.prototype.createTextNode = function( /*string*/ data) { var s = new Text(); s.data = s.nodeValue = data; + s.ownerDocument = this; return s; }; /*createCommentメソッド @@ -878,6 +797,7 @@ /*Comment*/ Document.prototype.createComment = function( /*string*/ data) { var s = new Comment(); s.nodeValue = data; + s.ownerDocument = this; return s; }; /*createCDATASectionメソッド @@ -886,6 +806,7 @@ /*CDATASection*/ Document.prototype.createCDATASection = function( /*string*/ data) { var s = new CDATASection(); s.nodeValue = data; + s.ownerDocument = this; return s; }; /*createProcessingInstructionメソッド @@ -895,6 +816,7 @@ var s = new ProcessingInstruction(); s.target = s.nodeName = target; s.data = s.nodeValue = data; + s.ownerDocument = this; return s; }; /*createAttribute @@ -908,6 +830,7 @@ /*EntityReference*/ Document.prototype.createEntityReference = function( /*string*/ name) { var s = new EntityReference(); s.nodeName = name; + s.ownerDocument = this; return s; }; /*getElementsByTagNameメソッド @@ -920,37 +843,72 @@ */ /*Node*/ Document.prototype.importNode = function( /*Node*/ importedNode, /*boolean*/ deep) { var s; + /*以下の処理は引き渡されたimportedNodeがMSXMLによって解析された + *データであることを前提にしている + */ switch (importedNode.nodeType) { - case 1: + case Node.ELEMENT_NODE: s = this.createElementNS(importedNode.namespaceURI, importedNode.nodeName); var attr = importedNode.attributes, att; - for (var i=0,atli=attr.length;i<atli;i++) { //NamedNodeMapを検索する + for (var i=0,atli=attr.length;i<atli;++i) { //NamedNodeMapを検索する att = this.importNode(attr[i], false); - s.attributes.setNamedItemNS(att); + s.setAttributeNodeNS(att); } if (deep) { - var ch = importedNode.childNodes, n; - for (var i=0,chli=ch.length;i<chli;i++) { //子ノードを検索して、子供がいれば、importNodeメソッドを再帰的に実行する - n = this.importNode(ch[i],true); + var fi = importedNode.firstChild, n; + while (fi) { //子ノードを検索して、子供がいれば、importNodeメソッドを再帰的に実行する + n = this.importNode(fi, true); s.appendChild(n); + fi = fi.nextSibling; } } + i = attr = att = atli = n = ch = chli = null; break; - case 2: //attribute_node + case Node.ATTRIBUTE_NODE: s = this.createAttributeNS(importedNode.namespaceURI, importedNode.nodeName); s.nodeValue = importedNode.nodeValue; break; - case 3: //text_node - case 8: //comment_node - s = importedNode.cloneNode(false); - s.ownerDocument = this; + case Node.TEXT_NODE: + s = this.createTextNode(importedNode.data); + case Node.COMMENT_NODE: + s = this.createComment(importedNode.data); break; - case 11: //document_fragment_node + case Node.DOCUMENT_FRAGMENT_NODE: + s = this.createDocumentFragment(); + if (deep) { + var ch = importedNode.childNodes, n; + for (var i=0,chli=ch.length;i<chli;i++) { //子ノードを検索して、子供がいれば、importNodeメソッドを再帰的に実行する + n = this.importNode(ch[i], true); + s.appendChild(n); + } + } + i = n = ch = chli = null; break; + case Node.CDATA_SECTION_NODE: + s = this.createCDATASection(); + break; + case Node.ENTITY_REFERENCE_NODE: + s = this.createEntityReference(importedNode.nodeName); + break; + case Node.ENTITY_NODE: + s = new Entity(); + s.publicId = importedNode.publicId; + s.systemId = importedNode.systemId; + s.notationName = importedNode.notationName; + break; + case Node.PROCESSING_INSTRUCTION_NODE: + s = this.createProcessingInstruction(importedNode.nodeName, importedNode.nodeValue) + break; + case Node.NOTATION_NODE: + s = new Notation(); + s.publicId = importedNode.publicId; + s.systemId = importedNode.systemId; + break; default: throw (new DOMException(DOMException.NOT_SUPPORTED_ERR)); break; } + importedNode = deep = null; return s; }; /*createElementNSメソッド @@ -958,101 +916,37 @@ *例:var s = DOC.createElementNS("http://www.w3.org/2000/svg", "svg:svg"); */ /*Element*/ Document.prototype.createElementNS = function( /*string*/ namespaceURI, /*string*/ qualifiedName) { - var ele, s; + var ele, prefix = null, localName = null; if (!qualifiedName) { throw (new DOMException(DOMException.INVALID_CHARACTER_ERR)); } - if (namespaceURI === "http://www.w3.org/2000/svg") { - switch (qualifiedName) { - case "g": - s = document.createElement("v:group"); q = false; - break; - case "linearGradient": - s = document.createElement("v:fill"); q = false; - break; - case "radialGradient": - s = document.createElement("v:fill"); q = false; - break; - case "stop": - s = document.createElement("stop"); q = false; - break; - case "a": - s = document.createElement("a"); - break; - case "text": - s = document.createElement("div"); - break; - case "tspan": - s = document.createElement("span"); - break; - case "image": - s = document.createElement("v:image"); - break; - case "path": - case "rect": - case "circle": - case "ellipse": - case "polyline": - case "polygon": - case "line": - s = document.createElement("v:shape"); - break; - default: - s = null; - break; - } - switch (qualifiedName) { - case "path": - ele = this.path[this.path.length] = new STPath(s); - break; - case "rect": - ele = this.rect[this.rect.length] = new STRectElement(s); - break; - case "circle": - ele = this.circle[this.circle.length] = new STCircle(s); - break; - case "ellipse": - ele = this.ellipse[this.ellipse.length] = new STEllipse(s); - break; - case "polyline": - ele = this.polyline[this.polyline.length] = new STPolyline(s); - break; - case "polygon": - ele = this.polygon[this.polygon.length] = new STPolygon(s); - break; - case "line": - ele = this.line[this.line.length] = new STLine(s); - break; - case "a": - this.a[this.a.length] = new STAElement(s); - break; - case "text": - ele = this.text[this.text.length] = new STText(s); - break; - case "image": - ele = this.image[this.image.length] = new STImage(s); - break; - default: - ele = new SVGElement(); ele.tar = s; - break; + if (qualifiedName.indexOf(":") !== -1){ + var p = qualifiedName.split(":"); + prefix = p[0]; + localName = p[1]; + } else { + localName = qualifiedName; + } + var isSpecified = false; + if (namespaceURI) { + var ti = this.implementation; + if (!!ti[namespaceURI]) { + if (!!ti[namespaceURI][localName]) { //もし、名前空間とローカル名によって、オブジェクトがあった場合 + isSpecified = true; + } } - } else if (namespaceURI === "http://www.w3.org/1999/xhtml") { - ele = new Element(); - ele.tar = document.createElement(qualifiedName); + } + if (isSpecified) { + ele = new (ti[namespaceURI][localName]); } else { ele = new Element(); } ele.namespaceURI = namespaceURI; ele.nodeName = ele.tagName = qualifiedName; - if (qualifiedName.indexOf(":") !== -1){ - var p = qualifiedName.split(":"); - ele.prefix = p[0]; - ele.localName = p[1]; - } else { - ele.prefix = null; - ele.localName = qualifiedName; - } + ele.localName = localName; + ele.prefix = prefix; ele.ownerDocument = this; + namespaceURI = qualifiedName = prefix = localName = isSpecified = null; return ele; }; /*createAttributeNSメソッド @@ -1071,6 +965,7 @@ attr.prefix = null; attr.localName = qualifiedName; } + attr.ownerDocument = this; return attr; }; /*getElementsByTagNameNSメソッド @@ -1084,7 +979,7 @@ *id属性の値で要素ノードを指定 */ /*Element*/ Document.prototype.getElementById = function( /*string*/ elementId) { - var s = (typeof(this._id[elementId]) == "undefined") ? null : this._id[elementId]; + var s = !!this._id[elementId] ? this._id[elementId] : null; return s; };