docrev 0.8.1 → 0.9.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.
- package/.claude/settings.local.json +9 -0
- package/.gitattributes +1 -0
- package/PLAN-tables-and-postprocess.md +850 -0
- package/README.md +33 -0
- package/bin/rev.js +12 -131
- package/bin/rev.ts +145 -0
- package/dist/bin/rev.d.ts +9 -0
- package/dist/bin/rev.d.ts.map +1 -0
- package/dist/bin/rev.js +118 -0
- package/dist/bin/rev.js.map +1 -0
- package/dist/lib/annotations.d.ts +91 -0
- package/dist/lib/annotations.d.ts.map +1 -0
- package/dist/lib/annotations.js +554 -0
- package/dist/lib/annotations.js.map +1 -0
- package/dist/lib/build.d.ts +171 -0
- package/dist/lib/build.d.ts.map +1 -0
- package/dist/lib/build.js +755 -0
- package/dist/lib/build.js.map +1 -0
- package/dist/lib/citations.d.ts +34 -0
- package/dist/lib/citations.d.ts.map +1 -0
- package/dist/lib/citations.js +140 -0
- package/dist/lib/citations.js.map +1 -0
- package/dist/lib/commands/build.d.ts +13 -0
- package/dist/lib/commands/build.d.ts.map +1 -0
- package/dist/lib/commands/build.js +678 -0
- package/dist/lib/commands/build.js.map +1 -0
- package/dist/lib/commands/citations.d.ts +11 -0
- package/dist/lib/commands/citations.d.ts.map +1 -0
- package/dist/lib/commands/citations.js +428 -0
- package/dist/lib/commands/citations.js.map +1 -0
- package/dist/lib/commands/comments.d.ts +11 -0
- package/dist/lib/commands/comments.d.ts.map +1 -0
- package/dist/lib/commands/comments.js +883 -0
- package/dist/lib/commands/comments.js.map +1 -0
- package/dist/lib/commands/context.d.ts +35 -0
- package/dist/lib/commands/context.d.ts.map +1 -0
- package/dist/lib/commands/context.js +59 -0
- package/dist/lib/commands/context.js.map +1 -0
- package/dist/lib/commands/core.d.ts +11 -0
- package/dist/lib/commands/core.d.ts.map +1 -0
- package/dist/lib/commands/core.js +246 -0
- package/dist/lib/commands/core.js.map +1 -0
- package/dist/lib/commands/doi.d.ts +11 -0
- package/dist/lib/commands/doi.d.ts.map +1 -0
- package/dist/lib/commands/doi.js +373 -0
- package/dist/lib/commands/doi.js.map +1 -0
- package/dist/lib/commands/history.d.ts +11 -0
- package/dist/lib/commands/history.d.ts.map +1 -0
- package/dist/lib/commands/history.js +245 -0
- package/dist/lib/commands/history.js.map +1 -0
- package/dist/lib/commands/index.d.ts +28 -0
- package/dist/lib/commands/index.d.ts.map +1 -0
- package/dist/lib/commands/index.js +35 -0
- package/dist/lib/commands/index.js.map +1 -0
- package/dist/lib/commands/init.d.ts +11 -0
- package/dist/lib/commands/init.d.ts.map +1 -0
- package/dist/lib/commands/init.js +209 -0
- package/dist/lib/commands/init.js.map +1 -0
- package/dist/lib/commands/response.d.ts +11 -0
- package/dist/lib/commands/response.d.ts.map +1 -0
- package/dist/lib/commands/response.js +317 -0
- package/dist/lib/commands/response.js.map +1 -0
- package/dist/lib/commands/sections.d.ts +11 -0
- package/dist/lib/commands/sections.d.ts.map +1 -0
- package/dist/lib/commands/sections.js +1071 -0
- package/dist/lib/commands/sections.js.map +1 -0
- package/dist/lib/commands/utilities.d.ts +19 -0
- package/dist/lib/commands/utilities.d.ts.map +1 -0
- package/dist/lib/commands/utilities.js +2009 -0
- package/dist/lib/commands/utilities.js.map +1 -0
- package/dist/lib/comment-realign.d.ts +50 -0
- package/dist/lib/comment-realign.d.ts.map +1 -0
- package/dist/lib/comment-realign.js +372 -0
- package/dist/lib/comment-realign.js.map +1 -0
- package/dist/lib/config.d.ts +41 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +76 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/crossref.d.ts +108 -0
- package/dist/lib/crossref.d.ts.map +1 -0
- package/dist/lib/crossref.js +597 -0
- package/dist/lib/crossref.js.map +1 -0
- package/dist/lib/dependencies.d.ts +30 -0
- package/dist/lib/dependencies.d.ts.map +1 -0
- package/dist/lib/dependencies.js +95 -0
- package/dist/lib/dependencies.js.map +1 -0
- package/dist/lib/doi-cache.d.ts +29 -0
- package/dist/lib/doi-cache.d.ts.map +1 -0
- package/dist/lib/doi-cache.js +104 -0
- package/dist/lib/doi-cache.js.map +1 -0
- package/dist/lib/doi.d.ts +65 -0
- package/dist/lib/doi.d.ts.map +1 -0
- package/dist/lib/doi.js +710 -0
- package/dist/lib/doi.js.map +1 -0
- package/dist/lib/equations.d.ts +61 -0
- package/dist/lib/equations.d.ts.map +1 -0
- package/dist/lib/equations.js +445 -0
- package/dist/lib/equations.js.map +1 -0
- package/dist/lib/errors.d.ts +60 -0
- package/dist/lib/errors.d.ts.map +1 -0
- package/dist/lib/errors.js +303 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/format.d.ts +104 -0
- package/dist/lib/format.d.ts.map +1 -0
- package/dist/lib/format.js +416 -0
- package/dist/lib/format.js.map +1 -0
- package/dist/lib/git.d.ts +88 -0
- package/dist/lib/git.d.ts.map +1 -0
- package/dist/lib/git.js +304 -0
- package/dist/lib/git.js.map +1 -0
- package/dist/lib/grammar.d.ts +62 -0
- package/dist/lib/grammar.d.ts.map +1 -0
- package/dist/lib/grammar.js +244 -0
- package/dist/lib/grammar.js.map +1 -0
- package/dist/lib/image-registry.d.ts +68 -0
- package/dist/lib/image-registry.d.ts.map +1 -0
- package/dist/lib/image-registry.js +112 -0
- package/dist/lib/image-registry.js.map +1 -0
- package/dist/lib/import.d.ts +184 -0
- package/dist/lib/import.d.ts.map +1 -0
- package/dist/lib/import.js +1581 -0
- package/dist/lib/import.js.map +1 -0
- package/dist/lib/journals.d.ts +55 -0
- package/dist/lib/journals.d.ts.map +1 -0
- package/dist/lib/journals.js +417 -0
- package/dist/lib/journals.js.map +1 -0
- package/dist/lib/merge.d.ts +138 -0
- package/dist/lib/merge.d.ts.map +1 -0
- package/dist/lib/merge.js +603 -0
- package/dist/lib/merge.js.map +1 -0
- package/dist/lib/orcid.d.ts +36 -0
- package/dist/lib/orcid.d.ts.map +1 -0
- package/dist/lib/orcid.js +117 -0
- package/dist/lib/orcid.js.map +1 -0
- package/dist/lib/pdf-comments.d.ts +95 -0
- package/dist/lib/pdf-comments.d.ts.map +1 -0
- package/dist/lib/pdf-comments.js +192 -0
- package/dist/lib/pdf-comments.js.map +1 -0
- package/dist/lib/pdf-import.d.ts +118 -0
- package/dist/lib/pdf-import.d.ts.map +1 -0
- package/dist/lib/pdf-import.js +397 -0
- package/dist/lib/pdf-import.js.map +1 -0
- package/dist/lib/plugins.d.ts +76 -0
- package/dist/lib/plugins.d.ts.map +1 -0
- package/dist/lib/plugins.js +235 -0
- package/dist/lib/plugins.js.map +1 -0
- package/dist/lib/postprocess.d.ts +42 -0
- package/dist/lib/postprocess.d.ts.map +1 -0
- package/dist/lib/postprocess.js +138 -0
- package/dist/lib/postprocess.js.map +1 -0
- package/dist/lib/pptx-template.d.ts +59 -0
- package/dist/lib/pptx-template.d.ts.map +1 -0
- package/dist/lib/pptx-template.js +613 -0
- package/dist/lib/pptx-template.js.map +1 -0
- package/dist/lib/pptx-themes.d.ts +80 -0
- package/dist/lib/pptx-themes.d.ts.map +1 -0
- package/dist/lib/pptx-themes.js +818 -0
- package/dist/lib/pptx-themes.js.map +1 -0
- package/dist/lib/protect-restore.d.ts +137 -0
- package/dist/lib/protect-restore.d.ts.map +1 -0
- package/dist/lib/protect-restore.js +394 -0
- package/dist/lib/protect-restore.js.map +1 -0
- package/dist/lib/rate-limiter.d.ts +27 -0
- package/dist/lib/rate-limiter.d.ts.map +1 -0
- package/dist/lib/rate-limiter.js +79 -0
- package/dist/lib/rate-limiter.js.map +1 -0
- package/dist/lib/response.d.ts +41 -0
- package/dist/lib/response.d.ts.map +1 -0
- package/dist/lib/response.js +150 -0
- package/dist/lib/response.js.map +1 -0
- package/dist/lib/review.d.ts +35 -0
- package/dist/lib/review.d.ts.map +1 -0
- package/dist/lib/review.js +263 -0
- package/dist/lib/review.js.map +1 -0
- package/dist/lib/schema.d.ts +66 -0
- package/dist/lib/schema.d.ts.map +1 -0
- package/dist/lib/schema.js +339 -0
- package/dist/lib/schema.js.map +1 -0
- package/dist/lib/scientific-words.d.ts +6 -0
- package/dist/lib/scientific-words.d.ts.map +1 -0
- package/dist/lib/scientific-words.js +66 -0
- package/dist/lib/scientific-words.js.map +1 -0
- package/dist/lib/sections.d.ts +40 -0
- package/dist/lib/sections.d.ts.map +1 -0
- package/dist/lib/sections.js +288 -0
- package/dist/lib/sections.js.map +1 -0
- package/dist/lib/slides.d.ts +86 -0
- package/dist/lib/slides.d.ts.map +1 -0
- package/dist/lib/slides.js +676 -0
- package/dist/lib/slides.js.map +1 -0
- package/dist/lib/spelling.d.ts +76 -0
- package/dist/lib/spelling.d.ts.map +1 -0
- package/dist/lib/spelling.js +272 -0
- package/dist/lib/spelling.js.map +1 -0
- package/dist/lib/templates.d.ts +30 -0
- package/dist/lib/templates.d.ts.map +1 -0
- package/dist/lib/templates.js +504 -0
- package/dist/lib/templates.js.map +1 -0
- package/dist/lib/themes.d.ts +85 -0
- package/dist/lib/themes.d.ts.map +1 -0
- package/dist/lib/themes.js +652 -0
- package/dist/lib/themes.js.map +1 -0
- package/dist/lib/trackchanges.d.ts +51 -0
- package/dist/lib/trackchanges.d.ts.map +1 -0
- package/dist/lib/trackchanges.js +202 -0
- package/dist/lib/trackchanges.js.map +1 -0
- package/dist/lib/tui.d.ts +76 -0
- package/dist/lib/tui.d.ts.map +1 -0
- package/dist/lib/tui.js +377 -0
- package/dist/lib/tui.js.map +1 -0
- package/dist/lib/types.d.ts +447 -0
- package/dist/lib/types.d.ts.map +1 -0
- package/dist/lib/types.js +6 -0
- package/dist/lib/types.js.map +1 -0
- package/dist/lib/undo.d.ts +57 -0
- package/dist/lib/undo.d.ts.map +1 -0
- package/dist/lib/undo.js +185 -0
- package/dist/lib/undo.js.map +1 -0
- package/dist/lib/utils.d.ts +16 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +40 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/lib/variables.d.ts +42 -0
- package/dist/lib/variables.d.ts.map +1 -0
- package/dist/lib/variables.js +141 -0
- package/dist/lib/variables.js.map +1 -0
- package/dist/lib/word.d.ts +80 -0
- package/dist/lib/word.d.ts.map +1 -0
- package/dist/lib/word.js +360 -0
- package/dist/lib/word.js.map +1 -0
- package/dist/lib/wordcomments.d.ts +51 -0
- package/dist/lib/wordcomments.d.ts.map +1 -0
- package/dist/lib/wordcomments.js +587 -0
- package/dist/lib/wordcomments.js.map +1 -0
- package/eslint.config.js +27 -0
- package/lib/annotations.ts +622 -0
- package/lib/apply-buildup-colors.py +88 -0
- package/lib/build.ts +1013 -0
- package/lib/{citations.js → citations.ts} +38 -27
- package/lib/commands/{build.js → build.ts} +80 -27
- package/lib/commands/{citations.js → citations.ts} +36 -18
- package/lib/commands/{comments.js → comments.ts} +187 -54
- package/lib/commands/{context.js → context.ts} +18 -8
- package/lib/commands/{core.js → core.ts} +34 -20
- package/lib/commands/{doi.js → doi.ts} +32 -16
- package/lib/commands/{history.js → history.ts} +25 -12
- package/lib/commands/{index.js → index.ts} +9 -5
- package/lib/commands/{init.js → init.ts} +20 -8
- package/lib/commands/{response.js → response.ts} +47 -20
- package/lib/commands/{sections.js → sections.ts} +273 -68
- package/lib/commands/{utilities.js → utilities.ts} +338 -158
- package/lib/{comment-realign.js → comment-realign.ts} +117 -45
- package/lib/config.ts +84 -0
- package/lib/{crossref.js → crossref.ts} +213 -138
- package/lib/dependencies.ts +106 -0
- package/lib/doi-cache.ts +115 -0
- package/lib/{doi.js → doi.ts} +115 -281
- package/lib/{equations.js → equations.ts} +60 -64
- package/lib/{errors.js → errors.ts} +56 -48
- package/lib/{format.js → format.ts} +137 -63
- package/lib/{git.js → git.ts} +66 -63
- package/lib/{grammar.js → grammar.ts} +45 -32
- package/lib/image-registry.ts +180 -0
- package/lib/import.ts +2060 -0
- package/lib/journals.ts +505 -0
- package/lib/{merge.js → merge.ts} +185 -135
- package/lib/{orcid.js → orcid.ts} +17 -22
- package/lib/{pdf-comments.js → pdf-comments.ts} +76 -18
- package/lib/{pdf-import.js → pdf-import.ts} +148 -70
- package/lib/{plugins.js → plugins.ts} +82 -39
- package/lib/postprocess.ts +188 -0
- package/lib/pptx-color-filter.lua +37 -0
- package/lib/pptx-template.ts +625 -0
- package/lib/pptx-themes/academic.pptx +0 -0
- package/lib/pptx-themes/corporate.pptx +0 -0
- package/lib/pptx-themes/dark.pptx +0 -0
- package/lib/pptx-themes/default.pptx +0 -0
- package/lib/pptx-themes/minimal.pptx +0 -0
- package/lib/pptx-themes/plant.pptx +0 -0
- package/lib/pptx-themes.ts +896 -0
- package/lib/protect-restore.ts +516 -0
- package/lib/rate-limiter.ts +94 -0
- package/lib/{response.js → response.ts} +36 -21
- package/lib/{review.js → review.ts} +53 -43
- package/lib/{schema.js → schema.ts} +70 -25
- package/lib/{sections.js → sections.ts} +71 -76
- package/lib/slides.ts +793 -0
- package/lib/{spelling.js → spelling.ts} +43 -59
- package/lib/{templates.js → templates.ts} +20 -17
- package/lib/themes.ts +742 -0
- package/lib/{trackchanges.js → trackchanges.ts} +52 -23
- package/lib/types.ts +509 -0
- package/lib/{undo.js → undo.ts} +75 -52
- package/lib/utils.ts +41 -0
- package/lib/{variables.js → variables.ts} +60 -54
- package/lib/word.ts +428 -0
- package/lib/{wordcomments.js → wordcomments.ts} +94 -40
- package/package.json +15 -5
- package/skill/REFERENCE.md +67 -0
- package/tsconfig.json +26 -0
- package/lib/annotations.js +0 -414
- package/lib/build.js +0 -639
- package/lib/config.js +0 -79
- package/lib/import.js +0 -1145
- package/lib/journals.js +0 -629
- package/lib/word.js +0 -225
- /package/lib/{scientific-words.js → scientific-words.ts} +0 -0
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ORCID integration for author metadata
|
|
3
|
+
*
|
|
4
|
+
* Fetches author information from ORCID public API
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Validate ORCID format (0000-0000-0000-0000)
|
|
8
|
+
*/
|
|
9
|
+
export function isValidOrcid(orcid) {
|
|
10
|
+
return /^(\d{4}-){3}\d{3}[\dX]$/i.test(orcid);
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Clean ORCID input (removes URLs, whitespace)
|
|
14
|
+
*/
|
|
15
|
+
export function cleanOrcid(input) {
|
|
16
|
+
if (!input)
|
|
17
|
+
return '';
|
|
18
|
+
// Remove URL prefix if present
|
|
19
|
+
let clean = input.trim()
|
|
20
|
+
.replace(/^https?:\/\/(www\.)?orcid\.org\//i, '')
|
|
21
|
+
.replace(/^orcid\.org\//i, '')
|
|
22
|
+
.trim();
|
|
23
|
+
return clean;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Fetch author info from ORCID public API
|
|
27
|
+
*/
|
|
28
|
+
export async function fetchOrcidProfile(orcid) {
|
|
29
|
+
const cleanId = cleanOrcid(orcid);
|
|
30
|
+
if (!isValidOrcid(cleanId)) {
|
|
31
|
+
throw new Error(`Invalid ORCID format: ${orcid}`);
|
|
32
|
+
}
|
|
33
|
+
const url = `https://pub.orcid.org/v3.0/${cleanId}/person`;
|
|
34
|
+
const response = await fetch(url, {
|
|
35
|
+
headers: {
|
|
36
|
+
'Accept': 'application/json',
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
if (!response.ok) {
|
|
40
|
+
if (response.status === 404) {
|
|
41
|
+
throw new Error(`ORCID not found: ${cleanId}`);
|
|
42
|
+
}
|
|
43
|
+
throw new Error(`ORCID API error: ${response.status}`);
|
|
44
|
+
}
|
|
45
|
+
const data = await response.json();
|
|
46
|
+
// Extract name
|
|
47
|
+
const nameData = data.name;
|
|
48
|
+
let name = '';
|
|
49
|
+
if (nameData) {
|
|
50
|
+
const given = nameData['given-names']?.value || '';
|
|
51
|
+
const family = nameData['family-name']?.value || '';
|
|
52
|
+
name = `${given} ${family}`.trim();
|
|
53
|
+
}
|
|
54
|
+
// Extract primary affiliation
|
|
55
|
+
let affiliation = '';
|
|
56
|
+
const affiliations = data.employments?.['affiliation-group'] || [];
|
|
57
|
+
if (affiliations.length > 0) {
|
|
58
|
+
const primary = affiliations[0]?.summaries?.[0]?.['employment-summary'];
|
|
59
|
+
affiliation = primary?.organization?.name || '';
|
|
60
|
+
}
|
|
61
|
+
// Extract email (if public)
|
|
62
|
+
let email = '';
|
|
63
|
+
const emails = data.emails?.email || [];
|
|
64
|
+
const primaryEmail = emails.find((e) => e.primary) || emails[0];
|
|
65
|
+
if (primaryEmail?.email) {
|
|
66
|
+
email = primaryEmail.email;
|
|
67
|
+
}
|
|
68
|
+
return {
|
|
69
|
+
orcid: cleanId,
|
|
70
|
+
name,
|
|
71
|
+
affiliation,
|
|
72
|
+
email,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Fetch work count from ORCID
|
|
77
|
+
*/
|
|
78
|
+
export async function fetchOrcidWorkCount(orcid) {
|
|
79
|
+
const cleanId = cleanOrcid(orcid);
|
|
80
|
+
if (!isValidOrcid(cleanId)) {
|
|
81
|
+
throw new Error(`Invalid ORCID format: ${orcid}`);
|
|
82
|
+
}
|
|
83
|
+
const url = `https://pub.orcid.org/v3.0/${cleanId}/works`;
|
|
84
|
+
const response = await fetch(url, {
|
|
85
|
+
headers: {
|
|
86
|
+
'Accept': 'application/json',
|
|
87
|
+
},
|
|
88
|
+
});
|
|
89
|
+
if (!response.ok) {
|
|
90
|
+
return 0;
|
|
91
|
+
}
|
|
92
|
+
const data = await response.json();
|
|
93
|
+
return data.group?.length || 0;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Format author for YAML
|
|
97
|
+
*/
|
|
98
|
+
export function formatAuthorYaml(profile) {
|
|
99
|
+
const lines = [];
|
|
100
|
+
lines.push(` - name: ${profile.name}`);
|
|
101
|
+
if (profile.affiliation) {
|
|
102
|
+
lines.push(` affiliation: ${profile.affiliation}`);
|
|
103
|
+
}
|
|
104
|
+
if (profile.email) {
|
|
105
|
+
lines.push(` email: ${profile.email}`);
|
|
106
|
+
}
|
|
107
|
+
lines.push(` orcid: ${profile.orcid}`);
|
|
108
|
+
return lines.join('\n');
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Generate ORCID badge markdown
|
|
112
|
+
*/
|
|
113
|
+
export function getOrcidBadge(orcid) {
|
|
114
|
+
const cleanId = cleanOrcid(orcid);
|
|
115
|
+
return `[](https://orcid.org/${cleanId})`;
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=orcid.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orcid.js","sourceRoot":"","sources":["../../lib/orcid.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PDF comment rendering for dual export
|
|
3
|
+
*
|
|
4
|
+
* Converts CriticMarkup comments to LaTeX margin notes for PDF output
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* LaTeX preamble for margin comments
|
|
8
|
+
* Uses todonotes package with custom styling
|
|
9
|
+
*/
|
|
10
|
+
export declare const MARGIN_NOTES_PREAMBLE = "\n% Margin notes for comments\n\\usepackage[colorinlistoftodos,textsize=scriptsize]{todonotes}\n\\usepackage{xcolor}\n\n% Define comment colors by author\n\\definecolor{commentblue}{RGB}{59, 130, 246}\n\\definecolor{commentgreen}{RGB}{34, 197, 94}\n\\definecolor{commentorange}{RGB}{249, 115, 22}\n\\definecolor{commentpurple}{RGB}{168, 85, 247}\n\\definecolor{commentgray}{RGB}{107, 114, 128}\n\n% Custom margin note command\n\\newcommand{\\margincomment}[2][]{%\n \\todo[linecolor=commentblue,backgroundcolor=commentblue!10,bordercolor=commentblue,size=\\scriptsize,#1]{#2}%\n}\n\n% Author-specific commands\n\\newcommand{\\reviewercomment}[2]{%\n \\todo[linecolor=commentgreen,backgroundcolor=commentgreen!10,bordercolor=commentgreen,size=\\scriptsize]{\\textbf{#1:} #2}%\n}\n\n% Increase margin for notes (if needed)\n% \\setlength{\\marginparwidth}{2.5cm}\n";
|
|
11
|
+
/**
|
|
12
|
+
* Simpler preamble using marginpar (no extra packages needed)
|
|
13
|
+
*/
|
|
14
|
+
export declare const SIMPLE_MARGIN_PREAMBLE = "\n% Simple margin notes for comments\n\\usepackage{xcolor}\n\\definecolor{commentcolor}{RGB}{59, 130, 246}\n\n\\newcommand{\\margincomment}[1]{%\n \\marginpar{\\raggedright\\scriptsize\\textcolor{commentcolor}{#1}}%\n}\n";
|
|
15
|
+
/**
|
|
16
|
+
* Options for converting comments to margin notes
|
|
17
|
+
*/
|
|
18
|
+
export interface CommentConversionOptions {
|
|
19
|
+
useTodonotes?: boolean;
|
|
20
|
+
stripResolved?: boolean;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Result of comment conversion
|
|
24
|
+
*/
|
|
25
|
+
export interface CommentConversionResult {
|
|
26
|
+
markdown: string;
|
|
27
|
+
commentCount: number;
|
|
28
|
+
preamble: string;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Convert CriticMarkup comments to LaTeX margin notes
|
|
32
|
+
* {>>Author: comment text<<} -> \margincomment{Author: comment text}
|
|
33
|
+
*
|
|
34
|
+
* @param markdown - Markdown with CriticMarkup comments
|
|
35
|
+
* @param options - { useTodonotes: boolean, stripResolved: boolean }
|
|
36
|
+
* @returns Converted markdown with comment count and preamble
|
|
37
|
+
*/
|
|
38
|
+
export declare function convertCommentsToMarginNotes(markdown: string, options?: CommentConversionOptions): CommentConversionResult;
|
|
39
|
+
/**
|
|
40
|
+
* Result of track changes conversion
|
|
41
|
+
*/
|
|
42
|
+
export interface TrackChangesResult {
|
|
43
|
+
markdown: string;
|
|
44
|
+
preamble: string;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Convert track changes to visible LaTeX formatting
|
|
48
|
+
* {++inserted++} -> \textcolor{green}{inserted}
|
|
49
|
+
* {--deleted--} -> \textcolor{red}{\sout{deleted}}
|
|
50
|
+
* {~~old~>new~~} -> \textcolor{red}{\sout{old}}\textcolor{green}{new}
|
|
51
|
+
*
|
|
52
|
+
* @param markdown - Markdown with track changes
|
|
53
|
+
* @returns Converted markdown and preamble
|
|
54
|
+
*/
|
|
55
|
+
export declare function convertTrackChangesToLatex(markdown: string): TrackChangesResult;
|
|
56
|
+
/**
|
|
57
|
+
* Options for combined preamble
|
|
58
|
+
*/
|
|
59
|
+
export interface PreambleOptions {
|
|
60
|
+
comments?: boolean;
|
|
61
|
+
trackChanges?: boolean;
|
|
62
|
+
useTodonotes?: boolean;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Get combined preamble for comments and track changes
|
|
66
|
+
* @param options - { comments: boolean, trackChanges: boolean, useTodonotes: boolean }
|
|
67
|
+
* @returns Combined LaTeX preamble
|
|
68
|
+
*/
|
|
69
|
+
export declare function getCombinedPreamble(options?: PreambleOptions): string;
|
|
70
|
+
/**
|
|
71
|
+
* Options for preparing markdown for annotated PDF
|
|
72
|
+
*/
|
|
73
|
+
export interface AnnotatedPdfOptions {
|
|
74
|
+
showTrackChanges?: boolean;
|
|
75
|
+
useTodonotes?: boolean;
|
|
76
|
+
stripResolved?: boolean;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Result of preparing markdown for annotated PDF
|
|
80
|
+
*/
|
|
81
|
+
export interface AnnotatedPdfResult {
|
|
82
|
+
markdown: string;
|
|
83
|
+
preamble: string;
|
|
84
|
+
commentCount: number;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Prepare markdown for PDF with visible comments
|
|
88
|
+
* Converts comments to margin notes and optionally shows track changes
|
|
89
|
+
*
|
|
90
|
+
* @param markdown - Markdown content
|
|
91
|
+
* @param options - { showTrackChanges: boolean, useTodonotes: boolean }
|
|
92
|
+
* @returns Converted markdown with preamble and comment count
|
|
93
|
+
*/
|
|
94
|
+
export declare function prepareMarkdownForAnnotatedPdf(markdown: string, options?: AnnotatedPdfOptions): AnnotatedPdfResult;
|
|
95
|
+
//# sourceMappingURL=pdf-comments.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pdf-comments.d.ts","sourceRoot":"","sources":["../../lib/pdf-comments.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;GAGG;AACH,eAAO,MAAM,qBAAqB,q2BAwBjC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,sBAAsB,kOAQlC,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;GAOG;AACH,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,wBAA6B,GACrC,uBAAuB,CAwCzB;AAgBD;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;GAQG;AACH,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,MAAM,GAAG,kBAAkB,CA2B/E;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,eAAoB,GAAG,MAAM,CAwBzE;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;GAOG;AACH,wBAAgB,8BAA8B,CAC5C,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,mBAAwB,GAChC,kBAAkB,CA0BpB"}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PDF comment rendering for dual export
|
|
3
|
+
*
|
|
4
|
+
* Converts CriticMarkup comments to LaTeX margin notes for PDF output
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* LaTeX preamble for margin comments
|
|
8
|
+
* Uses todonotes package with custom styling
|
|
9
|
+
*/
|
|
10
|
+
export const MARGIN_NOTES_PREAMBLE = `
|
|
11
|
+
% Margin notes for comments
|
|
12
|
+
\\usepackage[colorinlistoftodos,textsize=scriptsize]{todonotes}
|
|
13
|
+
\\usepackage{xcolor}
|
|
14
|
+
|
|
15
|
+
% Define comment colors by author
|
|
16
|
+
\\definecolor{commentblue}{RGB}{59, 130, 246}
|
|
17
|
+
\\definecolor{commentgreen}{RGB}{34, 197, 94}
|
|
18
|
+
\\definecolor{commentorange}{RGB}{249, 115, 22}
|
|
19
|
+
\\definecolor{commentpurple}{RGB}{168, 85, 247}
|
|
20
|
+
\\definecolor{commentgray}{RGB}{107, 114, 128}
|
|
21
|
+
|
|
22
|
+
% Custom margin note command
|
|
23
|
+
\\newcommand{\\margincomment}[2][]{%
|
|
24
|
+
\\todo[linecolor=commentblue,backgroundcolor=commentblue!10,bordercolor=commentblue,size=\\scriptsize,#1]{#2}%
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
% Author-specific commands
|
|
28
|
+
\\newcommand{\\reviewercomment}[2]{%
|
|
29
|
+
\\todo[linecolor=commentgreen,backgroundcolor=commentgreen!10,bordercolor=commentgreen,size=\\scriptsize]{\\textbf{#1:} #2}%
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
% Increase margin for notes (if needed)
|
|
33
|
+
% \\setlength{\\marginparwidth}{2.5cm}
|
|
34
|
+
`;
|
|
35
|
+
/**
|
|
36
|
+
* Simpler preamble using marginpar (no extra packages needed)
|
|
37
|
+
*/
|
|
38
|
+
export const SIMPLE_MARGIN_PREAMBLE = `
|
|
39
|
+
% Simple margin notes for comments
|
|
40
|
+
\\usepackage{xcolor}
|
|
41
|
+
\\definecolor{commentcolor}{RGB}{59, 130, 246}
|
|
42
|
+
|
|
43
|
+
\\newcommand{\\margincomment}[1]{%
|
|
44
|
+
\\marginpar{\\raggedright\\scriptsize\\textcolor{commentcolor}{#1}}%
|
|
45
|
+
}
|
|
46
|
+
`;
|
|
47
|
+
/**
|
|
48
|
+
* Convert CriticMarkup comments to LaTeX margin notes
|
|
49
|
+
* {>>Author: comment text<<} -> \margincomment{Author: comment text}
|
|
50
|
+
*
|
|
51
|
+
* @param markdown - Markdown with CriticMarkup comments
|
|
52
|
+
* @param options - { useTodonotes: boolean, stripResolved: boolean }
|
|
53
|
+
* @returns Converted markdown with comment count and preamble
|
|
54
|
+
*/
|
|
55
|
+
export function convertCommentsToMarginNotes(markdown, options = {}) {
|
|
56
|
+
const { useTodonotes = true, stripResolved = true } = options;
|
|
57
|
+
let commentCount = 0;
|
|
58
|
+
// Pattern for CriticMarkup comments: {>>author: text<<} or {>>text<<}
|
|
59
|
+
// Also handle resolved comments: {>>✓ author: text<<}
|
|
60
|
+
const commentPattern = /\{>>(✓\s*)?([^<]+)<<\}/g;
|
|
61
|
+
const converted = markdown.replace(commentPattern, (match, resolved, content) => {
|
|
62
|
+
// Skip resolved comments if requested
|
|
63
|
+
if (resolved && stripResolved) {
|
|
64
|
+
return '';
|
|
65
|
+
}
|
|
66
|
+
commentCount++;
|
|
67
|
+
// Escape LaTeX special characters
|
|
68
|
+
const escaped = escapeLatex(content.trim());
|
|
69
|
+
if (useTodonotes) {
|
|
70
|
+
// Check if content has author prefix (Author: text)
|
|
71
|
+
const authorMatch = escaped.match(/^([^:]+):\s*([\s\S]+)$/);
|
|
72
|
+
if (authorMatch) {
|
|
73
|
+
const [, author, text] = authorMatch;
|
|
74
|
+
return `\\reviewercomment{${author}}{${text}}`;
|
|
75
|
+
}
|
|
76
|
+
return `\\margincomment{${escaped}}`;
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
return `\\margincomment{${escaped}}`;
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
const preamble = useTodonotes ? MARGIN_NOTES_PREAMBLE : SIMPLE_MARGIN_PREAMBLE;
|
|
83
|
+
return {
|
|
84
|
+
markdown: converted,
|
|
85
|
+
commentCount,
|
|
86
|
+
preamble,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Escape LaTeX special characters
|
|
91
|
+
* @param text - Text to escape
|
|
92
|
+
* @returns Escaped text
|
|
93
|
+
*/
|
|
94
|
+
function escapeLatex(text) {
|
|
95
|
+
return text
|
|
96
|
+
.replace(/\\/g, '\\textbackslash{}')
|
|
97
|
+
.replace(/([#$%&_{}])/g, '\\$1')
|
|
98
|
+
.replace(/\^/g, '\\textasciicircum{}')
|
|
99
|
+
.replace(/~/g, '\\textasciitilde{}')
|
|
100
|
+
.replace(/\n/g, ' '); // Replace newlines with spaces
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Convert track changes to visible LaTeX formatting
|
|
104
|
+
* {++inserted++} -> \textcolor{green}{inserted}
|
|
105
|
+
* {--deleted--} -> \textcolor{red}{\sout{deleted}}
|
|
106
|
+
* {~~old~>new~~} -> \textcolor{red}{\sout{old}}\textcolor{green}{new}
|
|
107
|
+
*
|
|
108
|
+
* @param markdown - Markdown with track changes
|
|
109
|
+
* @returns Converted markdown and preamble
|
|
110
|
+
*/
|
|
111
|
+
export function convertTrackChangesToLatex(markdown) {
|
|
112
|
+
let result = markdown;
|
|
113
|
+
// Insertions: {++text++} -> green text
|
|
114
|
+
result = result.replace(/\{\+\+([^+]+)\+\+\}/g, (match, text) => {
|
|
115
|
+
return `\\textcolor{green}{${escapeLatex(text)}}`;
|
|
116
|
+
});
|
|
117
|
+
// Deletions: {--text--} -> red strikethrough
|
|
118
|
+
result = result.replace(/\{--([^-]+)--\}/g, (match, text) => {
|
|
119
|
+
return `\\textcolor{red}{\\sout{${escapeLatex(text)}}}`;
|
|
120
|
+
});
|
|
121
|
+
// Substitutions: {~~old~>new~~} -> red strikethrough + green new
|
|
122
|
+
result = result.replace(/\{~~([^~]+)~>([^~]+)~~\}/g, (match, oldText, newText) => {
|
|
123
|
+
return `\\textcolor{red}{\\sout{${escapeLatex(oldText)}}}\\textcolor{green}{${escapeLatex(newText)}}`;
|
|
124
|
+
});
|
|
125
|
+
const preamble = `
|
|
126
|
+
% Track changes visualization
|
|
127
|
+
\\usepackage{xcolor}
|
|
128
|
+
\\usepackage[normalem]{ulem}
|
|
129
|
+
\\definecolor{green}{RGB}{34, 197, 94}
|
|
130
|
+
\\definecolor{red}{RGB}{239, 68, 68}
|
|
131
|
+
`;
|
|
132
|
+
return { markdown: result, preamble };
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Get combined preamble for comments and track changes
|
|
136
|
+
* @param options - { comments: boolean, trackChanges: boolean, useTodonotes: boolean }
|
|
137
|
+
* @returns Combined LaTeX preamble
|
|
138
|
+
*/
|
|
139
|
+
export function getCombinedPreamble(options = {}) {
|
|
140
|
+
const { comments = true, trackChanges = false, useTodonotes = true } = options;
|
|
141
|
+
let preamble = '';
|
|
142
|
+
if (comments) {
|
|
143
|
+
preamble += useTodonotes ? MARGIN_NOTES_PREAMBLE : SIMPLE_MARGIN_PREAMBLE;
|
|
144
|
+
}
|
|
145
|
+
if (trackChanges) {
|
|
146
|
+
preamble += `
|
|
147
|
+
% Track changes visualization
|
|
148
|
+
\\usepackage[normalem]{ulem}
|
|
149
|
+
`;
|
|
150
|
+
if (!comments) {
|
|
151
|
+
preamble += `\\usepackage{xcolor}\n`;
|
|
152
|
+
}
|
|
153
|
+
preamble += `
|
|
154
|
+
\\definecolor{insertgreen}{RGB}{34, 197, 94}
|
|
155
|
+
\\definecolor{deletered}{RGB}{239, 68, 68}
|
|
156
|
+
`;
|
|
157
|
+
}
|
|
158
|
+
return preamble;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Prepare markdown for PDF with visible comments
|
|
162
|
+
* Converts comments to margin notes and optionally shows track changes
|
|
163
|
+
*
|
|
164
|
+
* @param markdown - Markdown content
|
|
165
|
+
* @param options - { showTrackChanges: boolean, useTodonotes: boolean }
|
|
166
|
+
* @returns Converted markdown with preamble and comment count
|
|
167
|
+
*/
|
|
168
|
+
export function prepareMarkdownForAnnotatedPdf(markdown, options = {}) {
|
|
169
|
+
const { showTrackChanges = false, useTodonotes = true, stripResolved = true } = options;
|
|
170
|
+
let result = markdown;
|
|
171
|
+
let preamble = '';
|
|
172
|
+
let commentCount = 0;
|
|
173
|
+
// Convert comments to margin notes
|
|
174
|
+
const commentResult = convertCommentsToMarginNotes(result, { useTodonotes, stripResolved });
|
|
175
|
+
result = commentResult.markdown;
|
|
176
|
+
commentCount = commentResult.commentCount;
|
|
177
|
+
preamble += commentResult.preamble;
|
|
178
|
+
// Optionally show track changes
|
|
179
|
+
if (showTrackChanges) {
|
|
180
|
+
const trackResult = convertTrackChangesToLatex(result);
|
|
181
|
+
result = trackResult.markdown;
|
|
182
|
+
// Add ulem package if not already in todonotes preamble
|
|
183
|
+
if (!useTodonotes) {
|
|
184
|
+
preamble += trackResult.preamble;
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
preamble += `\\usepackage[normalem]{ulem}\n`;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
return { markdown: result, preamble, commentCount };
|
|
191
|
+
}
|
|
192
|
+
//# sourceMappingURL=pdf-comments.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pdf-comments.js","sourceRoot":"","sources":["../../lib/pdf-comments.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PDF comment extraction for docrev
|
|
3
|
+
*
|
|
4
|
+
* Extracts annotations (comments, highlights, sticky notes) from PDF files
|
|
5
|
+
* and converts them to CriticMarkup format for insertion into markdown.
|
|
6
|
+
* Also extracts the actual text content under highlights using pdfjs-dist.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Raw PDF annotation extracted from pdf-lib
|
|
10
|
+
*/
|
|
11
|
+
export interface PdfAnnotation {
|
|
12
|
+
type: string;
|
|
13
|
+
page: number;
|
|
14
|
+
contents: string;
|
|
15
|
+
author: string;
|
|
16
|
+
date: string;
|
|
17
|
+
rect: number[];
|
|
18
|
+
quadPoints: number[];
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* PDF comment converted to CriticMarkup format
|
|
22
|
+
*/
|
|
23
|
+
export interface PdfComment {
|
|
24
|
+
author: string;
|
|
25
|
+
text: string;
|
|
26
|
+
page: number;
|
|
27
|
+
type: string;
|
|
28
|
+
date?: string;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* PDF annotation with extracted highlighted text
|
|
32
|
+
*/
|
|
33
|
+
export interface PdfAnnotationWithText extends PdfAnnotation {
|
|
34
|
+
highlightedText: string;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Options for PDF extraction
|
|
38
|
+
*/
|
|
39
|
+
export interface ExtractOptions {
|
|
40
|
+
timeout?: number;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Options for markdown insertion
|
|
44
|
+
*/
|
|
45
|
+
export interface InsertOptions {
|
|
46
|
+
sectionPerPage?: boolean;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Statistics about PDF comments
|
|
50
|
+
*/
|
|
51
|
+
export interface PdfCommentStats {
|
|
52
|
+
total: number;
|
|
53
|
+
byType: Record<string, number>;
|
|
54
|
+
byAuthor: Record<string, number>;
|
|
55
|
+
byPage: Record<number, number>;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Extract raw annotations from a PDF file
|
|
59
|
+
* @param pdfPath - Path to PDF file
|
|
60
|
+
* @param options - { timeout: number (ms) }
|
|
61
|
+
* @returns Array of PDF annotations
|
|
62
|
+
*/
|
|
63
|
+
export declare function extractPdfAnnotations(pdfPath: string, options?: ExtractOptions): Promise<PdfAnnotation[]>;
|
|
64
|
+
/**
|
|
65
|
+
* Convert PDF annotations to CriticMarkup comments
|
|
66
|
+
* @param annotations - From extractPdfAnnotations
|
|
67
|
+
* @returns Array of PDF comments
|
|
68
|
+
*/
|
|
69
|
+
export declare function annotationsToComments(annotations: PdfAnnotation[]): PdfComment[];
|
|
70
|
+
/**
|
|
71
|
+
* Extract comments from PDF and format for display
|
|
72
|
+
* @param pdfPath - Path to PDF file
|
|
73
|
+
* @returns Array of PDF comments
|
|
74
|
+
*/
|
|
75
|
+
export declare function extractPdfComments(pdfPath: string): Promise<PdfComment[]>;
|
|
76
|
+
/**
|
|
77
|
+
* Insert PDF comments into markdown based on page/position heuristics
|
|
78
|
+
* Since PDFs don't have direct text anchors like Word, we use page numbers
|
|
79
|
+
* and append comments to the end of corresponding sections
|
|
80
|
+
*
|
|
81
|
+
* @param markdown - The markdown content
|
|
82
|
+
* @param comments - Comments from extractPdfComments
|
|
83
|
+
* @param options - { sectionPerPage: boolean }
|
|
84
|
+
* @returns Markdown with comments inserted
|
|
85
|
+
*/
|
|
86
|
+
export declare function insertPdfCommentsIntoMarkdown(markdown: string, comments: PdfComment[], options?: InsertOptions): string;
|
|
87
|
+
/**
|
|
88
|
+
* Format PDF comments for CLI display
|
|
89
|
+
* @param comments - Array of PDF comments
|
|
90
|
+
* @returns Formatted string
|
|
91
|
+
*/
|
|
92
|
+
export declare function formatPdfComments(comments: PdfComment[]): string;
|
|
93
|
+
/**
|
|
94
|
+
* Get statistics about PDF comments
|
|
95
|
+
* @param comments - Array of PDF comments
|
|
96
|
+
* @returns Statistics object
|
|
97
|
+
*/
|
|
98
|
+
export declare function getPdfCommentStats(comments: PdfComment[]): PdfCommentStats;
|
|
99
|
+
/**
|
|
100
|
+
* Extract highlighted text from a PDF using QuadPoints
|
|
101
|
+
* @param pdfPath - Path to PDF file
|
|
102
|
+
* @param annotations - Annotations with quadPoints from extractPdfAnnotations
|
|
103
|
+
* @returns Annotations with highlighted text extracted
|
|
104
|
+
*/
|
|
105
|
+
export declare function extractHighlightedText(pdfPath: string, annotations: PdfAnnotation[]): Promise<PdfAnnotationWithText[]>;
|
|
106
|
+
/**
|
|
107
|
+
* Extract annotations with highlighted text in one call
|
|
108
|
+
* @param pdfPath - Path to PDF file
|
|
109
|
+
* @returns Annotations with highlighted text
|
|
110
|
+
*/
|
|
111
|
+
export declare function extractPdfAnnotationsWithText(pdfPath: string): Promise<PdfAnnotationWithText[]>;
|
|
112
|
+
/**
|
|
113
|
+
* Format annotation with highlighted text for display
|
|
114
|
+
* @param annot - Annotation with highlightedText
|
|
115
|
+
* @returns Formatted string
|
|
116
|
+
*/
|
|
117
|
+
export declare function formatAnnotationWithText(annot: PdfAnnotationWithText): string;
|
|
118
|
+
//# sourceMappingURL=pdf-import.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pdf-import.d.ts","sourceRoot":"","sources":["../../lib/pdf-import.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAkBH;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,qBAAsB,SAAQ,aAAa;IAC1D,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAaD;;;;;GAKG;AACH,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,aAAa,EAAE,CAAC,CAyG1B;AA2CD;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,aAAa,EAAE,GAAG,UAAU,EAAE,CAUhF;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAG/E;AAED;;;;;;;;;GASG;AACH,wBAAgB,6BAA6B,CAC3C,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,UAAU,EAAE,EACtB,OAAO,GAAE,aAAkB,GAC1B,MAAM,CA6BR;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,UAAU,EAAE,GAAG,MAAM,CAqBhE;AAmBD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,UAAU,EAAE,GAAG,eAAe,CAe1E;AAwCD;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,aAAa,EAAE,GAC3B,OAAO,CAAC,qBAAqB,EAAE,CAAC,CA2DlC;AAED;;;;GAIG;AACH,wBAAsB,6BAA6B,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAGrG;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,qBAAqB,GAAG,MAAM,CAc7E"}
|