docrev 0.8.1 → 0.8.5

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 (306) hide show
  1. package/.claude/settings.local.json +9 -0
  2. package/PLAN-tables-and-postprocess.md +850 -0
  3. package/README.md +33 -0
  4. package/bin/rev.js +12 -131
  5. package/bin/rev.ts +145 -0
  6. package/dist/bin/rev.d.ts +9 -0
  7. package/dist/bin/rev.d.ts.map +1 -0
  8. package/dist/bin/rev.js +118 -0
  9. package/dist/bin/rev.js.map +1 -0
  10. package/dist/lib/annotations.d.ts +91 -0
  11. package/dist/lib/annotations.d.ts.map +1 -0
  12. package/dist/lib/annotations.js +554 -0
  13. package/dist/lib/annotations.js.map +1 -0
  14. package/dist/lib/build.d.ts +171 -0
  15. package/dist/lib/build.d.ts.map +1 -0
  16. package/dist/lib/build.js +755 -0
  17. package/dist/lib/build.js.map +1 -0
  18. package/dist/lib/citations.d.ts +34 -0
  19. package/dist/lib/citations.d.ts.map +1 -0
  20. package/dist/lib/citations.js +140 -0
  21. package/dist/lib/citations.js.map +1 -0
  22. package/dist/lib/commands/build.d.ts +13 -0
  23. package/dist/lib/commands/build.d.ts.map +1 -0
  24. package/dist/lib/commands/build.js +678 -0
  25. package/dist/lib/commands/build.js.map +1 -0
  26. package/dist/lib/commands/citations.d.ts +11 -0
  27. package/dist/lib/commands/citations.d.ts.map +1 -0
  28. package/dist/lib/commands/citations.js +428 -0
  29. package/dist/lib/commands/citations.js.map +1 -0
  30. package/dist/lib/commands/comments.d.ts +11 -0
  31. package/dist/lib/commands/comments.d.ts.map +1 -0
  32. package/dist/lib/commands/comments.js +883 -0
  33. package/dist/lib/commands/comments.js.map +1 -0
  34. package/dist/lib/commands/context.d.ts +35 -0
  35. package/dist/lib/commands/context.d.ts.map +1 -0
  36. package/dist/lib/commands/context.js +59 -0
  37. package/dist/lib/commands/context.js.map +1 -0
  38. package/dist/lib/commands/core.d.ts +11 -0
  39. package/dist/lib/commands/core.d.ts.map +1 -0
  40. package/dist/lib/commands/core.js +246 -0
  41. package/dist/lib/commands/core.js.map +1 -0
  42. package/dist/lib/commands/doi.d.ts +11 -0
  43. package/dist/lib/commands/doi.d.ts.map +1 -0
  44. package/dist/lib/commands/doi.js +373 -0
  45. package/dist/lib/commands/doi.js.map +1 -0
  46. package/dist/lib/commands/history.d.ts +11 -0
  47. package/dist/lib/commands/history.d.ts.map +1 -0
  48. package/dist/lib/commands/history.js +245 -0
  49. package/dist/lib/commands/history.js.map +1 -0
  50. package/dist/lib/commands/index.d.ts +28 -0
  51. package/dist/lib/commands/index.d.ts.map +1 -0
  52. package/dist/lib/commands/index.js +35 -0
  53. package/dist/lib/commands/index.js.map +1 -0
  54. package/dist/lib/commands/init.d.ts +11 -0
  55. package/dist/lib/commands/init.d.ts.map +1 -0
  56. package/dist/lib/commands/init.js +209 -0
  57. package/dist/lib/commands/init.js.map +1 -0
  58. package/dist/lib/commands/response.d.ts +11 -0
  59. package/dist/lib/commands/response.d.ts.map +1 -0
  60. package/dist/lib/commands/response.js +317 -0
  61. package/dist/lib/commands/response.js.map +1 -0
  62. package/dist/lib/commands/sections.d.ts +11 -0
  63. package/dist/lib/commands/sections.d.ts.map +1 -0
  64. package/dist/lib/commands/sections.js +1071 -0
  65. package/dist/lib/commands/sections.js.map +1 -0
  66. package/dist/lib/commands/utilities.d.ts +19 -0
  67. package/dist/lib/commands/utilities.d.ts.map +1 -0
  68. package/dist/lib/commands/utilities.js +2009 -0
  69. package/dist/lib/commands/utilities.js.map +1 -0
  70. package/dist/lib/comment-realign.d.ts +50 -0
  71. package/dist/lib/comment-realign.d.ts.map +1 -0
  72. package/dist/lib/comment-realign.js +372 -0
  73. package/dist/lib/comment-realign.js.map +1 -0
  74. package/dist/lib/config.d.ts +41 -0
  75. package/dist/lib/config.d.ts.map +1 -0
  76. package/dist/lib/config.js +76 -0
  77. package/dist/lib/config.js.map +1 -0
  78. package/dist/lib/crossref.d.ts +108 -0
  79. package/dist/lib/crossref.d.ts.map +1 -0
  80. package/dist/lib/crossref.js +597 -0
  81. package/dist/lib/crossref.js.map +1 -0
  82. package/dist/lib/dependencies.d.ts +30 -0
  83. package/dist/lib/dependencies.d.ts.map +1 -0
  84. package/dist/lib/dependencies.js +95 -0
  85. package/dist/lib/dependencies.js.map +1 -0
  86. package/dist/lib/doi-cache.d.ts +29 -0
  87. package/dist/lib/doi-cache.d.ts.map +1 -0
  88. package/dist/lib/doi-cache.js +104 -0
  89. package/dist/lib/doi-cache.js.map +1 -0
  90. package/dist/lib/doi.d.ts +65 -0
  91. package/dist/lib/doi.d.ts.map +1 -0
  92. package/dist/lib/doi.js +710 -0
  93. package/dist/lib/doi.js.map +1 -0
  94. package/dist/lib/equations.d.ts +61 -0
  95. package/dist/lib/equations.d.ts.map +1 -0
  96. package/dist/lib/equations.js +445 -0
  97. package/dist/lib/equations.js.map +1 -0
  98. package/dist/lib/errors.d.ts +60 -0
  99. package/dist/lib/errors.d.ts.map +1 -0
  100. package/dist/lib/errors.js +303 -0
  101. package/dist/lib/errors.js.map +1 -0
  102. package/dist/lib/format.d.ts +104 -0
  103. package/dist/lib/format.d.ts.map +1 -0
  104. package/dist/lib/format.js +416 -0
  105. package/dist/lib/format.js.map +1 -0
  106. package/dist/lib/git.d.ts +88 -0
  107. package/dist/lib/git.d.ts.map +1 -0
  108. package/dist/lib/git.js +304 -0
  109. package/dist/lib/git.js.map +1 -0
  110. package/dist/lib/grammar.d.ts +62 -0
  111. package/dist/lib/grammar.d.ts.map +1 -0
  112. package/dist/lib/grammar.js +244 -0
  113. package/dist/lib/grammar.js.map +1 -0
  114. package/dist/lib/image-registry.d.ts +68 -0
  115. package/dist/lib/image-registry.d.ts.map +1 -0
  116. package/dist/lib/image-registry.js +112 -0
  117. package/dist/lib/image-registry.js.map +1 -0
  118. package/dist/lib/import.d.ts +184 -0
  119. package/dist/lib/import.d.ts.map +1 -0
  120. package/dist/lib/import.js +1581 -0
  121. package/dist/lib/import.js.map +1 -0
  122. package/dist/lib/journals.d.ts +55 -0
  123. package/dist/lib/journals.d.ts.map +1 -0
  124. package/dist/lib/journals.js +417 -0
  125. package/dist/lib/journals.js.map +1 -0
  126. package/dist/lib/merge.d.ts +138 -0
  127. package/dist/lib/merge.d.ts.map +1 -0
  128. package/dist/lib/merge.js +603 -0
  129. package/dist/lib/merge.js.map +1 -0
  130. package/dist/lib/orcid.d.ts +36 -0
  131. package/dist/lib/orcid.d.ts.map +1 -0
  132. package/dist/lib/orcid.js +117 -0
  133. package/dist/lib/orcid.js.map +1 -0
  134. package/dist/lib/pdf-comments.d.ts +95 -0
  135. package/dist/lib/pdf-comments.d.ts.map +1 -0
  136. package/dist/lib/pdf-comments.js +192 -0
  137. package/dist/lib/pdf-comments.js.map +1 -0
  138. package/dist/lib/pdf-import.d.ts +118 -0
  139. package/dist/lib/pdf-import.d.ts.map +1 -0
  140. package/dist/lib/pdf-import.js +397 -0
  141. package/dist/lib/pdf-import.js.map +1 -0
  142. package/dist/lib/plugins.d.ts +76 -0
  143. package/dist/lib/plugins.d.ts.map +1 -0
  144. package/dist/lib/plugins.js +235 -0
  145. package/dist/lib/plugins.js.map +1 -0
  146. package/dist/lib/postprocess.d.ts +42 -0
  147. package/dist/lib/postprocess.d.ts.map +1 -0
  148. package/dist/lib/postprocess.js +138 -0
  149. package/dist/lib/postprocess.js.map +1 -0
  150. package/dist/lib/pptx-template.d.ts +59 -0
  151. package/dist/lib/pptx-template.d.ts.map +1 -0
  152. package/dist/lib/pptx-template.js +613 -0
  153. package/dist/lib/pptx-template.js.map +1 -0
  154. package/dist/lib/pptx-themes.d.ts +80 -0
  155. package/dist/lib/pptx-themes.d.ts.map +1 -0
  156. package/dist/lib/pptx-themes.js +818 -0
  157. package/dist/lib/pptx-themes.js.map +1 -0
  158. package/dist/lib/protect-restore.d.ts +137 -0
  159. package/dist/lib/protect-restore.d.ts.map +1 -0
  160. package/dist/lib/protect-restore.js +394 -0
  161. package/dist/lib/protect-restore.js.map +1 -0
  162. package/dist/lib/rate-limiter.d.ts +27 -0
  163. package/dist/lib/rate-limiter.d.ts.map +1 -0
  164. package/dist/lib/rate-limiter.js +79 -0
  165. package/dist/lib/rate-limiter.js.map +1 -0
  166. package/dist/lib/response.d.ts +41 -0
  167. package/dist/lib/response.d.ts.map +1 -0
  168. package/dist/lib/response.js +150 -0
  169. package/dist/lib/response.js.map +1 -0
  170. package/dist/lib/review.d.ts +35 -0
  171. package/dist/lib/review.d.ts.map +1 -0
  172. package/dist/lib/review.js +263 -0
  173. package/dist/lib/review.js.map +1 -0
  174. package/dist/lib/schema.d.ts +66 -0
  175. package/dist/lib/schema.d.ts.map +1 -0
  176. package/dist/lib/schema.js +339 -0
  177. package/dist/lib/schema.js.map +1 -0
  178. package/dist/lib/scientific-words.d.ts +6 -0
  179. package/dist/lib/scientific-words.d.ts.map +1 -0
  180. package/dist/lib/scientific-words.js +66 -0
  181. package/dist/lib/scientific-words.js.map +1 -0
  182. package/dist/lib/sections.d.ts +40 -0
  183. package/dist/lib/sections.d.ts.map +1 -0
  184. package/dist/lib/sections.js +288 -0
  185. package/dist/lib/sections.js.map +1 -0
  186. package/dist/lib/slides.d.ts +86 -0
  187. package/dist/lib/slides.d.ts.map +1 -0
  188. package/dist/lib/slides.js +676 -0
  189. package/dist/lib/slides.js.map +1 -0
  190. package/dist/lib/spelling.d.ts +76 -0
  191. package/dist/lib/spelling.d.ts.map +1 -0
  192. package/dist/lib/spelling.js +272 -0
  193. package/dist/lib/spelling.js.map +1 -0
  194. package/dist/lib/templates.d.ts +30 -0
  195. package/dist/lib/templates.d.ts.map +1 -0
  196. package/dist/lib/templates.js +504 -0
  197. package/dist/lib/templates.js.map +1 -0
  198. package/dist/lib/themes.d.ts +85 -0
  199. package/dist/lib/themes.d.ts.map +1 -0
  200. package/dist/lib/themes.js +652 -0
  201. package/dist/lib/themes.js.map +1 -0
  202. package/dist/lib/trackchanges.d.ts +51 -0
  203. package/dist/lib/trackchanges.d.ts.map +1 -0
  204. package/dist/lib/trackchanges.js +202 -0
  205. package/dist/lib/trackchanges.js.map +1 -0
  206. package/dist/lib/tui.d.ts +76 -0
  207. package/dist/lib/tui.d.ts.map +1 -0
  208. package/dist/lib/tui.js +377 -0
  209. package/dist/lib/tui.js.map +1 -0
  210. package/dist/lib/types.d.ts +447 -0
  211. package/dist/lib/types.d.ts.map +1 -0
  212. package/dist/lib/types.js +6 -0
  213. package/dist/lib/types.js.map +1 -0
  214. package/dist/lib/undo.d.ts +57 -0
  215. package/dist/lib/undo.d.ts.map +1 -0
  216. package/dist/lib/undo.js +185 -0
  217. package/dist/lib/undo.js.map +1 -0
  218. package/dist/lib/utils.d.ts +16 -0
  219. package/dist/lib/utils.d.ts.map +1 -0
  220. package/dist/lib/utils.js +40 -0
  221. package/dist/lib/utils.js.map +1 -0
  222. package/dist/lib/variables.d.ts +42 -0
  223. package/dist/lib/variables.d.ts.map +1 -0
  224. package/dist/lib/variables.js +141 -0
  225. package/dist/lib/variables.js.map +1 -0
  226. package/dist/lib/word.d.ts +80 -0
  227. package/dist/lib/word.d.ts.map +1 -0
  228. package/dist/lib/word.js +360 -0
  229. package/dist/lib/word.js.map +1 -0
  230. package/dist/lib/wordcomments.d.ts +51 -0
  231. package/dist/lib/wordcomments.d.ts.map +1 -0
  232. package/dist/lib/wordcomments.js +587 -0
  233. package/dist/lib/wordcomments.js.map +1 -0
  234. package/eslint.config.js +27 -0
  235. package/lib/annotations.ts +622 -0
  236. package/lib/apply-buildup-colors.py +88 -0
  237. package/lib/build.ts +1013 -0
  238. package/lib/{citations.js → citations.ts} +38 -27
  239. package/lib/commands/{build.js → build.ts} +80 -27
  240. package/lib/commands/{citations.js → citations.ts} +36 -18
  241. package/lib/commands/{comments.js → comments.ts} +187 -54
  242. package/lib/commands/{context.js → context.ts} +18 -8
  243. package/lib/commands/{core.js → core.ts} +34 -20
  244. package/lib/commands/{doi.js → doi.ts} +32 -16
  245. package/lib/commands/{history.js → history.ts} +25 -12
  246. package/lib/commands/{index.js → index.ts} +9 -5
  247. package/lib/commands/{init.js → init.ts} +20 -8
  248. package/lib/commands/{response.js → response.ts} +47 -20
  249. package/lib/commands/{sections.js → sections.ts} +273 -68
  250. package/lib/commands/{utilities.js → utilities.ts} +338 -158
  251. package/lib/{comment-realign.js → comment-realign.ts} +117 -45
  252. package/lib/config.ts +84 -0
  253. package/lib/{crossref.js → crossref.ts} +213 -138
  254. package/lib/dependencies.ts +106 -0
  255. package/lib/doi-cache.ts +115 -0
  256. package/lib/{doi.js → doi.ts} +115 -281
  257. package/lib/{equations.js → equations.ts} +60 -64
  258. package/lib/{errors.js → errors.ts} +56 -48
  259. package/lib/{format.js → format.ts} +137 -63
  260. package/lib/{git.js → git.ts} +66 -63
  261. package/lib/{grammar.js → grammar.ts} +45 -32
  262. package/lib/image-registry.ts +180 -0
  263. package/lib/import.ts +2060 -0
  264. package/lib/journals.ts +505 -0
  265. package/lib/{merge.js → merge.ts} +185 -135
  266. package/lib/{orcid.js → orcid.ts} +17 -22
  267. package/lib/{pdf-comments.js → pdf-comments.ts} +76 -18
  268. package/lib/{pdf-import.js → pdf-import.ts} +148 -70
  269. package/lib/{plugins.js → plugins.ts} +82 -39
  270. package/lib/postprocess.ts +188 -0
  271. package/lib/pptx-color-filter.lua +37 -0
  272. package/lib/pptx-template.ts +625 -0
  273. package/lib/pptx-themes/academic.pptx +0 -0
  274. package/lib/pptx-themes/corporate.pptx +0 -0
  275. package/lib/pptx-themes/dark.pptx +0 -0
  276. package/lib/pptx-themes/default.pptx +0 -0
  277. package/lib/pptx-themes/minimal.pptx +0 -0
  278. package/lib/pptx-themes/plant.pptx +0 -0
  279. package/lib/pptx-themes.ts +896 -0
  280. package/lib/protect-restore.ts +516 -0
  281. package/lib/rate-limiter.ts +94 -0
  282. package/lib/{response.js → response.ts} +36 -21
  283. package/lib/{review.js → review.ts} +53 -43
  284. package/lib/{schema.js → schema.ts} +70 -25
  285. package/lib/{sections.js → sections.ts} +71 -76
  286. package/lib/slides.ts +793 -0
  287. package/lib/{spelling.js → spelling.ts} +43 -59
  288. package/lib/{templates.js → templates.ts} +20 -17
  289. package/lib/themes.ts +742 -0
  290. package/lib/{trackchanges.js → trackchanges.ts} +52 -23
  291. package/lib/types.ts +509 -0
  292. package/lib/{undo.js → undo.ts} +75 -52
  293. package/lib/utils.ts +41 -0
  294. package/lib/{variables.js → variables.ts} +60 -54
  295. package/lib/word.ts +428 -0
  296. package/lib/{wordcomments.js → wordcomments.ts} +94 -40
  297. package/package.json +15 -5
  298. package/skill/REFERENCE.md +67 -0
  299. package/tsconfig.json +26 -0
  300. package/lib/annotations.js +0 -414
  301. package/lib/build.js +0 -639
  302. package/lib/config.js +0 -79
  303. package/lib/import.js +0 -1145
  304. package/lib/journals.js +0 -629
  305. package/lib/word.js +0 -225
  306. /package/lib/{scientific-words.js → scientific-words.ts} +0 -0
