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.
@@ -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
+ ```
@@ -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,4 @@
1
+ from docuguru.cli import app
2
+
3
+ if __name__ == "__main__":
4
+ app()
@@ -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