@intlayer/cli 8.4.4 → 8.4.6

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 (305) hide show
  1. package/dist/cjs/IntlayerEventListener.cjs +186 -1
  2. package/dist/cjs/IntlayerEventListener.cjs.map +1 -1
  3. package/dist/cjs/_virtual/_rolldown/runtime.cjs +29 -0
  4. package/dist/cjs/_virtual/_utils_asset.cjs +98 -0
  5. package/dist/cjs/auth/login.cjs +90 -2
  6. package/dist/cjs/auth/login.cjs.map +1 -1
  7. package/dist/cjs/build.cjs +30 -1
  8. package/dist/cjs/build.cjs.map +1 -1
  9. package/dist/cjs/ci.cjs +76 -1
  10. package/dist/cjs/ci.cjs.map +1 -1
  11. package/dist/cjs/cli.cjs +485 -1
  12. package/dist/cjs/cli.cjs.map +1 -1
  13. package/dist/cjs/config.cjs +15 -1
  14. package/dist/cjs/config.cjs.map +1 -1
  15. package/dist/cjs/editor.cjs +50 -1
  16. package/dist/cjs/editor.cjs.map +1 -1
  17. package/dist/cjs/extract.cjs +108 -1
  18. package/dist/cjs/extract.cjs.map +1 -1
  19. package/dist/cjs/fill/deepMergeContent.cjs +27 -1
  20. package/dist/cjs/fill/deepMergeContent.cjs.map +1 -1
  21. package/dist/cjs/fill/fill.cjs +89 -1
  22. package/dist/cjs/fill/fill.cjs.map +1 -1
  23. package/dist/cjs/fill/formatAutoFilledFilePath.cjs +32 -1
  24. package/dist/cjs/fill/formatAutoFilledFilePath.cjs.map +1 -1
  25. package/dist/cjs/fill/formatFillData.cjs +91 -1
  26. package/dist/cjs/fill/formatFillData.cjs.map +1 -1
  27. package/dist/cjs/fill/getAvailableLocalesInDictionary.cjs +26 -1
  28. package/dist/cjs/fill/getAvailableLocalesInDictionary.cjs.map +1 -1
  29. package/dist/cjs/fill/getFilterMissingContentPerLocale.cjs +51 -1
  30. package/dist/cjs/fill/getFilterMissingContentPerLocale.cjs.map +1 -1
  31. package/dist/cjs/fill/index.cjs +6 -1
  32. package/dist/cjs/fill/listTranslationsTasks.cjs +72 -1
  33. package/dist/cjs/fill/listTranslationsTasks.cjs.map +1 -1
  34. package/dist/cjs/fill/translateDictionary.cjs +241 -1
  35. package/dist/cjs/fill/translateDictionary.cjs.map +1 -1
  36. package/dist/cjs/fill/writeFill.cjs +53 -1
  37. package/dist/cjs/fill/writeFill.cjs.map +1 -1
  38. package/dist/cjs/getTargetDictionary.cjs +36 -1
  39. package/dist/cjs/getTargetDictionary.cjs.map +1 -1
  40. package/dist/cjs/index.cjs +44 -1
  41. package/dist/cjs/init.cjs +22 -1
  42. package/dist/cjs/init.cjs.map +1 -1
  43. package/dist/cjs/initMCP.cjs +69 -1
  44. package/dist/cjs/initMCP.cjs.map +1 -1
  45. package/dist/cjs/initSkills.cjs +93 -1
  46. package/dist/cjs/initSkills.cjs.map +1 -1
  47. package/dist/cjs/listContentDeclaration.cjs +42 -1
  48. package/dist/cjs/listContentDeclaration.cjs.map +1 -1
  49. package/dist/cjs/listProjects.cjs +28 -1
  50. package/dist/cjs/listProjects.cjs.map +1 -1
  51. package/dist/cjs/liveSync.cjs +153 -8
  52. package/dist/cjs/liveSync.cjs.map +1 -1
  53. package/dist/cjs/pull.cjs +153 -1
  54. package/dist/cjs/pull.cjs.map +1 -1
  55. package/dist/cjs/push/pullLog.cjs +105 -3
  56. package/dist/cjs/push/pullLog.cjs.map +1 -1
  57. package/dist/cjs/push/push.cjs +212 -1
  58. package/dist/cjs/push/push.cjs.map +1 -1
  59. package/dist/cjs/pushConfig.cjs +22 -1
  60. package/dist/cjs/pushConfig.cjs.map +1 -1
  61. package/dist/cjs/pushLog.cjs +86 -3
  62. package/dist/cjs/pushLog.cjs.map +1 -1
  63. package/dist/cjs/reviewDoc/reviewDoc.cjs +73 -1
  64. package/dist/cjs/reviewDoc/reviewDoc.cjs.map +1 -1
  65. package/dist/cjs/reviewDoc/reviewDocBlockAware.cjs +98 -1
  66. package/dist/cjs/reviewDoc/reviewDocBlockAware.cjs.map +1 -1
  67. package/dist/cjs/searchDoc.cjs +41 -1
  68. package/dist/cjs/searchDoc.cjs.map +1 -1
  69. package/dist/cjs/test/index.cjs +7 -1
  70. package/dist/cjs/test/listMissingTranslations.cjs +66 -1
  71. package/dist/cjs/test/listMissingTranslations.cjs.map +1 -1
  72. package/dist/cjs/test/test.cjs +56 -1
  73. package/dist/cjs/test/test.cjs.map +1 -1
  74. package/dist/cjs/translateDoc/index.cjs +9 -1
  75. package/dist/cjs/translateDoc/translateDoc.cjs +79 -1
  76. package/dist/cjs/translateDoc/translateDoc.cjs.map +1 -1
  77. package/dist/cjs/translateDoc/translateFile.cjs +106 -2
  78. package/dist/cjs/translateDoc/translateFile.cjs.map +1 -1
  79. package/dist/cjs/translateDoc/validation.cjs +49 -5
  80. package/dist/cjs/translateDoc/validation.cjs.map +1 -1
  81. package/dist/cjs/translation-alignment/alignBlocks.cjs +67 -1
  82. package/dist/cjs/translation-alignment/alignBlocks.cjs.map +1 -1
  83. package/dist/cjs/translation-alignment/computeSimilarity.cjs +25 -1
  84. package/dist/cjs/translation-alignment/computeSimilarity.cjs.map +1 -1
  85. package/dist/cjs/translation-alignment/fingerprintBlock.cjs +23 -1
  86. package/dist/cjs/translation-alignment/fingerprintBlock.cjs.map +1 -1
  87. package/dist/cjs/translation-alignment/index.cjs +22 -1
  88. package/dist/cjs/translation-alignment/mapChangedLinesToBlocks.cjs +18 -1
  89. package/dist/cjs/translation-alignment/mapChangedLinesToBlocks.cjs.map +1 -1
  90. package/dist/cjs/translation-alignment/normalizeBlock.cjs +22 -1
  91. package/dist/cjs/translation-alignment/normalizeBlock.cjs.map +1 -1
  92. package/dist/cjs/translation-alignment/pipeline.cjs +37 -1
  93. package/dist/cjs/translation-alignment/pipeline.cjs.map +1 -1
  94. package/dist/cjs/translation-alignment/planActions.cjs +46 -1
  95. package/dist/cjs/translation-alignment/planActions.cjs.map +1 -1
  96. package/dist/cjs/translation-alignment/rebuildDocument.cjs +49 -2
  97. package/dist/cjs/translation-alignment/rebuildDocument.cjs.map +1 -1
  98. package/dist/cjs/translation-alignment/segmentDocument.cjs +66 -5
  99. package/dist/cjs/translation-alignment/segmentDocument.cjs.map +1 -1
  100. package/dist/cjs/utils/calculateChunks.cjs +89 -2
  101. package/dist/cjs/utils/calculateChunks.cjs.map +1 -1
  102. package/dist/cjs/utils/checkAccess.cjs +83 -1
  103. package/dist/cjs/utils/checkAccess.cjs.map +1 -1
  104. package/dist/cjs/utils/checkConfigConsistency.cjs +16 -1
  105. package/dist/cjs/utils/checkConfigConsistency.cjs.map +1 -1
  106. package/dist/cjs/utils/checkFileModifiedRange.cjs +81 -1
  107. package/dist/cjs/utils/checkFileModifiedRange.cjs.map +1 -1
  108. package/dist/cjs/utils/checkLastUpdateTime.cjs +19 -1
  109. package/dist/cjs/utils/checkLastUpdateTime.cjs.map +1 -1
  110. package/dist/cjs/utils/chunkInference.cjs +45 -1
  111. package/dist/cjs/utils/chunkInference.cjs.map +1 -1
  112. package/dist/cjs/utils/fixChunkStartEndChars.cjs +27 -3
  113. package/dist/cjs/utils/fixChunkStartEndChars.cjs.map +1 -1
  114. package/dist/cjs/utils/formatTimeDiff.cjs +20 -1
  115. package/dist/cjs/utils/formatTimeDiff.cjs.map +1 -1
  116. package/dist/cjs/utils/getIsFileUpdatedRecently.cjs +16 -1
  117. package/dist/cjs/utils/getIsFileUpdatedRecently.cjs.map +1 -1
  118. package/dist/cjs/utils/getOutputFilePath.cjs +108 -1
  119. package/dist/cjs/utils/getOutputFilePath.cjs.map +1 -1
  120. package/dist/cjs/utils/getParentPackageJSON.cjs +20 -1
  121. package/dist/cjs/utils/getParentPackageJSON.cjs.map +1 -1
  122. package/dist/cjs/utils/listSpecialChars.cjs +54 -2
  123. package/dist/cjs/utils/listSpecialChars.cjs.map +1 -1
  124. package/dist/cjs/utils/mapChunksBetweenFiles.cjs +102 -1
  125. package/dist/cjs/utils/mapChunksBetweenFiles.cjs.map +1 -1
  126. package/dist/cjs/utils/openBrowser.cjs +19 -1
  127. package/dist/cjs/utils/openBrowser.cjs.map +1 -1
  128. package/dist/cjs/utils/reorderParagraphs.cjs +91 -3
  129. package/dist/cjs/utils/reorderParagraphs.cjs.map +1 -1
  130. package/dist/cjs/utils/setupAI.cjs +66 -1
  131. package/dist/cjs/utils/setupAI.cjs.map +1 -1
  132. package/dist/cjs/watch.cjs +47 -1
  133. package/dist/cjs/watch.cjs.map +1 -1
  134. package/dist/esm/IntlayerEventListener.mjs +183 -1
  135. package/dist/esm/IntlayerEventListener.mjs.map +1 -1
  136. package/dist/esm/_virtual/_rolldown/runtime.mjs +8 -0
  137. package/dist/esm/_virtual/_utils_asset.mjs +97 -0
  138. package/dist/esm/auth/login.mjs +86 -2
  139. package/dist/esm/auth/login.mjs.map +1 -1
  140. package/dist/esm/build.mjs +28 -1
  141. package/dist/esm/build.mjs.map +1 -1
  142. package/dist/esm/ci.mjs +74 -1
  143. package/dist/esm/ci.mjs.map +1 -1
  144. package/dist/esm/cli.mjs +482 -1
  145. package/dist/esm/cli.mjs.map +1 -1
  146. package/dist/esm/config.mjs +13 -1
  147. package/dist/esm/config.mjs.map +1 -1
  148. package/dist/esm/editor.mjs +50 -1
  149. package/dist/esm/editor.mjs.map +1 -0
  150. package/dist/esm/extract.mjs +104 -1
  151. package/dist/esm/extract.mjs.map +1 -1
  152. package/dist/esm/fill/deepMergeContent.mjs +25 -1
  153. package/dist/esm/fill/deepMergeContent.mjs.map +1 -1
  154. package/dist/esm/fill/fill.mjs +86 -1
  155. package/dist/esm/fill/fill.mjs.map +1 -1
  156. package/dist/esm/fill/formatAutoFilledFilePath.mjs +30 -1
  157. package/dist/esm/fill/formatAutoFilledFilePath.mjs.map +1 -1
  158. package/dist/esm/fill/formatFillData.mjs +89 -1
  159. package/dist/esm/fill/formatFillData.mjs.map +1 -1
  160. package/dist/esm/fill/getAvailableLocalesInDictionary.mjs +24 -1
  161. package/dist/esm/fill/getAvailableLocalesInDictionary.mjs.map +1 -1
  162. package/dist/esm/fill/getFilterMissingContentPerLocale.mjs +49 -1
  163. package/dist/esm/fill/getFilterMissingContentPerLocale.mjs.map +1 -1
  164. package/dist/esm/fill/index.mjs +4 -1
  165. package/dist/esm/fill/listTranslationsTasks.mjs +69 -1
  166. package/dist/esm/fill/listTranslationsTasks.mjs.map +1 -1
  167. package/dist/esm/fill/translateDictionary.mjs +238 -1
  168. package/dist/esm/fill/translateDictionary.mjs.map +1 -1
  169. package/dist/esm/fill/writeFill.mjs +51 -1
  170. package/dist/esm/fill/writeFill.mjs.map +1 -1
  171. package/dist/esm/getTargetDictionary.mjs +33 -1
  172. package/dist/esm/getTargetDictionary.mjs.map +1 -1
  173. package/dist/esm/index.mjs +20 -1
  174. package/dist/esm/init.mjs +19 -1
  175. package/dist/esm/init.mjs.map +1 -1
  176. package/dist/esm/initMCP.mjs +65 -1
  177. package/dist/esm/initMCP.mjs.map +1 -1
  178. package/dist/esm/initSkills.mjs +87 -1
  179. package/dist/esm/initSkills.mjs.map +1 -1
  180. package/dist/esm/listContentDeclaration.mjs +39 -1
  181. package/dist/esm/listContentDeclaration.mjs.map +1 -1
  182. package/dist/esm/listProjects.mjs +26 -1
  183. package/dist/esm/listProjects.mjs.map +1 -1
  184. package/dist/esm/liveSync.mjs +150 -8
  185. package/dist/esm/liveSync.mjs.map +1 -1
  186. package/dist/esm/pull.mjs +150 -1
  187. package/dist/esm/pull.mjs.map +1 -1
  188. package/dist/esm/push/pullLog.mjs +102 -3
  189. package/dist/esm/push/pullLog.mjs.map +1 -1
  190. package/dist/esm/push/push.mjs +208 -1
  191. package/dist/esm/push/push.mjs.map +1 -1
  192. package/dist/esm/pushConfig.mjs +20 -1
  193. package/dist/esm/pushConfig.mjs.map +1 -1
  194. package/dist/esm/pushLog.mjs +83 -3
  195. package/dist/esm/pushLog.mjs.map +1 -1
  196. package/dist/esm/reviewDoc/reviewDoc.mjs +69 -1
  197. package/dist/esm/reviewDoc/reviewDoc.mjs.map +1 -1
  198. package/dist/esm/reviewDoc/reviewDocBlockAware.mjs +95 -1
  199. package/dist/esm/reviewDoc/reviewDocBlockAware.mjs.map +1 -1
  200. package/dist/esm/searchDoc.mjs +39 -1
  201. package/dist/esm/searchDoc.mjs.map +1 -1
  202. package/dist/esm/test/index.mjs +4 -1
  203. package/dist/esm/test/listMissingTranslations.mjs +63 -1
  204. package/dist/esm/test/listMissingTranslations.mjs.map +1 -1
  205. package/dist/esm/test/test.mjs +53 -1
  206. package/dist/esm/test/test.mjs.map +1 -1
  207. package/dist/esm/translateDoc/index.mjs +5 -1
  208. package/dist/esm/translateDoc/translateDoc.mjs +75 -1
  209. package/dist/esm/translateDoc/translateDoc.mjs.map +1 -1
  210. package/dist/esm/translateDoc/translateFile.mjs +103 -2
  211. package/dist/esm/translateDoc/translateFile.mjs.map +1 -1
  212. package/dist/esm/translateDoc/validation.mjs +46 -5
  213. package/dist/esm/translateDoc/validation.mjs.map +1 -1
  214. package/dist/esm/translation-alignment/alignBlocks.mjs +66 -1
  215. package/dist/esm/translation-alignment/alignBlocks.mjs.map +1 -1
  216. package/dist/esm/translation-alignment/computeSimilarity.mjs +22 -1
  217. package/dist/esm/translation-alignment/computeSimilarity.mjs.map +1 -1
  218. package/dist/esm/translation-alignment/fingerprintBlock.mjs +20 -1
  219. package/dist/esm/translation-alignment/fingerprintBlock.mjs.map +1 -1
  220. package/dist/esm/translation-alignment/index.mjs +11 -1
  221. package/dist/esm/translation-alignment/mapChangedLinesToBlocks.mjs +16 -1
  222. package/dist/esm/translation-alignment/mapChangedLinesToBlocks.mjs.map +1 -1
  223. package/dist/esm/translation-alignment/normalizeBlock.mjs +20 -1
  224. package/dist/esm/translation-alignment/normalizeBlock.mjs.map +1 -1
  225. package/dist/esm/translation-alignment/pipeline.mjs +35 -1
  226. package/dist/esm/translation-alignment/pipeline.mjs.map +1 -1
  227. package/dist/esm/translation-alignment/planActions.mjs +44 -1
  228. package/dist/esm/translation-alignment/planActions.mjs.map +1 -1
  229. package/dist/esm/translation-alignment/rebuildDocument.mjs +46 -2
  230. package/dist/esm/translation-alignment/rebuildDocument.mjs.map +1 -1
  231. package/dist/esm/translation-alignment/segmentDocument.mjs +64 -5
  232. package/dist/esm/translation-alignment/segmentDocument.mjs.map +1 -1
  233. package/dist/esm/utils/calculateChunks.mjs +87 -2
  234. package/dist/esm/utils/calculateChunks.mjs.map +1 -1
  235. package/dist/esm/utils/checkAccess.mjs +79 -1
  236. package/dist/esm/utils/checkAccess.mjs.map +1 -1
  237. package/dist/esm/utils/checkConfigConsistency.mjs +14 -1
  238. package/dist/esm/utils/checkConfigConsistency.mjs.map +1 -1
  239. package/dist/esm/utils/checkFileModifiedRange.mjs +80 -1
  240. package/dist/esm/utils/checkFileModifiedRange.mjs.map +1 -1
  241. package/dist/esm/utils/checkLastUpdateTime.mjs +17 -1
  242. package/dist/esm/utils/checkLastUpdateTime.mjs.map +1 -1
  243. package/dist/esm/utils/chunkInference.mjs +43 -1
  244. package/dist/esm/utils/chunkInference.mjs.map +1 -1
  245. package/dist/esm/utils/fixChunkStartEndChars.mjs +25 -3
  246. package/dist/esm/utils/fixChunkStartEndChars.mjs.map +1 -1
  247. package/dist/esm/utils/formatTimeDiff.mjs +18 -1
  248. package/dist/esm/utils/formatTimeDiff.mjs.map +1 -1
  249. package/dist/esm/utils/getIsFileUpdatedRecently.mjs +14 -1
  250. package/dist/esm/utils/getIsFileUpdatedRecently.mjs.map +1 -1
  251. package/dist/esm/utils/getOutputFilePath.mjs +104 -1
  252. package/dist/esm/utils/getOutputFilePath.mjs.map +1 -1
  253. package/dist/esm/utils/getParentPackageJSON.mjs +18 -1
  254. package/dist/esm/utils/getParentPackageJSON.mjs.map +1 -1
  255. package/dist/esm/utils/listSpecialChars.mjs +52 -2
  256. package/dist/esm/utils/listSpecialChars.mjs.map +1 -1
  257. package/dist/esm/utils/mapChunksBetweenFiles.mjs +100 -1
  258. package/dist/esm/utils/mapChunksBetweenFiles.mjs.map +1 -1
  259. package/dist/esm/utils/openBrowser.mjs +17 -1
  260. package/dist/esm/utils/openBrowser.mjs.map +1 -1
  261. package/dist/esm/utils/reorderParagraphs.mjs +90 -3
  262. package/dist/esm/utils/reorderParagraphs.mjs.map +1 -1
  263. package/dist/esm/utils/setupAI.mjs +63 -1
  264. package/dist/esm/utils/setupAI.mjs.map +1 -1
  265. package/dist/esm/watch.mjs +45 -1
  266. package/dist/esm/watch.mjs.map +1 -1
  267. package/dist/types/fill/fill.d.ts +1 -1
  268. package/dist/types/fill/fill.d.ts.map +1 -1
  269. package/dist/types/fill/formatFillData.d.ts.map +1 -1
  270. package/dist/types/fill/translateDictionary.d.ts +1 -1
  271. package/dist/types/getTargetDictionary.d.ts +19 -2
  272. package/dist/types/getTargetDictionary.d.ts.map +1 -0
  273. package/dist/types/index.d.ts +2 -2
  274. package/dist/types/reviewDoc/reviewDocBlockAware.d.ts +1 -1
  275. package/dist/types/test/index.d.ts +2 -2
  276. package/dist/types/test/listMissingTranslations.d.ts +28 -2
  277. package/dist/types/test/listMissingTranslations.d.ts.map +1 -0
  278. package/dist/types/test/test.d.ts +11 -2
  279. package/dist/types/test/test.d.ts.map +1 -0
  280. package/dist/types/translateDoc/index.d.ts +1 -1
  281. package/dist/types/translateDoc/translateDoc.d.ts +1 -1
  282. package/dist/types/translateDoc/translateFile.d.ts +1 -1
  283. package/dist/types/translateDoc/types.d.ts +48 -2
  284. package/dist/types/translateDoc/types.d.ts.map +1 -0
  285. package/dist/types/utils/chunkInference.d.ts +1 -1
  286. package/dist/types/utils/getOutputFilePath.d.ts +18 -1
  287. package/dist/types/utils/getOutputFilePath.d.ts.map +1 -1
  288. package/dist/types/utils/setupAI.d.ts +21 -2
  289. package/dist/types/utils/setupAI.d.ts.map +1 -0
  290. package/package.json +12 -12
  291. package/dist/cjs/_utils_asset-ghp_Cjwk.cjs +0 -2
  292. package/dist/cjs/chunk-Bmb41Sf3.cjs +0 -1
  293. package/dist/esm/_utils_asset-B187VPMw.mjs +0 -2
  294. package/dist/esm/editor-D8BGlLzF.mjs +0 -2
  295. package/dist/esm/editor-D8BGlLzF.mjs.map +0 -1
  296. package/dist/types/getTargetDictionary-RBSRtaQj.d.ts +0 -19
  297. package/dist/types/getTargetDictionary-RBSRtaQj.d.ts.map +0 -1
  298. package/dist/types/listMissingTranslations-DxKw7nqI.d.ts +0 -28
  299. package/dist/types/listMissingTranslations-DxKw7nqI.d.ts.map +0 -1
  300. package/dist/types/setupAI-Bosjx7ah.d.ts +0 -21
  301. package/dist/types/setupAI-Bosjx7ah.d.ts.map +0 -1
  302. package/dist/types/test-DUTiJR5_.d.ts +0 -11
  303. package/dist/types/test-DUTiJR5_.d.ts.map +0 -1
  304. package/dist/types/types-BKvc3FmV.d.ts +0 -48
  305. package/dist/types/types-BKvc3FmV.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"validation.cjs","names":[],"sources":["../../../src/translateDoc/validation.ts"],"sourcesContent":["import type { Logger } from '@intlayer/config/logger';\n\n/**\n * Validates that the translated content matches the structure of the original.\n * Throws an error if a mismatch is found, triggering a retry.\n */\nexport const validateTranslation = (\n original: string,\n translated: string,\n logger: Logger\n): boolean => {\n const errors: string[] = [];\n\n // YAML Frontmatter Integrity (CRITICAL)\n if (original.trimStart().startsWith('---')) {\n if (!translated.trimStart().startsWith('---')) {\n errors.push(\n 'YAML Frontmatter missing: Input starts with \"---\", output does not.'\n );\n }\n const originalDashes = (original.match(/^---$/gm) || []).length;\n const translatedDashes = (translated.match(/^---$/gm) || []).length;\n if (originalDashes >= 2 && translatedDashes < 2) {\n errors.push(\n 'YAML Frontmatter unclosed: Input has closing \"---\", output is missing it.'\n );\n }\n }\n\n // Code Fence Check\n const fenceRegex = /^\\s*```/gm;\n const originalFences = (original.match(fenceRegex) || []).length;\n const translatedFences = (translated.match(fenceRegex) || []).length;\n\n if (originalFences !== translatedFences) {\n errors.push(\n `Code fence mismatch: Input has ${originalFences}, output has ${translatedFences}`\n );\n }\n\n // Length/Duplication Check\n const ratio = translated.length / (original.length || 1);\n const isTooLong = ratio > 2.5;\n const isSignificantLength = original.length > 50;\n\n if (isTooLong && isSignificantLength) {\n errors.push(\n `Length deviation: Output is ${translated.length} chars vs Input ${original.length} (${ratio.toFixed(1)}x). Likely included context.`\n );\n }\n\n // Line Count Heuristic\n const originalLines = original.split('\\n').length;\n const translatedLines = translated.split('\\n').length;\n\n if (originalLines > 5) {\n if (translatedLines < originalLines * 0.4) {\n errors.push(\n `Line count deviation: Output has ${translatedLines} lines, Input has ${originalLines}. Likely content deletion.`\n );\n }\n }\n\n if (errors.length > 0) {\n logger(`Validation Failed: ${errors.join(', ')}`);\n return false;\n }\n\n return true;\n};\n\n/**\n * Clean common AI artifacts\n */\nexport const sanitizeChunk = (translated: string, original: string): string => {\n let cleaned = translated;\n const wrapRegex = /^```(?:markdown|md|txt)?\\n([\\s\\S]*?)\\n```$/i;\n const match = cleaned.match(wrapRegex);\n if (match) cleaned = match[1];\n\n if (!original.startsWith('\\n') && cleaned.startsWith('\\n')) {\n cleaned = cleaned.replace(/^\\n+/, '');\n }\n if (!original.startsWith(' ') && cleaned.startsWith(' ')) {\n cleaned = cleaned.trimStart();\n }\n return cleaned;\n};\n"],"mappings":"mEAMA,MAAa,GACX,EACA,EACA,IACY,CACZ,IAAM,EAAmB,EAAE,CAG3B,GAAI,EAAS,WAAW,CAAC,WAAW,MAAM,CAAE,CACrC,EAAW,WAAW,CAAC,WAAW,MAAM,EAC3C,EAAO,KACL,sEACD,CAEH,IAAM,GAAkB,EAAS,MAAM,UAAU,EAAI,EAAE,EAAE,OACnD,GAAoB,EAAW,MAAM,UAAU,EAAI,EAAE,EAAE,OACzD,GAAkB,GAAK,EAAmB,GAC5C,EAAO,KACL,4EACD,CAKL,IAAM,EAAa,YACb,GAAkB,EAAS,MAAM,EAAW,EAAI,EAAE,EAAE,OACpD,GAAoB,EAAW,MAAM,EAAW,EAAI,EAAE,EAAE,OAE1D,IAAmB,GACrB,EAAO,KACL,kCAAkC,EAAe,eAAe,IACjE,CAIH,IAAM,EAAQ,EAAW,QAAU,EAAS,QAAU,GAChD,EAAY,EAAQ,IACpB,EAAsB,EAAS,OAAS,GAE1C,GAAa,GACf,EAAO,KACL,+BAA+B,EAAW,OAAO,kBAAkB,EAAS,OAAO,IAAI,EAAM,QAAQ,EAAE,CAAC,8BACzG,CAIH,IAAM,EAAgB,EAAS,MAAM;EAAK,CAAC,OACrC,EAAkB,EAAW,MAAM;EAAK,CAAC,OAe/C,OAbI,EAAgB,GACd,EAAkB,EAAgB,IACpC,EAAO,KACL,oCAAoC,EAAgB,oBAAoB,EAAc,4BACvF,CAID,EAAO,OAAS,GAClB,EAAO,sBAAsB,EAAO,KAAK,KAAK,GAAG,CAC1C,IAGF,IAMI,GAAiB,EAAoB,IAA6B,CAC7E,IAAI,EAAU,EAER,EAAQ,EAAQ,MADJ,8CACoB,CAStC,OARI,IAAO,EAAU,EAAM,IAEvB,CAAC,EAAS,WAAW;EAAK,EAAI,EAAQ,WAAW;EAAK,GACxD,EAAU,EAAQ,QAAQ,OAAQ,GAAG,EAEnC,CAAC,EAAS,WAAW,IAAI,EAAI,EAAQ,WAAW,IAAI,GACtD,EAAU,EAAQ,WAAW,EAExB"}
