website-htmx-rustelo-code/scripts/download/download-highlight-css.js
2026-07-10 03:44:13 +01:00

103 lines
No EOL
3.4 KiB
JavaScript
Executable file

#!/usr/bin/env node
/**
* Download highlight.js CSS theme from CDN
* This downloads the GitHub Dark theme for syntax highlighting
*
* Usage:
* node scripts/download/download-highlight-css.js
*/
import fs from 'fs';
import path from 'path';
import https from 'https';
import { fileURLToPath } from 'url';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const CDN_URL = 'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/github-dark.min.css';
const OUTPUT_PATH = path.join(__dirname, '../../site/public/styles/highlight-github-dark.min.css');
function downloadFile(url, outputPath) {
return new Promise((resolve, reject) => {
https.get(url, (response) => {
if (response.statusCode !== 200) {
reject(new Error(`HTTP ${response.statusCode}: ${url}`));
return;
}
let data = '';
response.on('data', (chunk) => data += chunk);
response.on('end', () => {
// Ensure output directory exists
const outputDir = path.dirname(outputPath);
if (!fs.existsSync(outputDir)) {
fs.mkdirSync(outputDir, { recursive: true });
}
// Add header comment to the CSS
const cssWithHeader = `/*! Highlight.js GitHub Dark Theme
* Downloaded from: ${url}
* Generated on: ${new Date().toISOString()}
*/
${data}`;
fs.writeFileSync(outputPath, cssWithHeader);
resolve();
});
}).on('error', reject);
});
}
async function downloadHighlightCss() {
try {
// Check if file already exists and is recent
if (fs.existsSync(OUTPUT_PATH)) {
const stats = fs.statSync(OUTPUT_PATH);
const fileAge = Date.now() - stats.mtime.getTime();
const maxAge = 7 * 24 * 60 * 60 * 1000; // 7 days in milliseconds
if (fileAge < maxAge) {
const fileSizeBytes = stats.size;
const ageHours = Math.round(fileAge / (60 * 60 * 1000));
console.log('✅ Highlight.js CSS theme already exists and is recent!');
console.log(`📁 File: ${OUTPUT_PATH}`);
console.log(`📊 Size: ${fileSizeBytes} bytes`);
console.log(`⏰ Age: ${ageHours}h (created: ${stats.mtime.toLocaleString()})`);
console.log('💡 To force re-download, delete the file or wait 7 days');
return;
} else {
console.log('🔄 CSS theme exists but is older than 7 days, re-downloading...');
}
}
console.log('📥 Downloading highlight.js GitHub Dark theme...');
console.log(`🔗 URL: ${CDN_URL}`);
console.log(`📁 Output: ${OUTPUT_PATH}`);
await downloadFile(CDN_URL, OUTPUT_PATH);
const stats = fs.statSync(OUTPUT_PATH);
const fileSizeBytes = stats.size;
console.log('✅ Highlight.js CSS theme downloaded successfully!');
console.log(`📁 File: ${OUTPUT_PATH}`);
console.log(`📊 Size: ${fileSizeBytes} bytes`);
console.log('🎨 Theme: GitHub Dark (optimized for dark mode)');
console.log('');
console.log('🚀 Ready to use! This theme provides:');
console.log(' - Dark background suitable for dark mode UIs');
console.log(' - High contrast syntax highlighting');
console.log(' - GitHub-style color scheme');
console.log(' - Support for all highlight.js languages');
} catch (error) {
console.error('❌ Error downloading CSS theme:', error.message);
process.exit(1);
}
}
downloadHighlightCss();