140 lines
4.7 KiB
Python
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()) |