docrev 0.9.11 → 0.9.14

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 (138) hide show
  1. package/.claude/settings.local.json +9 -9
  2. package/.gitattributes +1 -1
  3. package/CHANGELOG.md +149 -149
  4. package/PLAN-tables-and-postprocess.md +850 -850
  5. package/README.md +391 -391
  6. package/bin/rev.js +11 -11
  7. package/bin/rev.ts +145 -145
  8. package/completions/rev.bash +127 -127
  9. package/completions/rev.ps1 +210 -210
  10. package/completions/rev.zsh +207 -207
  11. package/dev_notes/stress2/build_adversarial.ts +186 -186
  12. package/dev_notes/stress2/drift_matcher.ts +62 -62
  13. package/dev_notes/stress2/probe_anchors.ts +35 -35
  14. package/dev_notes/stress2/project/discussion.before.md +3 -3
  15. package/dev_notes/stress2/project/discussion.md +3 -3
  16. package/dev_notes/stress2/project/methods.before.md +20 -20
  17. package/dev_notes/stress2/project/methods.md +20 -20
  18. package/dev_notes/stress2/project/rev.yaml +5 -5
  19. package/dev_notes/stress2/project/sections.yaml +4 -4
  20. package/dev_notes/stress2/sections.yaml +5 -5
  21. package/dev_notes/stress2/trace_placement.ts +50 -50
  22. package/dev_notes/stresstest_boundaries.ts +27 -27
  23. package/dev_notes/stresstest_drift_apply.ts +43 -43
  24. package/dev_notes/stresstest_drift_compare.ts +43 -43
  25. package/dev_notes/stresstest_drift_v2.ts +54 -54
  26. package/dev_notes/stresstest_inspect.ts +54 -54
  27. package/dev_notes/stresstest_pstyle.ts +55 -55
  28. package/dev_notes/stresstest_section_debug.ts +23 -23
  29. package/dev_notes/stresstest_split.ts +70 -70
  30. package/dev_notes/stresstest_trace.ts +19 -19
  31. package/dev_notes/stresstest_verify_no_overwrite.ts +40 -40
  32. package/dist/lib/build.d.ts +50 -1
  33. package/dist/lib/build.d.ts.map +1 -1
  34. package/dist/lib/build.js +80 -30
  35. package/dist/lib/build.js.map +1 -1
  36. package/dist/lib/commands/build.d.ts.map +1 -1
  37. package/dist/lib/commands/build.js +38 -5
  38. package/dist/lib/commands/build.js.map +1 -1
  39. package/dist/lib/commands/utilities.js +164 -164
  40. package/dist/lib/commands/word-tools.js +8 -8
  41. package/dist/lib/grammar.js +3 -3
  42. package/dist/lib/import.d.ts.map +1 -1
  43. package/dist/lib/import.js +146 -24
  44. package/dist/lib/import.js.map +1 -1
  45. package/dist/lib/pdf-comments.js +44 -44
  46. package/dist/lib/plugins.js +57 -57
  47. package/dist/lib/pptx-themes.js +115 -115
  48. package/dist/lib/spelling.js +2 -2
  49. package/dist/lib/templates.js +387 -387
  50. package/dist/lib/themes.js +51 -51
  51. package/dist/lib/types.d.ts +20 -0
  52. package/dist/lib/types.d.ts.map +1 -1
  53. package/dist/lib/word-extraction.d.ts +6 -0
  54. package/dist/lib/word-extraction.d.ts.map +1 -1
  55. package/dist/lib/word-extraction.js +46 -3
  56. package/dist/lib/word-extraction.js.map +1 -1
  57. package/dist/lib/wordcomments.d.ts.map +1 -1
  58. package/dist/lib/wordcomments.js +23 -5
  59. package/dist/lib/wordcomments.js.map +1 -1
  60. package/eslint.config.js +27 -27
  61. package/lib/anchor-match.ts +276 -276
  62. package/lib/annotations.ts +644 -644
  63. package/lib/build.ts +1300 -1227
  64. package/lib/citations.ts +160 -160
  65. package/lib/commands/build.ts +833 -801
  66. package/lib/commands/citations.ts +515 -515
  67. package/lib/commands/comments.ts +1050 -1050
  68. package/lib/commands/context.ts +174 -174
  69. package/lib/commands/core.ts +309 -309
  70. package/lib/commands/doi.ts +435 -435
  71. package/lib/commands/file-ops.ts +372 -372
  72. package/lib/commands/history.ts +320 -320
  73. package/lib/commands/index.ts +87 -87
  74. package/lib/commands/init.ts +259 -259
  75. package/lib/commands/merge-resolve.ts +378 -378
  76. package/lib/commands/preview.ts +178 -178
  77. package/lib/commands/project-info.ts +244 -244
  78. package/lib/commands/quality.ts +517 -517
  79. package/lib/commands/response.ts +454 -454
  80. package/lib/commands/section-boundaries.ts +82 -82
  81. package/lib/commands/sections.ts +451 -451
  82. package/lib/commands/sync.ts +706 -706
  83. package/lib/commands/text-ops.ts +449 -449
  84. package/lib/commands/utilities.ts +448 -448
  85. package/lib/commands/verify-anchors.ts +272 -272
  86. package/lib/commands/word-tools.ts +340 -340
  87. package/lib/comment-realign.ts +517 -517
  88. package/lib/config.ts +84 -84
  89. package/lib/crossref.ts +781 -781
  90. package/lib/csl.ts +191 -191
  91. package/lib/dependencies.ts +98 -98
  92. package/lib/diff-engine.ts +465 -465
  93. package/lib/doi-cache.ts +115 -115
  94. package/lib/doi.ts +897 -897
  95. package/lib/equations.ts +506 -506
  96. package/lib/errors.ts +346 -346
  97. package/lib/format.ts +541 -541
  98. package/lib/git.ts +326 -326
  99. package/lib/grammar.ts +303 -303
  100. package/lib/image-registry.ts +180 -180
  101. package/lib/import.ts +911 -792
  102. package/lib/journals.ts +543 -543
  103. package/lib/merge.ts +633 -633
  104. package/lib/orcid.ts +144 -144
  105. package/lib/pdf-comments.ts +263 -263
  106. package/lib/pdf-import.ts +524 -524
  107. package/lib/plugins.ts +362 -362
  108. package/lib/postprocess.ts +188 -188
  109. package/lib/pptx-color-filter.lua +37 -37
  110. package/lib/pptx-template.ts +469 -469
  111. package/lib/pptx-themes.ts +483 -483
  112. package/lib/protect-restore.ts +520 -520
  113. package/lib/rate-limiter.ts +94 -94
  114. package/lib/response.ts +197 -197
  115. package/lib/restore-references.ts +240 -240
  116. package/lib/review.ts +327 -327
  117. package/lib/schema.ts +417 -417
  118. package/lib/scientific-words.ts +73 -73
  119. package/lib/sections.ts +335 -335
  120. package/lib/slides.ts +756 -756
  121. package/lib/spelling.ts +334 -334
  122. package/lib/templates.ts +526 -526
  123. package/lib/themes.ts +742 -742
  124. package/lib/trackchanges.ts +247 -247
  125. package/lib/tui.ts +450 -450
  126. package/lib/types.ts +550 -530
  127. package/lib/undo.ts +250 -250
  128. package/lib/utils.ts +69 -69
  129. package/lib/variables.ts +179 -179
  130. package/lib/word-extraction.ts +806 -759
  131. package/lib/word.ts +643 -643
  132. package/lib/wordcomments.ts +817 -798
  133. package/package.json +137 -137
  134. package/scripts/postbuild.js +28 -28
  135. package/skill/REFERENCE.md +431 -431
  136. package/skill/SKILL.md +258 -258
  137. package/tsconfig.json +26 -26
  138. package/types/index.d.ts +525 -525
