mirror of
https://github.com/nicoverbruggen/kobo-font-fix.git
synced 2026-02-04 11:50:09 +01:00
Allow omitting prefix
This commit is contained in:
65
kobofix.py
65
kobofix.py
@@ -210,8 +210,13 @@ class FontProcessor:
|
|||||||
full_name = f"{family_name}"
|
full_name = f"{family_name}"
|
||||||
if style_name != "Regular":
|
if style_name != "Regular":
|
||||||
full_name += f" {style_name}"
|
full_name += f" {style_name}"
|
||||||
|
|
||||||
ps_name = f"{self.prefix}_{family_name.replace(' ', '-')}"
|
# If prefix is empty, don't add it to the PS name
|
||||||
|
if self.prefix:
|
||||||
|
ps_name = f"{self.prefix}_{family_name.replace(' ', '-')}"
|
||||||
|
else:
|
||||||
|
ps_name = family_name.replace(' ', '-')
|
||||||
|
|
||||||
if style_name != "Regular":
|
if style_name != "Regular":
|
||||||
ps_name += f"-{style_name.replace(' ', '')}"
|
ps_name += f"-{style_name.replace(' ', '')}"
|
||||||
|
|
||||||
@@ -399,34 +404,44 @@ class FontProcessor:
|
|||||||
if "name" not in font:
|
if "name" not in font:
|
||||||
logger.warning(" No 'name' table found; skipping all name changes")
|
logger.warning(" No 'name' table found; skipping all name changes")
|
||||||
return
|
return
|
||||||
else:
|
|
||||||
|
if self.prefix:
|
||||||
logger.info(" Renaming the font to: " + f"{self.prefix} {metadata.full_name}")
|
logger.info(" Renaming the font to: " + f"{self.prefix} {metadata.full_name}")
|
||||||
|
adjusted_family_name = f"{self.prefix} {metadata.family_name}"
|
||||||
|
adjusted_full_name = f"{self.prefix} {metadata.full_name}"
|
||||||
|
else:
|
||||||
|
logger.info(" Updating font metadata (no prefix)")
|
||||||
|
adjusted_family_name = metadata.family_name
|
||||||
|
adjusted_full_name = metadata.full_name
|
||||||
|
|
||||||
# Update Family Name
|
# Update Family Name
|
||||||
self._set_name_records(font, 1, f"{self.prefix} {metadata.family_name}")
|
self._set_name_records(font, 1, adjusted_family_name)
|
||||||
# Update Subfamily
|
# Update Subfamily
|
||||||
self._set_name_records(font, 2, metadata.style_name)
|
self._set_name_records(font, 2, metadata.style_name)
|
||||||
# Update Full Name
|
# Update Full Name
|
||||||
self._set_name_records(font, 4, f"{self.prefix} {metadata.full_name}")
|
self._set_name_records(font, 4, adjusted_full_name)
|
||||||
|
|
||||||
# Update Typographic Family
|
# Update Typographic Family
|
||||||
self._set_name_records(font, 16, f"{self.prefix} {metadata.family_name}")
|
self._set_name_records(font, 16, adjusted_family_name)
|
||||||
# Update Preferred Subfamily
|
# Update Preferred Subfamily
|
||||||
self._set_name_records(font, 17, metadata.style_name)
|
self._set_name_records(font, 17, metadata.style_name)
|
||||||
# Update Preferred Family
|
# Update Preferred Family
|
||||||
self._set_name_records(font, 18, f"{self.prefix} {metadata.family_name}")
|
self._set_name_records(font, 18, adjusted_family_name)
|
||||||
|
|
||||||
# Update Unique ID (ID 3)
|
# Update Unique ID (ID 3)
|
||||||
try:
|
try:
|
||||||
current_unique = font["name"].getName(3, 3, 1).toUnicode()
|
current_unique = font["name"].getName(3, 3, 1).toUnicode()
|
||||||
parts = current_unique.split("Version")
|
parts = current_unique.split("Version")
|
||||||
version_info = f"Version{parts[1]}" if len(parts) == 2 else "Version 1.000"
|
version_info = f"Version{parts[1]}" if len(parts) == 2 else "Version 1.000"
|
||||||
new_unique_id = f"{self.prefix} {metadata.family_name.strip()}:{version_info}"
|
if self.prefix:
|
||||||
|
new_unique_id = f"{self.prefix} {metadata.family_name.strip()}:{version_info}"
|
||||||
|
else:
|
||||||
|
new_unique_id = f"{metadata.family_name.strip()}:{version_info}"
|
||||||
if current_unique != new_unique_id:
|
if current_unique != new_unique_id:
|
||||||
self._set_name_records(font, 3, new_unique_id)
|
self._set_name_records(font, 3, new_unique_id)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.warning(f" Failed to update Unique ID: {e}")
|
logger.warning(f" Failed to update Unique ID: {e}")
|
||||||
|
|
||||||
# Update PostScript Name (ID 6)
|
# Update PostScript Name (ID 6)
|
||||||
new_ps_name = metadata.ps_name
|
new_ps_name = metadata.ps_name
|
||||||
self._set_name_records(font, 6, new_ps_name)
|
self._set_name_records(font, 6, new_ps_name)
|
||||||
@@ -435,10 +450,17 @@ class FontProcessor:
|
|||||||
if "CFF " in font:
|
if "CFF " in font:
|
||||||
cff = font["CFF "].cff
|
cff = font["CFF "].cff
|
||||||
cff_topdict = cff.topDictIndex[0]
|
cff_topdict = cff.topDictIndex[0]
|
||||||
|
|
||||||
|
if self.prefix:
|
||||||
|
cff_full_name = f"{self.prefix} {metadata.full_name}"
|
||||||
|
cff_family_name = f"{self.prefix} {metadata.family_name.replace(' ', '_')}"
|
||||||
|
else:
|
||||||
|
cff_full_name = metadata.full_name
|
||||||
|
cff_family_name = metadata.family_name.replace(' ', '_')
|
||||||
|
|
||||||
name_mapping = {
|
name_mapping = {
|
||||||
"FullName": f"{self.prefix} {metadata.full_name}",
|
"FullName": cff_full_name,
|
||||||
"FamilyName": f"{self.prefix} {metadata.family_name.replace(' ', '_')}"
|
"FamilyName": cff_family_name
|
||||||
}
|
}
|
||||||
|
|
||||||
for key, new_value in name_mapping.items():
|
for key, new_value in name_mapping.items():
|
||||||
@@ -675,17 +697,20 @@ class FontProcessor:
|
|||||||
"""
|
"""
|
||||||
dirname = os.path.dirname(original_path)
|
dirname = os.path.dirname(original_path)
|
||||||
original_name, ext = os.path.splitext(os.path.basename(original_path))
|
original_name, ext = os.path.splitext(os.path.basename(original_path))
|
||||||
|
|
||||||
style_suffix = ""
|
style_suffix = ""
|
||||||
for key in STYLE_MAP:
|
for key in STYLE_MAP:
|
||||||
if key.lower() in original_name.lower():
|
if key.lower() in original_name.lower():
|
||||||
style_suffix = key
|
style_suffix = key
|
||||||
break
|
break
|
||||||
|
|
||||||
style_part = f"-{style_suffix}" if style_suffix else ""
|
style_part = f"-{style_suffix}" if style_suffix else ""
|
||||||
|
|
||||||
base_name = f"{self.prefix}_{metadata.family_name.replace(' ', '_')}{style_part}"
|
if self.prefix:
|
||||||
|
base_name = f"{self.prefix}_{metadata.family_name.replace(' ', '_')}{style_part}"
|
||||||
|
else:
|
||||||
|
base_name = f"{metadata.family_name.replace(' ', '_')}{style_part}"
|
||||||
|
|
||||||
return os.path.join(dirname, f"{base_name}{ext.lower()}")
|
return os.path.join(dirname, f"{base_name}{ext.lower()}")
|
||||||
|
|
||||||
|
|
||||||
@@ -743,8 +768,8 @@ Examples:
|
|||||||
help="Font files to process (*.ttf). You can use a wildcard (glob).")
|
help="Font files to process (*.ttf). You can use a wildcard (glob).")
|
||||||
parser.add_argument("--name", type=str,
|
parser.add_argument("--name", type=str,
|
||||||
help="Optional new family name for all fonts. Other font metadata like copyright info is unaffected.")
|
help="Optional new family name for all fonts. Other font metadata like copyright info is unaffected.")
|
||||||
parser.add_argument("--prefix", type=str, default=DEFAULT_PREFIX,
|
parser.add_argument("--prefix", type=str, default=DEFAULT_PREFIX,
|
||||||
help=f"Prefix to add to font names. Required. (Default: {DEFAULT_PREFIX})")
|
help=f"Prefix to add to font names. Set to empty string to omit prefix. (Default: {DEFAULT_PREFIX})")
|
||||||
parser.add_argument("--line-percent", type=int, default=DEFAULT_LINE_PERCENT,
|
parser.add_argument("--line-percent", type=int, default=DEFAULT_LINE_PERCENT,
|
||||||
help=f"Line spacing adjustment percentage. Set to 0 to make no changes to line spacing. (Default: {DEFAULT_LINE_PERCENT})")
|
help=f"Line spacing adjustment percentage. Set to 0 to make no changes to line spacing. (Default: {DEFAULT_LINE_PERCENT})")
|
||||||
parser.add_argument("--skip-kobo-kern", action="store_true",
|
parser.add_argument("--skip-kobo-kern", action="store_true",
|
||||||
|
|||||||
Reference in New Issue
Block a user