1
0
moji/scpt/ai_moji_generator/font_generator.py
2025-06-06 03:53:38 +09:00

140 lines
4.7 KiB
Python

#!/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())