@imontene/mdrender 1.0.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.
Files changed (82) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/LICENSE +21 -0
  3. package/README.md +243 -0
  4. package/dist/assets/theme-dark.css +40 -0
  5. package/dist/assets/theme.css +545 -0
  6. package/dist/assets.d.ts +45 -0
  7. package/dist/assets.js +109 -0
  8. package/dist/bin.d.ts +2 -0
  9. package/dist/bin.js +16 -0
  10. package/dist/browser/cache.d.ts +15 -0
  11. package/dist/browser/cache.js +30 -0
  12. package/dist/browser/detect.d.ts +17 -0
  13. package/dist/browser/detect.js +90 -0
  14. package/dist/browser/setup.d.ts +13 -0
  15. package/dist/browser/setup.js +69 -0
  16. package/dist/cli.d.ts +8 -0
  17. package/dist/cli.js +194 -0
  18. package/dist/config.d.ts +6 -0
  19. package/dist/config.js +32 -0
  20. package/dist/convert.d.ts +64 -0
  21. package/dist/convert.js +167 -0
  22. package/dist/diagnostics.d.ts +8 -0
  23. package/dist/diagnostics.js +6 -0
  24. package/dist/errors.d.ts +12 -0
  25. package/dist/errors.js +21 -0
  26. package/dist/exit-codes.d.ts +8 -0
  27. package/dist/exit-codes.js +8 -0
  28. package/dist/frontmatter.d.ts +10 -0
  29. package/dist/frontmatter.js +26 -0
  30. package/dist/html.d.ts +2 -0
  31. package/dist/html.js +12 -0
  32. package/dist/i18n.d.ts +9 -0
  33. package/dist/i18n.js +59 -0
  34. package/dist/index.d.ts +17 -0
  35. package/dist/index.js +18 -0
  36. package/dist/inputs.d.ts +26 -0
  37. package/dist/inputs.js +118 -0
  38. package/dist/markdown/alerts.d.ts +6 -0
  39. package/dist/markdown/alerts.js +35 -0
  40. package/dist/markdown/env.d.ts +29 -0
  41. package/dist/markdown/env.js +16 -0
  42. package/dist/markdown/highlight.d.ts +6 -0
  43. package/dist/markdown/highlight.js +17 -0
  44. package/dist/markdown/images.d.ts +9 -0
  45. package/dist/markdown/images.js +93 -0
  46. package/dist/markdown/index.d.ts +27 -0
  47. package/dist/markdown/index.js +69 -0
  48. package/dist/markdown/math.d.ts +9 -0
  49. package/dist/markdown/math.js +147 -0
  50. package/dist/markdown/mermaid.d.ts +8 -0
  51. package/dist/markdown/mermaid.js +22 -0
  52. package/dist/markdown/task-lists.d.ts +6 -0
  53. package/dist/markdown/task-lists.js +40 -0
  54. package/dist/markdown/toc.d.ts +22 -0
  55. package/dist/markdown/toc.js +101 -0
  56. package/dist/options.d.ts +55 -0
  57. package/dist/options.js +131 -0
  58. package/dist/paths.d.ts +2 -0
  59. package/dist/paths.js +4 -0
  60. package/dist/preview.d.ts +22 -0
  61. package/dist/preview.js +126 -0
  62. package/dist/render/browser.d.ts +48 -0
  63. package/dist/render/browser.js +134 -0
  64. package/dist/render/fonts.d.ts +10 -0
  65. package/dist/render/fonts.js +47 -0
  66. package/dist/render/header-footer.d.ts +22 -0
  67. package/dist/render/header-footer.js +39 -0
  68. package/dist/render/katex.d.ts +2 -0
  69. package/dist/render/katex.js +19 -0
  70. package/dist/render/mermaid.d.ts +25 -0
  71. package/dist/render/mermaid.js +91 -0
  72. package/dist/render/page.d.ts +7 -0
  73. package/dist/render/page.js +23 -0
  74. package/dist/render/template.d.ts +22 -0
  75. package/dist/render/template.js +54 -0
  76. package/dist/run.d.ts +26 -0
  77. package/dist/run.js +71 -0
  78. package/dist/version.d.ts +1 -0
  79. package/dist/version.js +4 -0
  80. package/dist/watch.d.ts +25 -0
  81. package/dist/watch.js +128 -0
  82. package/package.json +97 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,20 @@
