kansi_valid 0.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,45 @@
1
+ # coding:utf-8
2
+ require 'rubygems'
3
+ require './lib/kansi_valid/version'
4
+ require './license'
5
+ spec = Gem::Specification.new do |s|
6
+ s.platform = Gem::Platform::RUBY
7
+ s.summary = "漢詩の作成補助、添削。 Easy to make Kanshi(Zekku)(Han-poet)and validate it. str=generate(5);kansi_valid(str);kv_bool(str)"
8
+ s.author="Takayasu Hayashi"
9
+ s.email="joe.ko9ji@gmail.com"
10
+ #s.homepage="http://maru.selfip.com/mygem/"
11
+ s.name = "kansi_valid"
12
+ s.version = Kansi_valid::Version
13
+
14
+ #s.requirements << 'rmagick'
15
+ #s.requirements << 'gruff'
16
+ #s.add_dependency('serialport','>= 1.0.4')
17
+ s.require_path = 'lib'
18
+ s.has_rdoc=true
19
+
20
+ #s.files = Dir.glob("{test,lib}/**/*.rb")
21
+ s.files = Dir.glob("{lib}/**/*.{rb,txt,dic}")+
22
+ Dir.glob("test/{ts,tc}*.rb")+
23
+ Dir.glob("dic/*")+
24
+ #Dir.glob("bin/*.rb")+
25
+ ["kansi_valid.gemspec","LICENSE.txt"]
26
+ s.test_file="test/tc_kansi_valid.rb"
27
+ s.extra_rdoc_files="README"
28
+ s.description = <<EOF
29
+ Usage:
30
+ requrie "rubyems"
31
+ require "Kansi_valid"
32
+ inclide Kansi_valid
33
+
34
+ puts str1 = generate(7) # => make random poet(7 gon Zekku)
35
+ puts str2 = generate(5) # => make random poet(5 gon Zekku)
36
+
37
+ kansi_valid(str1) # => research dictionary and answer,validate
38
+ kv(str1) # => same above
39
+ valid(str1) # => same above
40
+
41
+ valid?(str1) # =>true,false(nil)
42
+ kv_bool(str1) # => same above
43
+ EOF
44
+ end
45
+
@@ -0,0 +1,299 @@
1
+ #coding:utf-8
2
+ $KCODE="u" if RUBY_VERSION<"1.9"
3
+ File.expand_path(File.dirname(__FILE__))
4
+ File.expand_path(File.dirname(__FILE__)+"../dic")
5
+
6
+ Dir.glob(File.dirname(__FILE__)+"/kansi_valid/*.rb").each do |file|
7
+ p file if $DEBUG
8
+ require file
9
+ end
10
+
11
+ =begin rdoc
12
+ === 漢詩を作ったり、解析したりするのに役立つモジュール、関数をつくりました。
13
+ kansi_valid is a varidator of Han character poem(Kan si).
14
+ Author:: Takayasu Hayashi(林 貴康 joe.ko9ji@gmail.com )
15
+ License::GPL v2
16
+ * 辞書の使用は自己責任でお願いします。辞書は漢太郎の作者、Jigen様の作成された辞書を御許可いただきUTF-8テキストにしてあります。Jigen様、ありがとうございます。間違いがありましたら修正したいと思いますのでご連絡ください。
17
+ * Dictionary saved "/dic/dic.txt"UTF-8,about 6800 chars ,made by Jigen Kanou.
18
+ If you resume this,please tell me.
19
+ * 文字コードは UTF-8 ですので、WinXPなどは出力をKconvで変換したり、対応のエディタで見てください。
20
+ ===:Usage 使い方
21
+ requrie "rubyems" if "RUBY_VERSION"<"1.9"
22
+ require "kansi_valid"
23
+ include Kansi_valid
24
+ puts kv(generate)
25
+
26
+ === 先ずは有名なサンプルで。
27
+ sample # =>"#偶成 朱熹\n少年易老学難成\n一寸光陰不可軽\n未覚池塘春草夢\n階前梧葉已秋声\n"
28
+ #other valid=>"少年易老学難成\n一寸光陰不可軽\n未覚池塘春草夢\n階前梧葉已秋声"
29
+ #other valid=>"少年易老学難成 一寸光陰不可軽 未覚池塘春草夢 階前梧葉已秋声"
30
+ #other valid=>"少年易老学難成一寸光陰不可軽未覚池塘春草夢階前梧葉已秋声"
31
+
32
+ ===漢詩ではないサンプル漢詩を機械的に生成します
33
+ samples(10) # =>make many 'Meaningless' poet.
34
+
35
+ * 七言絶句(7を指定)五言絶句(5を指定) make random 'Meaningless' poet(7or5 gon Zekku)
36
+ srand(0);str1 = generate(7) # => "戻里唆双差及援\n罷傷脈拘序周元\n家据弱役露宵屋\n稚守途紅稿軸温"
37
+ srand(0);generate(5) # => "戻里唆双飯\n差猫及硬温\n除慌女収嫁\n枢寂厄痴援"
38
+ * srand は同じ詩を生成するために使用していますので通常は不要
39
+
40
+ ===kansi_valid(String) 絶句ならば禁則評価と辞書の結果表示、research dictionary and answer,validate
41
+ kansi_valid(sample)
42
+ # =>#偶成 朱熹
43
+ 少年易老学難成
44
+ 一寸光陰不可軽
45
+ 未覚池塘春草夢
46
+ 階前梧葉已秋声
47
+
48
+ # 庚 平起
49
+ #篠●先○陌●皓●覚●寒◇庚○
50
+ #質●願●陽○侵◇物◇哿●庚◇
51
+ #未●覚●支○陽○真○皓●東◇
52
+ #佳○先○虞◇葉●紙●尤○庚○
53
+ #Valid 絶句(Ver0.0.6)
54
+ #2013-01-03 22:58:18 +0900
55
+
56
+ #少:●:篠:嘯:ショウ:すくない すこし わかい
57
+ #年:○:一先::ネン:とし よわい みのり
58
+ 以下省略#
59
+
60
+ kv(sample) # =>同上、 same above
61
+ valid(sample) # =>同上、 same above
62
+ === 文字列が絶句であれば true を返す
63
+ valid?(sample) # =>true (絶句が正しいならtrue。)
64
+ (両韻・畳字などはtrueを返せない)
65
+ kv_bool(sample) # =>同上、 same above
66
+
67
+ ===漢詩でないものも第二水準漢字程度まで調べられます。日本の国字<峠辻>なども調べられますが、絶句の評価はできません。
68
+ dic("漢字辞典") # =>文字列を調べる。普通こちら、Simple dictionary using Dic[]
69
+ # =>"漢:●:翰::カン:国名 あや から
70
+ 字:●:寘::ジ:あざ あざな じ
71
+ 辞:○:四支::ジ:やめる ことば ことわる
72
+ 典:●:銑::テン:ふみ のり つかさどる
73
+ "
74
+ Dic["漢"] # =>単漢字を調べる、Character Hash Dictionary(Author Jigen Kanou,in Kantarou)
75
+ # =>["漢", "413", "", "0", "●", "翰", "去声", "", "カン", "",
76
+ "国名 あや から", "3441", "2033", "13", "水艸口夫漢", "0"]
77
+
78
+ === 辞書の音訓などから調べる場合は search を使います
79
+ search("かえで") # =>Dicの内容から該当する漢字のハッシュをつくる
80
+ # =>{"楓"=>["楓", "2440", "", "0", "○", "一東", "上平", "", "フウ", "",
81
+ "かえで", "4976", "4186", "13", "木風几丿虫", "0"],
82
+ "槭"=>["槭", "4166", "", "0", "●", "屋", "入声", "", "セキ", "",
83
+ "かえで", "5C65", "6069", "15", "木戚戈上小", "0"]}
84
+ ===平韻の字表の配列です
85
+ inji # =>平韻の配列表(inji[x],x=0..29)
86
+ (inji[0]が一東です)
87
+  inji[29] # =>"咸銜鹹緘岩巌杉衫凡鑑函監讒帆"
88
+ ===常用漢字の配列です(約1945字)
89
+ Jouyou=["哀","愛",..,"湾","腕"]
90
+ ===全ての辞書漢字の配列です(約6715字、国字など含む。)
91
+ Ji =["亜","唖",..,"禔","赶"]
92
+
93
+ ===平仄韻からランダムに文字をあてはめます
94
+ poetter("常国◇○●\n◇○○●◎\n○○●○●\n○●●○◎",[Jouyou,inji[0]])
95
+ # =>"常国雇坪坂\n飲戯眠分崇\n諸番襲硝看\n評緯越然籠"
96
+ zekku_list # =>絶句として適した文字を当てはめる配列
97
+ kougo("◇●常国○◎") # =>"囚故常国挑琴\n#侵" 平仄式から字を充て、最後に韻をコメント。
98
+ # "◇不問 ●仄 ○平 ◎韻"
99
+ kougo() # =>無意味な香語調を生成します、make random 'Meaningless' "kougo".
100
+
101
+
102
+ hyousoku("菩薩") # =>"虞◇曷●" (韻と平仄式を返す)
103
+ hyosoku("菩薩") # =>同上、 same above
104
+
105
+ 漢詩バリデータ(ルールどおりか評価する)
106
+ 漢詩のルールにしたがっているかをチェックするスクリプト
107
+ 記号
108
+ 平=韻+○
109
+ 仄=韻+●
110
+ 両韻=◇
111
+ 国字など=■
112
+ それ以外=?
113
+
114
+ チェック可能漢詩:
115
+ 七言絶句
116
+ 五言絶句
117
+
118
+ チェック項目
119
+ 押韻、おういん(重複禁)、踏み落とし(三句目)
120
+ 二四不動、にしふどう(挟み平(転句)はOK)
121
+ 二六対、にろくつい(挟み平(転句)はOK)
122
+ 下三連禁、あさんれんきん
123
+ 挟み平(転句はOK)
124
+ 二弧平禁(七言は四弧平禁)
125
+ 冒韻禁,韻字の句内での重複(畳字なども未チェック)
126
+
127
+ 他のチェック事項
128
+
129
+ 平起、仄起
130
+
131
+ やりたいこと
132
+ 読みかた(音、訓)# =>漢字辞書などへ転送など。
133
+ できてないこと
134
+ 対句,畳字など技法のチェック
135
+ 両韻の振り分けなど(◇でしか対応できない。基本1字1韻対応となる。)
136
+ たぶんチェックできないこと
137
+ 2、2、3(五言は2,3)の字で区切られているか
138
+ 多少目をつむるなどの融通はきかない。
139
+ =end
140
+ module Kansi_valid
141
+ module_function
142
+ #全辞書ハッシュ
143
+ Dic=kanji
144
+ #常用漢字の配列
145
+ Jouyou=File.read(File.dirname(__FILE__)+"/../dic/jouyou_kanji.txt").chomp.split(//)
146
+ #辞書の全ての漢字の配列(ひらがな等は、除外、国字は含む)
147
+ Ji =File.read(File.dirname(__FILE__)+"/../dic/kanji_list.txt").chomp.split(//)
148
+ #漢詩の総合チェック。
149
+ #漢詩部分の切り出し(#の行は読みとばす)
150
+ # '\n',""なども読みとばす
151
+ def kansi_valid(str)
152
+ begin
153
+ comment=kansi_comment(str)#コメントの切り出し
154
+ kansi=kansi_organize(str)# =>整形(半角英数、半角空白など外す)
155
+ kekka=hyousoku(kansi)
156
+
157
+ warning=""#警告コメント
158
+ #日本語かどうかの評価
159
+ _nihongo=nihongo(kekka)
160
+ if _nihongo==true
161
+ warning+="#Error:including Japanene or undefined char.\n"
162
+ end
163
+
164
+ zekku=check_zekku(kansi)# =>5,7,nil
165
+
166
+ ouIn=check_ouin(kekka)# =>東、元など
167
+ okosi=check_okosi(kekka)# =>○●■◇?など
168
+ #data<<韻、起し
169
+ if okosi=="●"
170
+ data="\n\n# #{ouIn} 仄起\n"
171
+ elsif okosi=="○"
172
+ data="\n\n# #{ouIn} 平起\n"
173
+ else
174
+ data="\n\n# #{ouIn} #{okosi}起\n"
175
+ end
176
+ #漢詩としての評価はじめ
177
+ a=kansi_analyze(kekka)#kekkaの分割
178
+
179
+ #通韻チェック
180
+ tuuIn=check_tuuin(a,zekku,ouIn)#true or false
181
+ unless tuuIn
182
+ warning+="# 違反・押韻(又は両韻字)\n"
183
+ end
184
+
185
+ #二四不動(挟み平(転句)はOK)
186
+ #二六対(挟み平(転句)はOK)
187
+ hudo=_24hudou(a,zekku)
188
+ unless hudo
189
+ warning+="# 違反・二四不同、(二六対)\n"
190
+ end
191
+
192
+ #下三連禁
193
+ _simo3ren=_3ren(a)
194
+ unless _simo3ren
195
+ warning+="# 警告・下三連禁(下平三連、下仄三連)\n"
196
+ end
197
+
198
+ #二弧平禁(七言は四弧平禁)
199
+ _kohyo=kohyo(a,zekku)
200
+ unless _kohyo
201
+ warning+="# 警告・二弧平禁(七言は四弧平禁)\n"
202
+ end
203
+
204
+ #冒韻禁,韻字の句内での重複
205
+ _bouin=bouin(a,zekku,ouIn)&&tuuIn#韻を踏んで(tuuin==true)更にbouin==true
206
+ unless _bouin
207
+ Kansi warning+="# 注・冒韻(両韻文字、韻が多いなど)\n"
208
+ end
209
+ p warning if $DEBUG
210
+ warning="#Valid 絶句(Ver#{Version})\n##{Time.now.to_s}\n" if warning==""
211
+
212
+ ryouin_list=check_ryouin(kansi_organize(str))
213
+
214
+ result=str+data+seikei(kekka)+warning+"\n"+seikei(ryouin_list)
215
+ yield result if block_given?
216
+ return result
217
+ rescue
218
+ result=str+"\n\n"+seikei(hyosoku(kansi_organize(str)))+"\n"+seikei(check_ryouin(kansi_organize(str)))
219
+ yield result if block_given?
220
+ return result
221
+ end
222
+ end
223
+
224
+ def kv_bool(str)
225
+ bool=true
226
+ begin
227
+ comment=kansi_comment(str)#コメントの切り出し
228
+ kansi=kansi_organize(str)# =>整形(半角英数、半角空白など外す)
229
+ kekka=hyousoku(kansi)
230
+
231
+ #日本語かどうかの評価
232
+ _nihongo=nihongo(kekka)
233
+ if _nihongo==true
234
+ return false
235
+ end
236
+
237
+ zekku=check_zekku(kansi)# =>5,7,nil
238
+
239
+ ouIn=check_ouin(kekka)# =>東、元など
240
+ okosi=check_okosi(kekka)# =>○●■◇?など
241
+
242
+ #漢詩としての評価はじめ
243
+ a=kansi_analyze(kekka)#kekkaの分割
244
+
245
+ #通韻チェック
246
+ tuuIn=check_tuuin(a,zekku,ouIn)#true or false
247
+ unless tuuIn
248
+ return false
249
+ end
250
+
251
+ #二四不動(挟み平(転句)はOK)
252
+ #二六対(挟み平(転句)はOK)
253
+ hudo=_24hudou(a,zekku)
254
+ unless hudo
255
+ return false
256
+ end
257
+
258
+ #下三連禁
259
+ _simo3ren=_3ren(a)
260
+ unless _simo3ren
261
+ return false
262
+ end
263
+
264
+ #挟み平(転句)はOK
265
+ #二弧平禁(七言は四弧平禁)
266
+ _kohyo=kohyo(a,zekku)
267
+ unless _kohyo
268
+ return false
269
+ #warning+="# 警告・二弧平禁(七言は四弧平禁)\n"
270
+ end
271
+
272
+ #冒韻禁,韻字の句内での重複
273
+ _bouin=bouin(a,zekku,ouIn)&&tuuIn#韻を踏んで(tuuin==true)更にbouin==true
274
+ unless _bouin
275
+ return false
276
+ end
277
+ yield bool if block_given?
278
+ rescue
279
+ yield nil if block_given?
280
+ return nil
281
+ end
282
+ return bool
283
+ end
284
+
285
+ alias kv kansi_valid
286
+ alias valid kansi_valid
287
+
288
+ alias dic check_ryouin
289
+
290
+ alias hyosoku hyousoku
291
+ alias kansi_ kansi_organize
292
+ alias kohyou kohyo
293
+
294
+ alias valid? kv_bool
295
+ alias bool kv_bool
296
+
297
+ alias generate kansi_generate
298
+ alias generate2 kansi_generate2
299
+ end
@@ -0,0 +1,146 @@
1
+ # coding:utf-8
2
+
3
+ module Kansi_valid
4
+ module_function
5
+ #24不同、26対を評価する。
6
+ #trueが正しい
7
+ #falseは正しくない
8
+ #nilは評価不能を示す。
9
+ #_24hudou(poem_string(詩),zekku=(5 or 7))
10
+ def _24hudou(a,zekku)
11
+ #p a
12
+ if zekku
13
+ #p a
14
+ #p a[0][3]
15
+ if zekku==7
16
+ case a[0][3]
17
+ when "◇"
18
+ bool1=
19
+ be_soku(a[1][3])&&
20
+ be_soku(a[2][3])&&
21
+ be_hyo(a[3][3])&&
22
+
23
+ be_soku(a[0][7])&&
24
+ be_hyo(a[1][7])&&
25
+ be_hyo(a[2][7])&&
26
+ be_soku(a[3][7])&&
27
+
28
+ be_hyo(a[0][11])&&
29
+ be_soku(a[1][11])&&
30
+ (be_soku(a[2][11]) || be_soku(a[2][9]))&&#挟み平
31
+ be_hyo(a[3][11])
32
+
33
+ bool2=
34
+ be_hyo(a[1][3])&&
35
+ be_hyo(a[2][3])&&
36
+ be_soku(a[3][3])&&
37
+
38
+ be_hyo(a[0][7])&&
39
+ be_soku(a[1][7])&&
40
+ be_soku(a[2][7])&&
41
+ be_hyo(a[3][7])&&
42
+
43
+ be_soku(a[0][11])&&
44
+ be_hyo(a[1][11])&&
45
+ be_hyo(a[2][11])&&
46
+ be_soku(a[3][11])
47
+
48
+ #p bool
49
+ return (bool1 or bool2)
50
+
51
+ when "○"
52
+ bool=
53
+ be_soku(a[1][3])&&
54
+ be_soku(a[2][3])&&
55
+ be_hyo(a[3][3])&&
56
+
57
+ be_soku(a[0][7])&&
58
+ be_hyo(a[1][7])&&
59
+ be_hyo(a[2][7])&&
60
+ be_soku(a[3][7])&&
61
+
62
+ be_hyo(a[0][11])&&
63
+ be_soku(a[1][11])&&
64
+ (be_soku(a[2][11]) || be_soku(a[2][9]))&&#挟み平
65
+ be_hyo(a[3][11])
66
+
67
+ #p bool
68
+ return bool
69
+ when "●"
70
+ bool=
71
+ be_hyo(a[1][3])&&
72
+ be_hyo(a[2][3])&&
73
+ be_soku(a[3][3])&&
74
+
75
+ be_hyo(a[0][7])&&
76
+ be_soku(a[1][7])&&
77
+ be_soku(a[2][7])&&
78
+ be_hyo(a[3][7])&&
79
+
80
+ be_soku(a[0][11])&&
81
+ be_hyo(a[1][11])&&
82
+ be_hyo(a[2][11])&&
83
+ be_soku(a[3][11])
84
+ return bool
85
+ end
86
+ elsif zekku==5
87
+ case a[0][3]
88
+ when "◇"
89
+ bool1=
90
+ be_soku(a[1][3])&&
91
+ be_soku(a[2][3])&&
92
+ be_hyo(a[3][3])&&
93
+
94
+ (be_soku(a[0][7])|| be_hyou(a[0][7]))&&
95
+ be_hyo(a[1][7])&&
96
+ be_hyo(a[2][7])&&
97
+ be_soku(a[3][7])
98
+
99
+ bool2=
100
+ be_hyo(a[1][3])&&
101
+ be_hyo(a[2][3])&&
102
+ be_soku(a[3][3])&&
103
+
104
+ be_hyo(a[0][7])&&
105
+ be_soku(a[1][7])&&
106
+ (be_soku(a[2][7])||be_soku(a[2][5]))&&#挟み平
107
+ be_hyo(a[3][7])
108
+ return (bool1 or bool2)
109
+
110
+
111
+ when "○"
112
+ bool=
113
+ be_soku(a[1][3])&&
114
+ be_soku(a[2][3])&&
115
+ be_hyo(a[3][3])&&
116
+
117
+ (be_soku(a[0][7])|| be_hyou(a[0][7]))&&
118
+ be_hyo(a[1][7])&&
119
+ be_hyo(a[2][7])&&
120
+ be_soku(a[3][7])
121
+ return bool
122
+ when "●"
123
+ bool=
124
+ be_hyo(a[1][3])&&
125
+ be_hyo(a[2][3])&&
126
+ be_soku(a[3][3])&&
127
+
128
+ be_hyo(a[0][7])&&
129
+ be_soku(a[1][7])&&
130
+ (be_soku(a[2][7])||be_soku(a[2][5]))&&#挟み平
131
+ be_hyo(a[3][7])
132
+ return bool
133
+ end
134
+ else
135
+ return false
136
+ end
137
+ else
138
+ return false
139
+ end
140
+ #評価されなかったら、最終値はnil
141
+ nil
142
+ end
143
+ end
144
+
145
+ #if $0==__FILE__
146
+ #end