const fs = require('fs'); const path = require('path'); const he = require('he'); const DATA_DIR = path.join(__dirname, '..', 'data', 'wordpress'); const CONTENT_DIR = path.join(__dirname, '..', 'content'); const PAGES_DIR = path.join(CONTENT_DIR, 'pages'); function generateContent() { const posts = JSON.parse(fs.readFileSync(path.join(DATA_DIR, 'posts.json'), 'utf8')); const pages = JSON.parse(fs.readFileSync(path.join(DATA_DIR, 'pages.json'), 'utf8')); // Ensure content directories exist if (!fs.existsSync(CONTENT_DIR)) { fs.mkdirSync(CONTENT_DIR, { recursive: true }); } if (!fs.existsSync(PAGES_DIR)) { fs.mkdirSync(PAGES_DIR, { recursive: true }); } // Process posts posts.forEach(post => { const slug = post.slug; const date = new Date(post.date); const year = date.getFullYear(); const month = String(date.getMonth() + 1).padStart(2, '0'); // Get the primary category (first category in the list) const primaryCategory = post._embedded?.['wp:term']?.[0]?.[0]; const categorySlug = primaryCategory ? primaryCategory.slug : 'non-classe'; const contentDir = path.join(CONTENT_DIR, categorySlug, `${year}-${month}-${slug}`); // const contentDir = path.join(CONTENT_DIR, `${year}-${month}-${slug}`); if (!fs.existsSync(contentDir)) { fs.mkdirSync(contentDir, { recursive: true }); } const frontmatter = { title: he.decode(post.title.rendered), date: post.date, draft: post.status !== 'publish', slug: slug, wordpress_id: post.id, excerpt: he.decode(post.excerpt.rendered.replace(/<[^>]*>/g, '')), featured_image: post._embedded?.['wp:featuredmedia']?.[0]?.source_url || '', author: post._embedded?.author?.[0]?.name || 'Unknown', categories: (post._embedded?.['wp:term']?.[0] || []).map(cat => cat.name || 'Non classé'), tags: (post._embedded?.['wp:term']?.[1] || []).map(cat => cat.name || 'Non classé'), section: categorySlug }; // Decode HTML entities in the content and clean up HTML tags let contentHtml = he.decode(post.content.rendered); // Convert absolute URLs in a href to relative URLs contentHtml = contentHtml.replace(/]*href="([^"]+)"[^>]*>/g, (match, href) => { // Check if the href is an absolute URL (starts with http:// or https://) if (href.startsWith('http://') || href.startsWith('https://')) { // Extract the path part of the URL const url = new URL(href); // Return the modified a tag with relative URL return match.replace(href, url.pathname); } return match; }); contentHtml = contentHtml .replace(/

\s*<\/p>/g, '') // Remove empty paragraphs .replace(/<\/p>\s*

/g, '\n\n'); // Replace paragraph breaks with newlines const content = `--- ${Object.entries(frontmatter) .map(([key, value]) => `${key}: ${JSON.stringify(value)}`) .join('\n')} --- ${contentHtml.trim()}`; fs.writeFileSync(path.join(contentDir, 'index.md'), content); }); // Process pages pages.forEach(page => { const slug = page.slug; const contentDir = path.join(PAGES_DIR, slug); if (!fs.existsSync(contentDir)) { fs.mkdirSync(contentDir, { recursive: true }); } const frontmatter = { title: he.decode(page.title.rendered), slug: slug, type: "pages", layout: "single", wordpress_id: page.id, date: page.date, modified: page.modified, draft: page.status !== 'publish', aliases: [`/${slug}/`] }; // Decode HTML entities in the content and clean up HTML tags let contentHtml = he.decode(page.content.rendered); // Convert absolute URLs in a href to relative URLs contentHtml = contentHtml.replace(/]*href="([^"]+)"[^>]*>/g, (match, href) => { // Check if the href is an absolute URL (starts with http:// or https://) if (href.startsWith('http://') || href.startsWith('https://')) { // Extract the path part of the URL const url = new URL(href); // Return the modified a tag with relative URL return match.replace(href, url.pathname); } return match; }); contentHtml = contentHtml .replace(/

\s*<\/p>/g, '') // Remove empty paragraphs .replace(/<\/p>\s*

/g, '\n\n'); // Replace paragraph breaks with newlines const content = `--- ${Object.entries(frontmatter) .map(([key, value]) => `${key}: ${JSON.stringify(value)}`) .join('\n')} --- ${contentHtml.trim()}`; fs.writeFileSync(path.join(contentDir, 'index.md'), content); }); console.log(`✅ Generated ${posts.length} content files`); console.log(`✅ Generated ${pages.length} page files`); } generateContent();