Конвертация шрифтов#
универсальный 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