Конвертация шрифтов#

универсальный bash-скрипт, который принимает две папки: одна с .ttf, вторая для сохранения .woff2.#

Скрипт: convert-ttf-to-woff2.sh

#!/bin/bash

# Проверка аргументов
if [ $# -ne 2 ]; then
    echo "Использование: $0 /путь/к/ttf /путь/к/woff2"
    exit 1
fi

INPUT_DIR="$1"
OUTPUT_DIR="$2"

# Проверяем входную папку
if [ ! -d "$INPUT_DIR" ]; then
    echo "❌ Папка с TTF файлами не найдена: $INPUT_DIR"
    exit 1
fi

# Создаём выходную папку, если её нет
mkdir -p "$OUTPUT_DIR"

# Проверяем, установлена ли утилита woff2
if ! command -v woff2_compress &> /dev/null; then
    echo "❌ Утилита woff2_compress не найдена."
    echo "   Установи её:"
    echo "   brew install woff2   (macOS)"
    echo "   apt install woff2    (Linux)"
    exit 1
fi

# Конвертация
for font in "$INPUT_DIR"/*.ttf; do
    if [ -f "$font" ]; then
        filename=$(basename "$font" .ttf)
        echo "🔄 Конвертирую: $filename.ttf → $filename.woff2"
        woff2_compress "$font"
        mv "$INPUT_DIR/$filename.woff2" "$OUTPUT_DIR/$filename.woff2"
    fi
done

echo "✅ Готово! Все TTF сконвертированы в $OUTPUT_DIR"

🔧 Использование:

chmod +x convert-ttf-to-woff2.sh

Запуск:

./convert-ttf-to-woff2.sh ~/Downloads/ttf ~/Downloads/woff2

Python вариант без внешних бинарников, только fonttools + brotli.#

Установка зависимостей

python3 -m pip install --upgrade fonttools brotli

Скрипт: convert_ttf_to_woff2.py

#!/usr/bin/env python3
import argparse
import sys
from pathlib import Path

# Проверяем, что зависимости установлены
try:
    from fontTools.ttLib import TTFont
except ModuleNotFoundError:
    print("❌ Не найден пакет fonttools. Установи: pip install fonttools brotli")
    sys.exit(1)

# Проверяем наличие brotli (нужно для WOFF2)
try:
    import brotli  # noqa: F401
except ModuleNotFoundError:
    print("❌ Не найден пакет brotli. Установи: pip install brotli")
    sys.exit(1)


def convert_one(ttf_path: Path, out_dir: Path, overwrite: bool = False) -> bool:
    """Конвертирует один .ttf → .woff2. Возвращает True, если был создан файл."""
    out_path = out_dir / (ttf_path.stem + ".woff2")
    if out_path.exists() and not overwrite:
        print(f"⚠️  Пропуск: уже существует {out_path.name} (используй --overwrite для перезаписи)")
        return False

    try:
        # recalcTimestamp=False сохраняет исходный таймштамп head.modified
        with TTFont(str(ttf_path), recalcTimestamp=False) as font:
            font.flavor = "woff2"
            out_dir.mkdir(parents=True, exist_ok=True)
            font.save(str(out_path))
        print(f"✅ {ttf_path.name}{out_path.name}")
        return True
    except Exception as e:
        print(f"❌ Ошибка при конвертации {ttf_path.name}: {e}")
        return False


def main():
    parser = argparse.ArgumentParser(
        description="Конвертация всех .ttf из входной папки в .woff2 без внешних бинарников (fonttools+brotli)."
    )
    parser.add_argument("input_dir", help="Папка с .ttf файлами")
    parser.add_argument("output_dir", help="Папка, куда сохранить .woff2")
    parser.add_argument("--overwrite", action="store_true", help="Перезаписывать существующие .woff2")
    args = parser.parse_args()

    in_dir = Path(args.input_dir).expanduser().resolve()
    out_dir = Path(args.output_dir).expanduser().resolve()

    if not in_dir.is_dir():
        print(f"❌ Папка не найдена: {in_dir}")
        sys.exit(1)

    ttf_files = sorted(in_dir.glob("*.ttf"))
    if not ttf_files:
        print(f"ℹ️  В {in_dir} не найдено .ttf файлов")
        sys.exit(0)

    created = 0
    for ttf in ttf_files:
        if convert_one(ttf, out_dir, overwrite=args.overwrite):
            created += 1

    print(f"\nГотово. Сконвертировано: {created} из {len(ttf_files)}.")


if __name__ == "__main__":
    main()

Как использовать#

# 1) установить зависимости
python3 -m pip install --upgrade fonttools brotli

# 2) запустить конвертацию (нерекурсивно, как и раньше)
python3 convert_ttf_to_woff2.py ~/Downloads/ttf ~/Downloads/woff2

# при необходимости перезаписывать существующие файлы:
python3 convert_ttf_to_woff2.py ~/Downloads/ttf ~/Downloads/woff2 --overwrite