1897187519a194ef4ffbbf1431dfefc418223862
[chise/ruby.git] / src / defkanji.rb
1 #!/usr/bin/env ruby
2 # define local kanji features, by eto 2003-0305
3
4 require 'singleton'
5
6 module CHISE
7   class IDS_Definition #======================================================================
8     include Singleton
9
10     #●ids-element: stop-character。これ以上分割しない、基本要素文字。
11     #その文字自身を値として持つ。それ以外の値を持つ場合は、それを代りの値として使うことを意味する。
12     #つまり、101字の基本漢字は最小構成要素なので、それ以上分解しませんよ、ということ。
13     IDS_ELEMENT = "六百回交向歩考出書多少高可"
14     BASIC_KANJI = "人子女母父王口耳手足力目首毛心犬牛鳥貝角羽虫馬魚羊肉皮米竹木麦豆山川雨風水土石金田穴日月火音糸刀舟門戸衣矢弓車皿一二三四五六七八九十百千万寸尺上中下本玉立回食行止交向歩考入示走生出来書言大小白青多少高長"
15
16     AWASE_KANJI = "鳴名加品古知問間聞取兄見切分粉貧林森校東明住位好岩砂里男畑習休短空坂島倉美孝赤看光初努協解新歌語話張強忘悲答晴現正字安守灰秋秒困国医包同合舌居右左受友反道返迷花菜集机主太氷州点店庫仕帳幼防引配早直班筆重番北化比死夏後進酒福私家世内谷半原前寺思電雲気布旅衆泣"
17
18     #●ids-meaning: 意味的に考えるところのIDS。形としてはつながらないが、意味としてはこう分割できるというものを表す。
19     IDS_MEANING = "
20 見     ⿱目儿
21 東     ⿻木日
22 里     ⿱田土
23 赤     ⿱大火
24 舌     ⿱千口
25 太     ⿻大丶
26 #州    ⿻砂川
27 #重    ⿱?土
28 世     ⿺十⿰十十
29 内     ⿵冂入
30 谷     ⿱⿱八&CDP-8B5D;口
31 半     ⿱八牛
32 孝     ⿱老子
33 島     ⿹鳥山
34 美     ⿱羊大
35 看     ⿸手目
36 倉     ⿸食口
37 強     ⿰弓⿱厶虫
38 乑        ⿲人人人
39 果     ⿱田木
40 比     ⿰匕匕
41 鼓     ⿰壴支
42 #承
43 鼻     ⿳自田廾
44 風     ⿵几⿱丿虫
45 #夜
46 &CDP-8C47;      ⿰亡月
47 黙     ⿺黒犬
48 ".split("\n")
49
50     #●ids-represent: これを持つもつ字は、それ以外の字を意味するということを意味する。
51     #例えば人偏は、人を意味する。これは再帰的に摘要する。
52     IDS_REPRESENT = "
53 亻        人
54 &CDP-8B5D;      人
55 衤        衣
56 𠂆       厂
57 𠂇       厂
58 ⺡        水
59 氵        水
60 &CDP-8CCC;      羊
61 𦍌       羊
62 &CDP-8B52;      老
63 &CDP-8CBB;      鳥
64 &CDP-8BEA;      刀
65 刂        刀
66 朩     木
67 ⺩        王
68 土        土
69 𠤎       匕
70 &CDP-8BC4;      泉
71 ⻗        雨
72 &CDP-8BE8;      申
73 糹        糸
74 ⻊        足
75 &J90-5469;      夂
76 &CDP-8BD5;      西
77 &CDP-8BA9;      牛
78 ⺮        竹
79 黑        黒
80 &CDP-8971;      冫
81 ".split("\n")
82
83     #●ids-link: 横列びの関係があるもの
84     IDS_LINK = "
85 艮        &CDP-8B7C;
86 &CDP-8B48;      四
87 寸        才
88 㐅        米
89 #この部品はいろいろあるのだけど…。
90 ".split("\n")
91
92     def check
93       #show_ids(IDS_ELEMENT) #ar = BASIC_KANJI+IDS_ELEMENT
94       #show_ids(IDS_MEANING.join())
95       #show_ids(KanjiList.instance.joyo)
96       #show_ids(KanjiList.instance.awase(0))
97       #show_ids(open("0208-shell.txt").read)
98       #p "&U+2ff2;".de_er
99       #p "休".decompose.to_er
100       eval_print_loop
101     end
102     def show_ids(str)
103       str.de_er.to_a.sort.uniq.each {|ch|
104         char = ch.char
105         ids = char.decompose_all
106         print "#{char}  #{ids.map_ucs}\n" #できるだけucsに正規化するべし。
107       }
108     end
109     def eval_print_loop
110       while true
111         line = STDIN.gets
112         line.chomp!
113         exit if line.nil? || line =~ /end/
114         print "#{line.decompose}        #{line.decompose.to_er}\n"
115         print "#{line.decompose_all}    #{line.decompose_all.to_er}\n"
116       end
117     end
118
119     def define_all
120       define_ids_element
121       define_ids_meaning
122       define_ids_represent
123       define_ids_link
124     end
125     def define_ids_element
126       IDS_ELEMENT.each_char {|ch|
127         char = ch.char
128         char.ids_element = ch
129       }
130     end
131     def define_ids_meaning
132       IDS_MEANING.each {|line|
133         next if line.nil? || line == "" || line =~ /^#/
134         ch, ids = line.split
135         char = ch.de_er.char
136         char.ids_meaning = ids.de_er
137         print "#{ch}    #{ids}\n"
138       }
139     end
140     def define_ids_represent
141       IDS_REPRESENT.each {|line|
142         next if line.nil? || line == "" || line =~ /^#/
143         ch, rep = line.split
144         char = ch.de_er.char
145         char.ids_represent = rep.de_er
146         print "#{char.map_ucs}  #{rep}\n"
147       }
148     end
149     def define_ids_link
150       IDS_LINK.each {|line|
151         next if line.nil? || line == "" || line =~ /^#/
152         ch, rep = line.split
153         char = ch.de_er.char
154         char.ids_link = rep.de_er
155         print "#{char.map_ucs}  #{rep}\n"
156       }
157     end
158
159   end
160 end
161
162 if $0 == __FILE__
163   ide = IDS_Definition.instance
164   ide.go
165   ide.define_all
166 end
167
168
169 #----------------------------------------------------------------------end.