Gần đây tôi thấy Jetendard (JetBrains Mono Nerd Font + Pretendard) được đăng ở đây khá thú vị. Thông thường các font tổng hợp kiểu này được dùng dưới dạng tổ hợp do người tạo chọn sẵn. Nhưng có lẽ cũng có người muốn tạo tổ hợp riêng của mình, chẳng hạn font A cho tiếng Anh và font B cho tiếng Hàn. Vì vậy tôi đã làm một công cụ để ai cũng có thể tự tạo trực tiếp bằng GUI.
Bản thân việc gộp hai font bằng CLI không khó. Chạy bằng fontTools là xong rất nhanh. Phần phiền phức nằm ở bước sau đó: đổi tùy chọn, gộp lại, cài đặt rồi kiểm tra. Mỗi vòng như vậy mất vài phút, lại còn phải chỉ định font trong IDE nên khá rắc rối. font-moeum là một ứng dụng desktop tập trung vào việc rút ngắn vòng lặp này xuống còn vài giây. Ứng dụng nhận đúng hai font tiếng Anh và tiếng Hàn (TTF/OTF) rồi gộp thành một TTF.
Sau khi gộp xong, kết quả được load ngay để bạn có thể gõ thử trực tiếp trong vùng preview mà không cần cài đặt. Cỡ chữ và chiều cao dòng được điều chỉnh theo thời gian thực bằng CSS mà không cần gộp lại. Khi đổi tùy chọn, ứng dụng sẽ tự động gộp lại. Với các glyph có ở cả hai bên như chữ Latin, chữ số và dấu câu, bạn có thể đảo nguồn lấy glyph từ font nào bằng A/B swap chỉ với một cú nhấp để so sánh.
Có hai chế độ.
Chế độ thông thường gộp toàn bộ bằng fontTools Merger và giữ nguyên tỷ lệ gốc của tiếng Hàn, phù hợp cho tài liệu và UI.
Chế độ font lập trình dùng engine riêng, lấy font A monospace làm nền và sao chép glyph tiếng Hàn của B sau khi scale và căn giữa vào ô có chiều rộng là bội số nguyên của độ rộng Latin (mặc định 2:1). Nhờ vậy trong terminal và editor, hai ô Latin sẽ khớp chính xác với một ký tự tiếng Hàn. Các mục như scale tiếng Hàn, bội số chiều rộng, offset dọc, có bao gồm Hán tự hay không, tổ hợp jamo (ccmp) có thể chỉnh trong panel nâng cao. Nếu A không phải monospace thì việc gộp sẽ bị từ chối.
Phần triển khai dùng Tauri v2 + React. Engine gộp được đóng gói Python fontTools thành một file thực thi đơn bằng PyInstaller và nhúng dưới dạng sidecar. Việc gộp dùng nguyên fontTools. Cấu trúc này được chọn vì FontFace API của webview tiện cho việc hiển thị kết quả ngay lập tức. OTF (CFF) được chuyển sang TTF bằng cu2qu khi load rồi mới gộp. Do có xấp xỉ đường cong và mất CFF hinting, ứng dụng hiển thị badge "OTF→TTF" ở slot và từ chối CFF2 variable OTF. Đầu ra luôn là TTF.
Tôi đã đăng các bản build cho Windows (bản cài đặt và zip portable), macOS (Apple Silicon) và Linux (AppImage/deb). Do không có code signing nên trên Windows sẽ hiện cảnh báo SmartScreen, còn macOS không được notarize nên cần chạy xattr -cr một lần. Ứng dụng không kèm theo font nào.
Người dùng chịu trách nhiệm tuân thủ giấy phép của các font được gộp (Reserved Font Name của OFL không được tái sử dụng trong tên đầu ra).
Ứng dụng dùng giấy phép MIT. Tổ hợp ví dụ đang dùng là D2Coding + JetBrains Mono (OFL). Nếu gặp font không gộp được hoặc tổ hợp cho kết quả không tự nhiên, tôi rất cảm ơn nếu bạn báo qua issue.
Chưa có bình luận nào.