keystone 0.0.29

Sign up to get free protection for your applications and to get access to all the features.
Files changed (170) hide show
  1. data/.gitignore +3 -0
  2. data/README +3 -0
  3. data/Rakefile +26 -0
  4. data/VERSION +1 -0
  5. data/doc/classes/Dir.html +139 -0
  6. data/doc/classes/Dir.src/M000003.html +25 -0
  7. data/doc/classes/FlagSetMaker.html +138 -0
  8. data/doc/classes/FlagSetMaker.src/M000018.html +18 -0
  9. data/doc/classes/FlagSetMaker/FlagSet.html +186 -0
  10. data/doc/classes/FlagSetMaker/FlagSet.src/M000019.html +24 -0
  11. data/doc/classes/FlagSetMaker/FlagSet.src/M000020.html +26 -0
  12. data/doc/classes/FlagSetMaker/FlagSet.src/M000021.html +18 -0
  13. data/doc/classes/FlagSetMaker/FlagSet.src/M000022.html +18 -0
  14. data/doc/classes/FlagSetMaker/Flags.html +304 -0
  15. data/doc/classes/FlagSetMaker/Flags.src/M000023.html +19 -0
  16. data/doc/classes/FlagSetMaker/Flags.src/M000024.html +18 -0
  17. data/doc/classes/FlagSetMaker/Flags.src/M000025.html +18 -0
  18. data/doc/classes/FlagSetMaker/Flags.src/M000026.html +18 -0
  19. data/doc/classes/FlagSetMaker/Flags.src/M000027.html +18 -0
  20. data/doc/classes/FlagSetMaker/Flags.src/M000029.html +18 -0
  21. data/doc/classes/FlagSetMaker/Flags.src/M000030.html +18 -0
  22. data/doc/classes/FlagSetMaker/Flags.src/M000031.html +18 -0
  23. data/doc/classes/FlagSetMaker/Flags.src/M000032.html +18 -0
  24. data/doc/classes/FlagSetMaker/Flags.src/M000033.html +18 -0
  25. data/doc/classes/Hoge.html +113 -0
  26. data/doc/classes/Keystone.html +174 -0
  27. data/doc/classes/Keystone/Base.html +191 -0
  28. data/doc/classes/Keystone/Base.src/M000054.html +22 -0
  29. data/doc/classes/Keystone/Base.src/M000055.html +18 -0
  30. data/doc/classes/Keystone/Base.src/M000056.html +25 -0
  31. data/doc/classes/Keystone/Base.src/M000057.html +18 -0
  32. data/doc/classes/Keystone/Base.src/M000058.html +20 -0
  33. data/doc/classes/Keystone/Batch.html +115 -0
  34. data/doc/classes/Keystone/Batch/Base.html +208 -0
  35. data/doc/classes/Keystone/Batch/Base.src/M000052.html +54 -0
  36. data/doc/classes/Keystone/Batch/Base.src/M000053.html +30 -0
  37. data/doc/classes/Keystone/CoreExt.html +105 -0
  38. data/doc/classes/Keystone/Mail.html +115 -0
  39. data/doc/classes/Keystone/Mail/Send.html +171 -0
  40. data/doc/classes/Keystone/Mail/Send.src/M000034.html +18 -0
  41. data/doc/classes/Keystone/Mail/Send.src/M000035.html +42 -0
  42. data/doc/classes/Keystone/Mail/Send.src/M000036.html +18 -0
  43. data/doc/classes/Keystone/Os.html +184 -0
  44. data/doc/classes/Keystone/Os.src/M000037.html +18 -0
  45. data/doc/classes/Keystone/Os.src/M000038.html +27 -0
  46. data/doc/classes/Keystone/Os/AbstractOs.html +227 -0
  47. data/doc/classes/Keystone/Os/AbstractOs.src/M000046.html +17 -0
  48. data/doc/classes/Keystone/Os/AbstractOs.src/M000047.html +17 -0
  49. data/doc/classes/Keystone/Os/AbstractOs.src/M000048.html +17 -0
  50. data/doc/classes/Keystone/Os/AbstractOs.src/M000049.html +17 -0
  51. data/doc/classes/Keystone/Os/AbstractOs.src/M000050.html +17 -0
  52. data/doc/classes/Keystone/Os/AbstractOs.src/M000051.html +25 -0
  53. data/doc/classes/Keystone/Os/Centos.html +113 -0
  54. data/doc/classes/Keystone/Os/Darwin.html +139 -0
  55. data/doc/classes/Keystone/Os/Darwin.src/M000039.html +18 -0
  56. data/doc/classes/Keystone/Os/Linux.html +139 -0
  57. data/doc/classes/Keystone/Os/Linux.src/M000045.html +26 -0
  58. data/doc/classes/Keystone/Os/Osx.html +113 -0
  59. data/doc/classes/Keystone/Os/Unix.html +199 -0
  60. data/doc/classes/Keystone/Os/Unix.src/M000040.html +27 -0
  61. data/doc/classes/Keystone/Os/Unix.src/M000041.html +18 -0
  62. data/doc/classes/Keystone/Os/Unix.src/M000042.html +18 -0
  63. data/doc/classes/Keystone/Os/Unix.src/M000043.html +18 -0
  64. data/doc/classes/Keystone/Os/Unix.src/M000044.html +18 -0
  65. data/doc/classes/Keystone/Rails.html +105 -0
  66. data/doc/classes/Keystone/StringUtil.html +226 -0
  67. data/doc/classes/Keystone/StringUtil.src/M000059.html +43 -0
  68. data/doc/classes/Keystone/StringUtil.src/M000060.html +25 -0
  69. data/doc/classes/Keystone/StringUtil.src/M000061.html +24 -0
  70. data/doc/classes/Keystone/StringUtil.src/M000062.html +18 -0
  71. data/doc/classes/Keystone/StringUtil.src/M000063.html +21 -0
  72. data/doc/classes/Object.html +240 -0
  73. data/doc/classes/Object.src/M000012.html +18 -0
  74. data/doc/classes/Object.src/M000013.html +20 -0
  75. data/doc/classes/Object.src/M000014.html +18 -0
  76. data/doc/classes/Object.src/M000015.html +18 -0
  77. data/doc/classes/Object.src/M000016.html +18 -0
  78. data/doc/classes/Object.src/M000017.html +19 -0
  79. data/doc/classes/Tempfile.html +139 -0
  80. data/doc/classes/Tempfile.src/M000011.html +25 -0
  81. data/doc/classes/TestCoreExt.html +152 -0
  82. data/doc/classes/TestCoreExt.src/M000009.html +17 -0
  83. data/doc/classes/TestCoreExt.src/M000010.html +21 -0
  84. data/doc/classes/TestStringUtilBase.html +197 -0
  85. data/doc/classes/TestStringUtilBase.src/M000004.html +17 -0
  86. data/doc/classes/TestStringUtilBase.src/M000005.html +23 -0
  87. data/doc/classes/TestStringUtilBase.src/M000006.html +22 -0
  88. data/doc/classes/TestStringUtilBase.src/M000007.html +25 -0
  89. data/doc/classes/TestStringUtilBase.src/M000008.html +34 -0
  90. data/doc/classes/Uri.html +158 -0
  91. data/doc/classes/Uri.src/M000001.html +18 -0
  92. data/doc/classes/Uri.src/M000002.html +18 -0
  93. data/doc/created.rid +1 -0
  94. data/doc/files/example/batch_sample_rb.html +134 -0
  95. data/doc/files/example/os_rb.html +109 -0
  96. data/doc/files/example/string_util_rb.html +109 -0
  97. data/doc/files/lib/keystone/base_rb.html +101 -0
  98. data/doc/files/lib/keystone/batch/base_rb.html +108 -0
  99. data/doc/files/lib/keystone/batch_rb.html +101 -0
  100. data/doc/files/lib/keystone/core_ext/array_rb.html +101 -0
  101. data/doc/files/lib/keystone/core_ext/blank_rb.html +101 -0
  102. data/doc/files/lib/keystone/core_ext/dir_rb.html +101 -0
  103. data/doc/files/lib/keystone/core_ext/object_rb.html +101 -0
  104. data/doc/files/lib/keystone/core_ext/tempfile_rb.html +108 -0
  105. data/doc/files/lib/keystone/core_ext/uri_rb.html +101 -0
  106. data/doc/files/lib/keystone/core_ext_rb.html +113 -0
  107. data/doc/files/lib/keystone/mail/send_rb.html +115 -0
  108. data/doc/files/lib/keystone/mail_rb.html +101 -0
  109. data/doc/files/lib/keystone/os/abstract_os_rb.html +101 -0
  110. data/doc/files/lib/keystone/os/centos_rb.html +101 -0
  111. data/doc/files/lib/keystone/os/darwin_rb.html +101 -0
  112. data/doc/files/lib/keystone/os/linux_rb.html +101 -0
  113. data/doc/files/lib/keystone/os/osx_rb.html +101 -0
  114. data/doc/files/lib/keystone/os/unix_rb.html +101 -0
  115. data/doc/files/lib/keystone/os_rb.html +108 -0
  116. data/doc/files/lib/keystone/string_util_rb.html +101 -0
  117. data/doc/files/lib/keystone_rb.html +116 -0
  118. data/doc/files/test/test_core_ext_rb.html +110 -0
  119. data/doc/files/test/test_string_util_rb.html +112 -0
  120. data/doc/files/vendor/flag_set_maker_rb.html +108 -0
  121. data/doc/files/vendor/moji_rb.html +118 -0
  122. data/doc/fr_class_index.html +52 -0
  123. data/doc/fr_file_index.html +54 -0
  124. data/doc/fr_method_index.html +89 -0
  125. data/doc/index.html +24 -0
  126. data/doc/rdoc-style.css +208 -0
  127. data/example/batch_sample.rb +24 -0
  128. data/example/os.rb +4 -0
  129. data/example/sendmail.rb +21 -0
  130. data/example/string_util.rb +15 -0
  131. data/keystone.gemspec +209 -0
  132. data/lib/keystone.rb +25 -0
  133. data/lib/keystone/base.rb +75 -0
  134. data/lib/keystone/batch.rb +5 -0
  135. data/lib/keystone/batch/base.rb +217 -0
  136. data/lib/keystone/core_ext.rb +18 -0
  137. data/lib/keystone/core_ext/array.rb +29 -0
  138. data/lib/keystone/core_ext/blank.rb +44 -0
  139. data/lib/keystone/core_ext/dir.rb +16 -0
  140. data/lib/keystone/core_ext/ipaddr.rb +18 -0
  141. data/lib/keystone/core_ext/object.rb +34 -0
  142. data/lib/keystone/core_ext/tempfile.rb +14 -0
  143. data/lib/keystone/core_ext/uri.rb +14 -0
  144. data/lib/keystone/mail.rb +8 -0
  145. data/lib/keystone/mail/address.rb +92 -0
  146. data/lib/keystone/mail/content_type.rb +60 -0
  147. data/lib/keystone/mail/message.rb +102 -0
  148. data/lib/keystone/mail/message_factory.rb +18 -0
  149. data/lib/keystone/mail/message_iso2022jp.rb +126 -0
  150. data/lib/keystone/mail/message_sjis.rb +23 -0
  151. data/lib/keystone/mail/receive.rb +320 -0
  152. data/lib/keystone/mail/send.rb +83 -0
  153. data/lib/keystone/os.rb +26 -0
  154. data/lib/keystone/os/abstract_os.rb +36 -0
  155. data/lib/keystone/os/centos.rb +6 -0
  156. data/lib/keystone/os/darwin.rb +9 -0
  157. data/lib/keystone/os/linux.rb +15 -0
  158. data/lib/keystone/os/osx.rb +18 -0
  159. data/lib/keystone/os/unix.rb +43 -0
  160. data/lib/keystone/string_util.rb +85 -0
  161. data/test/test_core_ext.rb +15 -0
  162. data/test/test_string_util.rb +60 -0
  163. data/util/README +1 -0
  164. data/util/bin/command_broadcast.rb +137 -0
  165. data/util/bin/disk_size_check.rb +54 -0
  166. data/util/bin/notice +93 -0
  167. data/util/bin/ve2tar.rb +80 -0
  168. data/vendor/flag_set_maker.rb +121 -0
  169. data/vendor/moji.rb +502 -0
  170. metadata +236 -0
