@happyvertical/smrt-content 0.30.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 (291) hide show
  1. package/AGENTS.md +194 -0
  2. package/CLAUDE.md +1 -0
  3. package/LICENSE +7 -0
  4. package/README.md +634 -0
  5. package/dist/__smrt-register__.d.ts +2 -0
  6. package/dist/__smrt-register__.d.ts.map +1 -0
  7. package/dist/asset-associable.d.ts +115 -0
  8. package/dist/asset-associable.d.ts.map +1 -0
  9. package/dist/body-format.d.ts +29 -0
  10. package/dist/body-format.d.ts.map +1 -0
  11. package/dist/body-format.js +604 -0
  12. package/dist/body-format.js.map +1 -0
  13. package/dist/content-asset.d.ts +17 -0
  14. package/dist/content-asset.d.ts.map +1 -0
  15. package/dist/content-assets.d.ts +10 -0
  16. package/dist/content-assets.d.ts.map +1 -0
  17. package/dist/content-chat-handlers.d.ts +115 -0
  18. package/dist/content-chat-handlers.d.ts.map +1 -0
  19. package/dist/content-chat-prompts.d.ts +3 -0
  20. package/dist/content-chat-prompts.d.ts.map +1 -0
  21. package/dist/content-chat-session.d.ts +26 -0
  22. package/dist/content-chat-session.d.ts.map +1 -0
  23. package/dist/content-contribution-attachment.d.ts +42 -0
  24. package/dist/content-contribution-attachment.d.ts.map +1 -0
  25. package/dist/content-contribution-attachments.d.ts +8 -0
  26. package/dist/content-contribution-attachments.d.ts.map +1 -0
  27. package/dist/content-contribution-config.d.ts +84 -0
  28. package/dist/content-contribution-config.d.ts.map +1 -0
  29. package/dist/content-contribution-revision.d.ts +38 -0
  30. package/dist/content-contribution-revision.d.ts.map +1 -0
  31. package/dist/content-contribution-revisions.d.ts +8 -0
  32. package/dist/content-contribution-revisions.d.ts.map +1 -0
  33. package/dist/content-contribution-type.d.ts +51 -0
  34. package/dist/content-contribution-type.d.ts.map +1 -0
  35. package/dist/content-contribution-types.d.ts +7 -0
  36. package/dist/content-contribution-types.d.ts.map +1 -0
  37. package/dist/content-contribution.d.ts +161 -0
  38. package/dist/content-contribution.d.ts.map +1 -0
  39. package/dist/content-contributions.d.ts +53 -0
  40. package/dist/content-contributions.d.ts.map +1 -0
  41. package/dist/content-contributor.d.ts +30 -0
  42. package/dist/content-contributor.d.ts.map +1 -0
  43. package/dist/content-contributors.d.ts +13 -0
  44. package/dist/content-contributors.d.ts.map +1 -0
  45. package/dist/content-correction.d.ts +39 -0
  46. package/dist/content-correction.d.ts.map +1 -0
  47. package/dist/content-corrections.d.ts +9 -0
  48. package/dist/content-corrections.d.ts.map +1 -0
  49. package/dist/content-editor-assistant.d.ts +68 -0
  50. package/dist/content-editor-assistant.d.ts.map +1 -0
  51. package/dist/content-editor-assistant.js +97 -0
  52. package/dist/content-editor-assistant.js.map +1 -0
  53. package/dist/content-feed-parser.d.ts +19 -0
  54. package/dist/content-feed-parser.d.ts.map +1 -0
  55. package/dist/content-feed-source.d.ts +52 -0
  56. package/dist/content-feed-source.d.ts.map +1 -0
  57. package/dist/content-feed-sources.d.ts +11 -0
  58. package/dist/content-feed-sources.d.ts.map +1 -0
  59. package/dist/content-feed-sync.d.ts +23 -0
  60. package/dist/content-feed-sync.d.ts.map +1 -0
  61. package/dist/content-governance-assignment.d.ts +42 -0
  62. package/dist/content-governance-assignment.d.ts.map +1 -0
  63. package/dist/content-governance-assignments.d.ts +11 -0
  64. package/dist/content-governance-assignments.d.ts.map +1 -0
  65. package/dist/content-governance-policies.d.ts +7 -0
  66. package/dist/content-governance-policies.d.ts.map +1 -0
  67. package/dist/content-governance-policy.d.ts +29 -0
  68. package/dist/content-governance-policy.d.ts.map +1 -0
  69. package/dist/content-governance-profile.d.ts +31 -0
  70. package/dist/content-governance-profile.d.ts.map +1 -0
  71. package/dist/content-governance-profiles.d.ts +7 -0
  72. package/dist/content-governance-profiles.d.ts.map +1 -0
  73. package/dist/content-governance.d.ts +188 -0
  74. package/dist/content-governance.d.ts.map +1 -0
  75. package/dist/content-prompts.d.ts +10 -0
  76. package/dist/content-prompts.d.ts.map +1 -0
  77. package/dist/content-reference.d.ts +17 -0
  78. package/dist/content-reference.d.ts.map +1 -0
  79. package/dist/content-references.d.ts +55 -0
  80. package/dist/content-references.d.ts.map +1 -0
  81. package/dist/content-review.d.ts +34 -0
  82. package/dist/content-review.d.ts.map +1 -0
  83. package/dist/content-reviews.d.ts +21 -0
  84. package/dist/content-reviews.d.ts.map +1 -0
  85. package/dist/content-transparency.d.ts +72 -0
  86. package/dist/content-transparency.d.ts.map +1 -0
  87. package/dist/content-types.d.ts +51 -0
  88. package/dist/content-types.d.ts.map +1 -0
  89. package/dist/content-version.d.ts +38 -0
  90. package/dist/content-version.d.ts.map +1 -0
  91. package/dist/content-versions.d.ts +16 -0
  92. package/dist/content-versions.d.ts.map +1 -0
  93. package/dist/content.d.ts +736 -0
  94. package/dist/content.d.ts.map +1 -0
  95. package/dist/contents.d.ts +292 -0
  96. package/dist/contents.d.ts.map +1 -0
  97. package/dist/database-utils.d.ts +3 -0
  98. package/dist/database-utils.d.ts.map +1 -0
  99. package/dist/index.d.ts +78 -0
  100. package/dist/index.d.ts.map +1 -0
  101. package/dist/index.js +11602 -0
  102. package/dist/index.js.map +1 -0
  103. package/dist/manifest.json +12308 -0
  104. package/dist/mock-smrt-client.d.ts +493 -0
  105. package/dist/mock-smrt-client.d.ts.map +1 -0
  106. package/dist/mock-smrt-client.js +390 -0
  107. package/dist/mock-smrt-client.js.map +1 -0
  108. package/dist/playground.d.ts +2 -0
  109. package/dist/playground.d.ts.map +1 -0
  110. package/dist/playground.js +454 -0
  111. package/dist/playground.js.map +1 -0
  112. package/dist/publish-readiness.d.ts +30 -0
  113. package/dist/publish-readiness.d.ts.map +1 -0
  114. package/dist/publish-readiness.js +74 -0
  115. package/dist/publish-readiness.js.map +1 -0
  116. package/dist/safe-remote-url.d.ts +52 -0
  117. package/dist/safe-remote-url.d.ts.map +1 -0
  118. package/dist/serialization.d.ts +78 -0
  119. package/dist/serialization.d.ts.map +1 -0
  120. package/dist/smrt-knowledge.json +6130 -0
  121. package/dist/svelte/api.d.ts +3 -0
  122. package/dist/svelte/api.d.ts.map +1 -0
  123. package/dist/svelte/api.js +10 -0
  124. package/dist/svelte/components/ArticleCard.svelte +159 -0
  125. package/dist/svelte/components/ArticleCard.svelte.d.ts +17 -0
  126. package/dist/svelte/components/ArticleCard.svelte.d.ts.map +1 -0
  127. package/dist/svelte/components/ArticleList.svelte +75 -0
  128. package/dist/svelte/components/ArticleList.svelte.d.ts +21 -0
  129. package/dist/svelte/components/ArticleList.svelte.d.ts.map +1 -0
  130. package/dist/svelte/components/ContentAgentChat.svelte +652 -0
  131. package/dist/svelte/components/ContentAgentChat.svelte.d.ts +17 -0
  132. package/dist/svelte/components/ContentAgentChat.svelte.d.ts.map +1 -0
  133. package/dist/svelte/components/ContentBodyEditor.svelte +1446 -0
  134. package/dist/svelte/components/ContentBodyEditor.svelte.d.ts +25 -0
  135. package/dist/svelte/components/ContentBodyEditor.svelte.d.ts.map +1 -0
  136. package/dist/svelte/components/ContentBodyRenderer.svelte +152 -0
  137. package/dist/svelte/components/ContentBodyRenderer.svelte.d.ts +10 -0
  138. package/dist/svelte/components/ContentBodyRenderer.svelte.d.ts.map +1 -0
  139. package/dist/svelte/components/ContentClaimAuditTool.svelte +441 -0
  140. package/dist/svelte/components/ContentClaimAuditTool.svelte.d.ts +12 -0
  141. package/dist/svelte/components/ContentClaimAuditTool.svelte.d.ts.map +1 -0
  142. package/dist/svelte/components/ContentContributionForm.svelte +226 -0
  143. package/dist/svelte/components/ContentContributionForm.svelte.d.ts +23 -0
  144. package/dist/svelte/components/ContentContributionForm.svelte.d.ts.map +1 -0
  145. package/dist/svelte/components/ContentContributionInbox.svelte +322 -0
  146. package/dist/svelte/components/ContentContributionInbox.svelte.d.ts +22 -0
  147. package/dist/svelte/components/ContentContributionInbox.svelte.d.ts.map +1 -0
  148. package/dist/svelte/components/ContentContributionPortal.svelte +182 -0
  149. package/dist/svelte/components/ContentContributionPortal.svelte.d.ts +12 -0
  150. package/dist/svelte/components/ContentContributionPortal.svelte.d.ts.map +1 -0
  151. package/dist/svelte/components/ContentContributionTypeManager.svelte +281 -0
  152. package/dist/svelte/components/ContentContributionTypeManager.svelte.d.ts +10 -0
  153. package/dist/svelte/components/ContentContributionTypeManager.svelte.d.ts.map +1 -0
  154. package/dist/svelte/components/ContentContributorManager.svelte +140 -0
  155. package/dist/svelte/components/ContentContributorManager.svelte.d.ts +10 -0
  156. package/dist/svelte/components/ContentContributorManager.svelte.d.ts.map +1 -0
  157. package/dist/svelte/components/ContentCorrectionsTool.svelte +361 -0
  158. package/dist/svelte/components/ContentCorrectionsTool.svelte.d.ts +11 -0
  159. package/dist/svelte/components/ContentCorrectionsTool.svelte.d.ts.map +1 -0
  160. package/dist/svelte/components/ContentEditor.svelte +2166 -0
  161. package/dist/svelte/components/ContentEditor.svelte.d.ts +26 -0
  162. package/dist/svelte/components/ContentEditor.svelte.d.ts.map +1 -0
  163. package/dist/svelte/components/ContentGovernanceAssignmentEditor.svelte +199 -0
  164. package/dist/svelte/components/ContentGovernanceAssignmentEditor.svelte.d.ts +11 -0
  165. package/dist/svelte/components/ContentGovernanceAssignmentEditor.svelte.d.ts.map +1 -0
  166. package/dist/svelte/components/ContentGovernanceManager.svelte +340 -0
  167. package/dist/svelte/components/ContentGovernanceManager.svelte.d.ts +11 -0
  168. package/dist/svelte/components/ContentGovernanceManager.svelte.d.ts.map +1 -0
  169. package/dist/svelte/components/ContentGovernancePanel.svelte +2244 -0
  170. package/dist/svelte/components/ContentGovernancePanel.svelte.d.ts +26 -0
  171. package/dist/svelte/components/ContentGovernancePanel.svelte.d.ts.map +1 -0
  172. package/dist/svelte/components/ContentGovernancePolicyEditor.svelte +110 -0
  173. package/dist/svelte/components/ContentGovernancePolicyEditor.svelte.d.ts +10 -0
  174. package/dist/svelte/components/ContentGovernancePolicyEditor.svelte.d.ts.map +1 -0
  175. package/dist/svelte/components/ContentGovernanceProfileEditor.svelte +185 -0
  176. package/dist/svelte/components/ContentGovernanceProfileEditor.svelte.d.ts +11 -0
  177. package/dist/svelte/components/ContentGovernanceProfileEditor.svelte.d.ts.map +1 -0
  178. package/dist/svelte/components/ContentGovernanceTool.svelte +56 -0
  179. package/dist/svelte/components/ContentGovernanceTool.svelte.d.ts +13 -0
  180. package/dist/svelte/components/ContentGovernanceTool.svelte.d.ts.map +1 -0
  181. package/dist/svelte/components/ContentImageBrowser.svelte +243 -0
  182. package/dist/svelte/components/ContentImageBrowser.svelte.d.ts +18 -0
  183. package/dist/svelte/components/ContentImageBrowser.svelte.d.ts.map +1 -0
  184. package/dist/svelte/components/ContentImageChooser.svelte +134 -0
  185. package/dist/svelte/components/ContentImageChooser.svelte.d.ts +11 -0
  186. package/dist/svelte/components/ContentImageChooser.svelte.d.ts.map +1 -0
  187. package/dist/svelte/components/ContentList.svelte +906 -0
  188. package/dist/svelte/components/ContentList.svelte.d.ts +16 -0
  189. package/dist/svelte/components/ContentList.svelte.d.ts.map +1 -0
  190. package/dist/svelte/components/ContentMetadataFields.svelte +107 -0
  191. package/dist/svelte/components/ContentMetadataFields.svelte.d.ts +8 -0
  192. package/dist/svelte/components/ContentMetadataFields.svelte.d.ts.map +1 -0
  193. package/dist/svelte/components/ContentReferencesPanel.svelte +221 -0
  194. package/dist/svelte/components/ContentReferencesPanel.svelte.d.ts +20 -0
  195. package/dist/svelte/components/ContentReferencesPanel.svelte.d.ts.map +1 -0
  196. package/dist/svelte/components/ContentReviewStatusTray.svelte +151 -0
  197. package/dist/svelte/components/ContentReviewStatusTray.svelte.d.ts +20 -0
  198. package/dist/svelte/components/ContentReviewStatusTray.svelte.d.ts.map +1 -0
  199. package/dist/svelte/components/ContentStatusFields.svelte +85 -0
  200. package/dist/svelte/components/ContentStatusFields.svelte.d.ts +8 -0
  201. package/dist/svelte/components/ContentStatusFields.svelte.d.ts.map +1 -0
  202. package/dist/svelte/components/ContentTitleField.svelte +54 -0
  203. package/dist/svelte/components/ContentTitleField.svelte.d.ts +10 -0
  204. package/dist/svelte/components/ContentTitleField.svelte.d.ts.map +1 -0
  205. package/dist/svelte/components/ContentTransparencyReport.svelte +322 -0
  206. package/dist/svelte/components/ContentTransparencyReport.svelte.d.ts +10 -0
  207. package/dist/svelte/components/ContentTransparencyReport.svelte.d.ts.map +1 -0
  208. package/dist/svelte/components/ContentTransparencyTool.svelte +314 -0
  209. package/dist/svelte/components/ContentTransparencyTool.svelte.d.ts +10 -0
  210. package/dist/svelte/components/ContentTransparencyTool.svelte.d.ts.map +1 -0
  211. package/dist/svelte/components/ContentVersionsTool.svelte +291 -0
  212. package/dist/svelte/components/ContentVersionsTool.svelte.d.ts +10 -0
  213. package/dist/svelte/components/ContentVersionsTool.svelte.d.ts.map +1 -0
  214. package/dist/svelte/components/GovernedContentEditor.svelte +409 -0
  215. package/dist/svelte/components/GovernedContentEditor.svelte.d.ts +35 -0
  216. package/dist/svelte/components/GovernedContentEditor.svelte.d.ts.map +1 -0
  217. package/dist/svelte/components/ImageThumbnail.cache.d.ts +14 -0
  218. package/dist/svelte/components/ImageThumbnail.cache.d.ts.map +1 -0
  219. package/dist/svelte/components/ImageThumbnail.cache.js +36 -0
  220. package/dist/svelte/components/ImageThumbnail.svelte +159 -0
  221. package/dist/svelte/components/ImageThumbnail.svelte.d.ts +8 -0
  222. package/dist/svelte/components/ImageThumbnail.svelte.d.ts.map +1 -0
  223. package/dist/svelte/components/Markdown.svelte +125 -0
  224. package/dist/svelte/components/Markdown.svelte.d.ts +11 -0
  225. package/dist/svelte/components/Markdown.svelte.d.ts.map +1 -0
  226. package/dist/svelte/content-editor-form.d.ts +63 -0
  227. package/dist/svelte/content-editor-form.d.ts.map +1 -0
  228. package/dist/svelte/content-editor-form.js +94 -0
  229. package/dist/svelte/content-editor-media.d.ts +12 -0
  230. package/dist/svelte/content-editor-media.d.ts.map +1 -0
  231. package/dist/svelte/content-editor-media.js +84 -0
  232. package/dist/svelte/content-editor-state.svelte.d.ts +35 -0
  233. package/dist/svelte/content-editor-state.svelte.d.ts.map +1 -0
  234. package/dist/svelte/content-editor-state.svelte.js +141 -0
  235. package/dist/svelte/governance-manager-client.d.ts +22 -0
  236. package/dist/svelte/governance-manager-client.d.ts.map +1 -0
  237. package/dist/svelte/governance-manager-client.js +1 -0
  238. package/dist/svelte/i18n.contribution.d.ts +57 -0
  239. package/dist/svelte/i18n.contribution.d.ts.map +1 -0
  240. package/dist/svelte/i18n.contribution.js +64 -0
  241. package/dist/svelte/i18n.editor.d.ts +71 -0
  242. package/dist/svelte/i18n.editor.d.ts.map +1 -0
  243. package/dist/svelte/i18n.editor.js +87 -0
  244. package/dist/svelte/i18n.governance.d.ts +66 -0
  245. package/dist/svelte/i18n.governance.d.ts.map +1 -0
  246. package/dist/svelte/i18n.governance.js +66 -0
  247. package/dist/svelte/i18n.routes.d.ts +66 -0
  248. package/dist/svelte/i18n.routes.d.ts.map +1 -0
  249. package/dist/svelte/i18n.routes.js +75 -0
  250. package/dist/svelte/i18n.tools.d.ts +81 -0
  251. package/dist/svelte/i18n.tools.d.ts.map +1 -0
  252. package/dist/svelte/i18n.tools.js +90 -0
  253. package/dist/svelte/index.d.ts +101 -0
  254. package/dist/svelte/index.d.ts.map +1 -0
  255. package/dist/svelte/index.js +63 -0
  256. package/dist/svelte/playground.d.ts +281 -0
  257. package/dist/svelte/playground.d.ts.map +1 -0
  258. package/dist/svelte/playground.js +438 -0
  259. package/dist/svelte/routes/ContentContributionsRoute.svelte +809 -0
  260. package/dist/svelte/routes/ContentContributionsRoute.svelte.d.ts +10 -0
  261. package/dist/svelte/routes/ContentContributionsRoute.svelte.d.ts.map +1 -0
  262. package/dist/svelte/routes/ContentFactsRoute.svelte +612 -0
  263. package/dist/svelte/routes/ContentFactsRoute.svelte.d.ts +11 -0
  264. package/dist/svelte/routes/ContentFactsRoute.svelte.d.ts.map +1 -0
  265. package/dist/svelte/routes/ContentGovernanceRoute.svelte +218 -0
  266. package/dist/svelte/routes/ContentGovernanceRoute.svelte.d.ts +10 -0
  267. package/dist/svelte/routes/ContentGovernanceRoute.svelte.d.ts.map +1 -0
  268. package/dist/svelte/routes/ContentWorkspaceRoute.svelte +431 -0
  269. package/dist/svelte/routes/ContentWorkspaceRoute.svelte.d.ts +12 -0
  270. package/dist/svelte/routes/ContentWorkspaceRoute.svelte.d.ts.map +1 -0
  271. package/dist/svelte/routes/PublishedArticleRoute.svelte +194 -0
  272. package/dist/svelte/routes/PublishedArticleRoute.svelte.d.ts +10 -0
  273. package/dist/svelte/routes/PublishedArticleRoute.svelte.d.ts.map +1 -0
  274. package/dist/svelte/routes/index.d.ts +8 -0
  275. package/dist/svelte/routes/index.d.ts.map +1 -0
  276. package/dist/svelte/routes/index.js +6 -0
  277. package/dist/svelte/routes/shared.d.ts +90 -0
  278. package/dist/svelte/routes/shared.d.ts.map +1 -0
  279. package/dist/svelte/routes/shared.js +104 -0
  280. package/dist/svelte/types.d.ts +69 -0
  281. package/dist/svelte/types.d.ts.map +1 -0
  282. package/dist/svelte/types.js +6 -0
  283. package/dist/thumbnail-generator.d.ts +174 -0
  284. package/dist/thumbnail-generator.d.ts.map +1 -0
  285. package/dist/ui.d.ts +10 -0
  286. package/dist/ui.d.ts.map +1 -0
  287. package/dist/ui.js +42 -0
  288. package/dist/ui.js.map +1 -0
  289. package/dist/utils.d.ts +18 -0
  290. package/dist/utils.d.ts.map +1 -0
  291. package/package.json +119 -0
