@x15ventures/x15-ui-library 3.19.0 → 3.20.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 (484) hide show
  1. package/THIRD_PARTY_LICENSES.md +11182 -0
  2. package/dist/cjs/autoGenerated/libraryThemes.js +12 -12
  3. package/dist/cjs/autoGenerated/libraryThemes.js.map +1 -1
  4. package/dist/cjs/autoGenerated/libraryThemes.json +12 -12
  5. package/dist/cjs/components/design/banners/pageBanner/PageBanner.js +27 -12
  6. package/dist/cjs/components/design/banners/pageBanner/PageBanner.js.map +1 -1
  7. package/dist/cjs/components/design/card/cardHeader/CardHeaderItem.js +22 -15
  8. package/dist/cjs/components/design/card/cardHeader/CardHeaderItem.js.map +1 -1
  9. package/dist/cjs/components/design/dialog/dialog.css +4 -0
  10. package/dist/cjs/components/design/logos/LogoLink.js +2 -1
  11. package/dist/cjs/components/design/logos/LogoLink.js.map +1 -1
  12. package/dist/cjs/components/design/logos/VentureLogo.js +2 -1
  13. package/dist/cjs/components/design/logos/VentureLogo.js.map +1 -1
  14. package/dist/cjs/components/design/revealMore/RevealMoreBelow.js +2 -2
  15. package/dist/cjs/components/design/revealMore/RevealMoreBelow.js.map +1 -1
  16. package/dist/cjs/components/design/skeleton/Skeleton.js +15 -5
  17. package/dist/cjs/components/design/skeleton/Skeleton.js.map +1 -1
  18. package/dist/cjs/components/design/themeLoader/ThemeLoader.js +1 -1
  19. package/dist/cjs/components/design/themeLoader/ThemeLoader.js.map +1 -1
  20. package/dist/cjs/components/form/buttons/SimpleButton.js +3 -1
  21. package/dist/cjs/components/form/buttons/SimpleButton.js.map +1 -1
  22. package/dist/cjs/components/form/buttons/button.interface.js.map +1 -1
  23. package/dist/cjs/components/form/buttons/userPicButton/UserPicButton.js +5 -3
  24. package/dist/cjs/components/form/buttons/userPicButton/UserPicButton.js.map +1 -1
  25. package/dist/cjs/components/form/formFields/subComponents/inputs/file/dragAndDrop/DragAndDropFileUpload.js +64 -19
  26. package/dist/cjs/components/form/formFields/subComponents/inputs/file/dragAndDrop/DragAndDropFileUpload.js.map +1 -1
  27. package/dist/cjs/components/navigation/link/Link.js +2 -1
  28. package/dist/cjs/components/navigation/link/Link.js.map +1 -1
  29. package/dist/cjs/components/testing/devToolbar/DevToolbar.js +5 -3
  30. package/dist/cjs/components/testing/devToolbar/DevToolbar.js.map +1 -1
  31. package/dist/cjs/constants/fileUploadTypes.js +9 -4
  32. package/dist/cjs/constants/fileUploadTypes.js.map +1 -1
  33. package/dist/cjs/helpers/dateHelpers.js +34 -23
  34. package/dist/cjs/helpers/dateHelpers.js.map +1 -1
  35. package/dist/cjs/helpers/fileHelpers.js +58 -0
  36. package/dist/cjs/helpers/fileHelpers.js.map +1 -0
  37. package/dist/cjs/helpers/index.js +44 -0
  38. package/dist/cjs/helpers/index.js.map +1 -1
  39. package/dist/cjs/helpers/interactionsHelper.js +8 -1
  40. package/dist/cjs/helpers/interactionsHelper.js.map +1 -1
  41. package/dist/cjs/helpers/objectHelpers.js +23 -9
  42. package/dist/cjs/helpers/objectHelpers.js.map +1 -1
  43. package/dist/cjs/helpers/stringHelpers.js +61 -5
  44. package/dist/cjs/helpers/stringHelpers.js.map +1 -1
  45. package/dist/cjs/helpers/urlHelpers.js +48 -0
  46. package/dist/cjs/helpers/urlHelpers.js.map +1 -0
  47. package/dist/cjs/index.js +191 -0
  48. package/dist/cjs/index.js.map +1 -1
  49. package/dist/cjs/package.json +3 -305
  50. package/dist/cjs/styles/index.css +18 -0
  51. package/dist/cjs/styles/variables/cssVars/_designVariables.css +18 -0
  52. package/dist/cjs/widgets/documentComments/DocumentComments.js +305 -0
  53. package/dist/cjs/widgets/documentComments/DocumentComments.js.map +1 -0
  54. package/dist/cjs/widgets/documentComments/_documentCommentsVariables.css +0 -0
  55. package/dist/cjs/widgets/documentComments/documentComments.css +107 -0
  56. package/dist/cjs/widgets/documentComments/documentComments.interfaces.js +6 -0
  57. package/dist/cjs/widgets/documentComments/documentComments.interfaces.js.map +1 -0
  58. package/dist/cjs/widgets/documentComments/index.js +19 -0
  59. package/dist/cjs/widgets/documentComments/index.js.map +1 -0
  60. package/dist/cjs/widgets/documentComparer/DocumentComparer.js +309 -0
  61. package/dist/cjs/widgets/documentComparer/DocumentComparer.js.map +1 -0
  62. package/dist/cjs/widgets/documentComparer/_documentComparerVariables.css +0 -0
  63. package/dist/cjs/widgets/documentComparer/documentComparer.css +117 -0
  64. package/dist/cjs/widgets/documentComparer/documentComparer.interfaces.js +6 -0
  65. package/dist/cjs/widgets/documentComparer/documentComparer.interfaces.js.map +1 -0
  66. package/dist/cjs/widgets/documentComparer/index.js +19 -0
  67. package/dist/cjs/widgets/documentComparer/index.js.map +1 -0
  68. package/dist/cjs/widgets/documentEditor/DocumentEditor.js +142 -0
  69. package/dist/cjs/widgets/documentEditor/DocumentEditor.js.map +1 -0
  70. package/dist/cjs/widgets/documentEditor/_documentEditorVariables.css +0 -0
  71. package/dist/cjs/widgets/documentEditor/documentEditor.css +33 -0
  72. package/dist/cjs/widgets/documentEditor/documentEditor.interfaces.js +6 -0
  73. package/dist/cjs/widgets/documentEditor/documentEditor.interfaces.js.map +1 -0
  74. package/dist/cjs/widgets/documentEditor/index.js +19 -0
  75. package/dist/cjs/widgets/documentEditor/index.js.map +1 -0
  76. package/dist/cjs/widgets/documentViewer/DocumentViewer.js +206 -0
  77. package/dist/cjs/widgets/documentViewer/DocumentViewer.js.map +1 -0
  78. package/dist/cjs/widgets/documentViewer/_documentViewerVariables.css +0 -0
  79. package/dist/cjs/widgets/documentViewer/documentViewer.css +82 -0
  80. package/dist/cjs/widgets/documentViewer/documentViewer.interfaces.js +6 -0
  81. package/dist/cjs/widgets/documentViewer/documentViewer.interfaces.js.map +1 -0
  82. package/dist/cjs/widgets/documentViewer/index.js +19 -0
  83. package/dist/cjs/widgets/documentViewer/index.js.map +1 -0
  84. package/dist/cjs/widgets/index.js +126 -0
  85. package/dist/cjs/widgets/index.js.map +1 -1
  86. package/dist/cjs/widgets/shared/documents/ToggleGroup.js +32 -0
  87. package/dist/cjs/widgets/shared/documents/ToggleGroup.js.map +1 -0
  88. package/dist/cjs/widgets/shared/documents/_documentVariables.css +0 -0
  89. package/dist/cjs/widgets/shared/documents/annotations/AnnotationLayer.js +279 -0
  90. package/dist/cjs/widgets/shared/documents/annotations/AnnotationLayer.js.map +1 -0
  91. package/dist/cjs/widgets/shared/documents/annotations/_annotationLayerVariables.css +0 -0
  92. package/dist/cjs/widgets/shared/documents/annotations/annotationLayer.css +65 -0
  93. package/dist/cjs/widgets/shared/documents/annotations/annotations.interfaces.js +21 -0
  94. package/dist/cjs/widgets/shared/documents/annotations/annotations.interfaces.js.map +1 -0
  95. package/dist/cjs/widgets/shared/documents/annotations/highlightRegistry.js +67 -0
  96. package/dist/cjs/widgets/shared/documents/annotations/highlightRegistry.js.map +1 -0
  97. package/dist/cjs/widgets/shared/documents/annotations/index.js +39 -0
  98. package/dist/cjs/widgets/shared/documents/annotations/index.js.map +1 -0
  99. package/dist/cjs/widgets/shared/documents/annotations/textIndex.js +112 -0
  100. package/dist/cjs/widgets/shared/documents/annotations/textIndex.js.map +1 -0
  101. package/dist/cjs/widgets/shared/documents/annotations/textQuoteAnchor.js +160 -0
  102. package/dist/cjs/widgets/shared/documents/annotations/textQuoteAnchor.js.map +1 -0
  103. package/dist/cjs/widgets/shared/documents/documentHelpers.js +186 -0
  104. package/dist/cjs/widgets/shared/documents/documentHelpers.js.map +1 -0
  105. package/dist/cjs/widgets/shared/documents/documents.interfaces.js +6 -0
  106. package/dist/cjs/widgets/shared/documents/documents.interfaces.js.map +1 -0
  107. package/dist/cjs/widgets/shared/documents/engines/documentDiff/DocumentDiff.js +73 -0
  108. package/dist/cjs/widgets/shared/documents/engines/documentDiff/DocumentDiff.js.map +1 -0
  109. package/dist/cjs/widgets/shared/documents/engines/documentDiff/_documentDiffVariables.css +0 -0
  110. package/dist/cjs/widgets/shared/documents/engines/documentDiff/buildDocumentDiff.js +114 -0
  111. package/dist/cjs/widgets/shared/documents/engines/documentDiff/buildDocumentDiff.js.map +1 -0
  112. package/dist/cjs/widgets/shared/documents/engines/documentDiff/documentDiff.css +69 -0
  113. package/dist/cjs/widgets/shared/documents/engines/documentDiff/documentDiff.interfaces.js +6 -0
  114. package/dist/cjs/widgets/shared/documents/engines/documentDiff/documentDiff.interfaces.js.map +1 -0
  115. package/dist/cjs/widgets/shared/documents/engines/lazyEngines.js +19 -0
  116. package/dist/cjs/widgets/shared/documents/engines/lazyEngines.js.map +1 -0
  117. package/dist/cjs/widgets/shared/documents/engines/markdownEditor/MarkdownEditorEngine.js +200 -0
  118. package/dist/cjs/widgets/shared/documents/engines/markdownEditor/MarkdownEditorEngine.js.map +1 -0
  119. package/dist/cjs/widgets/shared/documents/engines/markdownEditor/_markdownEditorEngineVariables.css +0 -0
  120. package/dist/cjs/widgets/shared/documents/engines/markdownEditor/markdownEditorEngine.css +50 -0
  121. package/dist/cjs/widgets/shared/documents/engines/markdownEditor/markdownEditorEngine.interfaces.js +6 -0
  122. package/dist/cjs/widgets/shared/documents/engines/markdownEditor/markdownEditorEngine.interfaces.js.map +1 -0
  123. package/dist/cjs/widgets/shared/documents/engines/markdownEditor/markdownTextIndex.js +179 -0
  124. package/dist/cjs/widgets/shared/documents/engines/markdownEditor/markdownTextIndex.js.map +1 -0
  125. package/dist/cjs/widgets/shared/documents/engines/markdownEditor/sanitizeForMdx.js +278 -0
  126. package/dist/cjs/widgets/shared/documents/engines/markdownEditor/sanitizeForMdx.js.map +1 -0
  127. package/dist/cjs/widgets/shared/documents/engines/markdownEditor/sourceAnnotations.js +208 -0
  128. package/dist/cjs/widgets/shared/documents/engines/markdownEditor/sourceAnnotations.js.map +1 -0
  129. package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/MarkdownRenderer.js +85 -0
  130. package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/MarkdownRenderer.js.map +1 -0
  131. package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/_markdownRendererVariables.css +0 -0
  132. package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/markdownRenderer.css +78 -0
  133. package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/plugins/index.js +64 -0
  134. package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/plugins/index.js.map +1 -0
  135. package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/plugins/markdownNode.interfaces.js +6 -0
  136. package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/plugins/markdownNode.interfaces.js.map +1 -0
  137. package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/plugins/rehypeTableCleanup.js +71 -0
  138. package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/plugins/rehypeTableCleanup.js.map +1 -0
  139. package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/plugins/remarkPlugins.js +192 -0
  140. package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/plugins/remarkPlugins.js.map +1 -0
  141. package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/plugins/remarkSafeTables.js +86 -0
  142. package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/plugins/remarkSafeTables.js.map +1 -0
  143. package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/plugins/tableHelpers.js +38 -0
  144. package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/plugins/tableHelpers.js.map +1 -0
  145. package/dist/cjs/widgets/shared/documents/engines/wordRenderer/WordRenderer.js +49 -0
  146. package/dist/cjs/widgets/shared/documents/engines/wordRenderer/WordRenderer.js.map +1 -0
  147. package/dist/cjs/widgets/shared/documents/engines/wordRenderer/renderWordDocument.js +214 -0
  148. package/dist/cjs/widgets/shared/documents/engines/wordRenderer/renderWordDocument.js.map +1 -0
  149. package/dist/cjs/widgets/shared/documents/engines/wordRenderer/wordPreviewNumbering.js +112 -0
  150. package/dist/cjs/widgets/shared/documents/engines/wordRenderer/wordPreviewNumbering.js.map +1 -0
  151. package/dist/cjs/widgets/shared/documents/engines/wordRenderer/wordXml.js +68 -0
  152. package/dist/cjs/widgets/shared/documents/engines/wordRenderer/wordXml.js.map +1 -0
  153. package/dist/cjs/widgets/shared/documents/index.js +50 -0
  154. package/dist/cjs/widgets/shared/documents/index.js.map +1 -0
  155. package/dist/cjs/widgets/shared/documents/toggleGroup.css +8 -0
  156. package/dist/cjs/widgets/shared/documents/useDocumentContent.js +222 -0
  157. package/dist/cjs/widgets/shared/documents/useDocumentContent.js.map +1 -0
  158. package/dist/components/design/banners/pageBanner/PageBanner.d.ts.map +1 -1
  159. package/dist/components/design/card/cardHeader/CardHeaderItem.d.ts.map +1 -1
  160. package/dist/components/design/logos/LogoLink.d.ts.map +1 -1
  161. package/dist/components/design/logos/VentureLogo.d.ts.map +1 -1
  162. package/dist/components/design/skeleton/Skeleton.d.ts +1 -1
  163. package/dist/components/design/skeleton/Skeleton.d.ts.map +1 -1
  164. package/dist/components/design/themeLoader/ThemeLoader.d.ts.map +1 -1
  165. package/dist/components/form/buttons/SimpleButton.d.ts.map +1 -1
  166. package/dist/components/form/buttons/button.interface.d.ts +1 -0
  167. package/dist/components/form/buttons/button.interface.d.ts.map +1 -1
  168. package/dist/components/form/buttons/userPicButton/UserPicButton.d.ts.map +1 -1
  169. package/dist/components/form/formFields/subComponents/inputs/file/dragAndDrop/DragAndDropFileUpload.d.ts.map +1 -1
  170. package/dist/components/navigation/link/Link.d.ts.map +1 -1
  171. package/dist/components/testing/devToolbar/DevToolbar.d.ts.map +1 -1
  172. package/dist/constants/fileUploadTypes.d.ts.map +1 -1
  173. package/dist/esm/autoGenerated/libraryThemes.js +12 -12
  174. package/dist/esm/autoGenerated/libraryThemes.js.map +1 -1
  175. package/dist/esm/autoGenerated/libraryThemes.json +12 -12
  176. package/dist/esm/components/design/banners/pageBanner/PageBanner.js +27 -12
  177. package/dist/esm/components/design/banners/pageBanner/PageBanner.js.map +1 -1
  178. package/dist/esm/components/design/card/cardHeader/CardHeaderItem.js +22 -15
  179. package/dist/esm/components/design/card/cardHeader/CardHeaderItem.js.map +1 -1
  180. package/dist/esm/components/design/dialog/dialog.css +4 -0
  181. package/dist/esm/components/design/logos/LogoLink.js +2 -1
  182. package/dist/esm/components/design/logos/LogoLink.js.map +1 -1
  183. package/dist/esm/components/design/logos/VentureLogo.js +2 -1
  184. package/dist/esm/components/design/logos/VentureLogo.js.map +1 -1
  185. package/dist/esm/components/design/revealMore/RevealMoreBelow.js +1 -1
  186. package/dist/esm/components/design/revealMore/RevealMoreBelow.js.map +1 -1
  187. package/dist/esm/components/design/skeleton/Skeleton.js +15 -5
  188. package/dist/esm/components/design/skeleton/Skeleton.js.map +1 -1
  189. package/dist/esm/components/design/themeLoader/ThemeLoader.js +1 -1
  190. package/dist/esm/components/design/themeLoader/ThemeLoader.js.map +1 -1
  191. package/dist/esm/components/form/buttons/SimpleButton.js +3 -1
  192. package/dist/esm/components/form/buttons/SimpleButton.js.map +1 -1
  193. package/dist/esm/components/form/buttons/button.interface.js.map +1 -1
  194. package/dist/esm/components/form/buttons/userPicButton/UserPicButton.js +5 -3
  195. package/dist/esm/components/form/buttons/userPicButton/UserPicButton.js.map +1 -1
  196. package/dist/esm/components/form/formFields/subComponents/inputs/file/dragAndDrop/DragAndDropFileUpload.js +65 -19
  197. package/dist/esm/components/form/formFields/subComponents/inputs/file/dragAndDrop/DragAndDropFileUpload.js.map +1 -1
  198. package/dist/esm/components/navigation/link/Link.js +2 -1
  199. package/dist/esm/components/navigation/link/Link.js.map +1 -1
  200. package/dist/esm/components/testing/devToolbar/DevToolbar.js +5 -3
  201. package/dist/esm/components/testing/devToolbar/DevToolbar.js.map +1 -1
  202. package/dist/esm/constants/fileUploadTypes.js +9 -4
  203. package/dist/esm/constants/fileUploadTypes.js.map +1 -1
  204. package/dist/esm/helpers/dateHelpers.js +34 -23
  205. package/dist/esm/helpers/dateHelpers.js.map +1 -1
  206. package/dist/esm/helpers/fileHelpers.js +48 -0
  207. package/dist/esm/helpers/fileHelpers.js.map +1 -0
  208. package/dist/esm/helpers/index.js +2 -0
  209. package/dist/esm/helpers/index.js.map +1 -1
  210. package/dist/esm/helpers/interactionsHelper.js +5 -0
  211. package/dist/esm/helpers/interactionsHelper.js.map +1 -1
  212. package/dist/esm/helpers/objectHelpers.js +23 -9
  213. package/dist/esm/helpers/objectHelpers.js.map +1 -1
  214. package/dist/esm/helpers/stringHelpers.js +61 -5
  215. package/dist/esm/helpers/stringHelpers.js.map +1 -1
  216. package/dist/esm/helpers/urlHelpers.js +40 -0
  217. package/dist/esm/helpers/urlHelpers.js.map +1 -0
  218. package/dist/esm/index.js +3 -1
  219. package/dist/esm/index.js.map +1 -1
  220. package/dist/esm/package.json +2 -304
  221. package/dist/esm/styles/index.css +18 -0
  222. package/dist/esm/styles/variables/cssVars/_designVariables.css +18 -0
  223. package/dist/esm/widgets/documentComments/DocumentComments.js +298 -0
  224. package/dist/esm/widgets/documentComments/DocumentComments.js.map +1 -0
  225. package/dist/esm/widgets/documentComments/_documentCommentsVariables.css +0 -0
  226. package/dist/esm/widgets/documentComments/documentComments.css +107 -0
  227. package/dist/esm/widgets/documentComments/documentComments.interfaces.js +2 -0
  228. package/dist/esm/widgets/documentComments/documentComments.interfaces.js.map +1 -0
  229. package/dist/esm/widgets/documentComments/index.js +2 -0
  230. package/dist/esm/widgets/documentComments/index.js.map +1 -0
  231. package/dist/esm/widgets/documentComparer/DocumentComparer.js +301 -0
  232. package/dist/esm/widgets/documentComparer/DocumentComparer.js.map +1 -0
  233. package/dist/esm/widgets/documentComparer/_documentComparerVariables.css +0 -0
  234. package/dist/esm/widgets/documentComparer/documentComparer.css +117 -0
  235. package/dist/esm/widgets/documentComparer/documentComparer.interfaces.js +2 -0
  236. package/dist/esm/widgets/documentComparer/documentComparer.interfaces.js.map +1 -0
  237. package/dist/esm/widgets/documentComparer/index.js +2 -0
  238. package/dist/esm/widgets/documentComparer/index.js.map +1 -0
  239. package/dist/esm/widgets/documentEditor/DocumentEditor.js +135 -0
  240. package/dist/esm/widgets/documentEditor/DocumentEditor.js.map +1 -0
  241. package/dist/esm/widgets/documentEditor/_documentEditorVariables.css +0 -0
  242. package/dist/esm/widgets/documentEditor/documentEditor.css +33 -0
  243. package/dist/esm/widgets/documentEditor/documentEditor.interfaces.js +2 -0
  244. package/dist/esm/widgets/documentEditor/documentEditor.interfaces.js.map +1 -0
  245. package/dist/esm/widgets/documentEditor/index.js +2 -0
  246. package/dist/esm/widgets/documentEditor/index.js.map +1 -0
  247. package/dist/esm/widgets/documentViewer/DocumentViewer.js +198 -0
  248. package/dist/esm/widgets/documentViewer/DocumentViewer.js.map +1 -0
  249. package/dist/esm/widgets/documentViewer/_documentViewerVariables.css +0 -0
  250. package/dist/esm/widgets/documentViewer/documentViewer.css +82 -0
  251. package/dist/esm/widgets/documentViewer/documentViewer.interfaces.js +2 -0
  252. package/dist/esm/widgets/documentViewer/documentViewer.interfaces.js.map +1 -0
  253. package/dist/esm/widgets/documentViewer/index.js +2 -0
  254. package/dist/esm/widgets/documentViewer/index.js.map +1 -0
  255. package/dist/esm/widgets/index.js +6 -0
  256. package/dist/esm/widgets/index.js.map +1 -1
  257. package/dist/esm/widgets/shared/documents/ToggleGroup.js +24 -0
  258. package/dist/esm/widgets/shared/documents/ToggleGroup.js.map +1 -0
  259. package/dist/esm/widgets/shared/documents/_documentVariables.css +0 -0
  260. package/dist/esm/widgets/shared/documents/annotations/AnnotationLayer.js +273 -0
  261. package/dist/esm/widgets/shared/documents/annotations/AnnotationLayer.js.map +1 -0
  262. package/dist/esm/widgets/shared/documents/annotations/_annotationLayerVariables.css +0 -0
  263. package/dist/esm/widgets/shared/documents/annotations/annotationLayer.css +65 -0
  264. package/dist/esm/widgets/shared/documents/annotations/annotations.interfaces.js +14 -0
  265. package/dist/esm/widgets/shared/documents/annotations/annotations.interfaces.js.map +1 -0
  266. package/dist/esm/widgets/shared/documents/annotations/highlightRegistry.js +58 -0
  267. package/dist/esm/widgets/shared/documents/annotations/highlightRegistry.js.map +1 -0
  268. package/dist/esm/widgets/shared/documents/annotations/index.js +4 -0
  269. package/dist/esm/widgets/shared/documents/annotations/index.js.map +1 -0
  270. package/dist/esm/widgets/shared/documents/annotations/textIndex.js +103 -0
  271. package/dist/esm/widgets/shared/documents/annotations/textIndex.js.map +1 -0
  272. package/dist/esm/widgets/shared/documents/annotations/textQuoteAnchor.js +150 -0
  273. package/dist/esm/widgets/shared/documents/annotations/textQuoteAnchor.js.map +1 -0
  274. package/dist/esm/widgets/shared/documents/documentHelpers.js +168 -0
  275. package/dist/esm/widgets/shared/documents/documentHelpers.js.map +1 -0
  276. package/dist/esm/widgets/shared/documents/documents.interfaces.js +2 -0
  277. package/dist/esm/widgets/shared/documents/documents.interfaces.js.map +1 -0
  278. package/dist/esm/widgets/shared/documents/engines/documentDiff/DocumentDiff.js +65 -0
  279. package/dist/esm/widgets/shared/documents/engines/documentDiff/DocumentDiff.js.map +1 -0
  280. package/dist/esm/widgets/shared/documents/engines/documentDiff/_documentDiffVariables.css +0 -0
  281. package/dist/esm/widgets/shared/documents/engines/documentDiff/buildDocumentDiff.js +102 -0
  282. package/dist/esm/widgets/shared/documents/engines/documentDiff/buildDocumentDiff.js.map +1 -0
  283. package/dist/esm/widgets/shared/documents/engines/documentDiff/documentDiff.css +69 -0
  284. package/dist/esm/widgets/shared/documents/engines/documentDiff/documentDiff.interfaces.js +2 -0
  285. package/dist/esm/widgets/shared/documents/engines/documentDiff/documentDiff.interfaces.js.map +1 -0
  286. package/dist/esm/widgets/shared/documents/engines/lazyEngines.js +13 -0
  287. package/dist/esm/widgets/shared/documents/engines/lazyEngines.js.map +1 -0
  288. package/dist/esm/widgets/shared/documents/engines/markdownEditor/MarkdownEditorEngine.js +191 -0
  289. package/dist/esm/widgets/shared/documents/engines/markdownEditor/MarkdownEditorEngine.js.map +1 -0
  290. package/dist/esm/widgets/shared/documents/engines/markdownEditor/_markdownEditorEngineVariables.css +0 -0
  291. package/dist/esm/widgets/shared/documents/engines/markdownEditor/markdownEditorEngine.css +50 -0
  292. package/dist/esm/widgets/shared/documents/engines/markdownEditor/markdownEditorEngine.interfaces.js +2 -0
  293. package/dist/esm/widgets/shared/documents/engines/markdownEditor/markdownEditorEngine.interfaces.js.map +1 -0
  294. package/dist/esm/widgets/shared/documents/engines/markdownEditor/markdownTextIndex.js +170 -0
  295. package/dist/esm/widgets/shared/documents/engines/markdownEditor/markdownTextIndex.js.map +1 -0
  296. package/dist/esm/widgets/shared/documents/engines/markdownEditor/sanitizeForMdx.js +270 -0
  297. package/dist/esm/widgets/shared/documents/engines/markdownEditor/sanitizeForMdx.js.map +1 -0
  298. package/dist/esm/widgets/shared/documents/engines/markdownEditor/sourceAnnotations.js +198 -0
  299. package/dist/esm/widgets/shared/documents/engines/markdownEditor/sourceAnnotations.js.map +1 -0
  300. package/dist/esm/widgets/shared/documents/engines/markdownRenderer/MarkdownRenderer.js +76 -0
  301. package/dist/esm/widgets/shared/documents/engines/markdownRenderer/MarkdownRenderer.js.map +1 -0
  302. package/dist/esm/widgets/shared/documents/engines/markdownRenderer/_markdownRendererVariables.css +0 -0
  303. package/dist/esm/widgets/shared/documents/engines/markdownRenderer/markdownRenderer.css +78 -0
  304. package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/index.js +5 -0
  305. package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/index.js.map +1 -0
  306. package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/markdownNode.interfaces.js +2 -0
  307. package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/markdownNode.interfaces.js.map +1 -0
  308. package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/rehypeTableCleanup.js +64 -0
  309. package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/rehypeTableCleanup.js.map +1 -0
  310. package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/remarkPlugins.js +182 -0
  311. package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/remarkPlugins.js.map +1 -0
  312. package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/remarkSafeTables.js +78 -0
  313. package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/remarkSafeTables.js.map +1 -0
  314. package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/tableHelpers.js +30 -0
  315. package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/tableHelpers.js.map +1 -0
  316. package/dist/esm/widgets/shared/documents/engines/wordRenderer/WordRenderer.js +41 -0
  317. package/dist/esm/widgets/shared/documents/engines/wordRenderer/WordRenderer.js.map +1 -0
  318. package/dist/esm/widgets/shared/documents/engines/wordRenderer/renderWordDocument.js +207 -0
  319. package/dist/esm/widgets/shared/documents/engines/wordRenderer/renderWordDocument.js.map +1 -0
  320. package/dist/esm/widgets/shared/documents/engines/wordRenderer/wordPreviewNumbering.js +105 -0
  321. package/dist/esm/widgets/shared/documents/engines/wordRenderer/wordPreviewNumbering.js.map +1 -0
  322. package/dist/esm/widgets/shared/documents/engines/wordRenderer/wordXml.js +57 -0
  323. package/dist/esm/widgets/shared/documents/engines/wordRenderer/wordXml.js.map +1 -0
  324. package/dist/esm/widgets/shared/documents/index.js +3 -0
  325. package/dist/esm/widgets/shared/documents/index.js.map +1 -0
  326. package/dist/esm/widgets/shared/documents/toggleGroup.css +8 -0
  327. package/dist/esm/widgets/shared/documents/useDocumentContent.js +215 -0
  328. package/dist/esm/widgets/shared/documents/useDocumentContent.js.map +1 -0
  329. package/dist/helpers/dateHelpers.d.ts.map +1 -1
  330. package/dist/helpers/fileHelpers.d.ts +5 -0
  331. package/dist/helpers/fileHelpers.d.ts.map +1 -0
  332. package/dist/helpers/index.d.ts +3 -0
  333. package/dist/helpers/index.d.ts.map +1 -1
  334. package/dist/helpers/interactionsHelper.d.ts +2 -0
  335. package/dist/helpers/interactionsHelper.d.ts.map +1 -1
  336. package/dist/helpers/objectHelpers.d.ts.map +1 -1
  337. package/dist/helpers/stringHelpers.d.ts.map +1 -1
  338. package/dist/helpers/urlHelpers.d.ts +3 -0
  339. package/dist/helpers/urlHelpers.d.ts.map +1 -0
  340. package/dist/index.d.ts +5 -2
  341. package/dist/index.d.ts.map +1 -1
  342. package/dist/package.json +42 -28
  343. package/dist/widgets/documentComments/DocumentComments.d.ts +7 -0
  344. package/dist/widgets/documentComments/DocumentComments.d.ts.map +1 -0
  345. package/dist/widgets/documentComments/documentComments.interfaces.d.ts +57 -0
  346. package/dist/widgets/documentComments/documentComments.interfaces.d.ts.map +1 -0
  347. package/dist/widgets/documentComments/index.d.ts +3 -0
  348. package/dist/widgets/documentComments/index.d.ts.map +1 -0
  349. package/dist/widgets/documentComparer/DocumentComparer.d.ts +7 -0
  350. package/dist/widgets/documentComparer/DocumentComparer.d.ts.map +1 -0
  351. package/dist/widgets/documentComparer/documentComparer.interfaces.d.ts +78 -0
  352. package/dist/widgets/documentComparer/documentComparer.interfaces.d.ts.map +1 -0
  353. package/dist/widgets/documentComparer/index.d.ts +3 -0
  354. package/dist/widgets/documentComparer/index.d.ts.map +1 -0
  355. package/dist/widgets/documentEditor/DocumentEditor.d.ts +7 -0
  356. package/dist/widgets/documentEditor/DocumentEditor.d.ts.map +1 -0
  357. package/dist/widgets/documentEditor/documentEditor.interfaces.d.ts +40 -0
  358. package/dist/widgets/documentEditor/documentEditor.interfaces.d.ts.map +1 -0
  359. package/dist/widgets/documentEditor/index.d.ts +3 -0
  360. package/dist/widgets/documentEditor/index.d.ts.map +1 -0
  361. package/dist/widgets/documentViewer/DocumentViewer.d.ts +7 -0
  362. package/dist/widgets/documentViewer/DocumentViewer.d.ts.map +1 -0
  363. package/dist/widgets/documentViewer/documentViewer.interfaces.d.ts +47 -0
  364. package/dist/widgets/documentViewer/documentViewer.interfaces.d.ts.map +1 -0
  365. package/dist/widgets/documentViewer/index.d.ts +3 -0
  366. package/dist/widgets/documentViewer/index.d.ts.map +1 -0
  367. package/dist/widgets/index.d.ts +12 -0
  368. package/dist/widgets/index.d.ts.map +1 -1
  369. package/dist/widgets/shared/documents/ToggleGroup.d.ts +15 -0
  370. package/dist/widgets/shared/documents/ToggleGroup.d.ts.map +1 -0
  371. package/dist/widgets/shared/documents/annotations/AnnotationLayer.d.ts +27 -0
  372. package/dist/widgets/shared/documents/annotations/AnnotationLayer.d.ts.map +1 -0
  373. package/dist/widgets/shared/documents/annotations/annotations.interfaces.d.ts +43 -0
  374. package/dist/widgets/shared/documents/annotations/annotations.interfaces.d.ts.map +1 -0
  375. package/dist/widgets/shared/documents/annotations/highlightRegistry.d.ts +12 -0
  376. package/dist/widgets/shared/documents/annotations/highlightRegistry.d.ts.map +1 -0
  377. package/dist/widgets/shared/documents/annotations/index.d.ts +6 -0
  378. package/dist/widgets/shared/documents/annotations/index.d.ts.map +1 -0
  379. package/dist/widgets/shared/documents/annotations/textIndex.d.ts +16 -0
  380. package/dist/widgets/shared/documents/annotations/textIndex.d.ts.map +1 -0
  381. package/dist/widgets/shared/documents/annotations/textQuoteAnchor.d.ts +15 -0
  382. package/dist/widgets/shared/documents/annotations/textQuoteAnchor.d.ts.map +1 -0
  383. package/dist/widgets/shared/documents/documentHelpers.d.ts +14 -0
  384. package/dist/widgets/shared/documents/documentHelpers.d.ts.map +1 -0
  385. package/dist/widgets/shared/documents/documents.interfaces.d.ts +20 -0
  386. package/dist/widgets/shared/documents/documents.interfaces.d.ts.map +1 -0
  387. package/dist/widgets/shared/documents/engines/documentDiff/DocumentDiff.d.ts +6 -0
  388. package/dist/widgets/shared/documents/engines/documentDiff/DocumentDiff.d.ts.map +1 -0
  389. package/dist/widgets/shared/documents/engines/documentDiff/buildDocumentDiff.d.ts +25 -0
  390. package/dist/widgets/shared/documents/engines/documentDiff/buildDocumentDiff.d.ts.map +1 -0
  391. package/dist/widgets/shared/documents/engines/documentDiff/documentDiff.interfaces.d.ts +17 -0
  392. package/dist/widgets/shared/documents/engines/documentDiff/documentDiff.interfaces.d.ts.map +1 -0
  393. package/dist/widgets/shared/documents/engines/lazyEngines.d.ts +5 -0
  394. package/dist/widgets/shared/documents/engines/lazyEngines.d.ts.map +1 -0
  395. package/dist/widgets/shared/documents/engines/markdownEditor/MarkdownEditorEngine.d.ts +8 -0
  396. package/dist/widgets/shared/documents/engines/markdownEditor/MarkdownEditorEngine.d.ts.map +1 -0
  397. package/dist/widgets/shared/documents/engines/markdownEditor/markdownEditorEngine.interfaces.d.ts +23 -0
  398. package/dist/widgets/shared/documents/engines/markdownEditor/markdownEditorEngine.interfaces.d.ts.map +1 -0
  399. package/dist/widgets/shared/documents/engines/markdownEditor/markdownTextIndex.d.ts +12 -0
  400. package/dist/widgets/shared/documents/engines/markdownEditor/markdownTextIndex.d.ts.map +1 -0
  401. package/dist/widgets/shared/documents/engines/markdownEditor/sanitizeForMdx.d.ts +8 -0
  402. package/dist/widgets/shared/documents/engines/markdownEditor/sanitizeForMdx.d.ts.map +1 -0
  403. package/dist/widgets/shared/documents/engines/markdownEditor/sourceAnnotations.d.ts +32 -0
  404. package/dist/widgets/shared/documents/engines/markdownEditor/sourceAnnotations.d.ts.map +1 -0
  405. package/dist/widgets/shared/documents/engines/markdownRenderer/MarkdownRenderer.d.ts +12 -0
  406. package/dist/widgets/shared/documents/engines/markdownRenderer/MarkdownRenderer.d.ts.map +1 -0
  407. package/dist/widgets/shared/documents/engines/markdownRenderer/plugins/index.d.ts +7 -0
  408. package/dist/widgets/shared/documents/engines/markdownRenderer/plugins/index.d.ts.map +1 -0
  409. package/dist/widgets/shared/documents/engines/markdownRenderer/plugins/markdownNode.interfaces.d.ts +16 -0
  410. package/dist/widgets/shared/documents/engines/markdownRenderer/plugins/markdownNode.interfaces.d.ts.map +1 -0
  411. package/dist/widgets/shared/documents/engines/markdownRenderer/plugins/rehypeTableCleanup.d.ts +3 -0
  412. package/dist/widgets/shared/documents/engines/markdownRenderer/plugins/rehypeTableCleanup.d.ts.map +1 -0
  413. package/dist/widgets/shared/documents/engines/markdownRenderer/plugins/remarkPlugins.d.ts +6 -0
  414. package/dist/widgets/shared/documents/engines/markdownRenderer/plugins/remarkPlugins.d.ts.map +1 -0
  415. package/dist/widgets/shared/documents/engines/markdownRenderer/plugins/remarkSafeTables.d.ts +3 -0
  416. package/dist/widgets/shared/documents/engines/markdownRenderer/plugins/remarkSafeTables.d.ts.map +1 -0
  417. package/dist/widgets/shared/documents/engines/markdownRenderer/plugins/tableHelpers.d.ts +8 -0
  418. package/dist/widgets/shared/documents/engines/markdownRenderer/plugins/tableHelpers.d.ts.map +1 -0
  419. package/dist/widgets/shared/documents/engines/wordRenderer/WordRenderer.d.ts +11 -0
  420. package/dist/widgets/shared/documents/engines/wordRenderer/WordRenderer.d.ts.map +1 -0
  421. package/dist/widgets/shared/documents/engines/wordRenderer/renderWordDocument.d.ts +7 -0
  422. package/dist/widgets/shared/documents/engines/wordRenderer/renderWordDocument.d.ts.map +1 -0
  423. package/dist/widgets/shared/documents/engines/wordRenderer/wordPreviewNumbering.d.ts +3 -0
  424. package/dist/widgets/shared/documents/engines/wordRenderer/wordPreviewNumbering.d.ts.map +1 -0
  425. package/dist/widgets/shared/documents/engines/wordRenderer/wordXml.d.ts +21 -0
  426. package/dist/widgets/shared/documents/engines/wordRenderer/wordXml.d.ts.map +1 -0
  427. package/dist/widgets/shared/documents/index.d.ts +5 -0
  428. package/dist/widgets/shared/documents/index.d.ts.map +1 -0
  429. package/dist/widgets/shared/documents/useDocumentContent.d.ts +11 -0
  430. package/dist/widgets/shared/documents/useDocumentContent.d.ts.map +1 -0
  431. package/package.json +42 -28
  432. package/readme.md +49 -2
  433. package/dist/components/design/dialog/Dialog.test.d.ts +0 -5
  434. package/dist/components/design/dialog/Dialog.test.d.ts.map +0 -1
  435. package/dist/components/design/progressIndicators/circularProgressIndicator/CircularProgressIndicator.test.d.ts +0 -5
  436. package/dist/components/design/progressIndicators/circularProgressIndicator/CircularProgressIndicator.test.d.ts.map +0 -1
  437. package/dist/components/design/tooltip/Tooltip.test.d.ts +0 -2
  438. package/dist/components/design/tooltip/Tooltip.test.d.ts.map +0 -1
  439. package/dist/components/form/buttons/SimpleButton.test.d.ts +0 -5
  440. package/dist/components/form/buttons/SimpleButton.test.d.ts.map +0 -1
  441. package/dist/components/form/formFields/formFieldWrapper/FormField.test.d.ts +0 -5
  442. package/dist/components/form/formFields/formFieldWrapper/FormField.test.d.ts.map +0 -1
  443. package/dist/components/form/formFields/subComponents/inputs/checkbox/InputCheckbox.test.d.ts +0 -5
  444. package/dist/components/form/formFields/subComponents/inputs/checkbox/InputCheckbox.test.d.ts.map +0 -1
  445. package/dist/components/form/formFields/subComponents/inputs/checkbox/checkboxSwitch/CheckboxSwitch.test.d.ts +0 -5
  446. package/dist/components/form/formFields/subComponents/inputs/checkbox/checkboxSwitch/CheckboxSwitch.test.d.ts.map +0 -1
  447. package/dist/components/form/formFields/subComponents/inputs/file/dragAndDrop/DragAndDropFileUpload.test.d.ts +0 -5
  448. package/dist/components/form/formFields/subComponents/inputs/file/dragAndDrop/DragAndDropFileUpload.test.d.ts.map +0 -1
  449. package/dist/components/form/formFields/subComponents/inputs/file/fileAttachmentList/FileAttachmentsList.test.d.ts +0 -5
  450. package/dist/components/form/formFields/subComponents/inputs/file/fileAttachmentList/FileAttachmentsList.test.d.ts.map +0 -1
  451. package/dist/components/form/formFields/subComponents/inputs/text/InputText.test.d.ts +0 -5
  452. package/dist/components/form/formFields/subComponents/inputs/text/InputText.test.d.ts.map +0 -1
  453. package/dist/components/form/formFields/subComponents/nestedFormContext.test.d.ts +0 -5
  454. package/dist/components/form/formFields/subComponents/nestedFormContext.test.d.ts.map +0 -1
  455. package/dist/components/form/formFields/subComponents/select/Select.test.d.ts +0 -5
  456. package/dist/components/form/formFields/subComponents/select/Select.test.d.ts.map +0 -1
  457. package/dist/components/form/formFields/subComponents/textarea/Textarea.test.d.ts +0 -5
  458. package/dist/components/form/formFields/subComponents/textarea/Textarea.test.d.ts.map +0 -1
  459. package/dist/components/form/hookFormWrapper/HookFormWrapper.test.d.ts +0 -5
  460. package/dist/components/form/hookFormWrapper/HookFormWrapper.test.d.ts.map +0 -1
  461. package/dist/components/form/validation/ValidationMessages.test.d.ts +0 -5
  462. package/dist/components/form/validation/ValidationMessages.test.d.ts.map +0 -1
  463. package/dist/components/navigation/bubbleNavigator/bubbleNavigatorUtilities.test.d.ts +0 -2
  464. package/dist/components/navigation/bubbleNavigator/bubbleNavigatorUtilities.test.d.ts.map +0 -1
  465. package/dist/components/navigation/menu/menuItemContent/MenuItemIcon.test.d.ts +0 -5
  466. package/dist/components/navigation/menu/menuItemContent/MenuItemIcon.test.d.ts.map +0 -1
  467. package/dist/helpers/ageHelpers.test.d.ts +0 -2
  468. package/dist/helpers/ageHelpers.test.d.ts.map +0 -1
  469. package/dist/helpers/dateHelpers.test.d.ts +0 -2
  470. package/dist/helpers/dateHelpers.test.d.ts.map +0 -1
  471. package/dist/helpers/formatters.test.d.ts +0 -5
  472. package/dist/helpers/formatters.test.d.ts.map +0 -1
  473. package/dist/helpers/iconHelpers.test.d.ts +0 -5
  474. package/dist/helpers/iconHelpers.test.d.ts.map +0 -1
  475. package/dist/helpers/numberHelpers.test.d.ts +0 -5
  476. package/dist/helpers/numberHelpers.test.d.ts.map +0 -1
  477. package/dist/helpers/objectHelpers.test.d.ts +0 -2
  478. package/dist/helpers/objectHelpers.test.d.ts.map +0 -1
  479. package/dist/helpers/stringHelpers.test.d.ts +0 -2
  480. package/dist/helpers/stringHelpers.test.d.ts.map +0 -1
  481. package/dist/hooks/InteractiveHostFocus.test.d.ts +0 -5
  482. package/dist/hooks/InteractiveHostFocus.test.d.ts.map +0 -1
  483. package/dist/widgets/processLauncher/ProcessLauncher.test.d.ts +0 -5
  484. package/dist/widgets/processLauncher/ProcessLauncher.test.d.ts.map +0 -1
