docrev 0.9.13 → 0.9.15
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.
- package/.claude/settings.local.json +9 -9
- package/.gitattributes +1 -1
- package/CHANGELOG.md +149 -149
- package/PLAN-tables-and-postprocess.md +850 -850
- package/README.md +411 -391
- package/bin/rev.js +11 -11
- package/bin/rev.ts +145 -145
- package/completions/rev.bash +127 -127
- package/completions/rev.ps1 +210 -210
- package/completions/rev.zsh +207 -207
- package/dev_notes/stress2/build_adversarial.ts +186 -186
- package/dev_notes/stress2/drift_matcher.ts +62 -62
- package/dev_notes/stress2/probe_anchors.ts +35 -35
- package/dev_notes/stress2/project/discussion.before.md +3 -3
- package/dev_notes/stress2/project/discussion.md +3 -3
- package/dev_notes/stress2/project/methods.before.md +20 -20
- package/dev_notes/stress2/project/methods.md +20 -20
- package/dev_notes/stress2/project/rev.yaml +5 -5
- package/dev_notes/stress2/project/sections.yaml +4 -4
- package/dev_notes/stress2/sections.yaml +5 -5
- package/dev_notes/stress2/trace_placement.ts +50 -50
- package/dev_notes/stresstest_boundaries.ts +27 -27
- package/dev_notes/stresstest_drift_apply.ts +43 -43
- package/dev_notes/stresstest_drift_compare.ts +43 -43
- package/dev_notes/stresstest_drift_v2.ts +54 -54
- package/dev_notes/stresstest_inspect.ts +54 -54
- package/dev_notes/stresstest_pstyle.ts +55 -55
- package/dev_notes/stresstest_section_debug.ts +23 -23
- package/dev_notes/stresstest_split.ts +70 -70
- package/dev_notes/stresstest_trace.ts +19 -19
- package/dev_notes/stresstest_verify_no_overwrite.ts +40 -40
- package/dist/lib/build.d.ts +38 -1
- package/dist/lib/build.d.ts.map +1 -1
- package/dist/lib/build.js +68 -30
- package/dist/lib/build.js.map +1 -1
- package/dist/lib/commands/build.d.ts.map +1 -1
- package/dist/lib/commands/build.js +38 -5
- package/dist/lib/commands/build.js.map +1 -1
- package/dist/lib/commands/utilities.js +164 -164
- package/dist/lib/commands/word-tools.js +8 -8
- package/dist/lib/grammar.js +3 -3
- package/dist/lib/pdf-comments.js +44 -44
- package/dist/lib/plugins.js +57 -57
- package/dist/lib/pptx-themes.js +115 -115
- package/dist/lib/spelling.js +2 -2
- package/dist/lib/templates.js +387 -387
- package/dist/lib/themes.js +51 -51
- package/eslint.config.js +27 -27
- package/lib/anchor-match.ts +276 -276
- package/lib/annotations.ts +644 -644
- package/lib/build.ts +1300 -1251
- package/lib/citations.ts +160 -160
- package/lib/commands/build.ts +833 -801
- package/lib/commands/citations.ts +515 -515
- package/lib/commands/comments.ts +1050 -1050
- package/lib/commands/context.ts +174 -174
- package/lib/commands/core.ts +309 -309
- package/lib/commands/doi.ts +435 -435
- package/lib/commands/file-ops.ts +372 -372
- package/lib/commands/history.ts +320 -320
- package/lib/commands/index.ts +87 -87
- package/lib/commands/init.ts +259 -259
- package/lib/commands/merge-resolve.ts +378 -378
- package/lib/commands/preview.ts +178 -178
- package/lib/commands/project-info.ts +244 -244
- package/lib/commands/quality.ts +517 -517
- package/lib/commands/response.ts +454 -454
- package/lib/commands/section-boundaries.ts +82 -82
- package/lib/commands/sections.ts +451 -451
- package/lib/commands/sync.ts +706 -706
- package/lib/commands/text-ops.ts +449 -449
- package/lib/commands/utilities.ts +448 -448
- package/lib/commands/verify-anchors.ts +272 -272
- package/lib/commands/word-tools.ts +340 -340
- package/lib/comment-realign.ts +517 -517
- package/lib/config.ts +84 -84
- package/lib/crossref.ts +781 -781
- package/lib/csl.ts +191 -191
- package/lib/dependencies.ts +98 -98
- package/lib/diff-engine.ts +465 -465
- package/lib/doi-cache.ts +115 -115
- package/lib/doi.ts +897 -897
- package/lib/equations.ts +506 -506
- package/lib/errors.ts +346 -346
- package/lib/format.ts +541 -541
- package/lib/git.ts +326 -326
- package/lib/grammar.ts +303 -303
- package/lib/image-registry.ts +180 -180
- package/lib/import.ts +911 -911
- package/lib/journals.ts +543 -543
- package/lib/merge.ts +633 -633
- package/lib/orcid.ts +144 -144
- package/lib/pdf-comments.ts +263 -263
- package/lib/pdf-import.ts +524 -524
- package/lib/plugins.ts +362 -362
- package/lib/postprocess.ts +188 -188
- package/lib/pptx-color-filter.lua +37 -37
- package/lib/pptx-template.ts +469 -469
- package/lib/pptx-themes.ts +483 -483
- package/lib/protect-restore.ts +520 -520
- package/lib/rate-limiter.ts +94 -94
- package/lib/response.ts +197 -197
- package/lib/restore-references.ts +240 -240
- package/lib/review.ts +327 -327
- package/lib/schema.ts +417 -417
- package/lib/scientific-words.ts +73 -73
- package/lib/sections.ts +335 -335
- package/lib/slides.ts +756 -756
- package/lib/spelling.ts +334 -334
- package/lib/templates.ts +526 -526
- package/lib/themes.ts +742 -742
- package/lib/trackchanges.ts +247 -247
- package/lib/tui.ts +450 -450
- package/lib/types.ts +550 -550
- package/lib/undo.ts +250 -250
- package/lib/utils.ts +69 -69
- package/lib/variables.ts +179 -179
- package/lib/word-extraction.ts +806 -806
- package/lib/word.ts +643 -643
- package/lib/wordcomments.ts +817 -817
- package/package.json +137 -137
- package/scripts/postbuild.js +28 -28
- package/skill/REFERENCE.md +473 -431
- package/skill/SKILL.md +274 -258
- package/tsconfig.json +26 -26
- 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(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"').replace(/'/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(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"').replace(/'/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}`);
|
package/dist/lib/build.d.ts
CHANGED
|
@@ -97,6 +97,12 @@ export interface BuildConfig {
|
|
|
97
97
|
pptx: PptxConfig;
|
|
98
98
|
tables: TablesConfig;
|
|
99
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;
|
|
100
106
|
_configPath?: string | null;
|
|
101
107
|
}
|
|
102
108
|
export interface BuildResult {
|
|
@@ -128,6 +134,18 @@ interface FullBuildResult {
|
|
|
128
134
|
forwardRefsResolved: number;
|
|
129
135
|
refsAutoInjected?: boolean;
|
|
130
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
|
+
}
|
|
131
149
|
/**
|
|
132
150
|
* Default rev.yaml configuration
|
|
133
151
|
*/
|
|
@@ -166,14 +184,33 @@ export declare function combineSections(directory: string, config: BuildConfig,
|
|
|
166
184
|
* @returns processed content
|
|
167
185
|
*/
|
|
168
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;
|
|
169
201
|
/**
|
|
170
202
|
* Prepare paper.md for specific output format
|
|
171
203
|
*/
|
|
172
|
-
export declare function prepareForFormat(paperPath: string, format: string, config: BuildConfig,
|
|
204
|
+
export declare function prepareForFormat(paperPath: string, format: string, config: BuildConfig, _options?: BuildOptions): string;
|
|
173
205
|
/**
|
|
174
206
|
* Build pandoc arguments for format
|
|
175
207
|
*/
|
|
176
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;
|
|
177
214
|
/**
|
|
178
215
|
* Run pandoc build
|
|
179
216
|
*/
|
package/dist/lib/build.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../lib/build.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../lib/build.ts"],"names":[],"mappings":"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"}
|