summaryrefslogtreecommitdiff
path: root/genfontconf.py
diff options
context:
space:
mode:
Diffstat (limited to 'genfontconf.py')
-rw-r--r--genfontconf.py161
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)