docuguru 0.1.0__tar.gz
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.
- docuguru-0.1.0/PKG-INFO +194 -0
- docuguru-0.1.0/README.md +176 -0
- docuguru-0.1.0/pyproject.toml +31 -0
- docuguru-0.1.0/src/docuguru/__init__.py +4 -0
- docuguru-0.1.0/src/docuguru/cli.py +280 -0
- docuguru-0.1.0/src/docuguru/default.py +650 -0
- docuguru-0.1.0/src/docuguru/html_to_pdf.py +198 -0
- docuguru-0.1.0/src/docuguru/markdon_to_html.py +19 -0
docuguru-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: docuguru
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary:
|
|
5
|
+
Author: Cristian Cubillos
|
|
6
|
+
Author-email: ccubillosreyes1@gmail.com
|
|
7
|
+
Requires-Python: >=3.12
|
|
8
|
+
Classifier: Programming Language :: Python :: 3
|
|
9
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
10
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
11
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
12
|
+
Requires-Dist: jinja2 (>=3.1.6,<4.0.0)
|
|
13
|
+
Requires-Dist: markdown (>=3.10,<4.0)
|
|
14
|
+
Requires-Dist: pygments (>=2.19.2,<3.0.0)
|
|
15
|
+
Requires-Dist: typer (>=0.21.0,<0.22.0)
|
|
16
|
+
Requires-Dist: weasyprint (>=67.0,<68.0)
|
|
17
|
+
Description-Content-Type: text/markdown
|
|
18
|
+
|
|
19
|
+
# DocuGuru
|
|
20
|
+
|
|
21
|
+
Herramienta profesional para convertir documentos Markdown a PDF con estilos predefinidos y componentes personalizados.
|
|
22
|
+
|
|
23
|
+
## Características
|
|
24
|
+
|
|
25
|
+
- ✅ Conversión de Markdown a PDF de alta calidad
|
|
26
|
+
- ✅ Página de portada automática con título, badge y fecha
|
|
27
|
+
- ✅ Tabla de contenidos generada automáticamente (H1, H2, H3)
|
|
28
|
+
- ✅ Soporte completo para títulos (h1-h6), tablas y listas
|
|
29
|
+
- ✅ Listas ordenadas con números estilizados en círculos
|
|
30
|
+
- ✅ Listas no ordenadas con checkmarks personalizados
|
|
31
|
+
- ✅ Componentes HTML personalizados (info-cards, timelines, summary-cards, etc.)
|
|
32
|
+
- ✅ Estilos profesionales predefinidos
|
|
33
|
+
- ✅ Optimizado para impresión en formato A4
|
|
34
|
+
|
|
35
|
+
## Instalación
|
|
36
|
+
|
|
37
|
+
### Requisitos
|
|
38
|
+
|
|
39
|
+
- Python >= 3.12
|
|
40
|
+
- Poetry (para gestión de dependencias)
|
|
41
|
+
|
|
42
|
+
### Instalación con Poetry
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
# Clonar el repositorio
|
|
46
|
+
git clone <repository-url>
|
|
47
|
+
cd docuguru
|
|
48
|
+
|
|
49
|
+
# Instalar dependencias
|
|
50
|
+
poetry install
|
|
51
|
+
|
|
52
|
+
# Activar el entorno virtual
|
|
53
|
+
poetry shell
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### Instalación del paquete
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
# Construir el paquete
|
|
60
|
+
poetry build
|
|
61
|
+
|
|
62
|
+
# Instalar desde el wheel generado
|
|
63
|
+
pip install dist/docuguru-0.1.0-py3-none-any.whl
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## Uso
|
|
67
|
+
|
|
68
|
+
### Comando Básico
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
docuguru convert documento.md
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
Esto generará un archivo `documento.pdf` en el mismo directorio.
|
|
75
|
+
|
|
76
|
+
### Opciones Disponibles
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
docuguru convert documento.md [OPCIONES]
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
**Opciones:**
|
|
83
|
+
|
|
84
|
+
- `-o, --output <archivo>`: Especifica la ruta del archivo PDF de salida
|
|
85
|
+
- `-t, --title <título>`: Define el título del documento (por defecto se extrae del primer H1)
|
|
86
|
+
- `--no-cover`: No incluir página de portada
|
|
87
|
+
- `-b, --badge <texto>`: Texto del badge en la portada (por defecto: "Propuesta técnica")
|
|
88
|
+
- `-d, --date <fecha>`: Fecha para la portada (ej: "Diciembre 2025", por defecto: fecha actual)
|
|
89
|
+
|
|
90
|
+
### Ejemplos
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
# Conversión básica
|
|
94
|
+
docuguru convert propuesta.md
|
|
95
|
+
|
|
96
|
+
# Con título personalizado y fecha
|
|
97
|
+
docuguru convert propuesta.md -t "Propuesta Técnica" -d "Enero 2025"
|
|
98
|
+
|
|
99
|
+
# Sin portada
|
|
100
|
+
docuguru convert documento.md --no-cover
|
|
101
|
+
|
|
102
|
+
# Especificar archivo de salida
|
|
103
|
+
docuguru convert documento.md -o salida/propuesta.pdf
|
|
104
|
+
|
|
105
|
+
# Con badge personalizado
|
|
106
|
+
docuguru convert documento.md -b "Informe Técnico"
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## Documentación de Bloques Personalizados
|
|
110
|
+
|
|
111
|
+
Para ver todos los bloques HTML personalizados disponibles y cómo usarlos:
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
# Mostrar en consola
|
|
115
|
+
docuguru blocks
|
|
116
|
+
|
|
117
|
+
# Guardar en archivo
|
|
118
|
+
docuguru blocks -o bloques-documentacion.md
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
## Componentes Personalizados Disponibles
|
|
122
|
+
|
|
123
|
+
### 1. Architecture Diagram
|
|
124
|
+
Diagrama de arquitectura centrado.
|
|
125
|
+
|
|
126
|
+
### 2. Info Card
|
|
127
|
+
Tarjeta informativa para fases o información destacada.
|
|
128
|
+
|
|
129
|
+
### 3. Timeline
|
|
130
|
+
Línea de tiempo vertical con items conectados.
|
|
131
|
+
|
|
132
|
+
### 4. Summary Cards
|
|
133
|
+
Tarjetas de resumen horizontales con valores destacados.
|
|
134
|
+
|
|
135
|
+
### 5. Support Packages
|
|
136
|
+
Tarjetas de paquetes de servicios lado a lado.
|
|
137
|
+
|
|
138
|
+
### 6. Styled List
|
|
139
|
+
Listas con checkmarks personalizados (✔).
|
|
140
|
+
|
|
141
|
+
### 7. Warranty Notice
|
|
142
|
+
Bloque de aviso o garantía destacado.
|
|
143
|
+
|
|
144
|
+
Para más detalles y ejemplos de uso, ejecuta `docuguru blocks`.
|
|
145
|
+
|
|
146
|
+
## Características de Markdown Soportadas
|
|
147
|
+
|
|
148
|
+
- **Títulos**: Todos los niveles (h1-h6)
|
|
149
|
+
- **Tablas**: Formato estándar de Markdown
|
|
150
|
+
- **Listas ordenadas**: Con numeración estilizada automática
|
|
151
|
+
- **Listas no ordenadas**: Con checkmarks personalizados
|
|
152
|
+
- **Código**: Bloques de código con syntax highlighting
|
|
153
|
+
- **HTML personalizado**: Componentes custom embebidos
|
|
154
|
+
|
|
155
|
+
## Estilos Predefinidos
|
|
156
|
+
|
|
157
|
+
El proyecto incluye un conjunto completo de estilos CSS predefinidos que incluyen:
|
|
158
|
+
|
|
159
|
+
- Paleta de colores profesional (azules y grises)
|
|
160
|
+
- Tipografía Inter (con múltiples pesos)
|
|
161
|
+
- Gradientes y sombras modernas
|
|
162
|
+
- Optimización para impresión (page-breaks, márgenes)
|
|
163
|
+
- Diseño responsive
|
|
164
|
+
|
|
165
|
+
## Estructura del Proyecto
|
|
166
|
+
|
|
167
|
+
```
|
|
168
|
+
docuguru/
|
|
169
|
+
├── src/
|
|
170
|
+
│ └── docuguru/
|
|
171
|
+
│ ├── __init__.py
|
|
172
|
+
│ ├── cli.py # Interfaz de línea de comandos
|
|
173
|
+
│ ├── markdon_to_html.py # Conversor Markdown a HTML
|
|
174
|
+
│ ├── html_to_pdf.py # Generador de PDF
|
|
175
|
+
│ └── default.py # Estilos CSS predefinidos
|
|
176
|
+
├── tests/ # Tests unitarios
|
|
177
|
+
├── playground/ # Archivos de ejemplo
|
|
178
|
+
├── pyproject.toml # Configuración del proyecto
|
|
179
|
+
└── README.md # Este archivo
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
## Desarrollo
|
|
183
|
+
|
|
184
|
+
### Ejecutar Tests
|
|
185
|
+
|
|
186
|
+
```bash
|
|
187
|
+
poetry run pytest
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
### Construir el Proyecto
|
|
191
|
+
|
|
192
|
+
```bash
|
|
193
|
+
poetry build
|
|
194
|
+
```
|
docuguru-0.1.0/README.md
ADDED
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
# DocuGuru
|
|
2
|
+
|
|
3
|
+
Herramienta profesional para convertir documentos Markdown a PDF con estilos predefinidos y componentes personalizados.
|
|
4
|
+
|
|
5
|
+
## Características
|
|
6
|
+
|
|
7
|
+
- ✅ Conversión de Markdown a PDF de alta calidad
|
|
8
|
+
- ✅ Página de portada automática con título, badge y fecha
|
|
9
|
+
- ✅ Tabla de contenidos generada automáticamente (H1, H2, H3)
|
|
10
|
+
- ✅ Soporte completo para títulos (h1-h6), tablas y listas
|
|
11
|
+
- ✅ Listas ordenadas con números estilizados en círculos
|
|
12
|
+
- ✅ Listas no ordenadas con checkmarks personalizados
|
|
13
|
+
- ✅ Componentes HTML personalizados (info-cards, timelines, summary-cards, etc.)
|
|
14
|
+
- ✅ Estilos profesionales predefinidos
|
|
15
|
+
- ✅ Optimizado para impresión en formato A4
|
|
16
|
+
|
|
17
|
+
## Instalación
|
|
18
|
+
|
|
19
|
+
### Requisitos
|
|
20
|
+
|
|
21
|
+
- Python >= 3.12
|
|
22
|
+
- Poetry (para gestión de dependencias)
|
|
23
|
+
|
|
24
|
+
### Instalación con Poetry
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
# Clonar el repositorio
|
|
28
|
+
git clone <repository-url>
|
|
29
|
+
cd docuguru
|
|
30
|
+
|
|
31
|
+
# Instalar dependencias
|
|
32
|
+
poetry install
|
|
33
|
+
|
|
34
|
+
# Activar el entorno virtual
|
|
35
|
+
poetry shell
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### Instalación del paquete
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
# Construir el paquete
|
|
42
|
+
poetry build
|
|
43
|
+
|
|
44
|
+
# Instalar desde el wheel generado
|
|
45
|
+
pip install dist/docuguru-0.1.0-py3-none-any.whl
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Uso
|
|
49
|
+
|
|
50
|
+
### Comando Básico
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
docuguru convert documento.md
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Esto generará un archivo `documento.pdf` en el mismo directorio.
|
|
57
|
+
|
|
58
|
+
### Opciones Disponibles
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
docuguru convert documento.md [OPCIONES]
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
**Opciones:**
|
|
65
|
+
|
|
66
|
+
- `-o, --output <archivo>`: Especifica la ruta del archivo PDF de salida
|
|
67
|
+
- `-t, --title <título>`: Define el título del documento (por defecto se extrae del primer H1)
|
|
68
|
+
- `--no-cover`: No incluir página de portada
|
|
69
|
+
- `-b, --badge <texto>`: Texto del badge en la portada (por defecto: "Propuesta técnica")
|
|
70
|
+
- `-d, --date <fecha>`: Fecha para la portada (ej: "Diciembre 2025", por defecto: fecha actual)
|
|
71
|
+
|
|
72
|
+
### Ejemplos
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
# Conversión básica
|
|
76
|
+
docuguru convert propuesta.md
|
|
77
|
+
|
|
78
|
+
# Con título personalizado y fecha
|
|
79
|
+
docuguru convert propuesta.md -t "Propuesta Técnica" -d "Enero 2025"
|
|
80
|
+
|
|
81
|
+
# Sin portada
|
|
82
|
+
docuguru convert documento.md --no-cover
|
|
83
|
+
|
|
84
|
+
# Especificar archivo de salida
|
|
85
|
+
docuguru convert documento.md -o salida/propuesta.pdf
|
|
86
|
+
|
|
87
|
+
# Con badge personalizado
|
|
88
|
+
docuguru convert documento.md -b "Informe Técnico"
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
## Documentación de Bloques Personalizados
|
|
92
|
+
|
|
93
|
+
Para ver todos los bloques HTML personalizados disponibles y cómo usarlos:
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
# Mostrar en consola
|
|
97
|
+
docuguru blocks
|
|
98
|
+
|
|
99
|
+
# Guardar en archivo
|
|
100
|
+
docuguru blocks -o bloques-documentacion.md
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
## Componentes Personalizados Disponibles
|
|
104
|
+
|
|
105
|
+
### 1. Architecture Diagram
|
|
106
|
+
Diagrama de arquitectura centrado.
|
|
107
|
+
|
|
108
|
+
### 2. Info Card
|
|
109
|
+
Tarjeta informativa para fases o información destacada.
|
|
110
|
+
|
|
111
|
+
### 3. Timeline
|
|
112
|
+
Línea de tiempo vertical con items conectados.
|
|
113
|
+
|
|
114
|
+
### 4. Summary Cards
|
|
115
|
+
Tarjetas de resumen horizontales con valores destacados.
|
|
116
|
+
|
|
117
|
+
### 5. Support Packages
|
|
118
|
+
Tarjetas de paquetes de servicios lado a lado.
|
|
119
|
+
|
|
120
|
+
### 6. Styled List
|
|
121
|
+
Listas con checkmarks personalizados (✔).
|
|
122
|
+
|
|
123
|
+
### 7. Warranty Notice
|
|
124
|
+
Bloque de aviso o garantía destacado.
|
|
125
|
+
|
|
126
|
+
Para más detalles y ejemplos de uso, ejecuta `docuguru blocks`.
|
|
127
|
+
|
|
128
|
+
## Características de Markdown Soportadas
|
|
129
|
+
|
|
130
|
+
- **Títulos**: Todos los niveles (h1-h6)
|
|
131
|
+
- **Tablas**: Formato estándar de Markdown
|
|
132
|
+
- **Listas ordenadas**: Con numeración estilizada automática
|
|
133
|
+
- **Listas no ordenadas**: Con checkmarks personalizados
|
|
134
|
+
- **Código**: Bloques de código con syntax highlighting
|
|
135
|
+
- **HTML personalizado**: Componentes custom embebidos
|
|
136
|
+
|
|
137
|
+
## Estilos Predefinidos
|
|
138
|
+
|
|
139
|
+
El proyecto incluye un conjunto completo de estilos CSS predefinidos que incluyen:
|
|
140
|
+
|
|
141
|
+
- Paleta de colores profesional (azules y grises)
|
|
142
|
+
- Tipografía Inter (con múltiples pesos)
|
|
143
|
+
- Gradientes y sombras modernas
|
|
144
|
+
- Optimización para impresión (page-breaks, márgenes)
|
|
145
|
+
- Diseño responsive
|
|
146
|
+
|
|
147
|
+
## Estructura del Proyecto
|
|
148
|
+
|
|
149
|
+
```
|
|
150
|
+
docuguru/
|
|
151
|
+
├── src/
|
|
152
|
+
│ └── docuguru/
|
|
153
|
+
│ ├── __init__.py
|
|
154
|
+
│ ├── cli.py # Interfaz de línea de comandos
|
|
155
|
+
│ ├── markdon_to_html.py # Conversor Markdown a HTML
|
|
156
|
+
│ ├── html_to_pdf.py # Generador de PDF
|
|
157
|
+
│ └── default.py # Estilos CSS predefinidos
|
|
158
|
+
├── tests/ # Tests unitarios
|
|
159
|
+
├── playground/ # Archivos de ejemplo
|
|
160
|
+
├── pyproject.toml # Configuración del proyecto
|
|
161
|
+
└── README.md # Este archivo
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
## Desarrollo
|
|
165
|
+
|
|
166
|
+
### Ejecutar Tests
|
|
167
|
+
|
|
168
|
+
```bash
|
|
169
|
+
poetry run pytest
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
### Construir el Proyecto
|
|
173
|
+
|
|
174
|
+
```bash
|
|
175
|
+
poetry build
|
|
176
|
+
```
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "docuguru"
|
|
3
|
+
version = "0.1.0"
|
|
4
|
+
description = ""
|
|
5
|
+
authors = [
|
|
6
|
+
{name = "Cristian Cubillos",email = "ccubillosreyes1@gmail.com"}
|
|
7
|
+
]
|
|
8
|
+
readme = "README.md"
|
|
9
|
+
requires-python = ">=3.12"
|
|
10
|
+
dependencies = [
|
|
11
|
+
"weasyprint (>=67.0,<68.0)",
|
|
12
|
+
"markdown (>=3.10,<4.0)",
|
|
13
|
+
"pygments (>=2.19.2,<3.0.0)",
|
|
14
|
+
"jinja2 (>=3.1.6,<4.0.0)",
|
|
15
|
+
"typer (>=0.21.0,<0.22.0)"
|
|
16
|
+
]
|
|
17
|
+
|
|
18
|
+
[tool.poetry]
|
|
19
|
+
packages = [{include = "docuguru", from = "src"}]
|
|
20
|
+
|
|
21
|
+
[tool.poetry.scripts]
|
|
22
|
+
docuguru = "docuguru.cli:app"
|
|
23
|
+
|
|
24
|
+
[build-system]
|
|
25
|
+
requires = ["poetry-core>=2.0.0,<3.0.0"]
|
|
26
|
+
build-backend = "poetry.core.masonry.api"
|
|
27
|
+
|
|
28
|
+
[dependency-groups]
|
|
29
|
+
dev = [
|
|
30
|
+
"pytest (>=9.0.2,<10.0.0)"
|
|
31
|
+
]
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
import os
|
|
2
|
+
from pathlib import Path
|
|
3
|
+
from typing import Annotated, Optional
|
|
4
|
+
|
|
5
|
+
from typer import Argument, Option, Typer
|
|
6
|
+
|
|
7
|
+
from docuguru.default import DEFAULT_CSS
|
|
8
|
+
from docuguru.html_to_pdf import HTMLToPDF
|
|
9
|
+
from docuguru.markdon_to_html import MarkdownToHTML
|
|
10
|
+
|
|
11
|
+
app = Typer(help="Herramienta para convertir documentos Markdown a PDF.")
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
@app.command(name="convert")
|
|
15
|
+
def convert(
|
|
16
|
+
markdown_file: str = Argument(help="Ruta al archivo Markdown a convertir."),
|
|
17
|
+
output: Optional[str] = Option(
|
|
18
|
+
None,
|
|
19
|
+
"--output",
|
|
20
|
+
"-o",
|
|
21
|
+
help="Ruta del archivo PDF de salida. Si no se especifica, se usa el nombre del archivo Markdown con extensión .pdf",
|
|
22
|
+
),
|
|
23
|
+
title: Optional[str] = Option(
|
|
24
|
+
None,
|
|
25
|
+
"--title",
|
|
26
|
+
"-t",
|
|
27
|
+
help="Título del documento. Si no se especifica, se extrae del primer h1 o se usa el nombre del archivo.",
|
|
28
|
+
),
|
|
29
|
+
no_cover: bool = Option(
|
|
30
|
+
False,
|
|
31
|
+
"--no-cover",
|
|
32
|
+
help="No incluir página de portada en el PDF.",
|
|
33
|
+
),
|
|
34
|
+
badge: Optional[str] = Option(
|
|
35
|
+
None,
|
|
36
|
+
"--badge",
|
|
37
|
+
"-b",
|
|
38
|
+
help="Texto del badge en la portada. Por defecto: 'Propuesta técnica'.",
|
|
39
|
+
),
|
|
40
|
+
date: Optional[str] = Option(
|
|
41
|
+
None,
|
|
42
|
+
"--date",
|
|
43
|
+
"-d",
|
|
44
|
+
help="Fecha para la portada (ej: 'Diciembre 2025'). Si no se especifica, se usa la fecha actual.",
|
|
45
|
+
),
|
|
46
|
+
):
|
|
47
|
+
"""
|
|
48
|
+
Convierte un archivo Markdown a PDF.
|
|
49
|
+
|
|
50
|
+
Soporta títulos (h1-h6), tablas y listas ordenadas/no ordenadas.
|
|
51
|
+
Genera un PDF con estilos predefinidos e incluye una página de portada por defecto.
|
|
52
|
+
"""
|
|
53
|
+
markdown_to_html = MarkdownToHTML()
|
|
54
|
+
body_html = markdown_to_html.convert_file(markdown_file)
|
|
55
|
+
|
|
56
|
+
if title is None:
|
|
57
|
+
title = _extract_title_from_html(body_html) or Path(markdown_file).stem
|
|
58
|
+
|
|
59
|
+
if output is None:
|
|
60
|
+
output = str(Path(markdown_file).with_suffix(".pdf"))
|
|
61
|
+
|
|
62
|
+
html_to_pdf = HTMLToPDF()
|
|
63
|
+
html_to_pdf.generate_pdf(
|
|
64
|
+
body_html,
|
|
65
|
+
title,
|
|
66
|
+
DEFAULT_CSS,
|
|
67
|
+
output,
|
|
68
|
+
include_cover=not no_cover,
|
|
69
|
+
cover_badge=badge if badge else "Propuesta técnica",
|
|
70
|
+
cover_date=date,
|
|
71
|
+
)
|
|
72
|
+
print(f"PDF generado exitosamente: {output}")
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
@app.command(name="blocks")
|
|
76
|
+
def list_blocks(
|
|
77
|
+
output_file: Optional[str] = Option(
|
|
78
|
+
None,
|
|
79
|
+
"--output",
|
|
80
|
+
"-o",
|
|
81
|
+
help="Archivo donde guardar la documentación de bloques. Si no se especifica, se imprime en stdout.",
|
|
82
|
+
),
|
|
83
|
+
):
|
|
84
|
+
"""
|
|
85
|
+
Muestra la documentación de todos los bloques HTML personalizados disponibles.
|
|
86
|
+
|
|
87
|
+
Lista todos los componentes custom con ejemplos de uso y explicación.
|
|
88
|
+
"""
|
|
89
|
+
blocks_doc = _generate_blocks_documentation()
|
|
90
|
+
|
|
91
|
+
if output_file:
|
|
92
|
+
with open(output_file, "w", encoding="utf-8") as f:
|
|
93
|
+
f.write(blocks_doc)
|
|
94
|
+
print(f"Documentación guardada en: {output_file}")
|
|
95
|
+
else:
|
|
96
|
+
print(blocks_doc)
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def _generate_blocks_documentation() -> str:
|
|
100
|
+
return """# Bloques HTML Personalizados Disponibles
|
|
101
|
+
|
|
102
|
+
## 1. Architecture Diagram
|
|
103
|
+
|
|
104
|
+
Muestra un diagrama de arquitectura centrado.
|
|
105
|
+
|
|
106
|
+
**Uso:**
|
|
107
|
+
```html
|
|
108
|
+
<div class="architecture-diagram">
|
|
109
|
+
<img src="ruta/imagen.png" alt="Descripción" />
|
|
110
|
+
</div>
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
## 2. Info Card
|
|
116
|
+
|
|
117
|
+
Tarjeta informativa con bordes y sombras, ideal para fases o información destacada.
|
|
118
|
+
|
|
119
|
+
**Uso:**
|
|
120
|
+
```html
|
|
121
|
+
<div class="info-card">
|
|
122
|
+
<h3>Título</h3>
|
|
123
|
+
<p><strong>Subtítulo en negrita</strong></p>
|
|
124
|
+
<p>Información adicional</p>
|
|
125
|
+
<p>Más detalles</p>
|
|
126
|
+
</div>
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
## 3. Timeline
|
|
132
|
+
|
|
133
|
+
Línea de tiempo vertical con items conectados.
|
|
134
|
+
|
|
135
|
+
**Uso:**
|
|
136
|
+
```html
|
|
137
|
+
<div class="timeline">
|
|
138
|
+
<div class="timeline-item">
|
|
139
|
+
<strong>Título del Hito</strong>
|
|
140
|
+
<p>Descripción del hito o fase</p>
|
|
141
|
+
</div>
|
|
142
|
+
<div class="timeline-item">
|
|
143
|
+
<strong>Siguiente Hito</strong>
|
|
144
|
+
<p>Otra descripción</p>
|
|
145
|
+
</div>
|
|
146
|
+
</div>
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
## 4. Summary Cards
|
|
152
|
+
|
|
153
|
+
Tarjetas de resumen horizontales con valores destacados.
|
|
154
|
+
|
|
155
|
+
**Uso:**
|
|
156
|
+
```html
|
|
157
|
+
<div class="summary-cards">
|
|
158
|
+
<div class="summary-card">
|
|
159
|
+
<h3>Categoría</h3>
|
|
160
|
+
<div class="value">$1.000.000</div>
|
|
161
|
+
<div class="label">periodo</div>
|
|
162
|
+
</div>
|
|
163
|
+
<div class="summary-card">
|
|
164
|
+
<h3>Otra Categoría</h3>
|
|
165
|
+
<div class="value">500</div>
|
|
166
|
+
<div class="label">unidades</div>
|
|
167
|
+
</div>
|
|
168
|
+
</div>
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
---
|
|
172
|
+
|
|
173
|
+
## 5. Support Packages
|
|
174
|
+
|
|
175
|
+
Tarjetas de paquetes de servicios lado a lado.
|
|
176
|
+
|
|
177
|
+
**Uso:**
|
|
178
|
+
```html
|
|
179
|
+
<div class="support-packages">
|
|
180
|
+
<div class="package-card">
|
|
181
|
+
<div class="package-header">
|
|
182
|
+
<h3 class="package-name">Básico</h3>
|
|
183
|
+
<div class="package-price">$500.000</div>
|
|
184
|
+
<div class="package-price-label">mensual</div>
|
|
185
|
+
</div>
|
|
186
|
+
<ul class="package-features">
|
|
187
|
+
<li class="no-style">Feature 1</li>
|
|
188
|
+
<li class="no-style">Feature 2</li>
|
|
189
|
+
</ul>
|
|
190
|
+
</div>
|
|
191
|
+
|
|
192
|
+
<div class="package-card featured">
|
|
193
|
+
<div class="package-header">
|
|
194
|
+
<span class="package-badge">Recomendado</span>
|
|
195
|
+
<h3 class="package-name">Premium</h3>
|
|
196
|
+
<div class="package-price">$1.200.000</div>
|
|
197
|
+
<div class="package-price-label">mensual</div>
|
|
198
|
+
</div>
|
|
199
|
+
<ul class="package-features">
|
|
200
|
+
<li class="no-style">Feature premium 1</li>
|
|
201
|
+
<li class="no-style">Feature premium 2</li>
|
|
202
|
+
</ul>
|
|
203
|
+
</div>
|
|
204
|
+
</div>
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
**Nota:** Usa `class="featured"` para destacar un paquete.
|
|
208
|
+
|
|
209
|
+
---
|
|
210
|
+
|
|
211
|
+
## 6. Styled List
|
|
212
|
+
|
|
213
|
+
Lista con checkmarks personalizados (✔).
|
|
214
|
+
|
|
215
|
+
**Uso:**
|
|
216
|
+
```html
|
|
217
|
+
<ul class="styled-list">
|
|
218
|
+
<li>Item 1 con checkmark</li>
|
|
219
|
+
<li>Item 2 con checkmark</li>
|
|
220
|
+
<li>Item 3 con checkmark</li>
|
|
221
|
+
</ul>
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
---
|
|
225
|
+
|
|
226
|
+
## 7. Warranty Notice
|
|
227
|
+
|
|
228
|
+
Bloque de aviso o garantía destacado con fondo azul claro.
|
|
229
|
+
|
|
230
|
+
**Uso:**
|
|
231
|
+
```html
|
|
232
|
+
<div class="warranty-notice">
|
|
233
|
+
<p><strong>Título del Aviso:</strong> Texto del aviso o garantía aquí.</p>
|
|
234
|
+
</div>
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
---
|
|
238
|
+
|
|
239
|
+
## Características Adicionales
|
|
240
|
+
|
|
241
|
+
### Listas Ordenadas Estilizadas
|
|
242
|
+
|
|
243
|
+
Las listas ordenadas (`<ol>`) se muestran con números en círculos azules automáticamente.
|
|
244
|
+
|
|
245
|
+
**Para desactivar el estilo:**
|
|
246
|
+
```html
|
|
247
|
+
<ol class="no-style">
|
|
248
|
+
<li>Item con numeración estándar</li>
|
|
249
|
+
<li>Otro item sin estilización</li>
|
|
250
|
+
</ol>
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
### Listas dentro de Package Features
|
|
254
|
+
|
|
255
|
+
Usa `class="no-style"` en cada `<li>` dentro de `package-features` para evitar los checkmarks:
|
|
256
|
+
|
|
257
|
+
```html
|
|
258
|
+
<ul class="package-features">
|
|
259
|
+
<li class="no-style">Sin checkmark</li>
|
|
260
|
+
</ul>
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
---
|
|
264
|
+
|
|
265
|
+
## Notas Importantes
|
|
266
|
+
|
|
267
|
+
1. Todos los bloques respetan `page-break-inside: avoid` para evitar cortes en medio del contenido.
|
|
268
|
+
2. Los colores utilizan variables CSS definidas en el tema (--primary, --accent, --accent-dark, etc.).
|
|
269
|
+
3. Los gradientes usan la paleta azul del tema (#7dd3fc, #3b82f6).
|
|
270
|
+
"""
|
|
271
|
+
|
|
272
|
+
|
|
273
|
+
def _extract_title_from_html(html: str) -> str:
|
|
274
|
+
import re
|
|
275
|
+
|
|
276
|
+
match = re.search(r"<h1[^>]*>(.*?)</h1>", html, re.IGNORECASE | re.DOTALL)
|
|
277
|
+
if match:
|
|
278
|
+
title_text = re.sub(r"<[^>]+>", "", match.group(1))
|
|
279
|
+
return title_text.strip()
|
|
280
|
+
return None
|