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