@dooboostore/dom-parser 1.0.1 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/DomParser.js +43 -13
- package/dist/cjs/DomParser.js.map +2 -2
- package/dist/cjs/factory/ElementFactory.js +27 -6
- package/dist/cjs/factory/ElementFactory.js.map +2 -2
- package/dist/cjs/index.js +4 -0
- package/dist/cjs/index.js.map +2 -2
- package/dist/cjs/node/CharacterData.js.map +1 -1
- package/dist/cjs/node/ChildNode.js +0 -15
- package/dist/cjs/node/ChildNode.js.map +3 -3
- package/dist/cjs/node/ChildNodeBase.js +20 -0
- package/dist/cjs/node/ChildNodeBase.js.map +2 -2
- package/dist/cjs/node/Comment.js.map +2 -2
- package/dist/cjs/node/Document.js +0 -27
- package/dist/cjs/node/Document.js.map +4 -4
- package/dist/cjs/node/DocumentBase.js +169 -202
- package/dist/cjs/node/DocumentBase.js.map +2 -2
- package/dist/cjs/node/DocumentFragment.js +0 -15
- package/dist/cjs/node/DocumentFragment.js.map +3 -3
- package/dist/cjs/node/DocumentFragmentBase.js.map +2 -2
- package/dist/cjs/node/Node.js.map +1 -1
- package/dist/cjs/node/NodeBase.js +44 -2
- package/dist/cjs/node/NodeBase.js.map +2 -2
- package/dist/cjs/node/NodeFilter.js +43 -0
- package/dist/cjs/node/NodeFilter.js.map +7 -0
- package/dist/cjs/node/NodeIterator.js +1 -28
- package/dist/cjs/node/NodeIterator.js.map +2 -2
- package/dist/cjs/node/ParentNode.js +0 -15
- package/dist/cjs/node/ParentNode.js.map +3 -3
- package/dist/cjs/node/ParentNodeBase.js +10 -10
- package/dist/cjs/node/ParentNodeBase.js.map +3 -3
- package/dist/cjs/node/ShadowRootBase.js +79 -0
- package/dist/cjs/node/ShadowRootBase.js.map +7 -0
- package/dist/cjs/node/Text.js +0 -15
- package/dist/cjs/node/Text.js.map +3 -3
- package/dist/cjs/node/TextBase.js +0 -3
- package/dist/cjs/node/TextBase.js.map +2 -2
- package/dist/cjs/node/TreeWalker.js +272 -0
- package/dist/cjs/node/TreeWalker.js.map +7 -0
- package/dist/cjs/node/collection/{HTMLCollection.js → HTMLCollectionImp.js} +7 -6
- package/dist/cjs/node/collection/HTMLCollectionImp.js.map +7 -0
- package/dist/cjs/node/collection/HTMLCollectionOfImp.js +26 -0
- package/dist/cjs/node/collection/HTMLCollectionOfImp.js.map +7 -0
- package/dist/cjs/node/collection/NodeList.js.map +1 -1
- package/dist/cjs/node/collection/{NodeListOf.js → NodeListOfImp.js} +6 -6
- package/dist/cjs/node/collection/NodeListOfImp.js.map +7 -0
- package/dist/cjs/node/collection/StylePropertyMapImpl.js +65 -0
- package/dist/cjs/node/collection/StylePropertyMapImpl.js.map +7 -0
- package/dist/cjs/node/collection/index.js +6 -6
- package/dist/cjs/node/collection/index.js.map +2 -2
- package/dist/cjs/node/elements/Element.js +0 -15
- package/dist/cjs/node/elements/Element.js.map +3 -3
- package/dist/cjs/node/elements/ElementBase.js +164 -322
- package/dist/cjs/node/elements/ElementBase.js.map +3 -3
- package/dist/cjs/node/elements/HTMLAreaElement.js.map +2 -2
- package/dist/cjs/node/{collection/HTMLCollectionOf.js → elements/HTMLAudioElement.js} +9 -16
- package/dist/cjs/node/elements/HTMLAudioElement.js.map +7 -0
- package/dist/cjs/node/elements/HTMLButtonElement.js +1 -1
- package/dist/cjs/node/elements/HTMLButtonElement.js.map +2 -2
- package/dist/cjs/node/elements/HTMLDListElement.js +29 -0
- package/dist/cjs/node/elements/HTMLDListElement.js.map +7 -0
- package/dist/cjs/node/elements/HTMLDataElement.js +29 -0
- package/dist/cjs/node/elements/HTMLDataElement.js.map +7 -0
- package/dist/cjs/node/elements/HTMLDataListElement.js +29 -0
- package/dist/cjs/node/elements/HTMLDataListElement.js.map +7 -0
- package/dist/cjs/node/elements/HTMLDetailsElement.js +29 -0
- package/dist/cjs/node/elements/HTMLDetailsElement.js.map +7 -0
- package/dist/cjs/node/elements/HTMLDialogElement.js +29 -0
- package/dist/cjs/node/elements/HTMLDialogElement.js.map +7 -0
- package/dist/cjs/node/elements/HTMLElement.js +10 -0
- package/dist/cjs/node/elements/HTMLElement.js.map +2 -2
- package/dist/cjs/node/elements/HTMLElementBase.js +153 -3
- package/dist/cjs/node/elements/HTMLElementBase.js.map +2 -2
- package/dist/cjs/node/elements/HTMLEmbedElement.js.map +2 -2
- package/dist/cjs/node/elements/HTMLFieldSetElement.js +29 -0
- package/dist/cjs/node/elements/HTMLFieldSetElement.js.map +7 -0
- package/dist/cjs/node/elements/HTMLHRElement.js +29 -0
- package/dist/cjs/node/elements/HTMLHRElement.js.map +7 -0
- package/dist/cjs/node/elements/HTMLIFrameElement.js +29 -0
- package/dist/cjs/node/elements/HTMLIFrameElement.js.map +7 -0
- package/dist/cjs/node/elements/HTMLLabelElement.js +29 -0
- package/dist/cjs/node/elements/HTMLLabelElement.js.map +7 -0
- package/dist/cjs/node/elements/HTMLLegendElement.js +29 -0
- package/dist/cjs/node/elements/HTMLLegendElement.js.map +7 -0
- package/dist/cjs/node/elements/HTMLMapElement.js +29 -0
- package/dist/cjs/node/elements/HTMLMapElement.js.map +7 -0
- package/dist/cjs/node/elements/HTMLMeterElement.js +29 -0
- package/dist/cjs/node/elements/HTMLMeterElement.js.map +7 -0
- package/dist/cjs/node/elements/HTMLModElement.js +29 -0
- package/dist/cjs/node/elements/HTMLModElement.js.map +7 -0
- package/dist/cjs/node/elements/HTMLObjectElement.js +29 -0
- package/dist/cjs/node/elements/HTMLObjectElement.js.map +7 -0
- package/dist/cjs/node/elements/HTMLOptGroupElement.js +29 -0
- package/dist/cjs/node/elements/HTMLOptGroupElement.js.map +7 -0
- package/dist/cjs/node/elements/HTMLOptionElement.js +29 -0
- package/dist/cjs/node/elements/HTMLOptionElement.js.map +7 -0
- package/dist/cjs/node/elements/HTMLOutputElement.js +29 -0
- package/dist/cjs/node/elements/HTMLOutputElement.js.map +7 -0
- package/dist/cjs/node/elements/HTMLParamElement.js +29 -0
- package/dist/cjs/node/elements/HTMLParamElement.js.map +7 -0
- package/dist/cjs/node/elements/HTMLPictureElement.js +29 -0
- package/dist/cjs/node/elements/HTMLPictureElement.js.map +7 -0
- package/dist/cjs/node/elements/HTMLPreElement.js +29 -0
- package/dist/cjs/node/elements/HTMLPreElement.js.map +7 -0
- package/dist/cjs/node/elements/HTMLProgressElement.js +29 -0
- package/dist/cjs/node/elements/HTMLProgressElement.js.map +7 -0
- package/dist/cjs/node/elements/HTMLQuoteElement.js +29 -0
- package/dist/cjs/node/elements/HTMLQuoteElement.js.map +7 -0
- package/dist/cjs/node/elements/HTMLSelectElement.js +29 -0
- package/dist/cjs/node/elements/HTMLSelectElement.js.map +7 -0
- package/dist/cjs/node/elements/HTMLSlotElement.js +29 -0
- package/dist/cjs/node/elements/HTMLSlotElement.js.map +7 -0
- package/dist/cjs/node/elements/HTMLSourceElement.js +29 -0
- package/dist/cjs/node/elements/HTMLSourceElement.js.map +7 -0
- package/dist/cjs/node/elements/HTMLTableElement.js.map +2 -2
- package/dist/cjs/node/elements/HTMLTbodyElement.js.map +2 -2
- package/dist/cjs/node/elements/HTMLTdElement.js.map +2 -2
- package/dist/cjs/node/elements/HTMLTemplateElement.js.map +2 -2
- package/dist/cjs/node/elements/HTMLTextAreaElement.js +29 -0
- package/dist/cjs/node/elements/HTMLTextAreaElement.js.map +7 -0
- package/dist/cjs/node/elements/HTMLTfootElement.js.map +2 -2
- package/dist/cjs/node/elements/HTMLTheadElement.js.map +2 -2
- package/dist/cjs/node/elements/HTMLTimeElement.js +29 -0
- package/dist/cjs/node/elements/HTMLTimeElement.js.map +7 -0
- package/dist/cjs/node/elements/HTMLTrElement.js.map +2 -2
- package/dist/cjs/node/elements/HTMLTrackElement.js +29 -0
- package/dist/cjs/node/elements/HTMLTrackElement.js.map +7 -0
- package/dist/cjs/node/elements/HTMLVideoElement.js +29 -0
- package/dist/cjs/node/elements/HTMLVideoElement.js.map +7 -0
- package/dist/cjs/node/elements/index.js +181 -92
- package/dist/cjs/node/elements/index.js.map +2 -2
- package/dist/cjs/node/index.js +6 -16
- package/dist/cjs/node/index.js.map +2 -2
- package/dist/cjs/utils/CSSSelector.js.map +2 -2
- package/dist/cjs/window/CustomElementRegistryImp.js +105 -0
- package/dist/cjs/window/CustomElementRegistryImp.js.map +7 -0
- package/dist/cjs/window/Window.js +0 -15
- package/dist/cjs/window/Window.js.map +3 -3
- package/dist/cjs/window/WindowBase.js +233 -515
- package/dist/cjs/window/WindowBase.js.map +2 -2
- package/dist/cjs/window/index.js +0 -5
- package/dist/cjs/window/index.js.map +2 -2
- package/dist/esm/DomParser.js +43 -13
- package/dist/esm/DomParser.js.map +2 -2
- package/dist/esm/factory/ElementFactory.js +27 -6
- package/dist/esm/factory/ElementFactory.js.map +2 -2
- package/dist/esm/index.js +4 -0
- package/dist/esm/index.js.map +2 -2
- package/dist/esm/node/ChildNodeBase.js +20 -0
- package/dist/esm/node/ChildNodeBase.js.map +2 -2
- package/dist/esm/node/Comment.js.map +2 -2
- package/dist/esm/node/Document.js +0 -8
- package/dist/esm/node/Document.js.map +4 -4
- package/dist/esm/node/DocumentBase.js +166 -199
- package/dist/esm/node/DocumentBase.js.map +2 -2
- package/dist/esm/node/DocumentFragmentBase.js.map +2 -2
- package/dist/esm/node/Node.js.map +1 -1
- package/dist/esm/node/NodeBase.js +45 -22
- package/dist/esm/node/NodeBase.js.map +2 -2
- package/dist/esm/node/NodeFilter.js +24 -0
- package/dist/esm/node/NodeFilter.js.map +7 -0
- package/dist/esm/node/NodeIterator.js +1 -28
- package/dist/esm/node/NodeIterator.js.map +2 -2
- package/dist/esm/node/ParentNodeBase.js +4 -4
- package/dist/esm/node/ParentNodeBase.js.map +2 -2
- package/dist/esm/node/ShadowRootBase.js +60 -0
- package/dist/esm/node/ShadowRootBase.js.map +7 -0
- package/dist/esm/node/TextBase.js +0 -3
- package/dist/esm/node/TextBase.js.map +2 -2
- package/dist/esm/node/TreeWalker.js +253 -0
- package/dist/esm/node/TreeWalker.js.map +7 -0
- package/dist/esm/node/collection/{HTMLCollection.js → HTMLCollectionImp.js} +4 -3
- package/dist/esm/node/collection/HTMLCollectionImp.js.map +7 -0
- package/dist/esm/node/collection/HTMLCollectionOfImp.js +7 -0
- package/dist/esm/node/collection/HTMLCollectionOfImp.js.map +7 -0
- package/dist/esm/node/collection/NodeList.js.map +1 -1
- package/dist/esm/node/collection/{NodeListOf.js → NodeListOfImp.js} +3 -3
- package/dist/esm/node/collection/NodeListOfImp.js.map +7 -0
- package/dist/esm/node/collection/StylePropertyMapImpl.js +46 -0
- package/dist/esm/node/collection/StylePropertyMapImpl.js.map +7 -0
- package/dist/esm/node/collection/index.js +6 -6
- package/dist/esm/node/collection/index.js.map +2 -2
- package/dist/esm/node/elements/ElementBase.js +164 -322
- package/dist/esm/node/elements/ElementBase.js.map +3 -3
- package/dist/esm/node/elements/HTMLAreaElement.js.map +2 -2
- package/dist/esm/node/elements/HTMLAudioElement.js +10 -0
- package/dist/esm/node/elements/HTMLAudioElement.js.map +7 -0
- package/dist/esm/node/elements/HTMLButtonElement.js +1 -1
- package/dist/esm/node/elements/HTMLButtonElement.js.map +2 -2
- package/dist/esm/node/elements/HTMLDListElement.js +10 -0
- package/dist/esm/node/elements/HTMLDListElement.js.map +7 -0
- package/dist/esm/node/elements/HTMLDataElement.js +10 -0
- package/dist/esm/node/elements/HTMLDataElement.js.map +7 -0
- package/dist/esm/node/elements/HTMLDataListElement.js +10 -0
- package/dist/esm/node/elements/HTMLDataListElement.js.map +7 -0
- package/dist/esm/node/elements/HTMLDetailsElement.js +10 -0
- package/dist/esm/node/elements/HTMLDetailsElement.js.map +7 -0
- package/dist/esm/node/elements/HTMLDialogElement.js +10 -0
- package/dist/esm/node/elements/HTMLDialogElement.js.map +7 -0
- package/dist/esm/node/elements/HTMLElement.js +6 -0
- package/dist/esm/node/elements/HTMLElement.js.map +3 -3
- package/dist/esm/node/elements/HTMLElementBase.js +153 -3
- package/dist/esm/node/elements/HTMLElementBase.js.map +2 -2
- package/dist/esm/node/elements/HTMLEmbedElement.js.map +2 -2
- package/dist/esm/node/elements/HTMLFieldSetElement.js +10 -0
- package/dist/esm/node/elements/HTMLFieldSetElement.js.map +7 -0
- package/dist/esm/node/elements/HTMLHRElement.js +10 -0
- package/dist/esm/node/elements/HTMLHRElement.js.map +7 -0
- package/dist/esm/node/elements/HTMLIFrameElement.js +10 -0
- package/dist/esm/node/elements/HTMLIFrameElement.js.map +7 -0
- package/dist/esm/node/elements/HTMLLabelElement.js +10 -0
- package/dist/esm/node/elements/HTMLLabelElement.js.map +7 -0
- package/dist/esm/node/elements/HTMLLegendElement.js +10 -0
- package/dist/esm/node/elements/HTMLLegendElement.js.map +7 -0
- package/dist/esm/node/elements/HTMLMapElement.js +10 -0
- package/dist/esm/node/elements/HTMLMapElement.js.map +7 -0
- package/dist/esm/node/elements/HTMLMeterElement.js +10 -0
- package/dist/esm/node/elements/HTMLMeterElement.js.map +7 -0
- package/dist/esm/node/elements/HTMLModElement.js +10 -0
- package/dist/esm/node/elements/HTMLModElement.js.map +7 -0
- package/dist/esm/node/elements/HTMLObjectElement.js +10 -0
- package/dist/esm/node/elements/HTMLObjectElement.js.map +7 -0
- package/dist/esm/node/elements/HTMLOptGroupElement.js +10 -0
- package/dist/esm/node/elements/HTMLOptGroupElement.js.map +7 -0
- package/dist/esm/node/elements/HTMLOptionElement.js +10 -0
- package/dist/esm/node/elements/HTMLOptionElement.js.map +7 -0
- package/dist/esm/node/elements/HTMLOutputElement.js +10 -0
- package/dist/esm/node/elements/HTMLOutputElement.js.map +7 -0
- package/dist/esm/node/elements/HTMLParamElement.js +10 -0
- package/dist/esm/node/elements/HTMLParamElement.js.map +7 -0
- package/dist/esm/node/elements/HTMLPictureElement.js +10 -0
- package/dist/esm/node/elements/HTMLPictureElement.js.map +7 -0
- package/dist/esm/node/elements/HTMLPreElement.js +10 -0
- package/dist/esm/node/elements/HTMLPreElement.js.map +7 -0
- package/dist/esm/node/elements/HTMLProgressElement.js +10 -0
- package/dist/esm/node/elements/HTMLProgressElement.js.map +7 -0
- package/dist/esm/node/elements/HTMLQuoteElement.js +10 -0
- package/dist/esm/node/elements/HTMLQuoteElement.js.map +7 -0
- package/dist/esm/node/elements/HTMLSelectElement.js +10 -0
- package/dist/esm/node/elements/HTMLSelectElement.js.map +7 -0
- package/dist/esm/node/elements/HTMLSlotElement.js +10 -0
- package/dist/esm/node/elements/HTMLSlotElement.js.map +7 -0
- package/dist/esm/node/elements/HTMLSourceElement.js +10 -0
- package/dist/esm/node/elements/HTMLSourceElement.js.map +7 -0
- package/dist/esm/node/elements/HTMLTableElement.js.map +2 -2
- package/dist/esm/node/elements/HTMLTbodyElement.js.map +2 -2
- package/dist/esm/node/elements/HTMLTdElement.js.map +2 -2
- package/dist/esm/node/elements/HTMLTemplateElement.js.map +2 -2
- package/dist/esm/node/elements/HTMLTextAreaElement.js +10 -0
- package/dist/esm/node/elements/HTMLTextAreaElement.js.map +7 -0
- package/dist/esm/node/elements/HTMLTfootElement.js.map +2 -2
- package/dist/esm/node/elements/HTMLTheadElement.js.map +2 -2
- package/dist/esm/node/elements/HTMLTimeElement.js +10 -0
- package/dist/esm/node/elements/HTMLTimeElement.js.map +7 -0
- package/dist/esm/node/elements/HTMLTrElement.js.map +2 -2
- package/dist/esm/node/elements/HTMLTrackElement.js +10 -0
- package/dist/esm/node/elements/HTMLTrackElement.js.map +7 -0
- package/dist/esm/node/elements/HTMLVideoElement.js +10 -0
- package/dist/esm/node/elements/HTMLVideoElement.js.map +7 -0
- package/dist/esm/node/elements/index.js +182 -93
- package/dist/esm/node/elements/index.js.map +2 -2
- package/dist/esm/node/index.js +7 -17
- package/dist/esm/node/index.js.map +2 -2
- package/dist/esm/utils/CSSSelector.js.map +2 -2
- package/dist/esm/window/CustomElementRegistryImp.js +86 -0
- package/dist/esm/window/CustomElementRegistryImp.js.map +7 -0
- package/dist/esm/window/WindowBase.js +282 -499
- package/dist/esm/window/WindowBase.js.map +2 -2
- package/dist/esm/window/index.js +0 -5
- package/dist/esm/window/index.js.map +2 -2
- package/dist/esm-bundle/dooboostore-dom-parser.esm.js +3755 -3548
- package/dist/esm-bundle/dooboostore-dom-parser.esm.js.map +4 -4
- package/dist/types/DomParser.d.ts +4 -0
- package/dist/types/DomParser.d.ts.map +1 -1
- package/dist/types/factory/ElementFactory.d.ts +1 -1
- package/dist/types/factory/ElementFactory.d.ts.map +1 -1
- package/dist/types/index.d.ts +3 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/node/CharacterData.d.ts +0 -2
- package/dist/types/node/CharacterData.d.ts.map +1 -1
- package/dist/types/node/ChildNode.d.ts +0 -38
- package/dist/types/node/ChildNode.d.ts.map +1 -1
- package/dist/types/node/ChildNodeBase.d.ts +6 -4
- package/dist/types/node/ChildNodeBase.d.ts.map +1 -1
- package/dist/types/node/Comment.d.ts +1 -1
- package/dist/types/node/Comment.d.ts.map +1 -1
- package/dist/types/node/Document.d.ts +0 -856
- package/dist/types/node/Document.d.ts.map +1 -1
- package/dist/types/node/DocumentBase.d.ts +68 -108
- package/dist/types/node/DocumentBase.d.ts.map +1 -1
- package/dist/types/node/DocumentFragment.d.ts +0 -38
- package/dist/types/node/DocumentFragment.d.ts.map +1 -1
- package/dist/types/node/DocumentFragmentBase.d.ts +1 -8
- package/dist/types/node/DocumentFragmentBase.d.ts.map +1 -1
- package/dist/types/node/Node.d.ts +0 -213
- package/dist/types/node/Node.d.ts.map +1 -1
- package/dist/types/node/NodeBase.d.ts +11 -8
- package/dist/types/node/NodeBase.d.ts.map +1 -1
- package/dist/types/node/NodeFilter.d.ts +25 -0
- package/dist/types/node/NodeFilter.d.ts.map +1 -0
- package/dist/types/node/NodeIterator.d.ts +0 -34
- package/dist/types/node/NodeIterator.d.ts.map +1 -1
- package/dist/types/node/ParentNode.d.ts +0 -84
- package/dist/types/node/ParentNode.d.ts.map +1 -1
- package/dist/types/node/ParentNodeBase.d.ts +0 -5
- package/dist/types/node/ParentNodeBase.d.ts.map +1 -1
- package/dist/types/node/ShadowRootBase.d.ts +36 -0
- package/dist/types/node/ShadowRootBase.d.ts.map +1 -0
- package/dist/types/node/Text.d.ts +0 -24
- package/dist/types/node/Text.d.ts.map +1 -1
- package/dist/types/node/TextBase.d.ts +2 -3
- package/dist/types/node/TextBase.d.ts.map +1 -1
- package/dist/types/node/TreeWalker.d.ts +48 -0
- package/dist/types/node/TreeWalker.d.ts.map +1 -0
- package/dist/types/node/collection/{HTMLCollection.d.ts → HTMLCollectionImp.d.ts} +2 -3
- package/dist/types/node/collection/HTMLCollectionImp.d.ts.map +1 -0
- package/dist/types/node/collection/HTMLCollectionOfImp.d.ts +9 -0
- package/dist/types/node/collection/HTMLCollectionOfImp.d.ts.map +1 -0
- package/dist/types/node/collection/NodeList.d.ts +0 -1
- package/dist/types/node/collection/NodeList.d.ts.map +1 -1
- package/dist/types/node/collection/{NodeListOf.d.ts → NodeListOfImp.d.ts} +3 -4
- package/dist/types/node/collection/NodeListOfImp.d.ts.map +1 -0
- package/dist/types/node/collection/StylePropertyMapImpl.d.ts +20 -0
- package/dist/types/node/collection/StylePropertyMapImpl.d.ts.map +1 -0
- package/dist/types/node/collection/index.d.ts +3 -3
- package/dist/types/node/collection/index.d.ts.map +1 -1
- package/dist/types/node/elements/Element.d.ts +0 -686
- package/dist/types/node/elements/Element.d.ts.map +1 -1
- package/dist/types/node/elements/ElementBase.d.ts +97 -73
- package/dist/types/node/elements/ElementBase.d.ts.map +1 -1
- package/dist/types/node/elements/HTMLAreaElement.d.ts +0 -1
- package/dist/types/node/elements/HTMLAreaElement.d.ts.map +1 -1
- package/dist/types/node/elements/HTMLAudioElement.d.ts +8 -0
- package/dist/types/node/elements/HTMLAudioElement.d.ts.map +1 -0
- package/dist/types/node/elements/HTMLButtonElement.d.ts +1 -1
- package/dist/types/node/elements/HTMLButtonElement.d.ts.map +1 -1
- package/dist/types/node/elements/HTMLDListElement.d.ts +5 -0
- package/dist/types/node/elements/HTMLDListElement.d.ts.map +1 -0
- package/dist/types/node/elements/HTMLDataElement.d.ts +5 -0
- package/dist/types/node/elements/HTMLDataElement.d.ts.map +1 -0
- package/dist/types/node/elements/HTMLDataListElement.d.ts +5 -0
- package/dist/types/node/elements/HTMLDataListElement.d.ts.map +1 -0
- package/dist/types/node/elements/HTMLDetailsElement.d.ts +5 -0
- package/dist/types/node/elements/HTMLDetailsElement.d.ts.map +1 -0
- package/dist/types/node/elements/HTMLDialogElement.d.ts +5 -0
- package/dist/types/node/elements/HTMLDialogElement.d.ts.map +1 -0
- package/dist/types/node/elements/HTMLElement.d.ts +2 -88
- package/dist/types/node/elements/HTMLElement.d.ts.map +1 -1
- package/dist/types/node/elements/HTMLElementBase.d.ts +133 -3
- package/dist/types/node/elements/HTMLElementBase.d.ts.map +1 -1
- package/dist/types/node/elements/HTMLEmbedElement.d.ts +0 -1
- package/dist/types/node/elements/HTMLEmbedElement.d.ts.map +1 -1
- package/dist/types/node/elements/HTMLFieldSetElement.d.ts +5 -0
- package/dist/types/node/elements/HTMLFieldSetElement.d.ts.map +1 -0
- package/dist/types/node/elements/HTMLHRElement.d.ts +5 -0
- package/dist/types/node/elements/HTMLHRElement.d.ts.map +1 -0
- package/dist/types/node/elements/HTMLIFrameElement.d.ts +5 -0
- package/dist/types/node/elements/HTMLIFrameElement.d.ts.map +1 -0
- package/dist/types/node/elements/HTMLLabelElement.d.ts +5 -0
- package/dist/types/node/elements/HTMLLabelElement.d.ts.map +1 -0
- package/dist/types/node/elements/HTMLLegendElement.d.ts +5 -0
- package/dist/types/node/elements/HTMLLegendElement.d.ts.map +1 -0
- package/dist/types/node/elements/HTMLMapElement.d.ts +5 -0
- package/dist/types/node/elements/HTMLMapElement.d.ts.map +1 -0
- package/dist/types/node/elements/HTMLMeterElement.d.ts +5 -0
- package/dist/types/node/elements/HTMLMeterElement.d.ts.map +1 -0
- package/dist/types/node/elements/HTMLModElement.d.ts +5 -0
- package/dist/types/node/elements/HTMLModElement.d.ts.map +1 -0
- package/dist/types/node/elements/HTMLObjectElement.d.ts +5 -0
- package/dist/types/node/elements/HTMLObjectElement.d.ts.map +1 -0
- package/dist/types/node/elements/HTMLOptGroupElement.d.ts +5 -0
- package/dist/types/node/elements/HTMLOptGroupElement.d.ts.map +1 -0
- package/dist/types/node/elements/HTMLOptionElement.d.ts +5 -0
- package/dist/types/node/elements/HTMLOptionElement.d.ts.map +1 -0
- package/dist/types/node/elements/HTMLOutputElement.d.ts +5 -0
- package/dist/types/node/elements/HTMLOutputElement.d.ts.map +1 -0
- package/dist/types/node/elements/HTMLParamElement.d.ts +5 -0
- package/dist/types/node/elements/HTMLParamElement.d.ts.map +1 -0
- package/dist/types/node/elements/HTMLPictureElement.d.ts +5 -0
- package/dist/types/node/elements/HTMLPictureElement.d.ts.map +1 -0
- package/dist/types/node/elements/HTMLPreElement.d.ts +5 -0
- package/dist/types/node/elements/HTMLPreElement.d.ts.map +1 -0
- package/dist/types/node/elements/HTMLProgressElement.d.ts +5 -0
- package/dist/types/node/elements/HTMLProgressElement.d.ts.map +1 -0
- package/dist/types/node/elements/HTMLQuoteElement.d.ts +5 -0
- package/dist/types/node/elements/HTMLQuoteElement.d.ts.map +1 -0
- package/dist/types/node/elements/HTMLSelectElement.d.ts +5 -0
- package/dist/types/node/elements/HTMLSelectElement.d.ts.map +1 -0
- package/dist/types/node/elements/HTMLSlotElement.d.ts +5 -0
- package/dist/types/node/elements/HTMLSlotElement.d.ts.map +1 -0
- package/dist/types/node/elements/HTMLSourceElement.d.ts +5 -0
- package/dist/types/node/elements/HTMLSourceElement.d.ts.map +1 -0
- package/dist/types/node/elements/HTMLTableElement.d.ts +3 -4
- package/dist/types/node/elements/HTMLTableElement.d.ts.map +1 -1
- package/dist/types/node/elements/HTMLTbodyElement.d.ts +2 -3
- package/dist/types/node/elements/HTMLTbodyElement.d.ts.map +1 -1
- package/dist/types/node/elements/HTMLTemplateElement.d.ts +0 -1
- package/dist/types/node/elements/HTMLTemplateElement.d.ts.map +1 -1
- package/dist/types/node/elements/HTMLTextAreaElement.d.ts +5 -0
- package/dist/types/node/elements/HTMLTextAreaElement.d.ts.map +1 -0
- package/dist/types/node/elements/HTMLTfootElement.d.ts +2 -3
- package/dist/types/node/elements/HTMLTfootElement.d.ts.map +1 -1
- package/dist/types/node/elements/HTMLTheadElement.d.ts +2 -3
- package/dist/types/node/elements/HTMLTheadElement.d.ts.map +1 -1
- package/dist/types/node/elements/HTMLTimeElement.d.ts +5 -0
- package/dist/types/node/elements/HTMLTimeElement.d.ts.map +1 -0
- package/dist/types/node/elements/HTMLTrElement.d.ts +2 -3
- package/dist/types/node/elements/HTMLTrElement.d.ts.map +1 -1
- package/dist/types/node/elements/HTMLTrackElement.d.ts +5 -0
- package/dist/types/node/elements/HTMLTrackElement.d.ts.map +1 -0
- package/dist/types/node/elements/HTMLVideoElement.d.ts +8 -0
- package/dist/types/node/elements/HTMLVideoElement.d.ts.map +1 -0
- package/dist/types/node/elements/index.d.ts +106 -52
- package/dist/types/node/elements/index.d.ts.map +1 -1
- package/dist/types/node/index.d.ts +4 -7
- package/dist/types/node/index.d.ts.map +1 -1
- package/dist/types/utils/CSSSelector.d.ts +0 -1
- package/dist/types/utils/CSSSelector.d.ts.map +1 -1
- package/dist/types/window/CustomElementRegistryImp.d.ts +18 -0
- package/dist/types/window/CustomElementRegistryImp.d.ts.map +1 -0
- package/dist/types/window/Window.d.ts +0 -619
- package/dist/types/window/Window.d.ts.map +1 -1
- package/dist/types/window/WindowBase.d.ts +261 -284
- package/dist/types/window/WindowBase.d.ts.map +1 -1
- package/dist/types/window/index.d.ts +0 -1
- package/dist/types/window/index.d.ts.map +1 -1
- package/dist/umd-bundle/dooboostore-dom-parser.umd.js +3765 -3558
- package/dist/umd-bundle/dooboostore-dom-parser.umd.js.map +4 -4
- package/package.json +1 -1
- package/src/DomParser.ts +458 -429
- package/src/factory/ElementFactory.ts +79 -53
- package/src/index.ts +11 -10
- package/src/node/CharacterData.ts +0 -2
- package/src/node/ChildNode.ts +42 -42
- package/src/node/ChildNodeBase.ts +60 -39
- package/src/node/Comment.ts +60 -60
- package/src/node/Document.ts +129 -882
- package/src/node/DocumentBase.ts +371 -462
- package/src/node/DocumentFragment.ts +38 -44
- package/src/node/DocumentFragmentBase.ts +4 -9
- package/src/node/Node.ts +231 -224
- package/src/node/NodeBase.ts +469 -443
- package/src/node/NodeFilter.ts +50 -0
- package/src/node/NodeIterator.ts +117 -172
- package/src/node/ParentNode.ts +93 -93
- package/src/node/ParentNodeBase.ts +7 -10
- package/src/node/ShadowRootBase.ts +87 -0
- package/src/node/Text.ts +30 -30
- package/src/node/TextBase.ts +92 -94
- package/src/node/TreeWalker.ts +280 -0
- package/src/node/collection/{HTMLCollection.ts → HTMLCollectionImp.ts} +3 -2
- package/src/node/collection/HTMLCollectionOfImp.ts +12 -0
- package/src/node/collection/NodeList.ts +1 -1
- package/src/node/collection/{NodeListOf.ts → NodeListOfImp.ts} +3 -3
- package/src/node/collection/StylePropertyMapImpl.ts +60 -0
- package/src/node/collection/index.ts +3 -3
- package/src/node/elements/Element.ts +212 -771
- package/src/node/elements/ElementBase.ts +840 -1195
- package/src/node/elements/HTMLAreaElement.ts +0 -1
- package/src/node/elements/HTMLAudioElement.ts +10 -0
- package/src/node/elements/HTMLButtonElement.ts +63 -63
- package/src/node/elements/HTMLDListElement.ts +2 -0
- package/src/node/elements/HTMLDataElement.ts +6 -0
- package/src/node/elements/HTMLDataListElement.ts +2 -0
- package/src/node/elements/HTMLDetailsElement.ts +2 -0
- package/src/node/elements/HTMLDialogElement.ts +2 -0
- package/src/node/elements/HTMLElement.ts +2 -102
- package/src/node/elements/HTMLElementBase.ts +453 -156
- package/src/node/elements/HTMLEmbedElement.ts +0 -1
- package/src/node/elements/HTMLFieldSetElement.ts +2 -0
- package/src/node/elements/HTMLHRElement.ts +2 -0
- package/src/node/elements/HTMLIFrameElement.ts +2 -0
- package/src/node/elements/HTMLLabelElement.ts +2 -0
- package/src/node/elements/HTMLLegendElement.ts +2 -0
- package/src/node/elements/HTMLMapElement.ts +2 -0
- package/src/node/elements/HTMLMeterElement.ts +2 -0
- package/src/node/elements/HTMLModElement.ts +2 -0
- package/src/node/elements/HTMLObjectElement.ts +2 -0
- package/src/node/elements/HTMLOptGroupElement.ts +2 -0
- package/src/node/elements/HTMLOptionElement.ts +2 -0
- package/src/node/elements/HTMLOutputElement.ts +2 -0
- package/src/node/elements/HTMLParamElement.ts +2 -0
- package/src/node/elements/HTMLPictureElement.ts +2 -0
- package/src/node/elements/HTMLPreElement.ts +2 -0
- package/src/node/elements/HTMLProgressElement.ts +2 -0
- package/src/node/elements/HTMLQuoteElement.ts +2 -0
- package/src/node/elements/HTMLSelectElement.ts +2 -0
- package/src/node/elements/HTMLSlotElement.ts +2 -0
- package/src/node/elements/HTMLSourceElement.ts +2 -0
- package/src/node/elements/HTMLTableElement.ts +3 -7
- package/src/node/elements/HTMLTbodyElement.ts +2 -3
- package/src/node/elements/HTMLTdElement.ts +1 -1
- package/src/node/elements/HTMLTemplateElement.ts +3 -6
- package/src/node/elements/HTMLTextAreaElement.ts +2 -0
- package/src/node/elements/HTMLTfootElement.ts +2 -3
- package/src/node/elements/HTMLTheadElement.ts +2 -3
- package/src/node/elements/HTMLTimeElement.ts +2 -0
- package/src/node/elements/HTMLTrElement.ts +3 -4
- package/src/node/elements/HTMLTrackElement.ts +2 -0
- package/src/node/elements/HTMLVideoElement.ts +10 -0
- package/src/node/elements/index.ts +226 -149
- package/src/node/index.ts +8 -8
- package/src/utils/CSSSelector.ts +0 -1
- package/src/window/CustomElementRegistryImp.ts +120 -0
- package/src/window/Window.ts +716 -715
- package/src/window/WindowBase.ts +842 -998
- package/src/window/index.ts +0 -1
- package/tsconfig.json +1 -0
- package/dist/cjs/node/collection/HTMLCollection.js.map +0 -7
- package/dist/cjs/node/collection/HTMLCollectionOf.js.map +0 -7
- package/dist/cjs/node/collection/NodeListOf.js.map +0 -7
- package/dist/esm/node/collection/HTMLCollection.js.map +0 -7
- package/dist/esm/node/collection/HTMLCollectionOf.js +0 -17
- package/dist/esm/node/collection/HTMLCollectionOf.js.map +0 -7
- package/dist/esm/node/collection/NodeListOf.js.map +0 -7
- package/dist/types/node/collection/HTMLCollection.d.ts.map +0 -1
- package/dist/types/node/collection/HTMLCollectionOf.d.ts +0 -14
- package/dist/types/node/collection/HTMLCollectionOf.d.ts.map +0 -1
- package/dist/types/node/collection/NodeListOf.d.ts.map +0 -1
- package/src/node/collection/HTMLCollectionOf.ts +0 -26
package/src/DomParser.ts
CHANGED
|
@@ -2,490 +2,519 @@ import { DocumentBase } from './node/DocumentBase';
|
|
|
2
2
|
import { TextBase } from './node/TextBase';
|
|
3
3
|
import { Comment } from './node/Comment';
|
|
4
4
|
import { WindowBase } from './window/WindowBase';
|
|
5
|
+
import { ElementBase } from './node/elements/ElementBase';
|
|
6
|
+
import { ElementFactory } from './factory/ElementFactory';
|
|
7
|
+
|
|
8
|
+
// Inject dependencies into ElementBase to break circular references
|
|
9
|
+
// without using 'require' or 'global' injection magic.
|
|
10
|
+
ElementBase.dependencies = {
|
|
11
|
+
ElementFactory,
|
|
12
|
+
TextBase,
|
|
13
|
+
Comment
|
|
14
|
+
};
|
|
5
15
|
|
|
6
16
|
export interface DomParserOptions {
|
|
7
|
-
|
|
17
|
+
href?: string;
|
|
8
18
|
}
|
|
9
19
|
|
|
10
20
|
export class DomParser {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
constructor(html: string, option?: DomParserOptions) {
|
|
15
|
-
// Create a new document instance
|
|
16
|
-
const document = new DocumentBase();
|
|
17
|
-
|
|
18
|
-
// Create WindowBase instance with the document
|
|
19
|
-
const windowBase = new WindowBase(document, option?.href);
|
|
20
|
-
|
|
21
|
-
this._window = windowBase as unknown as Window;
|
|
22
|
-
this._document = document as any;
|
|
23
|
-
|
|
24
|
-
// Parse the provided HTML string
|
|
25
|
-
this.parseHTML(html);
|
|
26
|
-
|
|
27
|
-
// Set up document references after parsing
|
|
28
|
-
this.setupDocumentReferences();
|
|
29
|
-
|
|
30
|
-
// Simulate document loading process
|
|
31
|
-
if (document && (document as any).simulateLoading) {
|
|
32
|
-
(document as any).simulateLoading();
|
|
33
|
-
}
|
|
34
|
-
}
|
|
21
|
+
private _window: Window | null;
|
|
22
|
+
private _document: Document | null;
|
|
35
23
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
}
|
|
24
|
+
constructor(html: string, option?: DomParserOptions) {
|
|
25
|
+
// Create WindowBase instance with the document
|
|
26
|
+
const windowBase = new WindowBase({ initialUrl: option?.href });
|
|
27
|
+
this._window = windowBase as unknown as Window;
|
|
28
|
+
this._document = windowBase.document as any;
|
|
39
29
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
}
|
|
43
|
-
/**
|
|
44
|
-
* Load new HTML content and replace the current document
|
|
45
|
-
*/
|
|
46
|
-
loadHTML(html: string): void {
|
|
47
|
-
// Clear current document content
|
|
48
|
-
this.clearDocument();
|
|
49
|
-
|
|
50
|
-
// Parse new HTML
|
|
51
|
-
this.parseHTML(html);
|
|
52
|
-
|
|
53
|
-
// Set up document references after parsing
|
|
54
|
-
this.setupDocumentReferences();
|
|
55
|
-
}
|
|
30
|
+
// Parse the provided HTML string
|
|
31
|
+
this.parseHTML(html);
|
|
56
32
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
if (this.document.body) {
|
|
66
|
-
while (this.document.body.firstChild) {
|
|
67
|
-
this.document.body.removeChild(this.document.body.firstChild);
|
|
68
|
-
}
|
|
69
|
-
}
|
|
33
|
+
// Set up document references after parsing
|
|
34
|
+
this.setupDocumentReferences();
|
|
35
|
+
|
|
36
|
+
// Simulate document loading process
|
|
37
|
+
if (this._document && (this._document as any).simulateLoading) {
|
|
38
|
+
(this._document as any).simulateLoading();
|
|
70
39
|
}
|
|
40
|
+
}
|
|
71
41
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
42
|
+
get window(): Window {
|
|
43
|
+
if (!this._window) {
|
|
44
|
+
throw new Error('DomParser has been destroyed');
|
|
45
|
+
}
|
|
46
|
+
return this._window;
|
|
47
|
+
}
|
|
77
48
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
49
|
+
get document(): Document {
|
|
50
|
+
if (!this._document) {
|
|
51
|
+
throw new Error('DomParser has been destroyed');
|
|
52
|
+
}
|
|
53
|
+
return this._document;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Destroy the DomParser instance and free memory
|
|
58
|
+
*/
|
|
59
|
+
destroy(): void {
|
|
60
|
+
if (this._window) {
|
|
61
|
+
this._window.close();
|
|
62
|
+
this._window = null;
|
|
81
63
|
}
|
|
82
64
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
html = html.replace(/<!DOCTYPE[^>]*>/i, '').trim();
|
|
65
|
+
this._document = null;
|
|
66
|
+
}
|
|
86
67
|
|
|
87
|
-
|
|
68
|
+
/**
|
|
69
|
+
* Load new HTML content and replace the current document
|
|
70
|
+
*/
|
|
71
|
+
loadHTML(html: string): void {
|
|
72
|
+
if (!this._document) {
|
|
73
|
+
throw new Error('DomParser has been destroyed');
|
|
74
|
+
}
|
|
88
75
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
html = html.replace(templateRegex, (match, attributes, content) => {
|
|
92
|
-
const element = this.document.createElement('template');
|
|
76
|
+
// Clear current document content
|
|
77
|
+
this.clearDocument();
|
|
93
78
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
this.parseAttributes(attributes, element);
|
|
97
|
-
}
|
|
79
|
+
// Parse new HTML
|
|
80
|
+
this.parseHTML(html);
|
|
98
81
|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
this.parseHTMLString(content.trim(), element.content);
|
|
103
|
-
}
|
|
82
|
+
// Set up document references after parsing
|
|
83
|
+
this.setupDocumentReferences();
|
|
84
|
+
}
|
|
104
85
|
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
});
|
|
86
|
+
private clearDocument(): void {
|
|
87
|
+
if (!this._document) return;
|
|
108
88
|
|
|
109
|
-
|
|
110
|
-
|
|
89
|
+
// Clear document body and head content while preserving structure
|
|
90
|
+
if (this._document.head) {
|
|
91
|
+
while (this._document.head.firstChild) {
|
|
92
|
+
this._document.head.removeChild(this._document.head.firstChild);
|
|
93
|
+
}
|
|
111
94
|
}
|
|
112
95
|
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
if (tagStart === -1) {
|
|
121
|
-
// No more tags, add remaining text if any
|
|
122
|
-
const remainingText = html.substring(position).trim();
|
|
123
|
-
if (remainingText) {
|
|
124
|
-
const textNode = new TextBase(remainingText, this.document);
|
|
125
|
-
parent.appendChild(textNode);
|
|
126
|
-
}
|
|
127
|
-
break;
|
|
128
|
-
}
|
|
96
|
+
if (this._document.body) {
|
|
97
|
+
while (this._document.body.firstChild) {
|
|
98
|
+
this._document.body.removeChild(this._document.body.firstChild);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
129
102
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
const textNode = new TextBase(textContent, this.document);
|
|
135
|
-
parent.appendChild(textNode);
|
|
136
|
-
}
|
|
137
|
-
}
|
|
103
|
+
parseHTML(html: string): void {
|
|
104
|
+
if (!this._document) {
|
|
105
|
+
throw new Error('DomParser has been destroyed');
|
|
106
|
+
}
|
|
138
107
|
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
} else {
|
|
149
|
-
// Malformed comment, treat as text
|
|
150
|
-
const textNode = new TextBase(html.substring(tagStart, tagStart + 4), this.document);
|
|
151
|
-
parent.appendChild(textNode);
|
|
152
|
-
position = tagStart + 4;
|
|
153
|
-
continue;
|
|
154
|
-
}
|
|
155
|
-
}
|
|
108
|
+
// Ensure basic HTML structure if input is empty or lacks it
|
|
109
|
+
if (!html.trim()) {
|
|
110
|
+
html = '<html><head></head><body></body></html>';
|
|
111
|
+
} else if (!/<html/i.test(html)) {
|
|
112
|
+
// If it's just a fragment, we still need html/head/body for a full document
|
|
113
|
+
// but only if it's not explicitly intended to be a fragment?
|
|
114
|
+
// Actually, standard DOMParser.parseFromString always creates them.
|
|
115
|
+
html = `<html><head></head><body>${html}</body></html>`;
|
|
116
|
+
}
|
|
156
117
|
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
118
|
+
// Basic HTML parsing - this is a simplified version
|
|
119
|
+
this.parseHTMLString(html, this.document);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
private parseHTMLString(html: string, parent: any): void {
|
|
123
|
+
// Remove DOCTYPE if present
|
|
124
|
+
html = html.replace(/<!DOCTYPE[^>]*>/i, '').trim();
|
|
125
|
+
|
|
126
|
+
if (!html) return;
|
|
127
|
+
|
|
128
|
+
// Handle template tags specially
|
|
129
|
+
const templateRegex = /<template([^>]*)>(.*?)<\/template>/gs;
|
|
130
|
+
html = html.replace(templateRegex, (match, attributes, content) => {
|
|
131
|
+
const element = this.document.createElement('template');
|
|
132
|
+
|
|
133
|
+
// Parse attributes
|
|
134
|
+
if (attributes.trim()) {
|
|
135
|
+
this.parseAttributes(attributes, element);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// Parse content directly into the template's content fragment
|
|
139
|
+
if (content.trim()) {
|
|
140
|
+
// Use internal method to avoid appendChild side effects
|
|
141
|
+
this.parseHTMLString(content.trim(), element.content);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
parent.appendChild(element);
|
|
145
|
+
return ''; // Remove from HTML string
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
// Improved HTML parsing with proper nesting support
|
|
149
|
+
this.parseHTMLRecursive(html, parent);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
private parseHTMLRecursive(html: string, parent: any): void {
|
|
153
|
+
let position = 0;
|
|
154
|
+
|
|
155
|
+
while (position < html.length) {
|
|
156
|
+
// Find next tag or comment
|
|
157
|
+
const tagStart = html.indexOf('<', position);
|
|
158
|
+
|
|
159
|
+
if (tagStart === -1) {
|
|
160
|
+
// No more tags, add remaining text if any
|
|
161
|
+
const remainingText = html.substring(position).trim();
|
|
162
|
+
if (remainingText) {
|
|
163
|
+
const textNode = new TextBase(remainingText, this.document);
|
|
164
|
+
parent.appendChild(textNode);
|
|
165
|
+
}
|
|
166
|
+
break;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// Add text before tag if any
|
|
170
|
+
if (tagStart > position) {
|
|
171
|
+
const textContent = html.substring(position, tagStart).trim();
|
|
172
|
+
if (textContent) {
|
|
173
|
+
const textNode = new TextBase(textContent, this.document);
|
|
174
|
+
parent.appendChild(textNode);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// Check if this is a comment
|
|
179
|
+
if (html.substring(tagStart, tagStart + 4) === '<!--') {
|
|
180
|
+
const commentEnd = html.indexOf('-->', tagStart + 4);
|
|
181
|
+
if (commentEnd !== -1) {
|
|
182
|
+
const commentContent = html.substring(tagStart + 4, commentEnd);
|
|
183
|
+
const commentNode = new Comment(commentContent, this.document);
|
|
184
|
+
parent.appendChild(commentNode);
|
|
185
|
+
position = commentEnd + 3;
|
|
186
|
+
continue;
|
|
187
|
+
} else {
|
|
188
|
+
// Malformed comment, treat as text
|
|
189
|
+
const textNode = new TextBase(html.substring(tagStart, tagStart + 4), this.document);
|
|
190
|
+
parent.appendChild(textNode);
|
|
191
|
+
position = tagStart + 4;
|
|
192
|
+
continue;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
// Find tag end
|
|
197
|
+
const tagEnd = html.indexOf('>', tagStart);
|
|
198
|
+
if (tagEnd === -1) break;
|
|
199
|
+
|
|
200
|
+
const tagContent = html.substring(tagStart + 1, tagEnd);
|
|
201
|
+
|
|
202
|
+
// Check if it's a closing tag
|
|
203
|
+
if (tagContent.startsWith('/')) {
|
|
204
|
+
// This is a closing tag, we should return to parent
|
|
205
|
+
position = tagEnd + 1;
|
|
206
|
+
break;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
// Check if it's a self-closing tag
|
|
210
|
+
const isSelfClosing = tagContent.endsWith('/') || this.isSelfClosingTag(tagContent.split(/\s+/)[0]);
|
|
211
|
+
|
|
212
|
+
// Parse tag name and attributes
|
|
213
|
+
const spaceIndex = tagContent.indexOf(' ');
|
|
214
|
+
const tagName = spaceIndex === -1 ? tagContent.replace('/', '') : tagContent.substring(0, spaceIndex);
|
|
215
|
+
let attributes = spaceIndex === -1 ? '' : tagContent.substring(spaceIndex + 1);
|
|
216
|
+
|
|
217
|
+
// Only remove trailing slash for self-closing tags (not from attribute values)
|
|
218
|
+
if (attributes.endsWith('/')) {
|
|
219
|
+
attributes = attributes.slice(0, -1).trim();
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
// Create element
|
|
223
|
+
const element = this.document.createElement(tagName.toLowerCase());
|
|
224
|
+
|
|
225
|
+
// Parse attributes
|
|
226
|
+
if (attributes.trim()) {
|
|
227
|
+
this.parseAttributes(attributes, element);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
parent.appendChild(element);
|
|
231
|
+
|
|
232
|
+
if (isSelfClosing) {
|
|
233
|
+
position = tagEnd + 1;
|
|
234
|
+
} else {
|
|
235
|
+
// Find matching closing tag and parse content
|
|
236
|
+
const closingTag = `</${tagName}>`;
|
|
237
|
+
const closingTagIndex = this.findMatchingClosingTag(html, tagEnd + 1, tagName);
|
|
238
|
+
|
|
239
|
+
if (closingTagIndex !== -1) {
|
|
240
|
+
const innerContent = html.substring(tagEnd + 1, closingTagIndex);
|
|
241
|
+
if (innerContent.trim()) {
|
|
242
|
+
this.parseHTMLRecursive(innerContent, element);
|
|
243
|
+
}
|
|
244
|
+
position = closingTagIndex + closingTag.length;
|
|
245
|
+
} else {
|
|
246
|
+
// No matching closing tag found, treat as self-closing
|
|
247
|
+
position = tagEnd + 1;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
}
|
|
160
252
|
|
|
161
|
-
|
|
253
|
+
private findMatchingClosingTag(html: string, startPos: number, tagName: string): number {
|
|
254
|
+
const openTag = `<${tagName}`;
|
|
255
|
+
const closeTag = `</${tagName}>`;
|
|
256
|
+
let depth = 1;
|
|
257
|
+
let pos = startPos;
|
|
162
258
|
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
position = tagEnd + 1;
|
|
167
|
-
break;
|
|
168
|
-
}
|
|
259
|
+
while (pos < html.length && depth > 0) {
|
|
260
|
+
const nextOpen = html.indexOf(openTag, pos);
|
|
261
|
+
const nextClose = html.indexOf(closeTag, pos);
|
|
169
262
|
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
263
|
+
if (nextClose === -1) {
|
|
264
|
+
// No more closing tags
|
|
265
|
+
return -1;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
if (nextOpen !== -1 && nextOpen < nextClose) {
|
|
269
|
+
// Found another opening tag before the closing tag
|
|
270
|
+
depth++;
|
|
271
|
+
pos = nextOpen + openTag.length;
|
|
272
|
+
} else {
|
|
273
|
+
// Found a closing tag
|
|
274
|
+
depth--;
|
|
275
|
+
if (depth === 0) {
|
|
276
|
+
return nextClose;
|
|
277
|
+
}
|
|
278
|
+
pos = nextClose + closeTag.length;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
182
281
|
|
|
282
|
+
return -1;
|
|
283
|
+
}
|
|
183
284
|
|
|
285
|
+
private parseAttributes(attributeString: string, element: any): void {
|
|
286
|
+
// Improved attribute parsing that handles complex JavaScript expressions
|
|
287
|
+
let position = 0;
|
|
288
|
+
const length = attributeString.length;
|
|
184
289
|
|
|
185
|
-
|
|
186
|
-
|
|
290
|
+
while (position < length) {
|
|
291
|
+
// Skip whitespace
|
|
292
|
+
while (position < length && /\s/.test(attributeString[position])) {
|
|
293
|
+
position++;
|
|
294
|
+
}
|
|
187
295
|
|
|
296
|
+
if (position >= length) break;
|
|
188
297
|
|
|
298
|
+
// Find attribute name
|
|
299
|
+
const nameStart = position;
|
|
300
|
+
while (position < length && /[\w:-]/.test(attributeString[position])) {
|
|
301
|
+
position++;
|
|
302
|
+
}
|
|
189
303
|
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
304
|
+
if (position === nameStart) {
|
|
305
|
+
// Invalid character, skip it
|
|
306
|
+
position++;
|
|
307
|
+
continue;
|
|
308
|
+
}
|
|
194
309
|
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
if (isSelfClosing) {
|
|
198
|
-
position = tagEnd + 1;
|
|
199
|
-
} else {
|
|
200
|
-
// Find matching closing tag and parse content
|
|
201
|
-
const closingTag = `</${tagName}>`;
|
|
202
|
-
const closingTagIndex = this.findMatchingClosingTag(html, tagEnd + 1, tagName);
|
|
203
|
-
|
|
204
|
-
if (closingTagIndex !== -1) {
|
|
205
|
-
const innerContent = html.substring(tagEnd + 1, closingTagIndex);
|
|
206
|
-
if (innerContent.trim()) {
|
|
207
|
-
this.parseHTMLRecursive(innerContent, element);
|
|
208
|
-
}
|
|
209
|
-
position = closingTagIndex + closingTag.length;
|
|
210
|
-
} else {
|
|
211
|
-
// No matching closing tag found, treat as self-closing
|
|
212
|
-
position = tagEnd + 1;
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
}
|
|
310
|
+
const name = attributeString.substring(nameStart, position);
|
|
217
311
|
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
let pos = startPos;
|
|
312
|
+
// Skip whitespace
|
|
313
|
+
while (position < length && /\s/.test(attributeString[position])) {
|
|
314
|
+
position++;
|
|
315
|
+
}
|
|
223
316
|
|
|
224
|
-
|
|
225
|
-
const nextOpen = html.indexOf(openTag, pos);
|
|
226
|
-
const nextClose = html.indexOf(closeTag, pos);
|
|
317
|
+
let value = '';
|
|
227
318
|
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
}
|
|
319
|
+
// Check if there's an equals sign
|
|
320
|
+
if (position < length && attributeString[position] === '=') {
|
|
321
|
+
position++; // Skip '='
|
|
232
322
|
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
pos = nextOpen + openTag.length;
|
|
237
|
-
} else {
|
|
238
|
-
// Found a closing tag
|
|
239
|
-
depth--;
|
|
240
|
-
if (depth === 0) {
|
|
241
|
-
return nextClose;
|
|
242
|
-
}
|
|
243
|
-
pos = nextClose + closeTag.length;
|
|
244
|
-
}
|
|
323
|
+
// Skip whitespace
|
|
324
|
+
while (position < length && /\s/.test(attributeString[position])) {
|
|
325
|
+
position++;
|
|
245
326
|
}
|
|
246
327
|
|
|
247
|
-
|
|
248
|
-
|
|
328
|
+
if (position < length) {
|
|
329
|
+
const quote = attributeString[position];
|
|
249
330
|
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
331
|
+
if (quote === '"' || quote === "'") {
|
|
332
|
+
// Quoted value - find matching closing quote
|
|
333
|
+
position++; // Skip opening quote
|
|
334
|
+
const valueStart = position;
|
|
254
335
|
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
while (position < length && /\s/.test(attributeString[position])) {
|
|
258
|
-
position++;
|
|
336
|
+
while (position < length && attributeString[position] !== quote) {
|
|
337
|
+
position++;
|
|
259
338
|
}
|
|
260
339
|
|
|
261
|
-
|
|
340
|
+
value = attributeString.substring(valueStart, position);
|
|
262
341
|
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
while (position < length && /[\w:-]/.test(attributeString[position])) {
|
|
266
|
-
position++;
|
|
342
|
+
if (position < length && attributeString[position] === quote) {
|
|
343
|
+
position++; // Skip closing quote
|
|
267
344
|
}
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
const name = attributeString.substring(nameStart, position);
|
|
276
|
-
|
|
277
|
-
// Skip whitespace
|
|
278
|
-
while (position < length && /\s/.test(attributeString[position])) {
|
|
279
|
-
position++;
|
|
345
|
+
} else {
|
|
346
|
+
// Unquoted value - read until whitespace or end
|
|
347
|
+
const valueStart = position;
|
|
348
|
+
while (position < length && !/\s/.test(attributeString[position])) {
|
|
349
|
+
position++;
|
|
280
350
|
}
|
|
351
|
+
value = attributeString.substring(valueStart, position);
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
}
|
|
281
355
|
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
// Check if there's an equals sign
|
|
285
|
-
if (position < length && attributeString[position] === '=') {
|
|
286
|
-
position++; // Skip '='
|
|
287
|
-
|
|
288
|
-
// Skip whitespace
|
|
289
|
-
while (position < length && /\s/.test(attributeString[position])) {
|
|
290
|
-
position++;
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
if (position < length) {
|
|
294
|
-
const quote = attributeString[position];
|
|
295
|
-
|
|
296
|
-
if (quote === '"' || quote === "'") {
|
|
297
|
-
// Quoted value - find matching closing quote
|
|
298
|
-
position++; // Skip opening quote
|
|
299
|
-
const valueStart = position;
|
|
300
|
-
|
|
301
|
-
while (position < length && attributeString[position] !== quote) {
|
|
302
|
-
position++;
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
value = attributeString.substring(valueStart, position);
|
|
306
|
-
|
|
307
|
-
if (position < length && attributeString[position] === quote) {
|
|
308
|
-
position++; // Skip closing quote
|
|
309
|
-
}
|
|
310
|
-
} else {
|
|
311
|
-
// Unquoted value - read until whitespace or end
|
|
312
|
-
const valueStart = position;
|
|
313
|
-
while (position < length && !/\s/.test(attributeString[position])) {
|
|
314
|
-
position++;
|
|
315
|
-
}
|
|
316
|
-
value = attributeString.substring(valueStart, position);
|
|
317
|
-
}
|
|
318
|
-
}
|
|
319
|
-
}
|
|
356
|
+
// Decode HTML entities in attribute values
|
|
357
|
+
value = this.decodeHTMLEntities(value);
|
|
320
358
|
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
359
|
+
element.setAttribute(name, value);
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
/**
|
|
364
|
+
* Decode HTML entities in a string
|
|
365
|
+
*/
|
|
366
|
+
private decodeHTMLEntities(str: string): string {
|
|
367
|
+
const entityMap: { [key: string]: string } = {
|
|
368
|
+
'&': '&',
|
|
369
|
+
'<': '<',
|
|
370
|
+
'>': '>',
|
|
371
|
+
'"': '"',
|
|
372
|
+
''': "'",
|
|
373
|
+
'"': '"',
|
|
374
|
+
''': "'",
|
|
375
|
+
'©': '©',
|
|
376
|
+
'®': '®',
|
|
377
|
+
'™': '™',
|
|
378
|
+
' ': ' ',
|
|
379
|
+
'…': '…',
|
|
380
|
+
'—': '—',
|
|
381
|
+
'–': '–',
|
|
382
|
+
'‘': '\u2018',
|
|
383
|
+
'’': '\u2019',
|
|
384
|
+
'“': '"',
|
|
385
|
+
'”': '"'
|
|
386
|
+
};
|
|
387
|
+
|
|
388
|
+
return str.replace(/&[a-zA-Z0-9#]+;/g, entity => {
|
|
389
|
+
// Handle named entities
|
|
390
|
+
if (entityMap[entity]) {
|
|
391
|
+
return entityMap[entity];
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
// Handle numeric entities like ' "
|
|
395
|
+
if (entity.startsWith('&#') && entity.endsWith(';')) {
|
|
396
|
+
const numStr = entity.slice(2, -1);
|
|
397
|
+
const num = parseInt(numStr, 10);
|
|
398
|
+
if (!isNaN(num)) {
|
|
399
|
+
return String.fromCharCode(num);
|
|
325
400
|
}
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
// Handle hex entities like '
|
|
404
|
+
if (entity.startsWith('&#x') && entity.endsWith(';')) {
|
|
405
|
+
const hexStr = entity.slice(3, -1);
|
|
406
|
+
const num = parseInt(hexStr, 16);
|
|
407
|
+
if (!isNaN(num)) {
|
|
408
|
+
return String.fromCharCode(num);
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
// Return original if not recognized
|
|
413
|
+
return entity;
|
|
414
|
+
});
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
private isSelfClosingTag(tagName: string): boolean {
|
|
418
|
+
const selfClosingTags = ['area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input', 'link', 'meta', 'param', 'source', 'track', 'wbr'];
|
|
419
|
+
return selfClosingTags.includes(tagName.toLowerCase());
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
/**
|
|
423
|
+
* Set up document references after HTML parsing
|
|
424
|
+
*/
|
|
425
|
+
private setupDocumentReferences(): void {
|
|
426
|
+
// Find HTML, HEAD, and BODY elements
|
|
427
|
+
const allHtmlElements = this.document.querySelectorAll('html');
|
|
428
|
+
const allHeadElements = this.document.querySelectorAll('head');
|
|
429
|
+
const allBodyElements = this.document.querySelectorAll('body');
|
|
430
|
+
|
|
431
|
+
// Choose the HTML element with content, then attributes, then first one
|
|
432
|
+
let htmlElement = null;
|
|
433
|
+
// First priority: HTML with attributes (lang, data-theme 등)
|
|
434
|
+
for (let i = 0; i < allHtmlElements.length; i++) {
|
|
435
|
+
const html = allHtmlElements[i];
|
|
436
|
+
if (html.attributes.length > 0) {
|
|
437
|
+
htmlElement = html;
|
|
438
|
+
break;
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
// Second priority: HTML with child nodes (content)
|
|
442
|
+
if (!htmlElement) {
|
|
443
|
+
for (let i = 0; i < allHtmlElements.length; i++) {
|
|
444
|
+
const html = allHtmlElements[i];
|
|
445
|
+
if (html.childNodes.length > 0) {
|
|
446
|
+
htmlElement = html;
|
|
447
|
+
break;
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
// Last resort: first HTML
|
|
452
|
+
if (!htmlElement && allHtmlElements.length > 0) {
|
|
453
|
+
htmlElement = allHtmlElements[0];
|
|
326
454
|
}
|
|
327
455
|
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
};
|
|
352
|
-
|
|
353
|
-
return str.replace(/&[a-zA-Z0-9#]+;/g, (entity) => {
|
|
354
|
-
// Handle named entities
|
|
355
|
-
if (entityMap[entity]) {
|
|
356
|
-
return entityMap[entity];
|
|
357
|
-
}
|
|
358
|
-
|
|
359
|
-
// Handle numeric entities like ' "
|
|
360
|
-
if (entity.startsWith('&#') && entity.endsWith(';')) {
|
|
361
|
-
const numStr = entity.slice(2, -1);
|
|
362
|
-
const num = parseInt(numStr, 10);
|
|
363
|
-
if (!isNaN(num)) {
|
|
364
|
-
return String.fromCharCode(num);
|
|
365
|
-
}
|
|
366
|
-
}
|
|
367
|
-
|
|
368
|
-
// Handle hex entities like '
|
|
369
|
-
if (entity.startsWith('&#x') && entity.endsWith(';')) {
|
|
370
|
-
const hexStr = entity.slice(3, -1);
|
|
371
|
-
const num = parseInt(hexStr, 16);
|
|
372
|
-
if (!isNaN(num)) {
|
|
373
|
-
return String.fromCharCode(num);
|
|
374
|
-
}
|
|
375
|
-
}
|
|
376
|
-
|
|
377
|
-
// Return original if not recognized
|
|
378
|
-
return entity;
|
|
379
|
-
});
|
|
456
|
+
// Choose the HEAD element with content, then attributes, then first one
|
|
457
|
+
let headElement = null;
|
|
458
|
+
// First priority: HEAD with child nodes (content)
|
|
459
|
+
for (let i = 0; i < allHeadElements.length; i++) {
|
|
460
|
+
const head = allHeadElements[i];
|
|
461
|
+
if (head.childNodes.length > 0) {
|
|
462
|
+
headElement = head;
|
|
463
|
+
break;
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
// Second priority: HEAD with attributes
|
|
467
|
+
if (!headElement) {
|
|
468
|
+
for (let i = 0; i < allHeadElements.length; i++) {
|
|
469
|
+
const head = allHeadElements[i];
|
|
470
|
+
if (head.attributes.length > 0) {
|
|
471
|
+
headElement = head;
|
|
472
|
+
break;
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
// Last resort: first HEAD
|
|
477
|
+
if (!headElement && allHeadElements.length > 0) {
|
|
478
|
+
headElement = allHeadElements[0];
|
|
380
479
|
}
|
|
381
480
|
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
481
|
+
// Choose the BODY element with content, then attributes, then first one
|
|
482
|
+
let bodyElement = null;
|
|
483
|
+
|
|
484
|
+
// First priority: BODY with child nodes (content)
|
|
485
|
+
for (let i = 0; i < allBodyElements.length; i++) {
|
|
486
|
+
const body = allBodyElements[i];
|
|
487
|
+
if (body.childNodes.length > 0) {
|
|
488
|
+
bodyElement = body;
|
|
489
|
+
break;
|
|
490
|
+
}
|
|
385
491
|
}
|
|
386
492
|
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
const allBodyElements = this.document.querySelectorAll('body');
|
|
395
|
-
|
|
396
|
-
// Choose the HTML element with content, then attributes, then first one
|
|
397
|
-
let htmlElement = null;
|
|
398
|
-
// First priority: HTML with attributes (lang, data-theme 등)
|
|
399
|
-
for (let i = 0; i < allHtmlElements.length; i++) {
|
|
400
|
-
const html = allHtmlElements[i];
|
|
401
|
-
if (html.attributes.length > 0) {
|
|
402
|
-
htmlElement = html;
|
|
403
|
-
break;
|
|
404
|
-
}
|
|
405
|
-
}
|
|
406
|
-
// Second priority: HTML with child nodes (content)
|
|
407
|
-
if (!htmlElement) {
|
|
408
|
-
for (let i = 0; i < allHtmlElements.length; i++) {
|
|
409
|
-
const html = allHtmlElements[i];
|
|
410
|
-
if (html.childNodes.length > 0) {
|
|
411
|
-
htmlElement = html;
|
|
412
|
-
break;
|
|
413
|
-
}
|
|
414
|
-
}
|
|
415
|
-
}
|
|
416
|
-
// Last resort: first HTML
|
|
417
|
-
if (!htmlElement && allHtmlElements.length > 0) {
|
|
418
|
-
htmlElement = allHtmlElements[0];
|
|
419
|
-
}
|
|
420
|
-
|
|
421
|
-
// Choose the HEAD element with content, then attributes, then first one
|
|
422
|
-
let headElement = null;
|
|
423
|
-
// First priority: HEAD with child nodes (content)
|
|
424
|
-
for (let i = 0; i < allHeadElements.length; i++) {
|
|
425
|
-
const head = allHeadElements[i];
|
|
426
|
-
if (head.childNodes.length > 0) {
|
|
427
|
-
headElement = head;
|
|
428
|
-
break;
|
|
429
|
-
}
|
|
430
|
-
}
|
|
431
|
-
// Second priority: HEAD with attributes
|
|
432
|
-
if (!headElement) {
|
|
433
|
-
for (let i = 0; i < allHeadElements.length; i++) {
|
|
434
|
-
const head = allHeadElements[i];
|
|
435
|
-
if (head.attributes.length > 0) {
|
|
436
|
-
headElement = head;
|
|
437
|
-
break;
|
|
438
|
-
}
|
|
439
|
-
}
|
|
440
|
-
}
|
|
441
|
-
// Last resort: first HEAD
|
|
442
|
-
if (!headElement && allHeadElements.length > 0) {
|
|
443
|
-
headElement = allHeadElements[0];
|
|
444
|
-
}
|
|
445
|
-
|
|
446
|
-
// Choose the BODY element with content, then attributes, then first one
|
|
447
|
-
let bodyElement = null;
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
// First priority: BODY with child nodes (content)
|
|
451
|
-
for (let i = 0; i < allBodyElements.length; i++) {
|
|
452
|
-
const body = allBodyElements[i];
|
|
453
|
-
if (body.childNodes.length > 0) {
|
|
454
|
-
bodyElement = body;
|
|
455
|
-
break;
|
|
456
|
-
}
|
|
457
|
-
}
|
|
458
|
-
|
|
459
|
-
// Second priority: BODY with attributes
|
|
460
|
-
if (!bodyElement) {
|
|
461
|
-
for (let i = 0; i < allBodyElements.length; i++) {
|
|
462
|
-
const body = allBodyElements[i];
|
|
463
|
-
if (body.attributes.length > 0) {
|
|
464
|
-
bodyElement = body;
|
|
465
|
-
break;
|
|
466
|
-
}
|
|
467
|
-
}
|
|
468
|
-
}
|
|
469
|
-
|
|
470
|
-
// Last resort: first BODY
|
|
471
|
-
if (!bodyElement && allBodyElements.length > 0) {
|
|
472
|
-
bodyElement = allBodyElements[0];
|
|
473
|
-
}
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
// For now, just use the elements as they are parsed
|
|
478
|
-
// TODO: Implement proper DOM structure reorganization later
|
|
479
|
-
|
|
480
|
-
// Set document references
|
|
481
|
-
if (htmlElement) {
|
|
482
|
-
(this.document as any).documentElement = htmlElement;
|
|
483
|
-
}
|
|
484
|
-
if (headElement) {
|
|
485
|
-
(this.document as any).head = headElement;
|
|
486
|
-
}
|
|
487
|
-
if (bodyElement) {
|
|
488
|
-
(this.document as any).body = bodyElement;
|
|
493
|
+
// Second priority: BODY with attributes
|
|
494
|
+
if (!bodyElement) {
|
|
495
|
+
for (let i = 0; i < allBodyElements.length; i++) {
|
|
496
|
+
const body = allBodyElements[i];
|
|
497
|
+
if (body.attributes.length > 0) {
|
|
498
|
+
bodyElement = body;
|
|
499
|
+
break;
|
|
489
500
|
}
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
// Last resort: first BODY
|
|
505
|
+
if (!bodyElement && allBodyElements.length > 0) {
|
|
506
|
+
bodyElement = allBodyElements[0];
|
|
490
507
|
}
|
|
491
|
-
|
|
508
|
+
|
|
509
|
+
// Set document references
|
|
510
|
+
if (htmlElement) {
|
|
511
|
+
(this.document as any).documentElement = htmlElement;
|
|
512
|
+
}
|
|
513
|
+
if (headElement) {
|
|
514
|
+
(this.document as any).head = headElement;
|
|
515
|
+
}
|
|
516
|
+
if (bodyElement) {
|
|
517
|
+
(this.document as any).body = bodyElement;
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
}
|