@@ -0,0 +1,54 @@
1
+ #!/usr/bin/ruby
2
+
3
+ require 'rubygems'
4
+ require 'keystone'
5
+ require 'pit'
6
+
7
+ include Keystone::Batch::Base
8
+
9
+ ENV["EDITOR"] = "vi" unless ENV.key?("EDITOR")
10
+
11
+ config = Pit.get("disk_size_check", :require => {
12
+ "smtp_addr" => "smtp_server_address",
13
+ "mailto" => "mailto",
14
+ "mailfrom" => "mailfrom"
15
+ })
16
+
17
+ SMTP_ADDR = config["smtp_addr"]
18
+ MAIL_TO = [config["mailto"]]
19
+ ERROR_MAIL_TO = MAIL_TO
20
+ MAIL_FROM = config["mailfrom"]
21
+
22
+ @os = Keystone::Os.get()
23
+
24
+ def send_alert_mail(additional_body = "")
25
+ title = 'disk size alert'
26
+ body = <<-BODY
27
+ disk size alert at #{@os.hostname}(#{@os.ip_address.join(" , ")})
28
+ #{@df_result}
29
+ #{additional_body}
30
+ BODY
31
+
32
+ Keystone::Mail::Send.send(
33
+ MAIL_FROM,
34
+ MAIL_TO,
35
+ title,
36
+ body,
37
+ {:smtp_addr=>SMTP_ADDR,:retry_cnt=>3}
38
+ )
39
+ end
40
+
41
+ execute() do
42
+ limit = 80
43
+ limit = Integer(ARGV[0]) if ARGV.size > 0
44
+
45
+ @df_result = @os.disk
46
+ @df_result.gsub(/(\d+)%/){|s|
47
+ if $1.to_i >= limit
48
+ warn 'log size alert'
49
+ send_alert_mail
50
+ break
51
+ end
52
+ }
53
+ end
54
+
data/util/bin/notice ADDED
@@ -0,0 +1,93 @@
1
+ #!/usr/bin/ruby
2
+
3
+ require 'rubygems'
4
+ require 'activesupport'
5
+ require 'meow'
6
+ require 'pit'
7
+ require 'keystone'
8
+
9
+ config = Pit.get("notice")
10
+ MAIL_TO = config["mailto"]
11
+ MAIL_FROM = config["mailfrom"]
12
+
13
+ def ppp(message)
14
+ print message
15
+ STDOUT.flush
16
+ end
17
+
18
+ class GrowlMessage
19
+ attr_accessor :execute_at,:message
20
+ def initialize
21
+ @message = ""
22
+ @execute_at = Time.now
23
+ end
24
+ end
25
+
26
+ if ARGV.size > 0 && ARGV[0] == "-f"
27
+ message = Marshal.load(File.open(ARGV[1]))
28
+ File.delete(ARGV[1])
29
+ loop do
30
+ break if message.execute_at < Time.now
31
+ sleep 30
32
+ end
33
+
34
+ begin
35
+ Keystone::Mail::Send.send(MAIL_FROM,MAIL_TO,message.message,message.message)
36
+ rescue
37
+ end
38
+
39
+ meep = Meow.new("growl_notify")
40
+ option = {:sticky=>true,:priority=>1}
41
+ message_text = "#{message.execute_at.strftime("%Y/%m/%d %H:%M:%S")}\n#{message.message}"
42
+ meep.notify("growl_notify",message_text,option)
43
+ exit
44
+ end
45
+
46
+ INPUT_TIME_MESSAGE = "when?(NN(minutes later) or NNh(hours later) or HH:MM(time format)):"
47
+ message = GrowlMessage.new
48
+
49
+ ppp "message:"
50
+ STDIN.each_line do |line|
51
+ line.chomp!
52
+ exit if line == ""
53
+ message.message = line
54
+ break
55
+ end
56
+
57
+ ppp INPUT_TIME_MESSAGE
58
+ STDIN.each_line do |line|
59
+ line.chomp!
60
+ minutes = 5
61
+ begin
62
+ minutes = Integer(line)
63
+ message.execute_at += minutes * 60
64
+ break
65
+ rescue
66
+ begin
67
+ if line =~ /(\d+):(\d+)/
68
+ hour,minute= Integer($1),Integer($2)
69
+ execute_at_candidate = message.execute_at.change(:hour => hour,:min => minute)
70
+ if execute_at_candidate < message.execute_at
71
+ execute_at_candidate += 60 * 60 * 24
72
+ end
73
+ message.execute_at = execute_at_candidate
74
+ break
75
+ elsif line =~ /(\d+)h/
76
+ hours = Integer($1)
77
+ message.execute_at += hours * 60 * 60
78
+ break
79
+ end
80
+ rescue => e
81
+ puts e
82
+ end
83
+ end
84
+ puts "invalid format"
85
+ ppp INPUT_TIME_MESSAGE
86
+ end
87
+
88
+ path = "/tmp/.gw_message.#{Time.now.tv_usec}"
89
+ Marshal.dump(message,File.new(path, 'w'))
90
+ cmd = "notice -f #{path} &"
91
+ #puts cmd
92
+ system cmd
93
+
@@ -0,0 +1,80 @@
1
+ #!/usr/bin/ruby
2
+
3
+ require 'rubygems'
4
+ require 'keystone'
5
+
6
+ include Keystone::Batch::Base
7
+
8
+ ####################################################################
9
+ VEIDS = ["170161"]
10
+ PRIVATE_DIR = "/vz/private"
11
+ BACKUP_DIR = "/cluster/dsk0/backup/vz"
12
+ # replace string __VEID__
13
+ EXCLUDES = ["/vz/private/__VEID__/usr/local/rails/tubebox/shared/movie"]
14
+ # replace string __VEID__
15
+ TAR_FILE_NAME = "__VEID__-#{Time.now.strftime("%Y%m%d")}.tar.gz"
16
+ ####################################################################
17
+
18
+ execute do
19
+ raise "PRIVATE_DIR not set" if PRIVATE_DIR.blank?
20
+ raise "BACKUP_DIR not set" if BACKUP_DIR.blank?
21
+
22
+ VEIDS.each do |veid|
23
+ vedir = "#{PRIVATE_DIR}/#{veid}"
24
+ backupdir = "#{BACKUP_DIR}/#{veid}/"
25
+ backupfile = "#{BACKUP_DIR}/#{veid}/#{TAR_FILE_NAME}".gsub(/__VEID__/,veid)
26
+ FileUtils.mkdir_p(backupdir)
27
+ (error "#{backupdir} not found";next) unless File.directory?(backupdir)
28
+ (error "veid #{veid} not found";next) unless File.exists?("#{PRIVATE_DIR}/#{veid}")
29
+ #(error "veid #{veid} still running";next) if ` /usr/sbin/vzlist #{veid}|/bin/grep running -c`.strip != "1"
30
+
31
+ exclude = ""
32
+ EXCLUDES.each{|exc| exclude += " --exclude=#{exc.gsub(/__VEID__/,veid)} "}
33
+
34
+ cmds = ["/usr/sbin/vzctl stop #{veid}",
35
+ "/bin/tar #{exclude} -cvzf #{backupfile} #{vedir} /etc/vz/conf/#{veid}.conf",
36
+ "/usr/sbin/vzctl start #{veid}"]
37
+
38
+ cmds.each do |cmd|
39
+ puts cmd
40
+ `#{cmd}` unless $DEBUG
41
+ end
42
+ end
43
+ end
44
+
45
+ __END__
46
+
47
+ original
48
+
49
+ VEID=$1
50
+ VEPRIVATEDIR=$2
51
+ TARFILENAME=$3
52
+
53
+ if [ "${VEID}" = "" ]; then
54
+ echo "usage: $0 <VEID> <VEPRIVATEDIR> <TAR FILE NAME>"
55
+ exit
56
+ fi
57
+ if [ "${VEPRIVATEDIR}" = "" ]; then
58
+ echo "usage: $0 <VEID> <VEPRIVATEDIR> <TAR FILE NAME>"
59
+ exit
60
+ fi
61
+ if [ "${TARFILENAME}" = "" ]; then
62
+ echo "usage: $0 <VEID> <VEPRIVATEDIR> <TAR FILE NAME>"
63
+ exit
64
+ fi
65
+
66
+ if [ ! -d ${VEPRIVATEDIR}/${VEID} ]; then
67
+ echo "error: VEID is not exist"
68
+ exit
69
+ fi
70
+
71
+ if [ ` /usr/sbin/vzlist ${VEID}|/bin/grep running -c` -gt 0 ]; then
72
+ echo "you must stop ve "
73
+ echo `/usr/sbin/vzlist ${VEID}|/bin/grep running`
74
+ exit
75
+ fi
76
+
77
+ #/bin/tar --ignore-failed-read --exclude=./mnt --exclude=./u01/mydata --exclude=./u01/mytmp --exclude=./u01/myarclog --exclude=./u01/mybackup --exclude=./u02/mydata --exclude=./u02/mytmp --exclude=./u02/myarclog --exclude=./u02/mybackup --exclude=./d01 --exclude=./var/spool/upgrade --exclude=./proc --exclude=./lost+found --exclude=./sys --exclude=./usr/local/vlmail/logs/history -cvzf ${TARFILENAME} /cluster/dsk0/vz/private/${VEID} /etc/vz/conf/${VEID}.conf
78
+ /bin/tar -cvzf ${TARFILENAME} ${VEPRIVATEDIR}/${VEID} /etc/vz/conf/${VEID}.conf
79
+
80
+ exit
@@ -0,0 +1,121 @@
1
+ require "forwardable"
2
+
3
+
4
+ module FlagSetMaker
5
+
6
+
7
+ class FlagSet
8
+
9
+ def initialize(mod, names, zero= nil)
10
+ @module= mod
11
+ @flag_names= names.to_a()
12
+ @zero_name= zero
13
+ for i in 0...@flag_names.size
14
+ mod.const_set(@flag_names[i], Flags.new(1 << i, self))
15
+ end
16
+ mod.const_set(@zero_name, Flags.new(0, self)) if @zero_name
17
+ end
18
+
19
+ def to_s(v)
20
+ names= []
21
+ @flag_names.each_with_index(){ |name, i| names.push(name) if v[i]==1 }
22
+ if names.empty?()
23
+ return (@zero_name.to_s() || "0")
24
+ elsif names.size==1
25
+ return names[0].to_s()
26
+ else
27
+ return "("+names.join("|")+")"
28
+ end
29
+ end
30
+
31
+ def inspect(v= nil)
32
+ return v ? format("%p::%s", @module, to_s(v)) : super()
33
+ end
34
+
35
+ def validate(v)
36
+ return v&((1 << @flag_names.size)-1)
37
+ end
38
+
39
+ end
40
+
41
+
42
+ class Flags
43
+
44
+ extend(Forwardable)
45
+
46
+ def initialize(v, fs)
47
+ @value= fs.validate(v)
48
+ @flag_set= fs
49
+ end
50
+
51
+ def to_i()
52
+ return @value
53
+ end
54
+
55
+ def to_s()
56
+ return @flag_set.to_s(@value)
57
+ end
58
+
59
+ def inspect()
60
+ return @flag_set.inspect(@value)
61
+ end
62
+
63
+ def ==(rhs)
64
+ return rhs.is_a?(Flags) && @flag_set==rhs.flag_set && @value==rhs.to_i()
65
+ end
66
+
67
+ alias :eql? :==
68
+
69
+ def_delegators(:to_i, :hash)
70
+
71
+ def &(rhs)
72
+ return new_flag(@value&rhs.to_i())
73
+ end
74
+
75
+ def |(rhs)
76
+ return new_flag(@value|rhs.to_i())
77
+ end
78
+
79
+ def ~()
80
+ return new_flag(~@value)
81
+ end
82
+
83
+ def include?(flags)
84
+ return (@value&flags.to_i())==flags.to_i()
85
+ end
86
+
87
+ def empty?()
88
+ return @value!=0
89
+ end
90
+
91
+ protected
92
+
93
+ attr_reader(:flag_set)
94
+
95
+ private
96
+
97
+ def new_flag(v)
98
+ return Flags.new(v, @flag_set)
99
+ end
100
+
101
+ end
102
+
103
+
104
+ def make_flag_set(*args)
105
+ FlagSet.new(self, *args)
106
+ end
107
+
108
+ end
109
+
110
+
111
+ if __FILE__==$0
112
+
113
+ class Hoge
114
+
115
+ extend(FlagSetMaker)
116
+
117
+ make_flag_set([:FOO, :BAR, :HOGE], :NONE)
118
+
119
+ end
120
+
121
+ end
data/vendor/moji.rb ADDED
@@ -0,0 +1,502 @@
1
+ #このファイルの文字コードはUTF-8です。
2
+ #このファイルをUnicode非対応のエディタで編集してはいけません(〜が文字化ける)。
3
+
4
+ =begin
5
+
6
+ =Moji モジュール
7
+
8
+ 日本語の文字種判定、文字種変換(半角→全角、ひらがな→カタカナなど)を行います。
9
+
10
+ ==インストール:
11
+
12
+ 解凍してできた moji ディレクトリの中で以下のコマンドを実行してください。
13
+
14
+ # ruby setup.rb
15
+
16
+ または、 moji/lib の中の moji.rb と flag_set_maker.rb を lib/ruby/site_ruby/1.8 にコピーしてください。
17
+
18
+ ==使い方:
19
+
20
+ (({$KCODE})) を指定してから (({require "moji"})) してください。
21
+ Moji モジュールの関数に渡す文字列の文字コードは (({$KCODE})) と一致させてください。
22
+
23
+ $KCODE= "UTF8"
24
+ require "moji"
25
+
26
+ #文字種判定。
27
+ p Moji.type("漢") # => Moji::ZEN_KANJI
28
+ p Moji.type?("A", Moji::ZEN) # => true
29
+
30
+ #文字種変換。
31
+ p Moji.zen_to_han("Ruby") # => "Ruby"
32
+ p Moji.upcase("Ruby") # => "RUBY"
33
+ p Moji.kata_to_hira("ルビー") # => "るびー"
34
+
35
+ #文字種による正規表現。
36
+ p /#{Moji.kata}+#{Moji.hira}+/ =~ "ぼくドラえもん" # => 6
37
+ p Regexp.last_match.to_s # => "ドラえもん"
38
+
39
+ ==定数:
40
+
41
+ 以下の定数は、文字種の一番細かい分類です。
42
+ (({Moji.type})) が返すのは、以下の定数のうちの1つです。
43
+
44
+ --- HAN_CONTROL
45
+ 制御文字。
46
+ --- HAN_ASYMBOL
47
+ ASCIIに含まれる半角記号。
48
+ --- HAN_JSYMBOL
49
+ JISに含まれるがASCIIには含まれない半角記号。
50
+ --- HAN_NUMBER
51
+ 半角数字。
52
+ --- HAN_UPPER
53
+ 半角アルファベット大文字。
54
+ --- HAN_LOWER
55
+ 半角アルファベット小文字。
56
+ --- HAN_KATA
57
+ 半角カタカナ。
58
+ --- ZEN_ASYMBOL
59
+ JISの全角記号のうち、ASCIIに対応する半角記号があるもの。
60
+ --- ZEN_JSYMBOL
61
+ JISの全角記号のうち、ASCIIに対応する半角記号がないもの。
62
+ --- ZEN_NUMBER
63
+ 全角数字。
64
+ --- ZEN_UPPER
65
+ 全角アルファベット大文字。
66
+ --- ZEN_LOWER
67
+ 全角アルファベット小文字。
68
+ --- ZEN_HIRA
69
+ ひらがな。
70
+ --- ZEN_KATA
71
+ 全角カタカナ。
72
+ --- ZEN_GREEK
73
+ ギリシャ文字。
74
+ --- ZEN_CYRILLIC
75
+ キリル文字。
76
+ --- ZEN_LINE
77
+ 罫線のかけら。
78
+ --- ZEN_KANJI
79
+ 漢字。
80
+
81
+ 以下の定数は、上の文字種の組み合わせと別名です。
82
+
83
+ --- HAN_SYMBOL
84
+ JISに含まれる半角記号。(({HAN_ASYMBOL | HAN_JSYMBOL}))
85
+ --- HAN_ALPHA
86
+ 半角アルファベット。(({HAN_UPPER | HAN_LOWER}))
87
+ --- HAN_ALNUM
88
+ 半角英数字。(({HAN_ALPHA | HAN_NUMBER}))
89
+ --- HAN
90
+ 全ての半角文字。(({HAN_CONTROL | HAN_SYMBOL | HAN_ALNUM | HAN_KATA}))
91
+ --- ZEN_SYMBOL
92
+ JISに含まれる全角記号。(({ZEN_ASYMBOL | ZEN_JSYMBOL}))
93
+ --- ZEN_ALPHA
94
+ 全角アルファベット。(({ZEN_UPPER | ZEN_LOWER}))
95
+ --- ZEN_ALNUM
96
+ 全角英数字。(({ZEN_ALPHA | ZEN_NUMBER}))
97
+ --- ZEN_KANA
98
+ 全角かな/カナ。(({ZEN_KATA | ZEN_HIRA}))
99
+ --- ZEN
100
+ JISに含まれる全ての全角文字。(({ZEN_SYMBOL | ZEN_ALNUM | ZEN_KANA | ZEN_GREEK | ZEN_CYRILLIC | ZEN_LINE | ZEN_KANJI}))
101
+ --- ASYMBOL
102
+ ASCIIに含まれる半角記号とその全角版。(({HAN_ASYMBOL | ZEN_ASYMBOL}))
103
+ --- JSYMBOL
104
+ JISに含まれるが (({ASYMBOL})) には含まれない全角/半角記号。(({HAN_JSYMBOL | ZEN_JSYMBOL}))
105
+ --- SYMBOL
106
+ JISに含まれる全ての全角/半角記号。(({HAN_SYMBOL | ZEN_SYMBOL}))
107
+ --- NUMBER
108
+ 全角/半角数字。(({HAN_NUMBER | ZEN_NUMBER}))
109
+ --- UPPER
110
+ 全角/半角アルファベット大文字。(({HAN_UPPER | ZEN_UPPER}))
111
+ --- LOWER
112
+ 全角/半角アルファベット小文字。(({HAN_LOWER | ZEN_LOWER}))
113
+ --- ALPHA
114
+ 全角/半角アルファベット。(({HAN_ALPHA | ZEN_ALPHA}))
115
+ --- ALNUM
116
+ 全角/半角英数字。(({HAN_ALNUM | ZEN_ALNUM}))
117
+ --- HIRA
118
+ (({ZEN_HIRA})) の別名。
119
+ --- KATA
120
+ 全角/半角カタカナ。(({HAN_KATA | ZEN_KATA}))
121
+ --- KANA
122
+ 全角/半角 かな/カナ。(({KATA | ZEN_HIRA}))
123
+ --- GREEK
124
+ (({ZEN_GREEK})) の別名。
125
+ --- CYRILLIC
126
+ (({ZEN_CYRILLIC})) の別名。
127
+ --- LINE
128
+ (({ZEN_LINE})) の別名。
129
+ --- KANJI
130
+ (({ZEN_KANJI})) の別名。
131
+ --- ALL
132
+ 上記全ての文字。
133
+
134
+ ==モジュール関数:
135
+
136
+ --- Moji.type(ch)
137
+
138
+ 文字 ((|ch|)) の文字種を返します。
139
+
140
+ 「一番細かい分類」の((<定数|定数:>))のうち1つを返します。
141
+
142
+ 上の分類に当てはまらない文字(Unicodeのハングルなど)に対しては (({nil})) を返します。
143
+ また、UnicodeのB面以降の文字に対しても (({nil})) を返します。
144
+
145
+ 文字が割り当てられていない文字コードに対する結果は不定です( (({nil})) を返す事もあります)。
146
+
147
+ p Moji.type("漢") # => Moji::ZEN_KANJI
148
+
149
+ --- Moji.type?(ch, type)
150
+
151
+ 文字 ((|ch|)) が文字種 ((|type|)) に含まれれば、 (({true})) を返します。
152
+
153
+ ((|type|)) には全ての((<定数|定数:>))と、それらを (({|}))
154
+ で結んだものを使えます。
155
+
156
+ p Moji.type?("A", Moji::ZEN) # => true
157
+
158
+ --- Moji.regexp(type)
159
+
160
+ 文字種 ((|type|)) の1文字を表す正規表現を返します。
161
+
162
+ ((|type|)) には全ての((<定数|定数:>))と、それらを (({|}))
163
+ で結んだものを使えます。
164
+
165
+ p Moji.regexp(Moji::HIRA) # => /[ぁ-ん]/
166
+
167
+ --- Moji.zen_to_han(str[, type])
168
+
169
+ 文字列 ((|str|)) の全角を半角に変換して返します。
170
+
171
+ ((|type|)) には、変換対象とする文字種を((<定数|定数:>))で指定します。
172
+ デフォルトは (({ALL})) (全て)です。
173
+
174
+ p Moji.zen_to_han("Ruby!?") # => "Ruby!?"
175
+ p Moji.zen_to_han("Ruby!?", Moji::ALPHA) # => "Ruby!?"
176
+
177
+ --- Moji.han_to_zen(str[, type])
178
+
179
+ 文字列 ((|str|)) の半角を全角に変換して返します。
180
+
181
+ ((|type|)) には、変換対象とする文字種を((<定数|定数:>))で指定します。
182
+ デフォルトは (({ALL})) (全て)です。
183
+
184
+ p Moji.han_to_zen("Ruby!?") # => "Ruby!?"
185
+ p Moji.han_to_zen("Ruby!?", Moji::SYMBOL) # => "Ruby!?"
186
+
187
+ --- Moji.normalize_zen_han(str)
188
+
189
+ 文字列 ((|str|)) の大文字、小文字を一般的なものに統一します。
190
+
191
+ 具体的には、ASCIIに含まれる記号と英数字( (({ALNUM|ASYMBOL}))
192
+ )を半角に、それ以外の記号とカタカナ( (({JSYMBOL|HAN_KATA})) )を全角に変換します。
193
+
194
+ --- Moji.upcase(str[, type])
195
+
196
+ 文字列 ((|str|)) の小文字を大文字に変換して返します。
197
+
198
+ ((|type|)) には、変換対象とする文字種を((<定数|定数:>))で指定します。
199
+ デフォルトは (({LOWER})) (全角/半角のアルファベット)です。
200
+ ギリシャ文字、キリル文字には対応していません。
201
+
202
+ p Moji.upcase("Ruby") # => "RUBY"
203
+
204
+ --- Moji.downcase(str[, type])
205
+
206
+ 文字列 ((|str|)) の小文字を大文字に変換して返します。
207
+
208
+ ((|type|)) には、変換対象とする文字種を((<定数|定数:>))で指定します。
209
+ デフォルトは (({UPPER})) (全角/半角のアルファベット)です。
210
+ ギリシャ文字、キリル文字には対応していません。
211
+
212
+ p Moji.downcase("Ruby") # => "ruby"
213
+
214
+ --- Moji.kata_to_hira(str)
215
+
216
+ 文字列 ((|str|)) の全角カタカナをひらがなに変換して返します。
217
+
218
+ 半角カタカナは直接変換できません。 (({han_to_zen})) で全角にしてから変換してください。
219
+
220
+ p Moji.kata_to_hira("ルビー") # => "るびー"
221
+
222
+ --- Moji.hira_to_kata(str)
223
+
224
+ 文字列 ((|str|)) のひらがなを全角カタカナに変換して返します。
225
+
226
+ p Moji.hira_to_kata("るびー") # => "ルビー"
227
+
228
+ --- Moji.han_control
229
+ --- Moji.han_asymbol
230
+ --- ...
231
+ --- Moji.kana
232
+ --- ...
233
+
234
+ ((<定数|定数:>))それぞれに対応するメソッドが有り、
235
+ それぞれの文字種の1文字を表す正規表現を返します。
236
+
237
+ 例えば、 (({Moji.kana})) は (({Moji.regexp(Moji::KANA)})) と同じです。
238
+
239
+ 以下の例のように、文字クラスっぽく使えます。
240
+ p /#{Moji.kata}+#{Moji.hira}+/ =~ "ぼくドラえもん" # => 6
241
+ p Regexp.last_match.to_s # => "ドラえもん"
242
+
243
+ ==動作環境:
244
+
245
+ たぶんRuby 1.8以降。
246
+
247
+ FreeBSD Ruby 1.8.5にて動作確認しました。
248
+
249
+ ==置き場所/連絡先:
250
+
251
+ 置き場所: ((<URL:http://gimite.ddo.jp/pukiwiki/index.php?Ruby%BE%AE%CA%AA%BD%B8>))
252
+
253
+ 作者: Gimite 市川 (連絡先: ((<URL:http://gimite.ddo.jp/bbs/tnote.cgi>)) )
254
+
255
+ ==ライセンス:
256
+
257
+ Public Domainです。煮るなり焼くなりご自由に。
258
+
259
+ ==更新履歴:
260
+
261
+ 2006/7/23 Ver.1.3
262
+ *半角中黒(・)の字種判別、全角中黒との相互変換ができていなかったのを修正。(thanks to xyzzyさん)
263
+
264
+ 2006/10/5 Ver.1.2
265
+ *EUC 以外の文字コードにも対応し、ライブラリ名を Moji に変更。
266
+ *han_to_zen, zen_to_han の対象文字種のデフォルトを全て( (({ALL})) )に。
267
+ *normalize_zen_han 追加。
268
+
269
+ 2005/1/3 Ver.1.1
270
+ *(({$KCODE})) が指定されていないとEUCUtil.typeが正常動作しない問題を修正。
271
+ *定数に (({ASYMBOL})) と (({JSYMBOL})) を追加。
272
+
273
+ 2004/11/16 Ver.1.0
274
+ *EUCUtil 公開。
275
+
276
+ =end
277
+
278
+
279
+ if $KCODE=="NONE"
280
+ warn("Warning: Set $KCODE before requiring 'moji' (UTF8 assumed)")
281
+ $KCODE= "u"
282
+ end
283
+
284
+ require "nkf"
285
+ require "jcode"
286
+ require "enumerator"
287
+ require "vendor/flag_set_maker"
288
+
289
+ nkf_kcode= {"SJIS" => "s", "EUC" => "e"}[$KCODE]
290
+
291
+ script= <<'EOS'
292
+
293
+
294
+ module Moji
295
+
296
+ extend(FlagSetMaker)
297
+
298
+ module Detail
299
+
300
+ HAN_ASYMBOL_LIST= ' !"#$%&\'()*+,-./:;<=>?@[\]^_`{|}~'
301
+ # ZEN_ASYMBOL_LIST= ' !”#$%&’()*+,-./:;<=>?@[¥]^_‘{|} ̄' # Keystone replaced
302
+ ZEN_ASYMBOL_LIST= ' !”#$%&’()*+,-./:;<=>?@[¥]^_‘{|}~'
303
+ HAN_JSYMBOL1_LIST= '。「」、ー゙゚・'
304
+ ZEN_JSYMBOL1_LIST= '。「」、ー゛゜・'
305
+ ZEN_JSYMBOL_LIST= '、。・゛゜´`¨ヽヾゝゞ〃仝々〆〇ー―‐\~〜∥…‥“〔〕〈〉《》「」『』【】'+
306
+ '±×÷≠≦≧∞∴♂♀°′″℃¢£§☆★○●◎◇◇◆□■△▲▽▼※〒→←↑↓〓'
307
+ HAN_KATA_LIST= 'ハヒフヘホウカキクケコサシスセソタチツテトアイエオナニヌネノマミムメモヤユヨラリルレロワヲンァィゥェォャュョッ'.split(//)
308
+ HAN_VSYMBOLS= ['', '゙', '゚']
309
+ ZEN_KATA_LISTS= [
310
+ 'ハヒフヘホウカキクケコサシスセソタチツテトアイエオ'+
311
+ 'ナニヌネノマミムメモヤユヨラリルレロワヲンァィゥェォャュョッ',
312
+ 'バビブベボヴガギグゲゴザジズゼゾダヂヅデド',
313
+ 'パピプペポ',
314
+ ].map(){ |s| s.split(//) }
315
+
316
+ end
317
+
318
+ def self.uni_range(*args)
319
+ if $KCODE=="UTF8"
320
+ str= args.map(){ |n| NKF.nkf("-wW160x", [n].pack("n")) }.
321
+ enum_slice(2).map(){ |f, e| "#{f}-#{e}" }.to_s()
322
+ return /[#{str}]/u
323
+ else
324
+ return nil
325
+ end
326
+ end
327
+
328
+ make_flag_set([
329
+ :HAN_CONTROL, :HAN_ASYMBOL, :HAN_JSYMBOL, :HAN_NUMBER, :HAN_UPPER, :HAN_LOWER, :HAN_KATA,
330
+ :ZEN_ASYMBOL, :ZEN_JSYMBOL, :ZEN_NUMBER, :ZEN_UPPER, :ZEN_LOWER, :ZEN_HIRA, :ZEN_KATA,
331
+ :ZEN_GREEK, :ZEN_CYRILLIC, :ZEN_LINE, :ZEN_KANJI,
332
+ ])
333
+
334
+ HAN_SYMBOL= HAN_ASYMBOL | HAN_JSYMBOL
335
+ HAN_ALPHA= HAN_UPPER | HAN_LOWER
336
+ HAN_ALNUM= HAN_ALPHA | HAN_NUMBER
337
+ HAN= HAN_CONTROL | HAN_SYMBOL | HAN_ALNUM | HAN_KATA
338
+ ZEN_SYMBOL= ZEN_ASYMBOL | ZEN_JSYMBOL
339
+ ZEN_ALPHA= ZEN_UPPER | ZEN_LOWER
340
+ ZEN_ALNUM= ZEN_ALPHA | ZEN_NUMBER
341
+ ZEN_KANA= ZEN_KATA | ZEN_HIRA
342
+ ZEN= ZEN_SYMBOL | ZEN_ALNUM | ZEN_KANA | ZEN_GREEK | ZEN_CYRILLIC | ZEN_LINE | ZEN_KANJI
343
+ ASYMBOL= HAN_ASYMBOL | ZEN_ASYMBOL
344
+ JSYMBOL= HAN_JSYMBOL | ZEN_JSYMBOL
345
+ SYMBOL= HAN_SYMBOL | ZEN_SYMBOL
346
+ NUMBER= HAN_NUMBER | ZEN_NUMBER
347
+ UPPER= HAN_UPPER | ZEN_UPPER
348
+ LOWER= HAN_LOWER | ZEN_LOWER
349
+ ALPHA= HAN_ALPHA | ZEN_ALPHA
350
+ ALNUM= HAN_ALNUM | ZEN_ALNUM
351
+ HIRA= ZEN_HIRA
352
+ KATA= HAN_KATA | ZEN_KATA
353
+ KANA= KATA | ZEN_HIRA
354
+ GREEK= ZEN_GREEK
355
+ CYRILLIC= ZEN_CYRILLIC
356
+ LINE= ZEN_LINE
357
+ KANJI= ZEN_KANJI
358
+ ALL= HAN | ZEN
359
+
360
+ CHAR_REGEXPS= {
361
+ HAN_CONTROL => /[\x00-\x1f\x7f]/,
362
+ HAN_ASYMBOL =>
363
+ Regexp.new("["+Detail::HAN_ASYMBOL_LIST.gsub(/[\[\]\-\^\\]/){ "\\"+$& }+"]"),
364
+ HAN_JSYMBOL => Regexp.new("["+Detail::HAN_JSYMBOL1_LIST+"]"),
365
+ HAN_NUMBER => /[0-9]/,
366
+ HAN_UPPER => /[A-Z]/,
367
+ HAN_LOWER => /[a-z]/,
368
+ HAN_KATA => /[ヲ-ッア-ン]/,
369
+ ZEN_ASYMBOL => Regexp.new("["+Detail::ZEN_ASYMBOL_LIST+"]"),
370
+ ZEN_JSYMBOL => Regexp.new("["+Detail::ZEN_JSYMBOL_LIST+"]"),
371
+ ZEN_NUMBER => /[0-9]/,
372
+ ZEN_UPPER => /[A-Z]/,
373
+ ZEN_LOWER => /[a-z]/,
374
+ ZEN_HIRA => /[ぁ-ん]/,
375
+ ZEN_KATA => /[ァ-ヶ]/,
376
+ ZEN_GREEK => /[Α-Ωα-ω]/,
377
+ ZEN_CYRILLIC => /[А-Яа-я]/,
378
+ ZEN_LINE => uni_range(0x2570, 0x25ff) || /[─-╂]/,
379
+ ZEN_KANJI => uni_range(0x3400, 0x9fff, 0xf900, 0xfaff) || /[亜-瑤]/,
380
+ }
381
+
382
+ def type(ch)
383
+ ch=~/^./
384
+ ch= $&
385
+ for tp, reg in CHAR_REGEXPS
386
+ return tp if ch=~reg
387
+ end
388
+ return nil
389
+ end
390
+
391
+ def type?(ch, tp)
392
+ return tp.include?(type(ch))
393
+ end
394
+
395
+ def regexp(tp)
396
+ regs= []
397
+ for tp2, reg in CHAR_REGEXPS
398
+ regs.push(reg) if tp.include?(tp2)
399
+ end
400
+ return regs.size==1 ? regs[0] : Regexp.new(regs.join("|"))
401
+ end
402
+
403
+ def zen_to_han(str, tp= ALL)
404
+ if tp.include?(ZEN_KATA)
405
+ reg= Regexp.new("["+Detail::ZEN_KATA_LISTS.to_s()+"]")
406
+ str= str.gsub(reg) do
407
+ for i in 0...3
408
+ pos= Detail::ZEN_KATA_LISTS[i].index($&)
409
+ break Detail::HAN_KATA_LIST[pos]+Detail::HAN_VSYMBOLS[i] if pos
410
+ end
411
+ end
412
+ end
413
+ str= str.tr("a-z", "a-z") if tp.include?(ZEN_LOWER)
414
+ str= str.tr("A-Z", "A-Z") if tp.include?(ZEN_UPPER)
415
+ str= str.tr("0-9", "0-9") if tp.include?(ZEN_NUMBER)
416
+ str= str.tr(Detail::ZEN_ASYMBOL_LIST,
417
+ Detail::HAN_ASYMBOL_LIST.gsub(/[\-\^\\]/){ "\\"+$& }) if tp.include?(ZEN_ASYMBOL)
418
+ str= str.tr(Detail::ZEN_JSYMBOL1_LIST,
419
+ Detail::HAN_JSYMBOL1_LIST) if tp.include?(ZEN_JSYMBOL)
420
+ return str
421
+ end
422
+
423
+ def han_to_zen(str, tp= ALL)
424
+ #[半]濁音記号がJSYMBOLに含まれるので、KATAの変換をJSYMBOLより前にやる必要あり。
425
+ if tp.include?(HAN_KATA)
426
+ str= str.gsub(/(#{han_kata})([゙゚]?)/) do
427
+ i= {""=>0, "゙"=>1, "゚"=>2}[$2]
428
+ pos= Detail::HAN_KATA_LIST.index($1)
429
+ s= Detail::ZEN_KATA_LISTS[i][pos]
430
+ (!s || s=="") ? Detail::ZEN_KATA_LISTS[0][pos]+$2 : s
431
+ end
432
+ end
433
+ str= str.tr("a-z", "a-z") if tp.include?(HAN_LOWER)
434
+ str= str.tr("A-Z", "A-Z") if tp.include?(HAN_UPPER)
435
+ str= str.tr("0-9", "0-9") if tp.include?(HAN_NUMBER)
436
+ str= str.tr(Detail::HAN_ASYMBOL_LIST.gsub(/[\-\^\\]/){ "\\"+$& },
437
+ Detail::ZEN_ASYMBOL_LIST) if tp.include?(HAN_ASYMBOL)
438
+ str= str.tr(Detail::HAN_JSYMBOL1_LIST,
439
+ Detail::ZEN_JSYMBOL1_LIST) if tp.include?(HAN_JSYMBOL)
440
+ return str
441
+ end
442
+
443
+ def normalize_zen_han(str)
444
+ return zen_to_han(han_to_zen(str, HAN_JSYMBOL|HAN_KATA), ZEN_ALNUM|ZEN_ASYMBOL)
445
+ end
446
+
447
+ def upcase(str, tp= LOWER)
448
+ str= str.tr("a-z", "A-Z") if tp.include?(HAN_LOWER)
449
+ str= str.tr("a-z", "A-Z") if tp.include?(ZEN_LOWER)
450
+ end
451
+
452
+ def downcase(str, tp= UPPER)
453
+ str= str.tr("A-Z", "a-z") if tp.include?(HAN_UPPER)
454
+ str= str.tr("A-Z", "a-z") if tp.include?(ZEN_UPPER)
455
+ end
456
+
457
+ def kata_to_hira(str)
458
+ return str.tr("ァ-ン", "ぁ-ん")
459
+ end
460
+
461
+ def hira_to_kata(str)
462
+ return str.tr("ぁ-ん", "ァ-ン")
463
+ end
464
+
465
+ module_function(
466
+ :type, :type?, :regexp, :zen_to_han, :han_to_zen, :normalize_zen_han, :upcase, :downcase,
467
+ :kata_to_hira, :hira_to_kata
468
+ )
469
+
470
+ def self.define_regexp_method(name, tp)
471
+ define_method(name){ regexp(tp) }
472
+ module_function(name)
473
+ end
474
+
475
+ #han_control, han_asymbol, …などのモジュール関数を定義。
476
+ for cons in constants
477
+ val= const_get(cons)
478
+ define_regexp_method(cons.downcase(), val) if val.is_a?(FlagSetMaker::Flags)
479
+ end
480
+
481
+ def self.test()
482
+ str= "ドラえもん(Doraemon)は、日本で1番有名な漫画だ。"
483
+ str.each_char() do |ch|
484
+ printf("%2s %s\n", ch, Moji.type(ch))
485
+ end
486
+ str= Moji.zen_to_han(str, Moji::ALL)
487
+ puts(str)
488
+ str= Moji.han_to_zen(str, Moji::ALL)
489
+ puts(str)
490
+ end
491
+
492
+ end
493
+
494
+ EOS
495
+
496
+ script= NKF.nkf("-#{nkf_kcode}Wx", script) if nkf_kcode
497
+ #UTF-8の場合、nkfしてはいけない(~が〜になるので)。
498
+ eval(script, TOPLEVEL_BINDING)
499
+
500
+ if __FILE__==$0
501
+ Moji.test()
502
+ end