1
+ {"version":3,"file":"validation.cjs","names":[],"sources":["../../../src/translateDoc/validation.ts"],"sourcesContent":["import type { Logger } from '@intlayer/config/logger';\n\n/**\n * Validates that the translated content matches the structure of the original.\n * Throws an error if a mismatch is found, triggering a retry.\n */\nexport const validateTranslation = (\n original: string,\n translated: string,\n logger: Logger\n): boolean => {\n const errors: string[] = [];\n\n // YAML Frontmatter Integrity (CRITICAL)\n if (original.trimStart().startsWith('---')) {\n if (!translated.trimStart().startsWith('---')) {\n errors.push(\n 'YAML Frontmatter missing: Input starts with \"---\", output does not.'\n );\n }\n const originalDashes = (original.match(/^---$/gm) || []).length;\n const translatedDashes = (translated.match(/^---$/gm) || []).length;\n if (originalDashes >= 2 && translatedDashes < 2) {\n errors.push(\n 'YAML Frontmatter unclosed: Input has closing \"---\", output is missing it.'\n );\n }\n }\n\n // Code Fence Check\n const fenceRegex = /^\\s*```/gm;\n const originalFences = (original.match(fenceRegex) || []).length;\n const translatedFences = (translated.match(fenceRegex) || []).length;\n\n if (originalFences !== translatedFences) {\n errors.push(\n `Code fence mismatch: Input has ${originalFences}, output has ${translatedFences}`\n );\n }\n\n // Length/Duplication Check\n const ratio = translated.length / (original.length || 1);\n const isTooLong = ratio > 2.5;\n const isSignificantLength = original.length > 50;\n\n if (isTooLong && isSignificantLength) {\n errors.push(\n `Length deviation: Output is ${translated.length} chars vs Input ${original.length} (${ratio.toFixed(1)}x). Likely included context.`\n );\n }\n\n // Line Count Heuristic\n const originalLines = original.split('\\n').length;\n const translatedLines = translated.split('\\n').length;\n\n if (originalLines > 5) {\n if (translatedLines < originalLines * 0.4) {\n errors.push(\n `Line count deviation: Output has ${translatedLines} lines, Input has ${originalLines}. Likely content deletion.`\n );\n }\n }\n\n if (errors.length > 0) {\n logger(`Validation Failed: ${errors.join(', ')}`);\n return false;\n }\n\n return true;\n};\n\n/**\n * Clean common AI artifacts\n */\nexport const sanitizeChunk = (translated: string, original: string): string => {\n let cleaned = translated;\n const wrapRegex = /^```(?:markdown|md|txt)?\\n([\\s\\S]*?)\\n```$/i;\n const match = cleaned.match(wrapRegex);\n if (match) cleaned = match[1];\n\n if (!original.startsWith('\\n') && cleaned.startsWith('\\n')) {\n cleaned = cleaned.replace(/^\\n+/, '');\n }\n if (!original.startsWith(' ') && cleaned.startsWith(' ')) {\n cleaned = cleaned.trimStart();\n }\n return cleaned;\n};\n"],"mappings":";;;;;;;AAMA,MAAa,uBACX,UACA,YACA,WACY;CACZ,MAAM,SAAmB,EAAE;AAG3B,KAAI,SAAS,WAAW,CAAC,WAAW,MAAM,EAAE;AAC1C,MAAI,CAAC,WAAW,WAAW,CAAC,WAAW,MAAM,CAC3C,QAAO,KACL,wEACD;EAEH,MAAM,kBAAkB,SAAS,MAAM,UAAU,IAAI,EAAE,EAAE;EACzD,MAAM,oBAAoB,WAAW,MAAM,UAAU,IAAI,EAAE,EAAE;AAC7D,MAAI,kBAAkB,KAAK,mBAAmB,EAC5C,QAAO,KACL,8EACD;;CAKL,MAAM,aAAa;CACnB,MAAM,kBAAkB,SAAS,MAAM,WAAW,IAAI,EAAE,EAAE;CAC1D,MAAM,oBAAoB,WAAW,MAAM,WAAW,IAAI,EAAE,EAAE;AAE9D,KAAI,mBAAmB,iBACrB,QAAO,KACL,kCAAkC,eAAe,eAAe,mBACjE;CAIH,MAAM,QAAQ,WAAW,UAAU,SAAS,UAAU;CACtD,MAAM,YAAY,QAAQ;CAC1B,MAAM,sBAAsB,SAAS,SAAS;AAE9C,KAAI,aAAa,oBACf,QAAO,KACL,+BAA+B,WAAW,OAAO,kBAAkB,SAAS,OAAO,IAAI,MAAM,QAAQ,EAAE,CAAC,8BACzG;CAIH,MAAM,gBAAgB,SAAS,MAAM,KAAK,CAAC;CAC3C,MAAM,kBAAkB,WAAW,MAAM,KAAK,CAAC;AAE/C,KAAI,gBAAgB,GAClB;MAAI,kBAAkB,gBAAgB,GACpC,QAAO,KACL,oCAAoC,gBAAgB,oBAAoB,cAAc,4BACvF;;AAIL,KAAI,OAAO,SAAS,GAAG;AACrB,SAAO,sBAAsB,OAAO,KAAK,KAAK,GAAG;AACjD,SAAO;;AAGT,QAAO;;;;;AAMT,MAAa,iBAAiB,YAAoB,aAA6B;CAC7E,IAAI,UAAU;CAEd,MAAM,QAAQ,QAAQ,MADJ,8CACoB;AACtC,KAAI,MAAO,WAAU,MAAM;AAE3B,KAAI,CAAC,SAAS,WAAW,KAAK,IAAI,QAAQ,WAAW,KAAK,CACxD,WAAU,QAAQ,QAAQ,QAAQ,GAAG;AAEvC,KAAI,CAAC,SAAS,WAAW,IAAI,IAAI,QAAQ,WAAW,IAAI,CACtD,WAAU,QAAQ,WAAW;AAE/B,QAAO"}
@@ -1,2 +1,68 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./computeSimilarity.cjs`),t=(t,n)=>{let r=t.length,i=n.length,a=Array.from({length:r+1},()=>Array.from({length:i+1},()=>0)),o=Array.from({length:r+1},()=>Array.from({length:i+1},()=>`diagonal`)),s=(r,i)=>{let a=t[r],o=n[i],s=a.type===o.type?2:0,c=e.computeJaccardSimilarity(a.anchorText,o.anchorText,3);return s+(Math.min(a.content.length,o.content.length)/Math.max(a.content.length,o.content.length)>.75?1:0)+c*8};for(let e=1;e<=r;e+=1)a[e][0]=a[e-1][0]+-2,o[e][0]=`up`;for(let e=1;e<=i;e+=1)a[0][e]=a[0][e-1]+-2,o[0][e]=`left`;for(let e=1;e<=r;e+=1)for(let t=1;t<=i;t+=1){let n=a[e-1][t-1]+s(e-1,t-1),r=a[e-1][t]+-2,i=a[e][t-1]+-2,c=Math.max(n,r,i);a[e][t]=c,o[e][t]=c===n?`diagonal`:c===r?`up`:`left`}let c=[],l=r,u=i;for(;l>0||u>0;)if(l>0&&u>0&&o[l][u]===`diagonal`){let r=l-1,i=u-1,a=e.computeJaccardSimilarity(t[r].anchorText,n[i].anchorText,3);c.unshift({englishIndex:r,frenchIndex:i,similarityScore:a}),--l,--u}else l>0&&(u===0||o[l][u]===`up`)?(c.unshift({englishIndex:l-1,frenchIndex:null,similarityScore:0}),--l):u>0&&(l===0||o[l][u]===`left`)&&(c.unshift({englishIndex:-1,frenchIndex:u-1,similarityScore:0}),--u);return c};exports.alignEnglishAndFrenchBlocks=t;
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
+ const require_translation_alignment_computeSimilarity = require('./computeSimilarity.cjs');
3
+
4
+ //#region src/translation-alignment/alignBlocks.ts
5
+ const alignEnglishAndFrenchBlocks = (defaultBlocks, secondaryBlocks) => {
6
+ const defaultLength = defaultBlocks.length;
7
+ const secondaryLength = secondaryBlocks.length;
8
+ const scoreMatrix = Array.from({ length: defaultLength + 1 }, () => Array.from({ length: secondaryLength + 1 }, () => 0));
9
+ const traceMatrix = Array.from({ length: defaultLength + 1 }, () => Array.from({ length: secondaryLength + 1 }, () => "diagonal"));
10
+ const gapPenalty = -2;
11
+ const computeMatchScore = (defaultIndex, secondaryIndex) => {
12
+ const defaultBlock = defaultBlocks[defaultIndex];
13
+ const secondaryBlock = secondaryBlocks[secondaryIndex];
14
+ const typeBonus = defaultBlock.type === secondaryBlock.type ? 2 : 0;
15
+ const anchorSimilarity = require_translation_alignment_computeSimilarity.computeJaccardSimilarity(defaultBlock.anchorText, secondaryBlock.anchorText, 3);
16
+ return typeBonus + (Math.min(defaultBlock.content.length, secondaryBlock.content.length) / Math.max(defaultBlock.content.length, secondaryBlock.content.length) > .75 ? 1 : 0) + anchorSimilarity * 8;
17
+ };
18
+ for (let i = 1; i <= defaultLength; i += 1) {
19
+ scoreMatrix[i][0] = scoreMatrix[i - 1][0] + gapPenalty;
20
+ traceMatrix[i][0] = "up";
21
+ }
22
+ for (let j = 1; j <= secondaryLength; j += 1) {
23
+ scoreMatrix[0][j] = scoreMatrix[0][j - 1] + gapPenalty;
24
+ traceMatrix[0][j] = "left";
25
+ }
26
+ for (let i = 1; i <= defaultLength; i += 1) for (let j = 1; j <= secondaryLength; j += 1) {
27
+ const match = scoreMatrix[i - 1][j - 1] + computeMatchScore(i - 1, j - 1);
28
+ const deleteGap = scoreMatrix[i - 1][j] + gapPenalty;
29
+ const insertGap = scoreMatrix[i][j - 1] + gapPenalty;
30
+ const best = Math.max(match, deleteGap, insertGap);
31
+ scoreMatrix[i][j] = best;
32
+ traceMatrix[i][j] = best === match ? "diagonal" : best === deleteGap ? "up" : "left";
33
+ }
34
+ const result = [];
35
+ let i = defaultLength;
36
+ let j = secondaryLength;
37
+ while (i > 0 || j > 0) if (i > 0 && j > 0 && traceMatrix[i][j] === "diagonal") {
38
+ const englishIndex = i - 1;
39
+ const frenchIndex = j - 1;
40
+ const similarityScore = require_translation_alignment_computeSimilarity.computeJaccardSimilarity(defaultBlocks[englishIndex].anchorText, secondaryBlocks[frenchIndex].anchorText, 3);
41
+ result.unshift({
42
+ englishIndex,
43
+ frenchIndex,
44
+ similarityScore
45
+ });
46
+ i -= 1;
47
+ j -= 1;
48
+ } else if (i > 0 && (j === 0 || traceMatrix[i][j] === "up")) {
49
+ result.unshift({
50
+ englishIndex: i - 1,
51
+ frenchIndex: null,
52
+ similarityScore: 0
53
+ });
54
+ i -= 1;
55
+ } else if (j > 0 && (i === 0 || traceMatrix[i][j] === "left")) {
56
+ result.unshift({
57
+ englishIndex: -1,
58
+ frenchIndex: j - 1,
59
+ similarityScore: 0
60
+ });
61
+ j -= 1;
62
+ }
63
+ return result;
64
+ };
65
+
66
+ //#endregion
67
+ exports.alignEnglishAndFrenchBlocks = alignEnglishAndFrenchBlocks;
2
68
  //# sourceMappingURL=alignBlocks.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"alignBlocks.cjs","names":["computeJaccardSimilarity"],"sources":["../../../src/translation-alignment/alignBlocks.ts"],"sourcesContent":["import { computeJaccardSimilarity } from './computeSimilarity';\nimport type { AlignmentPair, FingerprintedBlock } from './types';\n\nexport const alignEnglishAndFrenchBlocks = (\n defaultBlocks: FingerprintedBlock[],\n secondaryBlocks: FingerprintedBlock[]\n): AlignmentPair[] => {\n // Needleman–Wunsch style global alignment using anchor similarity and type equality\n const defaultLength = defaultBlocks.length;\n const secondaryLength = secondaryBlocks.length;\n\n const scoreMatrix: number[][] = Array.from(\n { length: defaultLength + 1 },\n () => Array.from({ length: secondaryLength + 1 }, () => 0)\n );\n const traceMatrix: ('diagonal' | 'up' | 'left')[][] = Array.from(\n { length: defaultLength + 1 },\n () => Array.from({ length: secondaryLength + 1 }, () => 'diagonal')\n );\n\n const gapPenalty = -2;\n\n const computeMatchScore = (\n defaultIndex: number,\n secondaryIndex: number\n ): number => {\n const defaultBlock = defaultBlocks[defaultIndex];\n const secondaryBlock = secondaryBlocks[secondaryIndex];\n const typeBonus = defaultBlock.type === secondaryBlock.type ? 2 : 0;\n const anchorSimilarity = computeJaccardSimilarity(\n defaultBlock.anchorText,\n secondaryBlock.anchorText,\n 3\n );\n const lengthRatio =\n Math.min(defaultBlock.content.length, secondaryBlock.content.length) /\n Math.max(defaultBlock.content.length, secondaryBlock.content.length);\n const lengthBonus = lengthRatio > 0.75 ? 1 : 0;\n return typeBonus + lengthBonus + anchorSimilarity * 8; // weighted toward anchor similarity\n };\n\n // initialize first row and column\n for (let i = 1; i <= defaultLength; i += 1) {\n scoreMatrix[i][0] = scoreMatrix[i - 1][0] + gapPenalty;\n traceMatrix[i][0] = 'up';\n }\n for (let j = 1; j <= secondaryLength; j += 1) {\n scoreMatrix[0][j] = scoreMatrix[0][j - 1] + gapPenalty;\n traceMatrix[0][j] = 'left';\n }\n\n // fill\n for (let i = 1; i <= defaultLength; i += 1) {\n for (let j = 1; j <= secondaryLength; j += 1) {\n const match = scoreMatrix[i - 1][j - 1] + computeMatchScore(i - 1, j - 1);\n const deleteGap = scoreMatrix[i - 1][j] + gapPenalty;\n const insertGap = scoreMatrix[i][j - 1] + gapPenalty;\n\n const best = Math.max(match, deleteGap, insertGap);\n scoreMatrix[i][j] = best;\n traceMatrix[i][j] =\n best === match ? 'diagonal' : best === deleteGap ? 'up' : 'left';\n }\n }\n\n // traceback\n const result: AlignmentPair[] = [];\n let i = defaultLength;\n let j = secondaryLength;\n while (i > 0 || j > 0) {\n if (i > 0 && j > 0 && traceMatrix[i][j] === 'diagonal') {\n const englishIndex = i - 1;\n const frenchIndex = j - 1;\n const similarityScore = computeJaccardSimilarity(\n defaultBlocks[englishIndex].anchorText,\n secondaryBlocks[frenchIndex].anchorText,\n 3\n );\n result.unshift({ englishIndex, frenchIndex, similarityScore });\n i -= 1;\n j -= 1;\n } else if (i > 0 && (j === 0 || traceMatrix[i][j] === 'up')) {\n result.unshift({\n englishIndex: i - 1,\n frenchIndex: null,\n similarityScore: 0,\n });\n i -= 1;\n } else if (j > 0 && (i === 0 || traceMatrix[i][j] === 'left')) {\n // french block has no corresponding english block (deleted)\n result.unshift({\n englishIndex: -1,\n frenchIndex: j - 1,\n similarityScore: 0,\n });\n j -= 1;\n }\n }\n return result;\n};\n"],"mappings":"8GAGa,GACX,EACA,IACoB,CAEpB,IAAM,EAAgB,EAAc,OAC9B,EAAkB,EAAgB,OAElC,EAA0B,MAAM,KACpC,CAAE,OAAQ,EAAgB,EAAG,KACvB,MAAM,KAAK,CAAE,OAAQ,EAAkB,EAAG,KAAQ,EAAE,CAC3D,CACK,EAAgD,MAAM,KAC1D,CAAE,OAAQ,EAAgB,EAAG,KACvB,MAAM,KAAK,CAAE,OAAQ,EAAkB,EAAG,KAAQ,WAAW,CACpE,CAIK,GACJ,EACA,IACW,CACX,IAAM,EAAe,EAAc,GAC7B,EAAiB,EAAgB,GACjC,EAAY,EAAa,OAAS,EAAe,KAAO,EAAI,EAC5D,EAAmBA,EAAAA,yBACvB,EAAa,WACb,EAAe,WACf,EACD,CAKD,OAAO,GAHL,KAAK,IAAI,EAAa,QAAQ,OAAQ,EAAe,QAAQ,OAAO,CACpE,KAAK,IAAI,EAAa,QAAQ,OAAQ,EAAe,QAAQ,OAAO,CACpC,IAAO,EAAI,GACZ,EAAmB,GAItD,IAAK,IAAI,EAAI,EAAG,GAAK,EAAe,GAAK,EACvC,EAAY,GAAG,GAAK,EAAY,EAAI,GAAG,GAAK,GAC5C,EAAY,GAAG,GAAK,KAEtB,IAAK,IAAI,EAAI,EAAG,GAAK,EAAiB,GAAK,EACzC,EAAY,GAAG,GAAK,EAAY,GAAG,EAAI,GAAK,GAC5C,EAAY,GAAG,GAAK,OAItB,IAAK,IAAI,EAAI,EAAG,GAAK,EAAe,GAAK,EACvC,IAAK,IAAI,EAAI,EAAG,GAAK,EAAiB,GAAK,EAAG,CAC5C,IAAM,EAAQ,EAAY,EAAI,GAAG,EAAI,GAAK,EAAkB,EAAI,EAAG,EAAI,EAAE,CACnE,EAAY,EAAY,EAAI,GAAG,GAAK,GACpC,EAAY,EAAY,GAAG,EAAI,GAAK,GAEpC,EAAO,KAAK,IAAI,EAAO,EAAW,EAAU,CAClD,EAAY,GAAG,GAAK,EACpB,EAAY,GAAG,GACb,IAAS,EAAQ,WAAa,IAAS,EAAY,KAAO,OAKhE,IAAM,EAA0B,EAAE,CAC9B,EAAI,EACJ,EAAI,EACR,KAAO,EAAI,GAAK,EAAI,GAClB,GAAI,EAAI,GAAK,EAAI,GAAK,EAAY,GAAG,KAAO,WAAY,CACtD,IAAM,EAAe,EAAI,EACnB,EAAc,EAAI,EAClB,EAAkBA,EAAAA,yBACtB,EAAc,GAAc,WAC5B,EAAgB,GAAa,WAC7B,EACD,CACD,EAAO,QAAQ,CAAE,eAAc,cAAa,kBAAiB,CAAC,CAC9D,IACA,SACS,EAAI,IAAM,IAAM,GAAK,EAAY,GAAG,KAAO,OACpD,EAAO,QAAQ,CACb,aAAc,EAAI,EAClB,YAAa,KACb,gBAAiB,EAClB,CAAC,CACF,KACS,EAAI,IAAM,IAAM,GAAK,EAAY,GAAG,KAAO,UAEpD,EAAO,QAAQ,CACb,aAAc,GACd,YAAa,EAAI,EACjB,gBAAiB,EAClB,CAAC,CACF,KAGJ,OAAO"}
1
+ {"version":3,"file":"alignBlocks.cjs","names":["computeJaccardSimilarity"],"sources":["../../../src/translation-alignment/alignBlocks.ts"],"sourcesContent":["import { computeJaccardSimilarity } from './computeSimilarity';\nimport type { AlignmentPair, FingerprintedBlock } from './types';\n\nexport const alignEnglishAndFrenchBlocks = (\n defaultBlocks: FingerprintedBlock[],\n secondaryBlocks: FingerprintedBlock[]\n): AlignmentPair[] => {\n // Needleman–Wunsch style global alignment using anchor similarity and type equality\n const defaultLength = defaultBlocks.length;\n const secondaryLength = secondaryBlocks.length;\n\n const scoreMatrix: number[][] = Array.from(\n { length: defaultLength + 1 },\n () => Array.from({ length: secondaryLength + 1 }, () => 0)\n );\n const traceMatrix: ('diagonal' | 'up' | 'left')[][] = Array.from(\n { length: defaultLength + 1 },\n () => Array.from({ length: secondaryLength + 1 }, () => 'diagonal')\n );\n\n const gapPenalty = -2;\n\n const computeMatchScore = (\n defaultIndex: number,\n secondaryIndex: number\n ): number => {\n const defaultBlock = defaultBlocks[defaultIndex];\n const secondaryBlock = secondaryBlocks[secondaryIndex];\n const typeBonus = defaultBlock.type === secondaryBlock.type ? 2 : 0;\n const anchorSimilarity = computeJaccardSimilarity(\n defaultBlock.anchorText,\n secondaryBlock.anchorText,\n 3\n );\n const lengthRatio =\n Math.min(defaultBlock.content.length, secondaryBlock.content.length) /\n Math.max(defaultBlock.content.length, secondaryBlock.content.length);\n const lengthBonus = lengthRatio > 0.75 ? 1 : 0;\n return typeBonus + lengthBonus + anchorSimilarity * 8; // weighted toward anchor similarity\n };\n\n // initialize first row and column\n for (let i = 1; i <= defaultLength; i += 1) {\n scoreMatrix[i][0] = scoreMatrix[i - 1][0] + gapPenalty;\n traceMatrix[i][0] = 'up';\n }\n for (let j = 1; j <= secondaryLength; j += 1) {\n scoreMatrix[0][j] = scoreMatrix[0][j - 1] + gapPenalty;\n traceMatrix[0][j] = 'left';\n }\n\n // fill\n for (let i = 1; i <= defaultLength; i += 1) {\n for (let j = 1; j <= secondaryLength; j += 1) {\n const match = scoreMatrix[i - 1][j - 1] + computeMatchScore(i - 1, j - 1);\n const deleteGap = scoreMatrix[i - 1][j] + gapPenalty;\n const insertGap = scoreMatrix[i][j - 1] + gapPenalty;\n\n const best = Math.max(match, deleteGap, insertGap);\n scoreMatrix[i][j] = best;\n traceMatrix[i][j] =\n best === match ? 'diagonal' : best === deleteGap ? 'up' : 'left';\n }\n }\n\n // traceback\n const result: AlignmentPair[] = [];\n let i = defaultLength;\n let j = secondaryLength;\n while (i > 0 || j > 0) {\n if (i > 0 && j > 0 && traceMatrix[i][j] === 'diagonal') {\n const englishIndex = i - 1;\n const frenchIndex = j - 1;\n const similarityScore = computeJaccardSimilarity(\n defaultBlocks[englishIndex].anchorText,\n secondaryBlocks[frenchIndex].anchorText,\n 3\n );\n result.unshift({ englishIndex, frenchIndex, similarityScore });\n i -= 1;\n j -= 1;\n } else if (i > 0 && (j === 0 || traceMatrix[i][j] === 'up')) {\n result.unshift({\n englishIndex: i - 1,\n frenchIndex: null,\n similarityScore: 0,\n });\n i -= 1;\n } else if (j > 0 && (i === 0 || traceMatrix[i][j] === 'left')) {\n // french block has no corresponding english block (deleted)\n result.unshift({\n englishIndex: -1,\n frenchIndex: j - 1,\n similarityScore: 0,\n });\n j -= 1;\n }\n }\n return result;\n};\n"],"mappings":";;;;AAGA,MAAa,+BACX,eACA,oBACoB;CAEpB,MAAM,gBAAgB,cAAc;CACpC,MAAM,kBAAkB,gBAAgB;CAExC,MAAM,cAA0B,MAAM,KACpC,EAAE,QAAQ,gBAAgB,GAAG,QACvB,MAAM,KAAK,EAAE,QAAQ,kBAAkB,GAAG,QAAQ,EAAE,CAC3D;CACD,MAAM,cAAgD,MAAM,KAC1D,EAAE,QAAQ,gBAAgB,GAAG,QACvB,MAAM,KAAK,EAAE,QAAQ,kBAAkB,GAAG,QAAQ,WAAW,CACpE;CAED,MAAM,aAAa;CAEnB,MAAM,qBACJ,cACA,mBACW;EACX,MAAM,eAAe,cAAc;EACnC,MAAM,iBAAiB,gBAAgB;EACvC,MAAM,YAAY,aAAa,SAAS,eAAe,OAAO,IAAI;EAClE,MAAM,mBAAmBA,yEACvB,aAAa,YACb,eAAe,YACf,EACD;AAKD,SAAO,aAHL,KAAK,IAAI,aAAa,QAAQ,QAAQ,eAAe,QAAQ,OAAO,GACpE,KAAK,IAAI,aAAa,QAAQ,QAAQ,eAAe,QAAQ,OAAO,GACpC,MAAO,IAAI,KACZ,mBAAmB;;AAItD,MAAK,IAAI,IAAI,GAAG,KAAK,eAAe,KAAK,GAAG;AAC1C,cAAY,GAAG,KAAK,YAAY,IAAI,GAAG,KAAK;AAC5C,cAAY,GAAG,KAAK;;AAEtB,MAAK,IAAI,IAAI,GAAG,KAAK,iBAAiB,KAAK,GAAG;AAC5C,cAAY,GAAG,KAAK,YAAY,GAAG,IAAI,KAAK;AAC5C,cAAY,GAAG,KAAK;;AAItB,MAAK,IAAI,IAAI,GAAG,KAAK,eAAe,KAAK,EACvC,MAAK,IAAI,IAAI,GAAG,KAAK,iBAAiB,KAAK,GAAG;EAC5C,MAAM,QAAQ,YAAY,IAAI,GAAG,IAAI,KAAK,kBAAkB,IAAI,GAAG,IAAI,EAAE;EACzE,MAAM,YAAY,YAAY,IAAI,GAAG,KAAK;EAC1C,MAAM,YAAY,YAAY,GAAG,IAAI,KAAK;EAE1C,MAAM,OAAO,KAAK,IAAI,OAAO,WAAW,UAAU;AAClD,cAAY,GAAG,KAAK;AACpB,cAAY,GAAG,KACb,SAAS,QAAQ,aAAa,SAAS,YAAY,OAAO;;CAKhE,MAAM,SAA0B,EAAE;CAClC,IAAI,IAAI;CACR,IAAI,IAAI;AACR,QAAO,IAAI,KAAK,IAAI,EAClB,KAAI,IAAI,KAAK,IAAI,KAAK,YAAY,GAAG,OAAO,YAAY;EACtD,MAAM,eAAe,IAAI;EACzB,MAAM,cAAc,IAAI;EACxB,MAAM,kBAAkBA,yEACtB,cAAc,cAAc,YAC5B,gBAAgB,aAAa,YAC7B,EACD;AACD,SAAO,QAAQ;GAAE;GAAc;GAAa;GAAiB,CAAC;AAC9D,OAAK;AACL,OAAK;YACI,IAAI,MAAM,MAAM,KAAK,YAAY,GAAG,OAAO,OAAO;AAC3D,SAAO,QAAQ;GACb,cAAc,IAAI;GAClB,aAAa;GACb,iBAAiB;GAClB,CAAC;AACF,OAAK;YACI,IAAI,MAAM,MAAM,KAAK,YAAY,GAAG,OAAO,SAAS;AAE7D,SAAO,QAAQ;GACb,cAAc;GACd,aAAa,IAAI;GACjB,iBAAiB;GAClB,CAAC;AACF,OAAK;;AAGT,QAAO"}
@@ -1,2 +1,26 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=(e,t)=>{let n=e.replace(/\s+/g,` `).trim(),r=new Set;if(n.length<t)return n.length>0&&r.add(n),r;for(let e=0;e<=n.length-t;e+=1)r.add(n.slice(e,e+t));return r},t=(t,n,r=3)=>{let i=e(t,r),a=e(n,r);if(i.size===0&&a.size===0)return 1;let o=Array.from(i).filter(e=>a.has(e)).length,s=new Set([...Array.from(i),...Array.from(a)]).size;return s===0?0:o/s};exports.computeJaccardSimilarity=t,exports.generateCharacterShingles=e;
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
+
3
+ //#region src/translation-alignment/computeSimilarity.ts
4
+ const generateCharacterShingles = (text, shingleLength) => {
5
+ const normalized = text.replace(/\s+/g, " ").trim();
6
+ const set = /* @__PURE__ */ new Set();
7
+ if (normalized.length < shingleLength) {
8
+ if (normalized.length > 0) set.add(normalized);
9
+ return set;
10
+ }
11
+ for (let index = 0; index <= normalized.length - shingleLength; index += 1) set.add(normalized.slice(index, index + shingleLength));
12
+ return set;
13
+ };
14
+ const computeJaccardSimilarity = (a, b, shingleLength = 3) => {
15
+ const setA = generateCharacterShingles(a, shingleLength);
16
+ const setB = generateCharacterShingles(b, shingleLength);
17
+ if (setA.size === 0 && setB.size === 0) return 1;
18
+ const intersectionSize = Array.from(setA).filter((token) => setB.has(token)).length;
19
+ const unionSize = new Set([...Array.from(setA), ...Array.from(setB)]).size;
20
+ return unionSize === 0 ? 0 : intersectionSize / unionSize;
21
+ };
22
+
23
+ //#endregion
24
+ exports.computeJaccardSimilarity = computeJaccardSimilarity;
25
+ exports.generateCharacterShingles = generateCharacterShingles;
2
26
  //# sourceMappingURL=computeSimilarity.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"computeSimilarity.cjs","names":[],"sources":["../../../src/translation-alignment/computeSimilarity.ts"],"sourcesContent":["// Character shingle Jaccard similarity (language agnostic)\nexport const generateCharacterShingles = (\n text: string,\n shingleLength: number\n): Set<string> => {\n const normalized = text.replace(/\\s+/g, ' ').trim();\n const set = new Set<string>();\n if (normalized.length < shingleLength) {\n if (normalized.length > 0) {\n set.add(normalized);\n }\n return set;\n }\n for (let index = 0; index <= normalized.length - shingleLength; index += 1) {\n set.add(normalized.slice(index, index + shingleLength));\n }\n return set;\n};\n\nexport const computeJaccardSimilarity = (\n a: string,\n b: string,\n shingleLength: number = 3\n): number => {\n const setA = generateCharacterShingles(a, shingleLength);\n const setB = generateCharacterShingles(b, shingleLength);\n if (setA.size === 0 && setB.size === 0) return 1;\n const intersectionSize = Array.from(setA).filter((token) =>\n setB.has(token)\n ).length;\n const unionSize = new Set([...Array.from(setA), ...Array.from(setB)]).size;\n return unionSize === 0 ? 0 : intersectionSize / unionSize;\n};\n"],"mappings":"mEACA,MAAa,GACX,EACA,IACgB,CAChB,IAAM,EAAa,EAAK,QAAQ,OAAQ,IAAI,CAAC,MAAM,CAC7C,EAAM,IAAI,IAChB,GAAI,EAAW,OAAS,EAItB,OAHI,EAAW,OAAS,GACtB,EAAI,IAAI,EAAW,CAEd,EAET,IAAK,IAAI,EAAQ,EAAG,GAAS,EAAW,OAAS,EAAe,GAAS,EACvE,EAAI,IAAI,EAAW,MAAM,EAAO,EAAQ,EAAc,CAAC,CAEzD,OAAO,GAGI,GACX,EACA,EACA,EAAwB,IACb,CACX,IAAM,EAAO,EAA0B,EAAG,EAAc,CAClD,EAAO,EAA0B,EAAG,EAAc,CACxD,GAAI,EAAK,OAAS,GAAK,EAAK,OAAS,EAAG,MAAO,GAC/C,IAAM,EAAmB,MAAM,KAAK,EAAK,CAAC,OAAQ,GAChD,EAAK,IAAI,EAAM,CAChB,CAAC,OACI,EAAY,IAAI,IAAI,CAAC,GAAG,MAAM,KAAK,EAAK,CAAE,GAAG,MAAM,KAAK,EAAK,CAAC,CAAC,CAAC,KACtE,OAAO,IAAc,EAAI,EAAI,EAAmB"}
1
+ {"version":3,"file":"computeSimilarity.cjs","names":[],"sources":["../../../src/translation-alignment/computeSimilarity.ts"],"sourcesContent":["// Character shingle Jaccard similarity (language agnostic)\nexport const generateCharacterShingles = (\n text: string,\n shingleLength: number\n): Set<string> => {\n const normalized = text.replace(/\\s+/g, ' ').trim();\n const set = new Set<string>();\n if (normalized.length < shingleLength) {\n if (normalized.length > 0) {\n set.add(normalized);\n }\n return set;\n }\n for (let index = 0; index <= normalized.length - shingleLength; index += 1) {\n set.add(normalized.slice(index, index + shingleLength));\n }\n return set;\n};\n\nexport const computeJaccardSimilarity = (\n a: string,\n b: string,\n shingleLength: number = 3\n): number => {\n const setA = generateCharacterShingles(a, shingleLength);\n const setB = generateCharacterShingles(b, shingleLength);\n if (setA.size === 0 && setB.size === 0) return 1;\n const intersectionSize = Array.from(setA).filter((token) =>\n setB.has(token)\n ).length;\n const unionSize = new Set([...Array.from(setA), ...Array.from(setB)]).size;\n return unionSize === 0 ? 0 : intersectionSize / unionSize;\n};\n"],"mappings":";;;AACA,MAAa,6BACX,MACA,kBACgB;CAChB,MAAM,aAAa,KAAK,QAAQ,QAAQ,IAAI,CAAC,MAAM;CACnD,MAAM,sBAAM,IAAI,KAAa;AAC7B,KAAI,WAAW,SAAS,eAAe;AACrC,MAAI,WAAW,SAAS,EACtB,KAAI,IAAI,WAAW;AAErB,SAAO;;AAET,MAAK,IAAI,QAAQ,GAAG,SAAS,WAAW,SAAS,eAAe,SAAS,EACvE,KAAI,IAAI,WAAW,MAAM,OAAO,QAAQ,cAAc,CAAC;AAEzD,QAAO;;AAGT,MAAa,4BACX,GACA,GACA,gBAAwB,MACb;CACX,MAAM,OAAO,0BAA0B,GAAG,cAAc;CACxD,MAAM,OAAO,0BAA0B,GAAG,cAAc;AACxD,KAAI,KAAK,SAAS,KAAK,KAAK,SAAS,EAAG,QAAO;CAC/C,MAAM,mBAAmB,MAAM,KAAK,KAAK,CAAC,QAAQ,UAChD,KAAK,IAAI,MAAM,CAChB,CAAC;CACF,MAAM,YAAY,IAAI,IAAI,CAAC,GAAG,MAAM,KAAK,KAAK,EAAE,GAAG,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC;AACtE,QAAO,cAAc,IAAI,IAAI,mBAAmB"}
@@ -1,2 +1,24 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../chunk-Bmb41Sf3.cjs`);let t=require(`node:crypto`);t=e.t(t);const n=e=>t.default.createHash(`sha256`).update(e).digest(`hex`),r=(e,t,r)=>{let i=n(e.semanticText),a=n(e.anchorText),o=`${i}:${a}`,s=n(`${n(t?.semanticText??``)}:${n(r?.semanticText??``)}`);return{...e,semanticDigest:i,anchorDigest:a,compositeKey:o,contextKey:s}};exports.fingerprintBlock=r;
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
+ const require_runtime = require('../_virtual/_rolldown/runtime.cjs');
3
+ let node_crypto = require("node:crypto");
4
+ node_crypto = require_runtime.__toESM(node_crypto);
5
+
6
+ //#region src/translation-alignment/fingerprintBlock.ts
7
+ const computeStringDigest = (text) => node_crypto.default.createHash("sha256").update(text).digest("hex");
8
+ const fingerprintBlock = (block, previousBlock, nextBlock) => {
9
+ const semanticDigest = computeStringDigest(block.semanticText);
10
+ const anchorDigest = computeStringDigest(block.anchorText);
11
+ const compositeKey = `${semanticDigest}:${anchorDigest}`;
12
+ const contextKey = computeStringDigest(`${computeStringDigest(previousBlock?.semanticText ?? "")}:${computeStringDigest(nextBlock?.semanticText ?? "")}`);
13
+ return {
14
+ ...block,
15
+ semanticDigest,
16
+ anchorDigest,
17
+ compositeKey,
18
+ contextKey
19
+ };
20
+ };
21
+
22
+ //#endregion
23
+ exports.fingerprintBlock = fingerprintBlock;
2
24
  //# sourceMappingURL=fingerprintBlock.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"fingerprintBlock.cjs","names":["crypto"],"sources":["../../../src/translation-alignment/fingerprintBlock.ts"],"sourcesContent":["import crypto from 'node:crypto';\nimport type { FingerprintedBlock, NormalizedBlock } from './types';\n\nconst computeStringDigest = (text: string): string =>\n crypto.createHash('sha256').update(text).digest('hex');\n\nexport const fingerprintBlock = (\n block: NormalizedBlock,\n previousBlock: NormalizedBlock | null,\n nextBlock: NormalizedBlock | null\n): FingerprintedBlock => {\n const semanticDigest = computeStringDigest(block.semanticText);\n const anchorDigest = computeStringDigest(block.anchorText);\n const compositeKey = `${semanticDigest}:${anchorDigest}`;\n\n const previousDigest = computeStringDigest(previousBlock?.semanticText ?? '');\n const nextDigest = computeStringDigest(nextBlock?.semanticText ?? '');\n const contextKey = computeStringDigest(`${previousDigest}:${nextDigest}`);\n\n return {\n ...block,\n semanticDigest,\n anchorDigest,\n compositeKey,\n contextKey,\n };\n};\n"],"mappings":"kJAGA,MAAM,EAAuB,GAC3BA,EAAAA,QAAO,WAAW,SAAS,CAAC,OAAO,EAAK,CAAC,OAAO,MAAM,CAE3C,GACX,EACA,EACA,IACuB,CACvB,IAAM,EAAiB,EAAoB,EAAM,aAAa,CACxD,EAAe,EAAoB,EAAM,WAAW,CACpD,EAAe,GAAG,EAAe,GAAG,IAIpC,EAAa,EAAoB,GAFhB,EAAoB,GAAe,cAAgB,GAAG,CAEpB,GADtC,EAAoB,GAAW,cAAgB,GAAG,GACI,CAEzE,MAAO,CACL,GAAG,EACH,iBACA,eACA,eACA,aACD"}