@@ -1,55 +1,55 @@
1
- // Inspect the document.xml paragraph styles to find true headings.
2
- import AdmZip from 'adm-zip';
3
- import * as fs from 'fs';
4
-
5
- const docx = 'C:/GillesC/tmp/docrev-stress/reviewed.docx';
6
- const zip = new AdmZip(docx);
7
- const xml = zip.getEntry('word/document.xml')!.getData().toString('utf8');
8
-
9
- // Build text-position map from <w:t> runs the same way extractCommentAnchors does
10
- const textNodePattern = /<w:t[^>]*>([^<]*)<\/w:t>/g;
11
- const textNodes: Array<{ xmlStart: number; xmlEnd: number; textStart: number; textEnd: number; text: string }> = [];
12
- let textPosition = 0;
13
- let m;
14
- function decode(s: string): string {
15
- return s.replace(/&amp;/g, '&').replace(/&lt;/g, '<').replace(/&gt;/g, '>').replace(/&quot;/g, '"').replace(/&apos;/g, "'");
16
- }
17
- while ((m = textNodePattern.exec(xml)) !== null) {
18
- const decoded = decode(m[1]);
19
- textNodes.push({ xmlStart: m.index, xmlEnd: m.index + m[0].length, textStart: textPosition, textEnd: textPosition + decoded.length, text: decoded });
20
- textPosition += decoded.length;
21
- }
22
-
23
- function xmlToText(xmlPos: number): number {
24
- for (const n of textNodes) {
25
- if (xmlPos >= n.xmlStart && xmlPos < n.xmlEnd) return n.textStart;
26
- if (xmlPos < n.xmlStart) return n.textStart;
27
- }
28
- return textNodes.length ? textNodes[textNodes.length - 1].textEnd : 0;
29
- }
30
-
31
- // Now walk paragraphs; each <w:p ...>...</w:p>. Inside, find <w:pStyle w:val="..."/> if present, and concatenate text runs.
32
- const paraPattern = /<w:p\b[^>]*>([\s\S]*?)<\/w:p>/g;
33
- const headings: Array<{ style: string; text: string; xmlStart: number; textPos: number }> = [];
34
- let pm;
35
- while ((pm = paraPattern.exec(xml)) !== null) {
36
- const inner = pm[1];
37
- const styleMatch = inner.match(/<w:pStyle[^>]*w:val="([^"]+)"/);
38
- if (!styleMatch) continue;
39
- const style = styleMatch[1];
40
- if (!/heading/i.test(style)) continue;
41
- // Extract text from runs
42
- const textInRange = /<w:t[^>]*>([^<]*)<\/w:t>/g;
43
- let txt = '';
44
- let tm;
45
- while ((tm = textInRange.exec(inner)) !== null) txt += decode(tm[1]);
46
- if (!txt.trim()) continue;
47
- const xmlStart = pm.index;
48
- const textPos = xmlToText(xmlStart);
49
- headings.push({ style, text: txt.trim(), xmlStart, textPos });
50
- }
51
-
52
- console.log(`Found ${headings.length} heading paragraphs:`);
53
- for (const h of headings) {
54
- console.log(` [${h.style.padEnd(8)}] textPos=${String(h.textPos).padStart(6)} "${h.text.slice(0, 60)}"`);
55
- }
1
+ // Inspect the document.xml paragraph styles to find true headings.
2
+ import AdmZip from 'adm-zip';
3
+ import * as fs from 'fs';
4
+
5
+ const docx = 'C:/GillesC/tmp/docrev-stress/reviewed.docx';
6
+ const zip = new AdmZip(docx);
7
+ const xml = zip.getEntry('word/document.xml')!.getData().toString('utf8');
8
+
9
+ // Build text-position map from <w:t> runs the same way extractCommentAnchors does
10
+ const textNodePattern = /<w:t[^>]*>([^<]*)<\/w:t>/g;
11
+ const textNodes: Array<{ xmlStart: number; xmlEnd: number; textStart: number; textEnd: number; text: string }> = [];
12
+ let textPosition = 0;
13
+ let m;
14
+ function decode(s: string): string {
15
+ return s.replace(/&amp;/g, '&').replace(/&lt;/g, '<').replace(/&gt;/g, '>').replace(/&quot;/g, '"').replace(/&apos;/g, "'");
16
+ }
17
+ while ((m = textNodePattern.exec(xml)) !== null) {
18
+ const decoded = decode(m[1]);
19
+ textNodes.push({ xmlStart: m.index, xmlEnd: m.index + m[0].length, textStart: textPosition, textEnd: textPosition + decoded.length, text: decoded });
20
+ textPosition += decoded.length;
21
+ }
22
+
23
+ function xmlToText(xmlPos: number): number {
24
+ for (const n of textNodes) {
25
+ if (xmlPos >= n.xmlStart && xmlPos < n.xmlEnd) return n.textStart;
26
+ if (xmlPos < n.xmlStart) return n.textStart;
27
+ }
28
+ return textNodes.length ? textNodes[textNodes.length - 1].textEnd : 0;
29
+ }
30
+
31
+ // Now walk paragraphs; each <w:p ...>...</w:p>. Inside, find <w:pStyle w:val="..."/> if present, and concatenate text runs.
32
+ const paraPattern = /<w:p\b[^>]*>([\s\S]*?)<\/w:p>/g;
33
+ const headings: Array<{ style: string; text: string; xmlStart: number; textPos: number }> = [];
34
+ let pm;
35
+ while ((pm = paraPattern.exec(xml)) !== null) {
36
+ const inner = pm[1];
37
+ const styleMatch = inner.match(/<w:pStyle[^>]*w:val="([^"]+)"/);
38
+ if (!styleMatch) continue;
39
+ const style = styleMatch[1];
40
+ if (!/heading/i.test(style)) continue;
41
+ // Extract text from runs
42
+ const textInRange = /<w:t[^>]*>([^<]*)<\/w:t>/g;
43
+ let txt = '';
44
+ let tm;
45
+ while ((tm = textInRange.exec(inner)) !== null) txt += decode(tm[1]);
46
+ if (!txt.trim()) continue;
47
+ const xmlStart = pm.index;
48
+ const textPos = xmlToText(xmlStart);
49
+ headings.push({ style, text: txt.trim(), xmlStart, textPos });
50
+ }
51
+
52
+ console.log(`Found ${headings.length} heading paragraphs:`);
53
+ for (const h of headings) {
54
+ console.log(` [${h.style.padEnd(8)}] textPos=${String(h.textPos).padStart(6)} "${h.text.slice(0, 60)}"`);
55
+ }
@@ -1,23 +1,23 @@
1
- import { extractCommentAnchors } from '../lib/import.js';
2
-
3
- const docx = 'C:/GillesC/tmp/docrev-stress/reviewed.docx';
4
- const { fullDocText } = await extractCommentAnchors(docx);
5
-
6
- const keywords = ['Abstract', 'Introduction', 'Methods', 'Results', 'Discussion', 'Conclusion', 'References'];
7
- for (const kw of keywords) {
8
- const lower = fullDocText.toLowerCase();
9
- const needle = kw.toLowerCase();
10
- const occ: Array<{ idx: number; ctx: string; afterChar: string }> = [];
11
- let idx = 0;
12
- while ((idx = lower.indexOf(needle, idx)) !== -1) {
13
- const ctx = fullDocText.slice(Math.max(0, idx - 20), idx + needle.length + 20).replace(/\s+/g, ' ');
14
- const afterChar = fullDocText.slice(idx + needle.length, idx + needle.length + 1);
15
- occ.push({ idx, ctx, afterChar });
16
- idx++;
17
- }
18
- console.log(`\n--- ${kw} (${occ.length} occurrences) ---`);
19
- for (const o of occ.slice(0, 6)) {
20
- console.log(` @${o.idx} after="${o.afterChar}" ctx: ...${o.ctx}...`);
21
- }
22
- if (occ.length > 6) console.log(` ... and ${occ.length - 6} more`);
23
- }
1
+ import { extractCommentAnchors } from '../lib/import.js';
2
+
3
+ const docx = 'C:/GillesC/tmp/docrev-stress/reviewed.docx';
4
+ const { fullDocText } = await extractCommentAnchors(docx);
5
+
6
+ const keywords = ['Abstract', 'Introduction', 'Methods', 'Results', 'Discussion', 'Conclusion', 'References'];
7
+ for (const kw of keywords) {
8
+ const lower = fullDocText.toLowerCase();
9
+ const needle = kw.toLowerCase();
10
+ const occ: Array<{ idx: number; ctx: string; afterChar: string }> = [];
11
+ let idx = 0;
12
+ while ((idx = lower.indexOf(needle, idx)) !== -1) {
13
+ const ctx = fullDocText.slice(Math.max(0, idx - 20), idx + needle.length + 20).replace(/\s+/g, ' ');
14
+ const afterChar = fullDocText.slice(idx + needle.length, idx + needle.length + 1);
15
+ occ.push({ idx, ctx, afterChar });
16
+ idx++;
17
+ }
18
+ console.log(`\n--- ${kw} (${occ.length} occurrences) ---`);
19
+ for (const o of occ.slice(0, 6)) {
20
+ console.log(` @${o.idx} after="${o.afterChar}" ctx: ...${o.ctx}...`);
21
+ }
22
+ if (occ.length > 6) console.log(` ... and ${occ.length - 6} more`);
23
+ }
@@ -1,70 +1,70 @@
1
- import * as fs from 'fs';
2
- import * as path from 'path';
3
-
4
- const ROOT = 'C:/GillesC/tmp/docrev-stress/project';
5
- fs.mkdirSync(ROOT, { recursive: true });
6
-
7
- const full = fs.readFileSync('C:/GillesC/tmp/docrev-stress/full.md', 'utf-8');
8
- const lines = full.split(/\r?\n/);
9
-
10
- interface Section { file: string; header: string; lines: string[]; }
11
-
12
- const sections: Section[] = [];
13
-
14
- // Map H1 heading text to section file
15
- const headerToFile: Record<string, string> = {
16
- 'Abstract': 'abstract.md',
17
- 'Introduction': 'introduction.md',
18
- 'Methods': 'methods.md',
19
- 'Results': 'results.md',
20
- 'Discussion': 'discussion.md',
21
- 'Conclusion': 'conclusion.md',
22
- 'References': 'references.md',
23
- 'Supplementary Materials': 'supplement.md',
24
- };
25
-
26
- let current: Section | null = null;
27
- const preambleLines: string[] = [];
28
-
29
- for (const line of lines) {
30
- const m = line.match(/^# (.+)$/);
31
- if (m && headerToFile[m[1].trim()]) {
32
- if (current) sections.push(current);
33
- current = { file: headerToFile[m[1].trim()], header: m[1].trim(), lines: [line] };
34
- } else if (current) {
35
- current.lines.push(line);
36
- } else {
37
- preambleLines.push(line);
38
- }
39
- }
40
- if (current) sections.push(current);
41
-
42
- // Write sections
43
- for (const s of sections) {
44
- const out = path.join(ROOT, s.file);
45
- fs.writeFileSync(out, s.lines.join('\n'), 'utf-8');
46
- console.log(`wrote ${out} (${s.lines.length} lines)`);
47
- }
48
-
49
- // Write sections.yaml
50
- const yaml: string[] = ['version: 1', 'sections:'];
51
- for (const s of sections) {
52
- yaml.push(` ${s.file}:`);
53
- yaml.push(` header: "${s.header}"`);
54
- yaml.push(` aliases: []`);
55
- }
56
- fs.writeFileSync(path.join(ROOT, 'sections.yaml'), yaml.join('\n') + '\n', 'utf-8');
57
- console.log(`wrote sections.yaml`);
58
-
59
- // Minimal rev.yaml so commands that look for project root don't choke
60
- const revYaml = `title: "Stress Test"
61
- authors:
62
- - name: Gilles Colling
63
- output:
64
- docx: {}
65
- pdf: {}
66
- `;
67
- fs.writeFileSync(path.join(ROOT, 'rev.yaml'), revYaml, 'utf-8');
68
-
69
- console.log();
70
- console.log(`section files: ${sections.length}`);
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+
4
+ const ROOT = 'C:/GillesC/tmp/docrev-stress/project';
5
+ fs.mkdirSync(ROOT, { recursive: true });
6
+
7
+ const full = fs.readFileSync('C:/GillesC/tmp/docrev-stress/full.md', 'utf-8');
8
+ const lines = full.split(/\r?\n/);
9
+
10
+ interface Section { file: string; header: string; lines: string[]; }
11
+
12
+ const sections: Section[] = [];
13
+
14
+ // Map H1 heading text to section file
15
+ const headerToFile: Record<string, string> = {
16
+ 'Abstract': 'abstract.md',
17
+ 'Introduction': 'introduction.md',
18
+ 'Methods': 'methods.md',
19
+ 'Results': 'results.md',
20
+ 'Discussion': 'discussion.md',
21
+ 'Conclusion': 'conclusion.md',
22
+ 'References': 'references.md',
23
+ 'Supplementary Materials': 'supplement.md',
24
+ };
25
+
26
+ let current: Section | null = null;
27
+ const preambleLines: string[] = [];
28
+
29
+ for (const line of lines) {
30
+ const m = line.match(/^# (.+)$/);
31
+ if (m && headerToFile[m[1].trim()]) {
32
+ if (current) sections.push(current);
33
+ current = { file: headerToFile[m[1].trim()], header: m[1].trim(), lines: [line] };
34
+ } else if (current) {
35
+ current.lines.push(line);
36
+ } else {
37
+ preambleLines.push(line);
38
+ }
39
+ }
40
+ if (current) sections.push(current);
41
+
42
+ // Write sections
43
+ for (const s of sections) {
44
+ const out = path.join(ROOT, s.file);
45
+ fs.writeFileSync(out, s.lines.join('\n'), 'utf-8');
46
+ console.log(`wrote ${out} (${s.lines.length} lines)`);
47
+ }
48
+
49
+ // Write sections.yaml
50
+ const yaml: string[] = ['version: 1', 'sections:'];
51
+ for (const s of sections) {
52
+ yaml.push(` ${s.file}:`);
53
+ yaml.push(` header: "${s.header}"`);
54
+ yaml.push(` aliases: []`);
55
+ }
56
+ fs.writeFileSync(path.join(ROOT, 'sections.yaml'), yaml.join('\n') + '\n', 'utf-8');
57
+ console.log(`wrote sections.yaml`);
58
+
59
+ // Minimal rev.yaml so commands that look for project root don't choke
60
+ const revYaml = `title: "Stress Test"
61
+ authors:
62
+ - name: Gilles Colling
63
+ output:
64
+ docx: {}
65
+ pdf: {}
66
+ `;
67
+ fs.writeFileSync(path.join(ROOT, 'rev.yaml'), revYaml, 'utf-8');
68
+
69
+ console.log();
70
+ console.log(`section files: ${sections.length}`);
@@ -1,19 +1,19 @@
1
- import { extractCommentAnchors } from '../lib/import.js';
2
-
3
- const docx = 'C:/GillesC/tmp/docrev-stress/reviewed.docx';
4
- const { fullDocText } = await extractCommentAnchors(docx);
5
-
6
- const needle = 'methods';
7
- const lower = fullDocText.toLowerCase();
8
- let idx = 0;
9
- const trace: Array<{idx:number, after:string, skipped:boolean}> = [];
10
- while ((idx = lower.indexOf(needle, idx)) !== -1 && trace.length < 10) {
11
- const after = fullDocText.slice(idx + needle.length, idx + needle.length + 5);
12
- const skip = after.startsWith(':') || after.startsWith(' :');
13
- trace.push({ idx, after, skipped: skip });
14
- if (!skip) break;
15
- idx++;
16
- }
17
- for (const t of trace) console.log(`idx=${t.idx} after="${t.after}" skipped=${t.skipped}`);
18
- console.log();
19
- console.log(`first non-:-prefixed Methods idx = ${trace.find(t => !t.skipped)?.idx ?? -1}`);
1
+ import { extractCommentAnchors } from '../lib/import.js';
2
+
3
+ const docx = 'C:/GillesC/tmp/docrev-stress/reviewed.docx';
4
+ const { fullDocText } = await extractCommentAnchors(docx);
5
+
6
+ const needle = 'methods';
7
+ const lower = fullDocText.toLowerCase();
8
+ let idx = 0;
9
+ const trace: Array<{idx:number, after:string, skipped:boolean}> = [];
10
+ while ((idx = lower.indexOf(needle, idx)) !== -1 && trace.length < 10) {
11
+ const after = fullDocText.slice(idx + needle.length, idx + needle.length + 5);
12
+ const skip = after.startsWith(':') || after.startsWith(' :');
13
+ trace.push({ idx, after, skipped: skip });
14
+ if (!skip) break;
15
+ idx++;
16
+ }
17
+ for (const t of trace) console.log(`idx=${t.idx} after="${t.after}" skipped=${t.skipped}`);
18
+ console.log();
19
+ console.log(`first non-:-prefixed Methods idx = ${trace.find(t => !t.skipped)?.idx ?? -1}`);
@@ -1,40 +1,40 @@
1
- // Verify sync --comments-only didn't touch existing prose, only inserted comments.
2
- import * as fs from 'fs';
3
- import { stripCriticMarkup } from '../lib/anchor-match.js';
4
-
5
- const original = 'C:/GillesC/tmp/docrev-stress/project';
6
- const synced = 'C:/GillesC/tmp/docrev-stress/project-sync';
7
- const files = ['abstract.md', 'introduction.md', 'methods.md', 'results.md', 'discussion.md', 'conclusion.md', 'references.md', 'supplement.md'];
8
-
9
- let totalComments = 0;
10
- let mismatches = 0;
11
- for (const f of files) {
12
- const orig = fs.readFileSync(`${original}/${f}`, 'utf-8');
13
- const synd = fs.readFileSync(`${synced}/${f}`, 'utf-8');
14
-
15
- // Count comments inserted
16
- const commentMatches = synd.match(/\{>>.*?<<\}/gs) || [];
17
- totalComments += commentMatches.length;
18
-
19
- // The originals may already contain CriticMarkup (Word highlights -> [X]{.mark}),
20
- // so strip both sides to compare just the underlying prose.
21
- const synStripped = stripCriticMarkup(synd);
22
- const origNorm = stripCriticMarkup(orig);
23
-
24
- if (synStripped !== origNorm) {
25
- // Find first difference
26
- let i = 0;
27
- while (i < origNorm.length && i < synStripped.length && origNorm[i] === synStripped[i]) i++;
28
- const ctxOrig = origNorm.slice(Math.max(0, i - 30), i + 50).replace(/\n/g, '\\n');
29
- const ctxSyn = synStripped.slice(Math.max(0, i - 30), i + 50).replace(/\n/g, '\\n');
30
- console.log(`✗ ${f}: prose differs at byte ${i} (lengths orig=${origNorm.length} stripped=${synStripped.length})`);
31
- console.log(` orig: ${ctxOrig}`);
32
- console.log(` syn: ${ctxSyn}`);
33
- mismatches++;
34
- } else {
35
- console.log(`✓ ${f}: prose preserved (${commentMatches.length} comments inserted)`);
36
- }
37
- }
38
- console.log();
39
- console.log(`total comments inserted: ${totalComments}`);
40
- console.log(`prose mismatches: ${mismatches}/${files.length}`);
1
+ // Verify sync --comments-only didn't touch existing prose, only inserted comments.
2
+ import * as fs from 'fs';
3
+ import { stripCriticMarkup } from '../lib/anchor-match.js';
4
+
5
+ const original = 'C:/GillesC/tmp/docrev-stress/project';
6
+ const synced = 'C:/GillesC/tmp/docrev-stress/project-sync';
7
+ const files = ['abstract.md', 'introduction.md', 'methods.md', 'results.md', 'discussion.md', 'conclusion.md', 'references.md', 'supplement.md'];
8
+
9
+ let totalComments = 0;
10
+ let mismatches = 0;
11
+ for (const f of files) {
12
+ const orig = fs.readFileSync(`${original}/${f}`, 'utf-8');
13
+ const synd = fs.readFileSync(`${synced}/${f}`, 'utf-8');
14
+
15
+ // Count comments inserted
16
+ const commentMatches = synd.match(/\{>>.*?<<\}/gs) || [];
17
+ totalComments += commentMatches.length;
18
+
19
+ // The originals may already contain CriticMarkup (Word highlights -> [X]{.mark}),
20
+ // so strip both sides to compare just the underlying prose.
21
+ const synStripped = stripCriticMarkup(synd);
22
+ const origNorm = stripCriticMarkup(orig);
23
+
24
+ if (synStripped !== origNorm) {
25
+ // Find first difference
26
+ let i = 0;
27
+ while (i < origNorm.length && i < synStripped.length && origNorm[i] === synStripped[i]) i++;
28
+ const ctxOrig = origNorm.slice(Math.max(0, i - 30), i + 50).replace(/\n/g, '\\n');
29
+ const ctxSyn = synStripped.slice(Math.max(0, i - 30), i + 50).replace(/\n/g, '\\n');
30
+ console.log(`✗ ${f}: prose differs at byte ${i} (lengths orig=${origNorm.length} stripped=${synStripped.length})`);
31
+ console.log(` orig: ${ctxOrig}`);
32
+ console.log(` syn: ${ctxSyn}`);
33
+ mismatches++;
34
+ } else {
35
+ console.log(`✓ ${f}: prose preserved (${commentMatches.length} comments inserted)`);
36
+ }
37
+ }
38
+ console.log();
39
+ console.log(`total comments inserted: ${totalComments}`);
40
+ console.log(`prose mismatches: ${mismatches}/${files.length}`);
@@ -25,6 +25,18 @@ export interface PdfConfig {
25
25
  linestretch?: number;
26
26
  numbersections?: boolean;
27
27
  toc?: boolean;
28
+ /**
29
+ * LaTeX engine: pdflatex (default), xelatex, lualatex, tectonic, etc.
30
+ * xelatex/lualatex are required for native UTF-8 rendering of Latin-Extended
31
+ * diacritics (Czech/Polish/Croatian/Spanish author names, species epithets).
32
+ */
33
+ engine?: string;
34
+ /** Roman/serif main font (xelatex/lualatex only — uses fontspec). */
35
+ mainfont?: string;
36
+ /** Sans-serif font (xelatex/lualatex only). */
37
+ sansfont?: string;
38
+ /** Monospace font (xelatex/lualatex only). */
39
+ monofont?: string;
28
40
  }
29
41
  export interface DocxConfig {
30
42
  reference?: string | null;
@@ -85,6 +97,12 @@ export interface BuildConfig {
85
97
  pptx: PptxConfig;
86
98
  tables: TablesConfig;
87
99
  postprocess: PostprocessConfig;
100
+ /**
101
+ * Directory (relative to the project) where final outputs land. Created on
102
+ * demand. Set to null/empty to keep outputs alongside paper.md (legacy
103
+ * behavior).
104
+ */
105
+ outputDir?: string | null;
88
106
  _configPath?: string | null;
89
107
  }
90
108
  export interface BuildResult {
@@ -116,6 +134,18 @@ interface FullBuildResult {
116
134
  forwardRefsResolved: number;
117
135
  refsAutoInjected?: boolean;
118
136
  }
137
+ interface Registry {
138
+ figures: Map<string, unknown>;
139
+ tables: Map<string, unknown>;
140
+ equations: Map<string, unknown>;
141
+ byNumber: {
142
+ fig?: Map<number, string>;
143
+ figS?: Map<number, string>;
144
+ tbl?: Map<number, string>;
145
+ tblS?: Map<number, string>;
146
+ eq?: Map<number, string>;
147
+ };
148
+ }
119
149
  /**
120
150
  * Default rev.yaml configuration
121
151
  */
@@ -154,14 +184,33 @@ export declare function combineSections(directory: string, config: BuildConfig,
154
184
  * @returns processed content
155
185
  */
156
186
  export declare function processTablesForFormat(content: string, tablesConfig: TablesConfig, format: string): string;
187
+ /**
188
+ * Apply format-specific transforms (table normalization, author blocks,
189
+ * crossref display conversion, slide syntax). Caller is responsible for
190
+ * stripping annotations beforehand — the dual-output paths keep comments
191
+ * in the markdown stream and need to apply these transforms separately
192
+ * from annotation handling.
193
+ *
194
+ * @param content - Markdown content (annotations already stripped as needed)
195
+ * @param format - Output format
196
+ * @param config - Build config
197
+ * @param registry - Crossref registry for the project
198
+ * @returns Transformed markdown
199
+ */
200
+ export declare function applyFormatTransforms(content: string, format: string, config: BuildConfig, registry: Registry): string;
157
201
  /**
158
202
  * Prepare paper.md for specific output format
159
203
  */
160
- export declare function prepareForFormat(paperPath: string, format: string, config: BuildConfig, options?: BuildOptions): string;
204
+ export declare function prepareForFormat(paperPath: string, format: string, config: BuildConfig, _options?: BuildOptions): string;
161
205
  /**
162
206
  * Build pandoc arguments for format
163
207
  */
164
208
  export declare function buildPandocArgs(format: string, config: BuildConfig, outputPath: string): string[];
209
+ /**
210
+ * Resolve the absolute directory where final outputs should land.
211
+ * Honors config.outputDir; falls back to the project directory when null/empty.
212
+ */
213
+ export declare function resolveOutputDir(directory: string, config: BuildConfig): string;
165
214
  /**
166
215
  * Run pandoc build
167
216
  */
@@ -1 +1 @@
1
- {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../lib/build.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAeH,OAAO,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAkB5D,MAAM,WAAW,cAAc;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC9B,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,SAAS;IACxB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IACvB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,CAAC,EAAE;QACP,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,OAAO,CAAC,EAAE;QACR,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,OAAO,CAAC;KACnB,CAAC;CACH;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;CAC1C;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;IAC7B,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,QAAQ,EAAE,cAAc,CAAC;IACzB,GAAG,EAAE,SAAS,CAAC;IACf,IAAI,EAAE,UAAU,CAAC;IACjB,GAAG,EAAE,SAAS,CAAC;IACf,MAAM,EAAE,YAAY,CAAC;IACrB,IAAI,EAAE,UAAU,CAAC;IACjB,MAAM,EAAE,YAAY,CAAC;IACrB,WAAW,EAAE,iBAAiB,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,YAAY;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,UAAU,cAAe,SAAQ,YAAY;IAC3C,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAMD,UAAU,YAAY;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,eAAe;IACvB,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAsBD;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,WA6D5B,CAAC;AAMF;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,GAAG,WAAW,CAyDzH;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,CA2CzD;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,cAAc,GAAE,MAAM,EAAO,GAAG,MAAM,EAAE,CAgDvF;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,GAAE,cAAmB,GAAG,MAAM,CAgG5G;AAkJD;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CA0F1G;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,WAAW,EACnB,OAAO,GAAE,YAAiB,GACzB,MAAM,CAmDR;AAuBD;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,CAoGjG;AAwBD;;GAEG;AACH,wBAAsB,SAAS,CAC7B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,WAAW,EACnB,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,YAAY,CAAC,CAiJvB;AAED;;GAEG;AACH,wBAAsB,KAAK,CACzB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,MAAM,EAAoB,EACnC,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,eAAe,CAAC,CAgE1B;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,MAAM,CAYjE"}
1
+ {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../lib/build.ts"],"names":[],"mappings":"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"}