@documonster/mcp 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/README.md +60 -1
- package/dist/config.d.ts +25 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +22 -3
- package/dist/config.js.map +1 -1
- package/dist/tools/diagram-markdown.d.ts +5 -2
- package/dist/tools/diagram-markdown.d.ts.map +1 -1
- package/dist/tools/diagram-markdown.js +29 -2
- package/dist/tools/diagram-markdown.js.map +1 -1
- package/dist/tools/diagram-render.d.ts +7 -0
- package/dist/tools/diagram-render.d.ts.map +1 -1
- package/dist/tools/diagram-render.js +104 -92
- package/dist/tools/diagram-render.js.map +1 -1
- package/dist/tools/diagram.d.ts +25 -2
- package/dist/tools/diagram.d.ts.map +1 -1
- package/dist/tools/diagram.js +16 -4
- package/dist/tools/diagram.js.map +1 -1
- package/dist/tools/doc-convert.d.ts.map +1 -1
- package/dist/tools/doc-convert.js +7 -5
- package/dist/tools/doc-convert.js.map +1 -1
- package/dist/tools/doc-write.d.ts.map +1 -1
- package/dist/tools/doc-write.js +4 -3
- package/dist/tools/doc-write.js.map +1 -1
- package/dist/tools/help.d.ts +13 -0
- package/dist/tools/help.d.ts.map +1 -1
- package/dist/tools/help.js +13 -0
- package/dist/tools/help.js.map +1 -1
- package/dist/tools/pdf-edit.d.ts.map +1 -1
- package/dist/tools/pdf-edit.js +12 -0
- package/dist/tools/pdf-edit.js.map +1 -1
- package/dist/tools/pdf-fonts.d.ts +59 -4
- package/dist/tools/pdf-fonts.d.ts.map +1 -1
- package/dist/tools/pdf-fonts.js +128 -14
- package/dist/tools/pdf-fonts.js.map +1 -1
- package/dist/tools/sheet-write.js +6 -1
- package/dist/tools/sheet-write.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -71,7 +71,8 @@ No install needed — point your MCP client at `npx`.
|
|
|
71
71
|
| `--enable <groups>` | all | Comma-separated tool groups: `core`, `excel`, `word`, `pdf`, `forms`, `archive`, `diagram`. `core` is always on. |
|
|
72
72
|
| `--max-file-size <bytes>` | 67108864 | Reject larger input documents. |
|
|
73
73
|
| `--max-output-chars <n>` | 40000 | Truncate tool output — a token budget in disguise. |
|
|
74
|
-
| `--pdf-font <file
|
|
74
|
+
| `--pdf-font <file>[#i]` | none | TrueType face embedded in every PDF and diagram written. See [PDF fonts](#pdf-fonts). |
|
|
75
|
+
| `--pdf-font-fallback <f>` | none | Faces tried, in order, for characters the primary lacks. Repeatable, or comma-separated. |
|
|
75
76
|
|
|
76
77
|
### PDF fonts
|
|
77
78
|
|
|
@@ -102,6 +103,58 @@ Naming a font removes the host from the answer:
|
|
|
102
103
|
}
|
|
103
104
|
```
|
|
104
105
|
|
|
106
|
+
#### Selecting a face inside a `.ttc`
|
|
107
|
+
|
|
108
|
+
A collection holds several faces and the first is rarely the one wanted: on macOS
|
|
109
|
+
`Songti.ttc` opens at **weight 900**, so naming the file alone sets Chinese body text
|
|
110
|
+
in the heaviest weight the family ships. Append the index to choose:
|
|
111
|
+
|
|
112
|
+
```
|
|
113
|
+
--pdf-font /System/Library/Fonts/Supplemental/Songti.ttc#6
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
The order inside a collection is arbitrary and not worth guessing — that file happens to
|
|
117
|
+
run Black, Bold, TC-Bold, Light, STSong, TC-Light, **Regular**, TC-Regular, so Regular is
|
|
118
|
+
face 6 and face 3 is Light. Check the file rather than assuming, and confirm what was
|
|
119
|
+
embedded by looking for `/BaseFont` in the PDF: `STSongti-SC-Regular-Subset` is the
|
|
120
|
+
answer you want, `-Light-` or `-Black-` means the index was wrong.
|
|
121
|
+
|
|
122
|
+
An index on a file that holds one face is rejected at startup rather than ignored.
|
|
123
|
+
|
|
124
|
+
#### More than one face
|
|
125
|
+
|
|
126
|
+
One face cannot serve a document that mixes scripts. A Chinese face has no Arabic, so a
|
|
127
|
+
page of Chinese prose quoting an Arabic phrase either loses the phrase to `.notdef` boxes
|
|
128
|
+
or — if you reach for a pan-Unicode face to cover both — has _all_ of its Han drawn by a
|
|
129
|
+
face whose glyphs follow Japanese conventions. Give the regional face first and let the
|
|
130
|
+
rest fall back:
|
|
131
|
+
|
|
132
|
+
```
|
|
133
|
+
--pdf-font Songti.ttc#6 --pdf-font-fallback ArialUnicode.ttf,Symbols.ttf
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
#### What the fonts cover
|
|
137
|
+
|
|
138
|
+
Every place this server draws text of its own: converted documents, diagrams rendered
|
|
139
|
+
to PNG or PDF, diagrams embedded in a `.docx`, and `pdf_edit`'s watermarks, stamps and
|
|
140
|
+
page numbers. Configuring a font also switches the host's own fonts **off** for these
|
|
141
|
+
renders, which is the point — the output then depends on the files you named and not on
|
|
142
|
+
the machine.
|
|
143
|
+
|
|
144
|
+
Only `pdf_edit` cannot honour a `#index`: its overlay API takes bytes, so a `.ttc` there
|
|
145
|
+
embeds the collection's first face.
|
|
146
|
+
|
|
147
|
+
#### Choosing the regional hand
|
|
148
|
+
|
|
149
|
+
`textLanguage` is a per-call parameter on `doc_write` and `doc_convert`, not a server
|
|
150
|
+
flag, because it is a property of the document — one session legitimately converts a
|
|
151
|
+
Chinese file and then a Japanese one. Han characters are shared between the three
|
|
152
|
+
languages and drawn differently, so a font picked purely by coverage can be correct and
|
|
153
|
+
still look wrong. Omitted, the library infers it from the text, which falls back to
|
|
154
|
+
Chinese for characters common to all three.
|
|
155
|
+
|
|
156
|
+
#### Requirements
|
|
157
|
+
|
|
105
158
|
It must be a TrueType font — `.ttf` or `.ttc` with `glyf` outlines. A
|
|
106
159
|
CFF-flavoured `.otf` is rejected at startup rather than at conversion time,
|
|
107
160
|
because the subsetting embedder cannot use CFF outlines: that rules out macOS
|
|
@@ -118,6 +171,12 @@ symbol blocks are drawn from built-in outlines and never trigger it; CJK, and an
|
|
|
118
171
|
script this library has no glyphs for, needs `--pdf-font`. Pass
|
|
119
172
|
`allowMissingGlyphs: true` on the call to accept the boxes on purpose.
|
|
120
173
|
|
|
174
|
+
**A diagram cannot fail this way, so it is reported instead.** A rasteriser has no
|
|
175
|
+
`.notdef` to draw — an uncovered character paints _nothing_ — so `diagram_render`, and any
|
|
176
|
+
tool embedding a `mermaid` fence, names the code points it could not draw and says the
|
|
177
|
+
labels are blank. There is no equivalent refusal because the image is not terminal: it
|
|
178
|
+
sits inside a document you can regenerate.
|
|
179
|
+
|
|
121
180
|
## Security
|
|
122
181
|
|
|
123
182
|
An MCP server hands a model the ability to name files, so the boundaries are
|
package/dist/config.d.ts
CHANGED
|
@@ -39,7 +39,7 @@ export interface ServerConfig {
|
|
|
39
39
|
/** Truncate tool output beyond this many characters. */
|
|
40
40
|
readonly maxOutputChars: number;
|
|
41
41
|
/**
|
|
42
|
-
*
|
|
42
|
+
* The TrueType face every PDF this server writes embeds.
|
|
43
43
|
*
|
|
44
44
|
* Unset, PDF text outside WinAnsi — CJK, Cyrillic, Greek — depends on the host
|
|
45
45
|
* having a usable face installed, and a host that has none renders `.notdef`
|
|
@@ -47,7 +47,30 @@ export interface ServerConfig {
|
|
|
47
47
|
* Markdown produces a readable PDF on a laptop and a boxed one in a container.
|
|
48
48
|
* Naming a font here removes the host from the answer.
|
|
49
49
|
*/
|
|
50
|
-
readonly pdfFont?:
|
|
50
|
+
readonly pdfFont?: PdfFontRef;
|
|
51
|
+
/**
|
|
52
|
+
* Faces consulted, in order, for characters {@link pdfFont} has no glyph for.
|
|
53
|
+
*
|
|
54
|
+
* One face is not enough for a document that mixes scripts, and the failure is not
|
|
55
|
+
* hypothetical: a Chinese face carries no Arabic, so a page of Chinese prose quoting one
|
|
56
|
+
* Arabic phrase either loses the phrase to `.notdef` boxes or — if the operator picks a
|
|
57
|
+
* pan-Unicode face to cover both — has all of its Han drawn by a face whose glyphs follow
|
|
58
|
+
* Japanese conventions. A chain lets the primary face be the regional one.
|
|
59
|
+
*/
|
|
60
|
+
readonly pdfFontFallbacks?: readonly PdfFontRef[];
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* One face, and which face inside the file when the file is a collection.
|
|
64
|
+
*
|
|
65
|
+
* `collectionIndex` exists because a `.ttc` holds several faces and the first one is not
|
|
66
|
+
* usually the one wanted: on macOS, `Songti.ttc` opens at weight 900, so naming that file
|
|
67
|
+
* and taking face 0 — which is what this server did — set every paragraph of Chinese body
|
|
68
|
+
* text in the heaviest weight the family ships. Its order is Black, Bold, TC-Bold, Light,
|
|
69
|
+
* STSong, TC-Light, Regular, TC-Regular, so the one wanted for body text is face 6.
|
|
70
|
+
*/
|
|
71
|
+
export interface PdfFontRef {
|
|
72
|
+
readonly path: string;
|
|
73
|
+
readonly collectionIndex?: number;
|
|
51
74
|
}
|
|
52
75
|
export declare class ConfigError extends Error {
|
|
53
76
|
readonly name = "ConfigError";
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH;;;;;;;;GAQG;AACH,eAAO,MAAM,WAAW,YAAI,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,CAAU,CAAC;AAEpG,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;AAuBrD,MAAM,WAAW,YAAY;IAC3B;;;OAGG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,+EAA+E;IAC/E,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,6EAA6E;IAC7E,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,mDAAmD;IACnD,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC;IACxC,0DAA0D;IAC1D,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,wDAAwD;IACxD,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC;;;;;;;;OAQG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH;;;;;;;;GAQG;AACH,eAAO,MAAM,WAAW,YAAI,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,CAAU,CAAC;AAEpG,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;AAuBrD,MAAM,WAAW,YAAY;IAC3B;;;OAGG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,+EAA+E;IAC/E,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,6EAA6E;IAC7E,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,mDAAmD;IACnD,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC;IACxC,0DAA0D;IAC1D,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,wDAAwD;IACxD,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC;;;;;;;;OAQG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,UAAU,CAAC;IAC9B;;;;;;;;OAQG;IACH,QAAQ,CAAC,gBAAgB,CAAC,EAAE,SAAS,UAAU,EAAE,CAAC;CACnD;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;CACnC;AAED,qBAAa,WAAY,SAAQ,KAAK;IACpC,SAAkB,IAAI,iBAAiB;CACxC;AAED,MAAM,WAAW,oBAAoB;IACnC,gDAAgD;IAChD,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,GAAE,oBAAyB,GACjC,YAAY,CAkFd;AA8DD,qFAAqF;AACrF,wBAAgB,aAAa,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAK1F;AA2CD,+BAA+B;AAC/B,wBAAgB,KAAK,IAAI,MAAM,CAuC9B"}
|
package/dist/config.js
CHANGED
|
@@ -62,6 +62,7 @@ export function resolveConfig(argv, options = {}) {
|
|
|
62
62
|
"max-file-size": { type: "string" },
|
|
63
63
|
"max-output-chars": { type: "string" },
|
|
64
64
|
"pdf-font": { type: "string" },
|
|
65
|
+
"pdf-font-fallback": { type: "string", multiple: true },
|
|
65
66
|
help: { type: "boolean", short: "h", default: false },
|
|
66
67
|
version: { type: "boolean", short: "v", default: false }
|
|
67
68
|
},
|
|
@@ -105,6 +106,11 @@ export function resolveConfig(argv, options = {}) {
|
|
|
105
106
|
throw new ConfigError("--output-root must be disjoint from --root (neither may contain the other)");
|
|
106
107
|
}
|
|
107
108
|
const pdfFont = resolvePdfFont(values["pdf-font"], cwd);
|
|
109
|
+
const pdfFontFallbacks = (values["pdf-font-fallback"] ?? [])
|
|
110
|
+
.flatMap(entry => entry.split(","))
|
|
111
|
+
.map(entry => entry.trim())
|
|
112
|
+
.filter(entry => entry.length > 0)
|
|
113
|
+
.map(entry => resolvePdfFont(entry, cwd));
|
|
108
114
|
return {
|
|
109
115
|
root,
|
|
110
116
|
outputRoot,
|
|
@@ -113,7 +119,8 @@ export function resolveConfig(argv, options = {}) {
|
|
|
113
119
|
groups: parseGroups(values.enable),
|
|
114
120
|
maxFileSize: parseByteCount(values["max-file-size"], "--max-file-size", DEFAULT_MAX_FILE_SIZE),
|
|
115
121
|
maxOutputChars: parseByteCount(values["max-output-chars"], "--max-output-chars", DEFAULT_MAX_OUTPUT_CHARS),
|
|
116
|
-
...(pdfFont === undefined ? {} : { pdfFont })
|
|
122
|
+
...(pdfFont === undefined ? {} : { pdfFont }),
|
|
123
|
+
...(pdfFontFallbacks.length === 0 ? {} : { pdfFontFallbacks })
|
|
117
124
|
};
|
|
118
125
|
}
|
|
119
126
|
/**
|
|
@@ -131,7 +138,15 @@ function resolvePdfFont(input, cwd) {
|
|
|
131
138
|
if (input === undefined) {
|
|
132
139
|
return undefined;
|
|
133
140
|
}
|
|
134
|
-
|
|
141
|
+
// `path#index` selects a face inside a collection. Split from the right so a directory
|
|
142
|
+
// containing a `#` does not break, and only when what follows is entirely digits — a bare
|
|
143
|
+
// `#` in a filename is then left alone rather than read as a malformed index.
|
|
144
|
+
const hash = input.lastIndexOf("#");
|
|
145
|
+
const suffix = hash < 0 ? "" : input.slice(hash + 1);
|
|
146
|
+
const indexed = hash > 0 && /^\d+$/.test(suffix);
|
|
147
|
+
const file = indexed ? input.slice(0, hash) : input;
|
|
148
|
+
const collectionIndex = indexed ? Number(suffix) : undefined;
|
|
149
|
+
const absolute = path.resolve(cwd, file);
|
|
135
150
|
let head;
|
|
136
151
|
try {
|
|
137
152
|
head = readFileSync(absolute).subarray(0, 4);
|
|
@@ -148,7 +163,11 @@ function resolvePdfFont(input, cwd) {
|
|
|
148
163
|
if (version !== 0x00010000 && magic !== "true" && magic !== "ttcf") {
|
|
149
164
|
throw new ConfigError(`--pdf-font is not a TrueType font: ${input}. Expected a .ttf or .ttc file.`);
|
|
150
165
|
}
|
|
151
|
-
|
|
166
|
+
if (collectionIndex !== undefined && magic !== "ttcf") {
|
|
167
|
+
throw new ConfigError(`--pdf-font names face ${collectionIndex} of ${file}, which is not a font collection. ` +
|
|
168
|
+
`Drop the "#${suffix}" — a .ttf holds one face.`);
|
|
169
|
+
}
|
|
170
|
+
return collectionIndex === undefined ? { path: absolute } : { path: absolute, collectionIndex };
|
|
152
171
|
}
|
|
153
172
|
function containsPath(parent, child) {
|
|
154
173
|
const relative = path.relative(parent, child);
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACxF,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,CAAU,CAAC;AAIpG,iDAAiD;AACjD,MAAM,cAAc,GAAyB;IAC3C,MAAM;IACN,OAAO;IACP,MAAM;IACN,KAAK;IACL,OAAO;IACP,SAAS;IACT,SAAS;CACV,CAAC;AAEF,sEAAsE;AACtE,MAAM,qBAAqB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAE/C;;;;GAIG;AACH,MAAM,wBAAwB,GAAG,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACxF,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,CAAU,CAAC;AAIpG,iDAAiD;AACjD,MAAM,cAAc,GAAyB;IAC3C,MAAM;IACN,OAAO;IACP,MAAM;IACN,KAAK;IACL,OAAO;IACP,SAAS;IACT,SAAS;CACV,CAAC;AAEF,sEAAsE;AACtE,MAAM,qBAAqB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAE/C;;;;GAIG;AACH,MAAM,wBAAwB,GAAG,MAAM,CAAC;AA4DxC,MAAM,OAAO,WAAY,SAAQ,KAAK;IAClB,IAAI,GAAG,aAAa,CAAC;CACxC;AAOD;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAC3B,IAAuB,EACvB,OAAO,GAAyB,EAAE;IAElC,IAAI,MAAM,CAAC;IACX,IAAI,CAAC;QACH,MAAM,GAAG,SAAS,CAAC;YACjB,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;YACf,OAAO,EAAE;gBACP,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACxB,aAAa,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACjC,gBAAgB,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE;gBACrD,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE;gBAC7C,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBAC1B,eAAe,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACnC,kBAAkB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACtC,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBAC9B,mBAAmB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;gBACvD,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE;gBACrD,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE;aACzD;YACD,gBAAgB,EAAE,KAAK;YACvB,MAAM,EAAE,IAAI;SACb,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,WAAW,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3F,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAC7B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACzC,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,IAAI,GAAG,CAAC;IAErC,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,oEAAoE;QACpE,qEAAqE;QACrE,oEAAoE;QACpE,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC;IACpD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,WAAW,CAAC,6CAA6C,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7F,CAAC;IAED,IAAI,UAAkB,CAAC;IACvB,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC;QAC1C,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YAC9B,UAAU,GAAG,YAAY,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,yBAAyB,CAAC,CAAC,CAAC,CAAC;YAC1F,SAAS,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QAC/B,CAAC;aAAM,CAAC;YACN,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;YAChD,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YACtD,UAAU,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,WAAW,CAAC,uDAAuD,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IAC5F,CAAC;IAED,IAAI,YAAY,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC,EAAE,CAAC;QACrE,MAAM,IAAI,WAAW,CACnB,4EAA4E,CAC7E,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,GAAG,CAAC,CAAC;IACxD,MAAM,gBAAgB,GAAG,CAAC,MAAM,CAAC,mBAAmB,CAAC,IAAI,EAAE,CAAC;SACzD,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;SAClC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;SAC1B,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;SACjC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,cAAc,CAAC,KAAK,EAAE,GAAG,CAAe,CAAC,CAAC;IAE1D,OAAO;QACL,IAAI;QACJ,UAAU;QACV,YAAY,EAAE,MAAM,CAAC,gBAAgB,CAAC,IAAI,KAAK;QAC/C,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,KAAK;QAClC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC;QAClC,WAAW,EAAE,cAAc,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE,iBAAiB,EAAE,qBAAqB,CAAC;QAC9F,cAAc,EAAE,cAAc,CAC5B,MAAM,CAAC,kBAAkB,CAAC,EAC1B,oBAAoB,EACpB,wBAAwB,CACzB;QACD,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC;QAC7C,GAAG,CAAC,gBAAgB,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,CAAC;KAC/D,CAAC;AACJ,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAS,cAAc,CAAC,KAAyB,EAAE,GAAW;IAC5D,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,uFAAuF;IACvF,0FAA0F;IAC1F,8EAA8E;IAC9E,MAAM,IAAI,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACpC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;IACrD,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACjD,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IACpD,MAAM,eAAe,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7D,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACzC,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,IAAI,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,WAAW,CAAC,iDAAiD,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7F,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACtC,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;QACrB,MAAM,IAAI,WAAW,CACnB,0EAA0E,KAAK,IAAI;YACjF,mFAAmF,CACtF,CAAC;IACJ,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACrC,IAAI,OAAO,KAAK,UAAU,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;QACnE,MAAM,IAAI,WAAW,CACnB,sCAAsC,KAAK,iCAAiC,CAC7E,CAAC;IACJ,CAAC;IACD,IAAI,eAAe,KAAK,SAAS,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;QACtD,MAAM,IAAI,WAAW,CACnB,yBAAyB,eAAe,OAAO,IAAI,oCAAoC;YACrF,cAAc,MAAM,4BAA4B,CACnD,CAAC;IACJ,CAAC;IACD,OAAO,eAAe,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,eAAe,EAAE,CAAC;AAClG,CAAC;AAED,SAAS,YAAY,CAAC,MAAc,EAAE,KAAa;IACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC9C,OAAO,CACL,QAAQ,KAAK,EAAE;QACf,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,QAAQ,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAC3F,CAAC;AACJ,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,aAAa,CAAC,IAAuB;IACnD,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QACpD,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;KAC3D,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,GAAuB;IAC1C,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,OAAO,IAAI,GAAG,CAAC,cAAc,CAAC,CAAC;IACjC,CAAC;IAED,MAAM,SAAS,GAAG,GAAG;SAClB,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;SAC1B,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAErC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,WAAW,CAAC,6CAA6C,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChG,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,GAAG,CAAY,CAAC,MAAM,CAAC,CAAC,CAAC;IAC5C,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;QAC9B,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,WAAW,CACnB,4BAA4B,KAAK,aAAa,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CACxE,CAAC;QACJ,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACpB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,WAAW,CAAC,KAAa;IAChC,OAAQ,WAAiC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC5D,CAAC;AAED,SAAS,cAAc,CAAC,GAAuB,EAAE,IAAY,EAAE,QAAgB;IAC7E,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAChC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,WAAW,IAAI,CAAC,EAAE,CAAC;QACvD,MAAM,IAAI,WAAW,CAAC,GAAG,IAAI,qCAAqC,GAAG,GAAG,CAAC,CAAC;IAC5E,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,+BAA+B;AAC/B,MAAM,UAAU,KAAK;IACnB,OAAO;;;;;;;;;;;;;;;uCAe8B,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;;wEAEW,qBAAqB;+DAC9B,wBAAwB;;;;;;;;;;;;;;;;;;;CAmBtF,CAAC;AACF,CAAC"}
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
* edge of the paper. Fitting to the text width is the difference between a
|
|
19
19
|
* document and a broken one.
|
|
20
20
|
*/
|
|
21
|
-
import { type DrawList } from "documonster/draw";
|
|
21
|
+
import { type DrawList, type RasterFontSource } from "documonster/draw";
|
|
22
22
|
import type { MermaidRenderOptions } from "documonster/mermaid";
|
|
23
23
|
import type { MarkdownImportOptions } from "documonster/word/markdown";
|
|
24
24
|
import { type DiagramStyleArgs } from "./diagram.js";
|
|
@@ -73,5 +73,8 @@ export declare function fitToColumn(source: string, options: MermaidRenderOption
|
|
|
73
73
|
* throw away the nine paragraphs that were fine, and the note names the line to
|
|
74
74
|
* fix.
|
|
75
75
|
*/
|
|
76
|
-
export declare function prepareMarkdownDiagrams(markdown: string, style?: DiagramStyleArgs
|
|
76
|
+
export declare function prepareMarkdownDiagrams(markdown: string, style?: DiagramStyleArgs, fonts?: {
|
|
77
|
+
readonly raster?: readonly RasterFontSource[];
|
|
78
|
+
readonly useSystemFonts?: boolean;
|
|
79
|
+
}): Promise<PreparedMarkdown>;
|
|
77
80
|
//# sourceMappingURL=diagram-markdown.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diagram-markdown.d.ts","sourceRoot":"","sources":["../../src/tools/diagram-markdown.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAGH,OAAO,EAA8B,KAAK,QAAQ,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"diagram-markdown.d.ts","sourceRoot":"","sources":["../../src/tools/diagram-markdown.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAGH,OAAO,EAA8B,KAAK,QAAQ,EAAE,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpG,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,KAAK,EAAqB,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAI1F,OAAO,EAML,KAAK,gBAAgB,EACtB,MAAM,cAAc,CAAC;AAWtB;;;;;;;GAOG;AAIH,eAAO,MAAM,uBAAuB,MAAM,CAAC;AAyE3C,MAAM,WAAW,gBAAgB;IAC/B,4EAA4E;IAC5E,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B;;;OAGG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,qBAAqB,CAAC,cAAc,CAAC,CAAC;IAC9D,2CAA2C;IAC3C,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,oBAAoB,GAAG;IAAE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;CAAE,EAC/D,IAAI,EAAE,OAAO,GACZ;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAwBjD;AAKD;;;;;;;GAOG;AACH,wBAAsB,uBAAuB,CAC3C,QAAQ,EAAE,MAAM,EAChB,KAAK,GAAE,gBAAqB,EAC5B,KAAK,CAAC,EAAE;IAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAA;CAAE,GAC3F,OAAO,CAAC,gBAAgB,CAAC,CAkL3B"}
|
|
@@ -158,7 +158,7 @@ const DEFAULT_DIAGRAM_FONT_POINTS = 14;
|
|
|
158
158
|
* throw away the nine paragraphs that were fine, and the note names the line to
|
|
159
159
|
* fix.
|
|
160
160
|
*/
|
|
161
|
-
export async function prepareMarkdownDiagrams(markdown, style = {}) {
|
|
161
|
+
export async function prepareMarkdownDiagrams(markdown, style = {}, fonts) {
|
|
162
162
|
const fences = findMermaidFences(markdown);
|
|
163
163
|
if (fences.length === 0) {
|
|
164
164
|
return { markdown, notes: [] };
|
|
@@ -171,6 +171,14 @@ export async function prepareMarkdownDiagrams(markdown, style = {}) {
|
|
|
171
171
|
const tune = style.maxLabelWidth === undefined && style.nodeGap === undefined && style.rankGap === undefined;
|
|
172
172
|
const images = new Map();
|
|
173
173
|
const failures = [];
|
|
174
|
+
/**
|
|
175
|
+
* Code points no available face could draw in any embedded diagram.
|
|
176
|
+
*
|
|
177
|
+
* Reported for the same reason the standalone PNG path reports it, and it matters more here:
|
|
178
|
+
* the reader opens a .docx and sees a diagram whose labels are simply absent, with no clue
|
|
179
|
+
* that a font was the problem. A raster has no `.notdef` to draw, so this is the only signal.
|
|
180
|
+
*/
|
|
181
|
+
const uncovered = new Set();
|
|
174
182
|
const cramped = [];
|
|
175
183
|
const split = [];
|
|
176
184
|
const forced = [];
|
|
@@ -215,7 +223,14 @@ export async function prepareMarkdownDiagrams(markdown, style = {}) {
|
|
|
215
223
|
}
|
|
216
224
|
]
|
|
217
225
|
};
|
|
218
|
-
const piece = rasterizeToRgba(slice, {
|
|
226
|
+
const piece = rasterizeToRgba(slice, {
|
|
227
|
+
scale: EMBED_SCALE * fit,
|
|
228
|
+
// An embedded diagram is rasterised, so it needs the operator's faces exactly as a
|
|
229
|
+
// standalone PNG does. Without them, `--pdf-font` made the prose of a converted
|
|
230
|
+
// document readable and left the labels inside its diagrams blank.
|
|
231
|
+
...(fonts?.raster === undefined ? {} : { fonts: fonts.raster }),
|
|
232
|
+
...(fonts?.useSystemFonts === undefined ? {} : { useSystemFonts: fonts.useSystemFonts })
|
|
233
|
+
});
|
|
219
234
|
const encoded = {
|
|
220
235
|
bytes: encodePng(piece.data, piece.width, piece.height, {
|
|
221
236
|
// Pixels and the OOXML extent have both already been reduced by
|
|
@@ -226,6 +241,9 @@ export async function prepareMarkdownDiagrams(markdown, style = {}) {
|
|
|
226
241
|
width: piece.width,
|
|
227
242
|
height: piece.height
|
|
228
243
|
};
|
|
244
|
+
for (const codePoint of piece.uncoveredCodePoints) {
|
|
245
|
+
uncovered.add(codePoint);
|
|
246
|
+
}
|
|
229
247
|
spendEmbedBudget(fenceBudget, encoded, fence.line);
|
|
230
248
|
const url = cuts.length === 1
|
|
231
249
|
? `${DIAGRAM_URL_PREFIX}${fence.ordinal}`
|
|
@@ -284,6 +302,15 @@ export async function prepareMarkdownDiagrams(markdown, style = {}) {
|
|
|
284
302
|
: [
|
|
285
303
|
`- diagram(s) at line ${[...cramped].reverse().join(", ")} are wider than the text column allows: their text lands under ${MIN_EMBED_FONT_POINTS}pt even at the tightest layout. Split the widest rank, or render them separately with diagram_render.`
|
|
286
304
|
]),
|
|
305
|
+
...(uncovered.size === 0
|
|
306
|
+
? []
|
|
307
|
+
: [
|
|
308
|
+
`- ⚠ no available font covers ${[...uncovered]
|
|
309
|
+
.sort((a, b) => a - b)
|
|
310
|
+
.slice(0, 12)
|
|
311
|
+
.map(codePoint => `U+${codePoint.toString(16).toUpperCase().padStart(4, "0")}`)
|
|
312
|
+
.join(" ")}${uncovered.size > 12 ? ` (and ${uncovered.size - 12} more)` : ""} — those characters are **blank** inside the diagram image(s). Configure a font with \`--pdf-font\`.`
|
|
313
|
+
]),
|
|
287
314
|
...failures
|
|
288
315
|
];
|
|
289
316
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diagram-markdown.js","sourceRoot":"","sources":["../../src/tools/diagram-markdown.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,SAAS,
|
|
1
|
+
{"version":3,"file":"diagram-markdown.js","sourceRoot":"","sources":["../../src/tools/diagram-markdown.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,5 +10,12 @@
|
|
|
10
10
|
* claim, and this tool is a consumer of the published API exercising it from
|
|
11
11
|
* outside the library.
|
|
12
12
|
*/
|
|
13
|
+
import { renderDiagram } from "./diagram.js";
|
|
14
|
+
interface DiagramRenderDependencies {
|
|
15
|
+
readonly render: typeof renderDiagram;
|
|
16
|
+
}
|
|
17
|
+
/** Construct the tool with an observable rendering boundary for focused tests. */
|
|
18
|
+
export declare function createDiagramRenderTool(dependencies?: DiagramRenderDependencies): import("./types.js").AnyToolDefinition;
|
|
13
19
|
export declare const diagramRenderTool: import("./types.js").AnyToolDefinition;
|
|
20
|
+
export {};
|
|
14
21
|
//# sourceMappingURL=diagram-render.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diagram-render.d.ts","sourceRoot":"","sources":["../../src/tools/diagram-render.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;
|
|
1
|
+
{"version":3,"file":"diagram-render.d.ts","sourceRoot":"","sources":["../../src/tools/diagram-render.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAMH,OAAO,EAKL,aAAa,EAId,MAAM,cAAc,CAAC;AAMtB,UAAU,yBAAyB;IACjC,QAAQ,CAAC,MAAM,EAAE,OAAO,aAAa,CAAC;CACvC;AAED,kFAAkF;AAClF,wBAAgB,uBAAuB,CACrC,YAAY,GAAE,yBAAqD,0CAmIpE;AAED,eAAO,MAAM,iBAAiB,wCAA4B,CAAC"}
|
|
@@ -15,101 +15,113 @@ import { toolError } from "../errors.js";
|
|
|
15
15
|
import { assertWritable, outputDisplay, resolveOutputPath } from "../sandbox.js";
|
|
16
16
|
import { buildDrawList, describeDiagram, diagramStyleShape, parseDiagram, renderDiagram, requireDiagramFormat, resolveDiagramSource, toRenderOptions } from "./diagram.js";
|
|
17
17
|
import { writeBytesWithPolicy } from "./fs-helpers.js";
|
|
18
|
+
import { diagramFontOptions } from "./pdf-fonts.js";
|
|
18
19
|
import { formatBytes, textResult } from "./result.js";
|
|
19
20
|
import { defineTool } from "./types.js";
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
.number()
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
21
|
+
/** Construct the tool with an observable rendering boundary for focused tests. */
|
|
22
|
+
export function createDiagramRenderTool(dependencies = { render: renderDiagram }) {
|
|
23
|
+
return defineTool({
|
|
24
|
+
name: "diagram_render",
|
|
25
|
+
group: "diagram",
|
|
26
|
+
title: "Render a Mermaid diagram",
|
|
27
|
+
description: "Draw a Mermaid diagram as .svg, .png or .pdf. Takes the diagram text in `source`, or reads it from a .mmd file or a ```mermaid fence in a .md file via `from`. Supports flowchart, sequenceDiagram, classDiagram, stateDiagram, erDiagram, gantt, gitGraph, mindmap, timeline, journey, kanban, quadrantChart, xychart, radar, sankey, packet, block, pie, C4, requirementDiagram and architecture. The result reports the parsed structure, which is the only way to verify the picture is right.",
|
|
28
|
+
inputSchema: {
|
|
29
|
+
source: z
|
|
30
|
+
.string()
|
|
31
|
+
.optional()
|
|
32
|
+
.describe("Mermaid diagram text. Use this or `from`, not both. A ```mermaid wrapper is stripped for you."),
|
|
33
|
+
from: z
|
|
34
|
+
.string()
|
|
35
|
+
.optional()
|
|
36
|
+
.describe("Read the diagram from a file instead: a .mmd/.mermaid file, or a .md file containing ```mermaid fences."),
|
|
37
|
+
index: z
|
|
38
|
+
.number()
|
|
39
|
+
.int()
|
|
40
|
+
.positive()
|
|
41
|
+
.optional()
|
|
42
|
+
.describe("Which ```mermaid fence to use when `from` is a Markdown file with several. 1-based, defaults to 1."),
|
|
43
|
+
to: z
|
|
44
|
+
.string()
|
|
45
|
+
.min(1)
|
|
46
|
+
.describe("Destination path below --output-root. The extension picks the format: .svg, .png or .pdf. Returned as @output/<path>."),
|
|
47
|
+
width: z
|
|
48
|
+
.number()
|
|
49
|
+
.positive()
|
|
50
|
+
.max(20_000)
|
|
51
|
+
.optional()
|
|
52
|
+
.describe("Output width in points. Omit to use the diagram's natural size; the drawing is fitted into the box uniformly, never stretched."),
|
|
53
|
+
height: z.number().positive().max(20_000).optional().describe("Output height in points."),
|
|
54
|
+
scale: z
|
|
55
|
+
.number()
|
|
56
|
+
.min(0.5)
|
|
57
|
+
.max(8)
|
|
58
|
+
.optional()
|
|
59
|
+
.describe("PNG only — rejected for .svg/.pdf, which have no pixels. Pixels per point, so the file is width × scale pixels wide. Defaults to 2 (144 DPI)."),
|
|
60
|
+
...diagramStyleShape,
|
|
61
|
+
overwrite: z
|
|
62
|
+
.boolean()
|
|
63
|
+
.optional()
|
|
64
|
+
.describe("Replace the destination if it exists. Defaults to false.")
|
|
65
|
+
},
|
|
66
|
+
annotations: {
|
|
67
|
+
readOnlyHint: false,
|
|
68
|
+
destructiveHint: false,
|
|
69
|
+
idempotentHint: true,
|
|
70
|
+
openWorldHint: false
|
|
71
|
+
},
|
|
72
|
+
mutates: true,
|
|
73
|
+
handler: async (args, context) => {
|
|
74
|
+
const { config } = context;
|
|
75
|
+
assertWritable(config);
|
|
76
|
+
const format = requireDiagramFormat(args.to, "to");
|
|
77
|
+
if (args.scale !== undefined && format !== "png") {
|
|
78
|
+
// Accepting it and ignoring it is the problem: a caller who set `scale: 4`
|
|
79
|
+
// for a PDF got the same file as `scale: 1` and no indication why. SVG and
|
|
80
|
+
// PDF are resolution-independent, so the knob has no meaning there.
|
|
81
|
+
throw toolError.invalidInput(`\`scale\` applies to PNG output only, not ${format}`, `${format.toUpperCase()} is resolution-independent — it has no pixels to scale. Use \`width\`/\`height\` to change its size, or write a .png if you want a specific pixel count.`);
|
|
82
|
+
}
|
|
83
|
+
const target = await resolveOutputPath(config, args.to);
|
|
84
|
+
const resolved = await resolveDiagramSource(config, args);
|
|
85
|
+
// Parsed separately from the draw list so the structural read-back reports the
|
|
86
|
+
// same tree that was drawn, without drawing it twice.
|
|
87
|
+
const diagram = parseDiagram(resolved.source);
|
|
88
|
+
const style = toRenderOptions(args);
|
|
89
|
+
const list = buildDrawList(resolved.source, style);
|
|
90
|
+
const rendered = await dependencies.render(list, format, {
|
|
91
|
+
...(args.width === undefined ? {} : { width: args.width }),
|
|
92
|
+
...(args.height === undefined ? {} : { height: args.height }),
|
|
93
|
+
...(args.scale === undefined ? {} : { scale: args.scale })
|
|
94
|
+
}, style.background, diagramFontOptions(config));
|
|
95
|
+
await writeBytesWithPolicy(target, args.overwrite === true, rendered.bytes);
|
|
96
|
+
const unit = format === "png" ? "px" : "pt";
|
|
97
|
+
return textResult(config, [
|
|
98
|
+
`Rendered **${outputDisplay(args.to)}** (${format}, ${formatBytes(rendered.bytes.byteLength)}, ${round(rendered.width)}×${round(rendered.height)} ${unit}).`,
|
|
99
|
+
// Reported because a raster cannot fail visibly: a character no face covers paints
|
|
100
|
+
// nothing, so the picture is silently missing a label unless this says so.
|
|
101
|
+
...(rendered.uncovered === undefined
|
|
102
|
+
? []
|
|
103
|
+
: [
|
|
104
|
+
`- ⚠ no available font covers ${rendered.uncovered.slice(0, 12).join(" ")}${rendered.uncovered.length > 12 ? ` (and ${rendered.uncovered.length - 12} more)` : ""} — those characters are **blank** in the image. Configure a font with \`--pdf-font\`.`
|
|
105
|
+
]),
|
|
106
|
+
// Only when it came from a file; an inline source has nothing to name.
|
|
107
|
+
...(resolved.origin === "inline"
|
|
108
|
+
? []
|
|
109
|
+
: [
|
|
110
|
+
`- source: ${resolved.origin}${resolved.selected === undefined ? "" : ` (mermaid fence ${resolved.selected} of ${resolved.fences.length})`}`
|
|
111
|
+
]),
|
|
112
|
+
"",
|
|
113
|
+
"## What was drawn",
|
|
114
|
+
"",
|
|
115
|
+
...describeDiagram(diagram),
|
|
116
|
+
"",
|
|
117
|
+
"Check that list against what you intended. The parser implements a subset of",
|
|
118
|
+
"Mermaid and a statement it does not recognise is **dropped silently** — a missing",
|
|
119
|
+
"node or edge here is the only sign, since nothing about the file itself looks wrong."
|
|
120
|
+
].join("\n"));
|
|
79
121
|
}
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
// same tree that was drawn, without drawing it twice.
|
|
84
|
-
const diagram = parseDiagram(resolved.source);
|
|
85
|
-
const style = toRenderOptions(args);
|
|
86
|
-
const list = buildDrawList(resolved.source, style);
|
|
87
|
-
const rendered = await renderDiagram(list, format, {
|
|
88
|
-
...(args.width === undefined ? {} : { width: args.width }),
|
|
89
|
-
...(args.height === undefined ? {} : { height: args.height }),
|
|
90
|
-
...(args.scale === undefined ? {} : { scale: args.scale })
|
|
91
|
-
}, style.background);
|
|
92
|
-
await writeBytesWithPolicy(target, args.overwrite === true, rendered.bytes);
|
|
93
|
-
const unit = format === "png" ? "px" : "pt";
|
|
94
|
-
return textResult(config, [
|
|
95
|
-
`Rendered **${outputDisplay(args.to)}** (${format}, ${formatBytes(rendered.bytes.byteLength)}, ${round(rendered.width)}×${round(rendered.height)} ${unit}).`,
|
|
96
|
-
// Only when it came from a file; an inline source has nothing to name.
|
|
97
|
-
...(resolved.origin === "inline"
|
|
98
|
-
? []
|
|
99
|
-
: [
|
|
100
|
-
`- source: ${resolved.origin}${resolved.selected === undefined ? "" : ` (mermaid fence ${resolved.selected} of ${resolved.fences.length})`}`
|
|
101
|
-
]),
|
|
102
|
-
"",
|
|
103
|
-
"## What was drawn",
|
|
104
|
-
"",
|
|
105
|
-
...describeDiagram(diagram),
|
|
106
|
-
"",
|
|
107
|
-
"Check that list against what you intended. The parser implements a subset of",
|
|
108
|
-
"Mermaid and a statement it does not recognise is **dropped silently** — a missing",
|
|
109
|
-
"node or edge here is the only sign, since nothing about the file itself looks wrong."
|
|
110
|
-
].join("\n"));
|
|
111
|
-
}
|
|
112
|
-
});
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
export const diagramRenderTool = createDiagramRenderTool();
|
|
113
125
|
/** One decimal place: a diagram's natural size is rarely a whole number. */
|
|
114
126
|
function round(value) {
|
|
115
127
|
return Math.round(value * 10) / 10;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diagram-render.js","sourceRoot":"","sources":["../../src/tools/diagram-render.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACjF,OAAO,EACL,aAAa,EACb,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,aAAa,EACb,oBAAoB,EACpB,oBAAoB,EACpB,eAAe,EAChB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"diagram-render.js","sourceRoot":"","sources":["../../src/tools/diagram-render.ts"],"names":[],"mappings":"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"}
|