keystone 0.0.29
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.
- data/.gitignore +3 -0
- data/README +3 -0
- data/Rakefile +26 -0
- data/VERSION +1 -0
- data/doc/classes/Dir.html +139 -0
- data/doc/classes/Dir.src/M000003.html +25 -0
- data/doc/classes/FlagSetMaker.html +138 -0
- data/doc/classes/FlagSetMaker.src/M000018.html +18 -0
- data/doc/classes/FlagSetMaker/FlagSet.html +186 -0
- data/doc/classes/FlagSetMaker/FlagSet.src/M000019.html +24 -0
- data/doc/classes/FlagSetMaker/FlagSet.src/M000020.html +26 -0
- data/doc/classes/FlagSetMaker/FlagSet.src/M000021.html +18 -0
- data/doc/classes/FlagSetMaker/FlagSet.src/M000022.html +18 -0
- data/doc/classes/FlagSetMaker/Flags.html +304 -0
- data/doc/classes/FlagSetMaker/Flags.src/M000023.html +19 -0
- data/doc/classes/FlagSetMaker/Flags.src/M000024.html +18 -0
- data/doc/classes/FlagSetMaker/Flags.src/M000025.html +18 -0
- data/doc/classes/FlagSetMaker/Flags.src/M000026.html +18 -0
- data/doc/classes/FlagSetMaker/Flags.src/M000027.html +18 -0
- data/doc/classes/FlagSetMaker/Flags.src/M000029.html +18 -0
- data/doc/classes/FlagSetMaker/Flags.src/M000030.html +18 -0
- data/doc/classes/FlagSetMaker/Flags.src/M000031.html +18 -0
- data/doc/classes/FlagSetMaker/Flags.src/M000032.html +18 -0
- data/doc/classes/FlagSetMaker/Flags.src/M000033.html +18 -0
- data/doc/classes/Hoge.html +113 -0
- data/doc/classes/Keystone.html +174 -0
- data/doc/classes/Keystone/Base.html +191 -0
- data/doc/classes/Keystone/Base.src/M000054.html +22 -0
- data/doc/classes/Keystone/Base.src/M000055.html +18 -0
- data/doc/classes/Keystone/Base.src/M000056.html +25 -0
- data/doc/classes/Keystone/Base.src/M000057.html +18 -0
- data/doc/classes/Keystone/Base.src/M000058.html +20 -0
- data/doc/classes/Keystone/Batch.html +115 -0
- data/doc/classes/Keystone/Batch/Base.html +208 -0
- data/doc/classes/Keystone/Batch/Base.src/M000052.html +54 -0
- data/doc/classes/Keystone/Batch/Base.src/M000053.html +30 -0
- data/doc/classes/Keystone/CoreExt.html +105 -0
- data/doc/classes/Keystone/Mail.html +115 -0
- data/doc/classes/Keystone/Mail/Send.html +171 -0
- data/doc/classes/Keystone/Mail/Send.src/M000034.html +18 -0
- data/doc/classes/Keystone/Mail/Send.src/M000035.html +42 -0
- data/doc/classes/Keystone/Mail/Send.src/M000036.html +18 -0
- data/doc/classes/Keystone/Os.html +184 -0
- data/doc/classes/Keystone/Os.src/M000037.html +18 -0
- data/doc/classes/Keystone/Os.src/M000038.html +27 -0
- data/doc/classes/Keystone/Os/AbstractOs.html +227 -0
- data/doc/classes/Keystone/Os/AbstractOs.src/M000046.html +17 -0
- data/doc/classes/Keystone/Os/AbstractOs.src/M000047.html +17 -0
- data/doc/classes/Keystone/Os/AbstractOs.src/M000048.html +17 -0
- data/doc/classes/Keystone/Os/AbstractOs.src/M000049.html +17 -0
- data/doc/classes/Keystone/Os/AbstractOs.src/M000050.html +17 -0
- data/doc/classes/Keystone/Os/AbstractOs.src/M000051.html +25 -0
- data/doc/classes/Keystone/Os/Centos.html +113 -0
- data/doc/classes/Keystone/Os/Darwin.html +139 -0
- data/doc/classes/Keystone/Os/Darwin.src/M000039.html +18 -0
- data/doc/classes/Keystone/Os/Linux.html +139 -0
- data/doc/classes/Keystone/Os/Linux.src/M000045.html +26 -0
- data/doc/classes/Keystone/Os/Osx.html +113 -0
- data/doc/classes/Keystone/Os/Unix.html +199 -0
- data/doc/classes/Keystone/Os/Unix.src/M000040.html +27 -0
- data/doc/classes/Keystone/Os/Unix.src/M000041.html +18 -0
- data/doc/classes/Keystone/Os/Unix.src/M000042.html +18 -0
- data/doc/classes/Keystone/Os/Unix.src/M000043.html +18 -0
- data/doc/classes/Keystone/Os/Unix.src/M000044.html +18 -0
- data/doc/classes/Keystone/Rails.html +105 -0
- data/doc/classes/Keystone/StringUtil.html +226 -0
- data/doc/classes/Keystone/StringUtil.src/M000059.html +43 -0
- data/doc/classes/Keystone/StringUtil.src/M000060.html +25 -0
- data/doc/classes/Keystone/StringUtil.src/M000061.html +24 -0
- data/doc/classes/Keystone/StringUtil.src/M000062.html +18 -0
- data/doc/classes/Keystone/StringUtil.src/M000063.html +21 -0
- data/doc/classes/Object.html +240 -0
- data/doc/classes/Object.src/M000012.html +18 -0
- data/doc/classes/Object.src/M000013.html +20 -0
- data/doc/classes/Object.src/M000014.html +18 -0
- data/doc/classes/Object.src/M000015.html +18 -0
- data/doc/classes/Object.src/M000016.html +18 -0
- data/doc/classes/Object.src/M000017.html +19 -0
- data/doc/classes/Tempfile.html +139 -0
- data/doc/classes/Tempfile.src/M000011.html +25 -0
- data/doc/classes/TestCoreExt.html +152 -0
- data/doc/classes/TestCoreExt.src/M000009.html +17 -0
- data/doc/classes/TestCoreExt.src/M000010.html +21 -0
- data/doc/classes/TestStringUtilBase.html +197 -0
- data/doc/classes/TestStringUtilBase.src/M000004.html +17 -0
- data/doc/classes/TestStringUtilBase.src/M000005.html +23 -0
- data/doc/classes/TestStringUtilBase.src/M000006.html +22 -0
- data/doc/classes/TestStringUtilBase.src/M000007.html +25 -0
- data/doc/classes/TestStringUtilBase.src/M000008.html +34 -0
- data/doc/classes/Uri.html +158 -0
- data/doc/classes/Uri.src/M000001.html +18 -0
- data/doc/classes/Uri.src/M000002.html +18 -0
- data/doc/created.rid +1 -0
- data/doc/files/example/batch_sample_rb.html +134 -0
- data/doc/files/example/os_rb.html +109 -0
- data/doc/files/example/string_util_rb.html +109 -0
- data/doc/files/lib/keystone/base_rb.html +101 -0
- data/doc/files/lib/keystone/batch/base_rb.html +108 -0
- data/doc/files/lib/keystone/batch_rb.html +101 -0
- data/doc/files/lib/keystone/core_ext/array_rb.html +101 -0
- data/doc/files/lib/keystone/core_ext/blank_rb.html +101 -0
- data/doc/files/lib/keystone/core_ext/dir_rb.html +101 -0
- data/doc/files/lib/keystone/core_ext/object_rb.html +101 -0
- data/doc/files/lib/keystone/core_ext/tempfile_rb.html +108 -0
- data/doc/files/lib/keystone/core_ext/uri_rb.html +101 -0
- data/doc/files/lib/keystone/core_ext_rb.html +113 -0
- data/doc/files/lib/keystone/mail/send_rb.html +115 -0
- data/doc/files/lib/keystone/mail_rb.html +101 -0
- data/doc/files/lib/keystone/os/abstract_os_rb.html +101 -0
- data/doc/files/lib/keystone/os/centos_rb.html +101 -0
- data/doc/files/lib/keystone/os/darwin_rb.html +101 -0
- data/doc/files/lib/keystone/os/linux_rb.html +101 -0
- data/doc/files/lib/keystone/os/osx_rb.html +101 -0
- data/doc/files/lib/keystone/os/unix_rb.html +101 -0
- data/doc/files/lib/keystone/os_rb.html +108 -0
- data/doc/files/lib/keystone/string_util_rb.html +101 -0
- data/doc/files/lib/keystone_rb.html +116 -0
- data/doc/files/test/test_core_ext_rb.html +110 -0
- data/doc/files/test/test_string_util_rb.html +112 -0
- data/doc/files/vendor/flag_set_maker_rb.html +108 -0
- data/doc/files/vendor/moji_rb.html +118 -0
- data/doc/fr_class_index.html +52 -0
- data/doc/fr_file_index.html +54 -0
- data/doc/fr_method_index.html +89 -0
- data/doc/index.html +24 -0
- data/doc/rdoc-style.css +208 -0
- data/example/batch_sample.rb +24 -0
- data/example/os.rb +4 -0
- data/example/sendmail.rb +21 -0
- data/example/string_util.rb +15 -0
- data/keystone.gemspec +209 -0
- data/lib/keystone.rb +25 -0
- data/lib/keystone/base.rb +75 -0
- data/lib/keystone/batch.rb +5 -0
- data/lib/keystone/batch/base.rb +217 -0
- data/lib/keystone/core_ext.rb +18 -0
- data/lib/keystone/core_ext/array.rb +29 -0
- data/lib/keystone/core_ext/blank.rb +44 -0
- data/lib/keystone/core_ext/dir.rb +16 -0
- data/lib/keystone/core_ext/ipaddr.rb +18 -0
- data/lib/keystone/core_ext/object.rb +34 -0
- data/lib/keystone/core_ext/tempfile.rb +14 -0
- data/lib/keystone/core_ext/uri.rb +14 -0
- data/lib/keystone/mail.rb +8 -0
- data/lib/keystone/mail/address.rb +92 -0
- data/lib/keystone/mail/content_type.rb +60 -0
- data/lib/keystone/mail/message.rb +102 -0
- data/lib/keystone/mail/message_factory.rb +18 -0
- data/lib/keystone/mail/message_iso2022jp.rb +126 -0
- data/lib/keystone/mail/message_sjis.rb +23 -0
- data/lib/keystone/mail/receive.rb +320 -0
- data/lib/keystone/mail/send.rb +83 -0
- data/lib/keystone/os.rb +26 -0
- data/lib/keystone/os/abstract_os.rb +36 -0
- data/lib/keystone/os/centos.rb +6 -0
- data/lib/keystone/os/darwin.rb +9 -0
- data/lib/keystone/os/linux.rb +15 -0
- data/lib/keystone/os/osx.rb +18 -0
- data/lib/keystone/os/unix.rb +43 -0
- data/lib/keystone/string_util.rb +85 -0
- data/test/test_core_ext.rb +15 -0
- data/test/test_string_util.rb +60 -0
- data/util/README +1 -0
- data/util/bin/command_broadcast.rb +137 -0
- data/util/bin/disk_size_check.rb +54 -0
- data/util/bin/notice +93 -0
- data/util/bin/ve2tar.rb +80 -0
- data/vendor/flag_set_maker.rb +121 -0
- data/vendor/moji.rb +502 -0
- 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
|
+
|
data/util/bin/ve2tar.rb
ADDED
|
@@ -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
|