diff options
Diffstat (limited to 'genfontconf.py')
-rw-r--r-- | genfontconf.py | 161 |
1 files changed, 161 insertions, 0 deletions
diff --git a/genfontconf.py b/genfontconf.py new file mode 100644 index 0000000..3fe5386 --- /dev/null +++ b/genfontconf.py @@ -0,0 +1,161 @@ +#!/usr/bin/python3 + + +import argparse + + +''' +Generate the font config file for Noto CJK fonts + +genfontconf.py "lang list" "common font name" "font name" "fallback font name" "prepend latin font" ... + +like + +genfontconf.py --fallback-font --prepend-latin-font "zh-cn:zh-sg" "monospace" "Source Han Sans CN" "Source Han Sans TW" "DejaVu Sans Mono" "zh-cn:zh-sg" "serif" "Source Han Sans CN" "Source Han Sans TW" "" "zh-cn:zh-sg" "sans-serif" "Source Han Sans CN" "Source Han Sans TW" "" + +genfontconf.py "zh-cn:zh-sg" "monospace" "Noto Sans Mono CJK SC" "zh-cn:zh-sg" "serif" "Noto Serif CJK SC" "zh-cn:zh-sg" "sans-serif" "Noto Sans CJK SC" + +The above information is in variable length array. +''' + +''' +Some Noto CJK fonts may not need "fallback font name" + +Skip the "fallback font name" argument if not needed. +''' + +fallback_font_name = False + +''' +Noto CJK may not need "prepend latin font". + +Skip the "prepend latin font" argument if not needed. +''' + +prepend_latin_font = False + + +class FontConfRecord: + + @staticmethod + def renderRecord(langlist, common, font, fallback=None, latin=None): + for lang in langlist.split(":"): + FontConfRecord.renderMatch(lang, common, font, fallback, latin) + print() + + FontConfRecord.renderAlias(font, common) + print() + + @staticmethod + def renderMatch(lang, common, font, fallback, latin): + print('<match>') + FontConfRecord.renderTestLang(lang) + FontConfRecord.renderTestFamily(common) + FontConfRecord.renderEditFamily(font, fallback) + FontConfRecord.renderEditLatinFamily(latin) + print('</match>') + + @staticmethod + def renderTestLang(lang): + print('<test name="lang">') + print('<string>{0}</string>'.format(lang)) + print('</test>') + + @staticmethod + def renderTestFamily(common): + print('<test name="family">') + print('<string>{0}</string>'.format(common)) + print('</test>') + + @staticmethod + def renderEditFamily(font, fallback): + print('<edit name="family" mode="prepend">') + print('<string>{0}</string>'.format(font)) + if fallback: + print('<string>{0}</string>'.format(fallback)) + print('</edit>') + + @staticmethod + def renderEditLatinFamily(latin): + if not latin: + return + print('<edit name="family" mode="prepend" binding="strong">') + print('<string>{0}</string>'.format(latin)) + print('</edit>') + + @staticmethod + def renderAlias(font, common): + print('<alias>') + print('<family>{0}</family>'.format(font)) + print('<default>') + print('<family>{0}</family>'.format(common)) + print('</default>') + print('</alias>') + + +class FontConfFile: + + @staticmethod + def renderFile(strings): + FontConfFile.renderHeader() + FontConfFile.renderBody(strings) + FontConfFile.renderFooter() + + @staticmethod + def renderHeader(): + print('<?xml version="1.0"?>') + print('<!DOCTYPE fontconfig SYSTEM "fonts.dtd">') + print('<fontconfig>') + + @staticmethod + def renderBody(strings): + num = 3 + if fallback_font_name: + num += 1 + if prepend_latin_font: + num += 1 + + while len(strings): + items = strings[0:num] + strings = strings[num:] + + if num == 3: + FontConfRecord.renderRecord(items[0], items[1], items[2]) + + if num == 4: + if fallback_font_name: + FontConfRecord.renderRecord \ + (items[0], items[1], items[2], items[3]) + if prepend_latin_font: + FontConfRecord.renderRecord \ + (items[0], items[1], items[2], None, items[3]) + + if num == 5: + FontConfRecord.renderRecord \ + (items[0], items[1], items[2], items[3], items[4]) + + @staticmethod + def renderFooter(): + print('</fontconfig>') + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description='Generate font config.') + parser.add_argument('strings', metavar='string', type=str, nargs='+', + help='strings') + + parser.add_argument('--fallback-font', dest='fallback_font', action='store_true') + parser.add_argument('--disable-fallback-font', dest='fallback_font', action='store_false') + parser.set_defaults(fallback_font=False) + + parser.add_argument('--prepend-latin-font', dest='prepend_latin_font', action='store_true') + parser.add_argument('--disable-prepend-latin-font', dest='prepend_latin_font', action='store_false') + parser.set_defaults(prepend_latin_font=False) + + args = parser.parse_args() + #print(args) + + fallback_font_name = args.fallback_font + prepend_latin_font = args.prepend_latin_font + + FontConfFile.renderFile(args.strings) |