From font-inspector
Automatically activates when user mentions font files (.ttf, .otf, .woff, .woff2) or requests font structure analysis. Optimized for CJK fonts with large character sets.
npx claudepluginhub joysusy/violet-plugin-place --plugin font-inspectorThis skill uses the workspace's default tool permissions.
This skill automatically activates when:
Guides Next.js Cache Components and Partial Prerendering (PPR) with cacheComponents enabled. Implements 'use cache', cacheLife(), cacheTag(), revalidateTag(), static/dynamic optimization, and cache debugging.
Migrates code, prompts, and API calls from Claude Sonnet 4.0/4.5 or Opus 4.1 to Opus 4.5, updating model strings on Anthropic, AWS, GCP, Azure platforms.
Performs token-optimized structural code search using tree-sitter AST parsing to discover symbols, outline files, and unfold code without reading full files.
This skill automatically activates when:
.ttf, .otf, .woff, .woff2)Extract comprehensive font information including:
Convert font glyphs to SVG format for visual analysis:
Convert fonts to UFO (Unified Font Object) format:
.glif files for each glyphThis plugin provides two implementation paths for maximum flexibility and performance:
Claude automatically chooses the optimal path based on:
Decision Tree:
ββ Font has > 10,000 glyphs? β Rust (speed critical)
ββ User needs UFO editing? β Python (better UFO support)
ββ File size > 10MB? β Rust (memory efficient)
ββ Batch processing? β Rust (parallel processing)
ββ Default β Rust (faster, same output format)
Both paths produce identical JSON output - Claude receives the same data structure regardless of implementation.
Python:
python $CLAUDE_PLUGIN_ROOT/scripts/font_info.py <font_path>
Rust (faster):
$CLAUDE_PLUGIN_ROOT/scripts/rust/target/release/font-inspector info --font <font_path>
Output: JSON with font metadata, character coverage, and design parameters
Example:
{
"family": "Noto Sans CJK SC",
"style": "Regular",
"upem": 1000,
"char_count": 65535,
"unicode_ranges": {
"Basic Latin": [32, 126],
"CJK Unified Ideographs": [19968, 40959]
}
}
Python Path (flexible):
# Full export (use with caution for CJK fonts)
python $CLAUDE_PLUGIN_ROOT/scripts/font_to_svg.py <font_path> --output ./svg_glyphs/
# CJK optimized: Export specific characters
python $CLAUDE_PLUGIN_ROOT/scripts/font_to_svg.py <font_path> --chars "δ½ ε₯½δΈηABC" --output ./svg_glyphs/
# CJK optimized: Export by Unicode range
python $CLAUDE_PLUGIN_ROOT/scripts/font_to_svg.py <font_path> --range 0x4E00-0x9FFF --limit 1000 --output ./svg_glyphs/
# Export common CJK characters only
python $CLAUDE_PLUGIN_ROOT/scripts/font_to_svg.py <font_path> --preset cjk-common --output ./svg_glyphs/
Rust Path (10x faster, recommended for CJK):
# Export specific characters (blazing fast)
$CLAUDE_PLUGIN_ROOT/scripts/rust/target/release/font-inspector extract \
--font <font_path> --chars "δ½ ε₯½δΈηABC" --output ./svg_glyphs/ --progress
# CJK common characters (parallel processing)
$CLAUDE_PLUGIN_ROOT/scripts/rust/target/release/font-inspector extract \
--font <font_path> --preset cjk-common --output ./svg_glyphs/ --progress --parallel
# Unicode range with limit
$CLAUDE_PLUGIN_ROOT/scripts/rust/target/release/font-inspector extract \
--font <font_path> --range 0x4E00-0x9FFF --limit 1000 --output ./svg_glyphs/
# JSON only (no files, for Claude analysis)
$CLAUDE_PLUGIN_ROOT/scripts/rust/target/release/font-inspector extract \
--font <font_path> --preset cjk-common --json-only
Output:
CJK Optimization Features:
--range: Specify Unicode range (e.g., 0x4E00-0x9FFF for CJK Unified Ideographs)--limit: Maximum number of characters to export--preset: Use predefined character sets (cjk-common, cjk-basic, latin-extended)--batch-size: Process in batches to manage memory (default: 500)Python Path (recommended for UFO):
python $CLAUDE_PLUGIN_ROOT/scripts/font_to_ufo.py <font_path> --output ./output.ufo
Rust Path (basic UFO support):
$CLAUDE_PLUGIN_ROOT/scripts/rust/target/release/font-inspector extract \
--font <font_path> --preset cjk-common --output ./svg_glyphs/ --ufo
Output: Standard UFO directory with editable .glif files
Note: Python path provides more complete UFO conversion. Rust path creates valid UFO structure but with simplified outline data.
| Font Type | Characters | Python | Rust (single) | Rust (parallel) |
|---|---|---|---|---|
| Latin Small | 256 | 0.5s | 0.05s | 0.03s |
| Latin Extended | 1,000 | 3s | 0.2s | 0.1s |
| CJK Medium | 5,000 | 15s | 1.2s | 0.4s |
| CJK Large | 20,000 | 60s | 5s | 1.5s |
| CJK Full | 65,000 | 180s | 12s | 3s |
Memory Usage:
Recommendation: Use Rust path for fonts > 10,000 characters or when processing multiple fonts.
Once SVG data is extracted, Claude can:
d attribute)User: "Analyze this font file: NotoSansCJK-Regular.otf"
Violet:
1. Extracts metadata β "Noto Sans CJK SC, 65535 characters"
2. Exports sample characters β "δ½ ε₯½δΈηABC"
3. Analyzes SVG paths β "Sans-serif design, uniform stroke width"
4. Reports coverage β "Full CJK Unified Ideographs support"
User: "Compare the character 'ζ°Έ' in these two fonts"
Violet:
1. Exports 'ζ°Έ' from both fonts as SVG
2. Analyzes path data for both
3. Compares stroke structure, proportions, style
4. Highlights differences visually
User: "Analyze the most common 1000 CJK characters in this font"
Violet:
1. Uses --preset cjk-common to export 1000 characters
2. Analyzes stroke consistency across characters
3. Identifies design patterns and variations
4. Reports on character coverage and quality
Claude receives direct access to SVG path data:
{
"A": {
"glyph_name": "A",
"unicode": "0x41",
"svg_path": "M 250 0 L 0 700 L 100 700 L 250 280 L 400 700 L 500 700 Z",
"bbox": {"xMin": 0, "yMin": 0, "xMax": 500, "yMax": 700},
"advance_width": 600
}
}
Path Commands:
M x y: Move toL x y: Line toC x1 y1 x2 y2 x y: Cubic BΓ©zier curveQ x1 y1 x y: Quadratic BΓ©zier curveZ: Close path--range or --limit for large fonts--batch-size to balance speed vs memoryFor exploration:
# Export a small sample first
python $CLAUDE_PLUGIN_ROOT/scripts/font_to_svg.py font.otf --chars "δ½ ε₯½δΈη" --output ./test/
For analysis:
# Use common character preset
python $CLAUDE_PLUGIN_ROOT/scripts/font_to_svg.py font.otf --preset cjk-common --output ./analysis/
For specific ranges:
# CJK Unified Ideographs Extension A
python $CLAUDE_PLUGIN_ROOT/scripts/font_to_svg.py font.otf --range 0x3400-0x4DBF --output ./ext_a/
Skill created by Violet π | Optimized for CJK fonts π