@zaowu-labs/doc 1.0.1
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/README.md +30 -0
- package/dist/index.d.ts +61 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +426 -0
- package/dist/index.js.map +1 -0
- package/package.json +46 -0
package/README.md
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# @zaowu-labs/doc
|
|
2
|
+
|
|
3
|
+
Document workflow package for ZaoWu.
|
|
4
|
+
|
|
5
|
+
This package extracts and summarizes text from supported document inputs,
|
|
6
|
+
including text-like files, HTML, PDF, and DOCX in the foundation version.
|
|
7
|
+
HTML extraction preserves heading levels and lightweight table row structure
|
|
8
|
+
when producing text for outline, search, summary, or conversion commands.
|
|
9
|
+
|
|
10
|
+
## PDF Support Note (Foundation Workaround)
|
|
11
|
+
|
|
12
|
+
PDF text extraction uses `pdf-parse`. That library has a transitive/optional
|
|
13
|
+
dependency on `@napi-rs/canvas`. Even for pure text extraction, in many Node
|
|
14
|
+
environments it will emit a warning or assume certain DOM globals exist.
|
|
15
|
+
|
|
16
|
+
We install minimal shims for `DOMMatrix`, `ImageData` and `Path2D` on
|
|
17
|
+
`globalThis` (only if they are missing) and temporarily suppress the exact
|
|
18
|
+
canvas warning during the dynamic import. This is a contained, documented
|
|
19
|
+
workaround.
|
|
20
|
+
|
|
21
|
+
Long-term we would prefer a pure-JS text-only PDF extractor that does not
|
|
22
|
+
require these shims. See the source comments in `src/index.ts` (functions
|
|
23
|
+
`ensurePdfTextRuntime` and `importPdfParse`) for the full explanation and
|
|
24
|
+
the class names used for the shims.
|
|
25
|
+
|
|
26
|
+
Safety:
|
|
27
|
+
|
|
28
|
+
- Document conversion previews by default when an output path is supplied.
|
|
29
|
+
- Confirmed writes refuse unsafe overwrites.
|
|
30
|
+
- Format support should stay explicit in command help and docs.
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { type DomainDefinition } from '@zaowu-labs/core';
|
|
2
|
+
export interface DocumentSummary {
|
|
3
|
+
schemaVersion: 1;
|
|
4
|
+
status: 'ok';
|
|
5
|
+
filePath: string;
|
|
6
|
+
title: string;
|
|
7
|
+
lineCount: number;
|
|
8
|
+
wordCount: number;
|
|
9
|
+
summary: string;
|
|
10
|
+
}
|
|
11
|
+
export interface DocumentExtract {
|
|
12
|
+
schemaVersion: 1;
|
|
13
|
+
status: 'ok';
|
|
14
|
+
filePath: string;
|
|
15
|
+
headings: string[];
|
|
16
|
+
links: string[];
|
|
17
|
+
codeBlockCount: number;
|
|
18
|
+
frontmatter: Record<string, string>;
|
|
19
|
+
}
|
|
20
|
+
export interface DocumentConversion {
|
|
21
|
+
schemaVersion: 1;
|
|
22
|
+
status: 'ok' | 'preview';
|
|
23
|
+
inputPath: string;
|
|
24
|
+
outputPath?: string;
|
|
25
|
+
format: 'markdown' | 'text';
|
|
26
|
+
content: string;
|
|
27
|
+
wroteFile: boolean;
|
|
28
|
+
}
|
|
29
|
+
export interface DocumentOutlineItem {
|
|
30
|
+
level: number;
|
|
31
|
+
title: string;
|
|
32
|
+
line: number;
|
|
33
|
+
}
|
|
34
|
+
export interface DocumentOutline {
|
|
35
|
+
schemaVersion: 1;
|
|
36
|
+
status: 'ok';
|
|
37
|
+
filePath: string;
|
|
38
|
+
outline: DocumentOutlineItem[];
|
|
39
|
+
}
|
|
40
|
+
export interface DocumentSearchMatch {
|
|
41
|
+
line: number;
|
|
42
|
+
text: string;
|
|
43
|
+
}
|
|
44
|
+
export interface DocumentSearchResult {
|
|
45
|
+
schemaVersion: 1;
|
|
46
|
+
status: 'ok';
|
|
47
|
+
filePath: string;
|
|
48
|
+
keyword: string;
|
|
49
|
+
matches: DocumentSearchMatch[];
|
|
50
|
+
}
|
|
51
|
+
export declare const DOC_DOMAIN: DomainDefinition;
|
|
52
|
+
export declare const summarizeDocument: (filePath: string) => Promise<DocumentSummary>;
|
|
53
|
+
export declare const extractDocument: (filePath: string) => Promise<DocumentExtract>;
|
|
54
|
+
export declare const outlineDocument: (filePath: string) => Promise<DocumentOutline>;
|
|
55
|
+
export declare const searchDocument: (filePath: string, keyword: string) => Promise<DocumentSearchResult>;
|
|
56
|
+
export declare const convertDocument: (inputPath: string, options?: {
|
|
57
|
+
outputPath?: string;
|
|
58
|
+
format?: "markdown" | "text";
|
|
59
|
+
yes?: boolean;
|
|
60
|
+
}) => Promise<DocumentConversion>;
|
|
61
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAKL,KAAK,gBAAgB,EACtB,MAAM,kBAAkB,CAAC;AAE1B,MAAM,WAAW,eAAe;IAC9B,aAAa,EAAE,CAAC,CAAC;IACjB,MAAM,EAAE,IAAI,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,aAAa,EAAE,CAAC,CAAC;IACjB,MAAM,EAAE,IAAI,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACrC;AAED,MAAM,WAAW,kBAAkB;IACjC,aAAa,EAAE,CAAC,CAAC;IACjB,MAAM,EAAE,IAAI,GAAG,SAAS,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,UAAU,GAAG,MAAM,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,eAAe;IAC9B,aAAa,EAAE,CAAC,CAAC;IACjB,MAAM,EAAE,IAAI,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,mBAAmB,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,oBAAoB;IACnC,aAAa,EAAE,CAAC,CAAC;IACjB,MAAM,EAAE,IAAI,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,mBAAmB,EAAE,CAAC;CAChC;AAED,eAAO,MAAM,UAAU,EAAE,gBAmCxB,CAAC;AAiXF,eAAO,MAAM,iBAAiB,GAAU,UAAU,MAAM,KAAG,OAAO,CAAC,eAAe,CAejF,CAAC;AAEF,eAAO,MAAM,eAAe,GAAU,UAAU,MAAM,KAAG,OAAO,CAAC,eAAe,CAe/E,CAAC;AAEF,eAAO,MAAM,eAAe,GAAU,UAAU,MAAM,KAAG,OAAO,CAAC,eAAe,CAS/E,CAAC;AAEF,eAAO,MAAM,cAAc,GACzB,UAAU,MAAM,EAChB,SAAS,MAAM,KACd,OAAO,CAAC,oBAAoB,CA6B9B,CAAC;AAEF,eAAO,MAAM,eAAe,GAC1B,WAAW,MAAM,EACjB,UAAS;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,UAAU,GAAG,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,OAAO,CAAA;CAAO,KACjF,OAAO,CAAC,kBAAkB,CA+C5B,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,426 @@
|
|
|
1
|
+
import { readFile, writeFile } from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { createCapabilityLedger, pathExists, stripUtf8Bom, ZaoWuError, } from '@zaowu-labs/core';
|
|
4
|
+
export const DOC_DOMAIN = {
|
|
5
|
+
name: 'doc',
|
|
6
|
+
summary: 'Document workflows for summary, extraction, and conversion',
|
|
7
|
+
capabilities: createCapabilityLedger({
|
|
8
|
+
readsFiles: true,
|
|
9
|
+
writesFiles: true,
|
|
10
|
+
}),
|
|
11
|
+
commands: [
|
|
12
|
+
{
|
|
13
|
+
name: 'summary',
|
|
14
|
+
summary: 'Summarize a document',
|
|
15
|
+
status: 'available',
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
name: 'extract',
|
|
19
|
+
summary: 'Extract structured content from a document',
|
|
20
|
+
status: 'available',
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
name: 'convert',
|
|
24
|
+
summary: 'Convert a document with explicit output control',
|
|
25
|
+
status: 'available',
|
|
26
|
+
sensitive: true,
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
name: 'outline',
|
|
30
|
+
summary: 'Create an outline from document headings',
|
|
31
|
+
status: 'available',
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
name: 'search',
|
|
35
|
+
summary: 'Search a supported document for a keyword',
|
|
36
|
+
status: 'available',
|
|
37
|
+
},
|
|
38
|
+
],
|
|
39
|
+
};
|
|
40
|
+
const SUPPORTED_TEXT_EXTENSIONS = new Set([
|
|
41
|
+
'.txt',
|
|
42
|
+
'.md',
|
|
43
|
+
'.markdown',
|
|
44
|
+
'.csv',
|
|
45
|
+
'.json',
|
|
46
|
+
'.yml',
|
|
47
|
+
'.yaml',
|
|
48
|
+
'.pdf',
|
|
49
|
+
'.docx',
|
|
50
|
+
'.html',
|
|
51
|
+
'.htm',
|
|
52
|
+
]);
|
|
53
|
+
let pdfParseModulePromise;
|
|
54
|
+
const ensurePdfTextRuntime = () => {
|
|
55
|
+
const runtime = globalThis;
|
|
56
|
+
// Minimal DOMMatrix shim sufficient for pdf-parse text extraction.
|
|
57
|
+
runtime.DOMMatrix ??= class ZaoWuPdfDomMatrix {
|
|
58
|
+
a = 1;
|
|
59
|
+
b = 0;
|
|
60
|
+
c = 0;
|
|
61
|
+
d = 1;
|
|
62
|
+
e = 0;
|
|
63
|
+
f = 0;
|
|
64
|
+
constructor(init) {
|
|
65
|
+
if (Array.isArray(init) && init.length >= 6) {
|
|
66
|
+
[this.a, this.b, this.c, this.d, this.e, this.f] = init.map(Number).slice(0, 6);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
multiplySelf() {
|
|
70
|
+
return this;
|
|
71
|
+
}
|
|
72
|
+
preMultiplySelf() {
|
|
73
|
+
return this;
|
|
74
|
+
}
|
|
75
|
+
translateSelf() {
|
|
76
|
+
return this;
|
|
77
|
+
}
|
|
78
|
+
scaleSelf() {
|
|
79
|
+
return this;
|
|
80
|
+
}
|
|
81
|
+
rotateSelf() {
|
|
82
|
+
return this;
|
|
83
|
+
}
|
|
84
|
+
invertSelf() {
|
|
85
|
+
return this;
|
|
86
|
+
}
|
|
87
|
+
transformPoint(point = {}) {
|
|
88
|
+
return {
|
|
89
|
+
x: point.x ?? 0,
|
|
90
|
+
y: point.y ?? 0,
|
|
91
|
+
z: point.z ?? 0,
|
|
92
|
+
w: point.w ?? 1,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
// Minimal ImageData shim.
|
|
97
|
+
runtime.ImageData ??= class ZaoWuPdfImageData {
|
|
98
|
+
data;
|
|
99
|
+
width;
|
|
100
|
+
height;
|
|
101
|
+
constructor(dataOrWidth, width = 0, height = 0) {
|
|
102
|
+
this.width = typeof dataOrWidth === 'number' ? dataOrWidth : width;
|
|
103
|
+
this.height = height;
|
|
104
|
+
this.data =
|
|
105
|
+
dataOrWidth instanceof Uint8ClampedArray
|
|
106
|
+
? dataOrWidth
|
|
107
|
+
: new Uint8ClampedArray(dataOrWidth * width * 4);
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
// Path2D is referenced but never actually used in our text-only path.
|
|
111
|
+
runtime.Path2D ??= class ZaoWuPdfPath2D {
|
|
112
|
+
};
|
|
113
|
+
};
|
|
114
|
+
const importPdfParse = async () => {
|
|
115
|
+
ensurePdfTextRuntime();
|
|
116
|
+
if (!pdfParseModulePromise) {
|
|
117
|
+
const originalWarn = console.warn;
|
|
118
|
+
// Only suppress the specific canvas-missing warning that pdf-parse emits
|
|
119
|
+
// when it can't find its optional native module. Everything else is passed
|
|
120
|
+
// through so we don't accidentally hide real problems.
|
|
121
|
+
console.warn = (...values) => {
|
|
122
|
+
const message = values.map(String).join(' ');
|
|
123
|
+
if (message.includes('Cannot load "@napi-rs/canvas" package')) {
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
originalWarn(...values);
|
|
127
|
+
};
|
|
128
|
+
pdfParseModulePromise = import('pdf-parse')
|
|
129
|
+
.catch((error) => {
|
|
130
|
+
pdfParseModulePromise = undefined;
|
|
131
|
+
throw error;
|
|
132
|
+
})
|
|
133
|
+
.finally(() => {
|
|
134
|
+
console.warn = originalWarn;
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
return pdfParseModulePromise;
|
|
138
|
+
};
|
|
139
|
+
const assertSupportedDocument = (filePath) => {
|
|
140
|
+
const extension = path.extname(filePath).toLowerCase();
|
|
141
|
+
if (!SUPPORTED_TEXT_EXTENSIONS.has(extension)) {
|
|
142
|
+
throw new ZaoWuError({
|
|
143
|
+
code: 'DOCUMENT_FORMAT_UNSUPPORTED',
|
|
144
|
+
message: 'Document format is not supported yet.',
|
|
145
|
+
why: `ZaoWu can read text, Markdown-like, PDF, DOCX, and HTML files. It cannot parse \`${extension || 'unknown'}\` files yet.`,
|
|
146
|
+
fix: 'Use `.txt`, `.md`, `.pdf`, `.docx`, `.html`, or `.htm`, or add a parser inside `packages/doc` before using this format.',
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
};
|
|
150
|
+
const stripHtmlTags = (html) => {
|
|
151
|
+
let clean = html.replace(/<!--[\s\S]*?-->/g, '');
|
|
152
|
+
clean = clean.replace(/<(head|script|style)\b[^>]*>([\s\S]*?)<\/\1>/gi, '');
|
|
153
|
+
clean = clean.replace(/<h([1-6])\b[^>]*>/gi, (_match, level) => `${'#'.repeat(Number(level))} `);
|
|
154
|
+
clean = clean.replace(/<\/h[1-6]>\s*/gi, '\n');
|
|
155
|
+
clean = clean.replace(/<\/t[dh]>\s*/gi, ' | ');
|
|
156
|
+
clean = clean.replace(/<\/tr>\s*/gi, '\n');
|
|
157
|
+
clean = clean.replace(/<\/(p|div|li)>\s*/gi, '\n');
|
|
158
|
+
clean = clean.replace(/<br\s*\/?>\s*/gi, '\n');
|
|
159
|
+
clean = clean.replace(/<[^>]+>/g, ' ');
|
|
160
|
+
clean = clean
|
|
161
|
+
.replaceAll(' ', ' ')
|
|
162
|
+
.replaceAll('&', '&')
|
|
163
|
+
.replaceAll('<', '<')
|
|
164
|
+
.replaceAll('>', '>')
|
|
165
|
+
.replaceAll('"', '"')
|
|
166
|
+
.replaceAll(''', "'")
|
|
167
|
+
.replaceAll(''', "'")
|
|
168
|
+
.replaceAll(''', "'")
|
|
169
|
+
.replaceAll('"', '"')
|
|
170
|
+
.replaceAll('"', '"')
|
|
171
|
+
.replaceAll('&', '&')
|
|
172
|
+
.replaceAll('<', '<')
|
|
173
|
+
.replaceAll('>', '>');
|
|
174
|
+
return clean
|
|
175
|
+
.split(/\r?\n/)
|
|
176
|
+
.map((line) => line
|
|
177
|
+
.replace(/\s+\|\s*$/g, '')
|
|
178
|
+
.replace(/\s+\|\s+/g, ' | ')
|
|
179
|
+
.trim())
|
|
180
|
+
.filter((line, idx, arr) => line || (idx > 0 && arr[idx - 1]))
|
|
181
|
+
.join('\n')
|
|
182
|
+
.trim();
|
|
183
|
+
};
|
|
184
|
+
const readTextDocument = async (filePath, format) => {
|
|
185
|
+
assertSupportedDocument(filePath);
|
|
186
|
+
const extension = path.extname(filePath).toLowerCase();
|
|
187
|
+
try {
|
|
188
|
+
if (extension === '.pdf') {
|
|
189
|
+
const runtime = globalThis;
|
|
190
|
+
const hadDOMMatrix = 'DOMMatrix' in runtime;
|
|
191
|
+
const hadImageData = 'ImageData' in runtime;
|
|
192
|
+
const hadPath2D = 'Path2D' in runtime;
|
|
193
|
+
const oldDOMMatrix = runtime.DOMMatrix;
|
|
194
|
+
const oldImageData = runtime.ImageData;
|
|
195
|
+
const oldPath2D = runtime.Path2D;
|
|
196
|
+
try {
|
|
197
|
+
const { PDFParse } = await importPdfParse();
|
|
198
|
+
const parser = new PDFParse({
|
|
199
|
+
data: new Uint8Array(await readFile(filePath)),
|
|
200
|
+
});
|
|
201
|
+
try {
|
|
202
|
+
const parsed = await parser.getText();
|
|
203
|
+
return stripUtf8Bom(parsed.text ?? '');
|
|
204
|
+
}
|
|
205
|
+
finally {
|
|
206
|
+
await parser.destroy();
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
finally {
|
|
210
|
+
if (!hadDOMMatrix) {
|
|
211
|
+
delete runtime.DOMMatrix;
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
runtime.DOMMatrix = oldDOMMatrix;
|
|
215
|
+
}
|
|
216
|
+
if (!hadImageData) {
|
|
217
|
+
delete runtime.ImageData;
|
|
218
|
+
}
|
|
219
|
+
else {
|
|
220
|
+
runtime.ImageData = oldImageData;
|
|
221
|
+
}
|
|
222
|
+
if (!hadPath2D) {
|
|
223
|
+
delete runtime.Path2D;
|
|
224
|
+
}
|
|
225
|
+
else {
|
|
226
|
+
runtime.Path2D = oldPath2D;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
if (extension === '.docx') {
|
|
231
|
+
const mammoth = await import('mammoth');
|
|
232
|
+
const parsed = format === 'text'
|
|
233
|
+
? await mammoth.extractRawText({
|
|
234
|
+
buffer: await readFile(filePath),
|
|
235
|
+
})
|
|
236
|
+
: await mammoth.convertToMarkdown({
|
|
237
|
+
buffer: await readFile(filePath),
|
|
238
|
+
});
|
|
239
|
+
return stripUtf8Bom(parsed.value);
|
|
240
|
+
}
|
|
241
|
+
if (extension === '.html' || extension === '.htm') {
|
|
242
|
+
const rawHtml = await readFile(filePath, 'utf8');
|
|
243
|
+
return stripUtf8Bom(stripHtmlTags(rawHtml));
|
|
244
|
+
}
|
|
245
|
+
return stripUtf8Bom(await readFile(filePath, 'utf8'));
|
|
246
|
+
}
|
|
247
|
+
catch {
|
|
248
|
+
throw new ZaoWuError({
|
|
249
|
+
code: 'DOCUMENT_READ_FAILED',
|
|
250
|
+
message: 'Could not read document.',
|
|
251
|
+
why: `ZaoWu tried to read \`${filePath}\`, but the file was not readable.`,
|
|
252
|
+
fix: 'Check the path and file permissions, then run the command again.',
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
};
|
|
256
|
+
const assertSafeOutputPath = async (inputPath, outputPath) => {
|
|
257
|
+
if (path.resolve(inputPath) === path.resolve(outputPath)) {
|
|
258
|
+
throw new ZaoWuError({
|
|
259
|
+
code: 'DOCUMENT_OUTPUT_CONFLICT',
|
|
260
|
+
message: 'Document output path conflicts with input path.',
|
|
261
|
+
why: '`zw doc convert` refuses to overwrite the input document.',
|
|
262
|
+
fix: 'Choose a different `--output` path.',
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
if (await pathExists(outputPath)) {
|
|
266
|
+
throw new ZaoWuError({
|
|
267
|
+
code: 'DOCUMENT_OUTPUT_CONFLICT',
|
|
268
|
+
message: 'Document output file already exists.',
|
|
269
|
+
why: `ZaoWu will not silently overwrite \`${outputPath}\`.`,
|
|
270
|
+
fix: 'Choose a new `--output` path, or remove the existing file yourself first.',
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
};
|
|
274
|
+
const getTitle = (content, filePath) => {
|
|
275
|
+
const heading = content
|
|
276
|
+
.split(/\r?\n/)
|
|
277
|
+
.map((line) => /^#\s+(.+)$/.exec(line.trim())?.[1])
|
|
278
|
+
.find((value) => Boolean(value));
|
|
279
|
+
return heading ?? path.basename(filePath);
|
|
280
|
+
};
|
|
281
|
+
const getWords = (content) => content.match(/[\p{L}\p{N}_-]+/gu) ?? [];
|
|
282
|
+
const getFirstMeaningfulLines = (content, count) => content
|
|
283
|
+
.split(/\r?\n/)
|
|
284
|
+
.map((line) => line.trim())
|
|
285
|
+
.filter((line) => line && !line.startsWith('#'))
|
|
286
|
+
.slice(0, count);
|
|
287
|
+
const getFrontmatter = (content) => {
|
|
288
|
+
const lines = content.split(/\r?\n/);
|
|
289
|
+
if (lines[0] !== '---') {
|
|
290
|
+
return {};
|
|
291
|
+
}
|
|
292
|
+
const endIndex = lines.slice(1).findIndex((line) => line === '---');
|
|
293
|
+
if (endIndex < 0) {
|
|
294
|
+
return {};
|
|
295
|
+
}
|
|
296
|
+
const frontmatter = {};
|
|
297
|
+
for (const line of lines.slice(1, endIndex + 1)) {
|
|
298
|
+
const match = /^([A-Za-z0-9_-]+):\s*(.+)$/.exec(line);
|
|
299
|
+
if (match) {
|
|
300
|
+
frontmatter[match[1]] = match[2].trim();
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
return frontmatter;
|
|
304
|
+
};
|
|
305
|
+
const getOutline = (content) => content
|
|
306
|
+
.split(/\r?\n/)
|
|
307
|
+
.map((line, index) => {
|
|
308
|
+
const match = /^(#{1,6})\s+(.+)$/.exec(line.trim());
|
|
309
|
+
return match
|
|
310
|
+
? {
|
|
311
|
+
level: match[1].length,
|
|
312
|
+
title: match[2].trim(),
|
|
313
|
+
line: index + 1,
|
|
314
|
+
}
|
|
315
|
+
: null;
|
|
316
|
+
})
|
|
317
|
+
.filter((item) => Boolean(item));
|
|
318
|
+
export const summarizeDocument = async (filePath) => {
|
|
319
|
+
const content = await readTextDocument(filePath);
|
|
320
|
+
const lines = content.split(/\r?\n/);
|
|
321
|
+
const words = getWords(content);
|
|
322
|
+
const summaryLines = getFirstMeaningfulLines(content, 3);
|
|
323
|
+
return {
|
|
324
|
+
schemaVersion: 1,
|
|
325
|
+
status: 'ok',
|
|
326
|
+
filePath,
|
|
327
|
+
title: getTitle(content, filePath),
|
|
328
|
+
lineCount: lines.length,
|
|
329
|
+
wordCount: words.length,
|
|
330
|
+
summary: summaryLines.length > 0 ? summaryLines.join(' ') : 'No summary text found.',
|
|
331
|
+
};
|
|
332
|
+
};
|
|
333
|
+
export const extractDocument = async (filePath) => {
|
|
334
|
+
const content = await readTextDocument(filePath);
|
|
335
|
+
const headings = [...content.matchAll(/^#{1,6}\s+(.+)$/gmu)].map((match) => match[1].trim());
|
|
336
|
+
const links = [...content.matchAll(/\[[^\]]+\]\(([^)]+)\)/gmu)].map((match) => match[1].trim());
|
|
337
|
+
const codeBlockCount = [...content.matchAll(/^```/gmu)].length / 2;
|
|
338
|
+
return {
|
|
339
|
+
schemaVersion: 1,
|
|
340
|
+
status: 'ok',
|
|
341
|
+
filePath,
|
|
342
|
+
headings,
|
|
343
|
+
links,
|
|
344
|
+
codeBlockCount: Math.floor(codeBlockCount),
|
|
345
|
+
frontmatter: getFrontmatter(content),
|
|
346
|
+
};
|
|
347
|
+
};
|
|
348
|
+
export const outlineDocument = async (filePath) => {
|
|
349
|
+
const content = await readTextDocument(filePath);
|
|
350
|
+
return {
|
|
351
|
+
schemaVersion: 1,
|
|
352
|
+
status: 'ok',
|
|
353
|
+
filePath,
|
|
354
|
+
outline: getOutline(content),
|
|
355
|
+
};
|
|
356
|
+
};
|
|
357
|
+
export const searchDocument = async (filePath, keyword) => {
|
|
358
|
+
const trimmedKeyword = keyword.trim();
|
|
359
|
+
if (!trimmedKeyword) {
|
|
360
|
+
throw new ZaoWuError({
|
|
361
|
+
code: 'DOCUMENT_SEARCH_KEYWORD_REQUIRED',
|
|
362
|
+
message: 'Search keyword is required.',
|
|
363
|
+
why: '`zw doc search` needs a non-empty keyword.',
|
|
364
|
+
fix: 'Run `zw doc search README.md install`.',
|
|
365
|
+
});
|
|
366
|
+
}
|
|
367
|
+
const content = await readTextDocument(filePath);
|
|
368
|
+
const lowerKeyword = trimmedKeyword.toLowerCase();
|
|
369
|
+
const matches = content
|
|
370
|
+
.split(/\r?\n/)
|
|
371
|
+
.map((line, index) => ({
|
|
372
|
+
line: index + 1,
|
|
373
|
+
text: line.trim(),
|
|
374
|
+
}))
|
|
375
|
+
.filter((match) => match.text.toLowerCase().includes(lowerKeyword));
|
|
376
|
+
return {
|
|
377
|
+
schemaVersion: 1,
|
|
378
|
+
status: 'ok',
|
|
379
|
+
filePath,
|
|
380
|
+
keyword: trimmedKeyword,
|
|
381
|
+
matches,
|
|
382
|
+
};
|
|
383
|
+
};
|
|
384
|
+
export const convertDocument = async (inputPath, options = {}) => {
|
|
385
|
+
const format = options.format ??
|
|
386
|
+
(path.extname(options.outputPath ?? '').toLowerCase() === '.txt' ? 'text' : 'markdown');
|
|
387
|
+
const content = await readTextDocument(inputPath, format);
|
|
388
|
+
const converted = format === 'text'
|
|
389
|
+
? content.replace(/^#{1,6}\s+/gmu, '').replace(/\[([^\]]+)\]\([^)]+\)/gmu, '$1')
|
|
390
|
+
: content;
|
|
391
|
+
if (options.outputPath && options.yes) {
|
|
392
|
+
await assertSafeOutputPath(inputPath, options.outputPath);
|
|
393
|
+
try {
|
|
394
|
+
await writeFile(options.outputPath, converted, { encoding: 'utf8', flag: 'wx' });
|
|
395
|
+
}
|
|
396
|
+
catch (error) {
|
|
397
|
+
if (error instanceof ZaoWuError) {
|
|
398
|
+
throw error;
|
|
399
|
+
}
|
|
400
|
+
if (error.code === 'EEXIST') {
|
|
401
|
+
throw new ZaoWuError({
|
|
402
|
+
code: 'DOCUMENT_OUTPUT_CONFLICT',
|
|
403
|
+
message: 'Document output file already exists.',
|
|
404
|
+
why: `ZaoWu will not silently overwrite \`${options.outputPath}\`.`,
|
|
405
|
+
fix: 'Choose a new `--output` path, or remove the existing file yourself first.',
|
|
406
|
+
});
|
|
407
|
+
}
|
|
408
|
+
throw new ZaoWuError({
|
|
409
|
+
code: 'DOCUMENT_WRITE_FAILED',
|
|
410
|
+
message: 'Could not write converted document.',
|
|
411
|
+
why: `ZaoWu tried to write \`${options.outputPath}\`, but the file system rejected the write.`,
|
|
412
|
+
fix: 'Check the output directory and permissions, then run the command again.',
|
|
413
|
+
});
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
return {
|
|
417
|
+
schemaVersion: 1,
|
|
418
|
+
status: options.outputPath && !options.yes ? 'preview' : 'ok',
|
|
419
|
+
inputPath,
|
|
420
|
+
outputPath: options.outputPath,
|
|
421
|
+
format,
|
|
422
|
+
content: converted,
|
|
423
|
+
wroteFile: Boolean(options.outputPath && options.yes),
|
|
424
|
+
};
|
|
425
|
+
};
|
|
426
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@zaowu-labs/doc",
|
|
3
|
+
"version": "1.0.1",
|
|
4
|
+
"description": "ZaoWu document workflows",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "Apache-2.0",
|
|
7
|
+
"publishConfig": {
|
|
8
|
+
"access": "public"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"dist",
|
|
12
|
+
"README.md"
|
|
13
|
+
],
|
|
14
|
+
"main": "./dist/index.js",
|
|
15
|
+
"types": "./dist/index.d.ts",
|
|
16
|
+
"exports": {
|
|
17
|
+
".": {
|
|
18
|
+
"types": "./dist/index.d.ts",
|
|
19
|
+
"import": "./dist/index.js"
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
"scripts": {
|
|
23
|
+
"build": "tsc -b --pretty false",
|
|
24
|
+
"typecheck": "tsc -b --pretty false",
|
|
25
|
+
"dev": "tsc -b --watch"
|
|
26
|
+
},
|
|
27
|
+
"dependencies": {
|
|
28
|
+
"@zaowu-labs/core": "workspace:*",
|
|
29
|
+
"mammoth": "^1.12.0",
|
|
30
|
+
"pdf-parse": "^2.4.5"
|
|
31
|
+
},
|
|
32
|
+
"keywords": [
|
|
33
|
+
"zaowu",
|
|
34
|
+
"documents"
|
|
35
|
+
],
|
|
36
|
+
"devDependencies": {
|
|
37
|
+
"jszip": "^3.10.1"
|
|
38
|
+
},
|
|
39
|
+
"repository": {
|
|
40
|
+
"type": "git",
|
|
41
|
+
"url": "https://github.com/zaowu-labs/zaowu.git",
|
|
42
|
+
"directory": "packages/doc"
|
|
43
|
+
},
|
|
44
|
+
"homepage": "https://github.com/zaowu-labs/zaowu",
|
|
45
|
+
"bugs": "https://github.com/zaowu-labs/zaowu/issues"
|
|
46
|
+
}
|