# -*- coding: utf-8 -*-
-# Author: mshio <mshio@users.sourceforge.jp>
+# Author: mshio <mshio@users.osdn.me>
-__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
import time
import xml.parsers.expat
-COPYRIGHT = 'Copyright: (c) 2008-%d mshio <mshio@users.sourceforge.jp>'
+COPYRIGHT = 'Copyright: (c) 2008-%d mshio <mshio@users.osdn.me>'
class SvgCustomizer:
'''
# -*- coding: utf-8 -*-
-# Author: mshio <mshio@users.sourceforge.jp>
+# Author: mshio <mshio@users.osdn.me>
-__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)
# -*- conding: utf-8 -*-
-__version__ = '0.1'
+# Author: mshio <mshio@users.osdn.me>
-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):
})
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)
# -*- coding: utf-8 -*-
-# Author: mshio <mshio@users.sourceforge.jp>
+# Author: mshio <mshio@users.osdn.me>
__version__ = '0.11'
# -*- coding: utf-8 -*-
# $Id$
-# Author: mshio <mshio@users.sourceforge.jp>
+# Author: mshio <mshio@users.osdn.me>
-__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')
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
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)
# -*- coding: utf-8 -*-
# $Id$
-# Author: mshio <mshio@users.sourceforge.jp>
+# Author: mshio <mshio@users.osdn.me>
"""
概要
このスクリプトを実行するには、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)