1
+ {"version":3,"file":"fingerprintBlock.cjs","names":["crypto"],"sources":["../../../src/translation-alignment/fingerprintBlock.ts"],"sourcesContent":["import crypto from 'node:crypto';\nimport type { FingerprintedBlock, NormalizedBlock } from './types';\n\nconst computeStringDigest = (text: string): string =>\n crypto.createHash('sha256').update(text).digest('hex');\n\nexport const fingerprintBlock = (\n block: NormalizedBlock,\n previousBlock: NormalizedBlock | null,\n nextBlock: NormalizedBlock | null\n): FingerprintedBlock => {\n const semanticDigest = computeStringDigest(block.semanticText);\n const anchorDigest = computeStringDigest(block.anchorText);\n const compositeKey = `${semanticDigest}:${anchorDigest}`;\n\n const previousDigest = computeStringDigest(previousBlock?.semanticText ?? '');\n const nextDigest = computeStringDigest(nextBlock?.semanticText ?? '');\n const contextKey = computeStringDigest(`${previousDigest}:${nextDigest}`);\n\n return {\n ...block,\n semanticDigest,\n anchorDigest,\n compositeKey,\n contextKey,\n };\n};\n"],"mappings":";;;;;;AAGA,MAAM,uBAAuB,SAC3BA,oBAAO,WAAW,SAAS,CAAC,OAAO,KAAK,CAAC,OAAO,MAAM;AAExD,MAAa,oBACX,OACA,eACA,cACuB;CACvB,MAAM,iBAAiB,oBAAoB,MAAM,aAAa;CAC9D,MAAM,eAAe,oBAAoB,MAAM,WAAW;CAC1D,MAAM,eAAe,GAAG,eAAe,GAAG;CAI1C,MAAM,aAAa,oBAAoB,GAFhB,oBAAoB,eAAe,gBAAgB,GAAG,CAEpB,GADtC,oBAAoB,WAAW,gBAAgB,GAAG,GACI;AAEzE,QAAO;EACL,GAAG;EACH;EACA;EACA;EACA;EACD"}
@@ -1 +1,22 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./computeSimilarity.cjs`),t=require(`./alignBlocks.cjs`),n=require(`./fingerprintBlock.cjs`),r=require(`./mapChangedLinesToBlocks.cjs`),i=require(`./normalizeBlock.cjs`),a=require(`./planActions.cjs`),o=require(`./rebuildDocument.cjs`),s=require(`./segmentDocument.cjs`),c=require(`./pipeline.cjs`);exports.alignEnglishAndFrenchBlocks=t.alignEnglishAndFrenchBlocks,exports.buildAlignmentPlan=c.buildAlignmentPlan,exports.computeJaccardSimilarity=e.computeJaccardSimilarity,exports.fingerprintBlock=n.fingerprintBlock,exports.generateCharacterShingles=e.generateCharacterShingles,exports.identifySegmentsToReview=o.identifySegmentsToReview,exports.mapChangedLinesToBlocks=r.mapChangedLinesToBlocks,exports.mergeReviewedSegments=o.mergeReviewedSegments,exports.normalizeBlock=i.normalizeBlock,exports.planAlignmentActions=a.planAlignmentActions,exports.segmentDocument=s.segmentDocument;
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
+ const require_translation_alignment_computeSimilarity = require('./computeSimilarity.cjs');
3
+ const require_translation_alignment_alignBlocks = require('./alignBlocks.cjs');
4
+ const require_translation_alignment_fingerprintBlock = require('./fingerprintBlock.cjs');
5
+ const require_translation_alignment_mapChangedLinesToBlocks = require('./mapChangedLinesToBlocks.cjs');
6
+ const require_translation_alignment_normalizeBlock = require('./normalizeBlock.cjs');
7
+ const require_translation_alignment_planActions = require('./planActions.cjs');
8
+ const require_translation_alignment_rebuildDocument = require('./rebuildDocument.cjs');
9
+ const require_translation_alignment_segmentDocument = require('./segmentDocument.cjs');
10
+ const require_translation_alignment_pipeline = require('./pipeline.cjs');
11
+
12
+ exports.alignEnglishAndFrenchBlocks = require_translation_alignment_alignBlocks.alignEnglishAndFrenchBlocks;
13
+ exports.buildAlignmentPlan = require_translation_alignment_pipeline.buildAlignmentPlan;
14
+ exports.computeJaccardSimilarity = require_translation_alignment_computeSimilarity.computeJaccardSimilarity;
15
+ exports.fingerprintBlock = require_translation_alignment_fingerprintBlock.fingerprintBlock;
16
+ exports.generateCharacterShingles = require_translation_alignment_computeSimilarity.generateCharacterShingles;
17
+ exports.identifySegmentsToReview = require_translation_alignment_rebuildDocument.identifySegmentsToReview;
18
+ exports.mapChangedLinesToBlocks = require_translation_alignment_mapChangedLinesToBlocks.mapChangedLinesToBlocks;
19
+ exports.mergeReviewedSegments = require_translation_alignment_rebuildDocument.mergeReviewedSegments;
20
+ exports.normalizeBlock = require_translation_alignment_normalizeBlock.normalizeBlock;
21
+ exports.planAlignmentActions = require_translation_alignment_planActions.planAlignmentActions;
22
+ exports.segmentDocument = require_translation_alignment_segmentDocument.segmentDocument;
@@ -1,2 +1,19 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=(e,t)=>{let n=new Set;if(!t||t.length===0)return n;let r=new Set(t);return e.forEach((e,t)=>{for(let i=e.lineStart;i<=e.lineEnd;i+=1)if(r.has(i)){n.add(t);break}}),n};exports.mapChangedLinesToBlocks=e;
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
+
3
+ //#region src/translation-alignment/mapChangedLinesToBlocks.ts
4
+ const mapChangedLinesToBlocks = (blocks, changedLines) => {
5
+ const changedSet = /* @__PURE__ */ new Set();
6
+ if (!changedLines || changedLines.length === 0) return changedSet;
7
+ const changedLookup = new Set(changedLines);
8
+ blocks.forEach((block, index) => {
9
+ for (let line = block.lineStart; line <= block.lineEnd; line += 1) if (changedLookup.has(line)) {
10
+ changedSet.add(index);
11
+ break;
12
+ }
13
+ });
14
+ return changedSet;
15
+ };
16
+
17
+ //#endregion
18
+ exports.mapChangedLinesToBlocks = mapChangedLinesToBlocks;
2
19
  //# sourceMappingURL=mapChangedLinesToBlocks.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"mapChangedLinesToBlocks.cjs","names":[],"sources":["../../../src/translation-alignment/mapChangedLinesToBlocks.ts"],"sourcesContent":["import type { Block, LineChange } from './types';\n\nexport const mapChangedLinesToBlocks = (\n blocks: Block[],\n changedLines: LineChange[]\n): Set<number> => {\n const changedSet = new Set<number>();\n if (!changedLines || changedLines.length === 0) return changedSet;\n\n const changedLookup = new Set<number>(changedLines);\n\n blocks.forEach((block, index) => {\n for (let line = block.lineStart; line <= block.lineEnd; line += 1) {\n if (changedLookup.has(line)) {\n changedSet.add(index);\n break;\n }\n }\n });\n\n return changedSet;\n};\n"],"mappings":"mEAEA,MAAa,GACX,EACA,IACgB,CAChB,IAAM,EAAa,IAAI,IACvB,GAAI,CAAC,GAAgB,EAAa,SAAW,EAAG,OAAO,EAEvD,IAAM,EAAgB,IAAI,IAAY,EAAa,CAWnD,OATA,EAAO,SAAS,EAAO,IAAU,CAC/B,IAAK,IAAI,EAAO,EAAM,UAAW,GAAQ,EAAM,QAAS,GAAQ,EAC9D,GAAI,EAAc,IAAI,EAAK,CAAE,CAC3B,EAAW,IAAI,EAAM,CACrB,QAGJ,CAEK"}
1
+ {"version":3,"file":"mapChangedLinesToBlocks.cjs","names":[],"sources":["../../../src/translation-alignment/mapChangedLinesToBlocks.ts"],"sourcesContent":["import type { Block, LineChange } from './types';\n\nexport const mapChangedLinesToBlocks = (\n blocks: Block[],\n changedLines: LineChange[]\n): Set<number> => {\n const changedSet = new Set<number>();\n if (!changedLines || changedLines.length === 0) return changedSet;\n\n const changedLookup = new Set<number>(changedLines);\n\n blocks.forEach((block, index) => {\n for (let line = block.lineStart; line <= block.lineEnd; line += 1) {\n if (changedLookup.has(line)) {\n changedSet.add(index);\n break;\n }\n }\n });\n\n return changedSet;\n};\n"],"mappings":";;;AAEA,MAAa,2BACX,QACA,iBACgB;CAChB,MAAM,6BAAa,IAAI,KAAa;AACpC,KAAI,CAAC,gBAAgB,aAAa,WAAW,EAAG,QAAO;CAEvD,MAAM,gBAAgB,IAAI,IAAY,aAAa;AAEnD,QAAO,SAAS,OAAO,UAAU;AAC/B,OAAK,IAAI,OAAO,MAAM,WAAW,QAAQ,MAAM,SAAS,QAAQ,EAC9D,KAAI,cAAc,IAAI,KAAK,EAAE;AAC3B,cAAW,IAAI,MAAM;AACrB;;GAGJ;AAEF,QAAO"}
@@ -1,2 +1,23 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=e=>e.replace(/`{1,3}[^`]*`{1,3}/g,` `).replace(/\*\*([^*]+)\*\*/g,`$1`).replace(/\*([^*]+)\*/g,`$1`).replace(/_([^_]+)_/g,`$1`).replace(/~~([^~]+)~~/g,`$1`).replace(/!?\[[^\]]*\]\([^)]*\)/g,` `).replace(/^\s*#{1,6}\s+/gm,``).replace(/^\s*>\s?/gm,``).replace(/^\s*[-*+]\s+/gm,``).replace(/^\s*\d+\.\s+/gm,``),t=e=>e.replace(/\s+/g,` `).trim(),n=e=>e.replace(/\p{L}+/gu,``),r=r=>{let i=t(e(r.content).toLowerCase()),a=t(n(r.content));return{...r,semanticText:i,anchorText:a}};exports.normalizeBlock=r;
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
+
3
+ //#region src/translation-alignment/normalizeBlock.ts
4
+ const removeMarkdownFormatting = (text) => {
5
+ return text.replace(/`{1,3}[^`]*`{1,3}/g, " ").replace(/\*\*([^*]+)\*\*/g, "$1").replace(/\*([^*]+)\*/g, "$1").replace(/_([^_]+)_/g, "$1").replace(/~~([^~]+)~~/g, "$1").replace(/!?\[[^\]]*\]\([^)]*\)/g, " ").replace(/^\s*#{1,6}\s+/gm, "").replace(/^\s*>\s?/gm, "").replace(/^\s*[-*+]\s+/gm, "").replace(/^\s*\d+\.\s+/gm, "");
6
+ };
7
+ const collapseWhitespace = (text) => text.replace(/\s+/g, " ").trim();
8
+ const stripLettersKeepDigitsAndSymbols = (text) => {
9
+ return text.replace(/\p{L}+/gu, "");
10
+ };
11
+ const normalizeBlock = (block) => {
12
+ const semanticCollapsed = collapseWhitespace(removeMarkdownFormatting(block.content).toLowerCase());
13
+ const anchorCollapsed = collapseWhitespace(stripLettersKeepDigitsAndSymbols(block.content));
14
+ return {
15
+ ...block,
16
+ semanticText: semanticCollapsed,
17
+ anchorText: anchorCollapsed
18
+ };
19
+ };
20
+
21
+ //#endregion
22
+ exports.normalizeBlock = normalizeBlock;
2
23
  //# sourceMappingURL=normalizeBlock.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"normalizeBlock.cjs","names":[],"sources":["../../../src/translation-alignment/normalizeBlock.ts"],"sourcesContent":["import type { Block, NormalizedBlock } from './types';\n\nconst removeMarkdownFormatting = (text: string): string => {\n return text\n .replace(/`{1,3}[^`]*`{1,3}/g, ' ')\n .replace(/\\*\\*([^*]+)\\*\\*/g, '$1')\n .replace(/\\*([^*]+)\\*/g, '$1')\n .replace(/_([^_]+)_/g, '$1')\n .replace(/~~([^~]+)~~/g, '$1')\n .replace(/!?\\[[^\\]]*\\]\\([^)]*\\)/g, ' ')\n .replace(/^\\s*#{1,6}\\s+/gm, '')\n .replace(/^\\s*>\\s?/gm, '')\n .replace(/^\\s*[-*+]\\s+/gm, '')\n .replace(/^\\s*\\d+\\.\\s+/gm, '');\n};\n\nconst collapseWhitespace = (text: string): string =>\n text.replace(/\\s+/g, ' ').trim();\n\nconst stripLettersKeepDigitsAndSymbols = (text: string): string => {\n // Keep digits and non-letter characters, remove all letters (including accents)\n return text.replace(/\\p{L}+/gu, '');\n};\n\nexport const normalizeBlock = (block: Block): NormalizedBlock => {\n const contentWithoutMarkdown = removeMarkdownFormatting(block.content);\n const semanticLowercased = contentWithoutMarkdown.toLowerCase();\n const semanticCollapsed = collapseWhitespace(semanticLowercased);\n\n const anchorOnlySymbols = stripLettersKeepDigitsAndSymbols(block.content);\n const anchorCollapsed = collapseWhitespace(anchorOnlySymbols);\n\n return {\n ...block,\n semanticText: semanticCollapsed,\n anchorText: anchorCollapsed,\n };\n};\n"],"mappings":"mEAEA,MAAM,EAA4B,GACzB,EACJ,QAAQ,qBAAsB,IAAI,CAClC,QAAQ,mBAAoB,KAAK,CACjC,QAAQ,eAAgB,KAAK,CAC7B,QAAQ,aAAc,KAAK,CAC3B,QAAQ,eAAgB,KAAK,CAC7B,QAAQ,yBAA0B,IAAI,CACtC,QAAQ,kBAAmB,GAAG,CAC9B,QAAQ,aAAc,GAAG,CACzB,QAAQ,iBAAkB,GAAG,CAC7B,QAAQ,iBAAkB,GAAG,CAG5B,EAAsB,GAC1B,EAAK,QAAQ,OAAQ,IAAI,CAAC,MAAM,CAE5B,EAAoC,GAEjC,EAAK,QAAQ,WAAY,GAAG,CAGxB,EAAkB,GAAkC,CAG/D,IAAM,EAAoB,EAFK,EAAyB,EAAM,QAAQ,CACpB,aAAa,CACC,CAG1D,EAAkB,EADE,EAAiC,EAAM,QAAQ,CACZ,CAE7D,MAAO,CACL,GAAG,EACH,aAAc,EACd,WAAY,EACb"}
1
+ {"version":3,"file":"normalizeBlock.cjs","names":[],"sources":["../../../src/translation-alignment/normalizeBlock.ts"],"sourcesContent":["import type { Block, NormalizedBlock } from './types';\n\nconst removeMarkdownFormatting = (text: string): string => {\n return text\n .replace(/`{1,3}[^`]*`{1,3}/g, ' ')\n .replace(/\\*\\*([^*]+)\\*\\*/g, '$1')\n .replace(/\\*([^*]+)\\*/g, '$1')\n .replace(/_([^_]+)_/g, '$1')\n .replace(/~~([^~]+)~~/g, '$1')\n .replace(/!?\\[[^\\]]*\\]\\([^)]*\\)/g, ' ')\n .replace(/^\\s*#{1,6}\\s+/gm, '')\n .replace(/^\\s*>\\s?/gm, '')\n .replace(/^\\s*[-*+]\\s+/gm, '')\n .replace(/^\\s*\\d+\\.\\s+/gm, '');\n};\n\nconst collapseWhitespace = (text: string): string =>\n text.replace(/\\s+/g, ' ').trim();\n\nconst stripLettersKeepDigitsAndSymbols = (text: string): string => {\n // Keep digits and non-letter characters, remove all letters (including accents)\n return text.replace(/\\p{L}+/gu, '');\n};\n\nexport const normalizeBlock = (block: Block): NormalizedBlock => {\n const contentWithoutMarkdown = removeMarkdownFormatting(block.content);\n const semanticLowercased = contentWithoutMarkdown.toLowerCase();\n const semanticCollapsed = collapseWhitespace(semanticLowercased);\n\n const anchorOnlySymbols = stripLettersKeepDigitsAndSymbols(block.content);\n const anchorCollapsed = collapseWhitespace(anchorOnlySymbols);\n\n return {\n ...block,\n semanticText: semanticCollapsed,\n anchorText: anchorCollapsed,\n };\n};\n"],"mappings":";;;AAEA,MAAM,4BAA4B,SAAyB;AACzD,QAAO,KACJ,QAAQ,sBAAsB,IAAI,CAClC,QAAQ,oBAAoB,KAAK,CACjC,QAAQ,gBAAgB,KAAK,CAC7B,QAAQ,cAAc,KAAK,CAC3B,QAAQ,gBAAgB,KAAK,CAC7B,QAAQ,0BAA0B,IAAI,CACtC,QAAQ,mBAAmB,GAAG,CAC9B,QAAQ,cAAc,GAAG,CACzB,QAAQ,kBAAkB,GAAG,CAC7B,QAAQ,kBAAkB,GAAG;;AAGlC,MAAM,sBAAsB,SAC1B,KAAK,QAAQ,QAAQ,IAAI,CAAC,MAAM;AAElC,MAAM,oCAAoC,SAAyB;AAEjE,QAAO,KAAK,QAAQ,YAAY,GAAG;;AAGrC,MAAa,kBAAkB,UAAkC;CAG/D,MAAM,oBAAoB,mBAFK,yBAAyB,MAAM,QAAQ,CACpB,aAAa,CACC;CAGhE,MAAM,kBAAkB,mBADE,iCAAiC,MAAM,QAAQ,CACZ;AAE7D,QAAO;EACL,GAAG;EACH,cAAc;EACd,YAAY;EACb"}
@@ -1,2 +1,38 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./alignBlocks.cjs`),t=require(`./fingerprintBlock.cjs`),n=require(`./mapChangedLinesToBlocks.cjs`),r=require(`./normalizeBlock.cjs`),i=require(`./planActions.cjs`),a=require(`./rebuildDocument.cjs`),o=require(`./segmentDocument.cjs`),s=({englishText:s,frenchText:c,changedLines:l,similarityOptions:u})=>{let d=o.segmentDocument(s),f=o.segmentDocument(c),p=d.map(r.normalizeBlock),m=f.map(r.normalizeBlock),h=p.map((e,n,r)=>t.fingerprintBlock(e,r[n-1]??null,r[n+1]??null)),g=m.map((e,n,r)=>t.fingerprintBlock(e,r[n-1]??null,r[n+1]??null)),_=i.planAlignmentActions(e.alignEnglishAndFrenchBlocks(h,g),n.mapChangedLinesToBlocks(h,Array.isArray(l)?l:[]),{minimumMatchForReuse:u?.minimumMatchForReuse??.9,minimumMatchForNearDuplicate:u?.minimumMatchForNearDuplicate??.8}),{segmentsToReview:v}=a.identifySegmentsToReview({englishBlocks:h,frenchBlocks:g,plan:_});return{englishBlocks:h,frenchBlocks:g,plan:_,segmentsToReview:v}};exports.buildAlignmentPlan=s,exports.mergeReviewedSegments=a.mergeReviewedSegments;
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
+ const require_translation_alignment_alignBlocks = require('./alignBlocks.cjs');
3
+ const require_translation_alignment_fingerprintBlock = require('./fingerprintBlock.cjs');
4
+ const require_translation_alignment_mapChangedLinesToBlocks = require('./mapChangedLinesToBlocks.cjs');
5
+ const require_translation_alignment_normalizeBlock = require('./normalizeBlock.cjs');
6
+ const require_translation_alignment_planActions = require('./planActions.cjs');
7
+ const require_translation_alignment_rebuildDocument = require('./rebuildDocument.cjs');
8
+ const require_translation_alignment_segmentDocument = require('./segmentDocument.cjs');
9
+
10
+ //#region src/translation-alignment/pipeline.ts
11
+ const buildAlignmentPlan = ({ englishText, frenchText, changedLines, similarityOptions }) => {
12
+ const englishBlocksRaw = require_translation_alignment_segmentDocument.segmentDocument(englishText);
13
+ const frenchBlocksRaw = require_translation_alignment_segmentDocument.segmentDocument(frenchText);
14
+ const englishNormalized = englishBlocksRaw.map(require_translation_alignment_normalizeBlock.normalizeBlock);
15
+ const frenchNormalized = frenchBlocksRaw.map(require_translation_alignment_normalizeBlock.normalizeBlock);
16
+ const englishBlocks = englishNormalized.map((block, index, array) => require_translation_alignment_fingerprintBlock.fingerprintBlock(block, array[index - 1] ?? null, array[index + 1] ?? null));
17
+ const frenchBlocks = frenchNormalized.map((block, index, array) => require_translation_alignment_fingerprintBlock.fingerprintBlock(block, array[index - 1] ?? null, array[index + 1] ?? null));
18
+ const plan = require_translation_alignment_planActions.planAlignmentActions(require_translation_alignment_alignBlocks.alignEnglishAndFrenchBlocks(englishBlocks, frenchBlocks), require_translation_alignment_mapChangedLinesToBlocks.mapChangedLinesToBlocks(englishBlocks, Array.isArray(changedLines) ? changedLines : []), {
19
+ minimumMatchForReuse: similarityOptions?.minimumMatchForReuse ?? .9,
20
+ minimumMatchForNearDuplicate: similarityOptions?.minimumMatchForNearDuplicate ?? .8
21
+ });
22
+ const { segmentsToReview } = require_translation_alignment_rebuildDocument.identifySegmentsToReview({
23
+ englishBlocks,
24
+ frenchBlocks,
25
+ plan
26
+ });
27
+ return {
28
+ englishBlocks,
29
+ frenchBlocks,
30
+ plan,
31
+ segmentsToReview
32
+ };
33
+ };
34
+
35
+ //#endregion
36
+ exports.buildAlignmentPlan = buildAlignmentPlan;
37
+ exports.mergeReviewedSegments = require_translation_alignment_rebuildDocument.mergeReviewedSegments;
2
38
  //# sourceMappingURL=pipeline.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"pipeline.cjs","names":["segmentDocument","normalizeBlock","fingerprintBlock","planAlignmentActions","alignEnglishAndFrenchBlocks","mapChangedLinesToBlocks","identifySegmentsToReview"],"sources":["../../../src/translation-alignment/pipeline.ts"],"sourcesContent":["import { alignEnglishAndFrenchBlocks } from './alignBlocks';\nimport { fingerprintBlock } from './fingerprintBlock';\nimport { mapChangedLinesToBlocks } from './mapChangedLinesToBlocks';\nimport { normalizeBlock } from './normalizeBlock';\nimport { planAlignmentActions } from './planActions';\nimport {\n identifySegmentsToReview,\n mergeReviewedSegments,\n type SegmentToReview,\n} from './rebuildDocument';\nimport { segmentDocument } from './segmentDocument';\nimport type {\n AlignmentPlan,\n FingerprintedBlock,\n SimilarityOptions,\n} from './types';\n\nexport type BuildAlignmentPlanInput = {\n englishText: string;\n frenchText: string;\n changedLines: number[] | undefined;\n similarityOptions?: Partial<SimilarityOptions>;\n};\n\nexport type BuildAlignmentPlanOutput = {\n englishBlocks: FingerprintedBlock[];\n frenchBlocks: FingerprintedBlock[];\n plan: AlignmentPlan;\n segmentsToReview: SegmentToReview[];\n};\n\nexport const buildAlignmentPlan = ({\n englishText,\n frenchText,\n changedLines,\n similarityOptions,\n}: BuildAlignmentPlanInput): BuildAlignmentPlanOutput => {\n const englishBlocksRaw = segmentDocument(englishText);\n const frenchBlocksRaw = segmentDocument(frenchText);\n\n const englishNormalized = englishBlocksRaw.map(normalizeBlock);\n const frenchNormalized = frenchBlocksRaw.map(normalizeBlock);\n\n const englishBlocks: FingerprintedBlock[] = englishNormalized.map(\n (block, index, array) =>\n fingerprintBlock(\n block,\n array[index - 1] ?? null,\n array[index + 1] ?? null\n )\n );\n const frenchBlocks: FingerprintedBlock[] = frenchNormalized.map(\n (block, index, array) =>\n fingerprintBlock(\n block,\n array[index - 1] ?? null,\n array[index + 1] ?? null\n )\n );\n\n const alignment = alignEnglishAndFrenchBlocks(englishBlocks, frenchBlocks);\n\n const changedIndexes = mapChangedLinesToBlocks(\n englishBlocks,\n Array.isArray(changedLines) ? changedLines : []\n );\n\n const plan = planAlignmentActions(alignment, changedIndexes, {\n minimumMatchForReuse: similarityOptions?.minimumMatchForReuse ?? 0.9,\n minimumMatchForNearDuplicate:\n similarityOptions?.minimumMatchForNearDuplicate ?? 0.8,\n });\n\n const { segmentsToReview } = identifySegmentsToReview({\n englishBlocks,\n frenchBlocks,\n plan,\n });\n\n return { englishBlocks, frenchBlocks, plan, segmentsToReview };\n};\n\nexport { mergeReviewedSegments };\nexport type { SegmentToReview };\n"],"mappings":"8TA+Ba,GAAsB,CACjC,cACA,aACA,eACA,uBACuD,CACvD,IAAM,EAAmBA,EAAAA,gBAAgB,EAAY,CAC/C,EAAkBA,EAAAA,gBAAgB,EAAW,CAE7C,EAAoB,EAAiB,IAAIC,EAAAA,eAAe,CACxD,EAAmB,EAAgB,IAAIA,EAAAA,eAAe,CAEtD,EAAsC,EAAkB,KAC3D,EAAO,EAAO,IACbC,EAAAA,iBACE,EACA,EAAM,EAAQ,IAAM,KACpB,EAAM,EAAQ,IAAM,KACrB,CACJ,CACK,EAAqC,EAAiB,KACzD,EAAO,EAAO,IACbA,EAAAA,iBACE,EACA,EAAM,EAAQ,IAAM,KACpB,EAAM,EAAQ,IAAM,KACrB,CACJ,CASK,EAAOC,EAAAA,qBAPKC,EAAAA,4BAA4B,EAAe,EAAa,CAEnDC,EAAAA,wBACrB,EACA,MAAM,QAAQ,EAAa,CAAG,EAAe,EAAE,CAChD,CAE4D,CAC3D,qBAAsB,GAAmB,sBAAwB,GACjE,6BACE,GAAmB,8BAAgC,GACtD,CAAC,CAEI,CAAE,oBAAqBC,EAAAA,yBAAyB,CACpD,gBACA,eACA,OACD,CAAC,CAEF,MAAO,CAAE,gBAAe,eAAc,OAAM,mBAAkB"}
1
+ {"version":3,"file":"pipeline.cjs","names":["segmentDocument","normalizeBlock","fingerprintBlock","planAlignmentActions","alignEnglishAndFrenchBlocks","mapChangedLinesToBlocks","identifySegmentsToReview"],"sources":["../../../src/translation-alignment/pipeline.ts"],"sourcesContent":["import { alignEnglishAndFrenchBlocks } from './alignBlocks';\nimport { fingerprintBlock } from './fingerprintBlock';\nimport { mapChangedLinesToBlocks } from './mapChangedLinesToBlocks';\nimport { normalizeBlock } from './normalizeBlock';\nimport { planAlignmentActions } from './planActions';\nimport {\n identifySegmentsToReview,\n mergeReviewedSegments,\n type SegmentToReview,\n} from './rebuildDocument';\nimport { segmentDocument } from './segmentDocument';\nimport type {\n AlignmentPlan,\n FingerprintedBlock,\n SimilarityOptions,\n} from './types';\n\nexport type BuildAlignmentPlanInput = {\n englishText: string;\n frenchText: string;\n changedLines: number[] | undefined;\n similarityOptions?: Partial<SimilarityOptions>;\n};\n\nexport type BuildAlignmentPlanOutput = {\n englishBlocks: FingerprintedBlock[];\n frenchBlocks: FingerprintedBlock[];\n plan: AlignmentPlan;\n segmentsToReview: SegmentToReview[];\n};\n\nexport const buildAlignmentPlan = ({\n englishText,\n frenchText,\n changedLines,\n similarityOptions,\n}: BuildAlignmentPlanInput): BuildAlignmentPlanOutput => {\n const englishBlocksRaw = segmentDocument(englishText);\n const frenchBlocksRaw = segmentDocument(frenchText);\n\n const englishNormalized = englishBlocksRaw.map(normalizeBlock);\n const frenchNormalized = frenchBlocksRaw.map(normalizeBlock);\n\n const englishBlocks: FingerprintedBlock[] = englishNormalized.map(\n (block, index, array) =>\n fingerprintBlock(\n block,\n array[index - 1] ?? null,\n array[index + 1] ?? null\n )\n );\n const frenchBlocks: FingerprintedBlock[] = frenchNormalized.map(\n (block, index, array) =>\n fingerprintBlock(\n block,\n array[index - 1] ?? null,\n array[index + 1] ?? null\n )\n );\n\n const alignment = alignEnglishAndFrenchBlocks(englishBlocks, frenchBlocks);\n\n const changedIndexes = mapChangedLinesToBlocks(\n englishBlocks,\n Array.isArray(changedLines) ? changedLines : []\n );\n\n const plan = planAlignmentActions(alignment, changedIndexes, {\n minimumMatchForReuse: similarityOptions?.minimumMatchForReuse ?? 0.9,\n minimumMatchForNearDuplicate:\n similarityOptions?.minimumMatchForNearDuplicate ?? 0.8,\n });\n\n const { segmentsToReview } = identifySegmentsToReview({\n englishBlocks,\n frenchBlocks,\n plan,\n });\n\n return { englishBlocks, frenchBlocks, plan, segmentsToReview };\n};\n\nexport { mergeReviewedSegments };\nexport type { SegmentToReview };\n"],"mappings":";;;;;;;;;;AA+BA,MAAa,sBAAsB,EACjC,aACA,YACA,cACA,wBACuD;CACvD,MAAM,mBAAmBA,8DAAgB,YAAY;CACrD,MAAM,kBAAkBA,8DAAgB,WAAW;CAEnD,MAAM,oBAAoB,iBAAiB,IAAIC,4DAAe;CAC9D,MAAM,mBAAmB,gBAAgB,IAAIA,4DAAe;CAE5D,MAAM,gBAAsC,kBAAkB,KAC3D,OAAO,OAAO,UACbC,gEACE,OACA,MAAM,QAAQ,MAAM,MACpB,MAAM,QAAQ,MAAM,KACrB,CACJ;CACD,MAAM,eAAqC,iBAAiB,KACzD,OAAO,OAAO,UACbA,gEACE,OACA,MAAM,QAAQ,MAAM,MACpB,MAAM,QAAQ,MAAM,KACrB,CACJ;CASD,MAAM,OAAOC,+DAPKC,sEAA4B,eAAe,aAAa,EAEnDC,8EACrB,eACA,MAAM,QAAQ,aAAa,GAAG,eAAe,EAAE,CAChD,EAE4D;EAC3D,sBAAsB,mBAAmB,wBAAwB;EACjE,8BACE,mBAAmB,gCAAgC;EACtD,CAAC;CAEF,MAAM,EAAE,qBAAqBC,uEAAyB;EACpD;EACA;EACA;EACD,CAAC;AAEF,QAAO;EAAE;EAAe;EAAc;EAAM;EAAkB"}
@@ -1,2 +1,47 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=(e,t)=>{let n=[],r=new Set;return e.forEach(e=>{let i=e.englishIndex,a=e.frenchIndex;if(i===-1&&a!==null){r.has(a)||(n.push({kind:`delete`,frenchIndex:a}),r.add(a));return}if(i>=0&&a===null){n.push({kind:`insert_new`,englishIndex:i});return}if(i>=0&&a!==null){t.has(i)?n.push({kind:`review`,englishIndex:i,frenchIndex:a}):n.push({kind:`reuse`,englishIndex:i,frenchIndex:a}),r.add(a);return}}),{actions:n}};exports.planAlignmentActions=e;
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
+
3
+ //#region src/translation-alignment/planActions.ts
4
+ const planAlignmentActions = (alignment, changedEnglishBlockIndexes) => {
5
+ const actions = [];
6
+ const seenFrench = /* @__PURE__ */ new Set();
7
+ alignment.forEach((pair) => {
8
+ const englishIndex = pair.englishIndex;
9
+ const frenchIndex = pair.frenchIndex;
10
+ if (englishIndex === -1 && frenchIndex !== null) {
11
+ if (!seenFrench.has(frenchIndex)) {
12
+ actions.push({
13
+ kind: "delete",
14
+ frenchIndex
15
+ });
16
+ seenFrench.add(frenchIndex);
17
+ }
18
+ return;
19
+ }
20
+ if (englishIndex >= 0 && frenchIndex === null) {
21
+ actions.push({
22
+ kind: "insert_new",
23
+ englishIndex
24
+ });
25
+ return;
26
+ }
27
+ if (englishIndex >= 0 && frenchIndex !== null) {
28
+ if (!changedEnglishBlockIndexes.has(englishIndex)) actions.push({
29
+ kind: "reuse",
30
+ englishIndex,
31
+ frenchIndex
32
+ });
33
+ else actions.push({
34
+ kind: "review",
35
+ englishIndex,
36
+ frenchIndex
37
+ });
38
+ seenFrench.add(frenchIndex);
39
+ return;
40
+ }
41
+ });
42
+ return { actions };
43
+ };
44
+
45
+ //#endregion
46
+ exports.planAlignmentActions = planAlignmentActions;
2
47
  //# sourceMappingURL=planActions.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"planActions.cjs","names":[],"sources":["../../../src/translation-alignment/planActions.ts"],"sourcesContent":["import type { AlignmentPair, AlignmentPlan, PlannedAction } from './types';\n\nexport const planAlignmentActions = (\n alignment: AlignmentPair[],\n changedEnglishBlockIndexes: Set<number>\n): AlignmentPlan => {\n const actions: PlannedAction[] = [];\n const seenFrench = new Set<number>();\n\n alignment.forEach((pair) => {\n const englishIndex = pair.englishIndex;\n const frenchIndex = pair.frenchIndex;\n\n // Case 1: Deletion (Exists in FR, not in EN)\n if (englishIndex === -1 && frenchIndex !== null) {\n if (!seenFrench.has(frenchIndex)) {\n actions.push({ kind: 'delete', frenchIndex });\n seenFrench.add(frenchIndex);\n }\n return;\n }\n\n // Case 2: New Insertion (Exists in EN, not in FR)\n if (englishIndex >= 0 && frenchIndex === null) {\n actions.push({ kind: 'insert_new', englishIndex });\n return;\n }\n\n // Case 3: Alignment (Exists in both)\n if (englishIndex >= 0 && frenchIndex !== null) {\n const isChanged = changedEnglishBlockIndexes.has(englishIndex);\n\n // If the block is NOT marked as changed by Git, we REUSE it.\n // We assume the existing translation is correct because the source hasn't been touched.\n // We ignore 'similarityScore' here because EN vs UK text will always have low similarity.\n if (!isChanged) {\n actions.push({ kind: 'reuse', englishIndex, frenchIndex });\n } else {\n // If the block IS changed, we normally Review.\n // OPTIONAL: You could add a check here for 'similarityScore > 0.99'\n // to detect whitespace-only changes, but generally, if Git says changed, we Review.\n actions.push({ kind: 'review', englishIndex, frenchIndex });\n }\n\n seenFrench.add(frenchIndex);\n return;\n }\n });\n\n return { actions };\n};\n"],"mappings":"mEAEA,MAAa,GACX,EACA,IACkB,CAClB,IAAM,EAA2B,EAAE,CAC7B,EAAa,IAAI,IA0CvB,OAxCA,EAAU,QAAS,GAAS,CAC1B,IAAM,EAAe,EAAK,aACpB,EAAc,EAAK,YAGzB,GAAI,IAAiB,IAAM,IAAgB,KAAM,CAC1C,EAAW,IAAI,EAAY,GAC9B,EAAQ,KAAK,CAAE,KAAM,SAAU,cAAa,CAAC,CAC7C,EAAW,IAAI,EAAY,EAE7B,OAIF,GAAI,GAAgB,GAAK,IAAgB,KAAM,CAC7C,EAAQ,KAAK,CAAE,KAAM,aAAc,eAAc,CAAC,CAClD,OAIF,GAAI,GAAgB,GAAK,IAAgB,KAAM,CAC3B,EAA2B,IAAI,EAAa,CAW5D,EAAQ,KAAK,CAAE,KAAM,SAAU,eAAc,cAAa,CAAC,CAL3D,EAAQ,KAAK,CAAE,KAAM,QAAS,eAAc,cAAa,CAAC,CAQ5D,EAAW,IAAI,EAAY,CAC3B,SAEF,CAEK,CAAE,UAAS"}
1
+ {"version":3,"file":"planActions.cjs","names":[],"sources":["../../../src/translation-alignment/planActions.ts"],"sourcesContent":["import type { AlignmentPair, AlignmentPlan, PlannedAction } from './types';\n\nexport const planAlignmentActions = (\n alignment: AlignmentPair[],\n changedEnglishBlockIndexes: Set<number>\n): AlignmentPlan => {\n const actions: PlannedAction[] = [];\n const seenFrench = new Set<number>();\n\n alignment.forEach((pair) => {\n const englishIndex = pair.englishIndex;\n const frenchIndex = pair.frenchIndex;\n\n // Case 1: Deletion (Exists in FR, not in EN)\n if (englishIndex === -1 && frenchIndex !== null) {\n if (!seenFrench.has(frenchIndex)) {\n actions.push({ kind: 'delete', frenchIndex });\n seenFrench.add(frenchIndex);\n }\n return;\n }\n\n // Case 2: New Insertion (Exists in EN, not in FR)\n if (englishIndex >= 0 && frenchIndex === null) {\n actions.push({ kind: 'insert_new', englishIndex });\n return;\n }\n\n // Case 3: Alignment (Exists in both)\n if (englishIndex >= 0 && frenchIndex !== null) {\n const isChanged = changedEnglishBlockIndexes.has(englishIndex);\n\n // If the block is NOT marked as changed by Git, we REUSE it.\n // We assume the existing translation is correct because the source hasn't been touched.\n // We ignore 'similarityScore' here because EN vs UK text will always have low similarity.\n if (!isChanged) {\n actions.push({ kind: 'reuse', englishIndex, frenchIndex });\n } else {\n // If the block IS changed, we normally Review.\n // OPTIONAL: You could add a check here for 'similarityScore > 0.99'\n // to detect whitespace-only changes, but generally, if Git says changed, we Review.\n actions.push({ kind: 'review', englishIndex, frenchIndex });\n }\n\n seenFrench.add(frenchIndex);\n return;\n }\n });\n\n return { actions };\n};\n"],"mappings":";;;AAEA,MAAa,wBACX,WACA,+BACkB;CAClB,MAAM,UAA2B,EAAE;CACnC,MAAM,6BAAa,IAAI,KAAa;AAEpC,WAAU,SAAS,SAAS;EAC1B,MAAM,eAAe,KAAK;EAC1B,MAAM,cAAc,KAAK;AAGzB,MAAI,iBAAiB,MAAM,gBAAgB,MAAM;AAC/C,OAAI,CAAC,WAAW,IAAI,YAAY,EAAE;AAChC,YAAQ,KAAK;KAAE,MAAM;KAAU;KAAa,CAAC;AAC7C,eAAW,IAAI,YAAY;;AAE7B;;AAIF,MAAI,gBAAgB,KAAK,gBAAgB,MAAM;AAC7C,WAAQ,KAAK;IAAE,MAAM;IAAc;IAAc,CAAC;AAClD;;AAIF,MAAI,gBAAgB,KAAK,gBAAgB,MAAM;AAM7C,OAAI,CALc,2BAA2B,IAAI,aAAa,CAM5D,SAAQ,KAAK;IAAE,MAAM;IAAS;IAAc;IAAa,CAAC;OAK1D,SAAQ,KAAK;IAAE,MAAM;IAAU;IAAc;IAAa,CAAC;AAG7D,cAAW,IAAI,YAAY;AAC3B;;GAEF;AAEF,QAAO,EAAE,SAAS"}
@@ -1,3 +1,50 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=({englishBlocks:e,frenchBlocks:t,plan:n})=>{let r=[];return n.actions.forEach((n,i)=>{if(n.kind===`review`){let a=e[n.englishIndex],o=n.frenchIndex===null?null:t[n.frenchIndex].content;r.push({englishBlock:a,frenchBlockText:o,actionIndex:i})}else if(n.kind===`insert_new`){let t=e[n.englishIndex];r.push({englishBlock:t,frenchBlockText:null,actionIndex:i})}}),{segmentsToReview:r}},t=(e,t,n)=>{let r=[];return e.actions.forEach((e,i)=>{if(e.kind===`reuse`)r.push(t[e.frenchIndex].content);else if(e.kind===`review`||e.kind===`insert_new`){let a=n.get(i);a===void 0?e.kind===`review`&&e.frenchIndex!==null?r.push(t[e.frenchIndex].content):r.push(`
2
- `):r.push(a)}}),r.join(``)};exports.identifySegmentsToReview=e,exports.mergeReviewedSegments=t;
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
+
3
+ //#region src/translation-alignment/rebuildDocument.ts
4
+ /**
5
+ * Analyzes the alignment plan and returns only the segments that need review/translation.
6
+ * Does not generate output text - that's done by mergeReviewedSegments after translation.
7
+ */
8
+ const identifySegmentsToReview = ({ englishBlocks, frenchBlocks, plan }) => {
9
+ const segmentsToReview = [];
10
+ plan.actions.forEach((action, actionIndex) => {
11
+ if (action.kind === "review") {
12
+ const englishBlock = englishBlocks[action.englishIndex];
13
+ const frenchBlockText = action.frenchIndex !== null ? frenchBlocks[action.frenchIndex].content : null;
14
+ segmentsToReview.push({
15
+ englishBlock,
16
+ frenchBlockText,
17
+ actionIndex
18
+ });
19
+ } else if (action.kind === "insert_new") {
20
+ const englishBlock = englishBlocks[action.englishIndex];
21
+ segmentsToReview.push({
22
+ englishBlock,
23
+ frenchBlockText: null,
24
+ actionIndex
25
+ });
26
+ }
27
+ });
28
+ return { segmentsToReview };
29
+ };
30
+ /**
31
+ * Merges reviewed translations back into the final document following the alignment plan.
32
+ */
33
+ const mergeReviewedSegments = (plan, frenchBlocks, reviewedSegments) => {
34
+ const outputParts = [];
35
+ plan.actions.forEach((action, actionIndex) => {
36
+ if (action.kind === "reuse") outputParts.push(frenchBlocks[action.frenchIndex].content);
37
+ else if (action.kind === "review" || action.kind === "insert_new") {
38
+ const reviewedContent = reviewedSegments.get(actionIndex);
39
+ if (reviewedContent !== void 0) outputParts.push(reviewedContent);
40
+ else if (action.kind === "review" && action.frenchIndex !== null) outputParts.push(frenchBlocks[action.frenchIndex].content);
41
+ else outputParts.push("\n");
42
+ }
43
+ });
44
+ return outputParts.join("");
45
+ };
46
+
47
+ //#endregion
48
+ exports.identifySegmentsToReview = identifySegmentsToReview;
49
+ exports.mergeReviewedSegments = mergeReviewedSegments;
3
50
  //# sourceMappingURL=rebuildDocument.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"rebuildDocument.cjs","names":[],"sources":["../../../src/translation-alignment/rebuildDocument.ts"],"sourcesContent":["import type { AlignmentPlan, FingerprintedBlock } from './types';\n\nexport type SegmentToReview = {\n englishBlock: FingerprintedBlock;\n frenchBlockText: string | null;\n actionIndex: number;\n};\n\nexport type RebuildInput = {\n englishBlocks: FingerprintedBlock[];\n frenchBlocks: FingerprintedBlock[];\n plan: AlignmentPlan;\n};\n\nexport type RebuildResult = {\n segmentsToReview: SegmentToReview[];\n};\n\n/**\n * Analyzes the alignment plan and returns only the segments that need review/translation.\n * Does not generate output text - that's done by mergeReviewedSegments after translation.\n */\nexport const identifySegmentsToReview = ({\n englishBlocks,\n frenchBlocks,\n plan,\n}: RebuildInput): RebuildResult => {\n const segmentsToReview: SegmentToReview[] = [];\n\n plan.actions.forEach((action, actionIndex) => {\n if (action.kind === 'review') {\n const englishBlock = englishBlocks[action.englishIndex];\n const frenchBlockText =\n action.frenchIndex !== null\n ? frenchBlocks[action.frenchIndex].content\n : null;\n\n segmentsToReview.push({ englishBlock, frenchBlockText, actionIndex });\n } else if (action.kind === 'insert_new') {\n const englishBlock = englishBlocks[action.englishIndex];\n\n segmentsToReview.push({\n englishBlock,\n frenchBlockText: null,\n actionIndex,\n });\n }\n });\n\n return { segmentsToReview };\n};\n\n/**\n * Merges reviewed translations back into the final document following the alignment plan.\n */\nexport const mergeReviewedSegments = (\n plan: AlignmentPlan,\n frenchBlocks: FingerprintedBlock[],\n reviewedSegments: Map<number, string>\n): string => {\n const outputParts: string[] = [];\n\n plan.actions.forEach((action, actionIndex) => {\n if (action.kind === 'reuse') {\n outputParts.push(frenchBlocks[action.frenchIndex].content);\n } else if (action.kind === 'review' || action.kind === 'insert_new') {\n const reviewedContent = reviewedSegments.get(actionIndex);\n\n if (reviewedContent !== undefined) {\n outputParts.push(reviewedContent);\n } else {\n // Fallback: if review failed, use existing or blank\n if (action.kind === 'review' && action.frenchIndex !== null) {\n outputParts.push(frenchBlocks[action.frenchIndex].content);\n } else {\n outputParts.push('\\n');\n }\n }\n }\n // \"delete\" actions are simply skipped - no output\n });\n\n return outputParts.join('');\n};\n"],"mappings":"mEAsBA,MAAa,GAA4B,CACvC,gBACA,eACA,UACiC,CACjC,IAAM,EAAsC,EAAE,CAsB9C,OApBA,EAAK,QAAQ,SAAS,EAAQ,IAAgB,CAC5C,GAAI,EAAO,OAAS,SAAU,CAC5B,IAAM,EAAe,EAAc,EAAO,cACpC,EACJ,EAAO,cAAgB,KAEnB,KADA,EAAa,EAAO,aAAa,QAGvC,EAAiB,KAAK,CAAE,eAAc,kBAAiB,cAAa,CAAC,SAC5D,EAAO,OAAS,aAAc,CACvC,IAAM,EAAe,EAAc,EAAO,cAE1C,EAAiB,KAAK,CACpB,eACA,gBAAiB,KACjB,cACD,CAAC,GAEJ,CAEK,CAAE,mBAAkB,EAMhB,GACX,EACA,EACA,IACW,CACX,IAAM,EAAwB,EAAE,CAsBhC,OApBA,EAAK,QAAQ,SAAS,EAAQ,IAAgB,CAC5C,GAAI,EAAO,OAAS,QAClB,EAAY,KAAK,EAAa,EAAO,aAAa,QAAQ,SACjD,EAAO,OAAS,UAAY,EAAO,OAAS,aAAc,CACnE,IAAM,EAAkB,EAAiB,IAAI,EAAY,CAErD,IAAoB,IAAA,GAIlB,EAAO,OAAS,UAAY,EAAO,cAAgB,KACrD,EAAY,KAAK,EAAa,EAAO,aAAa,QAAQ,CAE1D,EAAY,KAAK;EAAK,CANxB,EAAY,KAAK,EAAgB,GAWrC,CAEK,EAAY,KAAK,GAAG"}
1
+ {"version":3,"file":"rebuildDocument.cjs","names":[],"sources":["../../../src/translation-alignment/rebuildDocument.ts"],"sourcesContent":["import type { AlignmentPlan, FingerprintedBlock } from './types';\n\nexport type SegmentToReview = {\n englishBlock: FingerprintedBlock;\n frenchBlockText: string | null;\n actionIndex: number;\n};\n\nexport type RebuildInput = {\n englishBlocks: FingerprintedBlock[];\n frenchBlocks: FingerprintedBlock[];\n plan: AlignmentPlan;\n};\n\nexport type RebuildResult = {\n segmentsToReview: SegmentToReview[];\n};\n\n/**\n * Analyzes the alignment plan and returns only the segments that need review/translation.\n * Does not generate output text - that's done by mergeReviewedSegments after translation.\n */\nexport const identifySegmentsToReview = ({\n englishBlocks,\n frenchBlocks,\n plan,\n}: RebuildInput): RebuildResult => {\n const segmentsToReview: SegmentToReview[] = [];\n\n plan.actions.forEach((action, actionIndex) => {\n if (action.kind === 'review') {\n const englishBlock = englishBlocks[action.englishIndex];\n const frenchBlockText =\n action.frenchIndex !== null\n ? frenchBlocks[action.frenchIndex].content\n : null;\n\n segmentsToReview.push({ englishBlock, frenchBlockText, actionIndex });\n } else if (action.kind === 'insert_new') {\n const englishBlock = englishBlocks[action.englishIndex];\n\n segmentsToReview.push({\n englishBlock,\n frenchBlockText: null,\n actionIndex,\n });\n }\n });\n\n return { segmentsToReview };\n};\n\n/**\n * Merges reviewed translations back into the final document following the alignment plan.\n */\nexport const mergeReviewedSegments = (\n plan: AlignmentPlan,\n frenchBlocks: FingerprintedBlock[],\n reviewedSegments: Map<number, string>\n): string => {\n const outputParts: string[] = [];\n\n plan.actions.forEach((action, actionIndex) => {\n if (action.kind === 'reuse') {\n outputParts.push(frenchBlocks[action.frenchIndex].content);\n } else if (action.kind === 'review' || action.kind === 'insert_new') {\n const reviewedContent = reviewedSegments.get(actionIndex);\n\n if (reviewedContent !== undefined) {\n outputParts.push(reviewedContent);\n } else {\n // Fallback: if review failed, use existing or blank\n if (action.kind === 'review' && action.frenchIndex !== null) {\n outputParts.push(frenchBlocks[action.frenchIndex].content);\n } else {\n outputParts.push('\\n');\n }\n }\n }\n // \"delete\" actions are simply skipped - no output\n });\n\n return outputParts.join('');\n};\n"],"mappings":";;;;;;;AAsBA,MAAa,4BAA4B,EACvC,eACA,cACA,WACiC;CACjC,MAAM,mBAAsC,EAAE;AAE9C,MAAK,QAAQ,SAAS,QAAQ,gBAAgB;AAC5C,MAAI,OAAO,SAAS,UAAU;GAC5B,MAAM,eAAe,cAAc,OAAO;GAC1C,MAAM,kBACJ,OAAO,gBAAgB,OACnB,aAAa,OAAO,aAAa,UACjC;AAEN,oBAAiB,KAAK;IAAE;IAAc;IAAiB;IAAa,CAAC;aAC5D,OAAO,SAAS,cAAc;GACvC,MAAM,eAAe,cAAc,OAAO;AAE1C,oBAAiB,KAAK;IACpB;IACA,iBAAiB;IACjB;IACD,CAAC;;GAEJ;AAEF,QAAO,EAAE,kBAAkB;;;;;AAM7B,MAAa,yBACX,MACA,cACA,qBACW;CACX,MAAM,cAAwB,EAAE;AAEhC,MAAK,QAAQ,SAAS,QAAQ,gBAAgB;AAC5C,MAAI,OAAO,SAAS,QAClB,aAAY,KAAK,aAAa,OAAO,aAAa,QAAQ;WACjD,OAAO,SAAS,YAAY,OAAO,SAAS,cAAc;GACnE,MAAM,kBAAkB,iBAAiB,IAAI,YAAY;AAEzD,OAAI,oBAAoB,OACtB,aAAY,KAAK,gBAAgB;YAG7B,OAAO,SAAS,YAAY,OAAO,gBAAgB,KACrD,aAAY,KAAK,aAAa,OAAO,aAAa,QAAQ;OAE1D,aAAY,KAAK,KAAK;;GAK5B;AAEF,QAAO,YAAY,KAAK,GAAG"}
@@ -1,6 +1,67 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=e=>e.trim().length===0,t=e=>/^\s*```/.test(e),n=e=>/^\s*#{1,6}\s+/.test(e),r=e=>/^\s*---\s*$/.test(e),i=e=>e.replace(/\n+$/g,`
2
- `),a=a=>{let o=a.split(`
3
- `),s=[],c=0,l=!1,u=[],d=1,f=e=>{if(u.length>0){let t=u.join(`
4
- `);t.trim().length>0&&s.push({type:`paragraph`,content:`${i(t)}\n`,lineStart:d,lineEnd:e}),u=[]}};for(;c<o.length;){let a=o[c];if(s.length===0&&r(a)){let e=c+1,t=[a];for(c++;c<o.length&&!r(o[c]);)t.push(o[c]),c++;c<o.length&&r(o[c])&&(t.push(o[c]),c++),s.push({type:`paragraph`,content:`${i(t.join(`
5
- `))}\n`,lineStart:e,lineEnd:c});continue}t(a)&&(l=!l),!l&&n(a)?(u.length>0&&f(c),d=c+1,u=[a]):(u.length===0&&!e(a)&&(d=c+1),u.push(a)),c++}return f(c),s};exports.segmentDocument=a;
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
+
3
+ //#region src/translation-alignment/segmentDocument.ts
4
+ const isBlankLine = (line) => line.trim().length === 0;
5
+ const isFencedCodeDelimiter = (line) => /^\s*```/.test(line);
6
+ const isHeading = (line) => /^\s*#{1,6}\s+/.test(line);
7
+ const isFrontmatterDelimiter = (line) => /^\s*---\s*$/.test(line);
8
+ const trimTrailingNewlines = (text) => text.replace(/\n+$/g, "\n");
9
+ const segmentDocument = (text) => {
10
+ const lines = text.split("\n");
11
+ const blocks = [];
12
+ let index = 0;
13
+ let insideCodeBlock = false;
14
+ let currentSectionLines = [];
15
+ let currentSectionStartLine = 1;
16
+ const flushCurrentSection = (endIndex) => {
17
+ if (currentSectionLines.length > 0) {
18
+ const rawContent = currentSectionLines.join("\n");
19
+ if (rawContent.trim().length > 0) blocks.push({
20
+ type: "paragraph",
21
+ content: `${trimTrailingNewlines(rawContent)}\n`,
22
+ lineStart: currentSectionStartLine,
23
+ lineEnd: endIndex
24
+ });
25
+ currentSectionLines = [];
26
+ }
27
+ };
28
+ while (index < lines.length) {
29
+ const currentLine = lines[index];
30
+ if (blocks.length === 0 && isFrontmatterDelimiter(currentLine)) {
31
+ const startLine = index + 1;
32
+ const contentLines = [currentLine];
33
+ index++;
34
+ while (index < lines.length && !isFrontmatterDelimiter(lines[index])) {
35
+ contentLines.push(lines[index]);
36
+ index++;
37
+ }
38
+ if (index < lines.length && isFrontmatterDelimiter(lines[index])) {
39
+ contentLines.push(lines[index]);
40
+ index++;
41
+ }
42
+ blocks.push({
43
+ type: "paragraph",
44
+ content: `${trimTrailingNewlines(contentLines.join("\n"))}\n`,
45
+ lineStart: startLine,
46
+ lineEnd: index
47
+ });
48
+ continue;
49
+ }
50
+ if (isFencedCodeDelimiter(currentLine)) insideCodeBlock = !insideCodeBlock;
51
+ if (!insideCodeBlock && isHeading(currentLine)) {
52
+ if (currentSectionLines.length > 0) flushCurrentSection(index);
53
+ currentSectionStartLine = index + 1;
54
+ currentSectionLines = [currentLine];
55
+ } else {
56
+ if (currentSectionLines.length === 0 && !isBlankLine(currentLine)) currentSectionStartLine = index + 1;
57
+ currentSectionLines.push(currentLine);
58
+ }
59
+ index++;
60
+ }
61
+ flushCurrentSection(index);
62
+ return blocks;
63
+ };
64
+
65
+ //#endregion
66
+ exports.segmentDocument = segmentDocument;
6
67
  //# sourceMappingURL=segmentDocument.cjs.map