#!/usr/bin/env python3 """ AI Moji Font Generator SVGファイルからWebフォントを自動生成するツール """ import os import json import subprocess from pathlib import Path from typing import Dict, List, Optional import fontforge import configparser class AIMojiFontGenerator: def __init__(self, svg_dir: str = "../../svg", output_dir: str = "../../dist"): self.svg_dir = Path(svg_dir) self.output_dir = Path(output_dir) self.fonts_dir = self.output_dir / "fonts" self.metadata_file = self.output_dir / "metadata.json" # ディレクトリ作成 self.fonts_dir.mkdir(parents=True, exist_ok=True) # Unicode範囲設定 (Private Use Area) self.unicode_start = 0xE900 def scan_svg_files(self) -> List[Dict[str, str]]: """SVGファイルをスキャンしてメタデータを生成""" svg_files = [] unicode_point = self.unicode_start for svg_file in sorted(self.svg_dir.glob("*.svg")): name = svg_file.stem svg_files.append({ "name": name, "file": str(svg_file), "unicode": hex(unicode_point), "unicode_decimal": unicode_point, "css_class": f"aimoji-{name}" }) unicode_point += 1 return svg_files def create_font(self, svg_metadata: List[Dict], font_name: str = "aimoji") -> str: """SVGからフォントファイルを生成""" # FontForgeでフォント作成 font = fontforge.font() font.fontname = font_name font.familyname = "AI Moji" font.fullname = "AI Moji Icons" font.version = "1.0.0" font.encoding = "UnicodeFull" # 各SVGをフォントに追加 for icon in svg_metadata: glyph = font.createChar(icon["unicode_decimal"]) glyph.importOutlines(icon["file"]) # グリフのサイズ調整 glyph.transform(fontforge.identity.scale(1024/glyph.boundingBox()[2])) glyph.width = 1024 # フォントファイル生成 font_base = self.fonts_dir / font_name # 複数フォーマットで出力 font.generate(f"{font_base}.ttf") font.generate(f"{font_base}.woff") font.generate(f"{font_base}.woff2") font.generate(f"{font_base}.eot") font.generate(f"{font_base}.svg") font.close() return str(font_base) def save_metadata(self, svg_metadata: List[Dict], font_path: str): """メタデータをJSONファイルに保存""" metadata = { "name": "AI Moji", "version": "1.0.0", "font_family": "aimoji", "font_path": font_path, "total_icons": len(svg_metadata), "icons": svg_metadata, "css_prefix": "aimoji", "build_info": { "generator": "AI Moji Font Generator", "unicode_range": f"{hex(self.unicode_start)}-{hex(self.unicode_start + len(svg_metadata) - 1)}" } } with open(self.metadata_file, 'w', encoding='utf-8') as f: json.dump(metadata, f, indent=2, ensure_ascii=False) print(f"✅ メタデータを保存: {self.metadata_file}") def generate(self) -> Dict: """フォント生成のメイン処理""" print("🚀 AI Moji フォント生成開始...") # SVGファイルスキャン print("📂 SVGファイルをスキャン中...") svg_metadata = self.scan_svg_files() print(f"📁 {len(svg_metadata)} 個のSVGファイルを発見") # フォント生成 print("🔤 フォントファイル生成中...") font_path = self.create_font(svg_metadata) print(f"✅ フォント生成完了: {font_path}") # メタデータ保存 self.save_metadata(svg_metadata, font_path) return { "success": True, "font_path": font_path, "metadata": svg_metadata, "total_icons": len(svg_metadata) } def main(): """メイン実行関数""" try: generator = AIMojiFontGenerator() result = generator.generate() print("\n🎉 AI Moji フォント生成完了!") print(f"📊 総アイコン数: {result['total_icons']}") print(f"📁 出力ディレクトリ: {generator.fonts_dir}") except Exception as e: print(f"❌ エラーが発生しました: {e}") return 1 return 0 if __name__ == "__main__": exit(main())