@dooboostore/dom-parser 1.0.0

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/README.MD +280 -0
  2. package/dist/cjs/DomParser.js +360 -0
  3. package/dist/cjs/DomParser.js.map +7 -0
  4. package/dist/cjs/factory/ElementFactory.js +76 -0
  5. package/dist/cjs/factory/ElementFactory.js.map +7 -0
  6. package/dist/cjs/factory/index.js +24 -0
  7. package/dist/cjs/factory/index.js.map +7 -0
  8. package/dist/cjs/index.js +34 -0
  9. package/dist/cjs/index.js.map +7 -0
  10. package/dist/cjs/node/CharacterData.js +16 -0
  11. package/dist/cjs/node/CharacterData.js.map +7 -0
  12. package/dist/cjs/node/ChildNode.js +16 -0
  13. package/dist/cjs/node/ChildNode.js.map +7 -0
  14. package/dist/cjs/node/ChildNodeBase.js +62 -0
  15. package/dist/cjs/node/ChildNodeBase.js.map +7 -0
  16. package/dist/cjs/node/Comment.js +86 -0
  17. package/dist/cjs/node/Comment.js.map +7 -0
  18. package/dist/cjs/node/Document.js +28 -0
  19. package/dist/cjs/node/Document.js.map +7 -0
  20. package/dist/cjs/node/DocumentBase.js +378 -0
  21. package/dist/cjs/node/DocumentBase.js.map +7 -0
  22. package/dist/cjs/node/DocumentFragment.js +16 -0
  23. package/dist/cjs/node/DocumentFragment.js.map +7 -0
  24. package/dist/cjs/node/DocumentFragmentBase.js +88 -0
  25. package/dist/cjs/node/DocumentFragmentBase.js.map +7 -0
  26. package/dist/cjs/node/GetRootNodeOptions.js +16 -0
  27. package/dist/cjs/node/GetRootNodeOptions.js.map +7 -0
  28. package/dist/cjs/node/Node.js +58 -0
  29. package/dist/cjs/node/Node.js.map +7 -0
  30. package/dist/cjs/node/NodeBase.js +380 -0
  31. package/dist/cjs/node/NodeBase.js.map +7 -0
  32. package/dist/cjs/node/NodeIterator.js +163 -0
  33. package/dist/cjs/node/NodeIterator.js.map +7 -0
  34. package/dist/cjs/node/ParentNode.js +16 -0
  35. package/dist/cjs/node/ParentNode.js.map +7 -0
  36. package/dist/cjs/node/ParentNodeBase.js +134 -0
  37. package/dist/cjs/node/ParentNodeBase.js.map +7 -0
  38. package/dist/cjs/node/Text.js +16 -0
  39. package/dist/cjs/node/Text.js.map +7 -0
  40. package/dist/cjs/node/TextBase.js +106 -0
  41. package/dist/cjs/node/TextBase.js.map +7 -0
  42. package/dist/cjs/node/collection/HTMLCollection.js +105 -0
  43. package/dist/cjs/node/collection/HTMLCollection.js.map +7 -0
  44. package/dist/cjs/node/collection/HTMLCollectionOf.js +36 -0
  45. package/dist/cjs/node/collection/HTMLCollectionOf.js.map +7 -0
  46. package/dist/cjs/node/collection/NodeList.js +135 -0
  47. package/dist/cjs/node/collection/NodeList.js.map +7 -0
  48. package/dist/cjs/node/collection/NodeListOf.js +38 -0
  49. package/dist/cjs/node/collection/NodeListOf.js.map +7 -0
  50. package/dist/cjs/node/collection/index.js +30 -0
  51. package/dist/cjs/node/collection/index.js.map +7 -0
  52. package/dist/cjs/node/elements/Element.js +16 -0
  53. package/dist/cjs/node/elements/Element.js.map +7 -0
  54. package/dist/cjs/node/elements/ElementBase.js +936 -0
  55. package/dist/cjs/node/elements/ElementBase.js.map +7 -0
  56. package/dist/cjs/node/elements/HTMLAnchorElement.js +71 -0
  57. package/dist/cjs/node/elements/HTMLAnchorElement.js.map +7 -0
  58. package/dist/cjs/node/elements/HTMLAreaElement.js +77 -0
  59. package/dist/cjs/node/elements/HTMLAreaElement.js.map +7 -0
  60. package/dist/cjs/node/elements/HTMLBaseElement.js +77 -0
  61. package/dist/cjs/node/elements/HTMLBaseElement.js.map +7 -0
  62. package/dist/cjs/node/elements/HTMLBodyElement.js +29 -0
  63. package/dist/cjs/node/elements/HTMLBodyElement.js.map +7 -0
  64. package/dist/cjs/node/elements/HTMLButtonElement.js +89 -0
  65. package/dist/cjs/node/elements/HTMLButtonElement.js.map +7 -0
  66. package/dist/cjs/node/elements/HTMLCanvasElement.js +79 -0
  67. package/dist/cjs/node/elements/HTMLCanvasElement.js.map +7 -0
  68. package/dist/cjs/node/elements/HTMLCaptionElement.js +41 -0
  69. package/dist/cjs/node/elements/HTMLCaptionElement.js.map +7 -0
  70. package/dist/cjs/node/elements/HTMLDivElement.js +29 -0
  71. package/dist/cjs/node/elements/HTMLDivElement.js.map +7 -0
  72. package/dist/cjs/node/elements/HTMLElement.js +16 -0
  73. package/dist/cjs/node/elements/HTMLElement.js.map +7 -0
  74. package/dist/cjs/node/elements/HTMLElementBase.js +182 -0
  75. package/dist/cjs/node/elements/HTMLElementBase.js.map +7 -0
  76. package/dist/cjs/node/elements/HTMLEmbedElement.js +45 -0
  77. package/dist/cjs/node/elements/HTMLEmbedElement.js.map +7 -0
  78. package/dist/cjs/node/elements/HTMLFormElement.js +127 -0
  79. package/dist/cjs/node/elements/HTMLFormElement.js.map +7 -0
  80. package/dist/cjs/node/elements/HTMLGenericElement.js +32 -0
  81. package/dist/cjs/node/elements/HTMLGenericElement.js.map +7 -0
  82. package/dist/cjs/node/elements/HTMLH1Element.js +29 -0
  83. package/dist/cjs/node/elements/HTMLH1Element.js.map +7 -0
  84. package/dist/cjs/node/elements/HTMLHeadElement.js +29 -0
  85. package/dist/cjs/node/elements/HTMLHeadElement.js.map +7 -0
  86. package/dist/cjs/node/elements/HTMLHtmlElement.js +92 -0
  87. package/dist/cjs/node/elements/HTMLHtmlElement.js.map +7 -0
  88. package/dist/cjs/node/elements/HTMLImgElement.js +99 -0
  89. package/dist/cjs/node/elements/HTMLImgElement.js.map +7 -0
  90. package/dist/cjs/node/elements/HTMLInputElement.js +157 -0
  91. package/dist/cjs/node/elements/HTMLInputElement.js.map +7 -0
  92. package/dist/cjs/node/elements/HTMLLIElement.js +57 -0
  93. package/dist/cjs/node/elements/HTMLLIElement.js.map +7 -0
  94. package/dist/cjs/node/elements/HTMLLinkElement.js +99 -0
  95. package/dist/cjs/node/elements/HTMLLinkElement.js.map +7 -0
  96. package/dist/cjs/node/elements/HTMLMetaElement.js +29 -0
  97. package/dist/cjs/node/elements/HTMLMetaElement.js.map +7 -0
  98. package/dist/cjs/node/elements/HTMLOListElement.js +89 -0
  99. package/dist/cjs/node/elements/HTMLOListElement.js.map +7 -0
  100. package/dist/cjs/node/elements/HTMLPElement.js +29 -0
  101. package/dist/cjs/node/elements/HTMLPElement.js.map +7 -0
  102. package/dist/cjs/node/elements/HTMLScriptElement.js +127 -0
  103. package/dist/cjs/node/elements/HTMLScriptElement.js.map +7 -0
  104. package/dist/cjs/node/elements/HTMLSpanElement.js +29 -0
  105. package/dist/cjs/node/elements/HTMLSpanElement.js.map +7 -0
  106. package/dist/cjs/node/elements/HTMLStyleElement.js +71 -0
  107. package/dist/cjs/node/elements/HTMLStyleElement.js.map +7 -0
  108. package/dist/cjs/node/elements/HTMLTableElement.js +112 -0
  109. package/dist/cjs/node/elements/HTMLTableElement.js.map +7 -0
  110. package/dist/cjs/node/elements/HTMLTbodyElement.js +54 -0
  111. package/dist/cjs/node/elements/HTMLTbodyElement.js.map +7 -0
  112. package/dist/cjs/node/elements/HTMLTdElement.js +72 -0
  113. package/dist/cjs/node/elements/HTMLTdElement.js.map +7 -0
  114. package/dist/cjs/node/elements/HTMLTemplateElement.js +97 -0
  115. package/dist/cjs/node/elements/HTMLTemplateElement.js.map +7 -0
  116. package/dist/cjs/node/elements/HTMLTfootElement.js +56 -0
  117. package/dist/cjs/node/elements/HTMLTfootElement.js.map +7 -0
  118. package/dist/cjs/node/elements/HTMLThElement.js +72 -0
  119. package/dist/cjs/node/elements/HTMLThElement.js.map +7 -0
  120. package/dist/cjs/node/elements/HTMLTheadElement.js +54 -0
  121. package/dist/cjs/node/elements/HTMLTheadElement.js.map +7 -0
  122. package/dist/cjs/node/elements/HTMLTitleElement.js +38 -0
  123. package/dist/cjs/node/elements/HTMLTitleElement.js.map +7 -0
  124. package/dist/cjs/node/elements/HTMLTrElement.js +77 -0
  125. package/dist/cjs/node/elements/HTMLTrElement.js.map +7 -0
  126. package/dist/cjs/node/elements/HTMLUListElement.js +29 -0
  127. package/dist/cjs/node/elements/HTMLUListElement.js.map +7 -0
  128. package/dist/cjs/node/elements/MathMLElement.js +32 -0
  129. package/dist/cjs/node/elements/MathMLElement.js.map +7 -0
  130. package/dist/cjs/node/elements/SVGCircleElement.js +69 -0
  131. package/dist/cjs/node/elements/SVGCircleElement.js.map +7 -0
  132. package/dist/cjs/node/elements/SVGElement.js +32 -0
  133. package/dist/cjs/node/elements/SVGElement.js.map +7 -0
  134. package/dist/cjs/node/elements/SVGRectElement.js +80 -0
  135. package/dist/cjs/node/elements/SVGRectElement.js.map +7 -0
  136. package/dist/cjs/node/elements/index.js +183 -0
  137. package/dist/cjs/node/elements/index.js.map +7 -0
  138. package/dist/cjs/node/index.js +73 -0
  139. package/dist/cjs/node/index.js.map +7 -0
  140. package/dist/cjs/package.json +5 -0
  141. package/dist/cjs/utils/CSSSelector.js +271 -0
  142. package/dist/cjs/utils/CSSSelector.js.map +7 -0
  143. package/dist/cjs/window/Window.js +16 -0
  144. package/dist/cjs/window/Window.js.map +7 -0
  145. package/dist/cjs/window/WindowBase.js +847 -0
  146. package/dist/cjs/window/WindowBase.js.map +7 -0
  147. package/dist/cjs/window/index.js +29 -0
  148. package/dist/cjs/window/index.js.map +7 -0
  149. package/dist/esm/DomParser.js +341 -0
  150. package/dist/esm/DomParser.js.map +7 -0
  151. package/dist/esm/factory/ElementFactory.js +57 -0
  152. package/dist/esm/factory/ElementFactory.js.map +7 -0
  153. package/dist/esm/factory/index.js +5 -0
  154. package/dist/esm/factory/index.js.map +7 -0
  155. package/dist/esm/index.js +15 -0
  156. package/dist/esm/index.js.map +7 -0
  157. package/dist/esm/node/CharacterData.js +1 -0
  158. package/dist/esm/node/CharacterData.js.map +7 -0
  159. package/dist/esm/node/ChildNode.js +1 -0
  160. package/dist/esm/node/ChildNode.js.map +7 -0
  161. package/dist/esm/node/ChildNodeBase.js +43 -0
  162. package/dist/esm/node/ChildNodeBase.js.map +7 -0
  163. package/dist/esm/node/Comment.js +67 -0
  164. package/dist/esm/node/Comment.js.map +7 -0
  165. package/dist/esm/node/Document.js +9 -0
  166. package/dist/esm/node/Document.js.map +7 -0
  167. package/dist/esm/node/DocumentBase.js +359 -0
  168. package/dist/esm/node/DocumentBase.js.map +7 -0
  169. package/dist/esm/node/DocumentFragment.js +1 -0
  170. package/dist/esm/node/DocumentFragment.js.map +7 -0
  171. package/dist/esm/node/DocumentFragmentBase.js +69 -0
  172. package/dist/esm/node/DocumentFragmentBase.js.map +7 -0
  173. package/dist/esm/node/GetRootNodeOptions.js +1 -0
  174. package/dist/esm/node/GetRootNodeOptions.js.map +7 -0
  175. package/dist/esm/node/Node.js +39 -0
  176. package/dist/esm/node/Node.js.map +7 -0
  177. package/dist/esm/node/NodeBase.js +380 -0
  178. package/dist/esm/node/NodeBase.js.map +7 -0
  179. package/dist/esm/node/NodeIterator.js +144 -0
  180. package/dist/esm/node/NodeIterator.js.map +7 -0
  181. package/dist/esm/node/ParentNode.js +1 -0
  182. package/dist/esm/node/ParentNode.js.map +7 -0
  183. package/dist/esm/node/ParentNodeBase.js +115 -0
  184. package/dist/esm/node/ParentNodeBase.js.map +7 -0
  185. package/dist/esm/node/Text.js +1 -0
  186. package/dist/esm/node/Text.js.map +7 -0
  187. package/dist/esm/node/TextBase.js +87 -0
  188. package/dist/esm/node/TextBase.js.map +7 -0
  189. package/dist/esm/node/collection/HTMLCollection.js +86 -0
  190. package/dist/esm/node/collection/HTMLCollection.js.map +7 -0
  191. package/dist/esm/node/collection/HTMLCollectionOf.js +17 -0
  192. package/dist/esm/node/collection/HTMLCollectionOf.js.map +7 -0
  193. package/dist/esm/node/collection/NodeList.js +116 -0
  194. package/dist/esm/node/collection/NodeList.js.map +7 -0
  195. package/dist/esm/node/collection/NodeListOf.js +19 -0
  196. package/dist/esm/node/collection/NodeListOf.js.map +7 -0
  197. package/dist/esm/node/collection/index.js +11 -0
  198. package/dist/esm/node/collection/index.js.map +7 -0
  199. package/dist/esm/node/elements/Element.js +1 -0
  200. package/dist/esm/node/elements/Element.js.map +7 -0
  201. package/dist/esm/node/elements/ElementBase.js +917 -0
  202. package/dist/esm/node/elements/ElementBase.js.map +7 -0
  203. package/dist/esm/node/elements/HTMLAnchorElement.js +52 -0
  204. package/dist/esm/node/elements/HTMLAnchorElement.js.map +7 -0
  205. package/dist/esm/node/elements/HTMLAreaElement.js +58 -0
  206. package/dist/esm/node/elements/HTMLAreaElement.js.map +7 -0
  207. package/dist/esm/node/elements/HTMLBaseElement.js +58 -0
  208. package/dist/esm/node/elements/HTMLBaseElement.js.map +7 -0
  209. package/dist/esm/node/elements/HTMLBodyElement.js +10 -0
  210. package/dist/esm/node/elements/HTMLBodyElement.js.map +7 -0
  211. package/dist/esm/node/elements/HTMLButtonElement.js +70 -0
  212. package/dist/esm/node/elements/HTMLButtonElement.js.map +7 -0
  213. package/dist/esm/node/elements/HTMLCanvasElement.js +60 -0
  214. package/dist/esm/node/elements/HTMLCanvasElement.js.map +7 -0
  215. package/dist/esm/node/elements/HTMLCaptionElement.js +22 -0
  216. package/dist/esm/node/elements/HTMLCaptionElement.js.map +7 -0
  217. package/dist/esm/node/elements/HTMLDivElement.js +10 -0
  218. package/dist/esm/node/elements/HTMLDivElement.js.map +7 -0
  219. package/dist/esm/node/elements/HTMLElement.js +1 -0
  220. package/dist/esm/node/elements/HTMLElement.js.map +7 -0
  221. package/dist/esm/node/elements/HTMLElementBase.js +163 -0
  222. package/dist/esm/node/elements/HTMLElementBase.js.map +7 -0
  223. package/dist/esm/node/elements/HTMLEmbedElement.js +26 -0
  224. package/dist/esm/node/elements/HTMLEmbedElement.js.map +7 -0
  225. package/dist/esm/node/elements/HTMLFormElement.js +108 -0
  226. package/dist/esm/node/elements/HTMLFormElement.js.map +7 -0
  227. package/dist/esm/node/elements/HTMLGenericElement.js +13 -0
  228. package/dist/esm/node/elements/HTMLGenericElement.js.map +7 -0
  229. package/dist/esm/node/elements/HTMLH1Element.js +10 -0
  230. package/dist/esm/node/elements/HTMLH1Element.js.map +7 -0
  231. package/dist/esm/node/elements/HTMLHeadElement.js +10 -0
  232. package/dist/esm/node/elements/HTMLHeadElement.js.map +7 -0
  233. package/dist/esm/node/elements/HTMLHtmlElement.js +73 -0
  234. package/dist/esm/node/elements/HTMLHtmlElement.js.map +7 -0
  235. package/dist/esm/node/elements/HTMLImgElement.js +80 -0
  236. package/dist/esm/node/elements/HTMLImgElement.js.map +7 -0
  237. package/dist/esm/node/elements/HTMLInputElement.js +138 -0
  238. package/dist/esm/node/elements/HTMLInputElement.js.map +7 -0
  239. package/dist/esm/node/elements/HTMLLIElement.js +38 -0
  240. package/dist/esm/node/elements/HTMLLIElement.js.map +7 -0
  241. package/dist/esm/node/elements/HTMLLinkElement.js +80 -0
  242. package/dist/esm/node/elements/HTMLLinkElement.js.map +7 -0
  243. package/dist/esm/node/elements/HTMLMetaElement.js +10 -0
  244. package/dist/esm/node/elements/HTMLMetaElement.js.map +7 -0
  245. package/dist/esm/node/elements/HTMLOListElement.js +70 -0
  246. package/dist/esm/node/elements/HTMLOListElement.js.map +7 -0
  247. package/dist/esm/node/elements/HTMLPElement.js +10 -0
  248. package/dist/esm/node/elements/HTMLPElement.js.map +7 -0
  249. package/dist/esm/node/elements/HTMLScriptElement.js +108 -0
  250. package/dist/esm/node/elements/HTMLScriptElement.js.map +7 -0
  251. package/dist/esm/node/elements/HTMLSpanElement.js +10 -0
  252. package/dist/esm/node/elements/HTMLSpanElement.js.map +7 -0
  253. package/dist/esm/node/elements/HTMLStyleElement.js +52 -0
  254. package/dist/esm/node/elements/HTMLStyleElement.js.map +7 -0
  255. package/dist/esm/node/elements/HTMLTableElement.js +93 -0
  256. package/dist/esm/node/elements/HTMLTableElement.js.map +7 -0
  257. package/dist/esm/node/elements/HTMLTbodyElement.js +35 -0
  258. package/dist/esm/node/elements/HTMLTbodyElement.js.map +7 -0
  259. package/dist/esm/node/elements/HTMLTdElement.js +53 -0
  260. package/dist/esm/node/elements/HTMLTdElement.js.map +7 -0
  261. package/dist/esm/node/elements/HTMLTemplateElement.js +78 -0
  262. package/dist/esm/node/elements/HTMLTemplateElement.js.map +7 -0
  263. package/dist/esm/node/elements/HTMLTfootElement.js +37 -0
  264. package/dist/esm/node/elements/HTMLTfootElement.js.map +7 -0
  265. package/dist/esm/node/elements/HTMLThElement.js +53 -0
  266. package/dist/esm/node/elements/HTMLThElement.js.map +7 -0
  267. package/dist/esm/node/elements/HTMLTheadElement.js +35 -0
  268. package/dist/esm/node/elements/HTMLTheadElement.js.map +7 -0
  269. package/dist/esm/node/elements/HTMLTitleElement.js +19 -0
  270. package/dist/esm/node/elements/HTMLTitleElement.js.map +7 -0
  271. package/dist/esm/node/elements/HTMLTrElement.js +58 -0
  272. package/dist/esm/node/elements/HTMLTrElement.js.map +7 -0
  273. package/dist/esm/node/elements/HTMLUListElement.js +10 -0
  274. package/dist/esm/node/elements/HTMLUListElement.js.map +7 -0
  275. package/dist/esm/node/elements/MathMLElement.js +13 -0
  276. package/dist/esm/node/elements/MathMLElement.js.map +7 -0
  277. package/dist/esm/node/elements/SVGCircleElement.js +50 -0
  278. package/dist/esm/node/elements/SVGCircleElement.js.map +7 -0
  279. package/dist/esm/node/elements/SVGElement.js +13 -0
  280. package/dist/esm/node/elements/SVGElement.js.map +7 -0
  281. package/dist/esm/node/elements/SVGRectElement.js +61 -0
  282. package/dist/esm/node/elements/SVGRectElement.js.map +7 -0
  283. package/dist/esm/node/elements/index.js +164 -0
  284. package/dist/esm/node/elements/index.js.map +7 -0
  285. package/dist/esm/node/index.js +53 -0
  286. package/dist/esm/node/index.js.map +7 -0
  287. package/dist/esm/utils/CSSSelector.js +252 -0
  288. package/dist/esm/utils/CSSSelector.js.map +7 -0
  289. package/dist/esm/window/Window.js +1 -0
  290. package/dist/esm/window/Window.js.map +7 -0
  291. package/dist/esm/window/WindowBase.js +828 -0
  292. package/dist/esm/window/WindowBase.js.map +7 -0
  293. package/dist/esm/window/index.js +10 -0
  294. package/dist/esm/window/index.js.map +7 -0
  295. package/dist/esm-bundle/dooboostore-dom-parser.esm.js +6176 -0
  296. package/dist/esm-bundle/dooboostore-dom-parser.esm.js.map +7 -0
  297. package/dist/types/DomParser.d.ts +30 -0
  298. package/dist/types/DomParser.d.ts.map +1 -0
  299. package/dist/types/factory/ElementFactory.d.ts +27 -0
  300. package/dist/types/factory/ElementFactory.d.ts.map +1 -0
  301. package/dist/types/factory/index.d.ts +2 -0
  302. package/dist/types/factory/index.d.ts.map +1 -0
  303. package/dist/types/index.d.ts +9 -0
  304. package/dist/types/index.d.ts.map +1 -0
  305. package/dist/types/node/CharacterData.d.ts +52 -0
  306. package/dist/types/node/CharacterData.d.ts.map +1 -0
  307. package/dist/types/node/ChildNode.d.ts +39 -0
  308. package/dist/types/node/ChildNode.d.ts.map +1 -0
  309. package/dist/types/node/ChildNodeBase.d.ts +12 -0
  310. package/dist/types/node/ChildNodeBase.d.ts.map +1 -0
  311. package/dist/types/node/Comment.d.ts +26 -0
  312. package/dist/types/node/Comment.d.ts.map +1 -0
  313. package/dist/types/node/Document.d.ts +857 -0
  314. package/dist/types/node/Document.d.ts.map +1 -0
  315. package/dist/types/node/DocumentBase.d.ts +153 -0
  316. package/dist/types/node/DocumentBase.d.ts.map +1 -0
  317. package/dist/types/node/DocumentFragment.d.ts +39 -0
  318. package/dist/types/node/DocumentFragment.d.ts.map +1 -0
  319. package/dist/types/node/DocumentFragmentBase.d.ts +51 -0
  320. package/dist/types/node/DocumentFragmentBase.d.ts.map +1 -0
  321. package/dist/types/node/GetRootNodeOptions.d.ts +14 -0
  322. package/dist/types/node/GetRootNodeOptions.d.ts.map +1 -0
  323. package/dist/types/node/Node.d.ts +232 -0
  324. package/dist/types/node/Node.d.ts.map +1 -0
  325. package/dist/types/node/NodeBase.d.ts +98 -0
  326. package/dist/types/node/NodeBase.d.ts.map +1 -0
  327. package/dist/types/node/NodeIterator.d.ts +61 -0
  328. package/dist/types/node/NodeIterator.d.ts.map +1 -0
  329. package/dist/types/node/ParentNode.d.ts +85 -0
  330. package/dist/types/node/ParentNode.d.ts.map +1 -0
  331. package/dist/types/node/ParentNodeBase.d.ts +22 -0
  332. package/dist/types/node/ParentNodeBase.d.ts.map +1 -0
  333. package/dist/types/node/Text.d.ts +25 -0
  334. package/dist/types/node/Text.d.ts.map +1 -0
  335. package/dist/types/node/TextBase.d.ts +26 -0
  336. package/dist/types/node/TextBase.d.ts.map +1 -0
  337. package/dist/types/node/collection/HTMLCollection.d.ts +37 -0
  338. package/dist/types/node/collection/HTMLCollection.d.ts.map +1 -0
  339. package/dist/types/node/collection/HTMLCollectionOf.d.ts +14 -0
  340. package/dist/types/node/collection/HTMLCollectionOf.d.ts.map +1 -0
  341. package/dist/types/node/collection/NodeList.d.ts +55 -0
  342. package/dist/types/node/collection/NodeList.d.ts.map +1 -0
  343. package/dist/types/node/collection/NodeListOf.d.ts +14 -0
  344. package/dist/types/node/collection/NodeListOf.d.ts.map +1 -0
  345. package/dist/types/node/collection/index.d.ts +5 -0
  346. package/dist/types/node/collection/index.d.ts.map +1 -0
  347. package/dist/types/node/elements/Element.d.ts +687 -0
  348. package/dist/types/node/elements/Element.d.ts.map +1 -0
  349. package/dist/types/node/elements/ElementBase.d.ts +143 -0
  350. package/dist/types/node/elements/ElementBase.d.ts.map +1 -0
  351. package/dist/types/node/elements/HTMLAnchorElement.d.ts +18 -0
  352. package/dist/types/node/elements/HTMLAnchorElement.d.ts.map +1 -0
  353. package/dist/types/node/elements/HTMLAreaElement.d.ts +59 -0
  354. package/dist/types/node/elements/HTMLAreaElement.d.ts.map +1 -0
  355. package/dist/types/node/elements/HTMLBaseElement.d.ts +25 -0
  356. package/dist/types/node/elements/HTMLBaseElement.d.ts.map +1 -0
  357. package/dist/types/node/elements/HTMLBodyElement.d.ts +10 -0
  358. package/dist/types/node/elements/HTMLBodyElement.d.ts.map +1 -0
  359. package/dist/types/node/elements/HTMLButtonElement.d.ts +21 -0
  360. package/dist/types/node/elements/HTMLButtonElement.d.ts.map +1 -0
  361. package/dist/types/node/elements/HTMLCanvasElement.d.ts +15 -0
  362. package/dist/types/node/elements/HTMLCanvasElement.d.ts.map +1 -0
  363. package/dist/types/node/elements/HTMLCaptionElement.d.ts +18 -0
  364. package/dist/types/node/elements/HTMLCaptionElement.d.ts.map +1 -0
  365. package/dist/types/node/elements/HTMLDivElement.d.ts +10 -0
  366. package/dist/types/node/elements/HTMLDivElement.d.ts.map +1 -0
  367. package/dist/types/node/elements/HTMLElement.d.ts +90 -0
  368. package/dist/types/node/elements/HTMLElement.d.ts.map +1 -0
  369. package/dist/types/node/elements/HTMLElementBase.d.ts +42 -0
  370. package/dist/types/node/elements/HTMLElementBase.d.ts.map +1 -0
  371. package/dist/types/node/elements/HTMLEmbedElement.d.ts +27 -0
  372. package/dist/types/node/elements/HTMLEmbedElement.d.ts.map +1 -0
  373. package/dist/types/node/elements/HTMLFormElement.d.ts +30 -0
  374. package/dist/types/node/elements/HTMLFormElement.d.ts.map +1 -0
  375. package/dist/types/node/elements/HTMLGenericElement.d.ts +6 -0
  376. package/dist/types/node/elements/HTMLGenericElement.d.ts.map +1 -0
  377. package/dist/types/node/elements/HTMLH1Element.d.ts +10 -0
  378. package/dist/types/node/elements/HTMLH1Element.d.ts.map +1 -0
  379. package/dist/types/node/elements/HTMLHeadElement.d.ts +10 -0
  380. package/dist/types/node/elements/HTMLHeadElement.d.ts.map +1 -0
  381. package/dist/types/node/elements/HTMLHtmlElement.d.ts +17 -0
  382. package/dist/types/node/elements/HTMLHtmlElement.d.ts.map +1 -0
  383. package/dist/types/node/elements/HTMLImgElement.d.ts +24 -0
  384. package/dist/types/node/elements/HTMLImgElement.d.ts.map +1 -0
  385. package/dist/types/node/elements/HTMLInputElement.d.ts +33 -0
  386. package/dist/types/node/elements/HTMLInputElement.d.ts.map +1 -0
  387. package/dist/types/node/elements/HTMLLIElement.d.ts +15 -0
  388. package/dist/types/node/elements/HTMLLIElement.d.ts.map +1 -0
  389. package/dist/types/node/elements/HTMLLinkElement.d.ts +24 -0
  390. package/dist/types/node/elements/HTMLLinkElement.d.ts.map +1 -0
  391. package/dist/types/node/elements/HTMLMetaElement.d.ts +10 -0
  392. package/dist/types/node/elements/HTMLMetaElement.d.ts.map +1 -0
  393. package/dist/types/node/elements/HTMLOListElement.d.ts +21 -0
  394. package/dist/types/node/elements/HTMLOListElement.d.ts.map +1 -0
  395. package/dist/types/node/elements/HTMLPElement.d.ts +10 -0
  396. package/dist/types/node/elements/HTMLPElement.d.ts.map +1 -0
  397. package/dist/types/node/elements/HTMLScriptElement.d.ts +29 -0
  398. package/dist/types/node/elements/HTMLScriptElement.d.ts.map +1 -0
  399. package/dist/types/node/elements/HTMLSpanElement.d.ts +10 -0
  400. package/dist/types/node/elements/HTMLSpanElement.d.ts.map +1 -0
  401. package/dist/types/node/elements/HTMLStyleElement.d.ts +18 -0
  402. package/dist/types/node/elements/HTMLStyleElement.d.ts.map +1 -0
  403. package/dist/types/node/elements/HTMLTableElement.d.ts +25 -0
  404. package/dist/types/node/elements/HTMLTableElement.d.ts.map +1 -0
  405. package/dist/types/node/elements/HTMLTbodyElement.d.ts +15 -0
  406. package/dist/types/node/elements/HTMLTbodyElement.d.ts.map +1 -0
  407. package/dist/types/node/elements/HTMLTdElement.d.ts +21 -0
  408. package/dist/types/node/elements/HTMLTdElement.d.ts.map +1 -0
  409. package/dist/types/node/elements/HTMLTemplateElement.d.ts +32 -0
  410. package/dist/types/node/elements/HTMLTemplateElement.d.ts.map +1 -0
  411. package/dist/types/node/elements/HTMLTfootElement.d.ts +16 -0
  412. package/dist/types/node/elements/HTMLTfootElement.d.ts.map +1 -0
  413. package/dist/types/node/elements/HTMLThElement.d.ts +21 -0
  414. package/dist/types/node/elements/HTMLThElement.d.ts.map +1 -0
  415. package/dist/types/node/elements/HTMLTheadElement.d.ts +15 -0
  416. package/dist/types/node/elements/HTMLTheadElement.d.ts.map +1 -0
  417. package/dist/types/node/elements/HTMLTitleElement.d.ts +15 -0
  418. package/dist/types/node/elements/HTMLTitleElement.d.ts.map +1 -0
  419. package/dist/types/node/elements/HTMLTrElement.d.ts +17 -0
  420. package/dist/types/node/elements/HTMLTrElement.d.ts.map +1 -0
  421. package/dist/types/node/elements/HTMLUListElement.d.ts +10 -0
  422. package/dist/types/node/elements/HTMLUListElement.d.ts.map +1 -0
  423. package/dist/types/node/elements/MathMLElement.d.ts +11 -0
  424. package/dist/types/node/elements/MathMLElement.d.ts.map +1 -0
  425. package/dist/types/node/elements/SVGCircleElement.d.ts +20 -0
  426. package/dist/types/node/elements/SVGCircleElement.d.ts.map +1 -0
  427. package/dist/types/node/elements/SVGElement.d.ts +11 -0
  428. package/dist/types/node/elements/SVGElement.d.ts.map +1 -0
  429. package/dist/types/node/elements/SVGRectElement.d.ts +23 -0
  430. package/dist/types/node/elements/SVGRectElement.d.ts.map +1 -0
  431. package/dist/types/node/elements/index.d.ts +128 -0
  432. package/dist/types/node/elements/index.d.ts.map +1 -0
  433. package/dist/types/node/index.d.ts +16 -0
  434. package/dist/types/node/index.d.ts.map +1 -0
  435. package/dist/types/utils/CSSSelector.d.ts +36 -0
  436. package/dist/types/utils/CSSSelector.d.ts.map +1 -0
  437. package/dist/types/window/Window.d.ts +620 -0
  438. package/dist/types/window/Window.d.ts.map +1 -0
  439. package/dist/types/window/WindowBase.d.ts +342 -0
  440. package/dist/types/window/WindowBase.d.ts.map +1 -0
  441. package/dist/types/window/index.d.ts +3 -0
  442. package/dist/types/window/index.d.ts.map +1 -0
  443. package/dist/umd-bundle/dooboostore-dom-parser.umd.js +6182 -0
  444. package/dist/umd-bundle/dooboostore-dom-parser.umd.js.map +7 -0
  445. package/package.json +120 -0
  446. package/src/DomParser.ts +491 -0
  447. package/src/factory/ElementFactory.ts +69 -0
  448. package/src/factory/index.ts +1 -0
  449. package/src/index.ts +28 -0
  450. package/src/node/CharacterData.ts +58 -0
  451. package/src/node/ChildNode.ts +42 -0
  452. package/src/node/ChildNodeBase.ts +54 -0
  453. package/src/node/Comment.ts +98 -0
  454. package/src/node/Document.ts +882 -0
  455. package/src/node/DocumentBase.ts +465 -0
  456. package/src/node/DocumentFragment.ts +44 -0
  457. package/src/node/DocumentFragmentBase.ts +109 -0
  458. package/src/node/GetRootNodeOptions.ts +13 -0
  459. package/src/node/Node.ts +245 -0
  460. package/src/node/NodeBase.ts +506 -0
  461. package/src/node/NodeIterator.ts +200 -0
  462. package/src/node/ParentNode.ts +93 -0
  463. package/src/node/ParentNodeBase.ts +145 -0
  464. package/src/node/Text.ts +30 -0
  465. package/src/node/TextBase.ts +113 -0
  466. package/src/node/collection/HTMLCollection.ts +107 -0
  467. package/src/node/collection/HTMLCollectionOf.ts +26 -0
  468. package/src/node/collection/NodeList.ts +140 -0
  469. package/src/node/collection/NodeListOf.ts +28 -0
  470. package/src/node/collection/index.ts +4 -0
  471. package/src/node/elements/Element.ts +771 -0
  472. package/src/node/elements/ElementBase.ts +1239 -0
  473. package/src/node/elements/HTMLAnchorElement.ts +63 -0
  474. package/src/node/elements/HTMLAreaElement.ts +73 -0
  475. package/src/node/elements/HTMLBaseElement.ts +70 -0
  476. package/src/node/elements/HTMLBodyElement.ts +12 -0
  477. package/src/node/elements/HTMLButtonElement.ts +83 -0
  478. package/src/node/elements/HTMLCanvasElement.ts +71 -0
  479. package/src/node/elements/HTMLCaptionElement.ts +26 -0
  480. package/src/node/elements/HTMLDivElement.ts +12 -0
  481. package/src/node/elements/HTMLElement.ts +105 -0
  482. package/src/node/elements/HTMLElementBase.ts +198 -0
  483. package/src/node/elements/HTMLEmbedElement.ts +33 -0
  484. package/src/node/elements/HTMLFormElement.ts +131 -0
  485. package/src/node/elements/HTMLGenericElement.ts +13 -0
  486. package/src/node/elements/HTMLH1Element.ts +12 -0
  487. package/src/node/elements/HTMLHeadElement.ts +12 -0
  488. package/src/node/elements/HTMLHtmlElement.ts +82 -0
  489. package/src/node/elements/HTMLImgElement.ts +96 -0
  490. package/src/node/elements/HTMLInputElement.ts +160 -0
  491. package/src/node/elements/HTMLLIElement.ts +47 -0
  492. package/src/node/elements/HTMLLinkElement.ts +95 -0
  493. package/src/node/elements/HTMLMetaElement.ts +12 -0
  494. package/src/node/elements/HTMLOListElement.ts +83 -0
  495. package/src/node/elements/HTMLPElement.ts +12 -0
  496. package/src/node/elements/HTMLScriptElement.ts +127 -0
  497. package/src/node/elements/HTMLSpanElement.ts +12 -0
  498. package/src/node/elements/HTMLStyleElement.ts +63 -0
  499. package/src/node/elements/HTMLTableElement.ts +117 -0
  500. package/src/node/elements/HTMLTbodyElement.ts +46 -0
  501. package/src/node/elements/HTMLTdElement.ts +67 -0
  502. package/src/node/elements/HTMLTemplateElement.ts +112 -0
  503. package/src/node/elements/HTMLTfootElement.ts +47 -0
  504. package/src/node/elements/HTMLThElement.ts +67 -0
  505. package/src/node/elements/HTMLTheadElement.ts +46 -0
  506. package/src/node/elements/HTMLTitleElement.ts +23 -0
  507. package/src/node/elements/HTMLTrElement.ts +72 -0
  508. package/src/node/elements/HTMLUListElement.ts +12 -0
  509. package/src/node/elements/MathMLElement.ts +16 -0
  510. package/src/node/elements/SVGCircleElement.ts +61 -0
  511. package/src/node/elements/SVGElement.ts +16 -0
  512. package/src/node/elements/SVGRectElement.ts +74 -0
  513. package/src/node/elements/index.ts +186 -0
  514. package/src/node/index.ts +28 -0
  515. package/src/utils/CSSSelector.ts +360 -0
  516. package/src/window/Window.ts +715 -0
  517. package/src/window/WindowBase.ts +1018 -0
  518. package/src/window/index.ts +2 -0
  519. package/tsconfig.json +24 -0
