| |
| """ |
| Convert font_demo_cache.bin (from YuzuMarker.FontDetection) to a JSON list that Rust can read. |
| |
| Usage: |
| python scripts/convert_font_labels.py \ |
| --input font_demo_cache.bin \ |
| --output yuzumarker-font-labels.json |
| """ |
|
|
| import argparse |
| import json |
| import sys |
| import types |
| from pathlib import Path |
|
|
|
|
| def parse_args(): |
| parser = argparse.ArgumentParser(description="Convert font_demo_cache.bin to JSON") |
| parser.add_argument( |
| "-i", |
| "--input", |
| type=Path, |
| default=Path("font_demo_cache.bin"), |
| help="Input pickle file (font_demo_cache.bin from the original repo)", |
| ) |
| parser.add_argument( |
| "-o", |
| "--output", |
| type=Path, |
| default=Path("yuzumarker-font-labels.json"), |
| help="Output JSON path (default: yuzumarker-font-labels.json)", |
| ) |
| return parser.parse_args() |
|
|
|
|
| def main(): |
| args = parse_args() |
| if not args.input.exists(): |
| sys.exit(f"Input file not found: {args.input}") |
|
|
| |
| font_dataset_mod = types.ModuleType("font_dataset") |
| font_mod = types.ModuleType("font_dataset.font") |
|
|
| class DSFont: |
| def __init__(self, path=None, language=None): |
| self.path = path |
| self.language = language |
|
|
| font_mod.DSFont = DSFont |
| sys.modules["font_dataset"] = font_dataset_mod |
| sys.modules["font_dataset.font"] = font_mod |
| font_dataset_mod.font = font_mod |
|
|
| import pickle |
|
|
| with open(args.input, "rb") as f: |
| data = pickle.load(f) |
|
|
| entries = [] |
| for item in data: |
| path = getattr(item, "path", None) |
| language = getattr(item, "language", None) |
| if path is None: |
| continue |
| entries.append({"path": path, "language": language}) |
|
|
| args.output.parent.mkdir(parents=True, exist_ok=True) |
| with open(args.output, "w", encoding="utf-8") as f: |
| json.dump(entries, f, ensure_ascii=False, indent=2) |
|
|
| print(f"Wrote {len(entries)} labels to {args.output}") |
|
|
|
|
| if __name__ == "__main__": |
| main() |
|
|