import fontforge import glob import os import xml.etree.ElementTree as ET font = fontforge.font() font.fontname = "Katica" font.familyname = "Katica" font.fullname = "Katica Regular" font_info_applied = False units_per_px = 100 for svg_file in sorted(glob.glob("glyph_u*.svg")): basename = os.path.basename(svg_file) hex_code = basename.split('_u')[1].split('.')[0] codepoint = int(hex_code, 16) try: tree = ET.parse(svg_file) root = tree.getroot() metadata = root.find('{http://www.w3.org/2000/svg}metadata') if metadata is not None: font_info = metadata.find('{http://www.w3.org/2000/svg}font-info') if font_info is not None: glyph = font.createChar(codepoint) glyph.importOutlines(svg_file) if not font_info_applied: if 'name' in font_info.attrib and 'family' in font_info.attrib: font.fontname = font_info.get('name') font.familyname = font_info.get('family') font.fullname = f"{font_info.get('family')} Regular" if 'baseline' in font_info.attrib: font.os2_typoascent = int(font_info.get('baseline')) font.os2_typodescent = int(font_info.get('height')) - int(font_info.get('baseline')) font.os2_typolinegap = int(font_info.get('glyph-spacing', 1)) font.os2_winascent = int(font_info.get('baseline')) font.os2_windescent = int(font_info.get('height')) - int(font_info.get('baseline')) if 'weight' in font_info.attrib: font.os2_weight = int(font_info.get('weight')) font.os2_use_typo_metrics = True font_info_applied = True units_per_px = 1000 // int(font_info.get('height')) print( "Font info applied:", f"name={font.fontname}, family={font.familyname}, baseline={font.os2_typoascent}, weight={font.os2_weight}", f"advance={glyph.width}, left-bearing={glyph.left_side_bearing}", ) print(f"Applying metrics for U+{hex_code.upper()}", f'advance={font_info.get("advance")}', f'width={font_info.get("width")}', f'left-bearing={font_info.get("left-bearing")}') if 'advance' in font_info.attrib: glyph.width = (1 + int(font_info.get('advance'))) * units_per_px else: glyph.width = (1 + int(font_info.get('width', 1000 // units_per_px))) * units_per_px if 'left-bearing' in font_info.attrib: glyph.left_side_bearing = int(font_info.get('left-bearing')) * units_per_px print(f"Processed U+{hex_code.upper()}: width={glyph.width}, left-bearing={glyph.left_side_bearing}") else: glyph = font.createChar(codepoint) glyph.importOutlines(svg_file) glyph.width = 1000 else: print("Didn't find in SVG.") glyph = font.createChar(codepoint) glyph.importOutlines(svg_file) glyph.width = 1000 except Exception as e: print(f"Error processing {svg_file}: {e}") glyph = font.createChar(codepoint) glyph.importOutlines(svg_file) glyph.width = 1000 font.generate("output.ttf") print("Font generated successfully as output.ttf")