@@ -0,0 +1,170 @@
1
+ import remarkGfm from 'remark-gfm';
2
+ import remarkParse from 'remark-parse';
3
+ import { unified } from 'unified';
4
+
5
+ /*
6
+ The text a reader sees for a markdown document (what rich-text mode renders), with a map back to
7
+ source offsets. Comment quotes are taken from, and resolved against, this text in both views, so
8
+ `Keep **passwords** private.` quotes as `passwords private` whichever view the comment was made in.
9
+
10
+ As in the DOM text index, blocks and line breaks are separated by a newline.
11
+ */
12
+
13
+ const markdownParser = unified().use(remarkParse).use(remarkGfm);
14
+ // Nodes rendered inline; every other node with children is a block.
15
+ const INLINE_TYPES = new Set(['emphasis', 'strong', 'delete', 'link', 'linkReference']);
16
+ // Leaves whose value is shown as document text.
17
+ const TEXT_TYPES = new Set(['text', 'inlineCode', 'code']);
18
+ // Code is shown verbatim, so escapes and entities in it are literal text.
19
+ const VERBATIM_TYPES = new Set(['inlineCode', 'code']);
20
+ const HTML_BREAK = /^<br\s*\/?>$/i;
21
+ const FENCE = /^[ \t]*(`{3,}|~{3,})/;
22
+ const ENTITY = /^&(?:#[0-9]{1,7}|#[xX][0-9a-fA-F]{1,6}|[A-Za-z][A-Za-z0-9]{1,31});/;
23
+ const ESCAPABLE = /[!-/:-@[-`{-~]/;
24
+ // Markup between characters (indentation, `>` markers and so on) is skipped, up to this many characters.
25
+ const MAX_ALIGNMENT_GAP = 256;
26
+
27
+ // Entities are decoded by the same parser as the document so both agree on what each one renders.
28
+ const entityCache = new Map();
29
+ const decodeEntity = entity => {
30
+ let decoded = entityCache.get(entity);
31
+ if (decoded === undefined) {
32
+ const paragraph = markdownParser.parse(entity).children?.[0];
33
+ decoded = paragraph?.children?.[0]?.value ?? entity;
34
+ entityCache.set(entity, decoded);
35
+ }
36
+ return decoded;
37
+ };
38
+
39
+ // The part of a code node's source that holds its value, excluding fences and the info string.
40
+ const getCodeContentSpan = (markdown, node, start, end) => {
41
+ const source = markdown.slice(start, end);
42
+ if (node.type === 'inlineCode') {
43
+ const ticks = /^`+/.exec(source)?.[0].length ?? 0;
44
+ return [start + ticks, Math.max(start + ticks, end - ticks)];
45
+ }
46
+ if (FENCE.test(source)) {
47
+ const lineEnd = source.indexOf('\n');
48
+ return [lineEnd === -1 ? end : start + lineEnd + 1, end];
49
+ }
50
+ return [start, end];
51
+ };
52
+ export const buildMarkdownTextIndex = markdown => {
53
+ let text = '';
54
+ const starts = [];
55
+ const ends = [];
56
+ const push = (characters, from, to) => {
57
+ text += characters;
58
+ for (let unit = 0; unit < characters.length; unit += 1) {
59
+ starts.push(from);
60
+ ends.push(to);
61
+ }
62
+ };
63
+ const addSeparator = sourceOffset => {
64
+ if (text.length && !text.endsWith('\n')) {
65
+ push('\n', sourceOffset, sourceOffset);
66
+ }
67
+ };
68
+
69
+ // Consumes the source token that renders as the next part of the value: an entity, a backslash
70
+ // escape or the literal character, skipping any markup in between.
71
+ const addValue = (value, from, to, verbatim) => {
72
+ let cursor = from;
73
+ let index = 0;
74
+ while (index < value.length) {
75
+ const limit = Math.min(to, cursor + MAX_ALIGNMENT_GAP);
76
+ let token = null;
77
+ for (let position = cursor; position < limit && !token; position += 1) {
78
+ const source = markdown[position];
79
+ if (!verbatim && source === '&') {
80
+ const entity = ENTITY.exec(markdown.slice(position, Math.min(to, position + 40)))?.[0];
81
+ const decoded = entity ? decodeEntity(entity) : '';
82
+ if (entity && decoded !== entity && value.startsWith(decoded, index)) {
83
+ token = {
84
+ position,
85
+ length: entity.length,
86
+ characters: decoded
87
+ };
88
+ break;
89
+ }
90
+ }
91
+ if (!verbatim && source === '\\' && ESCAPABLE.test(value[index]) && markdown[position + 1] === value[index]) {
92
+ token = {
93
+ position,
94
+ length: 2,
95
+ characters: value[index]
96
+ };
97
+ } else if (source === value[index]) {
98
+ token = {
99
+ position,
100
+ length: 1,
101
+ characters: value[index]
102
+ };
103
+ }
104
+ }
105
+ if (token) {
106
+ push(token.characters, token.position, token.position + token.length);
107
+ cursor = token.position + token.length;
108
+ index += token.characters.length;
109
+ } else {
110
+ // Unmatched text has no source span of its own; it is pinned to the current position.
111
+ push(value[index], cursor, cursor);
112
+ index += 1;
113
+ }
114
+ }
115
+ };
116
+ let previousBlock = null;
117
+ const visit = (node, block) => {
118
+ const start = node.position?.start.offset;
119
+ const end = node.position?.end.offset;
120
+ if (node.type === 'break' || node.type === 'html' && HTML_BREAK.test(node.value?.trim() ?? '')) {
121
+ if (start !== undefined) {
122
+ addSeparator(start);
123
+ }
124
+ return;
125
+ }
126
+ if (TEXT_TYPES.has(node.type) && node.value && start !== undefined && end !== undefined) {
127
+ if (previousBlock && previousBlock !== block) {
128
+ addSeparator(start);
129
+ }
130
+ previousBlock = block;
131
+ const verbatim = VERBATIM_TYPES.has(node.type);
132
+ const [from, to] = verbatim ? getCodeContentSpan(markdown, node, start, end) : [start, end];
133
+ addValue(node.value, from, to, verbatim);
134
+ return;
135
+ }
136
+ const childBlock = INLINE_TYPES.has(node.type) ? block : node;
137
+ node.children?.forEach(child => visit(child, childBlock));
138
+ };
139
+ const tree = markdownParser.parse(markdown);
140
+ visit(tree, tree);
141
+ starts.push(markdown.length);
142
+ ends.push(markdown.length);
143
+ return {
144
+ text,
145
+ starts,
146
+ ends
147
+ };
148
+ };
149
+
150
+ // The index of the first text character starting at or after a source offset.
151
+ export const sourceToTextOffset = (index, sourceOffset) => {
152
+ let low = 0;
153
+ let high = index.text.length;
154
+ while (low < high) {
155
+ const middle = Math.floor((low + high) / 2);
156
+ if (index.starts[middle] < sourceOffset) {
157
+ low = middle + 1;
158
+ } else {
159
+ high = middle;
160
+ }
161
+ }
162
+ return low;
163
+ };
164
+
165
+ // The source range covering text[start, end).
166
+ export const textToSourceRange = (index, start, end) => ({
167
+ from: index.starts[start],
168
+ to: end > start ? index.ends[end - 1] : index.starts[start]
169
+ });
170
+ //# sourceMappingURL=markdownTextIndex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdownTextIndex.js","names":["remarkGfm","remarkParse","unified","markdownParser","use","INLINE_TYPES","Set","TEXT_TYPES","VERBATIM_TYPES","HTML_BREAK","FENCE","ENTITY","ESCAPABLE","MAX_ALIGNMENT_GAP","entityCache","Map","decodeEntity","entity","decoded","get","undefined","paragraph","parse","children","value","set","getCodeContentSpan","markdown","node","start","end","source","slice","type","ticks","exec","length","Math","max","test","lineEnd","indexOf","buildMarkdownTextIndex","text","starts","ends","push","characters","from","to","unit","addSeparator","sourceOffset","endsWith","addValue","verbatim","cursor","index","limit","min","token","position","startsWith","previousBlock","visit","block","offset","trim","has","childBlock","forEach","child","tree","sourceToTextOffset","low","high","middle","floor","textToSourceRange"],"sources":["../../../../../../../src/widgets/shared/documents/engines/markdownEditor/markdownTextIndex.ts"],"sourcesContent":["import remarkGfm from 'remark-gfm';\nimport remarkParse from 'remark-parse';\nimport { unified } from 'unified';\n\n/*\n The text a reader sees for a markdown document (what rich-text mode renders), with a map back to\n source offsets. Comment quotes are taken from, and resolved against, this text in both views, so\n `Keep **passwords** private.` quotes as `passwords private` whichever view the comment was made in.\n\n As in the DOM text index, blocks and line breaks are separated by a newline.\n */\nexport type MarkdownTextIndex = {\n text: string;\n // text[i] came from source[starts[i], ends[i]); an escape or entity spans several source characters.\n // Each array has an extra final entry of the source length.\n starts: number[];\n ends: number[];\n};\n\nconst markdownParser = unified().use(remarkParse).use(remarkGfm);\n\ntype MarkdownNode = {\n type: string;\n value?: string;\n children?: MarkdownNode[];\n position?: { start: { offset?: number }; end: { offset?: number } };\n};\n\n// Nodes rendered inline; every other node with children is a block.\nconst INLINE_TYPES = new Set(['emphasis', 'strong', 'delete', 'link', 'linkReference']);\n// Leaves whose value is shown as document text.\nconst TEXT_TYPES = new Set(['text', 'inlineCode', 'code']);\n// Code is shown verbatim, so escapes and entities in it are literal text.\nconst VERBATIM_TYPES = new Set(['inlineCode', 'code']);\nconst HTML_BREAK = /^<br\\s*\\/?>$/i;\nconst FENCE = /^[ \\t]*(`{3,}|~{3,})/;\nconst ENTITY = /^&(?:#[0-9]{1,7}|#[xX][0-9a-fA-F]{1,6}|[A-Za-z][A-Za-z0-9]{1,31});/;\nconst ESCAPABLE = /[!-/:-@[-`{-~]/;\n// Markup between characters (indentation, `>` markers and so on) is skipped, up to this many characters.\nconst MAX_ALIGNMENT_GAP = 256;\n\n// Entities are decoded by the same parser as the document so both agree on what each one renders.\nconst entityCache = new Map<string, string>();\nconst decodeEntity = (entity: string): string => {\n let decoded = entityCache.get(entity);\n if (decoded === undefined) {\n const paragraph = (markdownParser.parse(entity) as MarkdownNode).children?.[0];\n decoded = paragraph?.children?.[0]?.value ?? entity;\n entityCache.set(entity, decoded);\n }\n return decoded;\n};\n\n// The part of a code node's source that holds its value, excluding fences and the info string.\nconst getCodeContentSpan = (markdown: string, node: MarkdownNode, start: number, end: number): [number, number] => {\n const source = markdown.slice(start, end);\n if (node.type === 'inlineCode') {\n const ticks = /^`+/.exec(source)?.[0].length ?? 0;\n return [start + ticks, Math.max(start + ticks, end - ticks)];\n }\n if (FENCE.test(source)) {\n const lineEnd = source.indexOf('\\n');\n return [lineEnd === -1 ? end : start + lineEnd + 1, end];\n }\n return [start, end];\n};\n\nexport const buildMarkdownTextIndex = (markdown: string): MarkdownTextIndex => {\n let text = '';\n const starts: number[] = [];\n const ends: number[] = [];\n\n const push = (characters: string, from: number, to: number) => {\n text += characters;\n for (let unit = 0; unit < characters.length; unit += 1) {\n starts.push(from);\n ends.push(to);\n }\n };\n\n const addSeparator = (sourceOffset: number) => {\n if (text.length && !text.endsWith('\\n')) {\n push('\\n', sourceOffset, sourceOffset);\n }\n };\n\n // Consumes the source token that renders as the next part of the value: an entity, a backslash\n // escape or the literal character, skipping any markup in between.\n const addValue = (value: string, from: number, to: number, verbatim: boolean) => {\n let cursor = from;\n let index = 0;\n while (index < value.length) {\n const limit = Math.min(to, cursor + MAX_ALIGNMENT_GAP);\n let token: { position: number; length: number; characters: string } | null = null;\n for (let position = cursor; position < limit && !token; position += 1) {\n const source = markdown[position];\n if (!verbatim && source === '&') {\n const entity = ENTITY.exec(markdown.slice(position, Math.min(to, position + 40)))?.[0];\n const decoded = entity ? decodeEntity(entity) : '';\n if (entity && decoded !== entity && value.startsWith(decoded, index)) {\n token = { position, length: entity.length, characters: decoded };\n break;\n }\n }\n if (!verbatim && source === '\\\\' && ESCAPABLE.test(value[index]) && markdown[position + 1] === value[index]) {\n token = { position, length: 2, characters: value[index] };\n } else if (source === value[index]) {\n token = { position, length: 1, characters: value[index] };\n }\n }\n if (token) {\n push(token.characters, token.position, token.position + token.length);\n cursor = token.position + token.length;\n index += token.characters.length;\n } else {\n // Unmatched text has no source span of its own; it is pinned to the current position.\n push(value[index], cursor, cursor);\n index += 1;\n }\n }\n };\n\n let previousBlock: MarkdownNode | null = null;\n const visit = (node: MarkdownNode, block: MarkdownNode) => {\n const start = node.position?.start.offset;\n const end = node.position?.end.offset;\n if (node.type === 'break' || (node.type === 'html' && HTML_BREAK.test(node.value?.trim() ?? ''))) {\n if (start !== undefined) {\n addSeparator(start);\n }\n return;\n }\n if (TEXT_TYPES.has(node.type) && node.value && start !== undefined && end !== undefined) {\n if (previousBlock && previousBlock !== block) {\n addSeparator(start);\n }\n previousBlock = block;\n const verbatim = VERBATIM_TYPES.has(node.type);\n const [from, to] = verbatim ? getCodeContentSpan(markdown, node, start, end) : [start, end];\n addValue(node.value, from, to, verbatim);\n return;\n }\n const childBlock = INLINE_TYPES.has(node.type) ? block : node;\n node.children?.forEach((child) => visit(child, childBlock));\n };\n\n const tree = markdownParser.parse(markdown) as MarkdownNode;\n visit(tree, tree);\n starts.push(markdown.length);\n ends.push(markdown.length);\n return { text, starts, ends };\n};\n\n// The index of the first text character starting at or after a source offset.\nexport const sourceToTextOffset = (index: MarkdownTextIndex, sourceOffset: number): number => {\n let low = 0;\n let high = index.text.length;\n while (low < high) {\n const middle = Math.floor((low + high) / 2);\n if (index.starts[middle] < sourceOffset) {\n low = middle + 1;\n } else {\n high = middle;\n }\n }\n return low;\n};\n\n// The source range covering text[start, end).\nexport const textToSourceRange = (index: MarkdownTextIndex, start: number, end: number): { from: number; to: number } => ({\n from: index.starts[start],\n to: end > start ? index.ends[end - 1] : index.starts[start]\n});\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,270 @@
1
+ /*
2
+ MDXEditor parses markdown as MDX, so two kinds of input need neutralising before it sees them:
3
+ 1. HTML injection: every `<` that is not part of explicitly allowed HTML is encoded as `&lt;`,
4
+ making it inert text the parser cannot interpret as markup.
5
+ 2. MDX expressions: `{` is encoded as `&#123;` so it is never evaluated.
6
+
7
+ Allowed HTML is protected with placeholders rather than an HTML sanitiser, so content never
8
+ passes through an HTML serialiser (which would encode `&` and other text and cause false diffs).
9
+
10
+ SECURITY NOTE: HTML tokens are scanned linearly and validated without constructing regexes from
11
+ the allowlist. Remaining regexes are fixed patterns with no nested ambiguous repetitions.
12
+ */
13
+
14
+ const PLACEHOLDER_MARK = String.fromCharCode(0xffff);
15
+ const placeholderPattern = /\uFFFF(\d+)\uFFFF/g;
16
+ const hasPlaceholder = /\uFFFF\d+\uFFFF/;
17
+ const isWhitespace = character => character !== undefined && /\s/.test(character);
18
+ const findTagEnd = (input, start) => {
19
+ let quote;
20
+ for (let index = start; index < input.length; index += 1) {
21
+ const character = input[index];
22
+ if (character === '<') {
23
+ return -1;
24
+ }
25
+ if (quote) {
26
+ if (character === quote) {
27
+ quote = undefined;
28
+ }
29
+ } else if (character === '"' || character === '\'') {
30
+ quote = character;
31
+ } else if (character === '>') {
32
+ return index;
33
+ }
34
+ }
35
+ return -1;
36
+ };
37
+ const findHtmlTokens = (input, tag) => {
38
+ const tokens = [];
39
+ const openingPrefix = `<${tag}`;
40
+ const closingToken = `</${tag}>`;
41
+ let searchFrom = 0;
42
+ while (searchFrom < input.length) {
43
+ const index = input.indexOf('<', searchFrom);
44
+ if (index < 0) {
45
+ break;
46
+ }
47
+ if (input.startsWith(closingToken, index)) {
48
+ tokens.push({
49
+ index,
50
+ token: closingToken,
51
+ closing: true
52
+ });
53
+ searchFrom = index + closingToken.length;
54
+ continue;
55
+ }
56
+ if (!input.startsWith(openingPrefix, index)) {
57
+ searchFrom = index + 1;
58
+ continue;
59
+ }
60
+ const nameEnd = index + openingPrefix.length;
61
+ const boundary = input[nameEnd];
62
+ if (boundary !== '/' && boundary !== '>' && !isWhitespace(boundary)) {
63
+ searchFrom = index + 1;
64
+ continue;
65
+ }
66
+ const end = findTagEnd(input, nameEnd);
67
+ if (end < 0) {
68
+ searchFrom = index + 1;
69
+ continue;
70
+ }
71
+ tokens.push({
72
+ index,
73
+ token: input.slice(index, end + 1),
74
+ closing: false
75
+ });
76
+ searchFrom = end + 1;
77
+ }
78
+ return tokens;
79
+ };
80
+ const isAllowedOpening = ({
81
+ tag,
82
+ classes,
83
+ attrs
84
+ }, token) => {
85
+ const suffix = token.slice(tag.length + 1, -1);
86
+ const hasRestrictions = Boolean(classes?.length || attrs?.length);
87
+ const allowedClasses = classes ?? [];
88
+ if (!hasRestrictions) {
89
+ return suffix === '' || suffix === '/' || isWhitespace(suffix[0]) && !suffix.includes('>');
90
+ }
91
+ let index = 0;
92
+ while (isWhitespace(suffix[index])) {
93
+ index += 1;
94
+ }
95
+ if (index === suffix.length || suffix[index] === '/' && index === suffix.length - 1) {
96
+ return true;
97
+ }
98
+ while (index < suffix.length) {
99
+ const attributeStart = index;
100
+ while (index < suffix.length && !isWhitespace(suffix[index]) && suffix[index] !== '=') {
101
+ index += 1;
102
+ }
103
+ if (index === attributeStart || suffix[index] !== '=') {
104
+ return false;
105
+ }
106
+ const attribute = suffix.slice(attributeStart, index);
107
+ index += 1;
108
+ if (suffix[index] !== '"') {
109
+ return false;
110
+ }
111
+ const valueStart = ++index;
112
+ while (index < suffix.length && suffix[index] !== '"') {
113
+ index += 1;
114
+ }
115
+ if (index === suffix.length) {
116
+ return false;
117
+ }
118
+ const value = suffix.slice(valueStart, index);
119
+ const isAllowedClass = attribute === 'class' && allowedClasses.length > 0 && value.split(/\s+/).every(className => className.length > 0 && allowedClasses.includes(className));
120
+ if (!attrs?.includes(attribute) && !isAllowedClass) {
121
+ return false;
122
+ }
123
+ index += 1;
124
+ if (index === suffix.length) {
125
+ return true;
126
+ }
127
+ const separatorStart = index;
128
+ while (isWhitespace(suffix[index])) {
129
+ index += 1;
130
+ }
131
+ if (index === suffix.length || suffix[index] === '/' && index === suffix.length - 1) {
132
+ return true;
133
+ }
134
+ if (index === separatorStart) {
135
+ return false;
136
+ }
137
+ }
138
+ return true;
139
+ };
140
+ const isVoidToken = (token, entry) => token.endsWith('/>') || ['img', 'br'].includes(entry.tag);
141
+ const preserve = (value, preserved) => {
142
+ preserved.push(value);
143
+ return `${PLACEHOLDER_MARK}${preserved.length - 1}${PLACEHOLDER_MARK}`;
144
+ };
145
+ const protectInlineCode = (markdown, preserved) => {
146
+ const runs = [];
147
+ for (let index = 0; index < markdown.length;) {
148
+ if (markdown[index] !== '`') {
149
+ index += 1;
150
+ continue;
151
+ }
152
+ let end = index + 1;
153
+ while (markdown[end] === '`') {
154
+ end += 1;
155
+ }
156
+ let precedingBackslashes = 0;
157
+ for (let previous = index - 1; previous >= 0 && markdown[previous] === '\\'; previous -= 1) {
158
+ precedingBackslashes += 1;
159
+ }
160
+ const escapedTickCount = precedingBackslashes % 2;
161
+ if (end - index > escapedTickCount) {
162
+ runs.push({
163
+ start: index + escapedTickCount,
164
+ end,
165
+ length: end - index - escapedTickCount
166
+ });
167
+ }
168
+ index = end;
169
+ }
170
+ const nextRunByLength = new Map();
171
+ const nextRun = new Array(runs.length);
172
+ for (let index = runs.length - 1; index >= 0; index -= 1) {
173
+ nextRun[index] = nextRunByLength.get(runs[index].length);
174
+ nextRunByLength.set(runs[index].length, index);
175
+ }
176
+ let result = '';
177
+ let copiedThrough = 0;
178
+ for (let index = 0; index < runs.length; index += 1) {
179
+ const closingIndex = nextRun[index];
180
+ if (closingIndex === undefined) {
181
+ continue;
182
+ }
183
+ const opening = runs[index];
184
+ const closing = runs[closingIndex];
185
+ result += markdown.slice(copiedThrough, opening.start);
186
+ result += preserve(markdown.slice(opening.start, closing.end), preserved);
187
+ copiedThrough = closing.end;
188
+ index = closingIndex;
189
+ }
190
+ return result + markdown.slice(copiedThrough);
191
+ };
192
+ const protectCode = (markdown, preserved) => {
193
+ const lines = markdown.split('\n');
194
+ const protectedLines = [];
195
+ for (let index = 0; index < lines.length; index += 1) {
196
+ const opening = /^ {0,3}(`{3,}|~{3,})/.exec(lines[index]);
197
+ if (!opening) {
198
+ protectedLines.push(lines[index]);
199
+ continue;
200
+ }
201
+ const marker = opening[1];
202
+ let closingIndex = index + 1;
203
+ for (; closingIndex < lines.length; closingIndex += 1) {
204
+ const closing = /^ {0,3}(`+|~+)[ \t]*$/.exec(lines[closingIndex]);
205
+ if (closing && closing[1][0] === marker[0] && closing[1].length >= marker.length) {
206
+ break;
207
+ }
208
+ }
209
+ const lastCodeLine = Math.min(closingIndex, lines.length - 1);
210
+ protectedLines.push(preserve(lines.slice(index, lastCodeLine + 1).join('\n'), preserved));
211
+ index = lastCodeLine;
212
+ }
213
+ return protectInlineCode(protectedLines.join('\n'), preserved);
214
+ };
215
+ export const sanitizeEditorInput = (markdown, allowedHtml = []) => {
216
+ const preserved = [];
217
+ let withPlaceholders = protectCode(markdown, preserved);
218
+ allowedHtml.forEach(entry => {
219
+ const tokens = findHtmlTokens(withPlaceholders, entry.tag);
220
+ const keep = new Set();
221
+ const openings = [];
222
+ tokens.forEach(({
223
+ token,
224
+ index,
225
+ closing
226
+ }) => {
227
+ if (closing) {
228
+ // A closing tag survives only alongside the allowed opening tag it pairs with.
229
+ const opening = openings.pop();
230
+ if (opening?.allowed) {
231
+ keep.add(opening.index);
232
+ keep.add(index);
233
+ }
234
+ } else if (isVoidToken(token, entry)) {
235
+ if (isAllowedOpening(entry, token)) {
236
+ keep.add(index);
237
+ }
238
+ } else {
239
+ openings.push({
240
+ index,
241
+ allowed: isAllowedOpening(entry, token)
242
+ });
243
+ }
244
+ });
245
+ let copiedThrough = 0;
246
+ withPlaceholders = tokens.reduce((result, {
247
+ index,
248
+ token
249
+ }) => {
250
+ result += withPlaceholders.slice(copiedThrough, index);
251
+ result += keep.has(index) ? preserve(token, preserved) : token;
252
+ copiedThrough = index + token.length;
253
+ return result;
254
+ }, '') + withPlaceholders.slice(copiedThrough);
255
+ });
256
+ let result = withPlaceholders.replace(/</g, '&lt;').replace(/\{/g, '&#123;');
257
+ // Nested allowed elements leave placeholders inside restored placeholders, so repeat until none remain.
258
+ while (hasPlaceholder.test(result)) {
259
+ result = result.replace(placeholderPattern, (_, index) => preserved[Number(index)]);
260
+ }
261
+ return result;
262
+ };
263
+
264
+ /*
265
+ Reverses the backslash escapes MDXEditor's serialiser adds for MDX/HTML reasons during its
266
+ markdown -> AST -> markdown round-trip, so `&`, `{`, `}`, `<`, `>` and `"` are saved literally.
267
+ Markdown syntax escapes (\*, \#, \-, ...) are deliberately left alone.
268
+ */
269
+ export const desanitizeEditorOutput = markdown => markdown.replace(/\\&/g, '&').replace(/\\{/g, '{').replace(/\\}/g, '}').replace(/\\</g, '<').replace(/\\>/g, '>').replace(/\\"/g, '"');
270
+ //# sourceMappingURL=sanitizeForMdx.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sanitizeForMdx.js","names":["PLACEHOLDER_MARK","String","fromCharCode","placeholderPattern","hasPlaceholder","isWhitespace","character","undefined","test","findTagEnd","input","start","quote","index","length","findHtmlTokens","tag","tokens","openingPrefix","closingToken","searchFrom","indexOf","startsWith","push","token","closing","nameEnd","boundary","end","slice","isAllowedOpening","classes","attrs","suffix","hasRestrictions","Boolean","allowedClasses","includes","attributeStart","attribute","valueStart","value","isAllowedClass","split","every","className","separatorStart","isVoidToken","entry","endsWith","preserve","preserved","protectInlineCode","markdown","runs","precedingBackslashes","previous","escapedTickCount","nextRunByLength","Map","nextRun","Array","get","set","result","copiedThrough","closingIndex","opening","protectCode","lines","protectedLines","exec","marker","lastCodeLine","Math","min","join","sanitizeEditorInput","allowedHtml","withPlaceholders","forEach","keep","Set","openings","pop","allowed","add","reduce","has","replace","_","Number","desanitizeEditorOutput"],"sources":["../../../../../../../src/widgets/shared/documents/engines/markdownEditor/sanitizeForMdx.ts"],"sourcesContent":["/*\n MDXEditor parses markdown as MDX, so two kinds of input need neutralising before it sees them:\n 1. HTML injection: every `<` that is not part of explicitly allowed HTML is encoded as `&lt;`,\n making it inert text the parser cannot interpret as markup.\n 2. MDX expressions: `{` is encoded as `&#123;` so it is never evaluated.\n\n Allowed HTML is protected with placeholders rather than an HTML sanitiser, so content never\n passes through an HTML serialiser (which would encode `&` and other text and cause false diffs).\n \n SECURITY NOTE: HTML tokens are scanned linearly and validated without constructing regexes from\n the allowlist. Remaining regexes are fixed patterns with no nested ambiguous repetitions.\n */\n\nexport type AllowedHtmlEntry = {\n tag: string;\n classes?: string[];\n attrs?: string[];\n};\n\nconst PLACEHOLDER_MARK = String.fromCharCode(0xffff);\nconst placeholderPattern = /\\uFFFF(\\d+)\\uFFFF/g;\nconst hasPlaceholder = /\\uFFFF\\d+\\uFFFF/;\n\ntype HtmlToken = {\n index: number;\n token: string;\n closing: boolean;\n};\n\nconst isWhitespace = (character: string | undefined): boolean =>\n character !== undefined && /\\s/.test(character);\n\nconst findTagEnd = (input: string, start: number): number => {\n let quote: '\"' | '\\'' | undefined;\n for (let index = start; index < input.length; index += 1) {\n const character = input[index];\n if (character === '<') {\n return -1;\n }\n if (quote) {\n if (character === quote) {\n quote = undefined;\n }\n } else if (character === '\"' || character === '\\'') {\n quote = character;\n } else if (character === '>') {\n return index;\n }\n }\n return -1;\n};\n\nconst findHtmlTokens = (input: string, tag: string): HtmlToken[] => {\n const tokens: HtmlToken[] = [];\n const openingPrefix = `<${ tag }`;\n const closingToken = `</${ tag }>`;\n let searchFrom = 0;\n\n while (searchFrom < input.length) {\n const index = input.indexOf('<', searchFrom);\n if (index < 0) {\n break;\n }\n\n if (input.startsWith(closingToken, index)) {\n tokens.push({ index, token: closingToken, closing: true });\n searchFrom = index + closingToken.length;\n continue;\n }\n\n if (!input.startsWith(openingPrefix, index)) {\n searchFrom = index + 1;\n continue;\n }\n\n const nameEnd = index + openingPrefix.length;\n const boundary = input[nameEnd];\n if (boundary !== '/' && boundary !== '>' && !isWhitespace(boundary)) {\n searchFrom = index + 1;\n continue;\n }\n\n const end = findTagEnd(input, nameEnd);\n if (end < 0) {\n searchFrom = index + 1;\n continue;\n }\n\n tokens.push({ index, token: input.slice(index, end + 1), closing: false });\n searchFrom = end + 1;\n }\n\n return tokens;\n};\n\nconst isAllowedOpening = ({ tag, classes, attrs }: AllowedHtmlEntry, token: string): boolean => {\n const suffix = token.slice(tag.length + 1, -1);\n const hasRestrictions = Boolean(classes?.length || attrs?.length);\n const allowedClasses = classes ?? [];\n\n if (!hasRestrictions) {\n return suffix === '' ||\n suffix === '/' ||\n (isWhitespace(suffix[0]) && !suffix.includes('>'));\n }\n\n let index = 0;\n while (isWhitespace(suffix[index])) {\n index += 1;\n }\n if (index === suffix.length || (suffix[index] === '/' && index === suffix.length - 1)) {\n return true;\n }\n\n while (index < suffix.length) {\n const attributeStart = index;\n while (index < suffix.length && !isWhitespace(suffix[index]) && suffix[index] !== '=') {\n index += 1;\n }\n if (index === attributeStart || suffix[index] !== '=') {\n return false;\n }\n\n const attribute = suffix.slice(attributeStart, index);\n index += 1;\n if (suffix[index] !== '\"') {\n return false;\n }\n const valueStart = ++index;\n while (index < suffix.length && suffix[index] !== '\"') {\n index += 1;\n }\n if (index === suffix.length) {\n return false;\n }\n\n const value = suffix.slice(valueStart, index);\n const isAllowedClass = attribute === 'class' && allowedClasses.length > 0 &&\n value.split(/\\s+/).every((className) => className.length > 0 && allowedClasses.includes(className));\n if (!attrs?.includes(attribute) && !isAllowedClass) {\n return false;\n }\n\n index += 1;\n if (index === suffix.length) {\n return true;\n }\n const separatorStart = index;\n while (isWhitespace(suffix[index])) {\n index += 1;\n }\n if (index === suffix.length || (suffix[index] === '/' && index === suffix.length - 1)) {\n return true;\n }\n if (index === separatorStart) {\n return false;\n }\n }\n\n return true;\n};\n\nconst isVoidToken = (token: string, entry: AllowedHtmlEntry): boolean => token.endsWith('/>') || ['img', 'br'].includes(entry.tag);\n\nconst preserve = (value: string, preserved: string[]): string => {\n preserved.push(value);\n return `${ PLACEHOLDER_MARK }${ preserved.length - 1 }${ PLACEHOLDER_MARK }`;\n};\n\nconst protectInlineCode = (markdown: string, preserved: string[]): string => {\n const runs: { start: number; end: number; length: number }[] = [];\n for (let index = 0; index < markdown.length;) {\n if (markdown[index] !== '`') {\n index += 1;\n continue;\n }\n\n let end = index + 1;\n while (markdown[end] === '`') {\n end += 1;\n }\n let precedingBackslashes = 0;\n for (let previous = index - 1; previous >= 0 && markdown[previous] === '\\\\'; previous -= 1) {\n precedingBackslashes += 1;\n }\n const escapedTickCount = precedingBackslashes % 2;\n if (end - index > escapedTickCount) {\n runs.push({ start: index + escapedTickCount, end, length: end - index - escapedTickCount });\n }\n index = end;\n }\n\n const nextRunByLength = new Map<number, number>();\n const nextRun: (number | undefined)[] = new Array(runs.length);\n for (let index = runs.length - 1; index >= 0; index -= 1) {\n nextRun[index] = nextRunByLength.get(runs[index].length);\n nextRunByLength.set(runs[index].length, index);\n }\n\n let result = '';\n let copiedThrough = 0;\n for (let index = 0; index < runs.length; index += 1) {\n const closingIndex = nextRun[index];\n if (closingIndex === undefined) {\n continue;\n }\n\n const opening = runs[index];\n const closing = runs[closingIndex];\n result += markdown.slice(copiedThrough, opening.start);\n result += preserve(markdown.slice(opening.start, closing.end), preserved);\n copiedThrough = closing.end;\n index = closingIndex;\n }\n return result + markdown.slice(copiedThrough);\n};\n\nconst protectCode = (markdown: string, preserved: string[]): string => {\n const lines = markdown.split('\\n');\n const protectedLines: string[] = [];\n\n for (let index = 0; index < lines.length; index += 1) {\n const opening = /^ {0,3}(`{3,}|~{3,})/.exec(lines[index]);\n if (!opening) {\n protectedLines.push(lines[index]);\n continue;\n }\n\n const marker = opening[1];\n let closingIndex = index + 1;\n for (; closingIndex < lines.length; closingIndex += 1) {\n const closing = /^ {0,3}(`+|~+)[ \\t]*$/.exec(lines[closingIndex]);\n if (closing && closing[1][0] === marker[0] && closing[1].length >= marker.length) {\n break;\n }\n }\n\n const lastCodeLine = Math.min(closingIndex, lines.length - 1);\n protectedLines.push(preserve(lines.slice(index, lastCodeLine + 1).join('\\n'), preserved));\n index = lastCodeLine;\n }\n\n return protectInlineCode(protectedLines.join('\\n'), preserved);\n};\n\nexport const sanitizeEditorInput = (markdown: string, allowedHtml: AllowedHtmlEntry[] = []): string => {\n const preserved: string[] = [];\n let withPlaceholders = protectCode(markdown, preserved);\n\n allowedHtml.forEach((entry) => {\n const tokens = findHtmlTokens(withPlaceholders, entry.tag);\n const keep = new Set<number>();\n const openings: { index: number; allowed: boolean }[] = [];\n\n tokens.forEach(({ token, index, closing }) => {\n if (closing) {\n // A closing tag survives only alongside the allowed opening tag it pairs with.\n const opening = openings.pop();\n if (opening?.allowed) {\n keep.add(opening.index);\n keep.add(index);\n }\n } else if (isVoidToken(token, entry)) {\n if (isAllowedOpening(entry, token)) {\n keep.add(index);\n }\n } else {\n openings.push({ index, allowed: isAllowedOpening(entry, token) });\n }\n });\n\n let copiedThrough = 0;\n withPlaceholders = tokens.reduce((result, { index, token }) => {\n result += withPlaceholders.slice(copiedThrough, index);\n result += keep.has(index) ? preserve(token, preserved) : token;\n copiedThrough = index + token.length;\n return result;\n }, '') + withPlaceholders.slice(copiedThrough);\n });\n\n let result = withPlaceholders.replace(/</g, '&lt;').replace(/\\{/g, '&#123;');\n // Nested allowed elements leave placeholders inside restored placeholders, so repeat until none remain.\n while (hasPlaceholder.test(result)) {\n result = result.replace(placeholderPattern, (_, index: string) => preserved[Number(index)]);\n }\n return result;\n};\n\n/*\n Reverses the backslash escapes MDXEditor's serialiser adds for MDX/HTML reasons during its\n markdown -> AST -> markdown round-trip, so `&`, `{`, `}`, `<`, `>` and `\"` are saved literally.\n Markdown syntax escapes (\\*, \\#, \\-, ...) are deliberately left alone.\n */\nexport const desanitizeEditorOutput = (markdown: string): string => markdown\n .replace(/\\\\&/g, '&')\n .replace(/\\\\{/g, '{')\n .replace(/\\\\}/g, '}')\n .replace(/\\\\</g, '<')\n .replace(/\\\\>/g, '>')\n .replace(/\\\\\"/g, '\"');\n"],"mappings":"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","ignoreList":[]}