From aeb4fd621b9a37f51423e7b2f94fe7e53aebea28 Mon Sep 17 00:00:00 2001 From: Nico Verbruggen Date: Thu, 21 Aug 2025 16:04:00 +0200 Subject: [PATCH] Update README, skip OTF --- README.md | 29 +++++++++++++++++++++++------ kobofix.py | 51 ++++++++++++++++++++++++++++++++------------------- 2 files changed, 55 insertions(+), 25 deletions(-) diff --git a/README.md b/README.md index bc63242..d970556 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ -# KoboFix Font Processor +# Kobo Font Fix ## Overview -`kobofix.py` is a Python script designed to process TTF and OTF fonts for Kobo e-readers. +`kobofix.py` is a Python script designed to process TTF fonts for Kobo e-readers. It generates a renamed font, fixes PANOSE information based on the filename, adjusts the baseline with the `font-line` utility, and adds a legacy `kern` table which allows the `kepub` engine for improved rendering of kerned pairs. @@ -37,14 +37,31 @@ source ~/.zshrc ``` 3. The script will: - * Validate filenames. + * Validate the file names (must end with `-Regular`, `-Bold`, `-Italic` or `-BoldItalic` so they're valid for Kobo devices). * Process each font (e.g. "Lora" becomes "KF Lora"). * Apply kerning, rename, PANOSE adjustments, and baseline shift. * Save output as `KF_`. -Example: +### Generating KF fonts +This applies the KF prefix, applies 20 percent line spacing and adds a Kobo `kern` table. Ideal if you have an existing TrueType font and you want it on your Kobo device. The `--name` parameter is used to change the name of the font family. + + ```bash + ./kobofix.py --prefix KF --name="Fonty" --line-percent 20 *.ttf + ``` + +### Generating NV fonts + +Tight spacing, with a custom font family name, as is required via the OFL license: + +```bash +./kobofix.py --prefix NV --name="Fonty" --line-percent 20 --skip-kobo-kern *.ttf ``` -Original: Lora-BoldItalic.ttf -Processed: KF_Lora-BoldItalic.ttf + +Relaxed spacing, with a custom font family name, as is required via the OFL license: + +```bash +./kobofix.py --prefix NV --name="Fonty" --line-percent 50 --skip-kobo-kern *.ttf ``` + +You can play around with `--line-percent` to see what works for you. diff --git a/kobofix.py b/kobofix.py index f0bcc0a..58636ef 100755 --- a/kobofix.py +++ b/kobofix.py @@ -2,7 +2,7 @@ """ Font processing utility for Kobo e-readers. -This script processes TrueType/OpenType fonts to improve compatibility with +This script processes TrueType fonts to improve compatibility with Kobo e-readers by: - Adding a custom prefix to font names - Extracting GPOS kerning data and creating legacy 'kern' tables @@ -29,8 +29,10 @@ from fontTools.ttLib.tables._k_e_r_n import KernTable_format_0 # Constants DEFAULT_PREFIX = "KF" DEFAULT_LINE_PERCENT = 20 +DEFAULT_KOBO_KERN = True + VALID_SUFFIXES = ("-Regular", "-Bold", "-Italic", "-BoldItalic") -SUPPORTED_EXTENSIONS = (".ttf", ".otf") +SUPPORTED_EXTENSIONS = (".ttf") # Configure logging logging.basicConfig(level=logging.INFO, format='%(message)s') @@ -40,16 +42,18 @@ logger = logging.getLogger(__name__) class FontProcessor: """Main font processing class.""" - def __init__(self, prefix: str = DEFAULT_PREFIX, line_percent: int = DEFAULT_LINE_PERCENT): + def __init__(self, prefix: str = DEFAULT_PREFIX, line_percent: int = DEFAULT_LINE_PERCENT, kobo_kern_fix: bool = DEFAULT_KOBO_KERN): """ Initialize the font processor. Args: prefix: Prefix to add to font names line_percent: Percentage for baseline adjustment + kobo_kern_fix: Apply `kern` table fix for Kobo devices """ self.prefix = prefix self.line_percent = line_percent + self.kobo_kern_fix = kobo_kern_fix # ============================================================ # Kerning extraction methods @@ -417,7 +421,7 @@ class FontProcessor: # Main processing method # ============================================================ - def process_font(self, font_path: str, new_name: Optional[str] = None) -> bool: + def process_font(self, kern: bool, font_path: str, new_name: Optional[str] = None) -> bool: """ Process a single font file. @@ -445,17 +449,21 @@ class FontProcessor: # Fix PANOSE self.check_and_fix_panose(font, font_path) - - # Handle kerning - kern_pairs = self.extract_kern_pairs(font) - if kern_pairs: - written = self.add_legacy_kern(font, kern_pairs) - logger.info( - f" Kerning: extracted {len(kern_pairs)} pairs; " - f"wrote {written} to legacy 'kern' table" - ) + + if kern: + # Handle kerning + kern_pairs = self.extract_kern_pairs(font) + if kern_pairs: + written = self.add_legacy_kern(font, kern_pairs) + logger.info( + f" Kerning: extracted {len(kern_pairs)} pairs; " + f"wrote {written} to legacy 'kern' table" + ) + else: + logger.info(" Kerning: no GPOS kerning found") else: - logger.info(" Kerning: no GPOS kerning found") + # Skip kerning step + logger.info(" Skipping `kern` step") # Generate output filename output_path = self._generate_output_path(font_path, new_name) @@ -538,16 +546,15 @@ def main(): formatter_class=argparse.RawDescriptionHelpFormatter, epilog=""" Examples: - %(prog)s font-Regular.ttf font-Bold.ttf - %(prog)s --name "My Font" *.ttf - %(prog)s --prefix KOBO --line-percent 25 font.ttf + %(prog)s --name="Fonty" --line-percent 20 *.ttf + %(prog)s --prefix NV --name="Fonty" --line-percent 20 --skip-kobo-kern *.ttf """ ) parser.add_argument( "fonts", nargs="+", - help="Font files to process (*.ttf, *.otf)" + help="Font files to process (*.ttf)" ) parser.add_argument( "--name", @@ -566,6 +573,11 @@ Examples: default=DEFAULT_LINE_PERCENT, help=f"Line spacing adjustment percentage (default: {DEFAULT_LINE_PERCENT})" ) + parser.add_argument( + "--skip-kobo-kern", + action="store_true", + help="Skip the creation of the legacy 'kern' table from GPOS data." + ) parser.add_argument( "--verbose", action="store_true", @@ -601,12 +613,13 @@ Examples: # Process fonts processor = FontProcessor( prefix=args.prefix, - line_percent=args.line_percent + line_percent=args.line_percent, ) success_count = 0 for font_path in valid_files: if processor.process_font( + not args.skip_kobo_kern, font_path, args.name, ):