@intlayer/core 8.1.2 → 8.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (408) hide show
  1. package/dist/cjs/_virtual/_rolldown/runtime.cjs +1 -29
  2. package/dist/cjs/deepTransformPlugins/getFilterMissingTranslationsContent.cjs +1 -212
  3. package/dist/cjs/deepTransformPlugins/getFilterMissingTranslationsContent.cjs.map +1 -1
  4. package/dist/cjs/deepTransformPlugins/getFilterTranslationsOnlyContent.cjs +1 -94
  5. package/dist/cjs/deepTransformPlugins/getFilterTranslationsOnlyContent.cjs.map +1 -1
  6. package/dist/cjs/deepTransformPlugins/getFilteredLocalesContent.cjs +1 -45
  7. package/dist/cjs/deepTransformPlugins/getFilteredLocalesContent.cjs.map +1 -1
  8. package/dist/cjs/deepTransformPlugins/getLocalizedContent.cjs +1 -33
  9. package/dist/cjs/deepTransformPlugins/getLocalizedContent.cjs.map +1 -1
  10. package/dist/cjs/deepTransformPlugins/getMaskContent.cjs +1 -27
  11. package/dist/cjs/deepTransformPlugins/getMaskContent.cjs.map +1 -1
  12. package/dist/cjs/deepTransformPlugins/getMissingLocalesContent.cjs +1 -82
  13. package/dist/cjs/deepTransformPlugins/getMissingLocalesContent.cjs.map +1 -1
  14. package/dist/cjs/deepTransformPlugins/getMultilingualDictionary.cjs +1 -87
  15. package/dist/cjs/deepTransformPlugins/getMultilingualDictionary.cjs.map +1 -1
  16. package/dist/cjs/deepTransformPlugins/getReplacedValuesContent.cjs +1 -60
  17. package/dist/cjs/deepTransformPlugins/getReplacedValuesContent.cjs.map +1 -1
  18. package/dist/cjs/deepTransformPlugins/getSplittedContent.cjs +1 -122
  19. package/dist/cjs/deepTransformPlugins/getSplittedContent.cjs.map +1 -1
  20. package/dist/cjs/deepTransformPlugins/index.cjs +1 -32
  21. package/dist/cjs/deepTransformPlugins/insertContentInDictionary.cjs +1 -106
  22. package/dist/cjs/deepTransformPlugins/insertContentInDictionary.cjs.map +1 -1
  23. package/dist/cjs/dictionaryManipulator/editDictionaryByKeyPath.cjs +1 -64
  24. package/dist/cjs/dictionaryManipulator/editDictionaryByKeyPath.cjs.map +1 -1
  25. package/dist/cjs/dictionaryManipulator/getContentNodeByKeyPath.cjs +1 -18
  26. package/dist/cjs/dictionaryManipulator/getContentNodeByKeyPath.cjs.map +1 -1
  27. package/dist/cjs/dictionaryManipulator/getDefaultNode.cjs +1 -55
  28. package/dist/cjs/dictionaryManipulator/getDefaultNode.cjs.map +1 -1
  29. package/dist/cjs/dictionaryManipulator/getEmptyNode.cjs +1 -26
  30. package/dist/cjs/dictionaryManipulator/getEmptyNode.cjs.map +1 -1
  31. package/dist/cjs/dictionaryManipulator/getNodeChildren.cjs +1 -23
  32. package/dist/cjs/dictionaryManipulator/getNodeChildren.cjs.map +1 -1
  33. package/dist/cjs/dictionaryManipulator/getNodeType.cjs +1 -36
  34. package/dist/cjs/dictionaryManipulator/getNodeType.cjs.map +1 -1
  35. package/dist/cjs/dictionaryManipulator/index.cjs +1 -27
  36. package/dist/cjs/dictionaryManipulator/mergeDictionaries.cjs +1 -69
  37. package/dist/cjs/dictionaryManipulator/mergeDictionaries.cjs.map +1 -1
  38. package/dist/cjs/dictionaryManipulator/normalizeDictionary.cjs +1 -30
  39. package/dist/cjs/dictionaryManipulator/normalizeDictionary.cjs.map +1 -1
  40. package/dist/cjs/dictionaryManipulator/orderDictionaries.cjs +1 -48
  41. package/dist/cjs/dictionaryManipulator/orderDictionaries.cjs.map +1 -1
  42. package/dist/cjs/dictionaryManipulator/removeContentNodeByKeyPath.cjs +1 -31
  43. package/dist/cjs/dictionaryManipulator/removeContentNodeByKeyPath.cjs.map +1 -1
  44. package/dist/cjs/dictionaryManipulator/renameContentNodeByKeyPath.cjs +1 -39
  45. package/dist/cjs/dictionaryManipulator/renameContentNodeByKeyPath.cjs.map +1 -1
  46. package/dist/cjs/dictionaryManipulator/updateNodeChildren.cjs +1 -38
  47. package/dist/cjs/dictionaryManipulator/updateNodeChildren.cjs.map +1 -1
  48. package/dist/cjs/formatters/compact.cjs +1 -25
  49. package/dist/cjs/formatters/compact.cjs.map +1 -1
  50. package/dist/cjs/formatters/currency.cjs +1 -29
  51. package/dist/cjs/formatters/currency.cjs.map +1 -1
  52. package/dist/cjs/formatters/date.cjs +1 -60
  53. package/dist/cjs/formatters/date.cjs.map +1 -1
  54. package/dist/cjs/formatters/index.cjs +1 -18
  55. package/dist/cjs/formatters/list.cjs +1 -30
  56. package/dist/cjs/formatters/list.cjs.map +1 -1
  57. package/dist/cjs/formatters/number.cjs +1 -18
  58. package/dist/cjs/formatters/number.cjs.map +1 -1
  59. package/dist/cjs/formatters/percentage.cjs +1 -25
  60. package/dist/cjs/formatters/percentage.cjs.map +1 -1
  61. package/dist/cjs/formatters/relativeTime.cjs +1 -33
  62. package/dist/cjs/formatters/relativeTime.cjs.map +1 -1
  63. package/dist/cjs/formatters/units.cjs +1 -23
  64. package/dist/cjs/formatters/units.cjs.map +1 -1
  65. package/dist/cjs/getStorageAttributes.cjs +1 -134
  66. package/dist/cjs/getStorageAttributes.cjs.map +1 -1
  67. package/dist/cjs/index.cjs +1 -300
  68. package/dist/cjs/interpreter/getCondition.cjs +1 -27
  69. package/dist/cjs/interpreter/getCondition.cjs.map +1 -1
  70. package/dist/cjs/interpreter/getContent/deepTransform.cjs +1 -41
  71. package/dist/cjs/interpreter/getContent/deepTransform.cjs.map +1 -1
  72. package/dist/cjs/interpreter/getContent/getContent.cjs +1 -34
  73. package/dist/cjs/interpreter/getContent/getContent.cjs.map +1 -1
  74. package/dist/cjs/interpreter/getContent/index.cjs +1 -14
  75. package/dist/cjs/interpreter/getContent/plugins.cjs +1 -161
  76. package/dist/cjs/interpreter/getContent/plugins.cjs.map +1 -1
  77. package/dist/cjs/interpreter/getDictionary.cjs +1 -24
  78. package/dist/cjs/interpreter/getDictionary.cjs.map +1 -1
  79. package/dist/cjs/interpreter/getEnumeration.cjs +1 -72
  80. package/dist/cjs/interpreter/getEnumeration.cjs.map +1 -1
  81. package/dist/cjs/interpreter/getGender.cjs +1 -38
  82. package/dist/cjs/interpreter/getGender.cjs.map +1 -1
  83. package/dist/cjs/interpreter/getHTML.cjs +1 -121
  84. package/dist/cjs/interpreter/getHTML.cjs.map +1 -1
  85. package/dist/cjs/interpreter/getInsertion.cjs +1 -22
  86. package/dist/cjs/interpreter/getInsertion.cjs.map +1 -1
  87. package/dist/cjs/interpreter/getIntlayer.cjs +1 -40
  88. package/dist/cjs/interpreter/getIntlayer.cjs.map +1 -1
  89. package/dist/cjs/interpreter/getNesting.cjs +1 -36
  90. package/dist/cjs/interpreter/getNesting.cjs.map +1 -1
  91. package/dist/cjs/interpreter/getTranslation.cjs +1 -112
  92. package/dist/cjs/interpreter/getTranslation.cjs.map +1 -1
  93. package/dist/cjs/interpreter/index.cjs +1 -31
  94. package/dist/cjs/interpreter/splitAndJoinInsertion.cjs +1 -55
  95. package/dist/cjs/interpreter/splitAndJoinInsertion.cjs.map +1 -1
  96. package/dist/cjs/localization/getBrowserLocale.cjs +1 -143
  97. package/dist/cjs/localization/getBrowserLocale.cjs.map +1 -1
  98. package/dist/cjs/localization/getHTMLTextDir.cjs +1 -64
  99. package/dist/cjs/localization/getHTMLTextDir.cjs.map +1 -1
  100. package/dist/cjs/localization/getLocale.cjs +1 -27
  101. package/dist/cjs/localization/getLocale.cjs.map +1 -1
  102. package/dist/cjs/localization/getLocaleFromPath.cjs +1 -45
  103. package/dist/cjs/localization/getLocaleFromPath.cjs.map +1 -1
  104. package/dist/cjs/localization/getLocaleLang.cjs +1 -20
  105. package/dist/cjs/localization/getLocaleLang.cjs.map +1 -1
  106. package/dist/cjs/localization/getLocaleName.cjs +1 -10
  107. package/dist/cjs/localization/getLocaleName.cjs.map +1 -1
  108. package/dist/cjs/localization/getLocalizedUrl.cjs +1 -82
  109. package/dist/cjs/localization/getLocalizedUrl.cjs.map +1 -1
  110. package/dist/cjs/localization/getMultilingualUrls.cjs +1 -63
  111. package/dist/cjs/localization/getMultilingualUrls.cjs.map +1 -1
  112. package/dist/cjs/localization/getPathWithoutLocale.cjs +1 -55
  113. package/dist/cjs/localization/getPathWithoutLocale.cjs.map +1 -1
  114. package/dist/cjs/localization/getPrefix.cjs +1 -63
  115. package/dist/cjs/localization/getPrefix.cjs.map +1 -1
  116. package/dist/cjs/localization/index.cjs +1 -39
  117. package/dist/cjs/localization/localeDetector.cjs +1 -133
  118. package/dist/cjs/localization/localeDetector.cjs.map +1 -1
  119. package/dist/cjs/localization/localeMapper.cjs +1 -119
  120. package/dist/cjs/localization/localeMapper.cjs.map +1 -1
  121. package/dist/cjs/localization/localeResolver.cjs +1 -28
  122. package/dist/cjs/localization/localeResolver.cjs.map +1 -1
  123. package/dist/cjs/localization/rewriteUtils.cjs +1 -110
  124. package/dist/cjs/localization/rewriteUtils.cjs.map +1 -1
  125. package/dist/cjs/localization/validatePrefix.cjs +1 -54
  126. package/dist/cjs/localization/validatePrefix.cjs.map +1 -1
  127. package/dist/cjs/markdown/compiler.cjs +10 -810
  128. package/dist/cjs/markdown/compiler.cjs.map +1 -1
  129. package/dist/cjs/markdown/constants.cjs +1 -328
  130. package/dist/cjs/markdown/constants.cjs.map +1 -1
  131. package/dist/cjs/markdown/index.cjs +1 -120
  132. package/dist/cjs/markdown/parser.cjs +1 -66
  133. package/dist/cjs/markdown/parser.cjs.map +1 -1
  134. package/dist/cjs/markdown/renderer.cjs +1 -61
  135. package/dist/cjs/markdown/renderer.cjs.map +1 -1
  136. package/dist/cjs/markdown/utils.cjs +6 -391
  137. package/dist/cjs/markdown/utils.cjs.map +1 -1
  138. package/dist/cjs/messageFormat/ICU.cjs +1 -319
  139. package/dist/cjs/messageFormat/ICU.cjs.map +1 -1
  140. package/dist/cjs/messageFormat/i18next.cjs +1 -330
  141. package/dist/cjs/messageFormat/i18next.cjs.map +1 -1
  142. package/dist/cjs/messageFormat/index.cjs +1 -11
  143. package/dist/cjs/messageFormat/verify-icu-format.cjs +2 -64
  144. package/dist/cjs/messageFormat/verify-icu-format.cjs.map +1 -1
  145. package/dist/cjs/messageFormat/vue-i18n.cjs +1 -166
  146. package/dist/cjs/messageFormat/vue-i18n.cjs.map +1 -1
  147. package/dist/cjs/transpiler/condition/condition.cjs +1 -26
  148. package/dist/cjs/transpiler/condition/condition.cjs.map +1 -1
  149. package/dist/cjs/transpiler/condition/index.cjs +1 -4
  150. package/dist/cjs/transpiler/enumeration/enumeration.cjs +1 -28
  151. package/dist/cjs/transpiler/enumeration/enumeration.cjs.map +1 -1
  152. package/dist/cjs/transpiler/enumeration/index.cjs +1 -4
  153. package/dist/cjs/transpiler/file/file.cjs +1 -52
  154. package/dist/cjs/transpiler/file/file.cjs.map +1 -1
  155. package/dist/cjs/transpiler/file/fileBrowser.cjs +1 -25
  156. package/dist/cjs/transpiler/file/fileBrowser.cjs.map +1 -1
  157. package/dist/cjs/transpiler/file/index.cjs +1 -5
  158. package/dist/cjs/transpiler/gender/gender.cjs +1 -26
  159. package/dist/cjs/transpiler/gender/gender.cjs.map +1 -1
  160. package/dist/cjs/transpiler/gender/index.cjs +1 -4
  161. package/dist/cjs/transpiler/html/getHTMLCustomComponents.cjs +1 -44
  162. package/dist/cjs/transpiler/html/getHTMLCustomComponents.cjs.map +1 -1
  163. package/dist/cjs/transpiler/html/html.cjs +1 -37
  164. package/dist/cjs/transpiler/html/html.cjs.map +1 -1
  165. package/dist/cjs/transpiler/html/htmlTags.cjs +1 -116
  166. package/dist/cjs/transpiler/html/htmlTags.cjs.map +1 -1
  167. package/dist/cjs/transpiler/html/index.cjs +1 -6
  168. package/dist/cjs/transpiler/index.cjs +1 -24
  169. package/dist/cjs/transpiler/insertion/getInsertionValues.cjs +1 -11
  170. package/dist/cjs/transpiler/insertion/getInsertionValues.cjs.map +1 -1
  171. package/dist/cjs/transpiler/insertion/index.cjs +1 -6
  172. package/dist/cjs/transpiler/insertion/insertion.cjs +1 -36
  173. package/dist/cjs/transpiler/insertion/insertion.cjs.map +1 -1
  174. package/dist/cjs/transpiler/markdown/getMarkdownMetadata.cjs +2 -23
  175. package/dist/cjs/transpiler/markdown/getMarkdownMetadata.cjs.map +1 -1
  176. package/dist/cjs/transpiler/markdown/index.cjs +1 -6
  177. package/dist/cjs/transpiler/markdown/markdown.cjs +1 -54
  178. package/dist/cjs/transpiler/markdown/markdown.cjs.map +1 -1
  179. package/dist/cjs/transpiler/nesting/index.cjs +1 -4
  180. package/dist/cjs/transpiler/nesting/nesting.cjs +1 -27
  181. package/dist/cjs/transpiler/nesting/nesting.cjs.map +1 -1
  182. package/dist/cjs/transpiler/translation/index.cjs +1 -4
  183. package/dist/cjs/transpiler/translation/translation.cjs +1 -29
  184. package/dist/cjs/transpiler/translation/translation.cjs.map +1 -1
  185. package/dist/cjs/utils/checkIsURLAbsolute.cjs +1 -7
  186. package/dist/cjs/utils/checkIsURLAbsolute.cjs.map +1 -1
  187. package/dist/cjs/utils/getCookie.cjs +1 -32
  188. package/dist/cjs/utils/getCookie.cjs.map +1 -1
  189. package/dist/cjs/utils/index.cjs +1 -0
  190. package/dist/cjs/utils/intl.cjs +1 -91
  191. package/dist/cjs/utils/intl.cjs.map +1 -1
  192. package/dist/cjs/utils/isSameKeyPath.cjs +1 -7
  193. package/dist/cjs/utils/isSameKeyPath.cjs.map +1 -1
  194. package/dist/cjs/utils/isValidReactElement.cjs +1 -14
  195. package/dist/cjs/utils/isValidReactElement.cjs.map +1 -1
  196. package/dist/cjs/utils/localeStorage.cjs +1 -140
  197. package/dist/cjs/utils/localeStorage.cjs.map +1 -1
  198. package/dist/cjs/utils/parseYaml.cjs +16 -322
  199. package/dist/cjs/utils/parseYaml.cjs.map +1 -1
  200. package/dist/esm/deepTransformPlugins/getFilterMissingTranslationsContent.mjs +1 -207
  201. package/dist/esm/deepTransformPlugins/getFilterMissingTranslationsContent.mjs.map +1 -1
  202. package/dist/esm/deepTransformPlugins/getFilterTranslationsOnlyContent.mjs +1 -89
  203. package/dist/esm/deepTransformPlugins/getFilterTranslationsOnlyContent.mjs.map +1 -1
  204. package/dist/esm/deepTransformPlugins/getFilteredLocalesContent.mjs +1 -42
  205. package/dist/esm/deepTransformPlugins/getFilteredLocalesContent.mjs.map +1 -1
  206. package/dist/esm/deepTransformPlugins/getLocalizedContent.mjs +1 -31
  207. package/dist/esm/deepTransformPlugins/getLocalizedContent.mjs.map +1 -1
  208. package/dist/esm/deepTransformPlugins/getMaskContent.mjs +1 -25
  209. package/dist/esm/deepTransformPlugins/getMaskContent.mjs.map +1 -1
  210. package/dist/esm/deepTransformPlugins/getMissingLocalesContent.mjs +1 -77
  211. package/dist/esm/deepTransformPlugins/getMissingLocalesContent.mjs.map +1 -1
  212. package/dist/esm/deepTransformPlugins/getMultilingualDictionary.mjs +1 -86
  213. package/dist/esm/deepTransformPlugins/getMultilingualDictionary.mjs.map +1 -1
  214. package/dist/esm/deepTransformPlugins/getReplacedValuesContent.mjs +1 -59
  215. package/dist/esm/deepTransformPlugins/getReplacedValuesContent.mjs.map +1 -1
  216. package/dist/esm/deepTransformPlugins/getSplittedContent.mjs +1 -119
  217. package/dist/esm/deepTransformPlugins/getSplittedContent.mjs.map +1 -1
  218. package/dist/esm/deepTransformPlugins/index.mjs +1 -12
  219. package/dist/esm/deepTransformPlugins/insertContentInDictionary.mjs +1 -104
  220. package/dist/esm/deepTransformPlugins/insertContentInDictionary.mjs.map +1 -1
  221. package/dist/esm/dictionaryManipulator/editDictionaryByKeyPath.mjs +1 -62
  222. package/dist/esm/dictionaryManipulator/editDictionaryByKeyPath.mjs.map +1 -1
  223. package/dist/esm/dictionaryManipulator/getContentNodeByKeyPath.mjs +1 -16
  224. package/dist/esm/dictionaryManipulator/getContentNodeByKeyPath.mjs.map +1 -1
  225. package/dist/esm/dictionaryManipulator/getDefaultNode.mjs +1 -53
  226. package/dist/esm/dictionaryManipulator/getDefaultNode.mjs.map +1 -1
  227. package/dist/esm/dictionaryManipulator/getEmptyNode.mjs +1 -24
  228. package/dist/esm/dictionaryManipulator/getEmptyNode.mjs.map +1 -1
  229. package/dist/esm/dictionaryManipulator/getNodeChildren.mjs +1 -21
  230. package/dist/esm/dictionaryManipulator/getNodeChildren.mjs.map +1 -1
  231. package/dist/esm/dictionaryManipulator/getNodeType.mjs +1 -34
  232. package/dist/esm/dictionaryManipulator/getNodeType.mjs.map +1 -1
  233. package/dist/esm/dictionaryManipulator/index.mjs +1 -14
  234. package/dist/esm/dictionaryManipulator/mergeDictionaries.mjs +1 -66
  235. package/dist/esm/dictionaryManipulator/mergeDictionaries.mjs.map +1 -1
  236. package/dist/esm/dictionaryManipulator/normalizeDictionary.mjs +1 -28
  237. package/dist/esm/dictionaryManipulator/normalizeDictionary.mjs.map +1 -1
  238. package/dist/esm/dictionaryManipulator/orderDictionaries.mjs +1 -45
  239. package/dist/esm/dictionaryManipulator/orderDictionaries.mjs.map +1 -1
  240. package/dist/esm/dictionaryManipulator/removeContentNodeByKeyPath.mjs +1 -29
  241. package/dist/esm/dictionaryManipulator/removeContentNodeByKeyPath.mjs.map +1 -1
  242. package/dist/esm/dictionaryManipulator/renameContentNodeByKeyPath.mjs +1 -37
  243. package/dist/esm/dictionaryManipulator/renameContentNodeByKeyPath.mjs.map +1 -1
  244. package/dist/esm/dictionaryManipulator/updateNodeChildren.mjs +1 -36
  245. package/dist/esm/dictionaryManipulator/updateNodeChildren.mjs.map +1 -1
  246. package/dist/esm/formatters/compact.mjs +1 -22
  247. package/dist/esm/formatters/compact.mjs.map +1 -1
  248. package/dist/esm/formatters/currency.mjs +1 -26
  249. package/dist/esm/formatters/currency.mjs.map +1 -1
  250. package/dist/esm/formatters/date.mjs +1 -57
  251. package/dist/esm/formatters/date.mjs.map +1 -1
  252. package/dist/esm/formatters/index.mjs +1 -10
  253. package/dist/esm/formatters/list.mjs +1 -27
  254. package/dist/esm/formatters/list.mjs.map +1 -1
  255. package/dist/esm/formatters/number.mjs +1 -15
  256. package/dist/esm/formatters/number.mjs.map +1 -1
  257. package/dist/esm/formatters/percentage.mjs +1 -22
  258. package/dist/esm/formatters/percentage.mjs.map +1 -1
  259. package/dist/esm/formatters/relativeTime.mjs +1 -30
  260. package/dist/esm/formatters/relativeTime.mjs.map +1 -1
  261. package/dist/esm/formatters/units.mjs +1 -20
  262. package/dist/esm/formatters/units.mjs.map +1 -1
  263. package/dist/esm/getStorageAttributes.mjs +1 -132
  264. package/dist/esm/getStorageAttributes.mjs.map +1 -1
  265. package/dist/esm/index.mjs +1 -82
  266. package/dist/esm/interpreter/getCondition.mjs +1 -25
  267. package/dist/esm/interpreter/getCondition.mjs.map +1 -1
  268. package/dist/esm/interpreter/getContent/deepTransform.mjs +1 -39
  269. package/dist/esm/interpreter/getContent/deepTransform.mjs.map +1 -1
  270. package/dist/esm/interpreter/getContent/getContent.mjs +1 -31
  271. package/dist/esm/interpreter/getContent/getContent.mjs.map +1 -1
  272. package/dist/esm/interpreter/getContent/index.mjs +1 -5
  273. package/dist/esm/interpreter/getContent/plugins.mjs +1 -153
  274. package/dist/esm/interpreter/getContent/plugins.mjs.map +1 -1
  275. package/dist/esm/interpreter/getDictionary.mjs +1 -23
  276. package/dist/esm/interpreter/getDictionary.mjs.map +1 -1
  277. package/dist/esm/interpreter/getEnumeration.mjs +1 -69
  278. package/dist/esm/interpreter/getEnumeration.mjs.map +1 -1
  279. package/dist/esm/interpreter/getGender.mjs +1 -36
  280. package/dist/esm/interpreter/getGender.mjs.map +1 -1
  281. package/dist/esm/interpreter/getHTML.mjs +1 -119
  282. package/dist/esm/interpreter/getHTML.mjs.map +1 -1
  283. package/dist/esm/interpreter/getInsertion.mjs +1 -20
  284. package/dist/esm/interpreter/getInsertion.mjs.map +1 -1
  285. package/dist/esm/interpreter/getIntlayer.mjs +1 -36
  286. package/dist/esm/interpreter/getIntlayer.mjs.map +1 -1
  287. package/dist/esm/interpreter/getNesting.mjs +1 -35
  288. package/dist/esm/interpreter/getNesting.mjs.map +1 -1
  289. package/dist/esm/interpreter/getTranslation.mjs +1 -110
  290. package/dist/esm/interpreter/getTranslation.mjs.map +1 -1
  291. package/dist/esm/interpreter/index.mjs +1 -13
  292. package/dist/esm/interpreter/splitAndJoinInsertion.mjs +1 -53
  293. package/dist/esm/interpreter/splitAndJoinInsertion.mjs.map +1 -1
  294. package/dist/esm/localization/getBrowserLocale.mjs +1 -138
  295. package/dist/esm/localization/getBrowserLocale.mjs.map +1 -1
  296. package/dist/esm/localization/getHTMLTextDir.mjs +1 -62
  297. package/dist/esm/localization/getHTMLTextDir.mjs.map +1 -1
  298. package/dist/esm/localization/getLocale.mjs +1 -24
  299. package/dist/esm/localization/getLocale.mjs.map +1 -1
  300. package/dist/esm/localization/getLocaleFromPath.mjs +1 -42
  301. package/dist/esm/localization/getLocaleFromPath.mjs.map +1 -1
  302. package/dist/esm/localization/getLocaleLang.mjs +1 -18
  303. package/dist/esm/localization/getLocaleLang.mjs.map +1 -1
  304. package/dist/esm/localization/getLocaleName.mjs +1 -9
  305. package/dist/esm/localization/getLocaleName.mjs.map +1 -1
  306. package/dist/esm/localization/getLocalizedUrl.mjs +1 -79
  307. package/dist/esm/localization/getLocalizedUrl.mjs.map +1 -1
  308. package/dist/esm/localization/getMultilingualUrls.mjs +1 -60
  309. package/dist/esm/localization/getMultilingualUrls.mjs.map +1 -1
  310. package/dist/esm/localization/getPathWithoutLocale.mjs +1 -52
  311. package/dist/esm/localization/getPathWithoutLocale.mjs.map +1 -1
  312. package/dist/esm/localization/getPrefix.mjs +1 -60
  313. package/dist/esm/localization/getPrefix.mjs.map +1 -1
  314. package/dist/esm/localization/index.mjs +1 -17
  315. package/dist/esm/localization/localeDetector.mjs +1 -131
  316. package/dist/esm/localization/localeDetector.mjs.map +1 -1
  317. package/dist/esm/localization/localeMapper.mjs +1 -114
  318. package/dist/esm/localization/localeMapper.mjs.map +1 -1
  319. package/dist/esm/localization/localeResolver.mjs +1 -25
  320. package/dist/esm/localization/localeResolver.mjs.map +1 -1
  321. package/dist/esm/localization/rewriteUtils.mjs +1 -104
  322. package/dist/esm/localization/rewriteUtils.mjs.map +1 -1
  323. package/dist/esm/localization/validatePrefix.mjs +1 -51
  324. package/dist/esm/localization/validatePrefix.mjs.map +1 -1
  325. package/dist/esm/markdown/compiler.mjs +10 -786
  326. package/dist/esm/markdown/compiler.mjs.map +1 -1
  327. package/dist/esm/markdown/constants.mjs +1 -247
  328. package/dist/esm/markdown/constants.mjs.map +1 -1
  329. package/dist/esm/markdown/index.mjs +1 -7
  330. package/dist/esm/markdown/parser.mjs +1 -65
  331. package/dist/esm/markdown/parser.mjs.map +1 -1
  332. package/dist/esm/markdown/renderer.mjs +1 -59
  333. package/dist/esm/markdown/renderer.mjs.map +1 -1
  334. package/dist/esm/markdown/utils.mjs +6 -361
  335. package/dist/esm/markdown/utils.mjs.map +1 -1
  336. package/dist/esm/messageFormat/ICU.mjs +1 -316
  337. package/dist/esm/messageFormat/ICU.mjs.map +1 -1
  338. package/dist/esm/messageFormat/i18next.mjs +1 -327
  339. package/dist/esm/messageFormat/i18next.mjs.map +1 -1
  340. package/dist/esm/messageFormat/index.mjs +1 -5
  341. package/dist/esm/messageFormat/verify-icu-format.mjs +2 -64
  342. package/dist/esm/messageFormat/verify-icu-format.mjs.map +1 -1
  343. package/dist/esm/messageFormat/vue-i18n.mjs +1 -163
  344. package/dist/esm/messageFormat/vue-i18n.mjs.map +1 -1
  345. package/dist/esm/transpiler/condition/condition.mjs +1 -24
  346. package/dist/esm/transpiler/condition/condition.mjs.map +1 -1
  347. package/dist/esm/transpiler/condition/index.mjs +1 -3
  348. package/dist/esm/transpiler/enumeration/enumeration.mjs +1 -26
  349. package/dist/esm/transpiler/enumeration/enumeration.mjs.map +1 -1
  350. package/dist/esm/transpiler/enumeration/index.mjs +1 -3
  351. package/dist/esm/transpiler/file/file.mjs +1 -49
  352. package/dist/esm/transpiler/file/file.mjs.map +1 -1
  353. package/dist/esm/transpiler/file/fileBrowser.mjs +1 -24
  354. package/dist/esm/transpiler/file/fileBrowser.mjs.map +1 -1
  355. package/dist/esm/transpiler/file/index.mjs +1 -3
  356. package/dist/esm/transpiler/gender/gender.mjs +1 -24
  357. package/dist/esm/transpiler/gender/gender.mjs.map +1 -1
  358. package/dist/esm/transpiler/gender/index.mjs +1 -3
  359. package/dist/esm/transpiler/html/getHTMLCustomComponents.mjs +1 -43
  360. package/dist/esm/transpiler/html/getHTMLCustomComponents.mjs.map +1 -1
  361. package/dist/esm/transpiler/html/html.mjs +1 -35
  362. package/dist/esm/transpiler/html/html.mjs.map +1 -1
  363. package/dist/esm/transpiler/html/htmlTags.mjs +1 -114
  364. package/dist/esm/transpiler/html/htmlTags.mjs.map +1 -1
  365. package/dist/esm/transpiler/html/index.mjs +1 -4
  366. package/dist/esm/transpiler/index.mjs +1 -13
  367. package/dist/esm/transpiler/insertion/getInsertionValues.mjs +1 -9
  368. package/dist/esm/transpiler/insertion/getInsertionValues.mjs.map +1 -1
  369. package/dist/esm/transpiler/insertion/index.mjs +1 -4
  370. package/dist/esm/transpiler/insertion/insertion.mjs +1 -34
  371. package/dist/esm/transpiler/insertion/insertion.mjs.map +1 -1
  372. package/dist/esm/transpiler/markdown/getMarkdownMetadata.mjs +2 -22
  373. package/dist/esm/transpiler/markdown/getMarkdownMetadata.mjs.map +1 -1
  374. package/dist/esm/transpiler/markdown/index.mjs +1 -4
  375. package/dist/esm/transpiler/markdown/markdown.mjs +1 -52
  376. package/dist/esm/transpiler/markdown/markdown.mjs.map +1 -1
  377. package/dist/esm/transpiler/nesting/index.mjs +1 -3
  378. package/dist/esm/transpiler/nesting/nesting.mjs +1 -25
  379. package/dist/esm/transpiler/nesting/nesting.mjs.map +1 -1
  380. package/dist/esm/transpiler/translation/index.mjs +1 -3
  381. package/dist/esm/transpiler/translation/translation.mjs +1 -27
  382. package/dist/esm/transpiler/translation/translation.mjs.map +1 -1
  383. package/dist/esm/utils/checkIsURLAbsolute.mjs +1 -5
  384. package/dist/esm/utils/checkIsURLAbsolute.mjs.map +1 -1
  385. package/dist/esm/utils/getCookie.mjs +1 -30
  386. package/dist/esm/utils/getCookie.mjs.map +1 -1
  387. package/dist/esm/utils/index.mjs +1 -0
  388. package/dist/esm/utils/intl.mjs +1 -86
  389. package/dist/esm/utils/intl.mjs.map +1 -1
  390. package/dist/esm/utils/isSameKeyPath.mjs +1 -5
  391. package/dist/esm/utils/isSameKeyPath.mjs.map +1 -1
  392. package/dist/esm/utils/isValidReactElement.mjs +1 -12
  393. package/dist/esm/utils/isValidReactElement.mjs.map +1 -1
  394. package/dist/esm/utils/localeStorage.mjs +1 -135
  395. package/dist/esm/utils/localeStorage.mjs.map +1 -1
  396. package/dist/esm/utils/parseYaml.mjs +16 -320
  397. package/dist/esm/utils/parseYaml.mjs.map +1 -1
  398. package/dist/types/formatters/index.d.ts +2 -1
  399. package/dist/types/index.d.ts +8 -2
  400. package/dist/types/interpreter/getContent/plugins.d.ts +4 -4
  401. package/dist/types/interpreter/getContent/plugins.d.ts.map +1 -1
  402. package/dist/types/localization/index.d.ts +2 -1
  403. package/dist/types/markdown/index.d.ts +4 -1
  404. package/dist/types/markdown/types.d.ts +1 -1
  405. package/dist/types/markdown/types.d.ts.map +1 -1
  406. package/dist/types/transpiler/translation/translation.d.ts +1 -1
  407. package/dist/types/utils/index.d.ts +8 -0
  408. package/package.json +65 -11
