Skip to main content

Modern font organization tool for managing and curating font collections

Project description

Font Organizer: Modern Font Management Tool

Build & Test Release PyPI version

Font Organizer is a powerful Python-based tool for managing and organizing font collections. It provides intelligent font detection, automated organization, subsetting capabilities, and comprehensive analysis features to help you manage large font libraries efficiently.

🚀 Features

  • 🔍 Smart Font Detection: Automatically discover fonts across your system
  • 📁 Intelligent Organization: Sort and categorize fonts by various criteria (family, style, weight)
  • 🔤 Font Subsetting: Extract specific character sets for optimized web fonts
  • 📊 Analysis Tools: Examine font metrics, character coverage, and OpenType features
  • 🚀 High Performance: Efficient processing of large font collections with multi-threading support
  • 🔄 Duplicate Detection: Find and manage duplicate fonts by hash and metadata
  • 📈 Reporting: Generate detailed HTML/PDF reports about your font collection

📦 Installation

Using pip (Recommended)

pip install font-organizer

Using uv (Fast Alternative)

uv pip install font-organizer

From Source

git clone https://github.com/twardoch/font-organizer.git
cd font-organizer
pip install -e .

🎯 Quick Start

Basic Usage

# Scan a directory for fonts
font-organizer scan ~/Fonts

# Organize fonts by family
font-organizer organize ~/Fonts --by family --output ~/OrganizedFonts

# Get information about a specific font
font-organizer info ~/Fonts/Arial.ttf

# Find duplicate fonts
font-organizer duplicates ~/Fonts

# Create a subset with basic Latin characters
font-organizer subset input.ttf output.woff2 --text "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"

Command Overview

font-organizer --help

Available commands:

  • scan - Scan directories for font files
  • organize - Organize fonts using various criteria
  • analyze - Analyze font collections and generate reports
  • subset - Create font subsets with specific characters
  • duplicates - Find and manage duplicate fonts
  • info - Display detailed font information
  • config - Manage configuration settings

🔧 Configuration

Font Organizer can be configured using a YAML configuration file:

# ~/.font-organizer/config.yaml
organize:
  default_scheme: family  # family, style, weight, or custom
  copy_mode: true  # true for copy, false for move
  
scan:
  include_system_fonts: true
  recursive: true
  font_extensions:
    - .ttf
    - .otf
    - .woff
    - .woff2
    
subset:
  default_format: woff2
  optimize: true

📚 Advanced Usage

Organizing Fonts

# Organize by multiple criteria
font-organizer organize ~/Fonts --by family,weight --output ~/Organized

# Use custom organization rules
font-organizer organize ~/Fonts --rules my-rules.yaml --output ~/Organized

# Dry run to preview organization
font-organizer organize ~/Fonts --dry-run

Font Analysis

# Generate comprehensive analysis report
font-organizer analyze ~/Fonts --output report.html

# Export font list to CSV
font-organizer analyze ~/Fonts --format csv --output fonts.csv

# Check character coverage
font-organizer analyze ~/Fonts --coverage "Latin,Cyrillic"

Subsetting Fonts

# Create subset with Unicode ranges
font-organizer subset input.ttf output.woff2 --unicodes "U+0020-007F,U+00A0-00FF"

# Subset for specific language
font-organizer subset input.ttf output.woff2 --language en,es,fr

# Keep specific OpenType features
font-organizer subset input.ttf output.woff2 --features "kern,liga"

🐍 Python API

from font_organizer import FontOrganizer, FontInfo

# Initialize organizer
organizer = FontOrganizer()

# Scan for fonts
fonts = organizer.scan_directory("~/Fonts")

# Get font information
for font_path in fonts:
    info = FontInfo(font_path)
    print(f"{info.family} - {info.style} ({info.weight})")
    print(f"  Characters: {len(info.characters)}")
    print(f"  Features: {', '.join(info.features)}")

# Organize fonts
organizer.organize(
    source="~/Fonts",
    destination="~/OrganizedFonts",
    scheme="family"
)

# Find duplicates
duplicates = organizer.find_duplicates("~/Fonts")
for group in duplicates:
    print(f"Duplicate group ({len(group)} files):")
    for font in group:
        print(f"  - {font}")

🛠️ Development

Setting up Development Environment

# Clone the repository
git clone https://github.com/twardoch/font-organizer.git
cd font-organizer

# Install development dependencies
pip install -e ".[dev]"

# Install pre-commit hooks
pre-commit install

# Run tests
pytest

# Run linting
ruff check src tests
mypy src tests

Running Tests

# Run all tests
pytest

# Run with coverage
pytest --cov=font_organizer --cov-report=html

# Run specific test file
pytest tests/test_font_info.py

📖 Documentation

Full documentation is available at https://twardoch.github.io/font-organizer/

🤝 Contributing

Contributions are welcome! Please see our Contributing Guide for details.

  1. Fork the repository
  2. Create your feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

📄 License

This project is licensed under the MIT License - see the LICENSE file for details.

🙏 Acknowledgments

  • Built with fonttools for font manipulation
  • Uses rich for beautiful terminal output
  • Powered by fire for CLI interface

📬 Contact

Adam Twardoch - @adamtwar - adam+github@twardoch.com

Project Link: https://github.com/twardoch/font-organizer

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

twat_font-2.7.9.tar.gz (66.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

twat_font-2.7.9-py3-none-any.whl (19.9 kB view details)

Uploaded Python 3

File details

Details for the file twat_font-2.7.9.tar.gz.

File metadata

  • Download URL: twat_font-2.7.9.tar.gz
  • Upload date:
  • Size: 66.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.2 {"installer":{"name":"uv","version":"0.11.2","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for twat_font-2.7.9.tar.gz
Algorithm Hash digest
SHA256 ed04a4b2e8665a736e2a88e8eff26e54f731b97a08f53c0afe19a5ea62298422
MD5 4b8caedbb4a7bc6eb22894ea5f9a1969
BLAKE2b-256 b8bf8ab9cdec52736da92e1287c43b3a3c836239bb73877b6e48f0125741d963

See more details on using hashes here.

File details

Details for the file twat_font-2.7.9-py3-none-any.whl.

File metadata

  • Download URL: twat_font-2.7.9-py3-none-any.whl
  • Upload date:
  • Size: 19.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.2 {"installer":{"name":"uv","version":"0.11.2","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for twat_font-2.7.9-py3-none-any.whl
Algorithm Hash digest
SHA256 c5866110d1d57a9d9638a21f5e8c3f18aeb3c7c02f89b14ef7941c24a1f6e96b
MD5 75189ab26571e8861782db7b3dea0832
BLAKE2b-256 0de68332b67edbe28f51f040cbf2674574c3fe8032452de8e67f2caa8492451b

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page