OSDN Git Service

adds rest_of_kanji.py and data files
[sawarabi-fonts/sawarabi-fonts.git] / script / rest_of_kanji.py
1 # -*- coding: utf-8 -*-
2
3 # $Id$
4 # Author: mshio <mshio@users.sourceforge.jp>
5
6 """
7 概要
8 ---------------------
9 このスクリプトは、指定された漢字のうち、フォントファイルに含まれて
10 いない漢字を表示し、最後にその字数を表示するものです。
11
12 使い方
13 ---------------------
14 必要な引数は2つです。
15 最初の引数には、検査対象のフォントファイル(TTF など)を指定します。
16 次の引数には、検査したい漢字を書き連ねたテキストファイル(便宜上これを
17 漢字ファイルと呼びます)のパスを指定します。
18
19 漢字ファイルは utf-8 で書かれている必要があります。
20 なお、漢字ファイルには改行を含めることができます。また、`#'から始まる
21 行はコメントとして扱われ、読み飛ばされます。
22
23 このスクリプトは、渡された漢字ファイルを読み取り、そのリストの中から、
24 フォントファイルに含まれていない漢字を抽出して出力します。
25
26 必要事項
27 ---------------------
28 このスクリプトを実行するには、FontForge が必要です。
29 """
30
31 __version__ = '0.10'
32
33 from types import MethodType
34 import fontforge
35 import sys
36
37 class KanjiList:
38     def __init__(self, file_path):
39         self.file_path = file_path
40         self.buffer = []
41
42     def convert(self, line):
43         try:
44             s = unicode(line.rstrip('\r\n'), 'utf-8')
45         except:
46             sys.exit('[ERROR] %s' % line)
47         return s
48
49     def read(self):
50         fh = open(self.file_path, 'r')
51         for line in fh:
52             if line.startswith('#'):
53                 continue
54             for c in self.convert(line):
55                 self.buffer.append(ord(c))
56         fh.close()
57         return self.buffer
58
59 class FontForgeCharList:
60     def __init__(self, font_path):
61         self.forge = fontforge.open(font_path)
62
63     def loop(self, method):
64         self.proc = MethodType(method, self, FontForgeCharList)
65         f = self.forge
66         for g in f:
67             if g[0] != '.' and f[g].unicode > 0:
68                 self.proc(f[g])
69
70 class ListPrinter:
71     def __init__(self, col, out):
72         self.col = col
73         self.out = out
74
75     def output(self, list):
76         col = 0
77         n = 0
78         for c in list:
79             col += 1
80             n += 1
81             self.out.write(unichr(c).encode('utf-8'))
82             if col == self.col:
83                 col = 0
84                 self.out.write('\n')
85             else:
86                 self.out.write(' ')
87         return n
88
89 if __name__ == '__main__':
90     forge = FontForgeCharList(sys.argv[1])
91     kanji_list = KanjiList(sys.argv[2]).read()
92
93     def remove(self, char):
94         for c in kanji_list:
95             if char.unicode == c:
96                 kanji_list.remove(c)
97                 break
98
99     forge.loop(remove)
100
101     p = ListPrinter(10, sys.stdout)
102     count = p.output(kanji_list)
103     print
104     print "%d char(s)" % count