From 8eea98eb4d79ef6043e60fddfd5b861f9b6891a4 Mon Sep 17 00:00:00 2001 From: mshio Date: Wed, 8 May 2019 23:22:04 +0900 Subject: [PATCH] convert all of fontparser classes into functions --- script/all_kanji.py | 33 ++++++++++++++------------- script/export_as_svg.py | 2 +- script/fontparser.py | 60 +++++++++---------------------------------------- script/kanji_num.py | 29 ++++++++++++++---------- script/listprinter.py | 2 +- script/new_glyphs.py | 37 +++++++++++++++--------------- script/rest_of_kanji.py | 54 ++++++++++++++++++++++---------------------- 7 files changed, 92 insertions(+), 125 deletions(-) diff --git a/script/all_kanji.py b/script/all_kanji.py index 262a27e5..ec83e588 100644 --- a/script/all_kanji.py +++ b/script/all_kanji.py @@ -1,34 +1,35 @@ # -*- coding: utf-8 -*- -# Author: mshio +# Author: mshio -__version__ = '0.11' +__version__ = '0.12' +import argparse import sys -from fontparser import KanjiParser +from fontparser import all_of_kanjis from listprinter import SimpleListPrinter def main(font_path, output=sys.stdout): - parser = KanjiParser(font_path) - kanji_list = parser.get_list() + kanji_list = all_of_kanjis(font_path) p = SimpleListPrinter(out=output, delimiter=0x3001) p.output(kanji_list) print >>output - print >>output, "%d char(s)" % len(kanji_list) + print >>output, "{} char(s)".format(len(kanji_list)) -if __name__ == '__main__': - if len(sys.argv) <= 1: - print 'usage: %s font-file' % sys.argv[0] - sys.exit(1) +def parse_args(): + parser = argparse.ArgumentParser() + parser.add_argument('font_files', nargs='+', help='path of a font file') + + return parser.parse_args() - print_title = len(sys.argv) >= 3 +if __name__ == '__main__': + args = parse_args() - for path in sys.argv: - if path == sys.argv[0]: continue + print_title = len(args.font_files) >= 2 - if print_title: print "%s:" % path + for path in args.font_files: + if print_title: print "{}:".format(path) main(path) - if print_title and path != sys.argv[-1]: print - + if print_title and path != args.font_files[-1]: print diff --git a/script/export_as_svg.py b/script/export_as_svg.py index 6b984a19..34e39aa0 100644 --- a/script/export_as_svg.py +++ b/script/export_as_svg.py @@ -23,7 +23,7 @@ import sys import time import xml.parsers.expat -COPYRIGHT = 'Copyright: (c) 2008-%d mshio ' +COPYRIGHT = 'Copyright: (c) 2008-%d mshio ' class SvgCustomizer: ''' diff --git a/script/fontparser.py b/script/fontparser.py index c3c79e3e..1f43abcc 100644 --- a/script/fontparser.py +++ b/script/fontparser.py @@ -1,57 +1,19 @@ # -*- coding: utf-8 -*- -# Author: mshio +# Author: mshio -__version__ = '0.11' +__version__ = '0.12' import fontforge -from types import MethodType +def filter_glyphs(font_path, method): + forge = fontforge.open(font_path) + array = [method(forge[g]) for g in forge if g[0] is not '.' and forge[g].unicode > 0] + return [x for x in array if x] -class FontParser: - """ - An object in order to parse the characters in the specified font. - """ - def __init__(self, font_path): - self.forge = fontforge.open(font_path) - - def parse(self, method): - self.proc = MethodType(method, self, FontParser) - f = self.forge - for g in f: - if g[0] != '.' and f[g].unicode > 0: - self.proc(f[g]) - -class FontDiffParser: - def __init__(self, old_font_path, new_font_path): - self.font_path = [old_font_path, new_font_path] - - def get_diff(self): - buf = [] - old = fontforge.open(self.font_path[0]) - - def collect(self, glyph_obj): - if glyph_obj.glyphname not in old: - buf.append(glyph_obj.unicode) - - FontParser(self.font_path[1]).parse(collect) - - return buf - -class KanjiParser: - def __init__(self, font_path): - self.font_path = font_path - - def get_list(self): - buf = [] - - def collect(self, glyph): - code = glyph.unicode - # roughly - if code >= 0x4e00 and code <= 0x9fff: - buf.append(code) - - FontParser(self.font_path).parse(collect) - - return buf +def font_diff(old_font_path, new_font_path): + old = fontforge.open(old_font_path) + return filter_glyphs(new_font_path, lambda g: g.unicode if g.glyphname not in old else None) +def all_of_kanjis(font_path): + return filter_glyphs(font_path, lambda g: g.unicode if 0x4e00 <= g.unicode <= 0x9fff else None) diff --git a/script/kanji_num.py b/script/kanji_num.py index cb8ab772..126df952 100644 --- a/script/kanji_num.py +++ b/script/kanji_num.py @@ -1,16 +1,17 @@ # -*- conding: utf-8 -*- -__version__ = '0.1' +# Author: mshio -import sys -from fontparser import KanjiParser +__version__ = '0.2' + +import argparse +from fontparser import all_of_kanjis def get_kanjilist(): def parse_source(filepath): - fh = open(filepath, 'r') - chars = [[ord(c) for c in unicode(line.rstrip('\r\n'), 'utf-8') - if not line.startswith('#')] for line in fh] - fh.close() + with open(filepath, 'r') as fh: + chars = [[ord(c) for c in unicode(line.rstrip('\r\n'), 'utf-8') + if not line.startswith('#')] for line in fh] return reduce(lambda x, y: x + y, chars) def parse_sources(filepaths): @@ -23,14 +24,18 @@ def get_kanjilist(): }) return {k: parse_sources(v) for k, v in sources.items()} +def parse_args(): + parser = argparse.ArgumentParser() + parser.add_argument('font_file', help='path of a font file') + + return parser.parse_args() + if __name__ == '__main__': - if len(sys.argv) <= 1: - print 'usage: %s font-file' % sys.argv[0] - sys.exit(1) + args = parse_args() - all_kanjis = KanjiParser(sys.argv[1]).get_list() + all_kanjis = all_of_kanjis(args.font_file) kanjilist = get_kanjilist() for k, v in kanjilist.items(): count = len(set(v) & set(all_kanjis)) - print '%(key)s, %(num)d' % {'key': k, 'num': count} + print '{key}, {num}'.format(key=k, num=count) diff --git a/script/listprinter.py b/script/listprinter.py index 9f1aa5f2..46f3cf04 100644 --- a/script/listprinter.py +++ b/script/listprinter.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Author: mshio +# Author: mshio __version__ = '0.11' diff --git a/script/new_glyphs.py b/script/new_glyphs.py index e15e3dd3..6c05b880 100644 --- a/script/new_glyphs.py +++ b/script/new_glyphs.py @@ -2,26 +2,25 @@ # -*- coding: utf-8 -*- # $Id$ -# Author: mshio +# Author: mshio -__version__ = '0.11' +__version__ = '0.12' +import argparse import os -import sys import tarfile -from fontparser import FontDiffParser +from fontparser import font_diff from listprinter import SimpleListPrinter def print_new_glyph(archive, newfile, printer=None): def fontfilepath_in_archive(archive_path, weight, ext='ttf'): - filenm = archive_path.split('/')[-1] - p = filenm.split('-') - family_name = p[0] - type_name = p[1] + file_name = archive_path.split('/')[-1] + family_name, type_name, _ = file_name.split('-', 2) - return '%s-%s/%s-%s-%s.%s' % (family_name, type_name, - family_name, type_name, weight, ext) + return '{family}-{type_name}/{family}-{type_name}-{weight}.{ext}'.format( + family=family_name, type_name=type_name, weight=weight, ext=ext + ) def expand_archive(archive_path, fontfile_path): f = tarfile.open(archive_path, 'r:gz') @@ -35,8 +34,7 @@ def print_new_glyph(archive, newfile, printer=None): font_path = fontfilepath_in_archive(archive, 'medium') expand_archive(archive, font_path) - parser = FontDiffParser(font_path, newfile) - diff = parser.get_diff() + diff = font_diff(font_path, newfile) clean_up(font_path) p = printer @@ -47,12 +45,13 @@ def print_new_glyph(archive, newfile, printer=None): main(archive, newfile, printer) -if __name__ == '__main__': - if len(sys.argv) != 3: - print 'usage: %s tar.gz-file font-file' % sys.argv[0] - sys.exit(1) +def parse_args(): + parser = argparse.ArgumentParser() + parser.add_argument('archive_file', help='path of an archived font file') + parser.add_argument('font_file', help='path of a font file') - archive = sys.argv[1] - newfile = sys.argv[2] + return parser.parse_args() - print_new_glyph(archive, newfile) +if __name__ == '__main__': + args = parse_args() + print_new_glyph(args.archive_file, args.font_file) diff --git a/script/rest_of_kanji.py b/script/rest_of_kanji.py index 8a44b895..76824602 100644 --- a/script/rest_of_kanji.py +++ b/script/rest_of_kanji.py @@ -2,7 +2,7 @@ # -*- coding: utf-8 -*- # $Id$ -# Author: mshio +# Author: mshio """ 概要 @@ -29,49 +29,49 @@ このスクリプトを実行するには、FontForge が必要です。 """ -__version__ = '0.11' +__version__ = '0.12' +import argparse import sys -from types import MethodType -from fontparser import FontParser +from fontparser import filter_glyphs from listprinter import SimpleListPrinter -class KanjiList: - def __init__(self, file_path): - self.file_path = file_path - self.buffer = [] - - def convert(self, line): +def kanji_list(file_path): + def convert(line): try: s = unicode(line.rstrip('\r\n'), 'utf-8') except: sys.exit('[ERROR] %s' % line) return s - def read(self): - fh = open(self.file_path, 'r') - for line in fh: + buf = [] + with open(file_path, 'r') as file: + for line in file: if line.startswith('#'): continue - for c in self.convert(line): - self.buffer.append(ord(c)) - fh.close() - return self.buffer + for c in convert(line): + buf.append(ord(c)) + return buf + +def parse_args(): + parser = argparse.ArgumentParser() + parser.add_argument('font_file', help='path of a font file') + parser.add_argument('kanji_file', help='path of a kanji file') + return parser.parse_args() if __name__ == '__main__': - parser = FontParser(sys.argv[1]) - kanji_list = KanjiList(sys.argv[2]).read() + args = parse_args() + kanjis = kanji_list(args.kanji_file) - def remove(self, char): - for c in kanji_list: - if char.unicode == c: - kanji_list.remove(c) - break + def remove(char): + code = next(iter(filter(lambda c: char.unicode == c, kanjis)), False) + if code: + kanjis.remove(code) - parser.parse(remove) + filter_glyphs(args.font_file, remove) p = SimpleListPrinter(delimiter=0x3001) - p.output(kanji_list) + p.output(kanjis) print - print "%d char(s)" % len(kanji_list) + print "%d char(s)" % len(kanjis) -- 2.11.0