docviz-builder 0.1.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/AGENTS.md +371 -0
- package/LICENSE +21 -0
- package/README.md +837 -0
- package/bin/docviz-mcp.mjs +10 -0
- package/bin/docviz.mjs +11 -0
- package/dist/build/builder.d.ts +62 -0
- package/dist/build/builder.d.ts.map +1 -0
- package/dist/build/builder.js +337 -0
- package/dist/build/builder.js.map +1 -0
- package/dist/build/diff.d.ts +64 -0
- package/dist/build/diff.d.ts.map +1 -0
- package/dist/build/diff.js +156 -0
- package/dist/build/diff.js.map +1 -0
- package/dist/build/doctor.d.ts +39 -0
- package/dist/build/doctor.d.ts.map +1 -0
- package/dist/build/doctor.js +190 -0
- package/dist/build/doctor.js.map +1 -0
- package/dist/build/init.d.ts +28 -0
- package/dist/build/init.d.ts.map +1 -0
- package/dist/build/init.js +274 -0
- package/dist/build/init.js.map +1 -0
- package/dist/build/preview.d.ts +13 -0
- package/dist/build/preview.d.ts.map +1 -0
- package/dist/build/preview.js +277 -0
- package/dist/build/preview.js.map +1 -0
- package/dist/build/skill.d.ts +41 -0
- package/dist/build/skill.d.ts.map +1 -0
- package/dist/build/skill.js +63 -0
- package/dist/build/skill.js.map +1 -0
- package/dist/build/verify.d.ts +26 -0
- package/dist/build/verify.d.ts.map +1 -0
- package/dist/build/verify.js +99 -0
- package/dist/build/verify.js.map +1 -0
- package/dist/cli.d.ts +20 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +427 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/load.d.ts +32 -0
- package/dist/config/load.d.ts.map +1 -0
- package/dist/config/load.js +279 -0
- package/dist/config/load.js.map +1 -0
- package/dist/config/types.d.ts +89 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +5 -0
- package/dist/config/types.js.map +1 -0
- package/dist/core/cache.d.ts +32 -0
- package/dist/core/cache.d.ts.map +1 -0
- package/dist/core/cache.js +69 -0
- package/dist/core/cache.js.map +1 -0
- package/dist/core/errors.d.ts +115 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +164 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/hash.d.ts +57 -0
- package/dist/core/hash.d.ts.map +1 -0
- package/dist/core/hash.js +0 -0
- package/dist/core/hash.js.map +1 -0
- package/dist/core/package-version.d.ts +9 -0
- package/dist/core/package-version.d.ts.map +1 -0
- package/dist/core/package-version.js +44 -0
- package/dist/core/package-version.js.map +1 -0
- package/dist/core/paths.d.ts +46 -0
- package/dist/core/paths.d.ts.map +1 -0
- package/dist/core/paths.js +105 -0
- package/dist/core/paths.js.map +1 -0
- package/dist/core/registry.d.ts +24 -0
- package/dist/core/registry.d.ts.map +1 -0
- package/dist/core/registry.js +72 -0
- package/dist/core/registry.js.map +1 -0
- package/dist/core/types.d.ts +78 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +11 -0
- package/dist/core/types.js.map +1 -0
- package/dist/dsl/architecture.d.ts +15 -0
- package/dist/dsl/architecture.d.ts.map +1 -0
- package/dist/dsl/architecture.js +242 -0
- package/dist/dsl/architecture.js.map +1 -0
- package/dist/dsl/catalog.d.ts +62 -0
- package/dist/dsl/catalog.d.ts.map +1 -0
- package/dist/dsl/catalog.en.d.ts +18 -0
- package/dist/dsl/catalog.en.d.ts.map +1 -0
- package/dist/dsl/catalog.en.js +299 -0
- package/dist/dsl/catalog.en.js.map +1 -0
- package/dist/dsl/catalog.js +1082 -0
- package/dist/dsl/catalog.js.map +1 -0
- package/dist/dsl/chart.d.ts +14 -0
- package/dist/dsl/chart.d.ts.map +1 -0
- package/dist/dsl/chart.js +435 -0
- package/dist/dsl/chart.js.map +1 -0
- package/dist/dsl/compile.d.ts +31 -0
- package/dist/dsl/compile.d.ts.map +1 -0
- package/dist/dsl/compile.js +120 -0
- package/dist/dsl/compile.js.map +1 -0
- package/dist/dsl/diagram-bpmn.d.ts +13 -0
- package/dist/dsl/diagram-bpmn.d.ts.map +1 -0
- package/dist/dsl/diagram-bpmn.js +215 -0
- package/dist/dsl/diagram-bpmn.js.map +1 -0
- package/dist/dsl/diagram-product.d.ts +15 -0
- package/dist/dsl/diagram-product.d.ts.map +1 -0
- package/dist/dsl/diagram-product.js +291 -0
- package/dist/dsl/diagram-product.js.map +1 -0
- package/dist/dsl/diagram-technical.d.ts +28 -0
- package/dist/dsl/diagram-technical.d.ts.map +1 -0
- package/dist/dsl/diagram-technical.js +365 -0
- package/dist/dsl/diagram-technical.js.map +1 -0
- package/dist/dsl/diagram.d.ts +22 -0
- package/dist/dsl/diagram.d.ts.map +1 -0
- package/dist/dsl/diagram.js +542 -0
- package/dist/dsl/diagram.js.map +1 -0
- package/dist/dsl/fallbacks-d2.d.ts +27 -0
- package/dist/dsl/fallbacks-d2.d.ts.map +1 -0
- package/dist/dsl/fallbacks-d2.js +265 -0
- package/dist/dsl/fallbacks-d2.js.map +1 -0
- package/dist/dsl/fallbacks.d.ts +25 -0
- package/dist/dsl/fallbacks.d.ts.map +1 -0
- package/dist/dsl/fallbacks.js +264 -0
- package/dist/dsl/fallbacks.js.map +1 -0
- package/dist/dsl/fields.d.ts +93 -0
- package/dist/dsl/fields.d.ts.map +1 -0
- package/dist/dsl/fields.js +233 -0
- package/dist/dsl/fields.js.map +1 -0
- package/dist/dsl/index.d.ts +50 -0
- package/dist/dsl/index.d.ts.map +1 -0
- package/dist/dsl/index.js +114 -0
- package/dist/dsl/index.js.map +1 -0
- package/dist/dsl/util.d.ts +105 -0
- package/dist/dsl/util.d.ts.map +1 -0
- package/dist/dsl/util.js +261 -0
- package/dist/dsl/util.js.map +1 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/markdown/scan.d.ts +73 -0
- package/dist/markdown/scan.d.ts.map +1 -0
- package/dist/markdown/scan.js +150 -0
- package/dist/markdown/scan.js.map +1 -0
- package/dist/markdown/transform.d.ts +28 -0
- package/dist/markdown/transform.d.ts.map +1 -0
- package/dist/markdown/transform.js +38 -0
- package/dist/markdown/transform.js.map +1 -0
- package/dist/mcp/server.d.ts +18 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +118 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools.d.ts +118 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +573 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/renderers/base.d.ts +18 -0
- package/dist/renderers/base.d.ts.map +1 -0
- package/dist/renderers/base.js +59 -0
- package/dist/renderers/base.js.map +1 -0
- package/dist/renderers/bpmn.d.ts +68 -0
- package/dist/renderers/bpmn.d.ts.map +1 -0
- package/dist/renderers/bpmn.js +158 -0
- package/dist/renderers/bpmn.js.map +1 -0
- package/dist/renderers/browser.d.ts +30 -0
- package/dist/renderers/browser.d.ts.map +1 -0
- package/dist/renderers/browser.js +143 -0
- package/dist/renderers/browser.js.map +1 -0
- package/dist/renderers/color-scheme.d.ts +40 -0
- package/dist/renderers/color-scheme.d.ts.map +1 -0
- package/dist/renderers/color-scheme.js +122 -0
- package/dist/renderers/color-scheme.js.map +1 -0
- package/dist/renderers/d2.d.ts +37 -0
- package/dist/renderers/d2.d.ts.map +1 -0
- package/dist/renderers/d2.js +108 -0
- package/dist/renderers/d2.js.map +1 -0
- package/dist/renderers/graphviz.d.ts +33 -0
- package/dist/renderers/graphviz.d.ts.map +1 -0
- package/dist/renderers/graphviz.js +88 -0
- package/dist/renderers/graphviz.js.map +1 -0
- package/dist/renderers/in-page.d.ts +33 -0
- package/dist/renderers/in-page.d.ts.map +1 -0
- package/dist/renderers/in-page.js +76 -0
- package/dist/renderers/in-page.js.map +1 -0
- package/dist/renderers/index.d.ts +20 -0
- package/dist/renderers/index.d.ts.map +1 -0
- package/dist/renderers/index.js +94 -0
- package/dist/renderers/index.js.map +1 -0
- package/dist/renderers/kroki.d.ts +38 -0
- package/dist/renderers/kroki.d.ts.map +1 -0
- package/dist/renderers/kroki.js +151 -0
- package/dist/renderers/kroki.js.map +1 -0
- package/dist/renderers/likec4-svg.d.ts +82 -0
- package/dist/renderers/likec4-svg.d.ts.map +1 -0
- package/dist/renderers/likec4-svg.js +435 -0
- package/dist/renderers/likec4-svg.js.map +1 -0
- package/dist/renderers/likec4.d.ts +22 -0
- package/dist/renderers/likec4.d.ts.map +1 -0
- package/dist/renderers/likec4.js +77 -0
- package/dist/renderers/likec4.js.map +1 -0
- package/dist/renderers/mermaid.d.ts +64 -0
- package/dist/renderers/mermaid.d.ts.map +1 -0
- package/dist/renderers/mermaid.js +196 -0
- package/dist/renderers/mermaid.js.map +1 -0
- package/dist/renderers/plantuml.d.ts +56 -0
- package/dist/renderers/plantuml.d.ts.map +1 -0
- package/dist/renderers/plantuml.js +195 -0
- package/dist/renderers/plantuml.js.map +1 -0
- package/dist/renderers/svg-utils.d.ts +46 -0
- package/dist/renderers/svg-utils.d.ts.map +1 -0
- package/dist/renderers/svg-utils.js +439 -0
- package/dist/renderers/svg-utils.js.map +1 -0
- package/dist/renderers/svgbob.d.ts +26 -0
- package/dist/renderers/svgbob.d.ts.map +1 -0
- package/dist/renderers/svgbob.js +70 -0
- package/dist/renderers/svgbob.js.map +1 -0
- package/dist/renderers/vega-lite.d.ts +18 -0
- package/dist/renderers/vega-lite.d.ts.map +1 -0
- package/dist/renderers/vega-lite.js +94 -0
- package/dist/renderers/vega-lite.js.map +1 -0
- package/dist/themes/index.d.ts +17 -0
- package/dist/themes/index.d.ts.map +1 -0
- package/dist/themes/index.js +419 -0
- package/dist/themes/index.js.map +1 -0
- package/dist/themes/types.d.ts +99 -0
- package/dist/themes/types.d.ts.map +1 -0
- package/dist/themes/types.js +9 -0
- package/dist/themes/types.js.map +1 -0
- package/eval/casos.json +513 -0
- package/package.json +114 -0
- package/scripts/capture-preview.mjs +101 -0
- package/scripts/check-github.mjs +128 -0
- package/scripts/eval.d.mts +8 -0
- package/scripts/eval.mjs +284 -0
- package/scripts/fetch-plantuml.mjs +122 -0
- package/scripts/generate-catalog-doc.mjs +106 -0
- package/scripts/rasterize.mjs +68 -0
- package/scripts/sync-docs.mjs +158 -0
- package/skills/docviz/SKILL.md +111 -0
- package/vendor/.gitkeep +0 -0
|
@@ -0,0 +1,435 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Emisor SVG propio para vistas LikeC4.
|
|
3
|
+
*
|
|
4
|
+
* LikeC4 calcula el layout (posiciones, tamanos y curvas Bezier de cada
|
|
5
|
+
* relacion) mediante Graphviz; lo que no ofrece es un dibujado a SVG sin
|
|
6
|
+
* navegador. Este modulo toma la vista ya distribuida y la dibuja, de forma que
|
|
7
|
+
* el renderer LikeC4 sea tan offline como los demas y respete el tema del
|
|
8
|
+
* proyecto.
|
|
9
|
+
*/
|
|
10
|
+
import { escapeXml } from './svg-utils.js';
|
|
11
|
+
const PADDING = 24;
|
|
12
|
+
const TITLE_SIZE = 15;
|
|
13
|
+
const BODY_SIZE = 11.5;
|
|
14
|
+
const TECH_SIZE = 10.5;
|
|
15
|
+
const LINE_GAP = 1.35;
|
|
16
|
+
/** Ancho medio de caracter respecto al tamano de fuente, para el ajuste de linea. */
|
|
17
|
+
const CHAR_RATIO = 0.55;
|
|
18
|
+
/** Neutros de maximo contraste para el texto dentro de un nodo. */
|
|
19
|
+
const INK_ON_LIGHT = '#12181F';
|
|
20
|
+
const INK_ON_DARK = '#FFFFFF';
|
|
21
|
+
/**
|
|
22
|
+
* Registro de colores duales del emisor.
|
|
23
|
+
*
|
|
24
|
+
* A diferencia del resto de motores, aqui los colores no salen tal cual de la
|
|
25
|
+
* paleta: se componen con la opacidad del nodo y el color del texto se elige por
|
|
26
|
+
* contraste. Esos valores calculados no existen en el tema, asi que la
|
|
27
|
+
* sustitucion textual generica no puede alcanzarlos. Cada decision de color
|
|
28
|
+
* registra su par claro/oscuro y devuelve una variable CSS.
|
|
29
|
+
*/
|
|
30
|
+
class ColorVars {
|
|
31
|
+
byPair = new Map();
|
|
32
|
+
/** Devuelve `var(--lcN,<claro>)` para el par indicado. */
|
|
33
|
+
pair(light, dark) {
|
|
34
|
+
const key = `${light}|${dark}`;
|
|
35
|
+
let name = this.byPair.get(key);
|
|
36
|
+
if (name === undefined) {
|
|
37
|
+
name = `--lc${this.byPair.size + 1}`;
|
|
38
|
+
this.byPair.set(key, name);
|
|
39
|
+
}
|
|
40
|
+
return `var(${name},${light})`;
|
|
41
|
+
}
|
|
42
|
+
/** Hoja de estilos con los valores claros y su redefinicion en modo oscuro. */
|
|
43
|
+
styleBlock() {
|
|
44
|
+
if (this.byPair.size === 0)
|
|
45
|
+
return '';
|
|
46
|
+
const light = [];
|
|
47
|
+
const dark = [];
|
|
48
|
+
for (const [key, name] of this.byPair) {
|
|
49
|
+
const [l, d] = key.split('|');
|
|
50
|
+
light.push(`${name}:${l};`);
|
|
51
|
+
dark.push(`${name}:${d};`);
|
|
52
|
+
}
|
|
53
|
+
return (`<style>:root{${light.join('')}}` +
|
|
54
|
+
`@media (prefers-color-scheme:dark){:root{${dark.join('')}}}</style>`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
export function renderLikeC4View(view, theme) {
|
|
58
|
+
const { bounds } = view;
|
|
59
|
+
const width = Math.max(1, Math.round(bounds.width)) + PADDING * 2;
|
|
60
|
+
const height = Math.max(1, Math.round(bounds.height)) + PADDING * 2;
|
|
61
|
+
const offsetX = PADDING - bounds.x;
|
|
62
|
+
const offsetY = PADDING - bounds.y;
|
|
63
|
+
const colors = new ColorVars();
|
|
64
|
+
const byId = new Map(view.nodes.map((n) => [n.id, n]));
|
|
65
|
+
// Los contenedores se pintan primero para que las hojas queden por encima.
|
|
66
|
+
const ordered = [...view.nodes].sort((a, b) => a.level - b.level || b.children.length - a.children.length);
|
|
67
|
+
const parts = [];
|
|
68
|
+
parts.push(`<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="${width}" height="${height}" viewBox="0 0 ${width} ${height}" role="img">`);
|
|
69
|
+
parts.push(defs(theme, colors));
|
|
70
|
+
const background = colors.pair(theme.likec4.background, theme.dark.likec4.background);
|
|
71
|
+
parts.push(`<rect width="${width}" height="${height}" fill="${background}"/>`);
|
|
72
|
+
parts.push(`<g transform="translate(${round(offsetX)},${round(offsetY)})">`);
|
|
73
|
+
for (const node of ordered)
|
|
74
|
+
parts.push(renderNode(node, theme, colors));
|
|
75
|
+
for (const edge of view.edges)
|
|
76
|
+
parts.push(renderEdge(edge, theme, byId, colors));
|
|
77
|
+
parts.push('</g>');
|
|
78
|
+
parts.push('</svg>');
|
|
79
|
+
// La hoja de estilos va justo tras la etiqueta de apertura.
|
|
80
|
+
const openTagEnd = parts[0].length;
|
|
81
|
+
const body = parts.join('\n');
|
|
82
|
+
return `${body.slice(0, openTagEnd)}${colors.styleBlock()}${body.slice(openTagEnd)}`;
|
|
83
|
+
}
|
|
84
|
+
function defs(theme, colors) {
|
|
85
|
+
const stroke = colors.pair(theme.likec4.edgeStroke, theme.dark.likec4.edgeStroke);
|
|
86
|
+
return [
|
|
87
|
+
'<defs>',
|
|
88
|
+
`<marker id="lc4-arrow" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse" markerUnits="userSpaceOnUse"><path d="M 0 0 L 10 5 L 0 10 z" fill="${stroke}"/></marker>`,
|
|
89
|
+
`<marker id="lc4-arrow-open" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="8" markerHeight="8" orient="auto-start-reverse" markerUnits="userSpaceOnUse"><path d="M 0 0 L 10 5 L 0 10" fill="none" stroke="${stroke}" stroke-width="1.6"/></marker>`,
|
|
90
|
+
`<marker id="lc4-diamond" viewBox="0 0 12 12" refX="11" refY="6" markerWidth="8" markerHeight="8" orient="auto-start-reverse" markerUnits="userSpaceOnUse"><path d="M 0 6 L 6 1 L 12 6 L 6 11 z" fill="${stroke}"/></marker>`,
|
|
91
|
+
`<marker id="lc4-dot" viewBox="0 0 10 10" refX="5" refY="5" markerWidth="6" markerHeight="6" orient="auto" markerUnits="userSpaceOnUse"><circle cx="5" cy="5" r="4" fill="${stroke}"/></marker>`,
|
|
92
|
+
`<filter id="lc4-shadow" x="-10%" y="-10%" width="130%" height="140%"><feDropShadow dx="0" dy="2" stdDeviation="2.5" flood-opacity="0.18"/></filter>`,
|
|
93
|
+
'</defs>',
|
|
94
|
+
].join('\n');
|
|
95
|
+
}
|
|
96
|
+
// --------------------------------------------------------------------------
|
|
97
|
+
// Nodos
|
|
98
|
+
// --------------------------------------------------------------------------
|
|
99
|
+
function renderNode(node, theme, colors) {
|
|
100
|
+
const isGroup = node.children.length > 0;
|
|
101
|
+
const key = node.color ?? 'primary';
|
|
102
|
+
// Cada decision de color se toma dos veces —con la paleta clara y con la
|
|
103
|
+
// oscura— y se registra como un par. Asi la misma imagen se lee bien en un
|
|
104
|
+
// visor claro y en uno oscuro sin renderizar dos veces el diagrama.
|
|
105
|
+
const light = nodeColors(theme, key, node, isGroup);
|
|
106
|
+
const dark = nodeColors({ ...theme, palette: theme.dark.palette, likec4: theme.dark.likec4 }, key, node, isGroup);
|
|
107
|
+
const fill = colors.pair(light.fill, dark.fill);
|
|
108
|
+
const stroke = colors.pair(light.stroke, dark.stroke);
|
|
109
|
+
const text = colors.pair(light.text, dark.text);
|
|
110
|
+
const muted = colors.pair(light.muted, dark.muted);
|
|
111
|
+
const x = round(node.x);
|
|
112
|
+
const y = round(node.y);
|
|
113
|
+
const w = round(node.width);
|
|
114
|
+
const h = round(node.height);
|
|
115
|
+
const parts = [`<g data-node="${escapeXml(node.id)}">`];
|
|
116
|
+
if (isGroup) {
|
|
117
|
+
parts.push(`<rect x="${x}" y="${y}" width="${w}" height="${h}" rx="10" fill="${fill}" fill-opacity="0.55" stroke="${stroke}" stroke-width="1.2" stroke-dasharray="6 4"/>`);
|
|
118
|
+
// El titulo del contenedor va arriba a la izquierda, fuera del area util.
|
|
119
|
+
parts.push(textNode(escapeXml(node.title), x + 14, y + 20, TITLE_SIZE, text, 'start', 600, theme));
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
parts.push(shapePath(node.shape ?? 'rectangle', x, y, w, h, fill, stroke, 1));
|
|
123
|
+
parts.push(...nodeLabels(node, x, y, w, h, text, muted, theme));
|
|
124
|
+
}
|
|
125
|
+
parts.push('</g>');
|
|
126
|
+
return parts.join('\n');
|
|
127
|
+
}
|
|
128
|
+
/** Resuelve relleno, borde y texto de un nodo para una paleta concreta. */
|
|
129
|
+
function nodeColors(theme, key, node, isGroup) {
|
|
130
|
+
const baseFill = isGroup
|
|
131
|
+
? theme.likec4.groupFill
|
|
132
|
+
: (theme.likec4.nodeFill[key] ?? theme.palette.primary);
|
|
133
|
+
const stroke = isGroup
|
|
134
|
+
? theme.likec4.groupStroke
|
|
135
|
+
: (theme.likec4.nodeStroke[key] ?? theme.palette.primary);
|
|
136
|
+
// LikeC4 expresa la transparencia del relleno en `style.opacity` (0-100).
|
|
137
|
+
// Se compone contra el fondo aqui, en lugar de emitir `fill-opacity`, porque
|
|
138
|
+
// el color del texto debe elegirse contra el color que se vera de verdad: un
|
|
139
|
+
// azul oscuro al 15 % es un azul claro, y encima de el el texto blanco no se
|
|
140
|
+
// lee.
|
|
141
|
+
const opacity = node.style?.opacity !== undefined ? clamp(node.style.opacity / 100, 0.08, 1) : 1;
|
|
142
|
+
const fill = isGroup ? baseFill : blend(baseFill, theme.likec4.background, opacity);
|
|
143
|
+
const text = isGroup ? theme.palette.text : contrastText(fill, theme.palette);
|
|
144
|
+
const muted = isGroup ? theme.palette.textMuted : withAlpha(text, 0.75);
|
|
145
|
+
return { fill, stroke, text, muted };
|
|
146
|
+
}
|
|
147
|
+
function nodeLabels(node, x, y, w, h, color, muted, theme) {
|
|
148
|
+
const innerWidth = Math.max(40, w - 32);
|
|
149
|
+
const titleLines = wrap(node.title, innerWidth, TITLE_SIZE, 3);
|
|
150
|
+
const description = normalizeText(node.description);
|
|
151
|
+
const descLines = description === undefined ? [] : wrap(description, innerWidth, BODY_SIZE, 3);
|
|
152
|
+
const technology = normalizeText(node.technology);
|
|
153
|
+
const techLines = technology === undefined ? [] : wrap(`[${technology}]`, innerWidth, TECH_SIZE, 1);
|
|
154
|
+
const blockHeight = titleLines.length * TITLE_SIZE * LINE_GAP +
|
|
155
|
+
(descLines.length > 0 ? 6 + descLines.length * BODY_SIZE * LINE_GAP : 0) +
|
|
156
|
+
(techLines.length > 0 ? 4 + techLines.length * TECH_SIZE * LINE_GAP : 0);
|
|
157
|
+
const cx = x + w / 2;
|
|
158
|
+
let cursor = y + h / 2 - blockHeight / 2 + TITLE_SIZE * 0.85;
|
|
159
|
+
const out = [];
|
|
160
|
+
for (const line of titleLines) {
|
|
161
|
+
out.push(textNode(escapeXml(line), cx, cursor, TITLE_SIZE, color, 'middle', 600, theme));
|
|
162
|
+
cursor += TITLE_SIZE * LINE_GAP;
|
|
163
|
+
}
|
|
164
|
+
if (descLines.length > 0) {
|
|
165
|
+
cursor += 6;
|
|
166
|
+
for (const line of descLines) {
|
|
167
|
+
out.push(textNode(escapeXml(line), cx, cursor, BODY_SIZE, muted, 'middle', 400, theme));
|
|
168
|
+
cursor += BODY_SIZE * LINE_GAP;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
if (techLines.length > 0) {
|
|
172
|
+
cursor += 4;
|
|
173
|
+
for (const line of techLines) {
|
|
174
|
+
out.push(textNode(escapeXml(line), cx, cursor, TECH_SIZE, muted, 'middle', 400, theme, 'italic'));
|
|
175
|
+
cursor += TECH_SIZE * LINE_GAP;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return out;
|
|
179
|
+
}
|
|
180
|
+
/** Dibuja el contorno correspondiente a la forma LikeC4 declarada. */
|
|
181
|
+
function shapePath(shape, x, y, w, h, fill, stroke, opacity) {
|
|
182
|
+
const common = `fill="${fill}" fill-opacity="${opacity}" stroke="${stroke}" stroke-width="1.5" filter="url(#lc4-shadow)"`;
|
|
183
|
+
switch (shape) {
|
|
184
|
+
case 'person': {
|
|
185
|
+
// Rectangulo redondeado con una cabeza semicircular en el borde superior.
|
|
186
|
+
const headR = Math.min(16, h * 0.14);
|
|
187
|
+
const bodyY = y + headR;
|
|
188
|
+
return [
|
|
189
|
+
`<rect x="${x}" y="${round(bodyY)}" width="${w}" height="${round(h - headR)}" rx="10" ${common}/>`,
|
|
190
|
+
`<circle cx="${round(x + w / 2)}" cy="${round(bodyY)}" r="${round(headR)}" fill="${fill}" fill-opacity="${opacity}" stroke="${stroke}" stroke-width="1.5"/>`,
|
|
191
|
+
].join('\n');
|
|
192
|
+
}
|
|
193
|
+
case 'cylinder':
|
|
194
|
+
case 'storage': {
|
|
195
|
+
const ry = Math.min(14, h * 0.12);
|
|
196
|
+
return [
|
|
197
|
+
`<path d="M ${x} ${round(y + ry)} A ${round(w / 2)} ${round(ry)} 0 0 1 ${x + w} ${round(y + ry)} L ${x + w} ${round(y + h - ry)} A ${round(w / 2)} ${round(ry)} 0 0 1 ${x} ${round(y + h - ry)} Z" ${common}/>`,
|
|
198
|
+
`<path d="M ${x} ${round(y + ry)} A ${round(w / 2)} ${round(ry)} 0 0 0 ${x + w} ${round(y + ry)}" fill="none" stroke="${stroke}" stroke-width="1.2" stroke-opacity="0.7"/>`,
|
|
199
|
+
].join('\n');
|
|
200
|
+
}
|
|
201
|
+
case 'queue': {
|
|
202
|
+
const rx = Math.min(16, w * 0.06);
|
|
203
|
+
return [
|
|
204
|
+
`<rect x="${x}" y="${y}" width="${w}" height="${h}" rx="${round(rx)}" ry="${round(h / 2)}" ${common}/>`,
|
|
205
|
+
`<path d="M ${round(x + w - rx * 2)} ${y} A ${round(rx)} ${round(h / 2)} 0 0 1 ${round(x + w - rx * 2)} ${y + h}" fill="none" stroke="${stroke}" stroke-width="1.2" stroke-opacity="0.7"/>`,
|
|
206
|
+
].join('\n');
|
|
207
|
+
}
|
|
208
|
+
case 'browser': {
|
|
209
|
+
const bar = 18;
|
|
210
|
+
return [
|
|
211
|
+
`<rect x="${x}" y="${y}" width="${w}" height="${h}" rx="8" ${common}/>`,
|
|
212
|
+
`<path d="M ${x} ${round(y + bar)} L ${x + w} ${round(y + bar)}" stroke="${stroke}" stroke-width="1.2" stroke-opacity="0.7" fill="none"/>`,
|
|
213
|
+
`<circle cx="${x + 14}" cy="${round(y + bar / 2)}" r="3" fill="${stroke}" fill-opacity="0.55"/>`,
|
|
214
|
+
`<circle cx="${x + 26}" cy="${round(y + bar / 2)}" r="3" fill="${stroke}" fill-opacity="0.55"/>`,
|
|
215
|
+
`<circle cx="${x + 38}" cy="${round(y + bar / 2)}" r="3" fill="${stroke}" fill-opacity="0.55"/>`,
|
|
216
|
+
].join('\n');
|
|
217
|
+
}
|
|
218
|
+
case 'mobile': {
|
|
219
|
+
const inset = Math.min(28, w * 0.12);
|
|
220
|
+
return [
|
|
221
|
+
`<rect x="${round(x + inset)}" y="${y}" width="${round(w - inset * 2)}" height="${h}" rx="12" ${common}/>`,
|
|
222
|
+
`<rect x="${round(x + w / 2 - 12)}" y="${round(y + 6)}" width="24" height="3" rx="1.5" fill="${stroke}" fill-opacity="0.55"/>`,
|
|
223
|
+
].join('\n');
|
|
224
|
+
}
|
|
225
|
+
case 'component': {
|
|
226
|
+
const tabW = 14;
|
|
227
|
+
const tabH = 10;
|
|
228
|
+
return [
|
|
229
|
+
`<rect x="${round(x + tabW / 2)}" y="${y}" width="${round(w - tabW / 2)}" height="${h}" rx="6" ${common}/>`,
|
|
230
|
+
`<rect x="${x}" y="${round(y + h * 0.28)}" width="${tabW}" height="${tabH}" fill="${fill}" fill-opacity="${opacity}" stroke="${stroke}" stroke-width="1.3"/>`,
|
|
231
|
+
`<rect x="${x}" y="${round(y + h * 0.58)}" width="${tabW}" height="${tabH}" fill="${fill}" fill-opacity="${opacity}" stroke="${stroke}" stroke-width="1.3"/>`,
|
|
232
|
+
].join('\n');
|
|
233
|
+
}
|
|
234
|
+
case 'document': {
|
|
235
|
+
const wave = Math.min(16, h * 0.12);
|
|
236
|
+
return `<path d="M ${x} ${round(y + 6)} Q ${x} ${y} ${x + 6} ${y} L ${x + w - 6} ${y} Q ${x + w} ${y} ${x + w} ${round(y + 6)} L ${x + w} ${round(y + h - wave)} Q ${round(x + w * 0.75)} ${round(y + h)} ${round(x + w / 2)} ${round(y + h - wave / 2)} Q ${round(x + w * 0.25)} ${round(y + h - wave)} ${x} ${round(y + h - wave / 2)} Z" ${common}/>`;
|
|
237
|
+
}
|
|
238
|
+
case 'bucket': {
|
|
239
|
+
const ry = Math.min(12, h * 0.1);
|
|
240
|
+
const inset = w * 0.08;
|
|
241
|
+
return [
|
|
242
|
+
`<path d="M ${x} ${round(y + ry)} A ${round(w / 2)} ${round(ry)} 0 0 1 ${x + w} ${round(y + ry)} L ${round(x + w - inset)} ${round(y + h - ry)} A ${round(w / 2 - inset)} ${round(ry)} 0 0 1 ${round(x + inset)} ${round(y + h - ry)} Z" ${common}/>`,
|
|
243
|
+
`<path d="M ${x} ${round(y + ry)} A ${round(w / 2)} ${round(ry)} 0 0 0 ${x + w} ${round(y + ry)}" fill="none" stroke="${stroke}" stroke-width="1.2" stroke-opacity="0.7"/>`,
|
|
244
|
+
].join('\n');
|
|
245
|
+
}
|
|
246
|
+
case 'rectangle':
|
|
247
|
+
default:
|
|
248
|
+
return `<rect x="${x}" y="${y}" width="${w}" height="${h}" rx="10" ${common}/>`;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
// --------------------------------------------------------------------------
|
|
252
|
+
// Relaciones
|
|
253
|
+
// --------------------------------------------------------------------------
|
|
254
|
+
function renderEdge(edge, theme, nodes, colors) {
|
|
255
|
+
const points = edge.points ?? [];
|
|
256
|
+
if (points.length < 2)
|
|
257
|
+
return '';
|
|
258
|
+
const stroke = colors.pair(theme.likec4.edgeStroke, theme.dark.likec4.edgeStroke);
|
|
259
|
+
const dash = edge.line === 'dashed' ? ' stroke-dasharray="7 5"' : edge.line === 'dotted' ? ' stroke-dasharray="2 4"' : '';
|
|
260
|
+
const marker = markerFor(edge.head);
|
|
261
|
+
const tailMarker = edge.tail !== undefined && edge.tail !== 'none' ? ` marker-start="url(#${markerFor(edge.tail)})"` : '';
|
|
262
|
+
const parts = [
|
|
263
|
+
`<path d="${bezierPath(points)}" fill="none" stroke="${stroke}" stroke-width="1.6" stroke-linecap="round"${dash} marker-end="url(#${marker})"${tailMarker} data-edge="${escapeXml(edge.id)}"/>`,
|
|
264
|
+
];
|
|
265
|
+
const label = typeof edge.label === 'string' ? edge.label.trim() : '';
|
|
266
|
+
if (label !== '') {
|
|
267
|
+
const box = edge.labelBBox;
|
|
268
|
+
const anchor = box ?? midpointBox(points);
|
|
269
|
+
const lines = wrap(label, Math.max(70, box?.width ?? 120), BODY_SIZE, 2);
|
|
270
|
+
const lineHeight = BODY_SIZE * LINE_GAP;
|
|
271
|
+
const boxWidth = Math.max(...lines.map((l) => textWidth(l, BODY_SIZE))) + 10;
|
|
272
|
+
const boxHeight = lines.length * lineHeight + 6;
|
|
273
|
+
const cx = round(anchor.x + (box?.width ?? 0) / 2);
|
|
274
|
+
const top = round(anchor.y - (box === undefined ? boxHeight / 2 : 2));
|
|
275
|
+
const labelBackground = colors.pair(theme.likec4.background, theme.dark.likec4.background);
|
|
276
|
+
const labelText = colors.pair(theme.likec4.edgeText, theme.dark.likec4.edgeText);
|
|
277
|
+
parts.push(`<rect x="${round(cx - boxWidth / 2)}" y="${top}" width="${round(boxWidth)}" height="${round(boxHeight)}" rx="4" fill="${labelBackground}" fill-opacity="0.92"/>`);
|
|
278
|
+
let cursor = top + BODY_SIZE + 2;
|
|
279
|
+
for (const line of lines) {
|
|
280
|
+
parts.push(textNode(escapeXml(line), cx, cursor, BODY_SIZE, labelText, 'middle', 500, theme));
|
|
281
|
+
cursor += lineHeight;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
// Nota: `nodes` queda disponible para futuras decoraciones por forma de origen.
|
|
285
|
+
void nodes;
|
|
286
|
+
return parts.join('\n');
|
|
287
|
+
}
|
|
288
|
+
function markerFor(head) {
|
|
289
|
+
switch (head) {
|
|
290
|
+
case 'diamond':
|
|
291
|
+
case 'odiamond':
|
|
292
|
+
return 'lc4-diamond';
|
|
293
|
+
case 'dot':
|
|
294
|
+
case 'odot':
|
|
295
|
+
return 'lc4-dot';
|
|
296
|
+
case 'open':
|
|
297
|
+
case 'vee':
|
|
298
|
+
case 'onormal':
|
|
299
|
+
return 'lc4-arrow-open';
|
|
300
|
+
default:
|
|
301
|
+
return 'lc4-arrow';
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Graphviz entrega la curva como punto inicial seguido de tripletas de control.
|
|
306
|
+
* Si sobran puntos que no completan una tripleta se cierran con segmentos rectos.
|
|
307
|
+
*/
|
|
308
|
+
function bezierPath(points) {
|
|
309
|
+
const [first, ...rest] = points;
|
|
310
|
+
let d = `M ${round(first[0])} ${round(first[1])}`;
|
|
311
|
+
let i = 0;
|
|
312
|
+
while (i + 2 < rest.length) {
|
|
313
|
+
const c1 = rest[i];
|
|
314
|
+
const c2 = rest[i + 1];
|
|
315
|
+
const end = rest[i + 2];
|
|
316
|
+
d += ` C ${round(c1[0])} ${round(c1[1])}, ${round(c2[0])} ${round(c2[1])}, ${round(end[0])} ${round(end[1])}`;
|
|
317
|
+
i += 3;
|
|
318
|
+
}
|
|
319
|
+
for (; i < rest.length; i += 1) {
|
|
320
|
+
const p = rest[i];
|
|
321
|
+
d += ` L ${round(p[0])} ${round(p[1])}`;
|
|
322
|
+
}
|
|
323
|
+
return d;
|
|
324
|
+
}
|
|
325
|
+
function midpointBox(points) {
|
|
326
|
+
const mid = points[Math.floor(points.length / 2)];
|
|
327
|
+
return { x: mid[0], y: mid[1], width: 0, height: 0 };
|
|
328
|
+
}
|
|
329
|
+
// --------------------------------------------------------------------------
|
|
330
|
+
// Texto
|
|
331
|
+
// --------------------------------------------------------------------------
|
|
332
|
+
function textNode(content, x, y, size, fill, anchor, weight, theme, style) {
|
|
333
|
+
const italic = style === 'italic' ? ' font-style="italic"' : '';
|
|
334
|
+
return `<text x="${round(x)}" y="${round(y)}" font-family="${escapeXml(theme.fontFamily)}" font-size="${size}" font-weight="${weight}" fill="${fill}" text-anchor="${anchor}"${italic}>${content}</text>`;
|
|
335
|
+
}
|
|
336
|
+
function textWidth(text, size) {
|
|
337
|
+
return text.length * size * CHAR_RATIO;
|
|
338
|
+
}
|
|
339
|
+
/** Ajuste de linea por palabras con truncado con elipsis al llegar al maximo. */
|
|
340
|
+
export function wrap(text, maxWidth, size, maxLines) {
|
|
341
|
+
const words = text.split(/\s+/).filter((w) => w !== '');
|
|
342
|
+
if (words.length === 0)
|
|
343
|
+
return [];
|
|
344
|
+
const lines = [];
|
|
345
|
+
let current = '';
|
|
346
|
+
for (const word of words) {
|
|
347
|
+
const candidate = current === '' ? word : `${current} ${word}`;
|
|
348
|
+
if (textWidth(candidate, size) <= maxWidth || current === '') {
|
|
349
|
+
current = candidate;
|
|
350
|
+
}
|
|
351
|
+
else {
|
|
352
|
+
lines.push(current);
|
|
353
|
+
current = word;
|
|
354
|
+
if (lines.length === maxLines)
|
|
355
|
+
break;
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
if (lines.length < maxLines && current !== '')
|
|
359
|
+
lines.push(current);
|
|
360
|
+
if (lines.length === maxLines) {
|
|
361
|
+
const consumed = lines.join(' ').split(/\s+/).length;
|
|
362
|
+
if (consumed < words.length) {
|
|
363
|
+
const last = lines[maxLines - 1];
|
|
364
|
+
lines[maxLines - 1] = `${last.replace(/[\s,.;:]+$/, '')}...`;
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
return lines;
|
|
368
|
+
}
|
|
369
|
+
function normalizeText(value) {
|
|
370
|
+
if (typeof value === 'string') {
|
|
371
|
+
const t = value.trim();
|
|
372
|
+
return t === '' ? undefined : t;
|
|
373
|
+
}
|
|
374
|
+
if (value !== null && typeof value === 'object' && 'txt' in value) {
|
|
375
|
+
return normalizeText(value.txt);
|
|
376
|
+
}
|
|
377
|
+
return undefined;
|
|
378
|
+
}
|
|
379
|
+
// --------------------------------------------------------------------------
|
|
380
|
+
// Color
|
|
381
|
+
// --------------------------------------------------------------------------
|
|
382
|
+
/**
|
|
383
|
+
* Elige texto claro u oscuro segun la luminancia del relleno (WCAG).
|
|
384
|
+
*
|
|
385
|
+
* Devuelve neutros absolutos, no tokens de la paleta: el criterio es el
|
|
386
|
+
* contraste contra ese relleno concreto, y el relleno ya cambia entre el modo
|
|
387
|
+
* claro y el oscuro. Usar `primaryText` seria un error de significado —ese token
|
|
388
|
+
* es "texto sobre el color primario", que en la paleta oscura es oscuro.
|
|
389
|
+
*/
|
|
390
|
+
export function contrastText(fill, palette) {
|
|
391
|
+
const rgb = parseHex(fill);
|
|
392
|
+
if (rgb === undefined)
|
|
393
|
+
return palette.text;
|
|
394
|
+
const [r, g, b] = rgb.map((c) => {
|
|
395
|
+
const s = c / 255;
|
|
396
|
+
return s <= 0.03928 ? s / 12.92 : ((s + 0.055) / 1.055) ** 2.4;
|
|
397
|
+
});
|
|
398
|
+
const luminance = 0.2126 * r + 0.7152 * g + 0.0722 * b;
|
|
399
|
+
return luminance > 0.45 ? INK_ON_LIGHT : INK_ON_DARK;
|
|
400
|
+
}
|
|
401
|
+
/** Compone `fg` sobre `bg` con la opacidad dada y devuelve un color opaco. */
|
|
402
|
+
export function blend(fg, bg, alpha) {
|
|
403
|
+
const a = parseHex(fg);
|
|
404
|
+
const b = parseHex(bg);
|
|
405
|
+
if (a === undefined || b === undefined)
|
|
406
|
+
return fg;
|
|
407
|
+
const mix = a.map((c, i) => Math.round(c * alpha + b[i] * (1 - alpha)));
|
|
408
|
+
return `#${mix.map((c) => c.toString(16).padStart(2, '0')).join('')}`;
|
|
409
|
+
}
|
|
410
|
+
function withAlpha(hex, alpha) {
|
|
411
|
+
const rgb = parseHex(hex);
|
|
412
|
+
if (rgb === undefined)
|
|
413
|
+
return hex;
|
|
414
|
+
return `rgba(${rgb[0]},${rgb[1]},${rgb[2]},${alpha})`;
|
|
415
|
+
}
|
|
416
|
+
function parseHex(hex) {
|
|
417
|
+
const m = /^#?([0-9a-f]{6}|[0-9a-f]{3})$/i.exec(hex.trim());
|
|
418
|
+
if (m === null)
|
|
419
|
+
return undefined;
|
|
420
|
+
let value = m[1];
|
|
421
|
+
if (value.length === 3)
|
|
422
|
+
value = value.split('').map((c) => c + c).join('');
|
|
423
|
+
return [
|
|
424
|
+
Number.parseInt(value.slice(0, 2), 16),
|
|
425
|
+
Number.parseInt(value.slice(2, 4), 16),
|
|
426
|
+
Number.parseInt(value.slice(4, 6), 16),
|
|
427
|
+
];
|
|
428
|
+
}
|
|
429
|
+
function clamp(v, min, max) {
|
|
430
|
+
return Math.min(max, Math.max(min, v));
|
|
431
|
+
}
|
|
432
|
+
function round(v) {
|
|
433
|
+
return Math.round(v * 100) / 100;
|
|
434
|
+
}
|
|
435
|
+
//# sourceMappingURL=likec4-svg.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"likec4-svg.js","sourceRoot":"","sources":["../../src/renderers/likec4-svg.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Renderer LikeC4 — renderer especializado, no pasa por Kroki.
|
|
3
|
+
*
|
|
4
|
+
* Usa la API programatica de `likec4` para parsear el DSL, validar el modelo y
|
|
5
|
+
* calcular el layout (Graphviz WASM), y despues dibuja la vista con el emisor
|
|
6
|
+
* SVG propio (`likec4-svg.ts`) aplicando el tema del proyecto.
|
|
7
|
+
*/
|
|
8
|
+
import type { DiagramRenderer, OutputFormat, RenderOptions, RenderResult } from '../core/types.js';
|
|
9
|
+
export interface LikeC4Options {
|
|
10
|
+
/** Nombre de la vista a renderizar cuando el modelo define varias. */
|
|
11
|
+
view?: string;
|
|
12
|
+
}
|
|
13
|
+
export declare class LikeC4Renderer implements DiagramRenderer {
|
|
14
|
+
readonly type = "likec4";
|
|
15
|
+
readonly defaultFormat: OutputFormat;
|
|
16
|
+
readonly supportedFormats: readonly OutputFormat[];
|
|
17
|
+
private cachedVersion?;
|
|
18
|
+
version(): Promise<string>;
|
|
19
|
+
render(source: string, options: RenderOptions): Promise<RenderResult>;
|
|
20
|
+
}
|
|
21
|
+
export declare function createLikeC4Renderer(options?: LikeC4Options): DiagramRenderer;
|
|
22
|
+
//# sourceMappingURL=likec4.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"likec4.d.ts","sourceRoot":"","sources":["../../src/renderers/likec4.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAQnG,MAAM,WAAW,aAAa;IAC5B,sEAAsE;IACtE,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAOD,qBAAa,cAAe,YAAW,eAAe;IACpD,QAAQ,CAAC,IAAI,YAAQ;IACrB,QAAQ,CAAC,aAAa,EAAE,YAAY,CAAS;IAC7C,QAAQ,CAAC,gBAAgB,0BAAa;IAEtC,OAAO,CAAC,aAAa,CAAC,CAAS;IAEzB,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;IAS1B,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;CAmC5E;AAiBD,wBAAgB,oBAAoB,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,eAAe,CAG7E"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Renderer LikeC4 — renderer especializado, no pasa por Kroki.
|
|
3
|
+
*
|
|
4
|
+
* Usa la API programatica de `likec4` para parsear el DSL, validar el modelo y
|
|
5
|
+
* calcular el layout (Graphviz WASM), y despues dibuja la vista con el emisor
|
|
6
|
+
* SVG propio (`likec4-svg.ts`) aplicando el tema del proyecto.
|
|
7
|
+
*/
|
|
8
|
+
import { RenderError } from '../core/errors.js';
|
|
9
|
+
import { packageVersion } from '../core/package-version.js';
|
|
10
|
+
import { assertFormat, asRenderError, svgResult } from './base.js';
|
|
11
|
+
import { renderLikeC4View } from './likec4-svg.js';
|
|
12
|
+
const TYPE = 'likec4';
|
|
13
|
+
const SUPPORTED = ['svg'];
|
|
14
|
+
export class LikeC4Renderer {
|
|
15
|
+
type = TYPE;
|
|
16
|
+
defaultFormat = 'svg';
|
|
17
|
+
supportedFormats = SUPPORTED;
|
|
18
|
+
cachedVersion;
|
|
19
|
+
async version() {
|
|
20
|
+
if (this.cachedVersion !== undefined)
|
|
21
|
+
return this.cachedVersion;
|
|
22
|
+
// El emisor SVG es nuestro, asi que su version tambien entra en el hash:
|
|
23
|
+
// hay que subirla al cambiar el dibujado, o el cache serviria imagenes
|
|
24
|
+
// generadas por el emisor anterior. Version 2: colores duales claro/oscuro.
|
|
25
|
+
this.cachedVersion = `likec4-${packageVersion('likec4')}+docviz-svg-2`;
|
|
26
|
+
return this.cachedVersion;
|
|
27
|
+
}
|
|
28
|
+
async render(source, options) {
|
|
29
|
+
assertFormat(TYPE, options.format, SUPPORTED);
|
|
30
|
+
if (source.trim() === '')
|
|
31
|
+
throw new RenderError(TYPE, 'el modelo LikeC4 esta vacio');
|
|
32
|
+
let instance;
|
|
33
|
+
let views;
|
|
34
|
+
try {
|
|
35
|
+
const { LikeC4 } = await import('likec4');
|
|
36
|
+
instance = (await LikeC4.fromSource(source, {
|
|
37
|
+
logger: false,
|
|
38
|
+
printErrors: false,
|
|
39
|
+
throwIfInvalid: true,
|
|
40
|
+
graphviz: 'wasm',
|
|
41
|
+
}));
|
|
42
|
+
views = await instance.diagrams();
|
|
43
|
+
}
|
|
44
|
+
catch (err) {
|
|
45
|
+
throw asRenderError(TYPE, err, 'LikeC4 rechazo el modelo');
|
|
46
|
+
}
|
|
47
|
+
finally {
|
|
48
|
+
// El servicio de lenguaje deja timers vivos si no se libera.
|
|
49
|
+
await instance?.dispose?.().catch(() => undefined);
|
|
50
|
+
}
|
|
51
|
+
if (views.length === 0) {
|
|
52
|
+
throw new RenderError(TYPE, 'el modelo no define ninguna vista', 'anade un bloque `views { view index { include * } }`');
|
|
53
|
+
}
|
|
54
|
+
const requested = options.title;
|
|
55
|
+
const view = pickView(views, requested);
|
|
56
|
+
const svg = renderLikeC4View(view, options.theme);
|
|
57
|
+
return svgResult(TYPE, svg, options);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Elige la vista a dibujar: la que coincida por id o titulo con lo pedido, o la
|
|
62
|
+
* primera declarada. Un bloque Markdown produce exactamente una imagen.
|
|
63
|
+
*/
|
|
64
|
+
function pickView(views, requested) {
|
|
65
|
+
if (requested !== undefined) {
|
|
66
|
+
const match = views.find((v) => v.id === requested || (typeof v.title === 'string' && v.title === requested));
|
|
67
|
+
if (match !== undefined)
|
|
68
|
+
return match;
|
|
69
|
+
}
|
|
70
|
+
const index = views.find((v) => v.id === 'index');
|
|
71
|
+
return index ?? views[0];
|
|
72
|
+
}
|
|
73
|
+
export function createLikeC4Renderer(options) {
|
|
74
|
+
void options;
|
|
75
|
+
return new LikeC4Renderer();
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=likec4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"likec4.js","sourceRoot":"","sources":["../../src/renderers/likec4.ts"],"names":[],"mappings":"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"}
|