75 lines
		
	
	
	
		
			2.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			75 lines
		
	
	
	
		
			2.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
#!/usr/bin/env node
 | 
						|
/*
 | 
						|
 Generates extension and toolbar PNG icons from the base SVG with transparent
 | 
						|
 background. Requires ImageMagick (`magick` or `convert`).
 | 
						|
 | 
						|
 The SVG defines its own stroke color (set directly in icons/file-search.svg).
 | 
						|
 To change colors, edit the SVG; the script does not inject or replace colors.
 | 
						|
 | 
						|
 Usage:
 | 
						|
   node scripts/build-icons.js
 | 
						|
*/
 | 
						|
const fs = require('fs');
 | 
						|
const path = require('path');
 | 
						|
const { spawnSync } = require('child_process');
 | 
						|
 | 
						|
const REPO_ROOT = path.join(__dirname, '..');
 | 
						|
const ICONS_DIR = path.join(REPO_ROOT, 'icons');
 | 
						|
const SRC_SVG = path.join(ICONS_DIR, 'file-search.svg');
 | 
						|
 | 
						|
const ADDON_SIZES = [48, 96, 128];
 | 
						|
const TOOLBAR_SIZES = [16, 32];
 | 
						|
 | 
						|
function ensureMagick() {
 | 
						|
  try {
 | 
						|
    let res = spawnSync('magick', ['-version'], { stdio: 'ignore' });
 | 
						|
    if (res && res.status === 0) return 'magick';
 | 
						|
    res = spawnSync('convert', ['-version'], { stdio: 'ignore' });
 | 
						|
    if (res && res.status === 0) return 'convert';
 | 
						|
  } catch (_) {}
 | 
						|
  return null;
 | 
						|
}
 | 
						|
 | 
						|
function readSvg() {
 | 
						|
  if (!fs.existsSync(SRC_SVG)) {
 | 
						|
    console.error(`Base SVG not found: ${path.relative(REPO_ROOT, SRC_SVG)}`);
 | 
						|
    process.exit(1);
 | 
						|
  }
 | 
						|
  return fs.readFileSync(SRC_SVG, 'utf8');
 | 
						|
}
 | 
						|
 | 
						|
function rasterize(magickBin, svgString, size, outPath) {
 | 
						|
  const args = ['-background', 'none', '-density', '384', 'svg:-', '-resize', `${size}x${size}`, outPath];
 | 
						|
  const proc = spawnSync(magickBin, args, { input: svgString, stdio: ['pipe', 'inherit', 'inherit'] });
 | 
						|
  if (proc.status !== 0) {
 | 
						|
    console.error(`Failed to generate ${outPath} using ${magickBin}.`);
 | 
						|
    process.exit(proc.status || 1);
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
function main() {
 | 
						|
  const magick = ensureMagick();
 | 
						|
  if (!magick) {
 | 
						|
    console.error('ImageMagick not found. Please install ImageMagick (magick or convert) and ensure SVG support is available.');
 | 
						|
    process.exit(1);
 | 
						|
  }
 | 
						|
  if (!fs.existsSync(ICONS_DIR)) fs.mkdirSync(ICONS_DIR, { recursive: true });
 | 
						|
 | 
						|
  const base = readSvg();
 | 
						|
 | 
						|
  // Add-on icons (use SVG colors as-is)
 | 
						|
  for (const s of ADDON_SIZES) {
 | 
						|
    const out = path.join(ICONS_DIR, `icon-${s}.png`);
 | 
						|
    rasterize(magick, base, s, out);
 | 
						|
    console.log(`Generated ${path.relative(REPO_ROOT, out)}`);
 | 
						|
  }
 | 
						|
 | 
						|
  // Toolbar icons (use SVG colors as-is)
 | 
						|
  for (const s of TOOLBAR_SIZES) {
 | 
						|
    const out = path.join(ICONS_DIR, `icon-${s}.png`);
 | 
						|
    rasterize(magick, base, s, out);
 | 
						|
    console.log(`Generated ${path.relative(REPO_ROOT, out)}`);
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
main();
 |