ai-i18n-tools 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (260) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +157 -0
  3. package/dist/api/openrouter.d.ts +115 -0
  4. package/dist/api/openrouter.d.ts.map +1 -0
  5. package/dist/api/openrouter.js +399 -0
  6. package/dist/api/openrouter.js.map +1 -0
  7. package/dist/cli/doc-translate.d.ts +90 -0
  8. package/dist/cli/doc-translate.d.ts.map +1 -0
  9. package/dist/cli/doc-translate.js +1153 -0
  10. package/dist/cli/doc-translate.js.map +1 -0
  11. package/dist/cli/export-ui-xliff.d.ts +32 -0
  12. package/dist/cli/export-ui-xliff.d.ts.map +1 -0
  13. package/dist/cli/export-ui-xliff.js +153 -0
  14. package/dist/cli/export-ui-xliff.js.map +1 -0
  15. package/dist/cli/extract-strings.d.ts +12 -0
  16. package/dist/cli/extract-strings.d.ts.map +1 -0
  17. package/dist/cli/extract-strings.js +80 -0
  18. package/dist/cli/extract-strings.js.map +1 -0
  19. package/dist/cli/file-utils.d.ts +10 -0
  20. package/dist/cli/file-utils.d.ts.map +1 -0
  21. package/dist/cli/file-utils.js +77 -0
  22. package/dist/cli/file-utils.js.map +1 -0
  23. package/dist/cli/format.d.ts +21 -0
  24. package/dist/cli/format.d.ts.map +1 -0
  25. package/dist/cli/format.js +75 -0
  26. package/dist/cli/format.js.map +1 -0
  27. package/dist/cli/helpers.d.ts +27 -0
  28. package/dist/cli/helpers.d.ts.map +1 -0
  29. package/dist/cli/helpers.js +84 -0
  30. package/dist/cli/helpers.js.map +1 -0
  31. package/dist/cli/index.d.ts +3 -0
  32. package/dist/cli/index.d.ts.map +1 -0
  33. package/dist/cli/index.js +772 -0
  34. package/dist/cli/index.js.map +1 -0
  35. package/dist/cli/log-output.d.ts +13 -0
  36. package/dist/cli/log-output.d.ts.map +1 -0
  37. package/dist/cli/log-output.js +75 -0
  38. package/dist/cli/log-output.js.map +1 -0
  39. package/dist/cli/translate-svg.d.ts +7 -0
  40. package/dist/cli/translate-svg.d.ts.map +1 -0
  41. package/dist/cli/translate-svg.js +167 -0
  42. package/dist/cli/translate-svg.js.map +1 -0
  43. package/dist/cli/translate-ui-strings.d.ts +27 -0
  44. package/dist/cli/translate-ui-strings.d.ts.map +1 -0
  45. package/dist/cli/translate-ui-strings.js +357 -0
  46. package/dist/cli/translate-ui-strings.js.map +1 -0
  47. package/dist/core/cache-tracking-keys.d.ts +12 -0
  48. package/dist/core/cache-tracking-keys.d.ts.map +1 -0
  49. package/dist/core/cache-tracking-keys.js +20 -0
  50. package/dist/core/cache-tracking-keys.js.map +1 -0
  51. package/dist/core/cache.d.ts +153 -0
  52. package/dist/core/cache.d.ts.map +1 -0
  53. package/dist/core/cache.js +546 -0
  54. package/dist/core/cache.js.map +1 -0
  55. package/dist/core/config.d.ts +58 -0
  56. package/dist/core/config.d.ts.map +1 -0
  57. package/dist/core/config.js +392 -0
  58. package/dist/core/config.js.map +1 -0
  59. package/dist/core/doc-file-tracking.d.ts +8 -0
  60. package/dist/core/doc-file-tracking.d.ts.map +1 -0
  61. package/dist/core/doc-file-tracking.js +27 -0
  62. package/dist/core/doc-file-tracking.js.map +1 -0
  63. package/dist/core/errors.d.ts +19 -0
  64. package/dist/core/errors.d.ts.map +1 -0
  65. package/dist/core/errors.js +23 -0
  66. package/dist/core/errors.js.map +1 -0
  67. package/dist/core/locale-utils.d.ts +20 -0
  68. package/dist/core/locale-utils.d.ts.map +1 -0
  69. package/dist/core/locale-utils.js +75 -0
  70. package/dist/core/locale-utils.js.map +1 -0
  71. package/dist/core/output-paths.d.ts +22 -0
  72. package/dist/core/output-paths.d.ts.map +1 -0
  73. package/dist/core/output-paths.js +130 -0
  74. package/dist/core/output-paths.js.map +1 -0
  75. package/dist/core/prompt-builder.d.ts +62 -0
  76. package/dist/core/prompt-builder.d.ts.map +1 -0
  77. package/dist/core/prompt-builder.js +232 -0
  78. package/dist/core/prompt-builder.js.map +1 -0
  79. package/dist/core/prompts.d.ts +27 -0
  80. package/dist/core/prompts.d.ts.map +1 -0
  81. package/dist/core/prompts.js +57 -0
  82. package/dist/core/prompts.js.map +1 -0
  83. package/dist/core/svg-asset-paths.d.ts +40 -0
  84. package/dist/core/svg-asset-paths.d.ts.map +1 -0
  85. package/dist/core/svg-asset-paths.js +107 -0
  86. package/dist/core/svg-asset-paths.js.map +1 -0
  87. package/dist/core/types.d.ts +388 -0
  88. package/dist/core/types.d.ts.map +1 -0
  89. package/dist/core/types.js +265 -0
  90. package/dist/core/types.js.map +1 -0
  91. package/dist/core/ui-languages.d.ts +66 -0
  92. package/dist/core/ui-languages.d.ts.map +1 -0
  93. package/dist/core/ui-languages.js +277 -0
  94. package/dist/core/ui-languages.js.map +1 -0
  95. package/dist/core/user-edited-model.d.ts +3 -0
  96. package/dist/core/user-edited-model.d.ts.map +1 -0
  97. package/dist/core/user-edited-model.js +3 -0
  98. package/dist/core/user-edited-model.js.map +1 -0
  99. package/dist/edit-cache-app/app.js +1326 -0
  100. package/dist/edit-cache-app/index.html +287 -0
  101. package/dist/edit-cache-app/styles.css +664 -0
  102. package/dist/extractors/base-extractor.d.ts +15 -0
  103. package/dist/extractors/base-extractor.d.ts.map +1 -0
  104. package/dist/extractors/base-extractor.js +23 -0
  105. package/dist/extractors/base-extractor.js.map +1 -0
  106. package/dist/extractors/classify-segment.d.ts +6 -0
  107. package/dist/extractors/classify-segment.d.ts.map +1 -0
  108. package/dist/extractors/classify-segment.js +20 -0
  109. package/dist/extractors/classify-segment.js.map +1 -0
  110. package/dist/extractors/json-extractor.d.ts +16 -0
  111. package/dist/extractors/json-extractor.d.ts.map +1 -0
  112. package/dist/extractors/json-extractor.js +128 -0
  113. package/dist/extractors/json-extractor.js.map +1 -0
  114. package/dist/extractors/markdown-extractor.d.ts +15 -0
  115. package/dist/extractors/markdown-extractor.d.ts.map +1 -0
  116. package/dist/extractors/markdown-extractor.js +205 -0
  117. package/dist/extractors/markdown-extractor.js.map +1 -0
  118. package/dist/extractors/svg-extractor.d.ts +19 -0
  119. package/dist/extractors/svg-extractor.d.ts.map +1 -0
  120. package/dist/extractors/svg-extractor.js +132 -0
  121. package/dist/extractors/svg-extractor.js.map +1 -0
  122. package/dist/extractors/ui-string-extractor.d.ts +40 -0
  123. package/dist/extractors/ui-string-extractor.d.ts.map +1 -0
  124. package/dist/extractors/ui-string-extractor.js +146 -0
  125. package/dist/extractors/ui-string-extractor.js.map +1 -0
  126. package/dist/extractors/ui-string-locations.d.ts +23 -0
  127. package/dist/extractors/ui-string-locations.d.ts.map +1 -0
  128. package/dist/extractors/ui-string-locations.js +138 -0
  129. package/dist/extractors/ui-string-locations.js.map +1 -0
  130. package/dist/glossary/glossary.d.ts +34 -0
  131. package/dist/glossary/glossary.d.ts.map +1 -0
  132. package/dist/glossary/glossary.js +260 -0
  133. package/dist/glossary/glossary.js.map +1 -0
  134. package/dist/glossary/matcher.d.ts +10 -0
  135. package/dist/glossary/matcher.d.ts.map +1 -0
  136. package/dist/glossary/matcher.js +12 -0
  137. package/dist/glossary/matcher.js.map +1 -0
  138. package/dist/index.d.ts +44 -0
  139. package/dist/index.d.ts.map +1 -0
  140. package/dist/index.js +44 -0
  141. package/dist/index.js.map +1 -0
  142. package/dist/processors/admonition-placeholders.d.ts +8 -0
  143. package/dist/processors/admonition-placeholders.d.ts.map +1 -0
  144. package/dist/processors/admonition-placeholders.js +59 -0
  145. package/dist/processors/admonition-placeholders.js.map +1 -0
  146. package/dist/processors/anchor-placeholders.d.ts +8 -0
  147. package/dist/processors/anchor-placeholders.d.ts.map +1 -0
  148. package/dist/processors/anchor-placeholders.js +37 -0
  149. package/dist/processors/anchor-placeholders.js.map +1 -0
  150. package/dist/processors/batch-processor.d.ts +10 -0
  151. package/dist/processors/batch-processor.d.ts.map +1 -0
  152. package/dist/processors/batch-processor.js +33 -0
  153. package/dist/processors/batch-processor.js.map +1 -0
  154. package/dist/processors/bold-code-placeholders.d.ts +14 -0
  155. package/dist/processors/bold-code-placeholders.d.ts.map +1 -0
  156. package/dist/processors/bold-code-placeholders.js +116 -0
  157. package/dist/processors/bold-code-placeholders.js.map +1 -0
  158. package/dist/processors/doc-postprocess.d.ts +51 -0
  159. package/dist/processors/doc-postprocess.d.ts.map +1 -0
  160. package/dist/processors/doc-postprocess.js +215 -0
  161. package/dist/processors/doc-postprocess.js.map +1 -0
  162. package/dist/processors/emphasis-placeholders.d.ts +6 -0
  163. package/dist/processors/emphasis-placeholders.d.ts.map +1 -0
  164. package/dist/processors/emphasis-placeholders.js +262 -0
  165. package/dist/processors/emphasis-placeholders.js.map +1 -0
  166. package/dist/processors/flat-link-rewrite.d.ts +32 -0
  167. package/dist/processors/flat-link-rewrite.d.ts.map +1 -0
  168. package/dist/processors/flat-link-rewrite.js +90 -0
  169. package/dist/processors/flat-link-rewrite.js.map +1 -0
  170. package/dist/processors/glossary-force-placeholders.d.ts +12 -0
  171. package/dist/processors/glossary-force-placeholders.d.ts.map +1 -0
  172. package/dist/processors/glossary-force-placeholders.js +58 -0
  173. package/dist/processors/glossary-force-placeholders.js.map +1 -0
  174. package/dist/processors/inline-code-placeholders.d.ts +11 -0
  175. package/dist/processors/inline-code-placeholders.d.ts.map +1 -0
  176. package/dist/processors/inline-code-placeholders.js +87 -0
  177. package/dist/processors/inline-code-placeholders.js.map +1 -0
  178. package/dist/processors/placeholder-handler.d.ts +38 -0
  179. package/dist/processors/placeholder-handler.d.ts.map +1 -0
  180. package/dist/processors/placeholder-handler.js +55 -0
  181. package/dist/processors/placeholder-handler.js.map +1 -0
  182. package/dist/processors/translation-placeholder-leaks.d.ts +2 -0
  183. package/dist/processors/translation-placeholder-leaks.d.ts.map +1 -0
  184. package/dist/processors/translation-placeholder-leaks.js +9 -0
  185. package/dist/processors/translation-placeholder-leaks.js.map +1 -0
  186. package/dist/processors/url-placeholders.d.ts +10 -0
  187. package/dist/processors/url-placeholders.d.ts.map +1 -0
  188. package/dist/processors/url-placeholders.js +29 -0
  189. package/dist/processors/url-placeholders.js.map +1 -0
  190. package/dist/processors/validator.d.ts +23 -0
  191. package/dist/processors/validator.d.ts.map +1 -0
  192. package/dist/processors/validator.js +186 -0
  193. package/dist/processors/validator.js.map +1 -0
  194. package/dist/runtime/i18next-helpers.d.ts +146 -0
  195. package/dist/runtime/i18next-helpers.d.ts.map +1 -0
  196. package/dist/runtime/i18next-helpers.js +192 -0
  197. package/dist/runtime/i18next-helpers.js.map +1 -0
  198. package/dist/runtime/index.d.ts +4 -0
  199. package/dist/runtime/index.d.ts.map +1 -0
  200. package/dist/runtime/index.js +4 -0
  201. package/dist/runtime/index.js.map +1 -0
  202. package/dist/runtime/template.d.ts +21 -0
  203. package/dist/runtime/template.d.ts.map +1 -0
  204. package/dist/runtime/template.js +28 -0
  205. package/dist/runtime/template.js.map +1 -0
  206. package/dist/runtime/ui-language-display.d.ts +16 -0
  207. package/dist/runtime/ui-language-display.d.ts.map +1 -0
  208. package/dist/runtime/ui-language-display.js +26 -0
  209. package/dist/runtime/ui-language-display.js.map +1 -0
  210. package/dist/server/translation-editor.d.ts +25 -0
  211. package/dist/server/translation-editor.d.ts.map +1 -0
  212. package/dist/server/translation-editor.js +583 -0
  213. package/dist/server/translation-editor.js.map +1 -0
  214. package/dist/utils/concurrency.d.ts +31 -0
  215. package/dist/utils/concurrency.d.ts.map +1 -0
  216. package/dist/utils/concurrency.js +103 -0
  217. package/dist/utils/concurrency.js.map +1 -0
  218. package/dist/utils/hash.d.ts +5 -0
  219. package/dist/utils/hash.d.ts.map +1 -0
  220. package/dist/utils/hash.js +9 -0
  221. package/dist/utils/hash.js.map +1 -0
  222. package/dist/utils/ignore-parser.d.ts +7 -0
  223. package/dist/utils/ignore-parser.d.ts.map +1 -0
  224. package/dist/utils/ignore-parser.js +26 -0
  225. package/dist/utils/ignore-parser.js.map +1 -0
  226. package/dist/utils/logger.d.ts +45 -0
  227. package/dist/utils/logger.d.ts.map +1 -0
  228. package/dist/utils/logger.js +158 -0
  229. package/dist/utils/logger.js.map +1 -0
  230. package/docs/GETTING_STARTED.md +697 -0
  231. package/docs/PACKAGE_OVERVIEW.md +427 -0
  232. package/docs/ai-i18n-tools-context.md +481 -0
  233. package/package.json +117 -0
  234. package/translated-docs/README.de.md +157 -0
  235. package/translated-docs/README.es.md +157 -0
  236. package/translated-docs/README.fr.md +157 -0
  237. package/translated-docs/README.hi.md +157 -0
  238. package/translated-docs/README.ja.md +157 -0
  239. package/translated-docs/README.ko.md +157 -0
  240. package/translated-docs/README.pt-BR.md +157 -0
  241. package/translated-docs/README.zh-CN.md +157 -0
  242. package/translated-docs/README.zh-TW.md +157 -0
  243. package/translated-docs/docs/GETTING_STARTED.de.md +682 -0
  244. package/translated-docs/docs/GETTING_STARTED.es.md +682 -0
  245. package/translated-docs/docs/GETTING_STARTED.fr.md +682 -0
  246. package/translated-docs/docs/GETTING_STARTED.hi.md +682 -0
  247. package/translated-docs/docs/GETTING_STARTED.ja.md +682 -0
  248. package/translated-docs/docs/GETTING_STARTED.ko.md +682 -0
  249. package/translated-docs/docs/GETTING_STARTED.pt-BR.md +682 -0
  250. package/translated-docs/docs/GETTING_STARTED.zh-CN.md +682 -0
  251. package/translated-docs/docs/GETTING_STARTED.zh-TW.md +682 -0
  252. package/translated-docs/docs/PACKAGE_OVERVIEW.de.md +428 -0
  253. package/translated-docs/docs/PACKAGE_OVERVIEW.es.md +428 -0
  254. package/translated-docs/docs/PACKAGE_OVERVIEW.fr.md +428 -0
  255. package/translated-docs/docs/PACKAGE_OVERVIEW.hi.md +428 -0
  256. package/translated-docs/docs/PACKAGE_OVERVIEW.ja.md +428 -0
  257. package/translated-docs/docs/PACKAGE_OVERVIEW.ko.md +428 -0
  258. package/translated-docs/docs/PACKAGE_OVERVIEW.pt-BR.md +428 -0
  259. package/translated-docs/docs/PACKAGE_OVERVIEW.zh-CN.md +428 -0
  260. package/translated-docs/docs/PACKAGE_OVERVIEW.zh-TW.md +428 -0
