teamshare-bridge 0.15.0 → 0.16.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/dist/lib/doc-reply.js +3 -2
- package/dist/lib/doc-reply.js.map +1 -1
- package/dist/lib/tools/docx-report.js +149 -258
- package/dist/lib/tools/docx-report.js.map +1 -1
- package/dist/lib/tools/docx-to-pdf.d.ts +10 -0
- package/dist/lib/tools/docx-to-pdf.js +27 -0
- package/dist/lib/tools/docx-to-pdf.js.map +1 -0
- package/dist/lib/tools/pdf-exporter.js +266 -207
- package/dist/lib/tools/pdf-exporter.js.map +1 -1
- package/dist/lib/tools/pptx-deck.js +1 -1
- package/dist/lib/tools/runner.js +2 -0
- package/dist/lib/tools/runner.js.map +1 -1
- package/dist/lib/tools/xlsx-workbook.js +1 -1
- package/package.json +59 -58
package/dist/lib/doc-reply.js
CHANGED
|
@@ -137,11 +137,12 @@ function docPrompt(agentName, docName, docText, target, context, maxChars, proje
|
|
|
137
137
|
'- add_comment: reply in other threads. search/list tools: check what exists BEFORE creating (no duplicates).',
|
|
138
138
|
'',
|
|
139
139
|
'== DOCUMENT CREATION TOOLS (create rich files for the user) ==',
|
|
140
|
-
'- docx-report:
|
|
140
|
+
'- docx-report: professional Word docs with cover page, TOC, callout boxes, images from URLs, styled headings. Params: title, markdown, includeToc, accentColor, subtitle, author.',
|
|
141
141
|
'- chart-builder: chart PNGs from CSV (bar/line/pie/scatter). Params: dataCsv, chartTypes, xKey, yKey.',
|
|
142
142
|
'- xlsx-workbook: Excel spreadsheets. Params: sheets (JSON array with name, headers, rows).',
|
|
143
|
-
'- pdf-exporter: PDF
|
|
143
|
+
'- pdf-exporter: professional PDF with cover page, TOC outline, callouts, images, headers/footers. Params: markdown, pageSize, orientation.',
|
|
144
144
|
'- pptx-deck: PowerPoint from outline (H1=title, H2=slide, H3=bullets). Params: outlineMd, theme.',
|
|
145
|
+
'- docx-to-pdf: convert any .docx to pixel-perfect PDF via LibreOffice. Params: docxBase64 (base64 of the .docx file).',
|
|
145
146
|
'If the comment asks you to DO something (create a task, write a document, note an issue, look something up), use the appropriate tool and report the concrete result (e.g. the task key or document link). Only claim success if a tool returned it.',
|
|
146
147
|
]
|
|
147
148
|
: []),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doc-reply.js","sourceRoot":"","sources":["../../src/lib/doc-reply.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"doc-reply.js","sourceRoot":"","sources":["../../src/lib/doc-reply.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,13 +3,28 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.DocxReportTool = void 0;
|
|
4
4
|
/**
|
|
5
5
|
* DOCX Report Generator tool.
|
|
6
|
-
* Creates Word documents from markdown with
|
|
7
|
-
*
|
|
6
|
+
* Creates publication-quality Word documents from markdown with:
|
|
7
|
+
* - Branded cover page (title, subtitle, date, accent line)
|
|
8
|
+
* - Auto-updating Table of Contents
|
|
9
|
+
* - Styled headings with accent color
|
|
10
|
+
* - Headers/footers with page numbers
|
|
11
|
+
* - GitHub-style callout boxes (NOTE, WARNING, TIP, IMPORTANT, CAUTION)
|
|
12
|
+
* - Embedded images from URLs and chart buffers
|
|
13
|
+
* - Page breaks, code blocks, tables, lists, blockquotes
|
|
8
14
|
*/
|
|
9
15
|
const docx_1 = require("docx");
|
|
10
16
|
const BODY_FONT = 'Calibri';
|
|
11
17
|
const CODE_FONT = 'Consolas';
|
|
12
18
|
const MAX_TABLE_COLS = 12;
|
|
19
|
+
const IMAGE_MAX_WIDTH = 500;
|
|
20
|
+
const DEFAULT_ACCENT = '16a34a';
|
|
21
|
+
const CALLOUT_MAP = {
|
|
22
|
+
NOTE: { label: 'Note', borderColor: '3b82f6', bgColor: 'eff6ff' },
|
|
23
|
+
WARNING: { label: 'Warning', borderColor: 'f59e0b', bgColor: 'fffbeb' },
|
|
24
|
+
TIP: { label: 'Tip', borderColor: '16a34a', bgColor: 'f0fdf4' },
|
|
25
|
+
IMPORTANT: { label: 'Important', borderColor: 'dc2626', bgColor: 'fef2f2' },
|
|
26
|
+
CAUTION: { label: 'Caution', borderColor: '6b7280', bgColor: 'f9fafb' },
|
|
27
|
+
};
|
|
13
28
|
function inlineSegments(raw) {
|
|
14
29
|
const segments = [];
|
|
15
30
|
const regex = /(\*\*[^*]+\*\*|\*[^*\n]+\*|`[^`\n]+`|\[[^\]\n]+\]\((?:https?:\/\/[^)\s]+)\))/g;
|
|
@@ -19,23 +34,18 @@ function inlineSegments(raw) {
|
|
|
19
34
|
if (index > last)
|
|
20
35
|
segments.push({ text: raw.slice(last, index) });
|
|
21
36
|
const token = match[0];
|
|
22
|
-
if (token.startsWith('**') && token.endsWith('**'))
|
|
37
|
+
if (token.startsWith('**') && token.endsWith('**'))
|
|
23
38
|
segments.push({ text: token.slice(2, -2), bold: true });
|
|
24
|
-
|
|
25
|
-
else if (token.startsWith('*') && token.endsWith('*')) {
|
|
39
|
+
else if (token.startsWith('*') && token.endsWith('*'))
|
|
26
40
|
segments.push({ text: token.slice(1, -1), italics: true });
|
|
27
|
-
|
|
28
|
-
else if (token.startsWith('`') && token.endsWith('`')) {
|
|
41
|
+
else if (token.startsWith('`') && token.endsWith('`'))
|
|
29
42
|
segments.push({ text: token.slice(1, -1), code: true });
|
|
30
|
-
}
|
|
31
43
|
else {
|
|
32
|
-
const
|
|
33
|
-
if (
|
|
34
|
-
segments.push({ text:
|
|
35
|
-
|
|
36
|
-
else {
|
|
44
|
+
const m = token.match(/^\[([^\]]+)\]\((https?:\/\/[^)\s]+)\)$/);
|
|
45
|
+
if (m)
|
|
46
|
+
segments.push({ text: m[1], link: m[2] });
|
|
47
|
+
else
|
|
37
48
|
segments.push({ text: token });
|
|
38
|
-
}
|
|
39
49
|
}
|
|
40
50
|
last = index + token.length;
|
|
41
51
|
}
|
|
@@ -45,72 +55,50 @@ function inlineSegments(raw) {
|
|
|
45
55
|
}
|
|
46
56
|
function inlineRuns(segments, accentColor) {
|
|
47
57
|
return segments.map((seg) => {
|
|
48
|
-
if (seg.code)
|
|
49
|
-
return new docx_1.TextRun({
|
|
50
|
-
|
|
51
|
-
font: CODE_FONT,
|
|
52
|
-
size: 20,
|
|
53
|
-
shading: { type: docx_1.ShadingType.CLEAR, fill: 'F2F2F2' },
|
|
54
|
-
});
|
|
55
|
-
}
|
|
56
|
-
return new docx_1.TextRun({
|
|
57
|
-
text: seg.text,
|
|
58
|
-
font: BODY_FONT,
|
|
59
|
-
bold: seg.bold,
|
|
60
|
-
italics: seg.italics,
|
|
61
|
-
color: accentColor,
|
|
62
|
-
});
|
|
58
|
+
if (seg.code)
|
|
59
|
+
return new docx_1.TextRun({ text: seg.text, font: CODE_FONT, size: 20, shading: { type: docx_1.ShadingType.CLEAR, fill: 'F2F2F2' } });
|
|
60
|
+
return new docx_1.TextRun({ text: seg.text, font: BODY_FONT, bold: seg.bold, italics: seg.italics, color: accentColor });
|
|
63
61
|
});
|
|
64
62
|
}
|
|
65
|
-
function
|
|
66
|
-
|
|
63
|
+
async function fetchImageBuffer(url) {
|
|
64
|
+
try {
|
|
65
|
+
const res = await fetch(url, { signal: AbortSignal.timeout(10_000) });
|
|
66
|
+
if (!res.ok)
|
|
67
|
+
return null;
|
|
68
|
+
return Buffer.from(await res.arrayBuffer());
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
67
71
|
return null;
|
|
68
|
-
const segments = inlineSegments(line);
|
|
69
|
-
const hasLink = segments.some((s) => s.link);
|
|
70
|
-
if (hasLink) {
|
|
71
|
-
const children = segments.map((seg) => seg.link
|
|
72
|
-
? new docx_1.ExternalHyperlink({
|
|
73
|
-
children: [new docx_1.TextRun({ text: seg.text, style: 'Hyperlink' })],
|
|
74
|
-
link: seg.link,
|
|
75
|
-
})
|
|
76
|
-
: new docx_1.TextRun({
|
|
77
|
-
text: seg.text,
|
|
78
|
-
font: BODY_FONT,
|
|
79
|
-
bold: seg.bold,
|
|
80
|
-
italics: seg.italics,
|
|
81
|
-
}));
|
|
82
|
-
return new docx_1.Paragraph({ children, spacing: { after: 120 } });
|
|
83
72
|
}
|
|
84
|
-
return new docx_1.Paragraph({
|
|
85
|
-
children: inlineRuns(segments, accentColor),
|
|
86
|
-
spacing: { after: 120 },
|
|
87
|
-
alignment: docx_1.AlignmentType.JUSTIFIED,
|
|
88
|
-
});
|
|
89
73
|
}
|
|
90
|
-
function
|
|
91
|
-
const
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
bottom: { style: docx_1.BorderStyle.SINGLE, size: 4, color: 'CCCCCC' },
|
|
106
|
-
left: { style: docx_1.BorderStyle.SINGLE, size: 4, color: 'CCCCCC' },
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
74
|
+
function imageTypeFromUrl(url) {
|
|
75
|
+
const l = url.toLowerCase();
|
|
76
|
+
if (l.endsWith('.png'))
|
|
77
|
+
return 'png';
|
|
78
|
+
if (l.endsWith('.gif'))
|
|
79
|
+
return 'gif';
|
|
80
|
+
if (l.endsWith('.bmp'))
|
|
81
|
+
return 'bmp';
|
|
82
|
+
return 'jpg';
|
|
83
|
+
}
|
|
84
|
+
function tableFromRows(rows, accentColor) {
|
|
85
|
+
const cc = Math.min(Math.max(...rows.map((r) => r.length), 1), MAX_TABLE_COLS);
|
|
86
|
+
const makeCell = (text, header) => new docx_1.TableCell({ children: [new docx_1.Paragraph({ children: inlineRuns(inlineSegments(text), accentColor) })], shading: header ? { type: docx_1.ShadingType.CLEAR, fill: accentColor ?? DEFAULT_ACCENT } : undefined });
|
|
87
|
+
const trs = rows.map((cells, idx) => new docx_1.TableRow({ tableHeader: idx === 0, children: Array.from({ length: cc }, (_, c) => makeCell(cells[c]?.trim() ?? '', idx === 0)) }));
|
|
88
|
+
return new docx_1.Table({ width: { size: 100, type: docx_1.WidthType.PERCENTAGE }, rows: trs, borders: {
|
|
89
|
+
top: { style: docx_1.BorderStyle.SINGLE, size: 4, color: 'CCCCCC' }, bottom: { style: docx_1.BorderStyle.SINGLE, size: 4, color: 'CCCCCC' },
|
|
90
|
+
left: { style: docx_1.BorderStyle.SINGLE, size: 4, color: 'CCCCCC' }, right: { style: docx_1.BorderStyle.SINGLE, size: 4, color: 'CCCCCC' },
|
|
91
|
+
insideHorizontal: { style: docx_1.BorderStyle.SINGLE, size: 4, color: 'CCCCCC' }, insideVertical: { style: docx_1.BorderStyle.SINGLE, size: 4, color: 'CCCCCC' },
|
|
92
|
+
} });
|
|
93
|
+
}
|
|
94
|
+
function calloutParagraphs(def, text, accentColor) {
|
|
95
|
+
const children = inlineRuns(inlineSegments(text), accentColor);
|
|
96
|
+
return [
|
|
97
|
+
new docx_1.Paragraph({ children: [new docx_1.TextRun({ text: def.label, font: BODY_FONT, bold: true, size: 20, color: def.borderColor })], border: { left: { style: docx_1.BorderStyle.SINGLE, size: 18, color: def.borderColor, space: 4 } }, shading: { type: docx_1.ShadingType.CLEAR, fill: def.bgColor }, spacing: { before: 120, after: 0 }, indent: { left: 120 } }),
|
|
98
|
+
new docx_1.Paragraph({ children, border: { left: { style: docx_1.BorderStyle.SINGLE, size: 18, color: def.borderColor, space: 4 } }, shading: { type: docx_1.ShadingType.CLEAR, fill: def.bgColor }, spacing: { after: 120 }, indent: { left: 120 } }),
|
|
99
|
+
];
|
|
112
100
|
}
|
|
113
|
-
function
|
|
101
|
+
function headingLevel(depth) {
|
|
114
102
|
switch (depth) {
|
|
115
103
|
case 1: return docx_1.HeadingLevel.HEADING_1;
|
|
116
104
|
case 2: return docx_1.HeadingLevel.HEADING_2;
|
|
@@ -126,33 +114,11 @@ class DocxReportTool {
|
|
|
126
114
|
const title = String(params.title ?? 'Untitled');
|
|
127
115
|
const markdown = String(params.markdown ?? '');
|
|
128
116
|
const includeToc = params.includeToc === true;
|
|
129
|
-
const accentColor = params.accentColor ? String(params.accentColor).replace('#', '') :
|
|
130
|
-
const chartBuffers = Array.isArray(params.charts)
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
const
|
|
134
|
-
// Title
|
|
135
|
-
children.push(new docx_1.Paragraph({
|
|
136
|
-
children: [
|
|
137
|
-
new docx_1.TextRun({
|
|
138
|
-
text: title,
|
|
139
|
-
font: BODY_FONT,
|
|
140
|
-
bold: true,
|
|
141
|
-
size: 32,
|
|
142
|
-
color: accentColor ?? '1a56db',
|
|
143
|
-
}),
|
|
144
|
-
],
|
|
145
|
-
heading: docx_1.HeadingLevel.TITLE,
|
|
146
|
-
spacing: { after: 240 },
|
|
147
|
-
}));
|
|
148
|
-
// TOC
|
|
149
|
-
if (includeToc) {
|
|
150
|
-
children.push(new docx_1.TableOfContents('Table of Contents', {
|
|
151
|
-
hyperlink: true,
|
|
152
|
-
headingStyleRange: '1-3',
|
|
153
|
-
}), new docx_1.Paragraph({ children: [new docx_1.PageBreak()] }));
|
|
154
|
-
}
|
|
155
|
-
// Parse markdown
|
|
117
|
+
const accentColor = params.accentColor ? String(params.accentColor).replace('#', '') : DEFAULT_ACCENT;
|
|
118
|
+
const chartBuffers = Array.isArray(params.charts) ? params.charts : [];
|
|
119
|
+
const subtitle = params.subtitle ? String(params.subtitle) : undefined;
|
|
120
|
+
const author = params.author ? String(params.author) : undefined;
|
|
121
|
+
const bodyChildren = [];
|
|
156
122
|
const lines = markdown.split(/\r?\n/);
|
|
157
123
|
let i = 0;
|
|
158
124
|
let inCodeBlock = false;
|
|
@@ -160,13 +126,7 @@ class DocxReportTool {
|
|
|
160
126
|
const flushCodeBlock = () => {
|
|
161
127
|
if (!codeLines.length)
|
|
162
128
|
return;
|
|
163
|
-
|
|
164
|
-
children: [
|
|
165
|
-
new docx_1.TextRun({ text: line || ' ', font: CODE_FONT, size: 18 }),
|
|
166
|
-
],
|
|
167
|
-
shading: { type: docx_1.ShadingType.CLEAR, fill: 'F5F5F5' },
|
|
168
|
-
spacing: { after: 0 },
|
|
169
|
-
})), new docx_1.Paragraph({ children: [], spacing: { after: 120 } }));
|
|
129
|
+
bodyChildren.push(...codeLines.map((line) => new docx_1.Paragraph({ children: [new docx_1.TextRun({ text: line || ' ', font: CODE_FONT, size: 18 })], shading: { type: docx_1.ShadingType.CLEAR, fill: 'F5F5F5' }, spacing: { after: 0 } })), new docx_1.Paragraph({ children: [], spacing: { after: 120 } }));
|
|
170
130
|
codeLines.length = 0;
|
|
171
131
|
};
|
|
172
132
|
for (; i < lines.length; i += 1) {
|
|
@@ -187,204 +147,135 @@ class DocxReportTool {
|
|
|
187
147
|
codeLines.push(line);
|
|
188
148
|
continue;
|
|
189
149
|
}
|
|
190
|
-
|
|
150
|
+
const calloutMatch = trimmed.match(/^>\s*\[!(NOTE|WARNING|TIP|IMPORTANT|CAUTION)\]\s*(.*)$/i);
|
|
151
|
+
if (calloutMatch) {
|
|
152
|
+
flushCodeBlock();
|
|
153
|
+
const def = CALLOUT_MAP[calloutMatch[1].toUpperCase()];
|
|
154
|
+
if (def) {
|
|
155
|
+
const contentLines = [calloutMatch[2]];
|
|
156
|
+
while (i + 1 < lines.length) {
|
|
157
|
+
const next = lines[i + 1].trim();
|
|
158
|
+
if (next.startsWith('> ') || next === '>') {
|
|
159
|
+
contentLines.push(next.replace(/^>\s?/, ''));
|
|
160
|
+
i += 1;
|
|
161
|
+
}
|
|
162
|
+
else
|
|
163
|
+
break;
|
|
164
|
+
}
|
|
165
|
+
bodyChildren.push(...calloutParagraphs(def, contentLines.join(' ').trim(), accentColor));
|
|
166
|
+
}
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
191
169
|
const headingMatch = trimmed.match(/^(#{1,6})\s+(.*)$/);
|
|
192
170
|
if (headingMatch) {
|
|
193
171
|
flushCodeBlock();
|
|
194
|
-
|
|
195
|
-
const text = headingMatch[2].replace(/\*\*/g, '');
|
|
196
|
-
children.push(new docx_1.Paragraph({
|
|
197
|
-
children: [
|
|
198
|
-
new docx_1.TextRun({
|
|
199
|
-
text,
|
|
200
|
-
font: BODY_FONT,
|
|
201
|
-
bold: true,
|
|
202
|
-
color: accentColor,
|
|
203
|
-
}),
|
|
204
|
-
],
|
|
205
|
-
heading: headingLevelFromDepth(depth),
|
|
206
|
-
spacing: { before: 240, after: 120 },
|
|
207
|
-
}));
|
|
172
|
+
bodyChildren.push(new docx_1.Paragraph({ children: [new docx_1.TextRun({ text: headingMatch[2].replace(/\*\*/g, ''), font: BODY_FONT, bold: true, color: accentColor })], heading: headingLevel(headingMatch[1].length), spacing: { before: 240, after: 120 } }));
|
|
208
173
|
continue;
|
|
209
174
|
}
|
|
210
|
-
|
|
211
|
-
if (/^---+$/.test(trimmed) || /^\*\*\*+$/.test(trimmed)) {
|
|
175
|
+
if (/^---+$/.test(trimmed) || /^\*\*\*+$/.test(trimmed) || /^___+$/.test(trimmed)) {
|
|
212
176
|
flushCodeBlock();
|
|
213
|
-
if (trimmed.length > 3)
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
177
|
+
if (trimmed.length > 3)
|
|
178
|
+
bodyChildren.push(new docx_1.Paragraph({ children: [new docx_1.PageBreak()] }));
|
|
179
|
+
else
|
|
180
|
+
bodyChildren.push(new docx_1.Paragraph({ children: [], border: { bottom: { style: docx_1.BorderStyle.SINGLE, size: 6, color: 'BBBBBB' } }, spacing: { after: 120 } }));
|
|
181
|
+
continue;
|
|
182
|
+
}
|
|
183
|
+
const imageMatch = trimmed.match(/^!\[([^\]]*)\]\((https?:\/\/[^)\s]+)\)$/);
|
|
184
|
+
if (imageMatch) {
|
|
185
|
+
flushCodeBlock();
|
|
186
|
+
const chartRef = trimmed.match(/^!\[chart:(\d+)\]$/);
|
|
187
|
+
if (chartRef && chartBuffers[parseInt(chartRef[1], 10)]) {
|
|
188
|
+
bodyChildren.push(new docx_1.Paragraph({ children: [new docx_1.ImageRun({ data: chartBuffers[parseInt(chartRef[1], 10)], transformation: { width: IMAGE_MAX_WIDTH, height: Math.round(IMAGE_MAX_WIDTH * 0.6) }, type: 'png' })], spacing: { before: 120, after: 120 }, alignment: docx_1.AlignmentType.CENTER }));
|
|
221
189
|
}
|
|
222
190
|
else {
|
|
223
|
-
|
|
191
|
+
const buf = await fetchImageBuffer(imageMatch[2]);
|
|
192
|
+
if (buf)
|
|
193
|
+
bodyChildren.push(new docx_1.Paragraph({ children: [new docx_1.ImageRun({ data: buf, transformation: { width: IMAGE_MAX_WIDTH, height: Math.round(IMAGE_MAX_WIDTH * 0.6) }, type: imageTypeFromUrl(imageMatch[2]) })], spacing: { before: 120, after: 120 }, alignment: docx_1.AlignmentType.CENTER }));
|
|
224
194
|
}
|
|
225
195
|
continue;
|
|
226
196
|
}
|
|
227
|
-
// Pipe table
|
|
228
197
|
if (trimmed.startsWith('|') && trimmed.endsWith('|')) {
|
|
229
198
|
flushCodeBlock();
|
|
230
|
-
const
|
|
199
|
+
const tl = [line];
|
|
231
200
|
while (i + 1 < lines.length) {
|
|
232
201
|
const next = lines[i + 1].trim();
|
|
233
202
|
if (next.startsWith('|') && next.endsWith('|')) {
|
|
234
|
-
|
|
203
|
+
tl.push(lines[i + 1]);
|
|
235
204
|
i += 1;
|
|
236
205
|
}
|
|
237
|
-
else
|
|
206
|
+
else
|
|
238
207
|
break;
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
const rows = tableLines
|
|
242
|
-
.map((l) => l
|
|
243
|
-
.trim()
|
|
244
|
-
.replace(/^\||\|$/g, '')
|
|
245
|
-
.split('|')
|
|
246
|
-
.map((c) => c.trim()))
|
|
247
|
-
.filter((cells) => !cells.every((c) => /^:?-+:?$/.test(c)));
|
|
248
|
-
if (rows.length > 0) {
|
|
249
|
-
children.push(tableFromRows(rows), new docx_1.Paragraph({ children: [] }));
|
|
250
208
|
}
|
|
209
|
+
const rows = tl.map((l) => l.trim().replace(/^\||\|$/g, '').split('|').map((c) => c.trim())).filter((cells) => !cells.every((c) => /^:?-+:?$/.test(c)));
|
|
210
|
+
if (rows.length > 0)
|
|
211
|
+
bodyChildren.push(tableFromRows(rows, accentColor), new docx_1.Paragraph({ children: [] }));
|
|
251
212
|
continue;
|
|
252
213
|
}
|
|
253
|
-
// Bullet list
|
|
254
214
|
const bulletMatch = trimmed.match(/^[-*+]\s+(.*)$/);
|
|
255
215
|
if (bulletMatch) {
|
|
256
216
|
flushCodeBlock();
|
|
257
|
-
|
|
258
|
-
children: inlineRuns(inlineSegments(bulletMatch[1]), accentColor),
|
|
259
|
-
bullet: { level: 0 },
|
|
260
|
-
spacing: { after: 60 },
|
|
261
|
-
}));
|
|
217
|
+
bodyChildren.push(new docx_1.Paragraph({ children: inlineRuns(inlineSegments(bulletMatch[1]), accentColor), bullet: { level: 0 }, spacing: { after: 60 } }));
|
|
262
218
|
continue;
|
|
263
219
|
}
|
|
264
|
-
// Numbered list
|
|
265
220
|
const orderedMatch = trimmed.match(/^\d+[.)]\s+(.*)$/);
|
|
266
221
|
if (orderedMatch) {
|
|
267
222
|
flushCodeBlock();
|
|
268
|
-
|
|
269
|
-
children: inlineRuns(inlineSegments(orderedMatch[1]), accentColor),
|
|
270
|
-
numbering: { reference: 'ordered-list', level: 0 },
|
|
271
|
-
spacing: { after: 60 },
|
|
272
|
-
}));
|
|
273
|
-
continue;
|
|
274
|
-
}
|
|
275
|
-
// Blockquote
|
|
276
|
-
if (trimmed.startsWith('> ')) {
|
|
277
|
-
flushCodeBlock();
|
|
278
|
-
children.push(new docx_1.Paragraph({
|
|
279
|
-
children: inlineRuns(inlineSegments(trimmed.slice(2)), accentColor),
|
|
280
|
-
indent: { left: 480 },
|
|
281
|
-
shading: { type: docx_1.ShadingType.CLEAR, fill: 'F7F7F7' },
|
|
282
|
-
spacing: { after: 120 },
|
|
283
|
-
}));
|
|
223
|
+
bodyChildren.push(new docx_1.Paragraph({ children: inlineRuns(inlineSegments(orderedMatch[1]), accentColor), numbering: { reference: 'ordered-list', level: 0 }, spacing: { after: 60 } }));
|
|
284
224
|
continue;
|
|
285
225
|
}
|
|
286
|
-
|
|
287
|
-
if (trimmed.startsWith('![chart:') && trimmed.endsWith(']')) {
|
|
226
|
+
if (trimmed.startsWith('> ') && !trimmed.match(/^>\s*\[!/)) {
|
|
288
227
|
flushCodeBlock();
|
|
289
|
-
|
|
290
|
-
if (chartBuffers[chartIndex]) {
|
|
291
|
-
children.push(new docx_1.Paragraph({
|
|
292
|
-
children: [
|
|
293
|
-
new docx_1.ImageRun({
|
|
294
|
-
data: chartBuffers[chartIndex],
|
|
295
|
-
transformation: { width: 500, height: 300 },
|
|
296
|
-
type: 'png',
|
|
297
|
-
}),
|
|
298
|
-
],
|
|
299
|
-
spacing: { after: 120 },
|
|
300
|
-
}));
|
|
301
|
-
}
|
|
228
|
+
bodyChildren.push(new docx_1.Paragraph({ children: inlineRuns(inlineSegments(trimmed.slice(2)), accentColor), indent: { left: 480 }, shading: { type: docx_1.ShadingType.CLEAR, fill: 'F7F7F7' }, spacing: { after: 120 } }));
|
|
302
229
|
continue;
|
|
303
230
|
}
|
|
304
|
-
// Plain paragraph
|
|
305
231
|
flushCodeBlock();
|
|
306
232
|
if (!trimmed) {
|
|
307
|
-
|
|
233
|
+
bodyChildren.push(new docx_1.Paragraph({ children: [] }));
|
|
308
234
|
continue;
|
|
309
235
|
}
|
|
310
|
-
const
|
|
311
|
-
if (
|
|
312
|
-
|
|
236
|
+
const hasLink = /\[[^\]]+\]\(https?:\/\/[^)\s]+\)/.test(trimmed);
|
|
237
|
+
if (hasLink) {
|
|
238
|
+
const segments = inlineSegments(trimmed);
|
|
239
|
+
bodyChildren.push(new docx_1.Paragraph({ children: segments.map((seg) => seg.link ? new docx_1.ExternalHyperlink({ children: [new docx_1.TextRun({ text: seg.text, style: 'Hyperlink' })], link: seg.link }) : new docx_1.TextRun({ text: seg.text, font: BODY_FONT, bold: seg.bold, italics: seg.italics, color: accentColor })), spacing: { after: 120 } }));
|
|
240
|
+
}
|
|
241
|
+
else {
|
|
242
|
+
bodyChildren.push(new docx_1.Paragraph({ children: inlineRuns(inlineSegments(trimmed), accentColor), spacing: { after: 120 }, alignment: docx_1.AlignmentType.JUSTIFIED }));
|
|
243
|
+
}
|
|
313
244
|
}
|
|
314
245
|
flushCodeBlock();
|
|
246
|
+
const today = new Date().toLocaleDateString('en-US', { year: 'numeric', month: 'long', day: 'numeric' });
|
|
315
247
|
const doc = new docx_1.Document({
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
{
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
style: { paragraph: { indent: { left: 720, hanging: 260 } } },
|
|
327
|
-
},
|
|
328
|
-
],
|
|
329
|
-
},
|
|
330
|
-
],
|
|
331
|
-
},
|
|
332
|
-
features: {
|
|
333
|
-
updateFields: includeToc,
|
|
334
|
-
},
|
|
248
|
+
styles: { default: {
|
|
249
|
+
heading1: { run: { font: BODY_FONT, size: 28, bold: true, color: accentColor }, paragraph: { spacing: { before: 360, after: 200 } } },
|
|
250
|
+
heading2: { run: { font: BODY_FONT, size: 24, bold: true, color: accentColor }, paragraph: { spacing: { before: 280, after: 160 } } },
|
|
251
|
+
heading3: { run: { font: BODY_FONT, size: 20, bold: true, color: accentColor }, paragraph: { spacing: { before: 240, after: 120 } } },
|
|
252
|
+
heading4: { run: { font: BODY_FONT, size: 18, bold: true, color: accentColor }, paragraph: { spacing: { before: 200, after: 100 } } },
|
|
253
|
+
heading5: { run: { font: BODY_FONT, size: 16, bold: true, color: accentColor }, paragraph: { spacing: { before: 160, after: 80 } } },
|
|
254
|
+
heading6: { run: { font: BODY_FONT, size: 14, bold: true, color: accentColor }, paragraph: { spacing: { before: 120, after: 60 } } },
|
|
255
|
+
} },
|
|
256
|
+
numbering: { config: [{ reference: 'ordered-list', levels: [{ level: 0, format: docx_1.LevelFormat.DECIMAL, text: '%1.', alignment: docx_1.AlignmentType.START, style: { paragraph: { indent: { left: 720, hanging: 260 } } } }] }] },
|
|
257
|
+
features: { updateFields: includeToc },
|
|
335
258
|
sections: [
|
|
336
|
-
{
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
},
|
|
349
|
-
|
|
350
|
-
default: new docx_1.Footer({
|
|
351
|
-
children: [
|
|
352
|
-
new docx_1.Paragraph({
|
|
353
|
-
children: [
|
|
354
|
-
new docx_1.TextRun({ text: 'Page ', font: BODY_FONT, size: 18 }),
|
|
355
|
-
new docx_1.TextRun({
|
|
356
|
-
children: [docx_1.PageNumber.CURRENT],
|
|
357
|
-
font: BODY_FONT,
|
|
358
|
-
size: 18,
|
|
359
|
-
}),
|
|
360
|
-
new docx_1.TextRun({ text: ' of ', font: BODY_FONT, size: 18 }),
|
|
361
|
-
new docx_1.TextRun({
|
|
362
|
-
children: [docx_1.PageNumber.TOTAL_PAGES],
|
|
363
|
-
font: BODY_FONT,
|
|
364
|
-
size: 18,
|
|
365
|
-
}),
|
|
366
|
-
],
|
|
367
|
-
alignment: docx_1.AlignmentType.CENTER,
|
|
368
|
-
}),
|
|
369
|
-
],
|
|
370
|
-
}),
|
|
371
|
-
},
|
|
372
|
-
children,
|
|
259
|
+
{ properties: { page: { margin: { top: (0, docx_1.convertInchesToTwip)(1.5), bottom: (0, docx_1.convertInchesToTwip)(1), left: (0, docx_1.convertInchesToTwip)(1.2), right: (0, docx_1.convertInchesToTwip)(1.2) } }, titlePage: true }, headers: { first: new docx_1.Header({ children: [] }) }, footers: { first: new docx_1.Footer({ children: [] }) }, children: [
|
|
260
|
+
...Array.from({ length: 6 }, () => new docx_1.Paragraph({ children: [], spacing: { after: 200 } })),
|
|
261
|
+
new docx_1.Paragraph({ children: [new docx_1.TextRun({ text: title, font: BODY_FONT, bold: true, size: 56, color: accentColor })], alignment: docx_1.AlignmentType.CENTER, spacing: { after: 200 } }),
|
|
262
|
+
...(subtitle ? [new docx_1.Paragraph({ children: [new docx_1.TextRun({ text: subtitle, font: BODY_FONT, size: 28, color: '666666' })], alignment: docx_1.AlignmentType.CENTER, spacing: { after: 160 } })] : []),
|
|
263
|
+
new docx_1.Paragraph({ children: [], border: { bottom: { style: docx_1.BorderStyle.SINGLE, size: 6, color: accentColor, space: 1 } }, spacing: { after: 200 }, indent: { left: (0, docx_1.convertInchesToTwip)(2), right: (0, docx_1.convertInchesToTwip)(2) } }),
|
|
264
|
+
new docx_1.Paragraph({ children: [new docx_1.TextRun({ text: today, font: BODY_FONT, size: 22, color: '999999' })], alignment: docx_1.AlignmentType.CENTER, spacing: { after: 80 } }),
|
|
265
|
+
...(author ? [new docx_1.Paragraph({ children: [new docx_1.TextRun({ text: author, font: BODY_FONT, size: 22, color: '999999' })], alignment: docx_1.AlignmentType.CENTER, spacing: { after: 80 } })] : []),
|
|
266
|
+
new docx_1.Paragraph({ children: [new docx_1.TextRun({ text: 'TeamShare Document', font: BODY_FONT, size: 18, color: 'BBBBBB', italics: true })], alignment: docx_1.AlignmentType.CENTER }),
|
|
267
|
+
new docx_1.Paragraph({ children: [new docx_1.PageBreak()] }),
|
|
268
|
+
] },
|
|
269
|
+
{ properties: { page: { margin: { top: (0, docx_1.convertInchesToTwip)(1), bottom: (0, docx_1.convertInchesToTwip)(1), left: (0, docx_1.convertInchesToTwip)(1.2), right: (0, docx_1.convertInchesToTwip)(1.2) } } },
|
|
270
|
+
headers: { default: new docx_1.Header({ children: [new docx_1.Paragraph({ children: [new docx_1.TextRun({ text: title, font: BODY_FONT, size: 18, color: '999999' })], alignment: docx_1.AlignmentType.RIGHT })] }) },
|
|
271
|
+
footers: { default: new docx_1.Footer({ children: [new docx_1.Paragraph({ children: [new docx_1.TextRun({ text: 'Page ', font: BODY_FONT, size: 18 }), new docx_1.TextRun({ children: [docx_1.PageNumber.CURRENT], font: BODY_FONT, size: 18 }), new docx_1.TextRun({ text: ' of ', font: BODY_FONT, size: 18 }), new docx_1.TextRun({ children: [docx_1.PageNumber.TOTAL_PAGES], font: BODY_FONT, size: 18 })], alignment: docx_1.AlignmentType.CENTER })] }) },
|
|
272
|
+
children: [...(includeToc ? [new docx_1.TableOfContents('Table of Contents', { hyperlink: true, headingStyleRange: '1-3' }), new docx_1.Paragraph({ children: [new docx_1.PageBreak()] })] : []), ...bodyChildren],
|
|
373
273
|
},
|
|
374
274
|
],
|
|
375
275
|
});
|
|
376
276
|
const buffer = await docx_1.Packer.toBuffer(doc);
|
|
377
277
|
const safeName = title.replace(/[^a-zA-Z0-9_-]/g, '_').slice(0, 64);
|
|
378
|
-
return {
|
|
379
|
-
outputs: [
|
|
380
|
-
{
|
|
381
|
-
buffer,
|
|
382
|
-
fileName: `${safeName}.docx`,
|
|
383
|
-
mime: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
|
|
384
|
-
},
|
|
385
|
-
],
|
|
386
|
-
log: [`Generated DOCX: ${safeName}.docx (${buffer.length} bytes)`],
|
|
387
|
-
};
|
|
278
|
+
return { outputs: [{ buffer, fileName: `${safeName}.docx`, mime: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' }], log: [`Generated DOCX: ${safeName}.docx (${buffer.length} bytes)`] };
|
|
388
279
|
}
|
|
389
280
|
}
|
|
390
281
|
exports.DocxReportTool = DocxReportTool;
|