1
+ # Cambios
2
+
3
+ ## 1.0.0 — 2026-10-04
4
+
5
+ Primera versión estable.
6
+
7
+ - Markdown → PDF y HTML autocontenido con Inter (texto) y JetBrains Mono (código).
8
+ - GFM: tablas, listas de tareas, tachado, enlaces automáticos, notas al pie, alertas
9
+ `> [!NOTE]`, resaltado de código.
10
+ - Ecuaciones LaTeX con KaTeX (`$…$`, `$$…$$`, ` ```math `) y diagramas Mermaid.
11
+ - Página: tamaño, márgenes, orientación, encabezado/pie con números de página, tabla de
12
+ contenidos, marcadores y PDF etiquetado.
13
+ - Front matter YAML y `mdrender.config.json`; idioma por defecto español.
14
+ - Lotes (archivos, carpetas, patrones), `--watch`, `mdrender preview` con recarga en vivo.
15
+ - Temas claro, oscuro o CSS propio.
16
+ - `mdrender setup` descarga Chrome Headless Shell si no hay navegador.
17
+ - Seguridad: sin JavaScript del documento, sin descargas de red salvo `--allow-remote`.
18
+ - `--quiet` y `--verbose`.
19
+ - Ejecutables independientes para Windows x64 y Linux x64/arm64; paquete npm
20
+ `@imontene/mdrender`.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 imontene
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,243 @@
1
+ # MD_reder · `mdrender`
2
+
3
+ **Convierte archivos Markdown (`.md`) en PDF y HTML desde la línea de comandos, en Windows y
4
+ Linux**, con ecuaciones LaTeX, diagramas Mermaid y la tipografía
5
+ [Inter](https://fonts.google.com/specimen/Inter).
6
+
7
+ ```bash
8
+ mdrender informe.md # → informe.pdf
9
+ ```
10
+
11
+ Ejemplo: [`examples/ejemplo.md`](examples/ejemplo.md) → [`examples/ejemplo.pdf`](examples/ejemplo.pdf)
12
+
13
+ ## Características
14
+
15
+ - 📄 **Markdown → PDF o HTML autocontenido** (fuentes, imágenes y diagramas incluidos).
16
+ - ➗ **Ecuaciones** `$…$` y `$$…$$` con KaTeX, dibujadas al convertir (sin JavaScript en la salida).
17
+ - 📊 **Diagramas Mermaid**: flujo, secuencia, clases, estados, ER, Gantt, torta, mapa mental…
18
+ - 🔤 **Inter** para el texto y **JetBrains Mono** para el código, incrustadas en el PDF.
19
+ - 🧩 **GFM**: tablas, listas de tareas, tachado, notas al pie, alertas `> [!NOTE]`,
20
+ resaltado de código para ~35 lenguajes.
21
+ - 🖨️ Tamaño de página, márgenes, orientación, encabezado/pie con números de página,
22
+ tabla de contenidos y marcadores del PDF.
23
+ - 🗂️ **Lotes**: varios archivos, carpetas completas o patrones `docs/**/*.md`.
24
+ - 🔁 **`--watch`** y **vista previa en vivo** en el navegador.
25
+ - 🎨 Temas **claro** y **oscuro**, o tu propio CSS.
26
+ - 🔌 **Sin conexión**: todo va empaquetado; por defecto no descarga nada de internet.
27
+ - 💻 **Windows 10/11 y Linux** (x64; arm64 en Linux), probado en ambos en cada cambio.
28
+
29
+ ## Instalación
30
+
31
+ mdrender usa un navegador basado en Chromium para dibujar el PDF. **Microsoft Edge** ya viene
32
+ en Windows 10/11; en Linux sirve **Google Chrome**, **Chromium**, **Edge** o **Brave**. Se
33
+ detecta automáticamente. ¿No tienes ninguno? Ejecuta `mdrender setup` y se descarga Chrome
34
+ Headless Shell (~100 MB) en tu carpeta de usuario.
35
+
36
+ ### Opción 1: ejecutable (sin instalar Node.js)
37
+
38
+ Descarga el archivo de tu sistema desde [Releases](../../releases):
39
+
40
+ | Sistema | Archivo |
41
+ | ----------- | --------------------------------------- |
42
+ | Windows x64 | `mdrender-<versión>-win-x64.zip` |
43
+ | Linux x64 | `mdrender-<versión>-linux-x64.tar.gz` |
44
+ | Linux arm64 | `mdrender-<versión>-linux-arm64.tar.gz` |
45
+
46
+ Descomprímelo y deja `mdrender` (o `mdrender.exe`) en una carpeta que esté en el `PATH`.
47
+ `SHA256SUMS.txt` permite verificar la descarga.
48
+
49
+ ### Opción 2: npm (Node.js 22.12 o superior)
50
+
51
+ ```bash
52
+ npm install -g @imontene/mdrender
53
+ mdrender --version
54
+
55
+ # o sin instalar
56
+ npx @imontene/mdrender documento.md
57
+ ```
58
+
59
+ ### Opción 3: desde el código fuente
60
+
61
+ ```bash
62
+ git clone https://github.com/imontene/MD_reder.git
63
+ cd MD_reder
64
+ npm install
65
+ npm run build
66
+ npm link # deja disponible el comando `mdrender`
67
+ ```
68
+
69
+ ## Uso
70
+
71
+ ```bash
72
+ # Básico: genera documento.pdf junto al .md
73
+ mdrender documento.md
74
+
75
+ # Elegir salida, tamaño de página y tabla de contenidos
76
+ mdrender documento.md -o salida/informe.pdf --page-size Letter --toc
77
+
78
+ # HTML autocontenido
79
+ mdrender documento.md --format html
80
+
81
+ # Varios archivos, carpetas (recursivo) o patrones; -o es entonces una carpeta
82
+ mdrender capitulo1.md capitulo2.md -o pdf/
83
+ mdrender docs/ -o pdf/ # conserva la estructura de subcarpetas
84
+ mdrender "docs/**/*.md" -o pdf/ # los patrones funcionan también en Windows
85
+
86
+ # Regenerar al guardar (Ctrl+C para salir)
87
+ mdrender docs/ -o pdf/ --watch
88
+
89
+ # Vista previa en el navegador que se recarga sola al guardar
90
+ mdrender preview documento.md
91
+
92
+ # Tema oscuro, o un CSS propio que reemplaza el tema
93
+ mdrender documento.md --theme dark
94
+ mdrender documento.md --theme mi-tema.css
95
+
96
+ # Descargar un navegador si no tienes Chrome, Edge ni Chromium
97
+ mdrender setup
98
+ ```
99
+
100
+ En Windows (PowerShell o CMD) los comandos son idénticos:
101
+
102
+ ```powershell
103
+ mdrender "C:\Users\yo\Documentos\notas de clase.md" -o "C:\Users\yo\Desktop\notas.pdf"
104
+ ```
105
+
106
+ Con varios archivos se usa un solo navegador para todos; si uno falla, el resto se convierte
107
+ igual. `mdrender preview` sirve la página en `http://127.0.0.1` (solo accesible desde tu
108
+ equipo); `--port` fija el puerto y `--no-open` no abre el navegador.
109
+
110
+ ### Opciones
111
+
112
+ | Opción | Descripción | Por defecto |
113
+ | ---------------------------- | ----------------------------------------------------------- | ------------------ |
114
+ | `-o, --output <ruta>` | Archivo de salida, o carpeta con varios archivos | junto al `.md` |
115
+ | `-f, --format <pdf\|html>` | Formato de salida | `pdf` |
116
+ | `--page-size <tamaño>` | `A3`, `A4`, `A5`, `Letter`, `Legal`, `Tabloid` | `A4` |
117
+ | `--margin <valor>` | Márgenes como en CSS: `20mm`, `15mm 20mm`, `1in 0.75in`… | `20mm` |
118
+ | `--landscape` | Orientación horizontal | — |
119
+ | `--toc` | Tabla de contenidos al inicio (o donde pongas `[[toc]]`) | — |
120
+ | `--toc-depth <n>` | Nivel de título más profundo en la tabla de contenidos | `3` |
121
+ | `--header <texto>` | Encabezado de página (ver abajo) | — |
122
+ | `--footer <texto>` | Pie de página (ver abajo) | `{page} / {pages}` |
123
+ | `--no-page-numbers` | Sin el pie con números de página | — |
124
+ | `--theme <light\|dark\|css>` | `light`, `dark` o un `.css` que reemplaza el tema | `light` |
125
+ | `--css <archivo.css>` | CSS adicional (se puede repetir) | — |
126
+ | `--mermaid-theme <tema>` | `default`, `neutral`, `dark`, `forest`, `base` | `neutral` / `dark` |
127
+ | `--lang <código>` | Idioma del documento; `en` para inglés (`pt`, `fr`, `de`…) | `es` |
128
+ | `--title <texto>` | Título del documento (muestra un bloque de título) | primer `# título` |
129
+ | `--config <archivo>` | Archivo de configuración | el más cercano |
130
+ | `--no-config` | Ignorar `mdrender.config.json` | — |
131
+ | `--browser <ruta>` | Ruta a Chrome/Edge/Chromium (o variable `MDRENDER_BROWSER`) | autodetección |
132
+ | `--allow-remote` | Permitir que el PDF descargue imágenes/CSS de internet | bloqueado |
133
+ | `-w, --watch` | Regenerar al guardar | — |
134
+ | `-q, --quiet` | Mostrar solo advertencias y errores | — |
135
+ | `-v, --verbose` | Mostrar también configuración, navegador y tiempos | — |
136
+
137
+ **Encabezado y pie**: texto con marcadores `{page}`, `{pages}`, `{title}`, `{author}` y
138
+ `{date}`; `|` separa columnas izquierda, centro y derecha. Ejemplos:
139
+ `--header "{title} | | {date}"`, `--footer "Confidencial | {page} de {pages}"`.
140
+
141
+ ### Front matter y configuración
142
+
143
+ Las mismas opciones pueden ir en un bloque YAML al inicio del `.md` o en un archivo
144
+ `mdrender.config.json` (se busca junto al `.md` y en las carpetas superiores). Prioridad:
145
+ **línea de comandos > front matter > archivo de configuración > valores por defecto**.
146
+
147
+ ```markdown
148
+ ---
149
+ title: Informe técnico
150
+ subtitle: Resultados del trimestre
151
+ author: Ana Pérez
152
+ date: 2026-10-04
153
+ toc: true
154
+ page-size: Letter
155
+ header: "{title} | | {date}"
156
+ ---
157
+ ```
158
+
159
+ ```json
160
+ {
161
+ "lang": "es",
162
+ "pageSize": "A4",
163
+ "margin": "25mm 20mm",
164
+ "css": "estilos/empresa.css"
165
+ }
166
+ ```
167
+
168
+ Con `title` en el front matter se muestra un bloque de título (título, subtítulo, autor y
169
+ fecha). Las rutas de `css` y `theme` son relativas al archivo donde aparecen.
170
+
171
+ ## Ecuaciones y diagramas
172
+
173
+ | Sintaxis | Resultado |
174
+ | --------------------------------- | --------------------------------------- |
175
+ | `$e^{i\pi}+1=0$` | Ecuación en línea |
176
+ | `$$ ... $$` (una o varias líneas) | Ecuación en bloque, centrada |
177
+ | ` ```math ` | Ecuación en bloque (sintaxis de GitHub) |
178
+ | ` ```mermaid ` | Diagrama Mermaid, incrustado como SVG |
179
+
180
+ - Las fórmulas usan [KaTeX](https://katex.org/docs/supported) (`aligned`, `matrix`, `cases`,
181
+ `\def`, `\newcommand`…). Las macros valen para todo el documento.
182
+ - `Cuesta $5 y $10` no se interpreta como fórmula; para un `$` literal usa `\$`.
183
+ - Si una fórmula o diagrama tiene un error, el documento se genera igual con una caja roja en
184
+ su lugar, se informa `error: archivo.md:LÍNEA: mensaje` y el comando termina con código `2`.
185
+
186
+ ## Más Markdown
187
+
188
+ - **Alertas** estilo GitHub: `> [!NOTE]`, `[!TIP]`, `[!IMPORTANT]`, `[!WARNING]`,
189
+ `[!CAUTION]`, con el título traducido según el idioma.
190
+ - **Notas al pie**: `Texto[^1]` y `[^1]: La nota.`
191
+ - **Imágenes locales** (`![](img/foto.png)` o `<img src="img/foto.png" width="200">`) con rutas
192
+ relativas al `.md`, aunque tengan espacios o acentos: se incrustan en el resultado.
193
+
194
+ ## Seguridad
195
+
196
+ - El PDF se genera con JavaScript desactivado: un `<script>` dentro del Markdown no se ejecuta.
197
+ - Por defecto no se descarga nada de internet; las imágenes remotas se omiten con una
198
+ advertencia (`--allow-remote` lo permite). Los archivos locales solo entran al documento
199
+ como imágenes referenciadas desde el `.md`.
200
+ - Mermaid corre en una página aparte, sin contenido del usuario, con `securityLevel: "strict"`.
201
+ - La vista previa solo escucha en `127.0.0.1`.
202
+ - En Ubuntu 23.10+ el navegador descargado con `mdrender setup` no puede usar el sandbox de
203
+ Chrome (restricción de AppArmor); mdrender lo inicia entonces sin sandbox, lo que es seguro
204
+ aquí porque las páginas no ejecutan JavaScript del documento ni acceden a la red
205
+ (`--verbose` lo indica). Con Chrome o Chromium instalados desde paquete no ocurre.
206
+
207
+ ## Códigos de salida
208
+
209
+ | Código | Significado |
210
+ | ------ | -------------------------------------------------------- |
211
+ | `0` | Éxito |
212
+ | `1` | Error de uso (argumentos, opciones, archivo inexistente) |
213
+ | `2` | Error de renderizado (fórmula o diagrama inválido) |
214
+ | `3` | Navegador no encontrado (ejecuta `mdrender setup`) |
215
+
216
+ ## Desarrollo
217
+
218
+ Requisitos: Node.js 22.12+ y npm.
219
+
220
+ ```bash
221
+ npm install
222
+ npm run dev -- documento.md # ejecutar desde el código fuente (tsx)
223
+ npm test # pruebas (Vitest)
224
+ npm run test:coverage # pruebas con cobertura (mínimo 80 %)
225
+ npm run check # formato + lint + tipos + pruebas, como en CI
226
+ npm run build # compila a dist/
227
+ npm run build:exe # ejecutable independiente en build/sea/
228
+ ```
229
+
230
+ El CI (GitHub Actions) prueba en **Windows y Linux** con Node 22 y 24, construye y prueba el
231
+ ejecutable y valida `mdrender setup`. Para publicar una versión, sube una etiqueta `v*` o
232
+ lanza a mano **Actions → Release → Run workflow** con la versión (debe coincidir con
233
+ `package.json`): construye los ejecutables, crea la etiqueta y el GitHub Release con sus sumas
234
+ SHA-256, y publica en npm si el secreto `NPM_TOKEN` está configurado.
235
+
236
+ Plan completo y decisiones de diseño: [docs/PLAN_MAESTRO.md](docs/PLAN_MAESTRO.md) ·
237
+ cambios: [CHANGELOG.md](CHANGELOG.md).
238
+
239
+ ## Licencia
240
+
241
+ [MIT](LICENSE). Inter y JetBrains Mono se distribuyen bajo la
242
+ [SIL Open Font License 1.1](https://openfontlicense.org); los ejecutables incluyen
243
+ `THIRD-PARTY-NOTICES.txt` con las licencias de todos los componentes.
@@ -0,0 +1,40 @@
1
+ /* mdrender dark theme: loaded after theme.css, overrides its color variables. */
2
+
3
+ :root {
4
+ --color-text: #e6edf3;
5
+ --color-muted: #9198a1;
6
+ --color-heading: #f0f6fc;
7
+ --color-link: #4493f8;
8
+ --color-border: #3d444d;
9
+ --color-subtle-bg: #151b23;
10
+ --color-accent: #4493f8;
11
+ --color-bg: #0d1117;
12
+ --color-stripe: #11161d;
13
+ --color-error: #ffa198;
14
+ --color-error-bg: #2d1416;
15
+ --color-error-border: #8e1519;
16
+ --alert-note: #4493f8;
17
+ --alert-tip: #3fb950;
18
+ --alert-important: #ab7df8;
19
+ --alert-warning: #d29922;
20
+ --alert-caution: #f85149;
21
+ /* Syntax highlighting (GitHub dark) */
22
+ --code-keyword: #ff7b72;
23
+ --code-title: #d2a8ff;
24
+ --code-constant: #79c0ff;
25
+ --code-string: #a5d6ff;
26
+ --code-builtin: #ffa657;
27
+ --code-comment: #8b949e;
28
+ --code-tag: #7ee787;
29
+ --code-text: #e6edf3;
30
+ --code-added: #aff5b4;
31
+ --code-added-bg: #033a16;
32
+ --code-removed: #ffdcd7;
33
+ --code-removed-bg: #67060c;
34
+ color-scheme: dark;
35
+ }
36
+
37
+ /* Paint the whole sheet, margins included (the root background stops at the margins). */
38
+ @page {
39
+ background: #0d1117;
40
+ }