@@ -0,0 +1,215 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ import chalk from "chalk";
4
+ import { matter, stringify as matterStringify } from "gray-matter-es";
5
+ import { normalizeLocale } from "../core/config.js";
6
+ import { resolveDocumentationOutputPath, toPosix } from "../core/output-paths.js";
7
+ import { loadUiLanguageEntries, resolveUiLanguagesAbsPath } from "../core/ui-languages.js";
8
+ const ADJUSTMENT_PLACEHOLDER_RE = /\$\{([a-zA-Z][a-zA-Z0-9_]*)\}/g;
9
+ /**
10
+ * Plain `pattern` uses flag `g`. Slash form `/pattern/flags` only works when `pattern` contains no `/`
11
+ * (otherwise the last `/` is parsed as the end delimiter and the regex is wrong).
12
+ */
13
+ export function parseAdjustmentSearchToRegExp(search) {
14
+ const trimmed = search.trim();
15
+ if (trimmed.startsWith("/")) {
16
+ const lastSlash = trimmed.lastIndexOf("/");
17
+ if (lastSlash > 0) {
18
+ const pattern = trimmed.slice(1, lastSlash);
19
+ let flags = trimmed.slice(lastSlash + 1);
20
+ const allowed = new Set([..."gimsuy"]);
21
+ flags = [...flags].filter((c) => allowed.has(c)).join("");
22
+ if (!flags.includes("g"))
23
+ flags += "g";
24
+ return new RegExp(pattern, flags);
25
+ }
26
+ }
27
+ return new RegExp(trimmed, "g");
28
+ }
29
+ export function interpolateAdjustmentTemplate(template, vars) {
30
+ return template.replace(ADJUSTMENT_PLACEHOLDER_RE, (full, key) => {
31
+ if (Object.prototype.hasOwnProperty.call(vars, key))
32
+ return vars[key];
33
+ return full;
34
+ });
35
+ }
36
+ /** Variables for `regexAdjustments[].replace` templates (reference transrewrt parity). */
37
+ export function buildMarkdownAdjustmentVars(sourceAbs, translatedAbs, sourceLocaleRaw, translatedLocaleRaw) {
38
+ const src = path.normalize(path.resolve(sourceAbs));
39
+ const tr = path.normalize(path.resolve(translatedAbs));
40
+ const sourceLocale = normalizeLocale(sourceLocaleRaw);
41
+ const translatedLocale = normalizeLocale(translatedLocaleRaw);
42
+ return {
43
+ sourceFullPath: toPosix(src),
44
+ sourceFilename: path.basename(src),
45
+ sourceBaseName: path.parse(src).name,
46
+ sourceExtension: path.extname(src),
47
+ translatedFullPath: toPosix(tr),
48
+ translatedFilename: path.basename(tr),
49
+ translatedBaseName: path.parse(tr).name,
50
+ translatedExtension: path.extname(tr),
51
+ sourceLocale,
52
+ translatedLocale,
53
+ sourceBasedir: toPosix(path.dirname(src)),
54
+ translatedBasedir: toPosix(path.dirname(tr)),
55
+ };
56
+ }
57
+ function splitBodyLines(body) {
58
+ return body.split(/\r?\n/);
59
+ }
60
+ function joinBodyLines(lines) {
61
+ return lines.join("\n");
62
+ }
63
+ /**
64
+ * Find the language-list block by scanning lines for `cfg.start` then `cfg.end` (no regex across lines).
65
+ */
66
+ export function extractLanguageListBlock(body, cfg) {
67
+ const lines = splitBodyLines(body);
68
+ const startLine = lines.findIndex((line) => line.includes(cfg.start));
69
+ if (startLine === -1)
70
+ return null;
71
+ let endLine;
72
+ if (lines[startLine].includes(cfg.end)) {
73
+ endLine = startLine;
74
+ }
75
+ else {
76
+ const found = lines.findIndex((line, idx) => idx > startLine && line.includes(cfg.end));
77
+ if (found === -1)
78
+ return null;
79
+ endLine = found;
80
+ }
81
+ const block = lines.slice(startLine, endLine + 1).join("\n");
82
+ return { block, startLine, endLine };
83
+ }
84
+ export function replaceLanguageListBlockInBody(body, cfg, replacement) {
85
+ const ext = extractLanguageListBlock(body, cfg);
86
+ if (!ext)
87
+ return { body, replaced: false };
88
+ const lines = splitBodyLines(body);
89
+ const replacementLines = splitBodyLines(replacement);
90
+ const newLines = [
91
+ ...lines.slice(0, ext.startLine),
92
+ ...replacementLines,
93
+ ...lines.slice(ext.endLine + 1),
94
+ ];
95
+ return { body: joinBodyLines(newLines), replaced: true };
96
+ }
97
+ function markdownRelativeHref(fromTranslatedFile, toTargetFile) {
98
+ let rel = path.relative(path.dirname(fromTranslatedFile), toTargetFile);
99
+ if (!rel.startsWith(".") && !path.isAbsolute(rel)) {
100
+ rel = `./${rel}`;
101
+ }
102
+ return rel.split(path.sep).join("/");
103
+ }
104
+ /** Ordered locale rows for the language switcher (manifest order when `ui-languages.json` is available). */
105
+ export function buildLanguageSwitcherRows(config, cwd) {
106
+ const abs = resolveUiLanguagesAbsPath(config, cwd);
107
+ if (abs && fs.existsSync(abs)) {
108
+ const entries = loadUiLanguageEntries(abs);
109
+ return entries.map((e) => ({
110
+ code: normalizeLocale(e.code),
111
+ label: (e.label && e.label.trim()) || e.englishName.trim(),
112
+ }));
113
+ }
114
+ const src = normalizeLocale(config.sourceLocale);
115
+ const names = config.localeDisplayNames ?? {};
116
+ const doc = config.documentation.targetLocales;
117
+ const useDoc = Array.isArray(doc) && doc.length > 0;
118
+ const rawList = useDoc ? doc : config.targetLocales;
119
+ const targets = [...new Set(rawList.map((l) => normalizeLocale(l)))].filter((c) => c !== src);
120
+ targets.sort();
121
+ const rows = [{ code: src, label: names[src] ?? src }];
122
+ for (const t of targets) {
123
+ rows.push({ code: t, label: names[t] ?? t });
124
+ }
125
+ return rows;
126
+ }
127
+ function generateCanonicalLanguageListBlock(rows, cfg, absCurrentFile, relPath, cwd, config, sourceLocale) {
128
+ const srcNorm = normalizeLocale(sourceLocale);
129
+ const parts = [];
130
+ for (const { code, label } of rows) {
131
+ const c = normalizeLocale(code);
132
+ const absTarget = c === srcNorm
133
+ ? path.join(cwd, relPath)
134
+ : resolveDocumentationOutputPath(config, cwd, c, relPath, "markdown");
135
+ const href = markdownRelativeHref(absCurrentFile, absTarget);
136
+ parts.push(`[${label}](${href})`);
137
+ }
138
+ return `${cfg.start}${parts.join(cfg.separator)}${cfg.end}`;
139
+ }
140
+ function applyLanguageListBlockToBody(body, args) {
141
+ const langCfg = args.config.documentation.markdownOutput.postProcessing?.languageListBlock;
142
+ if (!langCfg)
143
+ return body;
144
+ const rows = buildLanguageSwitcherRows(args.config, args.cwd);
145
+ if (rows.length === 0)
146
+ return body;
147
+ const canonical = generateCanonicalLanguageListBlock(rows, langCfg, args.absCurrentFile, args.relPath, args.cwd, args.config, args.config.sourceLocale);
148
+ const { body: nextBody, replaced } = replaceLanguageListBlockInBody(body, langCfg, canonical);
149
+ if (!replaced && args.verbose) {
150
+ const target = args.missingBlockTarget ?? "translated output";
151
+ console.warn(chalk.yellow(` ${args.docStem}: ${target} had no language-list block (${langCfg.start}…${langCfg.end}); lang-list not replaced`));
152
+ }
153
+ return nextBody;
154
+ }
155
+ export function applyRegexAdjustmentsToBody(body, rules, vars, verbose, docStem) {
156
+ if (!rules.length)
157
+ return body;
158
+ let out = body;
159
+ for (let i = 0; i < rules.length; i++) {
160
+ const rule = rules[i];
161
+ const name = rule.description?.trim() || `rule ${i + 1}`;
162
+ try {
163
+ const re = parseAdjustmentSearchToRegExp(rule.search);
164
+ const replacement = interpolateAdjustmentTemplate(rule.replace, vars);
165
+ out = out.replace(re, () => replacement);
166
+ }
167
+ catch (e) {
168
+ if (verbose) {
169
+ console.warn(chalk.yellow(` ${docStem}: markdownOutput.postProcessing.regexAdjustments "${name}" skipped (invalid regex): ${e}`));
170
+ }
171
+ }
172
+ }
173
+ return out;
174
+ }
175
+ /**
176
+ * Post-process translated markdown: optional regex replacements, then optional language-list block rewrite.
177
+ * Operates on YAML body only (front matter preserved).
178
+ */
179
+ export function applyMarkdownPostProcessing(markdown, args) {
180
+ const post = args.config.documentation.markdownOutput.postProcessing;
181
+ if (!post)
182
+ return markdown;
183
+ const rules = post.regexAdjustments ?? [];
184
+ const langCfg = post.languageListBlock;
185
+ if (rules.length === 0 && !langCfg)
186
+ return markdown;
187
+ const parsed = matter(markdown);
188
+ let body = typeof parsed.content === "string" ? parsed.content : String(parsed.content);
189
+ const vars = buildMarkdownAdjustmentVars(args.absSource, args.absTranslated, args.config.sourceLocale, args.locale);
190
+ if (rules.length > 0) {
191
+ body = applyRegexAdjustmentsToBody(body, rules, vars, args.verbose, args.docStem);
192
+ }
193
+ if (langCfg) {
194
+ body = applyLanguageListBlockToBody(body, {
195
+ config: args.config,
196
+ cwd: args.cwd,
197
+ relPath: args.relPath,
198
+ absCurrentFile: args.absTranslated,
199
+ verbose: args.verbose,
200
+ docStem: args.docStem,
201
+ missingBlockTarget: "translated output",
202
+ });
203
+ }
204
+ return matterStringify(body, parsed.data);
205
+ }
206
+ export function applyMarkdownLanguageListPostProcessing(markdown, args) {
207
+ const langCfg = args.config.documentation.markdownOutput.postProcessing?.languageListBlock;
208
+ if (!langCfg)
209
+ return markdown;
210
+ const parsed = matter(markdown);
211
+ const body = typeof parsed.content === "string" ? parsed.content : String(parsed.content);
212
+ const nextBody = applyLanguageListBlockToBody(body, args);
213
+ return matterStringify(nextBody, parsed.data);
214
+ }
215
+ //# sourceMappingURL=doc-postprocess.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doc-postprocess.js","sourceRoot":"","sources":["../../src/processors/doc-postprocess.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export interface ProtectedEmphasisResult {
2
+ protected: string;
3
+ }
4
+ export declare function protectMarkdownEmphasis(text: string): ProtectedEmphasisResult;
5
+ export declare function restoreMarkdownEmphasis(text: string): string;
6
+ //# sourceMappingURL=emphasis-placeholders.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emphasis-placeholders.d.ts","sourceRoot":"","sources":["../../src/processors/emphasis-placeholders.ts"],"names":[],"mappings":"AAsBA,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,MAAM,CAAC;CACnB;AA6LD,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,uBAAuB,CAsD7E;AA2BD,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAgC5D"}
@@ -0,0 +1,262 @@
1
+ const ITALIC_ASTERISK_PLACEHOLDER = "{{IT}}";
2
+ const ITALIC_UNDERSCORE_PLACEHOLDER = "{{IU}}";
3
+ const STRONG_ASTERISK_PLACEHOLDER = "{{SE}}";
4
+ const STRONG_UNDERSCORE_PLACEHOLDER = "{{SU}}";
5
+ const STRIKETHROUGH_PLACEHOLDER = "{{ST}}";
6
+ function isWhiteSpace(ch) {
7
+ return ch === "" || /\s/u.test(ch);
8
+ }
9
+ function isPunctuation(ch) {
10
+ return ch !== "" && /[^\p{L}\p{N}\s]/u.test(ch);
11
+ }
12
+ function readRun(text, start, marker) {
13
+ let i = start;
14
+ while (i < text.length && text[i] === marker) {
15
+ i++;
16
+ }
17
+ return i - start;
18
+ }
19
+ function isEscaped(text, index) {
20
+ let slashCount = 0;
21
+ for (let i = index - 1; i >= 0 && text[i] === "\\"; i--) {
22
+ slashCount++;
23
+ }
24
+ return slashCount % 2 === 1;
25
+ }
26
+ function scanDelimiters(text, start, marker) {
27
+ const count = readRun(text, start, marker);
28
+ const prevChar = start > 0 ? text[start - 1] : "\n";
29
+ const nextIndex = start + count;
30
+ const nextChar = nextIndex < text.length ? text[nextIndex] : "\n";
31
+ const prevWhite = isWhiteSpace(prevChar);
32
+ const nextWhite = isWhiteSpace(nextChar);
33
+ const prevPunct = isPunctuation(prevChar);
34
+ const nextPunct = isPunctuation(nextChar);
35
+ const leftFlanking = !nextWhite && (!nextPunct || prevWhite || prevPunct);
36
+ const rightFlanking = !prevWhite && (!prevPunct || nextWhite || nextPunct);
37
+ if (marker === "_") {
38
+ return {
39
+ count,
40
+ canOpen: leftFlanking && (!rightFlanking || prevPunct),
41
+ canClose: rightFlanking && (!leftFlanking || nextPunct),
42
+ };
43
+ }
44
+ if (marker === "~") {
45
+ return {
46
+ count,
47
+ canOpen: leftFlanking && count >= 2,
48
+ canClose: rightFlanking && count >= 2,
49
+ };
50
+ }
51
+ return {
52
+ count,
53
+ canOpen: leftFlanking,
54
+ canClose: rightFlanking,
55
+ };
56
+ }
57
+ function findPlaceholderEnd(text, start) {
58
+ if (text[start] !== "{" || text[start + 1] !== "{") {
59
+ return -1;
60
+ }
61
+ let i = start + 2;
62
+ while (i < text.length - 1) {
63
+ if (text[i] === "}" && text[i + 1] === "}") {
64
+ return i + 2;
65
+ }
66
+ i++;
67
+ }
68
+ return -1;
69
+ }
70
+ function findCodeSpanEnd(text, tickStart, tickCount) {
71
+ let i = tickStart + tickCount;
72
+ while (i < text.length) {
73
+ if (text[i] !== "`") {
74
+ i++;
75
+ continue;
76
+ }
77
+ const run = readRun(text, i, "`");
78
+ if (run === tickCount) {
79
+ return i + tickCount;
80
+ }
81
+ i += run;
82
+ }
83
+ return -1;
84
+ }
85
+ function collectDelimiterRuns(text) {
86
+ const runs = [];
87
+ let i = 0;
88
+ while (i < text.length) {
89
+ const ch = text[i];
90
+ if (ch === "{" && text[i + 1] === "{") {
91
+ const end = findPlaceholderEnd(text, i);
92
+ if (end !== -1) {
93
+ i = end;
94
+ continue;
95
+ }
96
+ }
97
+ if (ch === "`") {
98
+ const tickCount = readRun(text, i, "`");
99
+ const end = findCodeSpanEnd(text, i, tickCount);
100
+ if (end !== -1) {
101
+ i = end;
102
+ }
103
+ else {
104
+ i += tickCount;
105
+ }
106
+ continue;
107
+ }
108
+ if ((ch === "*" || ch === "_" || ch === "~") && !isEscaped(text, i)) {
109
+ const marker = ch;
110
+ const scan = scanDelimiters(text, i, marker);
111
+ if (scan.count > 0 && (scan.canOpen || scan.canClose)) {
112
+ runs.push({
113
+ marker,
114
+ start: i,
115
+ count: scan.count,
116
+ canOpen: scan.canOpen,
117
+ canClose: scan.canClose,
118
+ openerUsed: 0,
119
+ closerUsed: 0,
120
+ });
121
+ }
122
+ i += scan.count || 1;
123
+ continue;
124
+ }
125
+ i++;
126
+ }
127
+ return runs;
128
+ }
129
+ function nextUseLength(openRun, closeRun) {
130
+ if (openRun.marker === "~" || closeRun.marker === "~") {
131
+ return 2;
132
+ }
133
+ const openAvail = openRun.count - openRun.openerUsed;
134
+ const closeAvail = closeRun.count - closeRun.closerUsed;
135
+ return openAvail >= 2 && closeAvail >= 2 ? 2 : 1;
136
+ }
137
+ function placeholderFor(marker, markerRunLength) {
138
+ if (marker === "~" && markerRunLength === 2) {
139
+ return STRIKETHROUGH_PLACEHOLDER;
140
+ }
141
+ if (marker === "*" && markerRunLength === 2) {
142
+ return STRONG_ASTERISK_PLACEHOLDER;
143
+ }
144
+ if (marker === "_" && markerRunLength === 2) {
145
+ return STRONG_UNDERSCORE_PLACEHOLDER;
146
+ }
147
+ if (marker === "*") {
148
+ return ITALIC_ASTERISK_PLACEHOLDER;
149
+ }
150
+ return ITALIC_UNDERSCORE_PLACEHOLDER;
151
+ }
152
+ function buildProtectedText(source, replacements) {
153
+ if (replacements.length === 0) {
154
+ return source;
155
+ }
156
+ const ordered = [...replacements].sort((a, b) => a.start - b.start);
157
+ const out = [];
158
+ let cursor = 0;
159
+ for (const r of ordered) {
160
+ if (r.start < cursor) {
161
+ continue;
162
+ }
163
+ out.push(source.slice(cursor, r.start));
164
+ out.push(r.placeholder);
165
+ cursor = r.end;
166
+ }
167
+ out.push(source.slice(cursor));
168
+ return out.join("");
169
+ }
170
+ export function protectMarkdownEmphasis(text) {
171
+ const replacements = [];
172
+ const runs = collectDelimiterRuns(text);
173
+ for (let closerIndex = 0; closerIndex < runs.length; closerIndex++) {
174
+ const closer = runs[closerIndex];
175
+ if (!closer.canClose) {
176
+ continue;
177
+ }
178
+ for (let openerIndex = closerIndex - 1; openerIndex >= 0; openerIndex--) {
179
+ const opener = runs[openerIndex];
180
+ if (opener.marker !== closer.marker || !opener.canOpen) {
181
+ continue;
182
+ }
183
+ while (true) {
184
+ const openerAvail = opener.count - opener.openerUsed;
185
+ const closerAvail = closer.count - closer.closerUsed;
186
+ if (openerAvail <= 0 || closerAvail <= 0) {
187
+ break;
188
+ }
189
+ if (opener.marker === "~" && (openerAvail < 2 || closerAvail < 2)) {
190
+ break;
191
+ }
192
+ const useLen = nextUseLength(opener, closer);
193
+ const openerStart = opener.start + opener.openerUsed;
194
+ const closerStart = closer.start + closer.count - closer.closerUsed - useLen;
195
+ replacements.push({
196
+ start: openerStart,
197
+ end: openerStart + useLen,
198
+ placeholder: placeholderFor(opener.marker, useLen),
199
+ });
200
+ replacements.push({
201
+ start: closerStart,
202
+ end: closerStart + useLen,
203
+ placeholder: placeholderFor(closer.marker, useLen),
204
+ });
205
+ opener.openerUsed += useLen;
206
+ closer.closerUsed += useLen;
207
+ }
208
+ if (closer.count - closer.closerUsed <= 0) {
209
+ break;
210
+ }
211
+ }
212
+ }
213
+ return {
214
+ protected: buildProtectedText(text, replacements),
215
+ };
216
+ }
217
+ const RESTORE_RULES = [
218
+ { placeholder: STRONG_ASTERISK_PLACEHOLDER, marker: "**" },
219
+ { placeholder: STRONG_UNDERSCORE_PLACEHOLDER, marker: "__" },
220
+ { placeholder: ITALIC_ASTERISK_PLACEHOLDER, marker: "*" },
221
+ { placeholder: ITALIC_UNDERSCORE_PLACEHOLDER, marker: "_" },
222
+ { placeholder: STRIKETHROUGH_PLACEHOLDER, marker: "~~" },
223
+ ];
224
+ /**
225
+ * CommonMark right-flanking fix: when a restored emphasis delimiter is likely
226
+ * a closer (preceded by a letter, digit, or `}` from another placeholder) and
227
+ * the next character is a Unicode letter (CJK particle, etc.), insert a space
228
+ * so the delimiter satisfies the right-flanking rule.
229
+ *
230
+ * Openers are preceded by whitespace, start-of-string, or punctuation like
231
+ * `;` `(` `>` — those are left untouched so they remain left-flanking.
232
+ */
233
+ const UNICODE_LETTER = /\p{L}/u;
234
+ const LIKELY_CLOSER_PREV = /[\p{L}\p{N}}]/u;
235
+ export function restoreMarkdownEmphasis(text) {
236
+ const out = [];
237
+ let i = 0;
238
+ while (i < text.length) {
239
+ let matched = false;
240
+ for (const rule of RESTORE_RULES) {
241
+ if (text.startsWith(rule.placeholder, i)) {
242
+ const prevChar = out.length > 0 ? out[out.length - 1] : "";
243
+ const nextChar = text[i + rule.placeholder.length] ?? "";
244
+ const likelyCloser = LIKELY_CLOSER_PREV.test(prevChar);
245
+ out.push(rule.marker);
246
+ if (likelyCloser && UNICODE_LETTER.test(nextChar)) {
247
+ out.push(" ");
248
+ }
249
+ i += rule.placeholder.length;
250
+ matched = true;
251
+ break;
252
+ }
253
+ }
254
+ if (matched) {
255
+ continue;
256
+ }
257
+ out.push(text[i]);
258
+ i++;
259
+ }
260
+ return out.join("");
261
+ }
262
+ //# sourceMappingURL=emphasis-placeholders.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emphasis-placeholders.js","sourceRoot":"","sources":["../../src/processors/emphasis-placeholders.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import type { I18nDocTranslateConfig } from "../core/types.js";
2
+ /**
3
+ * Normalized posix cwd-relative path for markdown source files (for set membership and comparisons).
4
+ * Treats backslashes as separators so Windows-style paths match on any OS.
5
+ */
6
+ export declare function normalizeMarkdownRelPath(relPath: string): string;
7
+ /**
8
+ * Context for rewriting relative links in flat markdown outputs using resolved source paths
9
+ * and {@link resolveDocumentationOutputPath} as the layout source of truth.
10
+ */
11
+ export interface FlatLinkRewriteContext {
12
+ cwd: string;
13
+ config: I18nDocTranslateConfig;
14
+ /** Normalized posix cwd-relative path of the file being translated */
15
+ currentSourceRelPath: string;
16
+ /** Normalized posix paths of all markdown sources in this documentation batch */
17
+ translatedMarkdownRelPaths: ReadonlySet<string>;
18
+ }
19
+ /**
20
+ * Rewrite one relative URL for flat markdown output (used by tests and {@link rewriteDocLinksForFlatOutput}).
21
+ */
22
+ export declare function rewriteOneRelativePathForFlatOutput(pathOnly: string, query: string, fragment: string, locale: string, i18nPrefix: string, depthPrefix: string, ctx: FlatLinkRewriteContext): string;
23
+ /**
24
+ * Rewrite `](url)` and `src="..."` in translated markdown for flat doc outputs.
25
+ */
26
+ export declare function rewriteDocLinksForFlatOutput(body: string, locale: string, i18nPrefix: string, depthPrefix: string, ctx: FlatLinkRewriteContext): string;
27
+ /** Compute `i18nPrefix` (POSIX) and `depthPrefix` from cwd-relative roots. */
28
+ export declare function computeFlatLinkRewritePrefixes(cwd: string, linkRewriteDocsRoot: string, documentationOutputDir: string): {
29
+ i18nPrefix: string;
30
+ depthPrefix: string;
31
+ };
32
+ //# sourceMappingURL=flat-link-rewrite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flat-link-rewrite.d.ts","sourceRoot":"","sources":["../../src/processors/flat-link-rewrite.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAG/D;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAGhE;AAED;;;GAGG;AACH,MAAM,WAAW,sBAAsB;IACrC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,sBAAsB,CAAC;IAC/B,sEAAsE;IACtE,oBAAoB,EAAE,MAAM,CAAC;IAC7B,iFAAiF;IACjF,0BAA0B,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CACjD;AAWD;;GAEG;AACH,wBAAgB,mCAAmC,CACjD,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,sBAAsB,GAC1B,MAAM,CAiCR;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,sBAAsB,GAC1B,MAAM,CA2CR;AAED,8EAA8E;AAC9E,wBAAgB,8BAA8B,CAC5C,GAAG,EAAE,MAAM,EACX,mBAAmB,EAAE,MAAM,EAC3B,sBAAsB,EAAE,MAAM,GAC7B;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAQ7C"}
@@ -0,0 +1,90 @@
1
+ import path from "path";
2
+ import { resolveDocumentationOutputPath, toPosix } from "../core/output-paths.js";
3
+ /**
4
+ * Normalized posix cwd-relative path for markdown source files (for set membership and comparisons).
5
+ * Treats backslashes as separators so Windows-style paths match on any OS.
6
+ */
7
+ export function normalizeMarkdownRelPath(relPath) {
8
+ const withSlash = toPosix(relPath).replace(/\\/g, "/");
9
+ return path.posix.normalize(withSlash);
10
+ }
11
+ function resolveRelativeMarkdownTarget(normalizedCurrentSourceRelPath, pathTrim) {
12
+ return path.posix.normalize(path.posix.join(path.posix.dirname(normalizedCurrentSourceRelPath), pathTrim));
13
+ }
14
+ /**
15
+ * Rewrite one relative URL for flat markdown output (used by tests and {@link rewriteDocLinksForFlatOutput}).
16
+ */
17
+ export function rewriteOneRelativePathForFlatOutput(pathOnly, query, fragment, locale, i18nPrefix, depthPrefix, ctx) {
18
+ const pathTrim = pathOnly.replace(/^\.\//u, "").trim();
19
+ if (!pathTrim)
20
+ return `${pathOnly}${query}${fragment}`;
21
+ let rest = pathTrim;
22
+ const prefixWithSlash = i18nPrefix ? `${i18nPrefix}/` : "";
23
+ if (prefixWithSlash && rest.startsWith(prefixWithSlash)) {
24
+ rest = rest.slice(prefixWithSlash.length);
25
+ return `${rest}${query}${fragment}`;
26
+ }
27
+ const normalizedCurrent = normalizeMarkdownRelPath(ctx.currentSourceRelPath);
28
+ const resolved = resolveRelativeMarkdownTarget(normalizedCurrent, rest);
29
+ if (resolved === normalizedCurrent) {
30
+ const base = path.posix.basename(rest);
31
+ return `${depthPrefix}${base}${query}${fragment}`;
32
+ }
33
+ if (ctx.translatedMarkdownRelPaths.has(resolved)) {
34
+ const fromAbs = resolveDocumentationOutputPath(ctx.config, ctx.cwd, locale, normalizedCurrent, "markdown");
35
+ const toAbs = resolveDocumentationOutputPath(ctx.config, ctx.cwd, locale, resolved, "markdown");
36
+ const rel = toPosix(path.relative(path.dirname(fromAbs), toAbs));
37
+ return `${rel}${query}${fragment}`;
38
+ }
39
+ return `${depthPrefix}${rest}${query}${fragment}`;
40
+ }
41
+ /**
42
+ * Rewrite `](url)` and `src="..."` in translated markdown for flat doc outputs.
43
+ */
44
+ export function rewriteDocLinksForFlatOutput(body, locale, i18nPrefix, depthPrefix, ctx) {
45
+ const rewriteUrl = (trimmed) => {
46
+ if (!trimmed)
47
+ return trimmed;
48
+ if (/^#/u.test(trimmed))
49
+ return trimmed;
50
+ if (/^(?:https?:|mailto:)/iu.test(trimmed))
51
+ return trimmed;
52
+ if (trimmed.startsWith("//"))
53
+ return trimmed;
54
+ const hashIdx = trimmed.indexOf("#");
55
+ const pathQuery = hashIdx >= 0 ? trimmed.slice(0, hashIdx) : trimmed;
56
+ const fragment = hashIdx >= 0 ? trimmed.slice(hashIdx) : "";
57
+ const qIdx = pathQuery.indexOf("?");
58
+ const pathOnly = qIdx >= 0 ? pathQuery.slice(0, qIdx) : pathQuery;
59
+ const query = qIdx >= 0 ? pathQuery.slice(qIdx) : "";
60
+ if (!pathOnly)
61
+ return trimmed;
62
+ if (/^[a-zA-Z]:[\\/]/u.test(pathOnly))
63
+ return trimmed;
64
+ const newPath = rewriteOneRelativePathForFlatOutput(pathOnly, query, fragment, locale, i18nPrefix, depthPrefix, ctx);
65
+ return newPath;
66
+ };
67
+ let out = body.replace(/\[[^\]]*\]\(([^)]+)\)/g, (full) => {
68
+ const sep = full.indexOf("](");
69
+ if (sep === -1)
70
+ return full;
71
+ const textPart = full.slice(0, sep + 1);
72
+ const rawUrl = full.slice(sep + 2, -1);
73
+ return `${textPart}(${rewriteUrl(rawUrl.trim())})`;
74
+ });
75
+ out = out.replace(/src="([^"]*)"/g, (_full, url) => {
76
+ return `src="${rewriteUrl(url.trim())}"`;
77
+ });
78
+ return out;
79
+ }
80
+ /** Compute `i18nPrefix` (POSIX) and `depthPrefix` from cwd-relative roots. */
81
+ export function computeFlatLinkRewritePrefixes(cwd, linkRewriteDocsRoot, documentationOutputDir) {
82
+ const docsAbs = path.resolve(cwd, linkRewriteDocsRoot);
83
+ const outAbs = path.resolve(cwd, documentationOutputDir);
84
+ const i18nRel = path.relative(docsAbs, outAbs);
85
+ const i18nPrefix = i18nRel.split(path.sep).join("/");
86
+ const depth = i18nPrefix === "" ? 0 : i18nPrefix.split("/").filter(Boolean).length;
87
+ const depthPrefix = "../".repeat(depth);
88
+ return { i18nPrefix, depthPrefix };
89
+ }
90
+ //# sourceMappingURL=flat-link-rewrite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flat-link-rewrite.js","sourceRoot":"","sources":["../../src/processors/flat-link-rewrite.ts"],"names":[],"mappings":"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"}