color-japanese 1.0.0
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/CHANGELOG.txt +3 -0
- data/History.txt +3 -0
- data/Manifest.txt +37 -0
- data/README.txt +123 -0
- data/Rakefile +123 -0
- data/bin/jcolorc +119 -0
- data/examples/Rakefile +57 -0
- data/examples/color-test.html.in +57 -0
- data/examples/color2html.rb +173 -0
- data/examples/default.css.in +66 -0
- data/examples/default.html +60 -0
- data/examples/palletize.rb +58 -0
- data/helper/helper.rb +3 -0
- data/helper/rake.rb +58 -0
- data/helper/rake_sh_filter.rb +23 -0
- data/helper/util.rb +19 -0
- data/lib/color/rgb/jp.rb +12 -0
- data/lib/color/rgb/jp/base.rb +10 -0
- data/lib/color/rgb/jp/base/color_name.rb +39 -0
- data/lib/color/rgb/jp/base/encode.rb +23 -0
- data/lib/color/rgb/jp/base/named_rgb.rb +15 -0
- data/lib/color/rgb/jp/base/pallet.rb +49 -0
- data/lib/color/rgb/jp/compiler/command.rb +102 -0
- data/lib/color/rgb/jp/compiler/compiler.rb +203 -0
- data/lib/color/rgb/jp/jisz8102.rb +547 -0
- data/lib/color/rgb/jp/traditional.rb +943 -0
- data/lib/color/rgb/jp/version.rb +11 -0
- data/setup.rb +1585 -0
- data/test/helper.rb +25 -0
- data/test/test_color_name.rb +77 -0
- data/test/test_compiler.rb +181 -0
- data/test/test_encode.rb +42 -0
- data/test/test_jisz8102.rb +39 -0
- data/test/test_named_rgb.rb +25 -0
- data/test/test_pallet.rb +78 -0
- data/test/test_traditional.rb +39 -0
- data/test/test_version.rb +19 -0
- metadata +106 -0
@@ -0,0 +1,23 @@
|
|
1
|
+
module FileUtils
|
2
|
+
SHELL_COMMAND_FILTER = []
|
3
|
+
|
4
|
+
alias sh_original sh
|
5
|
+
def sh(*cmd, &block)
|
6
|
+
cmd = SHELL_COMMAND_FILTER.inject(cmd){|c,filter| filter.call(c) or c }
|
7
|
+
sh_original(*cmd, &block)
|
8
|
+
end
|
9
|
+
|
10
|
+
def add_sh_filter(&block)
|
11
|
+
SHELL_COMMAND_FILTER << block
|
12
|
+
end
|
13
|
+
|
14
|
+
def add_sh_filter_for(pattern, &block)
|
15
|
+
add_sh_filter {|cmd|
|
16
|
+
if cmd[0] =~ pattern
|
17
|
+
block.call(cmd)
|
18
|
+
else
|
19
|
+
cmd
|
20
|
+
end
|
21
|
+
}
|
22
|
+
end
|
23
|
+
end
|
data/helper/util.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
def windows?
|
2
|
+
RUBY_PLATFORM =~ /win/
|
3
|
+
end
|
4
|
+
|
5
|
+
def with_temporary_rename(from, to)
|
6
|
+
mv from, to
|
7
|
+
yield
|
8
|
+
ensure
|
9
|
+
mv to, from
|
10
|
+
end
|
11
|
+
|
12
|
+
def has_dot?
|
13
|
+
if windows?
|
14
|
+
v = `dot -V 2>&1` rescue nil
|
15
|
+
v and v =~ /Graphviz/
|
16
|
+
else
|
17
|
+
`which dot` =~ /\/dot/
|
18
|
+
end
|
19
|
+
end
|
data/lib/color/rgb/jp.rb
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
require "color/rgb/jp/base/encode"
|
2
|
+
|
3
|
+
module Color::RGB::JP::Base
|
4
|
+
|
5
|
+
class ColorName
|
6
|
+
include Encode
|
7
|
+
|
8
|
+
def self.encoded_attr_reader(internal_encoding, *attributes)
|
9
|
+
attributes.each do |attr|
|
10
|
+
class_eval %Q{
|
11
|
+
def #{attr}(encoding = "#{internal_encoding}")
|
12
|
+
encode_to(encoding, "#{internal_encoding}", @#{attr})
|
13
|
+
end
|
14
|
+
}
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
encoded_attr_reader Encode::INTERNAL_ENCODING, :kanji, :hiragana, :katakana, :romaji
|
19
|
+
attr_reader :const_name
|
20
|
+
|
21
|
+
def initialize(const_name, kanji, hiragana, katakana = nil, romaji = nil)
|
22
|
+
@const_name = const_name
|
23
|
+
@kanji = kanji
|
24
|
+
@hiragana = hiragana
|
25
|
+
@katakana = katakana
|
26
|
+
@romaji = romaji
|
27
|
+
end
|
28
|
+
|
29
|
+
def to_s
|
30
|
+
romaji
|
31
|
+
end
|
32
|
+
|
33
|
+
def names(encoding = Encode::INTERNAL_ENCODING)
|
34
|
+
%W(kanji hiragana katakana romaji).map{|e| self.__send__(e, encoding) }
|
35
|
+
end
|
36
|
+
alias to_a names
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require "iconv"
|
2
|
+
|
3
|
+
module Color::RGB::JP::Base
|
4
|
+
|
5
|
+
module Encode
|
6
|
+
INTERNAL_ENCODING = "UTF-8"
|
7
|
+
|
8
|
+
module_function
|
9
|
+
|
10
|
+
def encode_to(to, from, value)
|
11
|
+
return nil if value.nil?
|
12
|
+
return value if to.nil?
|
13
|
+
return value if from.nil?
|
14
|
+
return value if from == to
|
15
|
+
return Iconv.iconv(to, from, value)[0]
|
16
|
+
end
|
17
|
+
|
18
|
+
def with_internal_encoding(value, from)
|
19
|
+
yield encode_to(INTERNAL_ENCODING, from, value)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require "color"
|
2
|
+
|
3
|
+
require "color/rgb/jp/base/encode"
|
4
|
+
require "color/rgb/jp/base/named_rgb"
|
5
|
+
require "color/rgb/jp/base/color_name"
|
6
|
+
|
7
|
+
module Color::RGB::JP::Base
|
8
|
+
|
9
|
+
module Pallet
|
10
|
+
include Encode
|
11
|
+
include Enumerable
|
12
|
+
|
13
|
+
def colors
|
14
|
+
@colors
|
15
|
+
end
|
16
|
+
|
17
|
+
def each(&block)
|
18
|
+
colors.each(&block)
|
19
|
+
end
|
20
|
+
|
21
|
+
def [](name, encoding = nil)
|
22
|
+
with_internal_encoding(name, encoding) {|n|
|
23
|
+
@index[normalize(n)]
|
24
|
+
}
|
25
|
+
end
|
26
|
+
|
27
|
+
def define_color(const, hex, *names)
|
28
|
+
@colors ||= []
|
29
|
+
@index ||= {}
|
30
|
+
|
31
|
+
name = ColorName.new(const, *names)
|
32
|
+
rgb = ::Color::RGB.from_html(hex)
|
33
|
+
color = NamedRGB.new(name, rgb)
|
34
|
+
@colors << color
|
35
|
+
|
36
|
+
[const, *names].compact.each {|e|
|
37
|
+
@index[normalize(e)] ||= color
|
38
|
+
}
|
39
|
+
color
|
40
|
+
end
|
41
|
+
alias c define_color
|
42
|
+
|
43
|
+
def normalize(v)
|
44
|
+
v.gsub(/-/, "").downcase
|
45
|
+
end
|
46
|
+
private :normalize
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
@@ -0,0 +1,102 @@
|
|
1
|
+
require "optparse"
|
2
|
+
|
3
|
+
require "color/rgb/jp"
|
4
|
+
require "color/rgb/jp/compiler/compiler"
|
5
|
+
|
6
|
+
class Color::RGB::JP::Compiler::Command
|
7
|
+
|
8
|
+
def self.dispatch
|
9
|
+
output = $stdout
|
10
|
+
encoding = Color::RGB::JP::Base::Encode::INTERNAL_ENCODING
|
11
|
+
pallet = "jis"
|
12
|
+
prefix = "##"
|
13
|
+
do_compile = true
|
14
|
+
generator = "#{$0} #{ARGV * " "}"
|
15
|
+
|
16
|
+
ARGV.options do |opt|
|
17
|
+
opt.program_name = "color-japanese"
|
18
|
+
opt.version = Color::RGB::JP::VERSION::STRING
|
19
|
+
opt.banner = "Usage: jcolorc [options] <source file>"
|
20
|
+
opt.separator ""
|
21
|
+
opt.separator " Options:"
|
22
|
+
opt.on("-o <output file>", "--output",
|
23
|
+
"output file (default: stdout)") {|v| output = v}
|
24
|
+
opt.on("-p <color pallet>", "--pallet",
|
25
|
+
"color pallet (jis or traditional).",
|
26
|
+
"(default: #{pallet})") {|v| pallet = v }
|
27
|
+
opt.on("-K<kcode>",
|
28
|
+
"specifies KANJI code-set (default: #{encoding})") {|v| encoding = parse_kcode(v) }
|
29
|
+
opt.on("-E",
|
30
|
+
"output preprocessed ERB script") { do_compile = false }
|
31
|
+
opt.on("--prefix=<directive prefix>",
|
32
|
+
"prefix the pre-processor directive.",
|
33
|
+
"(default: #{prefix})") {|v| prefix = v}
|
34
|
+
opt.separator ""
|
35
|
+
opt.on_tail("-v", "--version", "print the version"){
|
36
|
+
puts opt.ver
|
37
|
+
exit 0
|
38
|
+
}
|
39
|
+
opt.on_tail("-h", "--help", "print this message"){
|
40
|
+
puts opt
|
41
|
+
exit 0
|
42
|
+
}
|
43
|
+
opt.parse!
|
44
|
+
end
|
45
|
+
|
46
|
+
pallet = parse_pallet(pallet)
|
47
|
+
input = parse_input(ARGV)
|
48
|
+
|
49
|
+
check_not_blank(prefix, "Error: no prefix.")
|
50
|
+
check_not_blank(output, "Error: no output file.")
|
51
|
+
|
52
|
+
$KCODE = encoding
|
53
|
+
|
54
|
+
jcolorc = Color::RGB::JP::Compiler::Compiler.new(pallet, encoding, prefix, generator)
|
55
|
+
jcolorc.execute(input, output, do_compile)
|
56
|
+
end
|
57
|
+
|
58
|
+
def self.check_not_blank(v, msg)
|
59
|
+
error_exit(msg, 1) if v.nil? or v == ""
|
60
|
+
end
|
61
|
+
|
62
|
+
def self.parse_input(args)
|
63
|
+
case args.length
|
64
|
+
when 0
|
65
|
+
$stdin
|
66
|
+
when 1
|
67
|
+
ARGV.shift
|
68
|
+
else
|
69
|
+
error_exit("Error: too many source file.", 1)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def self.parse_kcode(kcode)
|
74
|
+
case kcode.downcase
|
75
|
+
when "e", "euc", /\Aeuc[_-]?jp/
|
76
|
+
"EUC-JP"
|
77
|
+
when "s", "sjis", /\Ashift[_-]?jis\z/
|
78
|
+
"Shift_JIS"
|
79
|
+
when "u", /\Autf[_-]?8\z/
|
80
|
+
"UTF-8"
|
81
|
+
else
|
82
|
+
error_exit("invalid KCODE #{kcode.dump}", 1)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def self.parse_pallet(pallet_name)
|
87
|
+
case pallet_name
|
88
|
+
when /\Ajis/i
|
89
|
+
Color::RGB::JP::JISZ8102
|
90
|
+
when /\Atrad/i
|
91
|
+
Color::RGB::JP::Traditional
|
92
|
+
else
|
93
|
+
error_exit("invalid pallet name `#{pallet_name}': jis or traditional", 1)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
def self.error_exit(msg, status)
|
98
|
+
$stderr.puts msg if msg
|
99
|
+
$stderr.puts ARGV.options
|
100
|
+
exit status
|
101
|
+
end
|
102
|
+
end
|
@@ -0,0 +1,203 @@
|
|
1
|
+
require "erb"
|
2
|
+
|
3
|
+
require "rubygems"
|
4
|
+
require "color/rgb/jp"
|
5
|
+
|
6
|
+
|
7
|
+
module Color::RGB::JP
|
8
|
+
module Compiler; end
|
9
|
+
end
|
10
|
+
|
11
|
+
class Color::RGB::JP::Compiler::Compiler
|
12
|
+
|
13
|
+
COLOR_NAME_CHAR = /[^[:space:][:punct:][:cntrl:]]/
|
14
|
+
COLOR_NAME_RE = /#{COLOR_NAME_CHAR}+(?:-#{COLOR_NAME_CHAR}+)*/
|
15
|
+
|
16
|
+
DEFAULT_PREPROCESSOR = [:preprocess_alias, :preprocess_color]
|
17
|
+
DEFAULT_TRIM_MODE = ">%"
|
18
|
+
|
19
|
+
attr_accessor :pallet, :encoding, :prefix, :generator, :preprocessor, :trim_mode
|
20
|
+
|
21
|
+
def initialize(pallet, encoding, prefix, generator)
|
22
|
+
@pallet = pallet
|
23
|
+
@encoding = encoding
|
24
|
+
@prefix = prefix
|
25
|
+
@generator = generator
|
26
|
+
@preprocessor = DEFAULT_PREPROCESSOR
|
27
|
+
@trim_mode = DEFAULT_TRIM_MODE
|
28
|
+
end
|
29
|
+
|
30
|
+
def execute(input, output, do_compile)
|
31
|
+
with_input_stream(input) do |is|
|
32
|
+
erbscript = preprocess(is.read, input)
|
33
|
+
with_output_stream(output) do |os|
|
34
|
+
if do_compile
|
35
|
+
os.write compile(erbscript, input)
|
36
|
+
else
|
37
|
+
os.write erbscript
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def preprocess(src, input)
|
44
|
+
preprocess_snippet(prefix) + do_preprocess(src, @prefix)
|
45
|
+
end
|
46
|
+
|
47
|
+
def compile(src, input)
|
48
|
+
e = ERB.new(src, 0, @trim_mode)
|
49
|
+
e.filename = input if String === input
|
50
|
+
e.result
|
51
|
+
end
|
52
|
+
|
53
|
+
private
|
54
|
+
|
55
|
+
def do_preprocess(src, prefix)
|
56
|
+
@preprocessor.inject(src){|r,fn|
|
57
|
+
if Proc === fn
|
58
|
+
fn.call(self, r, prefix) || r
|
59
|
+
else
|
60
|
+
self.__send__(fn, r, prefix) || r
|
61
|
+
end
|
62
|
+
}
|
63
|
+
end
|
64
|
+
|
65
|
+
def preprocess_alias(src, prefix)
|
66
|
+
scan_erb(src, /#{prefix}\s*alias[ \t]*((?:#{COLOR_NAME_RE}| )*)/, "<%"){|m|
|
67
|
+
n, v = m.strip.split(/\s+/, 2)
|
68
|
+
"Color::RGB::JP::ERBUtil.alias(%q{#{n}}, %Q{#{v}})"
|
69
|
+
}
|
70
|
+
end
|
71
|
+
|
72
|
+
def preprocess_color(src, prefix)
|
73
|
+
scan_erb(src, /#{prefix}(#{COLOR_NAME_RE})/, "<%="){|m|
|
74
|
+
"Color::RGB::JP::ERBUtil.to_rgb(%q{#{m}})"
|
75
|
+
}
|
76
|
+
end
|
77
|
+
|
78
|
+
def scan_erb(src, re, embed_mode, &block)
|
79
|
+
context = :text
|
80
|
+
src.gsub(/(<%)|(%>)|(^%)|(\n|$)|#{re}/) {
|
81
|
+
tokens = [:stag, :etag, :percent, :lf, :value].zip(Regexp.last_match.captures)
|
82
|
+
context, r = process_token(context, embed_mode, *tokens.find{|e| e[1]}, &block)
|
83
|
+
r
|
84
|
+
}
|
85
|
+
end
|
86
|
+
|
87
|
+
def process_token(context, embed_mode, token, value)
|
88
|
+
case context
|
89
|
+
when :erb1
|
90
|
+
case token
|
91
|
+
when :value; [context, embed_erb(yield(value))]
|
92
|
+
when :lf; [:text, value]
|
93
|
+
else [context, value]
|
94
|
+
end
|
95
|
+
when :erbtag
|
96
|
+
case token
|
97
|
+
when :value; [context, embed_erb(yield(value))]
|
98
|
+
when :etag; [:text, value]
|
99
|
+
else [context, value]
|
100
|
+
end
|
101
|
+
when :text
|
102
|
+
case token
|
103
|
+
when :value; [context, embed_erb(yield(value), embed_mode)]
|
104
|
+
when :stag; [:erbtag, value]
|
105
|
+
when :percent; [:erb1, value]
|
106
|
+
else [context, value]
|
107
|
+
end
|
108
|
+
else
|
109
|
+
raise "[bug] unknown context `#{context}': token=#{token}, value=#{value}"
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
def embed_erb(str, tag = nil)
|
114
|
+
if tag.nil?
|
115
|
+
str
|
116
|
+
else
|
117
|
+
"#{tag} #{str} %>"
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
def preprocess_snippet(prefix)
|
122
|
+
return <<-SNIPPET.gsub(/^ /, "")
|
123
|
+
<%
|
124
|
+
#
|
125
|
+
# Auto generated by "#{@generator}".
|
126
|
+
# Date: #{Time.now.iso8601}.
|
127
|
+
#
|
128
|
+
|
129
|
+
require "color/rgb/jp"
|
130
|
+
|
131
|
+
$KCODE = "#{@encoding}"
|
132
|
+
|
133
|
+
class Color::RGB
|
134
|
+
undef to_s
|
135
|
+
alias to_s html
|
136
|
+
end
|
137
|
+
|
138
|
+
module Color::RGB::JP::ERBUtil
|
139
|
+
_pallet = ::#{@pallet.name}
|
140
|
+
_alias = {}
|
141
|
+
|
142
|
+
define_method(:pallet) do
|
143
|
+
_pallet
|
144
|
+
end
|
145
|
+
module_function :pallet
|
146
|
+
|
147
|
+
define_method(:alias) do |name, value|
|
148
|
+
_alias[name] = value
|
149
|
+
end
|
150
|
+
module_function :alias
|
151
|
+
|
152
|
+
define_method(:alias?) do |name|
|
153
|
+
_alias.key?(name)
|
154
|
+
end
|
155
|
+
module_function :alias?
|
156
|
+
|
157
|
+
define_method(:to_rgb) do |name|
|
158
|
+
c = lookup(name)
|
159
|
+
unless c
|
160
|
+
msg = "undefined color name: `\#{name}'"
|
161
|
+
msg << " (alias of '\#{resolve_alias(name)}')" if alias?(name)
|
162
|
+
warn msg
|
163
|
+
return "#{prefix}\#{name}"
|
164
|
+
end
|
165
|
+
c.rgb
|
166
|
+
end
|
167
|
+
module_function :to_rgb
|
168
|
+
|
169
|
+
define_method(:resolve_alias) do |name|
|
170
|
+
if _alias.key?(name)
|
171
|
+
resolve_alias(_alias[name])
|
172
|
+
else
|
173
|
+
name
|
174
|
+
end
|
175
|
+
end
|
176
|
+
module_function :resolve_alias
|
177
|
+
|
178
|
+
define_method(:lookup) do |name|
|
179
|
+
_pallet[resolve_alias(name), "#{@encoding}"]
|
180
|
+
end
|
181
|
+
module_function :lookup
|
182
|
+
end
|
183
|
+
%>
|
184
|
+
SNIPPET
|
185
|
+
end
|
186
|
+
|
187
|
+
def with_input_stream(stream)
|
188
|
+
if stream.respond_to?(:read)
|
189
|
+
yield stream
|
190
|
+
else
|
191
|
+
open(stream) {|s| yield s }
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
195
|
+
def with_output_stream(stream)
|
196
|
+
if stream.respond_to?(:write)
|
197
|
+
yield stream
|
198
|
+
else
|
199
|
+
open(stream, "w") {|s| yield s }
|
200
|
+
end
|
201
|
+
end
|
202
|
+
|
203
|
+
end
|