@@ -0,0 +1,604 @@
1
+ const DEFAULT_CONTENT_BODY_FORMAT = "html";
2
+ const HTML_TAG_PATTERN = /<\/?(?:article|aside|blockquote|br|div|figure|figcaption|h[1-6]|hr|img|li|ol|p|pre|section|span|strong|em|b|i|u|a|ul|table|tbody|td|th|thead|tr)(?:\s[^>]*)?>/i;
3
+ const ATTR_BOUNDARY = "(?:([\\s/]+)|(?<=[\"'`]))";
4
+ function reemitSeparator(consumed) {
5
+ return consumed ? " " : "";
6
+ }
7
+ const URL_ATTRIBUTE_PATTERN = new RegExp(
8
+ `${ATTR_BOUNDARY}(href|src|xlink:href|formaction|action|poster)\\s*=\\s*("([^"]*)"|'([^']*)'|([^\\s>]+))`,
9
+ "gi"
10
+ );
11
+ const SRCSET_ATTRIBUTE_PATTERN = new RegExp(
12
+ `${ATTR_BOUNDARY}srcset\\s*=\\s*("([^"]*)"|'([^']*)'|([^\\s>]+))`,
13
+ "gi"
14
+ );
15
+ const BLOCK_TAGS = [
16
+ "address",
17
+ "article",
18
+ "aside",
19
+ "blockquote",
20
+ "div",
21
+ "dl",
22
+ "fieldset",
23
+ "figcaption",
24
+ "figure",
25
+ "footer",
26
+ "form",
27
+ "h1",
28
+ "h2",
29
+ "h3",
30
+ "h4",
31
+ "h5",
32
+ "h6",
33
+ "header",
34
+ "hr",
35
+ "li",
36
+ "main",
37
+ "nav",
38
+ "ol",
39
+ "p",
40
+ "pre",
41
+ "section",
42
+ "table",
43
+ "tbody",
44
+ "td",
45
+ "th",
46
+ "thead",
47
+ "tr",
48
+ "ul"
49
+ ];
50
+ function isContentBodyFormat(value) {
51
+ return value === "markdown" || value === "html";
52
+ }
53
+ function looksLikeHtml(value) {
54
+ return typeof value === "string" && HTML_TAG_PATTERN.test(value);
55
+ }
56
+ function resolveBodyFormat(format, body = "") {
57
+ if (isContentBodyFormat(format)) {
58
+ return format;
59
+ }
60
+ if (typeof format === "string" && isContentBodyFormat(format.toLowerCase())) {
61
+ return format.toLowerCase();
62
+ }
63
+ if (looksLikeHtml(body)) {
64
+ return "html";
65
+ }
66
+ return body ? "markdown" : DEFAULT_CONTENT_BODY_FORMAT;
67
+ }
68
+ function escapeHtml(value) {
69
+ return value.replace(/[&<>"']/g, (char) => {
70
+ switch (char) {
71
+ case "&":
72
+ return "&amp;";
73
+ case "<":
74
+ return "&lt;";
75
+ case ">":
76
+ return "&gt;";
77
+ case '"':
78
+ return "&quot;";
79
+ case "'":
80
+ return "&#39;";
81
+ default:
82
+ return char;
83
+ }
84
+ });
85
+ }
86
+ function escapeAttribute(value) {
87
+ return escapeHtml(value).replace(/`/g, "&#96;");
88
+ }
89
+ function decodeBasicEntities(value) {
90
+ const decodeCodePoint = (codePoint) => Number.isFinite(codePoint) && codePoint >= 0 && codePoint <= 1114111 ? String.fromCodePoint(codePoint) : "";
91
+ return value.replace(/&#x([0-9a-f]+);?/gi, (_match, hex) => {
92
+ const codePoint = Number.parseInt(hex, 16);
93
+ return decodeCodePoint(codePoint);
94
+ }).replace(/&#(\d+);?/g, (_match, decimal) => {
95
+ const codePoint = Number.parseInt(decimal, 10);
96
+ return decodeCodePoint(codePoint);
97
+ }).replace(/&nbsp;/gi, " ").replace(/&quot;/gi, '"').replace(/&#39;/gi, "'").replace(/&apos;/gi, "'").replace(/&lt;/gi, "<").replace(/&gt;/gi, ">").replace(/&amp;/gi, "&");
98
+ }
99
+ function sanitizeUrl(value) {
100
+ const trimmed = decodeBasicEntities(value).trim();
101
+ if (!trimmed) {
102
+ return "";
103
+ }
104
+ let compactScheme = "";
105
+ for (const char of trimmed) {
106
+ const code = char.charCodeAt(0);
107
+ if (code <= 31 || code === 127 || char.trim() === "") {
108
+ continue;
109
+ }
110
+ compactScheme += char.toLowerCase();
111
+ }
112
+ if (/^(?:javascript|vbscript):/.test(compactScheme)) {
113
+ return "#";
114
+ }
115
+ if (compactScheme.startsWith("data:") && !/^data:image\/(?:png|gif|jpe?g|webp);/.test(compactScheme)) {
116
+ return "#";
117
+ }
118
+ return trimmed;
119
+ }
120
+ function sanitizeSrcset(value) {
121
+ return decodeBasicEntities(value).split(",").map((candidate) => {
122
+ const parts = candidate.trim().split(/\s+/);
123
+ const url = sanitizeUrl(parts.shift() || "");
124
+ if (!url || url === "#") {
125
+ return "";
126
+ }
127
+ const descriptors = parts.filter(
128
+ (part) => /^(?:\d+(?:\.\d+)?x|\d+w)$/.test(part)
129
+ );
130
+ return [url, ...descriptors].join(" ");
131
+ }).filter(Boolean).join(", ");
132
+ }
133
+ function sanitizeStyle(value) {
134
+ const safeRules = [];
135
+ for (const rawRule of decodeBasicEntities(value).split(";")) {
136
+ const [rawName, ...rawValueParts] = rawRule.split(":");
137
+ const name = rawName?.trim().toLowerCase();
138
+ const ruleValue = rawValueParts.join(":").trim().toLowerCase();
139
+ if (!name || !ruleValue) {
140
+ continue;
141
+ }
142
+ if ((name === "width" || name === "max-width") && /^(?:\d{1,4}(?:\.\d+)?px|100%)$/.test(ruleValue)) {
143
+ safeRules.push(`${name}: ${ruleValue}`);
144
+ continue;
145
+ }
146
+ if (name === "height" && ruleValue === "auto") {
147
+ safeRules.push("height: auto");
148
+ }
149
+ }
150
+ return safeRules.join("; ");
151
+ }
152
+ function sanitizeHtml(value) {
153
+ if (!value || typeof value !== "string") {
154
+ return "";
155
+ }
156
+ let html = value;
157
+ html = html.replace(/<!--[\s\S]*?-->/g, "");
158
+ html = html.replace(
159
+ /<\s*(script|style|iframe|object|embed|link|meta|base|svg|math)\b[^>]*>[\s\S]*?<\s*\/\s*\1\s*>/gi,
160
+ ""
161
+ );
162
+ html = html.replace(
163
+ /<\s*(script|style|iframe|object|embed|link|meta|base|svg|math)\b[^>]*\/?>/gi,
164
+ ""
165
+ );
166
+ html = html.replace(
167
+ new RegExp(
168
+ `${ATTR_BOUNDARY}on[a-z]+\\s*=\\s*(?:"[^"]*"|'[^']*'|[^\\s>]*)`,
169
+ "gi"
170
+ ),
171
+ ""
172
+ );
173
+ html = html.replace(
174
+ new RegExp(
175
+ `${ATTR_BOUNDARY}data-smrt-(?:selected|moving|resizing)\\s*=\\s*(?:"[^"]*"|'[^']*'|[^\\s>]*)`,
176
+ "gi"
177
+ ),
178
+ ""
179
+ );
180
+ html = html.replace(
181
+ new RegExp(
182
+ `${ATTR_BOUNDARY}style\\s*=\\s*("([^"]*)"|'([^']*)'|([^\\s>]+))`,
183
+ "gi"
184
+ ),
185
+ (_match, separator, _raw, doubleValue = "", singleValue = "", bareValue = "") => {
186
+ const safeStyle = sanitizeStyle(doubleValue || singleValue || bareValue);
187
+ const sep = reemitSeparator(separator);
188
+ return safeStyle ? `${sep}style="${escapeAttribute(safeStyle)}"` : sep;
189
+ }
190
+ );
191
+ html = html.replace(
192
+ SRCSET_ATTRIBUTE_PATTERN,
193
+ (_match, separator, _raw, doubleValue = "", singleValue = "", bareValue = "") => {
194
+ const safeSrcset = sanitizeSrcset(
195
+ doubleValue || singleValue || bareValue
196
+ );
197
+ const sep = reemitSeparator(separator);
198
+ return safeSrcset ? `${sep}srcset="${escapeAttribute(safeSrcset)}"` : sep;
199
+ }
200
+ );
201
+ html = html.replace(
202
+ URL_ATTRIBUTE_PATTERN,
203
+ (_match, separator, name, _raw, doubleValue = "", singleValue = "", bareValue = "") => {
204
+ const quote = doubleValue ? '"' : singleValue ? "'" : '"';
205
+ const rawValue = doubleValue || singleValue || bareValue;
206
+ return `${reemitSeparator(separator)}${name}=${quote}${escapeAttribute(sanitizeUrl(rawValue))}${quote}`;
207
+ }
208
+ );
209
+ return html.trim();
210
+ }
211
+ function renderInlineMarkdown(value) {
212
+ let html = value;
213
+ html = html.replace(
214
+ /!\[([^\]]*)\]\(([^)\s]+)(?:\s+"([^"]*)")?\)/g,
215
+ (_match, alt, src, title = "") => {
216
+ const safeSrc = sanitizeUrl(src);
217
+ const safeAlt = escapeAttribute(decodeBasicEntities(alt));
218
+ const titleAttr = title ? ` title="${escapeAttribute(decodeBasicEntities(title))}"` : "";
219
+ return `<img src="${escapeAttribute(safeSrc)}" alt="${safeAlt}"${titleAttr}>`;
220
+ }
221
+ );
222
+ html = html.replace(
223
+ /\[([^\]]+)\]\(([^)\s]+)(?:\s+"([^"]*)")?\)/g,
224
+ (_match, label, href, title = "") => {
225
+ const titleAttr = title ? ` title="${escapeAttribute(decodeBasicEntities(title))}"` : "";
226
+ return `<a href="${escapeAttribute(sanitizeUrl(href))}"${titleAttr}>${label}</a>`;
227
+ }
228
+ );
229
+ html = html.replace(/`([^`]+)`/g, "<code>$1</code>");
230
+ html = html.replace(/\*\*([^*]+)\*\*/g, "<strong>$1</strong>");
231
+ html = html.replace(/\*([^*]+)\*/g, "<em>$1</em>");
232
+ return html;
233
+ }
234
+ function renderMarkdownToHtml(markdown) {
235
+ if (!markdown || typeof markdown !== "string") {
236
+ return "";
237
+ }
238
+ const lines = escapeHtml(markdown).split("\n");
239
+ const result = [];
240
+ let inList = false;
241
+ let inParagraph = false;
242
+ function closeParagraph() {
243
+ if (inParagraph) {
244
+ result.push("</p>");
245
+ inParagraph = false;
246
+ }
247
+ }
248
+ function closeList() {
249
+ if (inList) {
250
+ result.push("</ul>");
251
+ inList = false;
252
+ }
253
+ }
254
+ for (const line of lines) {
255
+ const trimmed = line.trim();
256
+ if (!trimmed) {
257
+ closeList();
258
+ closeParagraph();
259
+ continue;
260
+ }
261
+ const headingMatch = /^(#{1,3})\s+(.+)$/.exec(trimmed);
262
+ if (headingMatch) {
263
+ closeList();
264
+ closeParagraph();
265
+ const level = headingMatch[1].length;
266
+ result.push(
267
+ `<h${level}>${renderInlineMarkdown(headingMatch[2])}</h${level}>`
268
+ );
269
+ continue;
270
+ }
271
+ const listMatch = /^[-*]\s+(.+)$/.exec(trimmed);
272
+ if (listMatch) {
273
+ closeParagraph();
274
+ if (!inList) {
275
+ result.push("<ul>");
276
+ inList = true;
277
+ }
278
+ result.push(`<li>${renderInlineMarkdown(listMatch[1])}</li>`);
279
+ continue;
280
+ }
281
+ closeList();
282
+ if (!inParagraph) {
283
+ result.push("<p>");
284
+ inParagraph = true;
285
+ } else {
286
+ result.push("<br>");
287
+ }
288
+ result.push(renderInlineMarkdown(line));
289
+ }
290
+ closeList();
291
+ closeParagraph();
292
+ return sanitizeHtml(result.join("\n"));
293
+ }
294
+ function parseHtmlAttributes(value) {
295
+ const attributes = {};
296
+ value.replace(
297
+ /([:\w-]+)\s*=\s*("([^"]*)"|'([^']*)'|([^\s"'>]+))/g,
298
+ (_match, name, _raw, doubleValue = "", singleValue = "", bareValue = "") => {
299
+ attributes[name.toLowerCase()] = decodeBasicEntities(
300
+ doubleValue || singleValue || bareValue || ""
301
+ );
302
+ return "";
303
+ }
304
+ );
305
+ return attributes;
306
+ }
307
+ function normalizeImagePlacement(value) {
308
+ return value === "block" || value === "left" || value === "right" || value === "center" || value === "full" ? value : void 0;
309
+ }
310
+ function parseImageWidth(value) {
311
+ if (typeof value !== "string" && typeof value !== "number") {
312
+ return void 0;
313
+ }
314
+ const match = String(value).match(/(\d+(?:\.\d+)?)/);
315
+ if (!match) {
316
+ return void 0;
317
+ }
318
+ const width = Math.round(Number(match[1]));
319
+ return Number.isFinite(width) && width > 0 ? width : void 0;
320
+ }
321
+ function parseStyleWidth(value) {
322
+ if (typeof value !== "string") {
323
+ return void 0;
324
+ }
325
+ const match = value.match(
326
+ /(?:^|;)\s*(?:max-)?width\s*:\s*(\d+(?:\.\d+)?)px/i
327
+ );
328
+ if (!match) {
329
+ return void 0;
330
+ }
331
+ return parseImageWidth(match[1]);
332
+ }
333
+ function fallbackHtmlToMarkdown(html) {
334
+ let markdown = sanitizeHtml(html);
335
+ markdown = markdown.replace(/<img\b([^>]*)>/gi, (_match, attrs) => {
336
+ const parsed = parseHtmlAttributes(attrs);
337
+ const src = sanitizeUrl(parsed.src || "");
338
+ if (!src) {
339
+ return "";
340
+ }
341
+ return `
342
+
343
+ ![${parsed.alt || ""}](${src})
344
+
345
+ `;
346
+ });
347
+ markdown = markdown.replace(
348
+ /<a\b([^>]*)>([\s\S]*?)<\/a>/gi,
349
+ (_match, attrs, label) => {
350
+ const parsed = parseHtmlAttributes(attrs);
351
+ const href = sanitizeUrl(parsed.href || "");
352
+ const text = stripHtml(label).trim() || href;
353
+ return href ? `[${text}](${href})` : text;
354
+ }
355
+ );
356
+ markdown = markdown.replace(/<h1\b[^>]*>([\s\S]*?)<\/h1>/gi, "\n\n# $1\n\n");
357
+ markdown = markdown.replace(/<h2\b[^>]*>([\s\S]*?)<\/h2>/gi, "\n\n## $1\n\n");
358
+ markdown = markdown.replace(
359
+ /<h3\b[^>]*>([\s\S]*?)<\/h3>/gi,
360
+ "\n\n### $1\n\n"
361
+ );
362
+ markdown = markdown.replace(/<li\b[^>]*>([\s\S]*?)<\/li>/gi, "\n- $1");
363
+ markdown = markdown.replace(/<\/(?:p|div|section|article|ul|ol)>/gi, "\n\n");
364
+ markdown = markdown.replace(/<br\s*\/?>/gi, "\n");
365
+ markdown = markdown.replace(
366
+ /<(strong|b)\b[^>]*>([\s\S]*?)<\/\1>/gi,
367
+ "**$2**"
368
+ );
369
+ markdown = markdown.replace(/<(em|i)\b[^>]*>([\s\S]*?)<\/\1>/gi, "*$2*");
370
+ markdown = stripHtml(markdown);
371
+ return normalizeMarkdownWhitespace(markdown);
372
+ }
373
+ function stripHtml(value) {
374
+ return decodeBasicEntities(value.replace(/<[^>]*>/g, ""));
375
+ }
376
+ function normalizeMarkdownWhitespace(value) {
377
+ return decodeBasicEntities(value).replace(/\r\n?/g, "\n").replace(/[ \t]+\n/g, "\n").replace(/\n{3,}/g, "\n\n").trim();
378
+ }
379
+ const MARKDOWN_TEXT_NODE = 3;
380
+ const MARKDOWN_ELEMENT_NODE = 1;
381
+ function nodeToMarkdown(node) {
382
+ if (node.nodeType === MARKDOWN_TEXT_NODE) {
383
+ return node.textContent || "";
384
+ }
385
+ if (node.nodeType !== MARKDOWN_ELEMENT_NODE) {
386
+ return "";
387
+ }
388
+ const tag = node.tagName?.toLowerCase() || "";
389
+ const children = Array.from(node.childNodes || []).map(nodeToMarkdown).join("");
390
+ const trimmedChildren = children.trim();
391
+ switch (tag) {
392
+ case "br":
393
+ return "\n";
394
+ case "h1":
395
+ return `
396
+
397
+ # ${trimmedChildren}
398
+
399
+ `;
400
+ case "h2":
401
+ return `
402
+
403
+ ## ${trimmedChildren}
404
+
405
+ `;
406
+ case "h3":
407
+ return `
408
+
409
+ ### ${trimmedChildren}
410
+
411
+ `;
412
+ case "p":
413
+ return `
414
+
415
+ ${trimmedChildren}
416
+
417
+ `;
418
+ case "strong":
419
+ case "b":
420
+ return `**${trimmedChildren}**`;
421
+ case "em":
422
+ case "i":
423
+ return `*${trimmedChildren}*`;
424
+ case "code":
425
+ return `\`${trimmedChildren}\``;
426
+ case "a": {
427
+ const href = sanitizeUrl(node.getAttribute?.("href") || "");
428
+ return href ? `[${trimmedChildren || href}](${href})` : trimmedChildren;
429
+ }
430
+ case "img": {
431
+ const src = sanitizeUrl(node.getAttribute?.("src") || "");
432
+ if (!src) {
433
+ return "";
434
+ }
435
+ const alt = node.getAttribute?.("alt") || "";
436
+ return `
437
+
438
+ ![${alt}](${src})
439
+
440
+ `;
441
+ }
442
+ case "li":
443
+ return `- ${trimmedChildren}
444
+ `;
445
+ case "ul":
446
+ case "ol":
447
+ return `
448
+ ${children}
449
+ `;
450
+ default:
451
+ return BLOCK_TAGS.includes(tag) ? `
452
+
453
+ ${trimmedChildren}
454
+
455
+ ` : children;
456
+ }
457
+ }
458
+ function htmlToMarkdown(html) {
459
+ const sanitized = sanitizeHtml(html);
460
+ if (!sanitized) {
461
+ return "";
462
+ }
463
+ const Parser = globalThis.DOMParser;
464
+ if (typeof Parser !== "function") {
465
+ return fallbackHtmlToMarkdown(sanitized);
466
+ }
467
+ const parser = new Parser();
468
+ const document = parser.parseFromString(
469
+ `<body>${sanitized}</body>`,
470
+ "text/html"
471
+ );
472
+ const markdown = Array.from(
473
+ document.body?.childNodes || []
474
+ ).map(nodeToMarkdown).join("");
475
+ return normalizeMarkdownWhitespace(markdown);
476
+ }
477
+ function normalizeEditorHtml(html) {
478
+ const sanitized = sanitizeHtml(html);
479
+ if (!sanitized) {
480
+ return "";
481
+ }
482
+ return sanitized.replace(
483
+ /<p>\s*((?:<br\s*\/?>\s*)?<img\b[^>]*>(?:\s*<br\s*\/?>)?)\s*<\/p>/gi,
484
+ (_match, imageHtml) => imageHtml.replace(/^\s*<br\s*\/?>\s*|\s*<br\s*\/?>\s*$/gi, "")
485
+ );
486
+ }
487
+ function bodyToEditorHtml(body, format) {
488
+ return format === "markdown" ? normalizeEditorHtml(renderMarkdownToHtml(body || "")) : normalizeEditorHtml(body || "");
489
+ }
490
+ function editorHtmlToBody(html, format) {
491
+ return format === "markdown" ? htmlToMarkdown(html || "") : normalizeEditorHtml(html || "");
492
+ }
493
+ function extractBodyImages(body, format = resolveBodyFormat(void 0, body)) {
494
+ if (!body || typeof body !== "string") {
495
+ return [];
496
+ }
497
+ if (format === "markdown") {
498
+ const images2 = [];
499
+ body.replace(
500
+ /!\[([^\]]*)\]\(([^)\s]+)(?:\s+"([^"]*)")?\)/g,
501
+ (_match, alt, src, title = "") => {
502
+ const safeSrc = sanitizeUrl(src);
503
+ if (safeSrc) {
504
+ images2.push({
505
+ src: safeSrc,
506
+ alt: decodeBasicEntities(alt),
507
+ ...title ? { title: decodeBasicEntities(title) } : {},
508
+ index: images2.length
509
+ });
510
+ }
511
+ return "";
512
+ }
513
+ );
514
+ return images2;
515
+ }
516
+ const images = [];
517
+ const bodyWithoutFigures = body.replace(
518
+ /<figure\b([^>]*)>([\s\S]*?)<\/figure>/gi,
519
+ (_match, figureAttrs, figureContent) => {
520
+ const imageMatch = /<img\b([^>]*)>/i.exec(figureContent);
521
+ if (!imageMatch) {
522
+ return "";
523
+ }
524
+ const parsedFigure = parseHtmlAttributes(figureAttrs);
525
+ const parsedImage = parseHtmlAttributes(imageMatch[1] || "");
526
+ const src = sanitizeUrl(parsedImage.src || "");
527
+ if (src) {
528
+ const placement = normalizeImagePlacement(
529
+ parsedFigure["data-smrt-placement"] || parsedImage["data-smrt-placement"]
530
+ );
531
+ const width = parseImageWidth(
532
+ parsedFigure["data-smrt-width"] || parsedImage["data-smrt-width"]
533
+ ) || parseStyleWidth(parsedFigure.style) || parseStyleWidth(parsedImage.style);
534
+ images.push({
535
+ src,
536
+ alt: parsedImage.alt || "",
537
+ ...parsedImage.title ? { title: parsedImage.title } : {},
538
+ ...parsedImage["data-smrt-asset-id"] ? { assetId: parsedImage["data-smrt-asset-id"] } : {},
539
+ ...placement ? { placement } : {},
540
+ ...width ? { width } : {},
541
+ index: images.length
542
+ });
543
+ }
544
+ return "";
545
+ }
546
+ );
547
+ bodyWithoutFigures.replace(/<img\b([^>]*)>/gi, (_match, attrs) => {
548
+ const parsed = parseHtmlAttributes(attrs);
549
+ const src = sanitizeUrl(parsed.src || "");
550
+ if (src) {
551
+ const placement = normalizeImagePlacement(parsed["data-smrt-placement"]);
552
+ const width = parseImageWidth(parsed["data-smrt-width"]) || parseStyleWidth(parsed.style);
553
+ images.push({
554
+ src,
555
+ alt: parsed.alt || "",
556
+ ...parsed.title ? { title: parsed.title } : {},
557
+ ...parsed["data-smrt-asset-id"] ? { assetId: parsed["data-smrt-asset-id"] } : {},
558
+ ...placement ? { placement } : {},
559
+ ...width ? { width } : {},
560
+ index: images.length
561
+ });
562
+ }
563
+ return "";
564
+ });
565
+ return images;
566
+ }
567
+ function getImageSource(asset) {
568
+ return String(asset?.sourceUri || asset?.url || asset?.src || "");
569
+ }
570
+ function getImageAlt(asset) {
571
+ return String(asset?.alt || asset?.name || asset?.title || "Image");
572
+ }
573
+ function imageAssetToHtml(asset) {
574
+ const src = sanitizeUrl(getImageSource(asset));
575
+ if (!src) {
576
+ return "";
577
+ }
578
+ const assetId = asset?.id ? ` data-smrt-asset-id="${escapeAttribute(String(asset.id))}"` : "";
579
+ const width = Math.max(
580
+ 160,
581
+ Math.min(520, Math.round(Number(asset?.width) || 520))
582
+ );
583
+ return `<img src="${escapeAttribute(src)}" alt="${escapeAttribute(getImageAlt(asset))}"${assetId} data-smrt-inline-image="true" data-smrt-placement="block" data-smrt-width="${width}" style="width: ${width}px; max-width: 100%; height: auto">`;
584
+ }
585
+ export {
586
+ DEFAULT_CONTENT_BODY_FORMAT,
587
+ bodyToEditorHtml,
588
+ editorHtmlToBody,
589
+ escapeAttribute,
590
+ escapeHtml,
591
+ extractBodyImages,
592
+ getImageAlt,
593
+ getImageSource,
594
+ htmlToMarkdown,
595
+ imageAssetToHtml,
596
+ isContentBodyFormat,
597
+ looksLikeHtml,
598
+ normalizeEditorHtml,
599
+ renderMarkdownToHtml,
600
+ resolveBodyFormat,
601
+ sanitizeHtml,
602
+ stripHtml
603
+ };
604
+ //# sourceMappingURL=body-format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"body-format.js","sources":["../src/body-format.ts"],"sourcesContent":["export type ContentBodyFormat = 'markdown' | 'html';\nexport type ContentBodyImagePlacement =\n | 'block'\n | 'left'\n | 'right'\n | 'center'\n | 'full';\n\nexport interface ContentBodyImage {\n src: string;\n alt: string;\n title?: string;\n assetId?: string;\n placement?: ContentBodyImagePlacement;\n width?: number;\n index: number;\n}\n\nexport const DEFAULT_CONTENT_BODY_FORMAT: ContentBodyFormat = 'html';\n\nconst HTML_TAG_PATTERN =\n /<\\/?(?:article|aside|blockquote|br|div|figure|figcaption|h[1-6]|hr|img|li|ol|p|pre|section|span|strong|em|b|i|u|a|ul|table|tbody|td|th|thead|tr)(?:\\s[^>]*)?>/i;\n// HTML attribute boundary: the HTML5 tree builder starts a new attribute after\n// whitespace, `/`, OR the closing quote/backtick of the previous value. A naive\n// `\\s+`-only boundary lets `src=\"x\"onerror=\"...\"` survive sanitization because\n// `onerror` is glued to the preceding `\"` — the browser still parses it as a\n// separate (executing) attribute. Match either runs of whitespace/`/`\n// (captured in group 1 and consumed) OR a non-consuming lookbehind for a\n// quote/backtick (group 1 undefined; the char is the previous value's own\n// closing delimiter and must stay). `reemitSeparator()` turns the captured\n// group back into a single separating space when one was consumed (S5 #1388).\nconst ATTR_BOUNDARY = '(?:([\\\\s/]+)|(?<=[\"\\'`]))';\n\n// Re-emit an attribute separator after a removed/rewritten attribute. When the\n// boundary consumed whitespace/`/` (group 1 present), emit one space so the\n// rebuilt attribute doesn't glue onto the tag name or previous attribute. When\n// the boundary was a non-consumed quote/backtick (group 1 undefined), that\n// delimiter already separates the attributes, so emit nothing.\nfunction reemitSeparator(consumed: string | undefined): string {\n return consumed ? ' ' : '';\n}\n\nconst URL_ATTRIBUTE_PATTERN = new RegExp(\n `${ATTR_BOUNDARY}(href|src|xlink:href|formaction|action|poster)\\\\s*=\\\\s*(\"([^\"]*)\"|'([^']*)'|([^\\\\s>]+))`,\n 'gi',\n);\nconst SRCSET_ATTRIBUTE_PATTERN = new RegExp(\n `${ATTR_BOUNDARY}srcset\\\\s*=\\\\s*(\"([^\"]*)\"|'([^']*)'|([^\\\\s>]+))`,\n 'gi',\n);\n\nconst BLOCK_TAGS = [\n 'address',\n 'article',\n 'aside',\n 'blockquote',\n 'div',\n 'dl',\n 'fieldset',\n 'figcaption',\n 'figure',\n 'footer',\n 'form',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'header',\n 'hr',\n 'li',\n 'main',\n 'nav',\n 'ol',\n 'p',\n 'pre',\n 'section',\n 'table',\n 'tbody',\n 'td',\n 'th',\n 'thead',\n 'tr',\n 'ul',\n];\n\nexport function isContentBodyFormat(\n value: unknown,\n): value is ContentBodyFormat {\n return value === 'markdown' || value === 'html';\n}\n\nexport function looksLikeHtml(value: unknown): boolean {\n return typeof value === 'string' && HTML_TAG_PATTERN.test(value);\n}\n\nexport function resolveBodyFormat(\n format: unknown,\n body: unknown = '',\n): ContentBodyFormat {\n if (isContentBodyFormat(format)) {\n return format;\n }\n\n if (typeof format === 'string' && isContentBodyFormat(format.toLowerCase())) {\n return format.toLowerCase() as ContentBodyFormat;\n }\n\n if (looksLikeHtml(body)) {\n return 'html';\n }\n\n return body ? 'markdown' : DEFAULT_CONTENT_BODY_FORMAT;\n}\n\nexport function escapeHtml(value: string): string {\n return value.replace(/[&<>\"']/g, (char) => {\n switch (char) {\n case '&':\n return '&amp;';\n case '<':\n return '&lt;';\n case '>':\n return '&gt;';\n case '\"':\n return '&quot;';\n case \"'\":\n return '&#39;';\n default:\n return char;\n }\n });\n}\n\nexport function escapeAttribute(value: string): string {\n return escapeHtml(value).replace(/`/g, '&#96;');\n}\n\nfunction decodeBasicEntities(value: string): string {\n const decodeCodePoint = (codePoint: number) =>\n Number.isFinite(codePoint) && codePoint >= 0 && codePoint <= 0x10ffff\n ? String.fromCodePoint(codePoint)\n : '';\n\n return value\n .replace(/&#x([0-9a-f]+);?/gi, (_match, hex: string) => {\n const codePoint = Number.parseInt(hex, 16);\n return decodeCodePoint(codePoint);\n })\n .replace(/&#(\\d+);?/g, (_match, decimal: string) => {\n const codePoint = Number.parseInt(decimal, 10);\n return decodeCodePoint(codePoint);\n })\n .replace(/&nbsp;/gi, ' ')\n .replace(/&quot;/gi, '\"')\n .replace(/&#39;/gi, \"'\")\n .replace(/&apos;/gi, \"'\")\n .replace(/&lt;/gi, '<')\n .replace(/&gt;/gi, '>')\n .replace(/&amp;/gi, '&');\n}\n\nfunction sanitizeUrl(value: string): string {\n const trimmed = decodeBasicEntities(value).trim();\n if (!trimmed) {\n return '';\n }\n\n let compactScheme = '';\n for (const char of trimmed) {\n const code = char.charCodeAt(0);\n if (code <= 31 || code === 127 || char.trim() === '') {\n continue;\n }\n compactScheme += char.toLowerCase();\n }\n\n if (/^(?:javascript|vbscript):/.test(compactScheme)) {\n return '#';\n }\n\n if (\n compactScheme.startsWith('data:') &&\n !/^data:image\\/(?:png|gif|jpe?g|webp);/.test(compactScheme)\n ) {\n return '#';\n }\n\n return trimmed;\n}\n\nfunction sanitizeSrcset(value: string): string {\n return decodeBasicEntities(value)\n .split(',')\n .map((candidate) => {\n const parts = candidate.trim().split(/\\s+/);\n const url = sanitizeUrl(parts.shift() || '');\n if (!url || url === '#') {\n return '';\n }\n\n const descriptors = parts.filter((part) =>\n /^(?:\\d+(?:\\.\\d+)?x|\\d+w)$/.test(part),\n );\n return [url, ...descriptors].join(' ');\n })\n .filter(Boolean)\n .join(', ');\n}\n\nfunction sanitizeStyle(value: string): string {\n const safeRules: string[] = [];\n\n for (const rawRule of decodeBasicEntities(value).split(';')) {\n const [rawName, ...rawValueParts] = rawRule.split(':');\n const name = rawName?.trim().toLowerCase();\n const ruleValue = rawValueParts.join(':').trim().toLowerCase();\n\n if (!name || !ruleValue) {\n continue;\n }\n\n if (\n (name === 'width' || name === 'max-width') &&\n /^(?:\\d{1,4}(?:\\.\\d+)?px|100%)$/.test(ruleValue)\n ) {\n safeRules.push(`${name}: ${ruleValue}`);\n continue;\n }\n\n if (name === 'height' && ruleValue === 'auto') {\n safeRules.push('height: auto');\n }\n }\n\n return safeRules.join('; ');\n}\n\nexport function sanitizeHtml(value: string): string {\n if (!value || typeof value !== 'string') {\n return '';\n }\n\n let html = value;\n html = html.replace(/<!--[\\s\\S]*?-->/g, '');\n // This lightweight sanitizer intentionally removes SVG/MathML instead of\n // attempting namespace-aware SVG/MathML sanitization. Consumers needing rich\n // inline diagrams should run a dedicated sanitizer before storing content.\n html = html.replace(\n /<\\s*(script|style|iframe|object|embed|link|meta|base|svg|math)\\b[^>]*>[\\s\\S]*?<\\s*\\/\\s*\\1\\s*>/gi,\n '',\n );\n html = html.replace(\n /<\\s*(script|style|iframe|object|embed|link|meta|base|svg|math)\\b[^>]*\\/?>/gi,\n '',\n );\n // Drop event handlers (`onclick`, etc.) and internal editor markers entirely.\n // A consumed whitespace/`/` separator and a non-consumed quote boundary both\n // collapse to nothing: the attribute that follows (if any) keeps its own\n // leading boundary, so removal never needs to leave a separator behind.\n html = html.replace(\n new RegExp(\n `${ATTR_BOUNDARY}on[a-z]+\\\\s*=\\\\s*(?:\"[^\"]*\"|'[^']*'|[^\\\\s>]*)`,\n 'gi',\n ),\n '',\n );\n html = html.replace(\n new RegExp(\n `${ATTR_BOUNDARY}data-smrt-(?:selected|moving|resizing)\\\\s*=\\\\s*(?:\"[^\"]*\"|'[^']*'|[^\\\\s>]*)`,\n 'gi',\n ),\n '',\n );\n html = html.replace(\n new RegExp(\n `${ATTR_BOUNDARY}style\\\\s*=\\\\s*(\"([^\"]*)\"|'([^']*)'|([^\\\\s>]+))`,\n 'gi',\n ),\n (\n _match,\n separator: string | undefined,\n _raw: string,\n doubleValue = '',\n singleValue = '',\n bareValue = '',\n ) => {\n const safeStyle = sanitizeStyle(doubleValue || singleValue || bareValue);\n const sep = reemitSeparator(separator);\n return safeStyle ? `${sep}style=\"${escapeAttribute(safeStyle)}\"` : sep;\n },\n );\n html = html.replace(\n SRCSET_ATTRIBUTE_PATTERN,\n (\n _match,\n separator: string | undefined,\n _raw: string,\n doubleValue = '',\n singleValue = '',\n bareValue = '',\n ) => {\n const safeSrcset = sanitizeSrcset(\n doubleValue || singleValue || bareValue,\n );\n const sep = reemitSeparator(separator);\n return safeSrcset ? `${sep}srcset=\"${escapeAttribute(safeSrcset)}\"` : sep;\n },\n );\n html = html.replace(\n URL_ATTRIBUTE_PATTERN,\n (\n _match,\n separator: string | undefined,\n name: string,\n _raw: string,\n doubleValue = '',\n singleValue = '',\n bareValue = '',\n ) => {\n const quote = doubleValue ? '\"' : singleValue ? \"'\" : '\"';\n const rawValue = doubleValue || singleValue || bareValue;\n return `${reemitSeparator(separator)}${name}=${quote}${escapeAttribute(sanitizeUrl(rawValue))}${quote}`;\n },\n );\n\n return html.trim();\n}\n\nfunction renderInlineMarkdown(value: string): string {\n let html = value;\n\n html = html.replace(\n /!\\[([^\\]]*)\\]\\(([^)\\s]+)(?:\\s+\"([^\"]*)\")?\\)/g,\n (_match, alt: string, src: string, title = '') => {\n const safeSrc = sanitizeUrl(src);\n const safeAlt = escapeAttribute(decodeBasicEntities(alt));\n const titleAttr = title\n ? ` title=\"${escapeAttribute(decodeBasicEntities(title))}\"`\n : '';\n return `<img src=\"${escapeAttribute(safeSrc)}\" alt=\"${safeAlt}\"${titleAttr}>`;\n },\n );\n html = html.replace(\n /\\[([^\\]]+)\\]\\(([^)\\s]+)(?:\\s+\"([^\"]*)\")?\\)/g,\n (_match, label: string, href: string, title = '') => {\n const titleAttr = title\n ? ` title=\"${escapeAttribute(decodeBasicEntities(title))}\"`\n : '';\n return `<a href=\"${escapeAttribute(sanitizeUrl(href))}\"${titleAttr}>${label}</a>`;\n },\n );\n html = html.replace(/`([^`]+)`/g, '<code>$1</code>');\n html = html.replace(/\\*\\*([^*]+)\\*\\*/g, '<strong>$1</strong>');\n html = html.replace(/\\*([^*]+)\\*/g, '<em>$1</em>');\n\n return html;\n}\n\nexport function renderMarkdownToHtml(markdown: string): string {\n if (!markdown || typeof markdown !== 'string') {\n return '';\n }\n\n const lines = escapeHtml(markdown).split('\\n');\n const result: string[] = [];\n let inList = false;\n let inParagraph = false;\n\n function closeParagraph() {\n if (inParagraph) {\n result.push('</p>');\n inParagraph = false;\n }\n }\n\n function closeList() {\n if (inList) {\n result.push('</ul>');\n inList = false;\n }\n }\n\n for (const line of lines) {\n const trimmed = line.trim();\n\n if (!trimmed) {\n closeList();\n closeParagraph();\n continue;\n }\n\n const headingMatch = /^(#{1,3})\\s+(.+)$/.exec(trimmed);\n if (headingMatch) {\n closeList();\n closeParagraph();\n const level = headingMatch[1].length;\n result.push(\n `<h${level}>${renderInlineMarkdown(headingMatch[2])}</h${level}>`,\n );\n continue;\n }\n\n const listMatch = /^[-*]\\s+(.+)$/.exec(trimmed);\n if (listMatch) {\n closeParagraph();\n if (!inList) {\n result.push('<ul>');\n inList = true;\n }\n result.push(`<li>${renderInlineMarkdown(listMatch[1])}</li>`);\n continue;\n }\n\n closeList();\n if (!inParagraph) {\n result.push('<p>');\n inParagraph = true;\n } else {\n result.push('<br>');\n }\n result.push(renderInlineMarkdown(line));\n }\n\n closeList();\n closeParagraph();\n\n return sanitizeHtml(result.join('\\n'));\n}\n\nfunction parseHtmlAttributes(value: string): Record<string, string> {\n const attributes: Record<string, string> = {};\n value.replace(\n /([:\\w-]+)\\s*=\\s*(\"([^\"]*)\"|'([^']*)'|([^\\s\"'>]+))/g,\n (\n _match,\n name: string,\n _raw: string,\n doubleValue = '',\n singleValue = '',\n bareValue = '',\n ) => {\n attributes[name.toLowerCase()] = decodeBasicEntities(\n doubleValue || singleValue || bareValue || '',\n );\n return '';\n },\n );\n return attributes;\n}\n\nfunction normalizeImagePlacement(\n value: unknown,\n): ContentBodyImagePlacement | undefined {\n return value === 'block' ||\n value === 'left' ||\n value === 'right' ||\n value === 'center' ||\n value === 'full'\n ? value\n : undefined;\n}\n\nfunction parseImageWidth(value: unknown): number | undefined {\n if (typeof value !== 'string' && typeof value !== 'number') {\n return undefined;\n }\n\n const match = String(value).match(/(\\d+(?:\\.\\d+)?)/);\n if (!match) {\n return undefined;\n }\n\n const width = Math.round(Number(match[1]));\n return Number.isFinite(width) && width > 0 ? width : undefined;\n}\n\nfunction parseStyleWidth(value: unknown): number | undefined {\n if (typeof value !== 'string') {\n return undefined;\n }\n\n const match = value.match(\n /(?:^|;)\\s*(?:max-)?width\\s*:\\s*(\\d+(?:\\.\\d+)?)px/i,\n );\n if (!match) {\n return undefined;\n }\n\n return parseImageWidth(match[1]);\n}\n\nfunction fallbackHtmlToMarkdown(html: string): string {\n let markdown = sanitizeHtml(html);\n\n markdown = markdown.replace(/<img\\b([^>]*)>/gi, (_match, attrs: string) => {\n const parsed = parseHtmlAttributes(attrs);\n const src = sanitizeUrl(parsed.src || '');\n if (!src) {\n return '';\n }\n return `\\n\\n![${parsed.alt || ''}](${src})\\n\\n`;\n });\n markdown = markdown.replace(\n /<a\\b([^>]*)>([\\s\\S]*?)<\\/a>/gi,\n (_match, attrs: string, label: string) => {\n const parsed = parseHtmlAttributes(attrs);\n const href = sanitizeUrl(parsed.href || '');\n const text = stripHtml(label).trim() || href;\n return href ? `[${text}](${href})` : text;\n },\n );\n markdown = markdown.replace(/<h1\\b[^>]*>([\\s\\S]*?)<\\/h1>/gi, '\\n\\n# $1\\n\\n');\n markdown = markdown.replace(/<h2\\b[^>]*>([\\s\\S]*?)<\\/h2>/gi, '\\n\\n## $1\\n\\n');\n markdown = markdown.replace(\n /<h3\\b[^>]*>([\\s\\S]*?)<\\/h3>/gi,\n '\\n\\n### $1\\n\\n',\n );\n markdown = markdown.replace(/<li\\b[^>]*>([\\s\\S]*?)<\\/li>/gi, '\\n- $1');\n markdown = markdown.replace(/<\\/(?:p|div|section|article|ul|ol)>/gi, '\\n\\n');\n markdown = markdown.replace(/<br\\s*\\/?>/gi, '\\n');\n markdown = markdown.replace(\n /<(strong|b)\\b[^>]*>([\\s\\S]*?)<\\/\\1>/gi,\n '**$2**',\n );\n markdown = markdown.replace(/<(em|i)\\b[^>]*>([\\s\\S]*?)<\\/\\1>/gi, '*$2*');\n markdown = stripHtml(markdown);\n\n return normalizeMarkdownWhitespace(markdown);\n}\n\nexport function stripHtml(value: string): string {\n return decodeBasicEntities(value.replace(/<[^>]*>/g, ''));\n}\n\nfunction normalizeMarkdownWhitespace(value: string): string {\n return decodeBasicEntities(value)\n .replace(/\\r\\n?/g, '\\n')\n .replace(/[ \\t]+\\n/g, '\\n')\n .replace(/\\n{3,}/g, '\\n\\n')\n .trim();\n}\n\nconst MARKDOWN_TEXT_NODE = 3;\nconst MARKDOWN_ELEMENT_NODE = 1;\n\ninterface MarkdownDomNode {\n nodeType: number;\n textContent?: string | null;\n childNodes?: ArrayLike<MarkdownDomNode>;\n tagName?: string;\n getAttribute?: (name: string) => string | null;\n}\n\nfunction nodeToMarkdown(node: MarkdownDomNode): string {\n if (node.nodeType === MARKDOWN_TEXT_NODE) {\n return node.textContent || '';\n }\n\n if (node.nodeType !== MARKDOWN_ELEMENT_NODE) {\n return '';\n }\n\n const tag = node.tagName?.toLowerCase() || '';\n const children = Array.from(node.childNodes || [])\n .map(nodeToMarkdown)\n .join('');\n const trimmedChildren = children.trim();\n\n switch (tag) {\n case 'br':\n return '\\n';\n case 'h1':\n return `\\n\\n# ${trimmedChildren}\\n\\n`;\n case 'h2':\n return `\\n\\n## ${trimmedChildren}\\n\\n`;\n case 'h3':\n return `\\n\\n### ${trimmedChildren}\\n\\n`;\n case 'p':\n return `\\n\\n${trimmedChildren}\\n\\n`;\n case 'strong':\n case 'b':\n return `**${trimmedChildren}**`;\n case 'em':\n case 'i':\n return `*${trimmedChildren}*`;\n case 'code':\n return `\\`${trimmedChildren}\\``;\n case 'a': {\n const href = sanitizeUrl(node.getAttribute?.('href') || '');\n return href ? `[${trimmedChildren || href}](${href})` : trimmedChildren;\n }\n case 'img': {\n const src = sanitizeUrl(node.getAttribute?.('src') || '');\n if (!src) {\n return '';\n }\n const alt = node.getAttribute?.('alt') || '';\n return `\\n\\n![${alt}](${src})\\n\\n`;\n }\n case 'li':\n return `- ${trimmedChildren}\\n`;\n case 'ul':\n case 'ol':\n return `\\n${children}\\n`;\n default:\n return BLOCK_TAGS.includes(tag) ? `\\n\\n${trimmedChildren}\\n\\n` : children;\n }\n}\n\nexport function htmlToMarkdown(html: string): string {\n const sanitized = sanitizeHtml(html);\n if (!sanitized) {\n return '';\n }\n\n const Parser = (globalThis as Record<string, any>).DOMParser;\n if (typeof Parser !== 'function') {\n return fallbackHtmlToMarkdown(sanitized);\n }\n\n const parser = new Parser();\n const document = parser.parseFromString(\n `<body>${sanitized}</body>`,\n 'text/html',\n );\n const markdown = Array.from(\n (document.body?.childNodes || []) as ArrayLike<MarkdownDomNode>,\n )\n .map(nodeToMarkdown)\n .join('');\n\n return normalizeMarkdownWhitespace(markdown);\n}\n\nexport function normalizeEditorHtml(html: string): string {\n const sanitized = sanitizeHtml(html);\n if (!sanitized) {\n return '';\n }\n\n return sanitized.replace(\n /<p>\\s*((?:<br\\s*\\/?>\\s*)?<img\\b[^>]*>(?:\\s*<br\\s*\\/?>)?)\\s*<\\/p>/gi,\n (_match, imageHtml: string) =>\n imageHtml.replace(/^\\s*<br\\s*\\/?>\\s*|\\s*<br\\s*\\/?>\\s*$/gi, ''),\n );\n}\n\nexport function bodyToEditorHtml(\n body: string,\n format: ContentBodyFormat,\n): string {\n return format === 'markdown'\n ? normalizeEditorHtml(renderMarkdownToHtml(body || ''))\n : normalizeEditorHtml(body || '');\n}\n\nexport function editorHtmlToBody(\n html: string,\n format: ContentBodyFormat,\n): string {\n return format === 'markdown'\n ? htmlToMarkdown(html || '')\n : normalizeEditorHtml(html || '');\n}\n\nexport function extractBodyImages(\n body: string,\n format: ContentBodyFormat = resolveBodyFormat(undefined, body),\n): ContentBodyImage[] {\n if (!body || typeof body !== 'string') {\n return [];\n }\n\n if (format === 'markdown') {\n const images: ContentBodyImage[] = [];\n body.replace(\n /!\\[([^\\]]*)\\]\\(([^)\\s]+)(?:\\s+\"([^\"]*)\")?\\)/g,\n (_match, alt: string, src: string, title = '') => {\n const safeSrc = sanitizeUrl(src);\n if (safeSrc) {\n images.push({\n src: safeSrc,\n alt: decodeBasicEntities(alt),\n ...(title ? { title: decodeBasicEntities(title) } : {}),\n index: images.length,\n });\n }\n return '';\n },\n );\n return images;\n }\n\n const images: ContentBodyImage[] = [];\n const bodyWithoutFigures = body.replace(\n /<figure\\b([^>]*)>([\\s\\S]*?)<\\/figure>/gi,\n (_match, figureAttrs: string, figureContent: string) => {\n const imageMatch = /<img\\b([^>]*)>/i.exec(figureContent);\n if (!imageMatch) {\n return '';\n }\n\n const parsedFigure = parseHtmlAttributes(figureAttrs);\n const parsedImage = parseHtmlAttributes(imageMatch[1] || '');\n const src = sanitizeUrl(parsedImage.src || '');\n if (src) {\n const placement = normalizeImagePlacement(\n parsedFigure['data-smrt-placement'] ||\n parsedImage['data-smrt-placement'],\n );\n const width =\n parseImageWidth(\n parsedFigure['data-smrt-width'] || parsedImage['data-smrt-width'],\n ) ||\n parseStyleWidth(parsedFigure.style) ||\n parseStyleWidth(parsedImage.style);\n images.push({\n src,\n alt: parsedImage.alt || '',\n ...(parsedImage.title ? { title: parsedImage.title } : {}),\n ...(parsedImage['data-smrt-asset-id']\n ? { assetId: parsedImage['data-smrt-asset-id'] }\n : {}),\n ...(placement ? { placement } : {}),\n ...(width ? { width } : {}),\n index: images.length,\n });\n }\n\n return '';\n },\n );\n\n bodyWithoutFigures.replace(/<img\\b([^>]*)>/gi, (_match, attrs: string) => {\n const parsed = parseHtmlAttributes(attrs);\n const src = sanitizeUrl(parsed.src || '');\n if (src) {\n const placement = normalizeImagePlacement(parsed['data-smrt-placement']);\n const width =\n parseImageWidth(parsed['data-smrt-width']) ||\n parseStyleWidth(parsed.style);\n images.push({\n src,\n alt: parsed.alt || '',\n ...(parsed.title ? { title: parsed.title } : {}),\n ...(parsed['data-smrt-asset-id']\n ? { assetId: parsed['data-smrt-asset-id'] }\n : {}),\n ...(placement ? { placement } : {}),\n ...(width ? { width } : {}),\n index: images.length,\n });\n }\n return '';\n });\n\n return images;\n}\n\nexport function getImageSource(asset: any): string {\n return String(asset?.sourceUri || asset?.url || asset?.src || '');\n}\n\nexport function getImageAlt(asset: any): string {\n return String(asset?.alt || asset?.name || asset?.title || 'Image');\n}\n\nexport function imageAssetToHtml(asset: any): string {\n const src = sanitizeUrl(getImageSource(asset));\n if (!src) {\n return '';\n }\n\n const assetId = asset?.id\n ? ` data-smrt-asset-id=\"${escapeAttribute(String(asset.id))}\"`\n : '';\n const width = Math.max(\n 160,\n Math.min(520, Math.round(Number(asset?.width) || 520)),\n );\n\n return `<img src=\"${escapeAttribute(src)}\" alt=\"${escapeAttribute(getImageAlt(asset))}\"${assetId} data-smrt-inline-image=\"true\" data-smrt-placement=\"block\" data-smrt-width=\"${width}\" style=\"width: ${width}px; max-width: 100%; height: auto\">`;\n}\n"],"names":["images"],"mappings":"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"}