@edtools/cli 0.3.0 → 0.3.2

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.
@@ -1,8 +1,6 @@
1
1
  import { Adapter, BlogPostContent } from '../../types/index.js';
2
2
  export declare class HTMLAdapter implements Adapter {
3
3
  name: string;
4
- private templatePath;
5
- constructor();
6
4
  detect(projectPath: string): Promise<boolean>;
7
5
  render(content: BlogPostContent): Promise<string>;
8
6
  write(output: string, outputPath: string): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/adapters/html/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEhE,qBAAa,WAAY,YAAW,OAAO;IACzC,IAAI,SAAU;IACd,OAAO,CAAC,YAAY,CAAS;;IAOvB,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAe7C,MAAM,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC;IA2BjD,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ9D,gBAAgB,IAAI,MAAM;IAI1B,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;YAWzB,cAAc;YAOd,oBAAoB;IAsBlC,OAAO,CAAC,qBAAqB;IAiC7B,OAAO,CAAC,UAAU;IAyBlB,OAAO,CAAC,UAAU;IAoBlB,OAAO,CAAC,UAAU;CAUnB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/adapters/html/index.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAKhE,qBAAa,WAAY,YAAW,OAAO;IACzC,IAAI,SAAU;IAER,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAe7C,MAAM,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC;IAmCjD,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ9D,gBAAgB,IAAI,MAAM;IAI1B,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;YAWzB,cAAc;YAOd,oBAAoB;IAsBlC,OAAO,CAAC,qBAAqB;IAiC7B,OAAO,CAAC,UAAU;IAyBlB,OAAO,CAAC,UAAU;IAoBlB,OAAO,CAAC,UAAU;CAUnB"}
@@ -1,13 +1,12 @@
1
1
  import fs from 'fs-extra';
2
2
  import path from 'path';
3
+ import { fileURLToPath } from 'url';
3
4
  import ejs from 'ejs';
4
5
  import { marked } from 'marked';
6
+ const __filename = fileURLToPath(import.meta.url);
7
+ const __dirname = path.dirname(__filename);
5
8
  export class HTMLAdapter {
6
9
  name = 'html';
7
- templatePath;
8
- constructor() {
9
- this.templatePath = path.join(__dirname, 'templates', 'blog-post.html.ejs');
10
- }
11
10
  async detect(projectPath) {
12
11
  try {
13
12
  const files = await fs.readdir(projectPath);
@@ -20,7 +19,11 @@ export class HTMLAdapter {
20
19
  }
21
20
  }
22
21
  async render(content) {
23
- const template = await fs.readFile(this.templatePath, 'utf-8');
22
+ const templatePath = path.join(__dirname, 'templates', 'blog-post.html.ejs');
23
+ if (!await fs.pathExists(templatePath)) {
24
+ throw new Error(`Template not found at: ${templatePath}`);
25
+ }
26
+ const template = await fs.readFile(templatePath, 'utf-8');
24
27
  const templateData = {
25
28
  metadata: content.metadata,
26
29
  schemaOrg: JSON.stringify(content.schemaOrg, null, 2),
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/adapters/html/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/adapters/html/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,305 @@
1
+ <!DOCTYPE html>
2
+ <html lang="es">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title><%= metadata.title %></title>
7
+ <meta name="description" content="<%= metadata.description %>">
8
+ <meta name="keywords" content="<%= metadata.keywords.join(', ') %>">
9
+ <meta name="author" content="<%= metadata.author %>">
10
+ <meta name="date" content="<%= metadata.datePublished %>">
11
+
12
+ <!-- Open Graph / Social Media -->
13
+ <meta property="og:type" content="article">
14
+ <meta property="og:title" content="<%= metadata.title %>">
15
+ <meta property="og:description" content="<%= metadata.description %>">
16
+ <meta property="article:published_time" content="<%= metadata.datePublished %>">
17
+ <meta property="article:author" content="<%= metadata.author %>">
18
+ <meta property="article:section" content="<%= metadata.category %>">
19
+ <% metadata.keywords.forEach(keyword => { %>
20
+ <meta property="article:tag" content="<%= keyword %>">
21
+ <% }) %>
22
+
23
+ <!-- Schema.org structured data -->
24
+ <script type="application/ld+json">
25
+ <%- schemaOrg %>
26
+ </script>
27
+
28
+ <style>
29
+ :root {
30
+ --primary-color: #2563eb;
31
+ --text-color: #1f2937;
32
+ --text-light: #6b7280;
33
+ --border-color: #e5e7eb;
34
+ --bg-light: #f9fafb;
35
+ }
36
+
37
+ * {
38
+ margin: 0;
39
+ padding: 0;
40
+ box-sizing: border-box;
41
+ }
42
+
43
+ body {
44
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
45
+ line-height: 1.6;
46
+ color: var(--text-color);
47
+ max-width: 800px;
48
+ margin: 0 auto;
49
+ padding: 2rem 1rem;
50
+ }
51
+
52
+ article {
53
+ background: white;
54
+ }
55
+
56
+ h1 {
57
+ font-size: 2.5rem;
58
+ font-weight: 700;
59
+ line-height: 1.2;
60
+ margin-bottom: 1rem;
61
+ color: var(--text-color);
62
+ }
63
+
64
+ h2 {
65
+ font-size: 1.875rem;
66
+ font-weight: 600;
67
+ margin-top: 2.5rem;
68
+ margin-bottom: 1rem;
69
+ color: var(--text-color);
70
+ }
71
+
72
+ h3 {
73
+ font-size: 1.5rem;
74
+ font-weight: 600;
75
+ margin-top: 2rem;
76
+ margin-bottom: 0.75rem;
77
+ color: var(--text-color);
78
+ }
79
+
80
+ h4 {
81
+ font-size: 1.25rem;
82
+ font-weight: 600;
83
+ margin-top: 1.5rem;
84
+ margin-bottom: 0.5rem;
85
+ color: var(--text-color);
86
+ }
87
+
88
+ p {
89
+ margin-bottom: 1rem;
90
+ color: var(--text-color);
91
+ }
92
+
93
+ a {
94
+ color: var(--primary-color);
95
+ text-decoration: none;
96
+ }
97
+
98
+ a:hover {
99
+ text-decoration: underline;
100
+ }
101
+
102
+ .intro {
103
+ font-size: 1.125rem;
104
+ color: var(--text-light);
105
+ margin-bottom: 2rem;
106
+ padding-bottom: 2rem;
107
+ border-bottom: 1px solid var(--border-color);
108
+ }
109
+
110
+ section {
111
+ margin-bottom: 2.5rem;
112
+ }
113
+
114
+ .comparison-table {
115
+ width: 100%;
116
+ border-collapse: collapse;
117
+ margin: 1.5rem 0;
118
+ font-size: 0.9375rem;
119
+ }
120
+
121
+ .comparison-table thead {
122
+ background: var(--bg-light);
123
+ }
124
+
125
+ .comparison-table th,
126
+ .comparison-table td {
127
+ padding: 0.75rem 1rem;
128
+ text-align: left;
129
+ border: 1px solid var(--border-color);
130
+ }
131
+
132
+ .comparison-table th {
133
+ font-weight: 600;
134
+ color: var(--text-color);
135
+ }
136
+
137
+ .comparison-table tbody tr:hover {
138
+ background: var(--bg-light);
139
+ }
140
+
141
+ .content-list {
142
+ margin: 1.5rem 0;
143
+ padding-left: 1.5rem;
144
+ }
145
+
146
+ .content-list li {
147
+ margin-bottom: 1rem;
148
+ }
149
+
150
+ .content-list strong {
151
+ color: var(--text-color);
152
+ display: block;
153
+ margin-bottom: 0.25rem;
154
+ }
155
+
156
+ .code-block {
157
+ margin: 1.5rem 0;
158
+ background: var(--bg-light);
159
+ border: 1px solid var(--border-color);
160
+ border-radius: 0.375rem;
161
+ overflow: hidden;
162
+ }
163
+
164
+ .code-caption {
165
+ padding: 0.5rem 1rem;
166
+ background: #e5e7eb;
167
+ font-size: 0.875rem;
168
+ font-weight: 600;
169
+ border-bottom: 1px solid var(--border-color);
170
+ }
171
+
172
+ .code-block pre {
173
+ padding: 1rem;
174
+ overflow-x: auto;
175
+ }
176
+
177
+ .code-block code {
178
+ font-family: 'Monaco', 'Courier New', monospace;
179
+ font-size: 0.875rem;
180
+ line-height: 1.5;
181
+ }
182
+
183
+ .conclusion {
184
+ margin-top: 3rem;
185
+ padding-top: 2rem;
186
+ border-top: 1px solid var(--border-color);
187
+ }
188
+
189
+ .cta {
190
+ margin-top: 3rem;
191
+ padding: 2rem;
192
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
193
+ border-radius: 0.5rem;
194
+ text-align: center;
195
+ }
196
+
197
+ .cta a {
198
+ display: inline-block;
199
+ padding: 1rem 2rem;
200
+ background: white;
201
+ color: var(--primary-color);
202
+ font-weight: 600;
203
+ font-size: 1.125rem;
204
+ border-radius: 0.375rem;
205
+ transition: transform 0.2s;
206
+ }
207
+
208
+ .cta a:hover {
209
+ transform: translateY(-2px);
210
+ text-decoration: none;
211
+ box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1);
212
+ }
213
+
214
+ .related-posts {
215
+ margin-top: 4rem;
216
+ padding-top: 2rem;
217
+ border-top: 2px solid var(--border-color);
218
+ }
219
+
220
+ .related-posts h3 {
221
+ margin-top: 0;
222
+ margin-bottom: 1.5rem;
223
+ }
224
+
225
+ .related-posts ul {
226
+ list-style: none;
227
+ padding: 0;
228
+ }
229
+
230
+ .related-posts li {
231
+ margin-bottom: 0.75rem;
232
+ }
233
+
234
+ .related-posts a {
235
+ font-weight: 500;
236
+ }
237
+
238
+ .seo-badge {
239
+ display: inline-block;
240
+ padding: 0.25rem 0.75rem;
241
+ background: <%= seoScore >= 80 ? '#10b981' : seoScore >= 60 ? '#f59e0b' : '#ef4444' %>;
242
+ color: white;
243
+ border-radius: 9999px;
244
+ font-size: 0.875rem;
245
+ font-weight: 600;
246
+ margin-bottom: 1rem;
247
+ }
248
+ </style>
249
+ </head>
250
+ <body>
251
+ <article>
252
+ <!-- SEO Badge (hidden by default, can be shown in preview mode) -->
253
+ <!-- <div class="seo-badge">SEO Score: <%= seoScore %>/100</div> -->
254
+
255
+ <h1><%= metadata.title %></h1>
256
+
257
+ <div class="intro">
258
+ <%- intro %>
259
+ </div>
260
+
261
+ <% sections.forEach(section => { %>
262
+ <section>
263
+ <h<%= section.level %>><%= section.heading %></h<%= section.level %>>
264
+ <%- section.content %>
265
+ </section>
266
+ <% }) %>
267
+
268
+ <div class="conclusion">
269
+ <%- conclusion %>
270
+ </div>
271
+
272
+ <div class="cta">
273
+ <a href="<%= cta.url %>"><%= cta.text %></a>
274
+ </div>
275
+
276
+ <% if (relatedPosts && relatedPosts.length > 0) { %>
277
+ <div class="related-posts">
278
+ <h3>Artículos relacionados</h3>
279
+ <ul>
280
+ <% relatedPosts.forEach(post => { %>
281
+ <li>
282
+ <a href="<%= post.url %>"><%= post.title %></a>
283
+ <% if (post.excerpt) { %>
284
+ <p style="color: var(--text-light); font-size: 0.875rem; margin-top: 0.25rem;">
285
+ <%= post.excerpt %>
286
+ </p>
287
+ <% } %>
288
+ </li>
289
+ <% }) %>
290
+ </ul>
291
+ </div>
292
+ <% } %>
293
+ </article>
294
+
295
+ <!-- AI-friendly metadata in comments for LLM parsing -->
296
+ <!--
297
+ METADATA:
298
+ - Title: <%= metadata.title %>
299
+ - Category: <%= metadata.category %>
300
+ - Keywords: <%= metadata.keywords.join(', ') %>
301
+ - Published: <%= metadata.datePublished %>
302
+ - SEO Score: <%= seoScore %>/100
303
+ -->
304
+ </body>
305
+ </html>