@@ -1,392 +1,7 @@
1
- Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
- const require_markdown_constants = require('./constants.cjs');
3
-
4
- //#region src/markdown/utils.ts
5
- /**
6
- * Trim trailing whitespace from a string.
7
- */
8
- const trimEnd = (str) => {
9
- let end = str.length;
10
- while (end > 0 && str[end - 1] <= " ") end--;
11
- return str.slice(0, end);
12
- };
13
- /**
14
- * Check if string starts with prefix.
15
- */
16
- const startsWith = (str, prefix) => {
17
- return str.startsWith(prefix);
18
- };
19
- /**
20
- * Remove symmetrical leading and trailing quotes.
21
- */
22
- const unquote = (str) => {
23
- const first = str[0];
24
- if ((first === "\"" || first === "'") && str.length >= 2 && str[str.length - 1] === first) return str.slice(1, -1);
25
- return str;
26
- };
27
- /**
28
- * Unescape backslash-escaped characters.
29
- */
30
- const unescapeString = (rawString) => rawString ? rawString.replace(require_markdown_constants.UNESCAPE_R, "$1") : rawString;
31
- /**
32
- * Join class names, filtering out falsy values.
33
- */
34
- const cx = (...args) => args.filter(Boolean).join(" ");
35
- /**
36
- * Get a nested property from an object using dot notation.
37
- */
38
- const get = (src, path, fb) => {
39
- let ptr = src;
40
- const frags = path.split(".");
41
- while (frags.length) {
42
- ptr = ptr[frags[0]];
43
- if (ptr === void 0) break;
44
- else frags.shift();
45
- }
46
- return ptr ?? fb;
47
- };
48
- /**
49
- * Convert a string to a URL-safe slug.
50
- * Based on https://stackoverflow.com/a/18123682/1141611
51
- */
52
- const slugify = (str) => str.replace(/[ÀÁÂÃÄÅàáâãä忯]/g, "a").replace(/[çÇ]/g, "c").replace(/[ðÐ]/g, "d").replace(/[ÈÉÊËéèêë]/g, "e").replace(/[ÏïÎîÍíÌì]/g, "i").replace(/[Ññ]/g, "n").replace(/[øØœŒÕõÔôÓóÒò]/g, "o").replace(/[ÜüÛûÚúÙù]/g, "u").replace(/[ŸÿÝý]/g, "y").replace(/[^a-z0-9- ]/gi, "").replace(/ /gi, "-").toLowerCase();
53
- const SANITIZE_R = /(javascript|vbscript|data(?!:image)):/i;
54
- /**
55
- * Sanitize URLs to prevent XSS attacks.
56
- * Returns null if the URL is unsafe.
57
- */
58
- const sanitizer = (input) => {
59
- try {
60
- const decoded = decodeURIComponent(input).replace(/[^A-Za-z0-9/:]/g, "");
61
- if (SANITIZE_R.test(decoded)) {
62
- if (process.env.NODE_ENV !== "production") console.warn("Input contains an unsafe JavaScript/VBScript/data expression, it will not be rendered.", decoded);
63
- return null;
64
- }
65
- } catch (_e) {
66
- if (process.env.NODE_ENV !== "production") console.warn("Input could not be decoded due to malformed syntax or characters, it will not be rendered.", input);
67
- return null;
68
- }
69
- return input;
70
- };
71
- /**
72
- * Normalize whitespace in source string.
73
- */
74
- const normalizeWhitespace = (source) => {
75
- const start = performance.now();
76
- const result = source.replace(require_markdown_constants.CR_NEWLINE_R, "\n").replace(require_markdown_constants.FORMFEED_R, "").replace(require_markdown_constants.TAB_R, " ");
77
- const duration = performance.now() - start;
78
- if (duration > require_markdown_constants.DURATION_DELAY_TRIGGER) console.log(`normalizeWhitespace: ${duration.toFixed(3)}ms, source length: ${source.length}`);
79
- return result;
80
- };
81
- /**
82
- * Safely remove a uniform leading indentation from lines, but do NOT touch
83
- * the content inside fenced code blocks (``` or ~~~).
84
- */
85
- const trimLeadingWhitespaceOutsideFences = (text, whitespace) => {
86
- const start = performance.now();
87
- if (!whitespace) return text;
88
- const lines = text.split("\n");
89
- let inFence = false;
90
- let fenceToken = null;
91
- const isFenceLine = (line) => line.match(/^\s*(`{3,}|~{3,})/);
92
- const maybeToggleFence = (line) => {
93
- const m = isFenceLine(line);
94
- if (!m) return;
95
- const token = m[1];
96
- if (!inFence) {
97
- inFence = true;
98
- fenceToken = token;
99
- } else if (fenceToken && line.includes(fenceToken)) {
100
- inFence = false;
101
- fenceToken = null;
102
- }
103
- };
104
- const result = lines.map((line) => {
105
- if (isFenceLine(line)) {
106
- const trimmedFenceLine = line.startsWith(whitespace) ? line.slice(whitespace.length) : line;
107
- maybeToggleFence(line);
108
- return trimmedFenceLine;
109
- }
110
- if (inFence) return line;
111
- return line.startsWith(whitespace) ? line.slice(whitespace.length) : line;
112
- }).join("\n");
113
- const duration = performance.now() - start;
114
- if (duration > require_markdown_constants.DURATION_DELAY_TRIGGER) console.log(`trimLeadingWhitespaceOutsideFences: ${duration.toFixed(3)}ms, text length: ${text.length}, lines count: ${lines.length}`);
115
- return result;
116
- };
117
- /**
118
- * Normalize HTML attribute key to JSX prop name.
119
- */
120
- const normalizeAttributeKey = (key) => {
121
- if (key.indexOf("-") !== -1 && key.match(require_markdown_constants.HTML_CUSTOM_ATTR_R) === null) key = key.replace(require_markdown_constants.CAPTURE_LETTER_AFTER_HYPHEN, (_, letter) => {
122
- return letter.toUpperCase();
123
- });
124
- return key;
125
- };
126
- /**
127
- * Parse a CSS style string into an array of [key, value] tuples.
128
- */
129
- const parseStyleAttribute = (styleString) => {
130
- const start = performance.now();
131
- const styles = [];
132
- let buffer = "";
133
- let inUrl = false;
134
- let inQuotes = false;
135
- let quoteChar = "";
136
- if (!styleString) return styles;
137
- for (let i = 0; i < styleString.length; i++) {
138
- const char = styleString[i];
139
- if ((char === "\"" || char === "'") && !inUrl) {
140
- if (!inQuotes) {
141
- inQuotes = true;
142
- quoteChar = char;
143
- } else if (char === quoteChar) {
144
- inQuotes = false;
145
- quoteChar = "";
146
- }
147
- }
148
- if (char === "(" && buffer.endsWith("url")) inUrl = true;
149
- else if (char === ")" && inUrl) inUrl = false;
150
- if (char === ";" && !inQuotes && !inUrl) {
151
- const declaration = buffer.trim();
152
- if (declaration) {
153
- const colonIndex = declaration.indexOf(":");
154
- if (colonIndex > 0) {
155
- const key = declaration.slice(0, colonIndex).trim();
156
- const value = declaration.slice(colonIndex + 1).trim();
157
- styles.push([key, value]);
158
- }
159
- }
160
- buffer = "";
161
- } else buffer += char;
162
- }
163
- const declaration = buffer.trim();
164
- if (declaration) {
165
- const colonIndex = declaration.indexOf(":");
166
- if (colonIndex > 0) {
167
- const key = declaration.slice(0, colonIndex).trim();
168
- const value = declaration.slice(colonIndex + 1).trim();
169
- styles.push([key, value]);
170
- }
171
- }
172
- const duration = performance.now() - start;
173
- if (duration > require_markdown_constants.DURATION_DELAY_TRIGGER) console.log(`parseStyleAttribute: ${duration.toFixed(3)}ms, styleString length: ${styleString.length}, styles count: ${styles.length}`);
174
- return styles;
175
- };
176
- /**
177
- * Convert an attribute value to a Node prop value.
178
- */
179
- const attributeValueToNodePropValue = (tag, key, value, sanitizeUrlFn) => {
180
- if (key === "style") return parseStyleAttribute(value).reduce((styles, [styleKey, styleValue]) => {
181
- const camelCasedKey = styleKey.replace(/(-[a-z])/g, (substr) => substr[1].toUpperCase());
182
- styles[camelCasedKey] = sanitizeUrlFn(styleValue, tag, styleKey);
183
- return styles;
184
- }, {});
185
- else if (require_markdown_constants.ATTRIBUTES_TO_SANITIZE.indexOf(key) !== -1) return sanitizeUrlFn(unescapeString(value), tag, key);
186
- else if (value.match(require_markdown_constants.INTERPOLATION_R)) value = unescapeString(value.slice(1, value.length - 1));
187
- if (value === "true") return true;
188
- else if (value === "false") return false;
189
- return value;
190
- };
191
- /**
192
- * Parse table alignment from a separator row.
193
- */
194
- const parseTableAlignCapture = (alignCapture) => {
195
- if (require_markdown_constants.TABLE_RIGHT_ALIGN.test(alignCapture)) return "right";
196
- else if (require_markdown_constants.TABLE_CENTER_ALIGN.test(alignCapture)) return "center";
197
- else if (require_markdown_constants.TABLE_LEFT_ALIGN.test(alignCapture)) return "left";
198
- return "left";
199
- };
200
- /**
201
- * Parse table alignment row.
202
- */
203
- const parseTableAlign = (source) => {
204
- return source.replace(require_markdown_constants.TABLE_TRIM_PIPES, "").split("|").map(parseTableAlignCapture);
205
- };
206
- /**
207
- * Parse a single table row.
208
- */
209
- const parseTableRow = (source, parse, state, tableOutput) => {
210
- const start = performance.now();
211
- const prevInTable = state.inTable;
212
- state.inTable = true;
213
- const cells = [[]];
214
- let acc = "";
215
- const flush = () => {
216
- if (!acc) return;
217
- const cell = cells[cells.length - 1];
218
- cell.push.apply(cell, parse(acc, state));
219
- acc = "";
220
- };
221
- source.trim().split(/(`[^`]*`|\\\||\|)/).filter(Boolean).forEach((fragment, i, arr) => {
222
- if (fragment.trim() === "|") {
223
- flush();
224
- if (tableOutput) {
225
- if (i !== 0 && i !== arr.length - 1) cells.push([]);
226
- return;
227
- }
228
- }
229
- acc += fragment;
230
- });
231
- flush();
232
- state.inTable = prevInTable;
233
- const duration = performance.now() - start;
234
- if (duration > require_markdown_constants.DURATION_DELAY_TRIGGER) console.log(`parseTableRow: ${duration.toFixed(3)}ms, source length: ${source.length}, cells count: ${cells.length}`);
235
- return cells;
236
- };
237
- /**
238
- * Parse table cells (multiple rows).
239
- */
240
- const parseTableCells = (source, parse, state) => {
241
- const start = performance.now();
242
- const rowsText = source.trim().split("\n");
243
- const result = rowsText.map((rowText) => parseTableRow(rowText, parse, state, true));
244
- const duration = performance.now() - start;
245
- if (duration > require_markdown_constants.DURATION_DELAY_TRIGGER) console.log(`parseTableCells: ${duration.toFixed(3)}ms, source length: ${source.length}, rows count: ${rowsText.length}`);
246
- return result;
247
- };
248
- /**
249
- * Check if a rule qualifies for the current source and state.
250
- */
251
- const qualifies = (source, state, qualify) => {
252
- if (Array.isArray(qualify)) {
253
- for (let i = 0; i < qualify.length; i++) if (startsWith(source, qualify[i])) return true;
254
- return false;
255
- }
256
- return qualify(source, state);
257
- };
258
- /**
259
- * Marks a matcher function as eligible for being run inside an inline context.
260
- */
261
- const allowInline = (fn) => {
262
- fn.inline = 1;
263
- return fn;
264
- };
265
- /**
266
- * Creates a match function for an inline scoped element from a regex.
267
- */
268
- const inlineRegex = (regex) => allowInline((source, state) => {
269
- if (state.inline) return regex.exec(source);
270
- else return null;
271
- });
272
- /**
273
- * Creates a match function for inline elements except links.
274
- */
275
- const simpleInlineRegex = (regex) => allowInline((source, state) => {
276
- if (state.inline || state.simple) return regex.exec(source);
277
- else return null;
278
- });
279
- /**
280
- * Creates a match function for a block scoped element from a regex.
281
- */
282
- const blockRegex = (regex) => (source, state) => {
283
- if (state.inline || state.simple) return null;
284
- else return regex.exec(source);
285
- };
286
- /**
287
- * Creates a match function from a regex, ignoring block/inline scope.
288
- */
289
- const anyScopeRegex = (fn) => allowInline((source, state) => {
290
- if (typeof fn === "function") return fn(source, state);
291
- return fn.exec(source);
292
- });
293
- /**
294
- * Parse inline content (including links).
295
- */
296
- const parseInline = (parse, children, state) => {
297
- const start = performance.now();
298
- const isCurrentlyInline = state.inline ?? false;
299
- const isCurrentlySimple = state.simple ?? false;
300
- state.inline = true;
301
- state.simple = true;
302
- const result = parse(children, state);
303
- state.inline = isCurrentlyInline;
304
- state.simple = isCurrentlySimple;
305
- const duration = performance.now() - start;
306
- if (duration > require_markdown_constants.DURATION_DELAY_TRIGGER) console.log(`parseInline: ${duration.toFixed(3)}ms, children length: ${children.length}, result count: ${result.length}`);
307
- return result;
308
- };
309
- /**
310
- * Parse simple inline content (no links).
311
- */
312
- const parseSimpleInline = (parse, children, state) => {
313
- const start = performance.now();
314
- const isCurrentlyInline = state.inline ?? false;
315
- const isCurrentlySimple = state.simple ?? false;
316
- state.inline = false;
317
- state.simple = true;
318
- const result = parse(children, state);
319
- state.inline = isCurrentlyInline;
320
- state.simple = isCurrentlySimple;
321
- const duration = performance.now() - start;
322
- if (duration > require_markdown_constants.DURATION_DELAY_TRIGGER) console.log(`parseSimpleInline: ${duration.toFixed(3)}ms, children length: ${children.length}, result count: ${result.length}`);
323
- return result;
324
- };
325
- /**
326
- * Parse block content.
327
- */
328
- const parseBlock = (parse, children, state = {}) => {
329
- const start = performance.now();
330
- const isCurrentlyInline = state.inline || false;
331
- state.inline = false;
332
- const normalizedChildren = trimEnd(children);
333
- const result = parse(/\n\n$/.test(normalizedChildren) === false ? normalizedChildren.endsWith("\n") ? `${normalizedChildren}\n` : `${normalizedChildren}\n\n` : normalizedChildren, state);
334
- state.inline = isCurrentlyInline;
335
- const duration = performance.now() - start;
336
- if (duration > require_markdown_constants.DURATION_DELAY_TRIGGER) console.log(`parseBlock: ${duration.toFixed(3)}ms, children length: ${children.length}, result count: ${result.length}`);
337
- return result;
338
- };
339
- /**
340
- * Helper to parse capture group 2 as inline content.
341
- */
342
- const parseCaptureInline = (capture, parse, state) => {
343
- return { children: parseInline(parse, capture[2], state) };
344
- };
345
- /**
346
- * Helper that captures nothing (empty object).
347
- */
348
- const captureNothing = () => ({});
349
- /**
350
- * Helper that renders nothing (null).
351
- */
352
- const renderNothing = () => null;
353
- /**
354
- * Check if any regex in a list matches the input.
355
- */
356
- const some = (regexes, input) => {
357
- for (let i = 0; i < regexes.length; i++) if (regexes[i].test(input)) return true;
358
- return false;
359
- };
360
-
361
- //#endregion
362
- exports.allowInline = allowInline;
363
- exports.anyScopeRegex = anyScopeRegex;
364
- exports.attributeValueToNodePropValue = attributeValueToNodePropValue;
365
- exports.blockRegex = blockRegex;
366
- exports.captureNothing = captureNothing;
367
- exports.cx = cx;
368
- exports.get = get;
369
- exports.inlineRegex = inlineRegex;
370
- exports.normalizeAttributeKey = normalizeAttributeKey;
371
- exports.normalizeWhitespace = normalizeWhitespace;
372
- exports.parseBlock = parseBlock;
373
- exports.parseCaptureInline = parseCaptureInline;
374
- exports.parseInline = parseInline;
375
- exports.parseSimpleInline = parseSimpleInline;
376
- exports.parseStyleAttribute = parseStyleAttribute;
377
- exports.parseTableAlign = parseTableAlign;
378
- exports.parseTableAlignCapture = parseTableAlignCapture;
379
- exports.parseTableCells = parseTableCells;
380
- exports.parseTableRow = parseTableRow;
381
- exports.qualifies = qualifies;
382
- exports.renderNothing = renderNothing;
383
- exports.sanitizer = sanitizer;
384
- exports.simpleInlineRegex = simpleInlineRegex;
385
- exports.slugify = slugify;
386
- exports.some = some;
387
- exports.startsWith = startsWith;
388
- exports.trimEnd = trimEnd;
389
- exports.trimLeadingWhitespaceOutsideFences = trimLeadingWhitespaceOutsideFences;
390
- exports.unescapeString = unescapeString;
391
- exports.unquote = unquote;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./constants.cjs`),t=e=>{let t=e.length;for(;t>0&&e[t-1]<=` `;)t--;return e.slice(0,t)},n=(e,t)=>e.startsWith(t),r=e=>{let t=e[0];return(t===`"`||t===`'`)&&e.length>=2&&e[e.length-1]===t?e.slice(1,-1):e},i=t=>t&&t.replace(e.UNESCAPE_R,`$1`),a=(...e)=>e.filter(Boolean).join(` `),o=(e,t,n)=>{let r=e,i=t.split(`.`);for(;i.length&&(r=r[i[0]],r!==void 0);)i.shift();return r??n},s=e=>e.replace(/[ÀÁÂÃÄÅàáâãä忯]/g,`a`).replace(/[çÇ]/g,`c`).replace(/[ðÐ]/g,`d`).replace(/[ÈÉÊËéèêë]/g,`e`).replace(/[ÏïÎîÍíÌì]/g,`i`).replace(/[Ññ]/g,`n`).replace(/[øØœŒÕõÔôÓóÒò]/g,`o`).replace(/[ÜüÛûÚúÙù]/g,`u`).replace(/[ŸÿÝý]/g,`y`).replace(/[^a-z0-9- ]/gi,``).replace(/ /gi,`-`).toLowerCase(),c=/(javascript|vbscript|data(?!:image)):/i,l=e=>{try{let t=decodeURIComponent(e).replace(/[^A-Za-z0-9/:]/g,``);if(c.test(t))return process.env.NODE_ENV!==`production`&&console.warn(`Input contains an unsafe JavaScript/VBScript/data expression, it will not be rendered.`,t),null}catch{return process.env.NODE_ENV!==`production`&&console.warn(`Input could not be decoded due to malformed syntax or characters, it will not be rendered.`,e),null}return e},u=t=>{let n=performance.now(),r=t.replace(e.CR_NEWLINE_R,`
2
+ `).replace(e.FORMFEED_R,``).replace(e.TAB_R,` `),i=performance.now()-n;return i>e.DURATION_DELAY_TRIGGER&&console.log(`normalizeWhitespace: ${i.toFixed(3)}ms, source length: ${t.length}`),r},d=(t,n)=>{let r=performance.now();if(!n)return t;let i=t.split(`
3
+ `),a=!1,o=null,s=e=>e.match(/^\s*(`{3,}|~{3,})/),c=e=>{let t=s(e);if(!t)return;let n=t[1];a?o&&e.includes(o)&&(a=!1,o=null):(a=!0,o=n)},l=i.map(e=>{if(s(e)){let t=e.startsWith(n)?e.slice(n.length):e;return c(e),t}return a?e:e.startsWith(n)?e.slice(n.length):e}).join(`
4
+ `),u=performance.now()-r;return u>e.DURATION_DELAY_TRIGGER&&console.log(`trimLeadingWhitespaceOutsideFences: ${u.toFixed(3)}ms, text length: ${t.length}, lines count: ${i.length}`),l},f=t=>(t.indexOf(`-`)!==-1&&t.match(e.HTML_CUSTOM_ATTR_R)===null&&(t=t.replace(e.CAPTURE_LETTER_AFTER_HYPHEN,(e,t)=>t.toUpperCase())),t),p=t=>{let n=performance.now(),r=[],i=``,a=!1,o=!1,s=``;if(!t)return r;for(let e=0;e<t.length;e++){let n=t[e];if((n===`"`||n===`'`)&&!a&&(o?n===s&&(o=!1,s=``):(o=!0,s=n)),n===`(`&&i.endsWith(`url`)?a=!0:n===`)`&&a&&(a=!1),n===`;`&&!o&&!a){let e=i.trim();if(e){let t=e.indexOf(`:`);if(t>0){let n=e.slice(0,t).trim(),i=e.slice(t+1).trim();r.push([n,i])}}i=``}else i+=n}let c=i.trim();if(c){let e=c.indexOf(`:`);if(e>0){let t=c.slice(0,e).trim(),n=c.slice(e+1).trim();r.push([t,n])}}let l=performance.now()-n;return l>e.DURATION_DELAY_TRIGGER&&console.log(`parseStyleAttribute: ${l.toFixed(3)}ms, styleString length: ${t.length}, styles count: ${r.length}`),r},m=(t,n,r,a)=>n===`style`?p(r).reduce((e,[n,r])=>{let i=n.replace(/(-[a-z])/g,e=>e[1].toUpperCase());return e[i]=a(r,t,n),e},{}):e.ATTRIBUTES_TO_SANITIZE.indexOf(n)===-1?(r.match(e.INTERPOLATION_R)&&(r=i(r.slice(1,r.length-1))),r===`true`?!0:r===`false`?!1:r):a(i(r),t,n),h=t=>e.TABLE_RIGHT_ALIGN.test(t)?`right`:e.TABLE_CENTER_ALIGN.test(t)?`center`:(e.TABLE_LEFT_ALIGN.test(t),`left`),g=t=>t.replace(e.TABLE_TRIM_PIPES,``).split(`|`).map(h),_=(t,n,r,i)=>{let a=performance.now(),o=r.inTable;r.inTable=!0;let s=[[]],c=``,l=()=>{if(!c)return;let e=s[s.length-1];e.push.apply(e,n(c,r)),c=``};t.trim().split(/(`[^`]*`|\\\||\|)/).filter(Boolean).forEach((e,t,n)=>{if(e.trim()===`|`&&(l(),i)){t!==0&&t!==n.length-1&&s.push([]);return}c+=e}),l(),r.inTable=o;let u=performance.now()-a;return u>e.DURATION_DELAY_TRIGGER&&console.log(`parseTableRow: ${u.toFixed(3)}ms, source length: ${t.length}, cells count: ${s.length}`),s},v=(t,n,r)=>{let i=performance.now(),a=t.trim().split(`
5
+ `),o=a.map(e=>_(e,n,r,!0)),s=performance.now()-i;return s>e.DURATION_DELAY_TRIGGER&&console.log(`parseTableCells: ${s.toFixed(3)}ms, source length: ${t.length}, rows count: ${a.length}`),o},y=(e,t,r)=>{if(Array.isArray(r)){for(let t=0;t<r.length;t++)if(n(e,r[t]))return!0;return!1}return r(e,t)},b=e=>(e.inline=1,e),x=e=>b((t,n)=>n.inline?e.exec(t):null),S=e=>b((t,n)=>n.inline||n.simple?e.exec(t):null),C=e=>(t,n)=>n.inline||n.simple?null:e.exec(t),w=e=>b((t,n)=>typeof e==`function`?e(t,n):e.exec(t)),T=(t,n,r)=>{let i=performance.now(),a=r.inline??!1,o=r.simple??!1;r.inline=!0,r.simple=!0;let s=t(n,r);r.inline=a,r.simple=o;let c=performance.now()-i;return c>e.DURATION_DELAY_TRIGGER&&console.log(`parseInline: ${c.toFixed(3)}ms, children length: ${n.length}, result count: ${s.length}`),s},E=(t,n,r)=>{let i=performance.now(),a=r.inline??!1,o=r.simple??!1;r.inline=!1,r.simple=!0;let s=t(n,r);r.inline=a,r.simple=o;let c=performance.now()-i;return c>e.DURATION_DELAY_TRIGGER&&console.log(`parseSimpleInline: ${c.toFixed(3)}ms, children length: ${n.length}, result count: ${s.length}`),s},D=(n,r,i={})=>{let a=performance.now(),o=i.inline||!1;i.inline=!1;let s=t(r),c=n(/\n\n$/.test(s)===!1?s.endsWith(`
6
+ `)?`${s}\n`:`${s}\n\n`:s,i);i.inline=o;let l=performance.now()-a;return l>e.DURATION_DELAY_TRIGGER&&console.log(`parseBlock: ${l.toFixed(3)}ms, children length: ${r.length}, result count: ${c.length}`),c},O=(e,t,n)=>({children:T(t,e[2],n)}),k=()=>({}),A=()=>null,j=(e,t)=>{for(let n=0;n<e.length;n++)if(e[n].test(t))return!0;return!1};exports.allowInline=b,exports.anyScopeRegex=w,exports.attributeValueToNodePropValue=m,exports.blockRegex=C,exports.captureNothing=k,exports.cx=a,exports.get=o,exports.inlineRegex=x,exports.normalizeAttributeKey=f,exports.normalizeWhitespace=u,exports.parseBlock=D,exports.parseCaptureInline=O,exports.parseInline=T,exports.parseSimpleInline=E,exports.parseStyleAttribute=p,exports.parseTableAlign=g,exports.parseTableAlignCapture=h,exports.parseTableCells=v,exports.parseTableRow=_,exports.qualifies=y,exports.renderNothing=A,exports.sanitizer=l,exports.simpleInlineRegex=S,exports.slugify=s,exports.some=j,exports.startsWith=n,exports.trimEnd=t,exports.trimLeadingWhitespaceOutsideFences=d,exports.unescapeString=i,exports.unquote=r;
392
7
  //# sourceMappingURL=utils.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.cjs","names":["UNESCAPE_R","CR_NEWLINE_R","FORMFEED_R","TAB_R","DURATION_DELAY_TRIGGER","HTML_CUSTOM_ATTR_R","CAPTURE_LETTER_AFTER_HYPHEN","ATTRIBUTES_TO_SANITIZE","INTERPOLATION_R","TABLE_RIGHT_ALIGN","TABLE_CENTER_ALIGN","TABLE_LEFT_ALIGN","TABLE_TRIM_PIPES"],"sources":["../../../src/markdown/utils.ts"],"sourcesContent":["import {\n ATTRIBUTES_TO_SANITIZE,\n CAPTURE_LETTER_AFTER_HYPHEN,\n CR_NEWLINE_R,\n DURATION_DELAY_TRIGGER,\n FORMFEED_R,\n HTML_CUSTOM_ATTR_R,\n INTERPOLATION_R,\n TAB_R,\n TABLE_CENTER_ALIGN,\n TABLE_LEFT_ALIGN,\n TABLE_RIGHT_ALIGN,\n TABLE_TRIM_PIPES,\n UNESCAPE_R,\n} from './constants';\nimport type { NestedParser, ParserResult, ParseState, Rule } from './types';\n\n// ============================================================================\n// STRING UTILITIES\n// ============================================================================\n\n/**\n * Trim trailing whitespace from a string.\n */\nexport const trimEnd = (str: string): string => {\n let end = str.length;\n\n while (end > 0 && str[end - 1] <= ' ') end--;\n\n return str.slice(0, end);\n};\n\n/**\n * Check if string starts with prefix.\n */\nexport const startsWith = (str: string, prefix: string): boolean => {\n return str.startsWith(prefix);\n};\n\n/**\n * Remove symmetrical leading and trailing quotes.\n */\nexport const unquote = (str: string): string => {\n const first = str[0];\n\n if (\n (first === '\"' || first === \"'\") &&\n str.length >= 2 &&\n str[str.length - 1] === first\n ) {\n return str.slice(1, -1);\n }\n\n return str;\n};\n\n/**\n * Unescape backslash-escaped characters.\n */\nexport const unescapeString = (rawString: string): string =>\n rawString ? rawString.replace(UNESCAPE_R, '$1') : rawString;\n\n/**\n * Join class names, filtering out falsy values.\n */\nexport const cx = (...args: any[]): string => args.filter(Boolean).join(' ');\n\n/**\n * Get a nested property from an object using dot notation.\n */\nexport const get = (src: any, path: string, fb?: any): any => {\n let ptr = src;\n const frags = path.split('.');\n\n while (frags.length) {\n ptr = ptr[frags[0]];\n\n if (ptr === undefined) break;\n else frags.shift();\n }\n\n return ptr ?? fb;\n};\n\n// ============================================================================\n// SLUGIFY\n// ============================================================================\n\n/**\n * Convert a string to a URL-safe slug.\n * Based on https://stackoverflow.com/a/18123682/1141611\n */\nexport const slugify = (str: string): string =>\n str\n .replace(/[ÀÁÂÃÄÅàáâãä忯]/g, 'a')\n .replace(/[çÇ]/g, 'c')\n .replace(/[ðÐ]/g, 'd')\n .replace(/[ÈÉÊËéèêë]/g, 'e')\n .replace(/[ÏïÎîÍíÌì]/g, 'i')\n .replace(/[Ññ]/g, 'n')\n .replace(/[øØœŒÕõÔôÓóÒò]/g, 'o')\n .replace(/[ÜüÛûÚúÙù]/g, 'u')\n .replace(/[ŸÿÝý]/g, 'y')\n .replace(/[^a-z0-9- ]/gi, '')\n .replace(/ /gi, '-')\n .toLowerCase();\n\n// ============================================================================\n// SANITIZER\n// ============================================================================\n\nconst SANITIZE_R = /(javascript|vbscript|data(?!:image)):/i;\n\n/**\n * Sanitize URLs to prevent XSS attacks.\n * Returns null if the URL is unsafe.\n */\nexport const sanitizer = (input: string): string | null => {\n try {\n const decoded = decodeURIComponent(input).replace(/[^A-Za-z0-9/:]/g, '');\n\n if (SANITIZE_R.test(decoded)) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn(\n 'Input contains an unsafe JavaScript/VBScript/data expression, it will not be rendered.',\n decoded\n );\n }\n\n return null;\n }\n } catch (_e) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn(\n 'Input could not be decoded due to malformed syntax or characters, it will not be rendered.',\n input\n );\n }\n\n // decodeURIComponent sometimes throws a URIError\n return null;\n }\n\n return input;\n};\n\n// ============================================================================\n// WHITESPACE NORMALIZATION\n// ============================================================================\n\n/**\n * Normalize whitespace in source string.\n */\nexport const normalizeWhitespace = (source: string): string => {\n const start = performance.now();\n const result = source\n .replace(CR_NEWLINE_R, '\\n')\n .replace(FORMFEED_R, '')\n .replace(TAB_R, ' ');\n\n const duration = performance.now() - start;\n\n if (duration > DURATION_DELAY_TRIGGER) {\n console.log(\n `normalizeWhitespace: ${duration.toFixed(3)}ms, source length: ${source.length}`\n );\n }\n\n return result;\n};\n\n/**\n * Safely remove a uniform leading indentation from lines, but do NOT touch\n * the content inside fenced code blocks (``` or ~~~).\n */\nexport const trimLeadingWhitespaceOutsideFences = (\n text: string,\n whitespace: string\n): string => {\n const start = performance.now();\n if (!whitespace) return text;\n\n const lines = text.split('\\n');\n let inFence = false;\n let fenceToken: string | null = null;\n\n const isFenceLine = (line: string): RegExpMatchArray | null =>\n line.match(/^\\s*(`{3,}|~{3,})/);\n\n const maybeToggleFence = (line: string): void => {\n const m = isFenceLine(line);\n\n if (!m) return;\n\n const token = m[1];\n\n if (!inFence) {\n inFence = true;\n fenceToken = token;\n } else if (fenceToken && line.includes(fenceToken)) {\n inFence = false;\n fenceToken = null;\n }\n };\n\n const out = lines.map((line) => {\n const fenceMatch = isFenceLine(line);\n if (fenceMatch) {\n const trimmedFenceLine = line.startsWith(whitespace)\n ? line.slice(whitespace.length)\n : line;\n maybeToggleFence(line);\n return trimmedFenceLine;\n }\n\n if (inFence) {\n return line;\n }\n\n return line.startsWith(whitespace) ? line.slice(whitespace.length) : line;\n });\n\n const result = out.join('\\n');\n\n const duration = performance.now() - start;\n if (duration > DURATION_DELAY_TRIGGER) {\n console.log(\n `trimLeadingWhitespaceOutsideFences: ${duration.toFixed(3)}ms, text length: ${text.length}, lines count: ${lines.length}`\n );\n }\n\n return result;\n};\n\n/**\n * Normalize HTML attribute key to JSX prop name.\n */\nexport const normalizeAttributeKey = (key: string): string => {\n const hyphenIndex = key.indexOf('-');\n\n if (hyphenIndex !== -1 && key.match(HTML_CUSTOM_ATTR_R) === null) {\n key = key.replace(CAPTURE_LETTER_AFTER_HYPHEN, (_, letter) => {\n return letter.toUpperCase();\n });\n }\n\n return key;\n};\n\ntype StyleTuple = [key: string, value: string];\n\n/**\n * Parse a CSS style string into an array of [key, value] tuples.\n */\nexport const parseStyleAttribute = (styleString: string): StyleTuple[] => {\n const start = performance.now();\n const styles: StyleTuple[] = [];\n let buffer = '';\n let inUrl = false;\n let inQuotes = false;\n let quoteChar: '\"' | \"'\" | '' = '';\n\n if (!styleString) return styles;\n\n for (let i = 0; i < styleString.length; i++) {\n const char = styleString[i];\n\n if ((char === '\"' || char === \"'\") && !inUrl) {\n if (!inQuotes) {\n inQuotes = true;\n quoteChar = char;\n } else if (char === quoteChar) {\n inQuotes = false;\n quoteChar = '';\n }\n }\n\n if (char === '(' && buffer.endsWith('url')) {\n inUrl = true;\n } else if (char === ')' && inUrl) {\n inUrl = false;\n }\n\n if (char === ';' && !inQuotes && !inUrl) {\n const declaration = buffer.trim();\n\n if (declaration) {\n const colonIndex = declaration.indexOf(':');\n\n if (colonIndex > 0) {\n const key = declaration.slice(0, colonIndex).trim();\n const value = declaration.slice(colonIndex + 1).trim();\n styles.push([key, value]);\n }\n }\n buffer = '';\n } else {\n buffer += char;\n }\n }\n\n const declaration = buffer.trim();\n\n if (declaration) {\n const colonIndex = declaration.indexOf(':');\n if (colonIndex > 0) {\n const key = declaration.slice(0, colonIndex).trim();\n const value = declaration.slice(colonIndex + 1).trim();\n styles.push([key, value]);\n }\n }\n\n const duration = performance.now() - start;\n\n if (duration > DURATION_DELAY_TRIGGER) {\n console.log(\n `parseStyleAttribute: ${duration.toFixed(3)}ms, styleString length: ${styleString.length}, styles count: ${styles.length}`\n );\n }\n\n return styles;\n};\n\n/**\n * Convert an attribute value to a Node prop value.\n */\nexport const attributeValueToNodePropValue = (\n tag: string,\n key: string,\n value: string,\n sanitizeUrlFn: (\n value: string,\n tag: string,\n attribute: string\n ) => string | null\n): any => {\n if (key === 'style') {\n return parseStyleAttribute(value).reduce(\n (styles, [styleKey, styleValue]) => {\n const camelCasedKey = styleKey.replace(/(-[a-z])/g, (substr) =>\n substr[1].toUpperCase()\n );\n\n (styles as Record<string, any>)[camelCasedKey] = sanitizeUrlFn(\n styleValue,\n tag,\n styleKey\n );\n\n return styles;\n },\n {} as Record<string, any>\n );\n } else if (ATTRIBUTES_TO_SANITIZE.indexOf(key) !== -1) {\n return sanitizeUrlFn(unescapeString(value), tag, key);\n } else if (value.match(INTERPOLATION_R)) {\n value = unescapeString(value.slice(1, value.length - 1));\n }\n\n if (value === 'true') {\n return true;\n } else if (value === 'false') {\n return false;\n }\n\n return value;\n};\n\n// ============================================================================\n// TABLE PARSING\n// ============================================================================\n\n/**\n * Parse table alignment from a separator row.\n */\nexport const parseTableAlignCapture = (\n alignCapture: string\n): 'left' | 'right' | 'center' => {\n if (TABLE_RIGHT_ALIGN.test(alignCapture)) {\n return 'right';\n } else if (TABLE_CENTER_ALIGN.test(alignCapture)) {\n return 'center';\n } else if (TABLE_LEFT_ALIGN.test(alignCapture)) {\n return 'left';\n }\n\n return 'left';\n};\n\n/**\n * Parse table alignment row.\n */\nexport const parseTableAlign = (\n source: string\n): ('left' | 'right' | 'center')[] => {\n const alignText = source.replace(TABLE_TRIM_PIPES, '').split('|');\n return alignText.map(parseTableAlignCapture);\n};\n\n/**\n * Parse a single table row.\n */\nexport const parseTableRow = (\n source: string,\n parse: NestedParser,\n state: ParseState,\n tableOutput: boolean\n): ParserResult[][] => {\n const start = performance.now();\n const prevInTable = state.inTable;\n\n state.inTable = true;\n\n const cells: ParserResult[][] = [[]];\n let acc = '';\n\n const flush = (): void => {\n if (!acc) return;\n\n const cell = cells[cells.length - 1];\n cell.push.apply(cell, parse(acc, state));\n acc = '';\n };\n\n source\n .trim()\n .split(/(`[^`]*`|\\\\\\||\\|)/)\n .filter(Boolean)\n .forEach((fragment, i, arr) => {\n if (fragment.trim() === '|') {\n flush();\n\n if (tableOutput) {\n if (i !== 0 && i !== arr.length - 1) {\n cells.push([]);\n }\n\n return;\n }\n }\n\n acc += fragment;\n });\n\n flush();\n\n state.inTable = prevInTable;\n\n const duration = performance.now() - start;\n if (duration > DURATION_DELAY_TRIGGER) {\n console.log(\n `parseTableRow: ${duration.toFixed(3)}ms, source length: ${source.length}, cells count: ${cells.length}`\n );\n }\n\n return cells;\n};\n\n/**\n * Parse table cells (multiple rows).\n */\nexport const parseTableCells = (\n source: string,\n parse: NestedParser,\n state: ParseState\n): ParserResult[][][] => {\n const start = performance.now();\n const rowsText = source.trim().split('\\n');\n\n const result = rowsText.map((rowText) =>\n parseTableRow(rowText, parse, state, true)\n );\n\n const duration = performance.now() - start;\n if (duration > DURATION_DELAY_TRIGGER) {\n console.log(\n `parseTableCells: ${duration.toFixed(3)}ms, source length: ${source.length}, rows count: ${rowsText.length}`\n );\n }\n\n return result;\n};\n\n// ============================================================================\n// PARSING HELPERS\n// ============================================================================\n\n/**\n * Check if a rule qualifies for the current source and state.\n */\nexport const qualifies = (\n source: string,\n state: ParseState,\n qualify: NonNullable<Rule<any>['_qualify']>\n): boolean => {\n if (Array.isArray(qualify)) {\n for (let i = 0; i < qualify.length; i++) {\n if (startsWith(source, qualify[i])) return true;\n }\n\n return false;\n }\n\n return (qualify as (source: string, state: ParseState) => boolean)(\n source,\n state\n );\n};\n\n/**\n * Marks a matcher function as eligible for being run inside an inline context.\n */\nexport const allowInline = <T extends (...args: any[]) => any>(\n fn: T\n): T & { inline: 1 } => {\n (fn as any).inline = 1;\n return fn as T & { inline: 1 };\n};\n\n/**\n * Creates a match function for an inline scoped element from a regex.\n */\nexport const inlineRegex = (regex: RegExp) =>\n allowInline((source: string, state: ParseState): RegExpMatchArray | null => {\n if (state.inline) {\n return regex.exec(source);\n } else {\n return null;\n }\n });\n\n/**\n * Creates a match function for inline elements except links.\n */\nexport const simpleInlineRegex = (regex: RegExp) =>\n allowInline((source: string, state: ParseState): RegExpMatchArray | null => {\n if (state.inline || state.simple) {\n return regex.exec(source);\n } else {\n return null;\n }\n });\n\n/**\n * Creates a match function for a block scoped element from a regex.\n */\nexport const blockRegex =\n (regex: RegExp) =>\n (source: string, state: ParseState): RegExpMatchArray | null => {\n if (state.inline || state.simple) {\n return null;\n } else {\n return regex.exec(source);\n }\n };\n\n/**\n * Creates a match function from a regex, ignoring block/inline scope.\n */\nexport const anyScopeRegex = (\n fn: RegExp | ((source: string, state: ParseState) => RegExpMatchArray | null)\n) =>\n allowInline((source: string, state: ParseState): RegExpMatchArray | null => {\n if (typeof fn === 'function') {\n return fn(source, state);\n }\n return fn.exec(source);\n });\n\n/**\n * Parse inline content (including links).\n */\nexport const parseInline = (\n parse: NestedParser,\n children: string,\n state: ParseState\n): ParserResult[] => {\n const start = performance.now();\n const isCurrentlyInline = state.inline ?? false;\n const isCurrentlySimple = state.simple ?? false;\n state.inline = true;\n state.simple = true;\n const result = parse(children, state);\n state.inline = isCurrentlyInline;\n state.simple = isCurrentlySimple;\n\n const duration = performance.now() - start;\n if (duration > DURATION_DELAY_TRIGGER) {\n console.log(\n `parseInline: ${duration.toFixed(3)}ms, children length: ${children.length}, result count: ${result.length}`\n );\n }\n\n return result;\n};\n\n/**\n * Parse simple inline content (no links).\n */\nexport const parseSimpleInline = (\n parse: NestedParser,\n children: string,\n state: ParseState\n): ParserResult[] => {\n const start = performance.now();\n const isCurrentlyInline = state.inline ?? false;\n const isCurrentlySimple = state.simple ?? false;\n\n state.inline = false;\n state.simple = true;\n const result = parse(children, state);\n state.inline = isCurrentlyInline;\n state.simple = isCurrentlySimple;\n\n const duration = performance.now() - start;\n if (duration > DURATION_DELAY_TRIGGER) {\n console.log(\n `parseSimpleInline: ${duration.toFixed(3)}ms, children length: ${children.length}, result count: ${result.length}`\n );\n }\n\n return result;\n};\n\n/**\n * Parse block content.\n */\nexport const parseBlock = (\n parse: NestedParser,\n children: string,\n state: ParseState = {}\n): ParserResult[] => {\n const start = performance.now();\n const isCurrentlyInline = state.inline || false;\n state.inline = false;\n const normalizedChildren = trimEnd(children);\n const needsTerminator = /\\n\\n$/.test(normalizedChildren) === false;\n const blockInput = needsTerminator\n ? normalizedChildren.endsWith('\\n')\n ? `${normalizedChildren}\\n`\n : `${normalizedChildren}\\n\\n`\n : normalizedChildren;\n\n const result = parse(blockInput, state);\n state.inline = isCurrentlyInline;\n\n const duration = performance.now() - start;\n if (duration > DURATION_DELAY_TRIGGER) {\n console.log(\n `parseBlock: ${duration.toFixed(3)}ms, children length: ${children.length}, result count: ${result.length}`\n );\n }\n\n return result;\n};\n\n/**\n * Helper to parse capture group 2 as inline content.\n */\nexport const parseCaptureInline = (\n capture: RegExpMatchArray,\n parse: NestedParser,\n state: ParseState\n): { children: ParserResult[] } => {\n return {\n children: parseInline(parse, capture[2], state),\n };\n};\n\n/**\n * Helper that captures nothing (empty object).\n */\nexport const captureNothing = (): Record<string, never> => ({});\n\n/**\n * Helper that renders nothing (null).\n */\nexport const renderNothing = (): null => null;\n\n/**\n * Check if any regex in a list matches the input.\n */\nexport const some = (regexes: RegExp[], input: string): boolean => {\n for (let i = 0; i < regexes.length; i++) {\n if (regexes[i].test(input)) {\n return true;\n }\n }\n return false;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"utils.cjs","names":["UNESCAPE_R","CR_NEWLINE_R","FORMFEED_R","TAB_R","DURATION_DELAY_TRIGGER","HTML_CUSTOM_ATTR_R","CAPTURE_LETTER_AFTER_HYPHEN","ATTRIBUTES_TO_SANITIZE","INTERPOLATION_R","TABLE_RIGHT_ALIGN","TABLE_CENTER_ALIGN","TABLE_LEFT_ALIGN","TABLE_TRIM_PIPES"],"sources":["../../../src/markdown/utils.ts"],"sourcesContent":["import {\n ATTRIBUTES_TO_SANITIZE,\n CAPTURE_LETTER_AFTER_HYPHEN,\n CR_NEWLINE_R,\n DURATION_DELAY_TRIGGER,\n FORMFEED_R,\n HTML_CUSTOM_ATTR_R,\n INTERPOLATION_R,\n TAB_R,\n TABLE_CENTER_ALIGN,\n TABLE_LEFT_ALIGN,\n TABLE_RIGHT_ALIGN,\n TABLE_TRIM_PIPES,\n UNESCAPE_R,\n} from './constants';\nimport type { NestedParser, ParserResult, ParseState, Rule } from './types';\n\n// ============================================================================\n// STRING UTILITIES\n// ============================================================================\n\n/**\n * Trim trailing whitespace from a string.\n */\nexport const trimEnd = (str: string): string => {\n let end = str.length;\n\n while (end > 0 && str[end - 1] <= ' ') end--;\n\n return str.slice(0, end);\n};\n\n/**\n * Check if string starts with prefix.\n */\nexport const startsWith = (str: string, prefix: string): boolean => {\n return str.startsWith(prefix);\n};\n\n/**\n * Remove symmetrical leading and trailing quotes.\n */\nexport const unquote = (str: string): string => {\n const first = str[0];\n\n if (\n (first === '\"' || first === \"'\") &&\n str.length >= 2 &&\n str[str.length - 1] === first\n ) {\n return str.slice(1, -1);\n }\n\n return str;\n};\n\n/**\n * Unescape backslash-escaped characters.\n */\nexport const unescapeString = (rawString: string): string =>\n rawString ? rawString.replace(UNESCAPE_R, '$1') : rawString;\n\n/**\n * Join class names, filtering out falsy values.\n */\nexport const cx = (...args: any[]): string => args.filter(Boolean).join(' ');\n\n/**\n * Get a nested property from an object using dot notation.\n */\nexport const get = (src: any, path: string, fb?: any): any => {\n let ptr = src;\n const frags = path.split('.');\n\n while (frags.length) {\n ptr = ptr[frags[0]];\n\n if (ptr === undefined) break;\n else frags.shift();\n }\n\n return ptr ?? fb;\n};\n\n// ============================================================================\n// SLUGIFY\n// ============================================================================\n\n/**\n * Convert a string to a URL-safe slug.\n * Based on https://stackoverflow.com/a/18123682/1141611\n */\nexport const slugify = (str: string): string =>\n str\n .replace(/[ÀÁÂÃÄÅàáâãä忯]/g, 'a')\n .replace(/[çÇ]/g, 'c')\n .replace(/[ðÐ]/g, 'd')\n .replace(/[ÈÉÊËéèêë]/g, 'e')\n .replace(/[ÏïÎîÍíÌì]/g, 'i')\n .replace(/[Ññ]/g, 'n')\n .replace(/[øØœŒÕõÔôÓóÒò]/g, 'o')\n .replace(/[ÜüÛûÚúÙù]/g, 'u')\n .replace(/[ŸÿÝý]/g, 'y')\n .replace(/[^a-z0-9- ]/gi, '')\n .replace(/ /gi, '-')\n .toLowerCase();\n\n// ============================================================================\n// SANITIZER\n// ============================================================================\n\nconst SANITIZE_R = /(javascript|vbscript|data(?!:image)):/i;\n\n/**\n * Sanitize URLs to prevent XSS attacks.\n * Returns null if the URL is unsafe.\n */\nexport const sanitizer = (input: string): string | null => {\n try {\n const decoded = decodeURIComponent(input).replace(/[^A-Za-z0-9/:]/g, '');\n\n if (SANITIZE_R.test(decoded)) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn(\n 'Input contains an unsafe JavaScript/VBScript/data expression, it will not be rendered.',\n decoded\n );\n }\n\n return null;\n }\n } catch (_e) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn(\n 'Input could not be decoded due to malformed syntax or characters, it will not be rendered.',\n input\n );\n }\n\n // decodeURIComponent sometimes throws a URIError\n return null;\n }\n\n return input;\n};\n\n// ============================================================================\n// WHITESPACE NORMALIZATION\n// ============================================================================\n\n/**\n * Normalize whitespace in source string.\n */\nexport const normalizeWhitespace = (source: string): string => {\n const start = performance.now();\n const result = source\n .replace(CR_NEWLINE_R, '\\n')\n .replace(FORMFEED_R, '')\n .replace(TAB_R, ' ');\n\n const duration = performance.now() - start;\n\n if (duration > DURATION_DELAY_TRIGGER) {\n console.log(\n `normalizeWhitespace: ${duration.toFixed(3)}ms, source length: ${source.length}`\n );\n }\n\n return result;\n};\n\n/**\n * Safely remove a uniform leading indentation from lines, but do NOT touch\n * the content inside fenced code blocks (``` or ~~~).\n */\nexport const trimLeadingWhitespaceOutsideFences = (\n text: string,\n whitespace: string\n): string => {\n const start = performance.now();\n if (!whitespace) return text;\n\n const lines = text.split('\\n');\n let inFence = false;\n let fenceToken: string | null = null;\n\n const isFenceLine = (line: string): RegExpMatchArray | null =>\n line.match(/^\\s*(`{3,}|~{3,})/);\n\n const maybeToggleFence = (line: string): void => {\n const m = isFenceLine(line);\n\n if (!m) return;\n\n const token = m[1];\n\n if (!inFence) {\n inFence = true;\n fenceToken = token;\n } else if (fenceToken && line.includes(fenceToken)) {\n inFence = false;\n fenceToken = null;\n }\n };\n\n const out = lines.map((line) => {\n const fenceMatch = isFenceLine(line);\n if (fenceMatch) {\n const trimmedFenceLine = line.startsWith(whitespace)\n ? line.slice(whitespace.length)\n : line;\n maybeToggleFence(line);\n return trimmedFenceLine;\n }\n\n if (inFence) {\n return line;\n }\n\n return line.startsWith(whitespace) ? line.slice(whitespace.length) : line;\n });\n\n const result = out.join('\\n');\n\n const duration = performance.now() - start;\n if (duration > DURATION_DELAY_TRIGGER) {\n console.log(\n `trimLeadingWhitespaceOutsideFences: ${duration.toFixed(3)}ms, text length: ${text.length}, lines count: ${lines.length}`\n );\n }\n\n return result;\n};\n\n/**\n * Normalize HTML attribute key to JSX prop name.\n */\nexport const normalizeAttributeKey = (key: string): string => {\n const hyphenIndex = key.indexOf('-');\n\n if (hyphenIndex !== -1 && key.match(HTML_CUSTOM_ATTR_R) === null) {\n key = key.replace(CAPTURE_LETTER_AFTER_HYPHEN, (_, letter) => {\n return letter.toUpperCase();\n });\n }\n\n return key;\n};\n\ntype StyleTuple = [key: string, value: string];\n\n/**\n * Parse a CSS style string into an array of [key, value] tuples.\n */\nexport const parseStyleAttribute = (styleString: string): StyleTuple[] => {\n const start = performance.now();\n const styles: StyleTuple[] = [];\n let buffer = '';\n let inUrl = false;\n let inQuotes = false;\n let quoteChar: '\"' | \"'\" | '' = '';\n\n if (!styleString) return styles;\n\n for (let i = 0; i < styleString.length; i++) {\n const char = styleString[i];\n\n if ((char === '\"' || char === \"'\") && !inUrl) {\n if (!inQuotes) {\n inQuotes = true;\n quoteChar = char;\n } else if (char === quoteChar) {\n inQuotes = false;\n quoteChar = '';\n }\n }\n\n if (char === '(' && buffer.endsWith('url')) {\n inUrl = true;\n } else if (char === ')' && inUrl) {\n inUrl = false;\n }\n\n if (char === ';' && !inQuotes && !inUrl) {\n const declaration = buffer.trim();\n\n if (declaration) {\n const colonIndex = declaration.indexOf(':');\n\n if (colonIndex > 0) {\n const key = declaration.slice(0, colonIndex).trim();\n const value = declaration.slice(colonIndex + 1).trim();\n styles.push([key, value]);\n }\n }\n buffer = '';\n } else {\n buffer += char;\n }\n }\n\n const declaration = buffer.trim();\n\n if (declaration) {\n const colonIndex = declaration.indexOf(':');\n if (colonIndex > 0) {\n const key = declaration.slice(0, colonIndex).trim();\n const value = declaration.slice(colonIndex + 1).trim();\n styles.push([key, value]);\n }\n }\n\n const duration = performance.now() - start;\n\n if (duration > DURATION_DELAY_TRIGGER) {\n console.log(\n `parseStyleAttribute: ${duration.toFixed(3)}ms, styleString length: ${styleString.length}, styles count: ${styles.length}`\n );\n }\n\n return styles;\n};\n\n/**\n * Convert an attribute value to a Node prop value.\n */\nexport const attributeValueToNodePropValue = (\n tag: string,\n key: string,\n value: string,\n sanitizeUrlFn: (\n value: string,\n tag: string,\n attribute: string\n ) => string | null\n): any => {\n if (key === 'style') {\n return parseStyleAttribute(value).reduce(\n (styles, [styleKey, styleValue]) => {\n const camelCasedKey = styleKey.replace(/(-[a-z])/g, (substr) =>\n substr[1].toUpperCase()\n );\n\n (styles as Record<string, any>)[camelCasedKey] = sanitizeUrlFn(\n styleValue,\n tag,\n styleKey\n );\n\n return styles;\n },\n {} as Record<string, any>\n );\n } else if (ATTRIBUTES_TO_SANITIZE.indexOf(key) !== -1) {\n return sanitizeUrlFn(unescapeString(value), tag, key);\n } else if (value.match(INTERPOLATION_R)) {\n value = unescapeString(value.slice(1, value.length - 1));\n }\n\n if (value === 'true') {\n return true;\n } else if (value === 'false') {\n return false;\n }\n\n return value;\n};\n\n// ============================================================================\n// TABLE PARSING\n// ============================================================================\n\n/**\n * Parse table alignment from a separator row.\n */\nexport const parseTableAlignCapture = (\n alignCapture: string\n): 'left' | 'right' | 'center' => {\n if (TABLE_RIGHT_ALIGN.test(alignCapture)) {\n return 'right';\n } else if (TABLE_CENTER_ALIGN.test(alignCapture)) {\n return 'center';\n } else if (TABLE_LEFT_ALIGN.test(alignCapture)) {\n return 'left';\n }\n\n return 'left';\n};\n\n/**\n * Parse table alignment row.\n */\nexport const parseTableAlign = (\n source: string\n): ('left' | 'right' | 'center')[] => {\n const alignText = source.replace(TABLE_TRIM_PIPES, '').split('|');\n return alignText.map(parseTableAlignCapture);\n};\n\n/**\n * Parse a single table row.\n */\nexport const parseTableRow = (\n source: string,\n parse: NestedParser,\n state: ParseState,\n tableOutput: boolean\n): ParserResult[][] => {\n const start = performance.now();\n const prevInTable = state.inTable;\n\n state.inTable = true;\n\n const cells: ParserResult[][] = [[]];\n let acc = '';\n\n const flush = (): void => {\n if (!acc) return;\n\n const cell = cells[cells.length - 1];\n cell.push.apply(cell, parse(acc, state));\n acc = '';\n };\n\n source\n .trim()\n .split(/(`[^`]*`|\\\\\\||\\|)/)\n .filter(Boolean)\n .forEach((fragment, i, arr) => {\n if (fragment.trim() === '|') {\n flush();\n\n if (tableOutput) {\n if (i !== 0 && i !== arr.length - 1) {\n cells.push([]);\n }\n\n return;\n }\n }\n\n acc += fragment;\n });\n\n flush();\n\n state.inTable = prevInTable;\n\n const duration = performance.now() - start;\n if (duration > DURATION_DELAY_TRIGGER) {\n console.log(\n `parseTableRow: ${duration.toFixed(3)}ms, source length: ${source.length}, cells count: ${cells.length}`\n );\n }\n\n return cells;\n};\n\n/**\n * Parse table cells (multiple rows).\n */\nexport const parseTableCells = (\n source: string,\n parse: NestedParser,\n state: ParseState\n): ParserResult[][][] => {\n const start = performance.now();\n const rowsText = source.trim().split('\\n');\n\n const result = rowsText.map((rowText) =>\n parseTableRow(rowText, parse, state, true)\n );\n\n const duration = performance.now() - start;\n if (duration > DURATION_DELAY_TRIGGER) {\n console.log(\n `parseTableCells: ${duration.toFixed(3)}ms, source length: ${source.length}, rows count: ${rowsText.length}`\n );\n }\n\n return result;\n};\n\n// ============================================================================\n// PARSING HELPERS\n// ============================================================================\n\n/**\n * Check if a rule qualifies for the current source and state.\n */\nexport const qualifies = (\n source: string,\n state: ParseState,\n qualify: NonNullable<Rule<any>['_qualify']>\n): boolean => {\n if (Array.isArray(qualify)) {\n for (let i = 0; i < qualify.length; i++) {\n if (startsWith(source, qualify[i])) return true;\n }\n\n return false;\n }\n\n return (qualify as (source: string, state: ParseState) => boolean)(\n source,\n state\n );\n};\n\n/**\n * Marks a matcher function as eligible for being run inside an inline context.\n */\nexport const allowInline = <T extends (...args: any[]) => any>(\n fn: T\n): T & { inline: 1 } => {\n (fn as any).inline = 1;\n return fn as T & { inline: 1 };\n};\n\n/**\n * Creates a match function for an inline scoped element from a regex.\n */\nexport const inlineRegex = (regex: RegExp) =>\n allowInline((source: string, state: ParseState): RegExpMatchArray | null => {\n if (state.inline) {\n return regex.exec(source);\n } else {\n return null;\n }\n });\n\n/**\n * Creates a match function for inline elements except links.\n */\nexport const simpleInlineRegex = (regex: RegExp) =>\n allowInline((source: string, state: ParseState): RegExpMatchArray | null => {\n if (state.inline || state.simple) {\n return regex.exec(source);\n } else {\n return null;\n }\n });\n\n/**\n * Creates a match function for a block scoped element from a regex.\n */\nexport const blockRegex =\n (regex: RegExp) =>\n (source: string, state: ParseState): RegExpMatchArray | null => {\n if (state.inline || state.simple) {\n return null;\n } else {\n return regex.exec(source);\n }\n };\n\n/**\n * Creates a match function from a regex, ignoring block/inline scope.\n */\nexport const anyScopeRegex = (\n fn: RegExp | ((source: string, state: ParseState) => RegExpMatchArray | null)\n) =>\n allowInline((source: string, state: ParseState): RegExpMatchArray | null => {\n if (typeof fn === 'function') {\n return fn(source, state);\n }\n return fn.exec(source);\n });\n\n/**\n * Parse inline content (including links).\n */\nexport const parseInline = (\n parse: NestedParser,\n children: string,\n state: ParseState\n): ParserResult[] => {\n const start = performance.now();\n const isCurrentlyInline = state.inline ?? false;\n const isCurrentlySimple = state.simple ?? false;\n state.inline = true;\n state.simple = true;\n const result = parse(children, state);\n state.inline = isCurrentlyInline;\n state.simple = isCurrentlySimple;\n\n const duration = performance.now() - start;\n if (duration > DURATION_DELAY_TRIGGER) {\n console.log(\n `parseInline: ${duration.toFixed(3)}ms, children length: ${children.length}, result count: ${result.length}`\n );\n }\n\n return result;\n};\n\n/**\n * Parse simple inline content (no links).\n */\nexport const parseSimpleInline = (\n parse: NestedParser,\n children: string,\n state: ParseState\n): ParserResult[] => {\n const start = performance.now();\n const isCurrentlyInline = state.inline ?? false;\n const isCurrentlySimple = state.simple ?? false;\n\n state.inline = false;\n state.simple = true;\n const result = parse(children, state);\n state.inline = isCurrentlyInline;\n state.simple = isCurrentlySimple;\n\n const duration = performance.now() - start;\n if (duration > DURATION_DELAY_TRIGGER) {\n console.log(\n `parseSimpleInline: ${duration.toFixed(3)}ms, children length: ${children.length}, result count: ${result.length}`\n );\n }\n\n return result;\n};\n\n/**\n * Parse block content.\n */\nexport const parseBlock = (\n parse: NestedParser,\n children: string,\n state: ParseState = {}\n): ParserResult[] => {\n const start = performance.now();\n const isCurrentlyInline = state.inline || false;\n state.inline = false;\n const normalizedChildren = trimEnd(children);\n const needsTerminator = /\\n\\n$/.test(normalizedChildren) === false;\n const blockInput = needsTerminator\n ? normalizedChildren.endsWith('\\n')\n ? `${normalizedChildren}\\n`\n : `${normalizedChildren}\\n\\n`\n : normalizedChildren;\n\n const result = parse(blockInput, state);\n state.inline = isCurrentlyInline;\n\n const duration = performance.now() - start;\n if (duration > DURATION_DELAY_TRIGGER) {\n console.log(\n `parseBlock: ${duration.toFixed(3)}ms, children length: ${children.length}, result count: ${result.length}`\n );\n }\n\n return result;\n};\n\n/**\n * Helper to parse capture group 2 as inline content.\n */\nexport const parseCaptureInline = (\n capture: RegExpMatchArray,\n parse: NestedParser,\n state: ParseState\n): { children: ParserResult[] } => {\n return {\n children: parseInline(parse, capture[2], state),\n };\n};\n\n/**\n * Helper that captures nothing (empty object).\n */\nexport const captureNothing = (): Record<string, never> => ({});\n\n/**\n * Helper that renders nothing (null).\n */\nexport const renderNothing = (): null => null;\n\n/**\n * Check if any regex in a list matches the input.\n */\nexport const some = (regexes: RegExp[], input: string): boolean => {\n for (let i = 0; i < regexes.length; i++) {\n if (regexes[i].test(input)) {\n return true;\n }\n }\n return false;\n};\n"],"mappings":"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"}