OSDN Git Service

convert all of fontparser classes into functions
authormshio <mshio@users.osdn.me>
Wed, 8 May 2019 14:22:04 +0000 (23:22 +0900)
committermshio <mshio@users.osdn.me>
Wed, 8 May 2019 14:22:04 +0000 (23:22 +0900)
script/all_kanji.py
script/export_as_svg.py
script/fontparser.py
script/kanji_num.py
script/listprinter.py
script/new_glyphs.py
script/rest_of_kanji.py

index 262a27e..ec83e58 100644 (file)
@@ -1,34 +1,35 @@
 # -*- 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
index 6b984a1..34e39aa 100644 (file)
@@ -23,7 +23,7 @@ import sys
 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:
   '''
index c3c79e3..1f43abc 100644 (file)
@@ -1,57 +1,19 @@
 # -*- 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)
index cb8ab77..126df95 100644 (file)
@@ -1,16 +1,17 @@
 # -*- 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):
@@ -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)
index 9f1aa5f..46f3cf0 100644 (file)
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 
-# Author: mshio <mshio@users.sourceforge.jp>
+# Author: mshio <mshio@users.osdn.me>
 
 __version__ = '0.11'
 
index e15e3dd..6c05b88 100644 (file)
@@ -2,26 +2,25 @@
 # -*- 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')
@@ -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)
index 8a44b89..7682460 100644 (file)
@@ -2,7 +2,7 @@
 # -*- 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)