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.7.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.7-py3-none-any.whl (19.9 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: twat_font-2.7.7.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.7.tar.gz
Algorithm Hash digest
SHA256 ed33618eefd1372c64febb2433e5195d32d573f1d68a7cd260a9a6406801d3c0
MD5 71246957d618a8e904ef882185b28b03
BLAKE2b-256 fa29db1f2064703ff3187c356d7af7f5458ba167ed41ed8505d49f14b39c79a0

See more details on using hashes here.

File details

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

File metadata

  • Download URL: twat_font-2.7.7-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.7-py3-none-any.whl
Algorithm Hash digest
SHA256 6d41491f93a4b724ea425d51e04a6e587cbfef71021992e434f8b98cae89d2ca
MD5 63277c2e899cf8ee0e550804c8fcd5a8
BLAKE2b-256 ad951b3c8bac4a0f32e3064075b245f72aa593855ed8c91d7a26b46346139470

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