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,439 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utilidades comunes de post-proceso de SVG.
|
|
3
|
+
*
|
|
4
|
+
* Todo SVG que sale de DocViz pasa por aqui para garantizar tres cosas:
|
|
5
|
+
* 1. dimensiones explicitas (si no, `<img src="...svg">` se rompe o se recorta);
|
|
6
|
+
* 2. un `<title>` accesible;
|
|
7
|
+
* 3. sanitizacion: sin scripts ni manejadores de eventos (seccion 12.7).
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Elementos que pueden aparecer en un SVG de DocViz.
|
|
11
|
+
*
|
|
12
|
+
* Es una lista de permitidos, no de prohibidos. La version anterior enumeraba
|
|
13
|
+
* los manejadores de eventos conocidos y dejaba pasar todo lo demas: `onwheel`,
|
|
14
|
+
* `ontoggle`, `<animate attributeName="href" to="javascript:...">` y media
|
|
15
|
+
* docena mas de vectores sobrevivian. Con una lista de permitidos, lo que no
|
|
16
|
+
* se ha pensado se cae por defecto en lugar de colarse.
|
|
17
|
+
*
|
|
18
|
+
* El contenido de la lista sale de medir que emiten de verdad los seis motores
|
|
19
|
+
* sobre los 57 tipos del catalogo, mas el vocabulario SVG estandar que un
|
|
20
|
+
* bloque nativo puede usar legitimamente. Una prueba comprueba que sanear los
|
|
21
|
+
* 69 diagramas del catalogo no cambia ni un byte.
|
|
22
|
+
*/
|
|
23
|
+
const ALLOWED_ELEMENTS = new Set([
|
|
24
|
+
// Estructura
|
|
25
|
+
'svg', 'g', 'defs', 'symbol', 'use', 'switch', 'title', 'desc', 'style', 'a',
|
|
26
|
+
// Formas
|
|
27
|
+
'path', 'rect', 'circle', 'ellipse', 'line', 'polyline', 'polygon',
|
|
28
|
+
// Texto
|
|
29
|
+
'text', 'tspan', 'textpath',
|
|
30
|
+
// Pintura
|
|
31
|
+
'marker', 'mask', 'clippath', 'pattern', 'lineargradient', 'radialgradient', 'stop',
|
|
32
|
+
// Filtros (los que emiten los motores)
|
|
33
|
+
'filter', 'fedropshadow', 'fegaussianblur', 'feoffset', 'feblend', 'feflood',
|
|
34
|
+
'fecomposite', 'femerge', 'femergenode', 'fecolormatrix',
|
|
35
|
+
// Etiquetas HTML dentro de foreignObject (Mermaid las usa)
|
|
36
|
+
'foreignobject', 'div', 'span', 'p', 'br', 'b', 'i', 'em', 'strong', 'ul', 'ol', 'li',
|
|
37
|
+
]);
|
|
38
|
+
/**
|
|
39
|
+
* Elementos que se eliminan con todo su contenido.
|
|
40
|
+
*
|
|
41
|
+
* Para el resto de elementos no permitidos se descarta solo la etiqueta y se
|
|
42
|
+
* conservan los hijos: un elemento desconocido suele ser un envoltorio, y
|
|
43
|
+
* tirarlo entero desfiguraria el dibujo. Estos no: su contenido *es* el peligro.
|
|
44
|
+
*/
|
|
45
|
+
const DROP_WITH_CONTENT = new Set([
|
|
46
|
+
'script', 'iframe', 'object', 'embed', 'applet', 'handler', 'audio', 'video',
|
|
47
|
+
'base', 'meta', 'link', 'noscript',
|
|
48
|
+
]);
|
|
49
|
+
/** Atributos admitidos por nombre exacto. */
|
|
50
|
+
const ALLOWED_ATTRS = new Set([
|
|
51
|
+
// Identidad y estructura
|
|
52
|
+
'id', 'class', 'xmlns', 'xmlns:xlink', 'version', 'viewbox', 'preserveaspectratio',
|
|
53
|
+
'width', 'height', 'x', 'y', 'x1', 'y1', 'x2', 'y2', 'cx', 'cy', 'r', 'rx', 'ry',
|
|
54
|
+
'd', 'points', 'transform', 'transform-origin', 'overflow', 'display', 'visibility',
|
|
55
|
+
// Pintura
|
|
56
|
+
'fill', 'fill-opacity', 'fill-rule', 'stroke', 'stroke-width', 'stroke-opacity',
|
|
57
|
+
'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin',
|
|
58
|
+
'stroke-miterlimit', 'opacity', 'color', 'style',
|
|
59
|
+
// Texto
|
|
60
|
+
'font-family', 'font-size', 'font-weight', 'font-style', 'text-anchor', 'dominant-baseline',
|
|
61
|
+
'alignment-baseline', 'baseline-shift', 'letter-spacing', 'word-spacing', 'dx', 'dy',
|
|
62
|
+
'textlength', 'lengthadjust', 'xml:space', 'lineheight', 'white-space',
|
|
63
|
+
// Marcadores, mascaras, gradientes y filtros
|
|
64
|
+
'marker-start', 'marker-mid', 'marker-end', 'markerwidth', 'markerheight', 'markerunits',
|
|
65
|
+
'refx', 'refy', 'orient', 'offset', 'stop-color', 'stop-opacity', 'gradientunits',
|
|
66
|
+
'gradienttransform', 'spreadmethod', 'maskunits', 'clippathunits', 'clip-path', 'clip-rule',
|
|
67
|
+
'mask', 'filter', 'filterunits', 'stddeviation', 'flood-color', 'flood-opacity', 'result', 'in',
|
|
68
|
+
'patternunits', 'pointer-events', 'shape-rendering', 'text-rendering', 'vector-effect',
|
|
69
|
+
// Accesibilidad y trazabilidad
|
|
70
|
+
'role', 'lang', 'xml:lang', 'requiredfeatures', 'requiredextensions', 'systemlanguage',
|
|
71
|
+
// Enlaces (el valor se valida aparte)
|
|
72
|
+
'href', 'xlink:href', 'target', 'xlink:title',
|
|
73
|
+
// Metadatos que emiten los motores: `type` en `<style>`, el resto de PlantUML
|
|
74
|
+
// y del SVG estandar. Sin ellos el dibujo cambia, asi que estan medidos, no
|
|
75
|
+
// supuestos: salen de sanear los 69 diagramas del catalogo y ver que faltaba.
|
|
76
|
+
'type', 'contentstyletype', 'zoomandpan', 'codeline',
|
|
77
|
+
]);
|
|
78
|
+
/** Prefijos de atributo admitidos en bloque. */
|
|
79
|
+
const ALLOWED_ATTR_PREFIXES = ['data-', 'aria-'];
|
|
80
|
+
/** Esquemas de URL que no pueden aparecer en ningun atributo de enlace. */
|
|
81
|
+
const PELIGROSO_EN_URL = /^(?:javascript|vbscript|data|file|blob):/i;
|
|
82
|
+
/**
|
|
83
|
+
* Busca el fin de una etiqueta respetando las comillas.
|
|
84
|
+
*
|
|
85
|
+
* Un `>` dentro del valor de un atributo no cierra nada; cortar ahi es como se
|
|
86
|
+
* cuela la mitad de los saneadores basados en expresiones regulares.
|
|
87
|
+
*/
|
|
88
|
+
function findTagEnd(svg, start) {
|
|
89
|
+
let quote;
|
|
90
|
+
for (let i = start + 1; i < svg.length; i += 1) {
|
|
91
|
+
const c = svg[i];
|
|
92
|
+
if (quote !== undefined) {
|
|
93
|
+
if (c === quote)
|
|
94
|
+
quote = undefined;
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
if (c === '"' || c === "'")
|
|
98
|
+
quote = c;
|
|
99
|
+
else if (c === '>')
|
|
100
|
+
return i;
|
|
101
|
+
}
|
|
102
|
+
return svg.length - 1;
|
|
103
|
+
}
|
|
104
|
+
/** Analiza una etiqueta ya delimitada, respetando comillas. */
|
|
105
|
+
function parseTag(raw) {
|
|
106
|
+
const m = /^<\s*(\/?)\s*([a-zA-Z][\w:.-]*)/.exec(raw);
|
|
107
|
+
if (m === null)
|
|
108
|
+
return undefined;
|
|
109
|
+
const closing = m[1] === '/';
|
|
110
|
+
const nombreBruto = m[2];
|
|
111
|
+
const selfClosing = /\/\s*>$/.test(raw);
|
|
112
|
+
const attrs = [];
|
|
113
|
+
const attrRe = /([:\w.-]+)(?:\s*=\s*(?:"([^"]*)"|'([^']*)'|([^\s"'>]+)))?/g;
|
|
114
|
+
attrRe.lastIndex = m[0].length;
|
|
115
|
+
let a;
|
|
116
|
+
while ((a = attrRe.exec(raw)) !== null) {
|
|
117
|
+
const bruto = a[1];
|
|
118
|
+
if (bruto === '/' || bruto === '')
|
|
119
|
+
continue;
|
|
120
|
+
const valor = a[2] ?? a[3] ?? a[4];
|
|
121
|
+
const quote = a[3] !== undefined ? "'" : '"';
|
|
122
|
+
attrs.push({ name: bruto.toLowerCase(), raw: bruto, ...(valor !== undefined ? { value: valor } : {}), quote });
|
|
123
|
+
}
|
|
124
|
+
return { name: nombreBruto.toLowerCase(), raw: nombreBruto, closing, selfClosing, attrs };
|
|
125
|
+
}
|
|
126
|
+
/** Resuelve entidades numericas y con nombre para poder ver el esquema real. */
|
|
127
|
+
function decodeEntities(value) {
|
|
128
|
+
return value
|
|
129
|
+
.replace(/&#x([0-9a-f]+);?/gi, (_m, hex) => String.fromCodePoint(Number.parseInt(hex, 16)))
|
|
130
|
+
.replace(/&#(\d+);?/g, (_m, dec) => String.fromCodePoint(Number.parseInt(dec, 10)))
|
|
131
|
+
.replace(/&(?:amp|colon|tab|newline|NewLine);?/gi, (m2) => (/amp/i.test(m2) ? '&' : /colon/i.test(m2) ? ':' : ''));
|
|
132
|
+
}
|
|
133
|
+
/** Un enlace solo puede apuntar a un fragmento, a una ruta relativa o a http(s). */
|
|
134
|
+
function urlSegura(valor) {
|
|
135
|
+
const limpio = decodeEntities(valor).replace(/[\s\u0000-\u001f]/g, '');
|
|
136
|
+
if (limpio === '')
|
|
137
|
+
return true;
|
|
138
|
+
if (PELIGROSO_EN_URL.test(limpio))
|
|
139
|
+
return false;
|
|
140
|
+
// Cualquier otro esquema explicito tampoco: no hay motivo para que un
|
|
141
|
+
// diagrama abra `tel:`, `ms-msdt:` ni nada por el estilo.
|
|
142
|
+
if (/^[a-z][a-z0-9+.-]*:/i.test(limpio))
|
|
143
|
+
return /^https?:/i.test(limpio);
|
|
144
|
+
return true;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* CSS sin importaciones remotas ni URLs ejecutables.
|
|
148
|
+
*
|
|
149
|
+
* Vale tanto para el atributo `style` como para el contenido de un elemento
|
|
150
|
+
* `<style>`, que es CSS de verdad y por tanto puede traerse una hoja entera de
|
|
151
|
+
* otro sitio con `@import`.
|
|
152
|
+
*/
|
|
153
|
+
function estiloSeguro(valor) {
|
|
154
|
+
return decodeEntities(valor)
|
|
155
|
+
.replace(/@import[^;]*;?/gi, '')
|
|
156
|
+
.replace(/expression\s*\(/gi, 'void(')
|
|
157
|
+
.replace(/behavior\s*:[^;]*;?/gi, '')
|
|
158
|
+
.replace(/url\(\s*['"]?\s*(?:javascript|vbscript|data|file|blob):[^)]*\)/gi, 'none');
|
|
159
|
+
}
|
|
160
|
+
/** Escapa `<` y `>` dentro del valor de un atributo. */
|
|
161
|
+
function valorSeguro(valor) {
|
|
162
|
+
return valor.includes('<') || valor.includes('>')
|
|
163
|
+
? valor.replace(/</g, '<').replace(/>/g, '>')
|
|
164
|
+
: valor;
|
|
165
|
+
}
|
|
166
|
+
function attrPermitido(nombre) {
|
|
167
|
+
if (nombre.startsWith('on'))
|
|
168
|
+
return false;
|
|
169
|
+
if (ALLOWED_ATTRS.has(nombre))
|
|
170
|
+
return true;
|
|
171
|
+
return ALLOWED_ATTR_PREFIXES.some((p) => nombre.startsWith(p));
|
|
172
|
+
}
|
|
173
|
+
const URL_ATTRS = new Set(['href', 'xlink:href', 'src', 'xlink:href']);
|
|
174
|
+
/** Reconstruye una etiqueta permitida quedandose solo con lo que puede llevar. */
|
|
175
|
+
/**
|
|
176
|
+
* Reconstruye una etiqueta permitida quedandose solo con lo que puede llevar.
|
|
177
|
+
*
|
|
178
|
+
* Si no hubo nada que quitar devuelve la etiqueta **tal cual venia**. Reescribir
|
|
179
|
+
* cada etiqueta cambiaria los bytes de todos los diagramas —espacios, comillas,
|
|
180
|
+
* orden— e invalidaria el cache entero sin que el dibujo cambie en nada.
|
|
181
|
+
*/
|
|
182
|
+
function rebuildTag(tag, bruto) {
|
|
183
|
+
if (tag.closing)
|
|
184
|
+
return bruto;
|
|
185
|
+
const partes = [tag.raw];
|
|
186
|
+
let intacta = true;
|
|
187
|
+
for (const attr of tag.attrs) {
|
|
188
|
+
if (!attrPermitido(attr.name)) {
|
|
189
|
+
intacta = false;
|
|
190
|
+
continue;
|
|
191
|
+
}
|
|
192
|
+
if (attr.value === undefined) {
|
|
193
|
+
partes.push(attr.raw);
|
|
194
|
+
continue;
|
|
195
|
+
}
|
|
196
|
+
if (URL_ATTRS.has(attr.name) && !urlSegura(attr.value)) {
|
|
197
|
+
intacta = false;
|
|
198
|
+
continue;
|
|
199
|
+
}
|
|
200
|
+
// Un `<` literal dentro de un atributo no es XML valido, y es lo que
|
|
201
|
+
// permite que un procesador posterior menos cuidadoso lo lea como etiqueta.
|
|
202
|
+
const limpio = valorSeguro(attr.name === 'style' ? estiloSeguro(attr.value) : attr.value);
|
|
203
|
+
if (limpio !== attr.value)
|
|
204
|
+
intacta = false;
|
|
205
|
+
partes.push(`${attr.raw}=${attr.quote}${limpio}${attr.quote}`);
|
|
206
|
+
}
|
|
207
|
+
if (intacta)
|
|
208
|
+
return bruto;
|
|
209
|
+
return `<${partes.join(' ')}${tag.selfClosing ? '/' : ''}>`;
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Deja el SVG con solo los elementos y atributos permitidos.
|
|
213
|
+
*
|
|
214
|
+
* No intenta reparar un SVG mal formado: recorre las etiquetas respetando las
|
|
215
|
+
* comillas, y lo que no reconoce lo descarta.
|
|
216
|
+
*/
|
|
217
|
+
export function sanitizeSvg(svg) {
|
|
218
|
+
const out = [];
|
|
219
|
+
let i = 0;
|
|
220
|
+
let saltandoHasta;
|
|
221
|
+
let dentroDeStyle = false;
|
|
222
|
+
while (i < svg.length) {
|
|
223
|
+
const abre = svg.indexOf('<', i);
|
|
224
|
+
if (abre === -1) {
|
|
225
|
+
if (saltandoHasta === undefined)
|
|
226
|
+
out.push(dentroDeStyle ? estiloSeguro(svg.slice(i)) : svg.slice(i));
|
|
227
|
+
break;
|
|
228
|
+
}
|
|
229
|
+
if (saltandoHasta === undefined) {
|
|
230
|
+
const texto = svg.slice(i, abre);
|
|
231
|
+
out.push(dentroDeStyle ? estiloSeguro(texto) : texto);
|
|
232
|
+
}
|
|
233
|
+
// Los comentarios se eliminan. No ejecutan nada por si mismos, pero un
|
|
234
|
+
// comentario mal cerrado es la via clasica de mXSS cuando el SVG se
|
|
235
|
+
// incrusta dentro de un HTML, y no aportan nada al dibujo.
|
|
236
|
+
if (svg.startsWith('<!--', abre)) {
|
|
237
|
+
const fin = svg.indexOf('-->', abre);
|
|
238
|
+
i = fin === -1 ? svg.length : fin + 3;
|
|
239
|
+
continue;
|
|
240
|
+
}
|
|
241
|
+
if (svg.startsWith('<?', abre) || svg.startsWith('<!', abre)) {
|
|
242
|
+
const fin = svg.indexOf('>', abre);
|
|
243
|
+
const bruto = svg.slice(abre, fin === -1 ? svg.length : fin + 1);
|
|
244
|
+
if (saltandoHasta === undefined)
|
|
245
|
+
out.push(bruto);
|
|
246
|
+
i = fin === -1 ? svg.length : fin + 1;
|
|
247
|
+
continue;
|
|
248
|
+
}
|
|
249
|
+
const cierre = findTagEnd(svg, abre);
|
|
250
|
+
const bruto = svg.slice(abre, cierre + 1);
|
|
251
|
+
const tag = parseTag(bruto);
|
|
252
|
+
i = cierre + 1;
|
|
253
|
+
if (tag === undefined)
|
|
254
|
+
continue;
|
|
255
|
+
if (saltandoHasta !== undefined) {
|
|
256
|
+
if (tag.closing && tag.name === saltandoHasta)
|
|
257
|
+
saltandoHasta = undefined;
|
|
258
|
+
continue;
|
|
259
|
+
}
|
|
260
|
+
if (DROP_WITH_CONTENT.has(tag.name)) {
|
|
261
|
+
if (!tag.closing && !tag.selfClosing)
|
|
262
|
+
saltandoHasta = tag.name;
|
|
263
|
+
continue;
|
|
264
|
+
}
|
|
265
|
+
if (!ALLOWED_ELEMENTS.has(tag.name))
|
|
266
|
+
continue;
|
|
267
|
+
if (tag.name === 'style' && !tag.selfClosing)
|
|
268
|
+
dentroDeStyle = !tag.closing;
|
|
269
|
+
out.push(rebuildTag(tag, bruto));
|
|
270
|
+
}
|
|
271
|
+
return out.join('');
|
|
272
|
+
}
|
|
273
|
+
function parseOpenSvgTag(svg) {
|
|
274
|
+
const match = /<svg\b[^>]*>/i.exec(svg);
|
|
275
|
+
if (match === null)
|
|
276
|
+
return undefined;
|
|
277
|
+
const raw = match[0];
|
|
278
|
+
const attrs = {};
|
|
279
|
+
const attrRe = /([:\w-]+)\s*=\s*(?:"([^"]*)"|'([^']*)')/g;
|
|
280
|
+
let m;
|
|
281
|
+
while ((m = attrRe.exec(raw)) !== null) {
|
|
282
|
+
attrs[m[1].toLowerCase()] = m[2] ?? m[3] ?? '';
|
|
283
|
+
}
|
|
284
|
+
return { raw, index: match.index, attrs };
|
|
285
|
+
}
|
|
286
|
+
function setAttr(tag, name, value) {
|
|
287
|
+
const re = new RegExp(`(\\s${name}\\s*=\\s*)(?:"[^"]*"|'[^']*')`, 'i');
|
|
288
|
+
if (re.test(tag))
|
|
289
|
+
return tag.replace(re, `$1"${value}"`);
|
|
290
|
+
return tag.replace(/^<svg\b/i, `<svg ${name}="${value}"`);
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Longitud absoluta en pixeles, o `undefined` si no lo es.
|
|
294
|
+
*
|
|
295
|
+
* Es deliberadamente estricto: `parseFloat("100%")` devuelve 100, y aceptarlo
|
|
296
|
+
* dejaria los diagramas de Mermaid (que emite `width="100%"`) a 100 px de ancho.
|
|
297
|
+
*/
|
|
298
|
+
function toPx(value) {
|
|
299
|
+
if (value === undefined)
|
|
300
|
+
return undefined;
|
|
301
|
+
const match = /^\s*(\d+(?:\.\d+)?)(px)?\s*$/i.exec(value);
|
|
302
|
+
if (match === null)
|
|
303
|
+
return undefined;
|
|
304
|
+
const n = Number.parseFloat(match[1]);
|
|
305
|
+
return Number.isFinite(n) && n > 0 ? n : undefined;
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Garantiza `width`, `height` y `viewBox` numericos en el elemento raiz.
|
|
309
|
+
*
|
|
310
|
+
* Mermaid emite `width="100%"` sin `height`, lo que en un visor Markdown
|
|
311
|
+
* produce una imagen de altura cero. Aqui se deriva el tamano real del
|
|
312
|
+
* `viewBox` y se fija en pixeles.
|
|
313
|
+
*/
|
|
314
|
+
export function normalizeSvgDimensions(svg) {
|
|
315
|
+
const tag = parseOpenSvgTag(svg);
|
|
316
|
+
if (tag === undefined)
|
|
317
|
+
return svg;
|
|
318
|
+
const viewBox = tag.attrs['viewbox'];
|
|
319
|
+
let width = toPx(tag.attrs['width']);
|
|
320
|
+
let height = toPx(tag.attrs['height']);
|
|
321
|
+
let vb;
|
|
322
|
+
if (viewBox !== undefined) {
|
|
323
|
+
const parts = viewBox.trim().split(/[\s,]+/).map(Number);
|
|
324
|
+
if (parts.length === 4 && parts.every((n) => Number.isFinite(n)))
|
|
325
|
+
vb = parts;
|
|
326
|
+
}
|
|
327
|
+
if (vb !== undefined) {
|
|
328
|
+
if (width === undefined)
|
|
329
|
+
width = vb[2];
|
|
330
|
+
if (height === undefined)
|
|
331
|
+
height = vb[3];
|
|
332
|
+
const ratio = vb[3] / vb[2];
|
|
333
|
+
// Si solo una dimension era porcentual, se recalcula la otra por proporcion.
|
|
334
|
+
if (toPx(tag.attrs['width']) === undefined && height !== undefined && ratio > 0) {
|
|
335
|
+
width = Math.round(height / ratio);
|
|
336
|
+
}
|
|
337
|
+
if (toPx(tag.attrs['height']) === undefined && width !== undefined) {
|
|
338
|
+
height = Math.round(width * ratio);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
if (width === undefined || height === undefined)
|
|
342
|
+
return svg;
|
|
343
|
+
let newTag = setAttr(tag.raw, 'width', String(Math.round(width)));
|
|
344
|
+
newTag = setAttr(newTag, 'height', String(Math.round(height)));
|
|
345
|
+
if (vb === undefined) {
|
|
346
|
+
newTag = setAttr(newTag, 'viewBox', `0 0 ${Math.round(width)} ${Math.round(height)}`);
|
|
347
|
+
}
|
|
348
|
+
// `preserveAspectRatio="none"` (PlantUML) deforma el diagrama al escalarlo.
|
|
349
|
+
newTag = newTag.replace(/\spreserveAspectRatio\s*=\s*(["'])none\1/i, '');
|
|
350
|
+
return svg.slice(0, tag.index) + newTag + svg.slice(tag.index + tag.raw.length);
|
|
351
|
+
}
|
|
352
|
+
/**
|
|
353
|
+
* Renumera los identificadores internos del SVG en orden de aparicion.
|
|
354
|
+
*
|
|
355
|
+
* Vega mantiene un contador global de `clipPath` por proceso: el mismo grafico
|
|
356
|
+
* renderizado dos veces produce `clip1` y luego `clip2`, es decir bytes
|
|
357
|
+
* distintos para la misma entrada. Eso rompe el determinismo que exige el
|
|
358
|
+
* modelo de cache, asi que los ids se normalizan aqui para todos los motores.
|
|
359
|
+
*
|
|
360
|
+
* Se reescribe tanto el atributo `id` como toda referencia `#id`: Mermaid
|
|
361
|
+
* incrusta una hoja de estilos cuyos selectores estan acotados por el id del
|
|
362
|
+
* elemento raiz (`#mi-id .task { ... }`). Renombrar solo el atributo dejaria
|
|
363
|
+
* esos selectores sin destino y el diagrama saldria sin estilos, con los
|
|
364
|
+
* rectangulos en negro.
|
|
365
|
+
*/
|
|
366
|
+
export function stabilizeSvgIds(svg, prefix = 'dv') {
|
|
367
|
+
const ids = [];
|
|
368
|
+
const seen = new Set();
|
|
369
|
+
for (const match of svg.matchAll(/\bid="([^"]+)"/g)) {
|
|
370
|
+
const id = match[1];
|
|
371
|
+
if (!seen.has(id)) {
|
|
372
|
+
seen.add(id);
|
|
373
|
+
ids.push(id);
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
if (ids.length === 0)
|
|
377
|
+
return svg;
|
|
378
|
+
const mapping = new Map();
|
|
379
|
+
ids.forEach((id, index) => mapping.set(id, `${prefix}${index + 1}`));
|
|
380
|
+
// Se reemplaza de los ids mas largos a los mas cortos para que un id que sea
|
|
381
|
+
// prefijo de otro no corrompa el reemplazo.
|
|
382
|
+
const ordered = [...mapping.entries()].sort((a, b) => b[0].length - a[0].length);
|
|
383
|
+
let out = svg;
|
|
384
|
+
for (const [from, to] of ordered) {
|
|
385
|
+
const escaped = from.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
386
|
+
out = out.replace(new RegExp(`\\bid="${escaped}"`, 'g'), `id="${to}"`);
|
|
387
|
+
// `#id` como token completo: cubre selectores CSS, `url(#id)` y `href="#id"`.
|
|
388
|
+
// El limite posterior evita que un id que sea prefijo de otro se corrompa.
|
|
389
|
+
out = out.replace(new RegExp(`#${escaped}(?![\\w-])`, 'g'), `#${to}`);
|
|
390
|
+
}
|
|
391
|
+
return out;
|
|
392
|
+
}
|
|
393
|
+
export function escapeXml(text) {
|
|
394
|
+
return text
|
|
395
|
+
.replace(/&/g, '&')
|
|
396
|
+
.replace(/</g, '<')
|
|
397
|
+
.replace(/>/g, '>')
|
|
398
|
+
.replace(/"/g, '"')
|
|
399
|
+
.replace(/'/g, ''');
|
|
400
|
+
}
|
|
401
|
+
/** Inserta `<title>` como primer hijo del `<svg>` si aun no existe uno. */
|
|
402
|
+
export function injectTitle(svg, title) {
|
|
403
|
+
if (title === undefined || title.trim() === '')
|
|
404
|
+
return svg;
|
|
405
|
+
const tag = parseOpenSvgTag(svg);
|
|
406
|
+
if (tag === undefined)
|
|
407
|
+
return svg;
|
|
408
|
+
const after = tag.index + tag.raw.length;
|
|
409
|
+
const rest = svg.slice(after);
|
|
410
|
+
if (/^\s*<title\b/i.test(rest))
|
|
411
|
+
return svg;
|
|
412
|
+
return `${svg.slice(0, after)}<title>${escapeXml(title)}</title>${rest}`;
|
|
413
|
+
}
|
|
414
|
+
/** Asegura que exista la declaracion de namespace SVG. */
|
|
415
|
+
export function ensureNamespace(svg) {
|
|
416
|
+
const tag = parseOpenSvgTag(svg);
|
|
417
|
+
if (tag === undefined)
|
|
418
|
+
return svg;
|
|
419
|
+
if (tag.attrs['xmlns'] !== undefined)
|
|
420
|
+
return svg;
|
|
421
|
+
const newTag = tag.raw.replace(/^<svg\b/i, '<svg xmlns="http://www.w3.org/2000/svg"');
|
|
422
|
+
return svg.slice(0, tag.index) + newTag + svg.slice(tag.index + tag.raw.length);
|
|
423
|
+
}
|
|
424
|
+
/** Pipeline completo aplicado a todo SVG antes de escribirlo a disco. */
|
|
425
|
+
export function finalizeSvg(svg, title) {
|
|
426
|
+
let out = svg.replace(/^/, '').trim();
|
|
427
|
+
// PlantUML antepone un PI propio (`<?plantuml ...?>`) que confunde a algunos visores.
|
|
428
|
+
out = out.replace(/^<\?plantuml[^>]*\?>/i, '');
|
|
429
|
+
out = sanitizeSvg(out);
|
|
430
|
+
out = stabilizeSvgIds(out);
|
|
431
|
+
out = ensureNamespace(out);
|
|
432
|
+
out = normalizeSvgDimensions(out);
|
|
433
|
+
out = injectTitle(out, title);
|
|
434
|
+
if (!/^<\?xml/i.test(out)) {
|
|
435
|
+
out = `<?xml version="1.0" encoding="UTF-8" standalone="no"?>\n${out}`;
|
|
436
|
+
}
|
|
437
|
+
return `${out}\n`;
|
|
438
|
+
}
|
|
439
|
+
//# sourceMappingURL=svg-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"svg-utils.js","sourceRoot":"","sources":["../../src/renderers/svg-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Renderer de arte ASCII (svgbob, WebAssembly local).
|
|
3
|
+
*
|
|
4
|
+
* Convierte un dibujo hecho con caracteres en un SVG limpio. Cubre el mismo
|
|
5
|
+
* terreno que GoAT o ditaa: esquemas que ya existen en un RFC, un README o un
|
|
6
|
+
* comentario de codigo y que conviene publicar legibles sin volver a dibujarlos.
|
|
7
|
+
*/
|
|
8
|
+
import type { DiagramRenderer, OutputFormat, RenderOptions, RenderResult } from '../core/types.js';
|
|
9
|
+
import type { Theme } from '../themes/types.js';
|
|
10
|
+
export declare class SvgbobRenderer implements DiagramRenderer {
|
|
11
|
+
readonly type = "svgbob";
|
|
12
|
+
readonly defaultFormat: OutputFormat;
|
|
13
|
+
readonly supportedFormats: readonly OutputFormat[];
|
|
14
|
+
private modulePromise?;
|
|
15
|
+
private cachedVersion?;
|
|
16
|
+
private load;
|
|
17
|
+
version(): Promise<string>;
|
|
18
|
+
render(source: string, options: RenderOptions): Promise<RenderResult>;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* svgbob incrusta su propia hoja de estilos en blanco y negro. Se sustituye por
|
|
22
|
+
* la del tema para que el dibujo no desentone con el resto de diagramas.
|
|
23
|
+
*/
|
|
24
|
+
export declare function applyTheme(svg: string, theme: Theme): string;
|
|
25
|
+
export declare function createSvgbobRenderer(): DiagramRenderer;
|
|
26
|
+
//# sourceMappingURL=svgbob.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"svgbob.d.ts","sourceRoot":"","sources":["../../src/renderers/svgbob.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAGnG,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAOhD,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,CAAwB;IAC9C,OAAO,CAAC,aAAa,CAAC,CAAS;YAEjB,IAAI;IAOZ,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;IAM1B,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;CAgB5E;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,MAAM,CAe5D;AAED,wBAAgB,oBAAoB,IAAI,eAAe,CAEtD"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Renderer de arte ASCII (svgbob, WebAssembly local).
|
|
3
|
+
*
|
|
4
|
+
* Convierte un dibujo hecho con caracteres en un SVG limpio. Cubre el mismo
|
|
5
|
+
* terreno que GoAT o ditaa: esquemas que ya existen en un RFC, un README o un
|
|
6
|
+
* comentario de codigo y que conviene publicar legibles sin volver a dibujarlos.
|
|
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
|
+
const TYPE = 'svgbob';
|
|
12
|
+
const SUPPORTED = ['svg'];
|
|
13
|
+
export class SvgbobRenderer {
|
|
14
|
+
type = TYPE;
|
|
15
|
+
defaultFormat = 'svg';
|
|
16
|
+
supportedFormats = SUPPORTED;
|
|
17
|
+
modulePromise;
|
|
18
|
+
cachedVersion;
|
|
19
|
+
async load() {
|
|
20
|
+
// El paquete solo declara `module`, sin `main` ni `exports`: hay que
|
|
21
|
+
// apuntar al archivo, o Node busca un `index.js` que no existe.
|
|
22
|
+
this.modulePromise ??= import('svgbob-wasm/svgbob_wasm.js').then((m) => m);
|
|
23
|
+
return this.modulePromise;
|
|
24
|
+
}
|
|
25
|
+
async version() {
|
|
26
|
+
// El estilo lo aplica DocViz sobre la salida, asi que forma parte del hash.
|
|
27
|
+
this.cachedVersion ??= `svgbob-${packageVersion('svgbob-wasm')}+docviz-style-1`;
|
|
28
|
+
return this.cachedVersion;
|
|
29
|
+
}
|
|
30
|
+
async render(source, options) {
|
|
31
|
+
assertFormat(TYPE, options.format, SUPPORTED);
|
|
32
|
+
if (source.trim() === '')
|
|
33
|
+
throw new RenderError(TYPE, 'el dibujo esta vacio');
|
|
34
|
+
const svgbob = await this.load();
|
|
35
|
+
let svg;
|
|
36
|
+
try {
|
|
37
|
+
svg = svgbob.render(source);
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
throw asRenderError(TYPE, err, 'svgbob no pudo interpretar el dibujo');
|
|
41
|
+
}
|
|
42
|
+
if (typeof svg !== 'string' || !svg.includes('<svg')) {
|
|
43
|
+
throw new RenderError(TYPE, 'svgbob no produjo un SVG valido');
|
|
44
|
+
}
|
|
45
|
+
return svgResult(TYPE, applyTheme(svg, options.theme), options);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* svgbob incrusta su propia hoja de estilos en blanco y negro. Se sustituye por
|
|
50
|
+
* la del tema para que el dibujo no desentone con el resto de diagramas.
|
|
51
|
+
*/
|
|
52
|
+
export function applyTheme(svg, theme) {
|
|
53
|
+
const style = [
|
|
54
|
+
`line, path, circle, rect, polygon { stroke: ${theme.palette.text}; stroke-width: 2; ` +
|
|
55
|
+
'stroke-opacity: 1; fill-opacity: 1; stroke-linecap: round; stroke-linejoin: miter; }',
|
|
56
|
+
`text { fill: ${theme.palette.text}; font-family: ${theme.fontFamily}; font-size: 14px; }`,
|
|
57
|
+
`rect.backdrop { fill: ${theme.palette.background}; }`,
|
|
58
|
+
'.broken { stroke-dasharray: 8; }',
|
|
59
|
+
`.filled { fill: ${theme.palette.text}; }`,
|
|
60
|
+
'.bg_filled { fill: ' + theme.palette.surface + '; stroke-width: 1; }',
|
|
61
|
+
'.nofill { fill: ' + theme.palette.background + '; }',
|
|
62
|
+
'.end_marked_arrow { marker-end: url(#arrow); }',
|
|
63
|
+
'.start_marked_arrow { marker-start: url(#arrow); }',
|
|
64
|
+
].join('\n');
|
|
65
|
+
return svg.replace(/<style[^>]*>[\s\S]*?<\/style>/i, `<style>\n${style}\n</style>`);
|
|
66
|
+
}
|
|
67
|
+
export function createSvgbobRenderer() {
|
|
68
|
+
return new SvgbobRenderer();
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=svgbob.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"svgbob.js","sourceRoot":"","sources":["../../src/renderers/svgbob.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAGnE,MAAM,IAAI,GAAG,QAAQ,CAAC;AACtB,MAAM,SAAS,GAA4B,CAAC,KAAK,CAAC,CAAC;AAInD,MAAM,OAAO,cAAc;IAChB,IAAI,GAAG,IAAI,CAAC;IACZ,aAAa,GAAiB,KAAK,CAAC;IACpC,gBAAgB,GAAG,SAAS,CAAC;IAE9B,aAAa,CAAyB;IACtC,aAAa,CAAU;IAEvB,KAAK,CAAC,IAAI;QAChB,qEAAqE;QACrE,gEAAgE;QAChE,IAAI,CAAC,aAAa,KAAK,MAAM,CAAC,4BAA4B,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAA4B,CAAC,CAAC;QACtG,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,OAAO;QACX,4EAA4E;QAC5E,IAAI,CAAC,aAAa,KAAK,UAAU,cAAc,CAAC,aAAa,CAAC,iBAAiB,CAAC;QAChF,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAAc,EAAE,OAAsB;QACjD,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAC9C,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE;YAAE,MAAM,IAAI,WAAW,CAAC,IAAI,EAAE,sBAAsB,CAAC,CAAC;QAE9E,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QACjC,IAAI,GAAW,CAAC;QAChB,IAAI,CAAC;YACH,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC9B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,aAAa,CAAC,IAAI,EAAE,GAAG,EAAE,sCAAsC,CAAC,CAAC;QACzE,CAAC;QACD,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACrD,MAAM,IAAI,WAAW,CAAC,IAAI,EAAE,iCAAiC,CAAC,CAAC;QACjE,CAAC;QACD,OAAO,SAAS,CAAC,IAAI,EAAE,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;IAClE,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,GAAW,EAAE,KAAY;IAClD,MAAM,KAAK,GAAG;QACZ,+CAA+C,KAAK,CAAC,OAAO,CAAC,IAAI,qBAAqB;YACpF,sFAAsF;QACxF,gBAAgB,KAAK,CAAC,OAAO,CAAC,IAAI,kBAAkB,KAAK,CAAC,UAAU,sBAAsB;QAC1F,yBAAyB,KAAK,CAAC,OAAO,CAAC,UAAU,KAAK;QACtD,kCAAkC;QAClC,mBAAmB,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK;QAC1C,qBAAqB,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,GAAG,sBAAsB;QACtE,kBAAkB,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,GAAG,KAAK;QACrD,gDAAgD;QAChD,oDAAoD;KACrD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,OAAO,GAAG,CAAC,OAAO,CAAC,gCAAgC,EAAE,YAAY,KAAK,YAAY,CAAC,CAAC;AACtF,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,OAAO,IAAI,cAAc,EAAE,CAAC;AAC9B,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Renderer Vega-Lite — compilacion y dibujo en proceso, sin navegador.
|
|
3
|
+
*
|
|
4
|
+
* `vega-lite` compila la especificacion a Vega y `vega` la dibuja a SVG con el
|
|
5
|
+
* renderer `none` (headless). El resultado es un SVG estatico: el Markdown
|
|
6
|
+
* final no depende de JavaScript (criterio de aceptacion de la seccion 26).
|
|
7
|
+
*/
|
|
8
|
+
import type { DiagramRenderer, OutputFormat, RenderOptions, RenderResult } from '../core/types.js';
|
|
9
|
+
export declare class VegaLiteRenderer implements DiagramRenderer {
|
|
10
|
+
readonly type = "vega-lite";
|
|
11
|
+
readonly defaultFormat: OutputFormat;
|
|
12
|
+
readonly supportedFormats: readonly OutputFormat[];
|
|
13
|
+
private cachedVersion?;
|
|
14
|
+
version(): Promise<string>;
|
|
15
|
+
render(source: string, options: RenderOptions): Promise<RenderResult>;
|
|
16
|
+
}
|
|
17
|
+
export declare function createVegaLiteRenderer(): DiagramRenderer;
|
|
18
|
+
//# sourceMappingURL=vega-lite.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vega-lite.d.ts","sourceRoot":"","sources":["../../src/renderers/vega-lite.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAcnG,qBAAa,gBAAiB,YAAW,eAAe;IACtD,QAAQ,CAAC,IAAI,eAAQ;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;IAM1B,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;CA8C5E;AA0BD,wBAAgB,sBAAsB,IAAI,eAAe,CAExD"}
|