package/package.json ADDED
@@ -0,0 +1,120 @@
1
+ {
2
+ "name": "@dooboostore/dom-parser",
3
+ "version": "1.0.0",
4
+ "license": "MIT",
5
+ "type": "module",
6
+ "sideEffects": false,
7
+ "main": "./dist/cjs/index.js",
8
+ "module": "./dist/esm/index.js",
9
+ "types": "./dist/types/index.d.ts",
10
+ "browser": "./dist/esm-bundle/dooboostore-dom-parser.esm.js",
11
+ "unpkg": "./dist/umd-bundle/dooboostore-dom-parser.umd.js",
12
+ "jsdelivr": "./dist/umd-bundle/dooboostore-dom-parser.umd.js",
13
+ "typesVersions": {
14
+ "*": {
15
+ "*": [
16
+ "dist/types/*"
17
+ ]
18
+ }
19
+ },
20
+ "description": "A lightweight DOM parser for server-side HTML parsing and manipulation with advanced JavaScript expression support for modern framework templates",
21
+ "keywords": [
22
+ "dom",
23
+ "parser",
24
+ "html",
25
+ "server-side",
26
+ "dom-api",
27
+ "html-parser",
28
+ "dom-manipulation",
29
+ "jsdom-alternative",
30
+ "lightweight",
31
+ "typescript",
32
+ "node",
33
+ "browser",
34
+ "template",
35
+ "framework",
36
+ "javascript-expressions",
37
+ "ssr",
38
+ "template-parsing",
39
+ "framework-templates",
40
+ "arrow-functions",
41
+ "complex-expressions"
42
+ ],
43
+ "files": [
44
+ "dist",
45
+ "src",
46
+ "types.d.ts",
47
+ "LICENSE.md",
48
+ "README.MD",
49
+ "tsconfig.json"
50
+ ],
51
+ "publishConfig": {
52
+ "access": "public"
53
+ },
54
+ "exports": {
55
+ ".": {
56
+ "types": "./dist/types/index.d.ts",
57
+ "import": "./dist/esm/index.js",
58
+ "require": "./dist/cjs/index.js"
59
+ },
60
+ "./cjs": {
61
+ "types": "./dist/types/index.d.ts",
62
+ "require": "./dist/cjs/index.js"
63
+ },
64
+ "./esm": {
65
+ "types": "./dist/types/index.d.ts",
66
+ "import": "./dist/esm/index.js"
67
+ },
68
+ "./umd": "./dist/umd-bundle/dooboostore-dom-parser.umd.js",
69
+ "./esm-bundle": "./dist/esm-bundle/dooboostore-dom-parser.esm.js",
70
+ "./package.json": "./package.json"
71
+ },
72
+ "author": "dooboostore <dooboostore@gmail.com> (https://github.com/dooboostore)",
73
+ "contributors": [
74
+ "sewoo <sewooimda@nate.com> (https://github.com/sewoo)",
75
+ "SeoDH <adonis_84@naver.com> (https://github.com/SeoDH)",
76
+ "tkyung (https://github.com/tkyungDev)",
77
+ "Hoil-Gang (https://github.com/khl1154)",
78
+ "hwangsero (https://github.com/hwangsero)"
79
+ ],
80
+ "homepage": "https://github.com/dooboostore-develop/packages",
81
+ "bugs": {
82
+ "url": "https://github.com/dooboostore-develop/packages",
83
+ "email": "dooboostore@gmail.com"
84
+ },
85
+ "repository": {
86
+ "type": "git",
87
+ "url": "https://github.com/dooboostore-develop/packages"
88
+ },
89
+ "engines": {
90
+ "node": ">=16.0.0"
91
+ },
92
+ "dependencies": {},
93
+ "devDependencies": {
94
+ "@types/jest": "^26.0.22",
95
+ "@typescript-eslint/eslint-plugin": "^4.16.1",
96
+ "@typescript-eslint/parser": "^4.16.1",
97
+ "tslib": "^2.8.1",
98
+ "@types/node": "^20",
99
+ "typescript": "^5.9.2",
100
+ "esbuild-plugin-tsc": "^0.5.0",
101
+ "esbuild": "^0.23.0"
102
+ },
103
+ "scripts": {
104
+ "clean": "rm -rf dist",
105
+ "build:esm": "node build.mjs esm",
106
+ "watch:esm": "pnpm run build:esm && node build.mjs esm --watch",
107
+ "build:cjs": "node build.mjs cjs",
108
+ "watch:cjs": "pnpm run build:cjs && node build.mjs cjs --watch",
109
+ "build": "pnpm run clean && node build.mjs all",
110
+ "build:umd-bundle": "node build.mjs umd-bundle",
111
+ "watch:umd-bundle": "pnpm run build:umd-bundle && node build.mjs umd-bundle --watch",
112
+ "build:esm-bundle": "node build.mjs esm-bundle",
113
+ "watch:esm-bundle": "pnpm run build:esm-bundle && node build.mjs esm-bundle --watch",
114
+ "watch": "node build.mjs all --watch",
115
+ "publish:npm": "pnpm run build && cp package.json package.json.back && pnpm pack && TARBALL_NAME=$(ls dooboostore-dom-parser-*.tgz | head -n 1) && tar -xzf \"$TARBALL_NAME\" -C . --strip-components=1 package/package.json && rm \"$TARBALL_NAME\" && (pnpm publish --no-git-checks || true) && cp package.json.back package.json && rm -rf package.json.back",
116
+ "ts:clean": "find . -name '*.js' -o -name '*.map' -o -name '*.d.ts' | xargs rm -f",
117
+ "typecheck": "pnpm exec tsc --noEmit",
118
+ "test": "echo test"
119
+ }
120
+ }
@@ -0,0 +1,491 @@
1
+ import { DocumentBase } from './node/DocumentBase';
2
+ import { TextBase } from './node/TextBase';
3
+ import { Comment } from './node/Comment';
4
+ import { WindowBase } from './window/WindowBase';
5
+
6
+ export interface DomParserOptions {
7
+ href?: string;
8
+ }
9
+
10
+ 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
+ }
35
+
36
+ get window(): Window {
37
+ return this._window;
38
+ }
39
+
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
+ }
56
+
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
+ }
70
+ }
71
+
72
+ parseHTML(html: string): void {
73
+ // Simple HTML parsing implementation
74
+ if (!html.trim()) {
75
+ return;
76
+ }
77
+
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);
81
+ }
82
+
83
+ private parseHTMLString(html: string, parent: any): void {
84
+ // Remove DOCTYPE if present
85
+ html = html.replace(/<!DOCTYPE[^>]*>/i, '').trim();
86
+
87
+ if (!html) return;
88
+
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');
93
+
94
+ // Parse attributes
95
+ if (attributes.trim()) {
96
+ this.parseAttributes(attributes, element);
97
+ }
98
+
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
+ }
104
+
105
+ parent.appendChild(element);
106
+ return ''; // Remove from HTML string
107
+ });
108
+
109
+ // Improved HTML parsing with proper nesting support
110
+ this.parseHTMLRecursive(html, parent);
111
+ }
112
+
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
+ }
129
+
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
+ }
138
+
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
+ }
156
+
157
+ // Find tag end
158
+ const tagEnd = html.indexOf('>', tagStart);
159
+ if (tagEnd === -1) break;
160
+
161
+ const tagContent = html.substring(tagStart + 1, tagEnd);
162
+
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
+ }
169
+
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
+ }
182
+
183
+
184
+
185
+ // Create element
186
+ const element = this.document.createElement(tagName.toLowerCase());
187
+
188
+
189
+
190
+ // Parse attributes
191
+ if (attributes.trim()) {
192
+ this.parseAttributes(attributes, element);
193
+ }
194
+
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
+ }
217
+
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;
223
+
224
+ while (pos < html.length && depth > 0) {
225
+ const nextOpen = html.indexOf(openTag, pos);
226
+ const nextClose = html.indexOf(closeTag, pos);
227
+
228
+ if (nextClose === -1) {
229
+ // No more closing tags
230
+ return -1;
231
+ }
232
+
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
+ }
245
+ }
246
+
247
+ return -1;
248
+ }
249
+
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;
254
+
255
+ while (position < length) {
256
+ // Skip whitespace
257
+ while (position < length && /\s/.test(attributeString[position])) {
258
+ position++;
259
+ }
260
+
261
+ if (position >= length) break;
262
+
263
+ // Find attribute name
264
+ const nameStart = position;
265
+ while (position < length && /[\w:-]/.test(attributeString[position])) {
266
+ position++;
267
+ }
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++;
280
+ }
281
+
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
+ }
320
+
321
+ // Decode HTML entities in attribute values
322
+ value = this.decodeHTMLEntities(value);
323
+
324
+ element.setAttribute(name, value);
325
+ }
326
+ }
327
+
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
+ });
380
+ }
381
+
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());
385
+ }
386
+
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;
489
+ }
490
+ }
491
+ }
@@ -0,0 +1,69 @@
1
+ import { HTMLElementBase, HTMLGenericElement, htmlElements, svgElements, mathmlElements } from '../node/elements';
2
+
3
+ /**
4
+ * Factory for creating HTML elements based on tag names
5
+ */
6
+ export class ElementFactory {
7
+ /**
8
+ * Creates an HTML element based on the tag name
9
+ */
10
+ static createElement(tagName: string, ownerDocument?: any): HTMLElementBase {
11
+ const normalizedTagName = tagName.toLowerCase();
12
+
13
+ // Check HTML elements
14
+ for (const [tag, ElementClass] of Object.entries(htmlElements)) {
15
+ if (tag === normalizedTagName) {
16
+ return new ElementClass(tagName.toUpperCase(), ownerDocument) as HTMLElementBase;
17
+ }
18
+ }
19
+
20
+ // Check SVG elements
21
+ for (const [tag, ElementClass] of Object.entries(svgElements)) {
22
+ if (tag === normalizedTagName) {
23
+ return new ElementClass(tagName.toUpperCase(), ownerDocument) as HTMLElementBase;
24
+ }
25
+ }
26
+
27
+ // Check MathML elements
28
+ for (const [tag, ElementClass] of Object.entries(mathmlElements)) {
29
+ if (tag === normalizedTagName) {
30
+ return new ElementClass(tagName.toUpperCase(), ownerDocument) as HTMLElementBase;
31
+ }
32
+ }
33
+
34
+ // For unknown elements, create a generic HTMLElement
35
+ return new HTMLGenericElement(tagName.toUpperCase(), ownerDocument);
36
+ }
37
+
38
+ /**
39
+ * Get all supported HTML tag names
40
+ */
41
+ static getSupportedHTMLTagNames(): string[] {
42
+ return Object.keys(htmlElements);
43
+ }
44
+
45
+ /**
46
+ * Get all supported SVG tag names
47
+ */
48
+ static getSupportedSVGTagNames(): string[] {
49
+ return Object.keys(svgElements);
50
+ }
51
+
52
+ /**
53
+ * Get all supported MathML tag names
54
+ */
55
+ static getSupportedMathMLTagNames(): string[] {
56
+ return Object.keys(mathmlElements);
57
+ }
58
+
59
+ /**
60
+ * Get all supported tag names
61
+ */
62
+ static getSupportedTagNames(): string[] {
63
+ return [
64
+ ...ElementFactory.getSupportedHTMLTagNames(),
65
+ ...ElementFactory.getSupportedSVGTagNames(),
66
+ ...ElementFactory.getSupportedMathMLTagNames()
67
+ ];
68
+ }
69
+ }
@@ -0,0 +1 @@
1
+ export { ElementFactory } from './ElementFactory';