@@ -0,0 +1,235 @@
1
+ /**
2
+ * Plugin system for custom journal profiles and export formats
3
+ *
4
+ * Users can add custom profiles in:
5
+ * - Project: .rev/profiles/*.yaml
6
+ * - User: ~/.rev/profiles/*.yaml
7
+ */
8
+ import * as fs from 'fs';
9
+ import * as path from 'path';
10
+ import * as os from 'os';
11
+ import * as yaml from 'yaml';
12
+ // Plugin directories
13
+ const USER_PLUGINS_DIR = path.join(os.homedir(), '.rev', 'profiles');
14
+ const PROJECT_PLUGINS_DIR = path.join(process.cwd(), '.rev', 'profiles');
15
+ /**
16
+ * Load all custom journal profiles
17
+ */
18
+ export function loadCustomProfiles() {
19
+ const profiles = {};
20
+ // Load user profiles first (lower priority)
21
+ const userProfiles = loadProfilesFromDir(USER_PLUGINS_DIR);
22
+ Object.assign(profiles, userProfiles);
23
+ // Load project profiles (higher priority, can override)
24
+ const projectProfiles = loadProfilesFromDir(PROJECT_PLUGINS_DIR);
25
+ Object.assign(profiles, projectProfiles);
26
+ return profiles;
27
+ }
28
+ /**
29
+ * Load profiles from a directory
30
+ */
31
+ function loadProfilesFromDir(dir) {
32
+ const profiles = {};
33
+ if (!fs.existsSync(dir)) {
34
+ return profiles;
35
+ }
36
+ try {
37
+ const files = fs.readdirSync(dir).filter(f => f.endsWith('.yaml') || f.endsWith('.yml') || f.endsWith('.json'));
38
+ for (const file of files) {
39
+ try {
40
+ const filePath = path.join(dir, file);
41
+ const content = fs.readFileSync(filePath, 'utf-8');
42
+ const profile = file.endsWith('.json')
43
+ ? JSON.parse(content)
44
+ : yaml.parse(content);
45
+ if (validateProfile(profile)) {
46
+ const id = profile.id || path.basename(file, path.extname(file));
47
+ profiles[id] = normalizeProfile(profile);
48
+ }
49
+ }
50
+ catch (err) {
51
+ const message = err instanceof Error ? err.message : String(err);
52
+ console.error(`Warning: Failed to load profile ${file}: ${message}`);
53
+ }
54
+ }
55
+ }
56
+ catch {
57
+ // Directory not readable
58
+ }
59
+ return profiles;
60
+ }
61
+ /**
62
+ * Validate a profile structure
63
+ */
64
+ function validateProfile(profile) {
65
+ if (!profile || typeof profile !== 'object') {
66
+ return false;
67
+ }
68
+ const p = profile;
69
+ // Must have a name
70
+ if (!p.name || typeof p.name !== 'string') {
71
+ return false;
72
+ }
73
+ // Requirements must be an object if present
74
+ if (p.requirements && typeof p.requirements !== 'object') {
75
+ return false;
76
+ }
77
+ return true;
78
+ }
79
+ /**
80
+ * Normalize profile to standard structure
81
+ */
82
+ function normalizeProfile(profile) {
83
+ return {
84
+ name: profile.name,
85
+ url: profile.url || null,
86
+ custom: true,
87
+ requirements: {
88
+ wordLimit: profile.requirements?.wordLimit || profile.wordLimit || {},
89
+ references: profile.requirements?.references || profile.references || {},
90
+ figures: profile.requirements?.figures || profile.figures || {},
91
+ sections: profile.requirements?.sections || profile.sections || {},
92
+ authors: profile.requirements?.authors || profile.authors || {},
93
+ keywords: profile.requirements?.keywords || profile.keywords || null,
94
+ dataAvailability: profile.requirements?.dataAvailability || profile.dataAvailability || false,
95
+ ...profile.requirements,
96
+ },
97
+ };
98
+ }
99
+ /**
100
+ * Initialize plugin directories
101
+ */
102
+ export function initPluginDir(project = false) {
103
+ const dir = project ? PROJECT_PLUGINS_DIR : USER_PLUGINS_DIR;
104
+ if (!fs.existsSync(dir)) {
105
+ fs.mkdirSync(dir, { recursive: true });
106
+ }
107
+ return dir;
108
+ }
109
+ /**
110
+ * Get plugin directories info
111
+ */
112
+ export function getPluginDirs() {
113
+ return {
114
+ user: USER_PLUGINS_DIR,
115
+ project: PROJECT_PLUGINS_DIR,
116
+ userExists: fs.existsSync(USER_PLUGINS_DIR),
117
+ projectExists: fs.existsSync(PROJECT_PLUGINS_DIR),
118
+ };
119
+ }
120
+ /**
121
+ * Create a sample profile template
122
+ */
123
+ export function createProfileTemplate(journalName) {
124
+ const id = journalName.toLowerCase().replace(/\s+/g, '-');
125
+ return `# Custom journal profile for ${journalName}
126
+ # Save as: ~/.rev/profiles/${id}.yaml (user-wide)
127
+ # Or: .rev/profiles/${id}.yaml (project-specific)
128
+
129
+ id: ${id}
130
+ name: "${journalName}"
131
+ url: "https://journal-website.com/author-guidelines"
132
+
133
+ # Word count limits
134
+ wordLimit:
135
+ main: 8000 # null for no limit
136
+ abstract: 300
137
+ title: null # characters
138
+
139
+ # Reference requirements
140
+ references:
141
+ max: null # null for no limit
142
+ doiRequired: true
143
+
144
+ # Figure/table limits
145
+ figures:
146
+ max: 8
147
+ combinedWithTables: false
148
+
149
+ # Required sections
150
+ sections:
151
+ required:
152
+ - Abstract
153
+ - Introduction
154
+ - Methods
155
+ - Results
156
+ - Discussion
157
+ methodsPosition: null # 'end' or 'before-results'
158
+
159
+ # Keywords
160
+ keywords:
161
+ min: 4
162
+ max: 8
163
+
164
+ # Other requirements
165
+ dataAvailability: true
166
+ highlights: false
167
+ graphicalAbstract: false
168
+ `;
169
+ }
170
+ /**
171
+ * Save a profile template
172
+ */
173
+ export function saveProfileTemplate(journalName, project = false) {
174
+ const dir = initPluginDir(project);
175
+ const id = journalName.toLowerCase().replace(/\s+/g, '-');
176
+ const filePath = path.join(dir, `${id}.yaml`);
177
+ if (fs.existsSync(filePath)) {
178
+ throw new Error(`Profile already exists: ${filePath}`);
179
+ }
180
+ const content = createProfileTemplate(journalName);
181
+ fs.writeFileSync(filePath, content, 'utf-8');
182
+ return filePath;
183
+ }
184
+ /**
185
+ * List all custom profiles
186
+ */
187
+ export function listCustomProfiles() {
188
+ const result = [];
189
+ // User profiles
190
+ if (fs.existsSync(USER_PLUGINS_DIR)) {
191
+ const files = fs.readdirSync(USER_PLUGINS_DIR).filter(f => f.endsWith('.yaml') || f.endsWith('.yml') || f.endsWith('.json'));
192
+ for (const file of files) {
193
+ try {
194
+ const filePath = path.join(USER_PLUGINS_DIR, file);
195
+ const content = fs.readFileSync(filePath, 'utf-8');
196
+ const profile = file.endsWith('.json') ? JSON.parse(content) : yaml.parse(content);
197
+ if (validateProfile(profile)) {
198
+ result.push({
199
+ id: profile.id || path.basename(file, path.extname(file)),
200
+ name: profile.name,
201
+ source: 'user',
202
+ path: filePath,
203
+ });
204
+ }
205
+ }
206
+ catch {
207
+ // Skip invalid profiles
208
+ }
209
+ }
210
+ }
211
+ // Project profiles
212
+ if (fs.existsSync(PROJECT_PLUGINS_DIR)) {
213
+ const files = fs.readdirSync(PROJECT_PLUGINS_DIR).filter(f => f.endsWith('.yaml') || f.endsWith('.yml') || f.endsWith('.json'));
214
+ for (const file of files) {
215
+ try {
216
+ const filePath = path.join(PROJECT_PLUGINS_DIR, file);
217
+ const content = fs.readFileSync(filePath, 'utf-8');
218
+ const profile = file.endsWith('.json') ? JSON.parse(content) : yaml.parse(content);
219
+ if (validateProfile(profile)) {
220
+ result.push({
221
+ id: profile.id || path.basename(file, path.extname(file)),
222
+ name: profile.name,
223
+ source: 'project',
224
+ path: filePath,
225
+ });
226
+ }
227
+ }
228
+ catch {
229
+ // Skip invalid profiles
230
+ }
231
+ }
232
+ }
233
+ return result;
234
+ }
235
+ //# sourceMappingURL=plugins.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugins.js","sourceRoot":"","sources":["../../lib/plugins.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AA0D7B,qBAAqB;AACrB,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;AACrE,MAAM,mBAAmB,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;AAEzE;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAChC,MAAM,QAAQ,GAAsC,EAAE,CAAC;IAEvD,4CAA4C;IAC5C,MAAM,YAAY,GAAG,mBAAmB,CAAC,gBAAgB,CAAC,CAAC;IAC3D,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IAEtC,wDAAwD;IACxD,MAAM,eAAe,GAAG,mBAAmB,CAAC,mBAAmB,CAAC,CAAC;IACjE,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;IAEzC,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAAC,GAAW;IACtC,MAAM,QAAQ,GAAsC,EAAE,CAAC;IAEvD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAC3C,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CACjE,CAAC;QAEF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;gBACtC,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBACnD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;oBACpC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;oBACrB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAExB,IAAI,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC7B,MAAM,EAAE,GAAG,OAAO,CAAC,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;oBACjE,QAAQ,CAAC,EAAE,CAAC,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;gBAC3C,CAAC;YACH,CAAC;YAAC,OAAO,GAAY,EAAE,CAAC;gBACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACjE,OAAO,CAAC,KAAK,CAAC,mCAAmC,IAAI,KAAK,OAAO,EAAE,CAAC,CAAC;YACvE,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,yBAAyB;IAC3B,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,OAAgB;IACvC,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC5C,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,CAAC,GAAG,OAAkB,CAAC;IAE7B,mBAAmB;IACnB,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC1C,OAAO,KAAK,CAAC;IACf,CAAC;IAED,4CAA4C;IAC5C,IAAI,CAAC,CAAC,YAAY,IAAI,OAAO,CAAC,CAAC,YAAY,KAAK,QAAQ,EAAE,CAAC;QACzD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,OAAgB;IACxC,OAAO;QACL,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,GAAG,EAAE,OAAO,CAAC,GAAG,IAAI,IAAI;QACxB,MAAM,EAAE,IAAI;QACZ,YAAY,EAAE;YACZ,SAAS,EAAE,OAAO,CAAC,YAAY,EAAE,SAAS,IAAK,OAAkD,CAAC,SAAS,IAAI,EAAE;YACjH,UAAU,EAAE,OAAO,CAAC,YAAY,EAAE,UAAU,IAAK,OAAoD,CAAC,UAAU,IAAI,EAAE;YACtH,OAAO,EAAE,OAAO,CAAC,YAAY,EAAE,OAAO,IAAK,OAAiD,CAAC,OAAO,IAAI,EAAE;YAC1G,QAAQ,EAAE,OAAO,CAAC,YAAY,EAAE,QAAQ,IAAK,OAAkD,CAAC,QAAQ,IAAI,EAAE;YAC9G,OAAO,EAAE,OAAO,CAAC,YAAY,EAAE,OAAO,IAAK,OAAiD,CAAC,OAAO,IAAI,EAAE;YAC1G,QAAQ,EAAE,OAAO,CAAC,YAAY,EAAE,QAAQ,IAAK,OAAyD,CAAC,QAAQ,IAAI,IAAI;YACvH,gBAAgB,EAAE,OAAO,CAAC,YAAY,EAAE,gBAAgB,IAAK,OAA0C,CAAC,gBAAgB,IAAI,KAAK;YACjI,GAAG,OAAO,CAAC,YAAY;SACxB;KACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,OAAO,GAAG,KAAK;IAC3C,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,gBAAgB,CAAC;IAE7D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa;IAC3B,OAAO;QACL,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,mBAAmB;QAC5B,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC;QAC3C,aAAa,EAAE,EAAE,CAAC,UAAU,CAAC,mBAAmB,CAAC;KAClD,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,WAAmB;IACvD,MAAM,EAAE,GAAG,WAAW,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAE1D,OAAO,gCAAgC,WAAW;6BACvB,EAAE;sBACT,EAAE;;MAElB,EAAE;SACC,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsCnB,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,WAAmB,EAAE,OAAO,GAAG,KAAK;IACtE,MAAM,GAAG,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IACnC,MAAM,EAAE,GAAG,WAAW,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;IAE9C,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,2BAA2B,QAAQ,EAAE,CAAC,CAAC;IACzD,CAAC;IAED,MAAM,OAAO,GAAG,qBAAqB,CAAC,WAAW,CAAC,CAAC;IACnD,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAE7C,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAChC,MAAM,MAAM,GAAuB,EAAE,CAAC;IAEtC,gBAAgB;IAChB,IAAI,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACpC,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CACxD,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CACjE,CAAC;QAEF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;gBACnD,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBACnD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAEnF,IAAI,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC7B,MAAM,CAAC,IAAI,CAAC;wBACV,EAAE,EAAE,OAAO,CAAC,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;wBACzD,IAAI,EAAE,OAAO,CAAC,IAAI;wBAClB,MAAM,EAAE,MAAM;wBACd,IAAI,EAAE,QAAQ;qBACf,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,wBAAwB;YAC1B,CAAC;QACH,CAAC;IACH,CAAC;IAED,mBAAmB;IACnB,IAAI,EAAE,CAAC,UAAU,CAAC,mBAAmB,CAAC,EAAE,CAAC;QACvC,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAC3D,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CACjE,CAAC;QAEF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,IAAI,CAAC,CAAC;gBACtD,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBACnD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAEnF,IAAI,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC7B,MAAM,CAAC,IAAI,CAAC;wBACV,EAAE,EAAE,OAAO,CAAC,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;wBACzD,IAAI,EAAE,OAAO,CAAC,IAAI;wBAClB,MAAM,EAAE,SAAS;wBACjB,IAAI,EAAE,QAAQ;qBACf,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,wBAAwB;YAC1B,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Postprocess scripting for docrev
3
+ *
4
+ * Allows users to run custom scripts after output generation.
5
+ * Supports shell scripts, PowerShell, Python, and Node.js.
6
+ */
7
+ /**
8
+ * Script execution result
9
+ */
10
+ interface ExecutionResult {
11
+ success: boolean;
12
+ stdout: string;
13
+ stderr: string;
14
+ error?: string;
15
+ }
16
+ /**
17
+ * Execution options
18
+ */
19
+ interface ExecutionOptions {
20
+ verbose?: boolean;
21
+ }
22
+ /**
23
+ * Postprocess result
24
+ */
25
+ interface PostprocessResult {
26
+ success: boolean;
27
+ error?: string;
28
+ }
29
+ /**
30
+ * Execute a script with environment variables
31
+ */
32
+ export declare function executeScript(scriptPath: string, env: Record<string, string>, options?: ExecutionOptions): Promise<ExecutionResult>;
33
+ /**
34
+ * Run postprocess scripts for a given format
35
+ */
36
+ export declare function runPostprocess(outputPath: string, format: string, config: {
37
+ postprocess?: Record<string, string>;
38
+ _configPath?: string;
39
+ [key: string]: unknown;
40
+ }, options?: ExecutionOptions): Promise<PostprocessResult>;
41
+ export {};
42
+ //# sourceMappingURL=postprocess.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postprocess.d.ts","sourceRoot":"","sources":["../../lib/postprocess.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH;;GAEG;AACH,UAAU,eAAe;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,UAAU,gBAAgB;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,UAAU,iBAAiB;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC3B,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,eAAe,CAAC,CA0E1B;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,EAC9F,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,iBAAiB,CAAC,CA4D5B"}
@@ -0,0 +1,138 @@
1
+ /**
2
+ * Postprocess scripting for docrev
3
+ *
4
+ * Allows users to run custom scripts after output generation.
5
+ * Supports shell scripts, PowerShell, Python, and Node.js.
6
+ */
7
+ import * as fs from 'fs';
8
+ import * as path from 'path';
9
+ import { spawn } from 'child_process';
10
+ /**
11
+ * Execute a script with environment variables
12
+ */
13
+ export async function executeScript(scriptPath, env, options = {}) {
14
+ return new Promise((resolve) => {
15
+ const ext = path.extname(scriptPath).toLowerCase();
16
+ const isWindows = process.platform === 'win32';
17
+ let command;
18
+ let args;
19
+ let useShell;
20
+ // Determine how to run based on extension
21
+ if (ext === '.ps1') {
22
+ command = 'powershell';
23
+ args = ['-ExecutionPolicy', 'Bypass', '-File', scriptPath];
24
+ useShell = false;
25
+ }
26
+ else if (ext === '.py') {
27
+ // Python needs shell on Windows for PATH resolution
28
+ command = isWindows ? 'python' : 'python3';
29
+ // On Windows, wrap path in quotes to handle spaces
30
+ args = [isWindows ? `"${scriptPath}"` : scriptPath];
31
+ useShell = isWindows;
32
+ }
33
+ else if (ext === '.js' || ext === '.mjs') {
34
+ // Node.js is typically in PATH and works without shell
35
+ command = process.execPath; // Use the same Node that's running this script
36
+ args = [scriptPath];
37
+ useShell = false;
38
+ }
39
+ else {
40
+ // Assume shell script (.sh or no extension)
41
+ command = isWindows ? 'bash' : '/bin/bash';
42
+ args = [scriptPath];
43
+ useShell = false;
44
+ }
45
+ const proc = spawn(command, args, {
46
+ env: { ...process.env, ...env },
47
+ cwd: path.dirname(scriptPath),
48
+ stdio: ['ignore', 'pipe', 'pipe'],
49
+ shell: useShell,
50
+ // On Windows with shell, use windowsVerbatimArguments to preserve paths with spaces
51
+ windowsVerbatimArguments: isWindows && useShell,
52
+ });
53
+ let stdout = '';
54
+ let stderr = '';
55
+ proc.stdout.on('data', (data) => {
56
+ stdout += data.toString();
57
+ if (options.verbose) {
58
+ process.stdout.write(data);
59
+ }
60
+ });
61
+ proc.stderr.on('data', (data) => {
62
+ stderr += data.toString();
63
+ if (options.verbose) {
64
+ process.stderr.write(data);
65
+ }
66
+ });
67
+ proc.on('error', (err) => {
68
+ resolve({ success: false, stdout, stderr, error: err.message });
69
+ });
70
+ proc.on('close', (code) => {
71
+ if (code === 0) {
72
+ resolve({ success: true, stdout, stderr });
73
+ }
74
+ else {
75
+ resolve({
76
+ success: false,
77
+ stdout,
78
+ stderr,
79
+ error: `Exit code ${code}: ${stderr.trim() || 'Unknown error'}`,
80
+ });
81
+ }
82
+ });
83
+ });
84
+ }
85
+ /**
86
+ * Run postprocess scripts for a given format
87
+ */
88
+ export async function runPostprocess(outputPath, format, config, options = {}) {
89
+ const postprocessConfig = config.postprocess || {};
90
+ // Collect scripts to run (format-specific + all)
91
+ const scripts = [];
92
+ if (postprocessConfig[format]) {
93
+ scripts.push(postprocessConfig[format]);
94
+ }
95
+ if (postprocessConfig.all) {
96
+ scripts.push(postprocessConfig.all);
97
+ }
98
+ if (scripts.length === 0) {
99
+ return { success: true };
100
+ }
101
+ const directory = path.dirname(outputPath);
102
+ const errors = [];
103
+ for (const scriptPath of scripts) {
104
+ const absoluteScript = path.isAbsolute(scriptPath)
105
+ ? scriptPath
106
+ : path.join(directory, scriptPath);
107
+ if (!fs.existsSync(absoluteScript)) {
108
+ errors.push(`Postprocess script not found: ${scriptPath}`);
109
+ continue;
110
+ }
111
+ try {
112
+ if (options.verbose) {
113
+ console.log(`Running postprocess script: ${scriptPath}`);
114
+ }
115
+ const result = await executeScript(absoluteScript, {
116
+ OUTPUT_FILE: outputPath,
117
+ OUTPUT_FORMAT: format,
118
+ PROJECT_DIR: directory,
119
+ CONFIG_PATH: config._configPath || '',
120
+ }, options);
121
+ if (!result.success) {
122
+ errors.push(`Script ${scriptPath} failed: ${result.error}`);
123
+ }
124
+ else if (options.verbose) {
125
+ console.log(`Postprocess script completed: ${scriptPath}`);
126
+ }
127
+ }
128
+ catch (err) {
129
+ const message = err instanceof Error ? err.message : String(err);
130
+ errors.push(`Script ${scriptPath} error: ${message}`);
131
+ }
132
+ }
133
+ return {
134
+ success: errors.length === 0,
135
+ error: errors.length > 0 ? errors.join('\n') : undefined,
136
+ };
137
+ }
138
+ //# sourceMappingURL=postprocess.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postprocess.js","sourceRoot":"","sources":["../../lib/postprocess.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * PPTX post-processing
3
+ *
4
+ * Injects logos into each slide of a generated PPTX to match ref.pptx styling.
5
+ * Uses ref.pptx as-is for --reference-doc, then post-processes to add logos.
6
+ */
7
+ interface ThemeFonts {
8
+ major?: string;
9
+ minor?: string;
10
+ }
11
+ interface Theme {
12
+ fonts?: ThemeFonts;
13
+ }
14
+ interface TemplateOptions {
15
+ baseTemplate: string;
16
+ outputPath: string;
17
+ }
18
+ interface BuildupConfig {
19
+ default?: string;
20
+ title?: string;
21
+ grey?: string;
22
+ accent?: string;
23
+ enabled?: boolean;
24
+ }
25
+ /**
26
+ * Inject slide numbers into each slide of a PPTX
27
+ * Only adds slide numbers to slides that have a footer (i.e., slides with the green banner).
28
+ * Title slides, section slides, cover slides don't have the banner so they don't get numbers.
29
+ * Uses in-place ZIP modification to preserve file structure.
30
+ */
31
+ export declare function injectSlideNumbers(pptxPath: string): Promise<void>;
32
+ /**
33
+ * Inject logos into cover slide of a PPTX (matching ref.pptx style)
34
+ * Uses in-place ZIP modification to preserve file structure.
35
+ */
36
+ export declare function injectLogosIntoSlides(pptxPath: string, mediaDir: string | null): Promise<void>;
37
+ export declare function generatePptxTemplate(options: TemplateOptions): Promise<string | null>;
38
+ export declare function templateNeedsRegeneration(templatePath: string, mediaDir: string, baseTemplate: string): boolean;
39
+ export declare function injectMediaIntoPptx(pptxPath: string, mediaDir: string): Promise<void>;
40
+ /**
41
+ * Apply theme fonts to all text in a PPTX
42
+ * Pandoc generates slides with hardcoded fonts; this replaces them with theme font references.
43
+ * Uses in-place ZIP modification to preserve file structure.
44
+ */
45
+ export declare function applyThemeFonts(pptxPath: string, theme: Theme): Promise<void>;
46
+ /**
47
+ * Apply vertical centering to slides that have the .center class
48
+ * Uses in-place ZIP modification to preserve file structure.
49
+ */
50
+ export declare function applyCentering(pptxPath: string, centeredSlideIndices: number[]): Promise<void>;
51
+ /**
52
+ * Apply buildup greying to slides with buildup content
53
+ * Greys out all bullet items except the last one, which gets the accent color.
54
+ * Only affects actual bullet items (not intro text with buNone).
55
+ * Uses in-place ZIP modification to preserve file structure.
56
+ */
57
+ export declare function applyBuildupColors(pptxPath: string, config?: BuildupConfig): Promise<void>;
58
+ export {};
59
+ //# sourceMappingURL=pptx-template.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pptx-template.d.ts","sourceRoot":"","sources":["../../lib/pptx-template.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,UAAU,UAAU;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,KAAK;IACb,KAAK,CAAC,EAAE,UAAU,CAAC;CACpB;AAED,UAAU,eAAe;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,aAAa;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AA0ED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgExE;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CA0HpG;AAGD,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAS3F;AAED,wBAAgB,yBAAyB,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAE/G;AAED,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAG3F;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CA0CnF;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,oBAAoB,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAwEpG;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqKpG"}