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,57 @@
|
|
1
|
+
##alias target red
|
2
|
+
|
3
|
+
% include Color::RGB::JP::ERBUtil
|
4
|
+
% include ERB::Util
|
5
|
+
|
6
|
+
<html>
|
7
|
+
<head>
|
8
|
+
<title><%=h pallet %>::<%=h lookup("target").name.const_name %></title>
|
9
|
+
<meta http-equiv="Content-type" content="text/html; charset=UTF-8" />
|
10
|
+
<style>
|
11
|
+
table {
|
12
|
+
width: 100%;
|
13
|
+
}
|
14
|
+
table, tr, th, td {
|
15
|
+
border: 1px solid black;
|
16
|
+
border-collapse: collapse;
|
17
|
+
}
|
18
|
+
th, td {
|
19
|
+
padding: 4px;
|
20
|
+
width: 20%;
|
21
|
+
}
|
22
|
+
span {
|
23
|
+
font-size: 3px;
|
24
|
+
width: 100%; display: block;
|
25
|
+
}
|
26
|
+
</style>
|
27
|
+
</head>
|
28
|
+
<body>
|
29
|
+
|
30
|
+
<h1><%=h pallet %>::<%=h lookup("target").name.const_name %></h1>
|
31
|
+
|
32
|
+
% filters = [:lighten_by, :darken_by, :adjust_brightness, :adjust_saturation, :adjust_hue]
|
33
|
+
|
34
|
+
<table>
|
35
|
+
<tr>
|
36
|
+
% filters.each do |filter|
|
37
|
+
<th><%= filter %></th>
|
38
|
+
% end
|
39
|
+
</tr>
|
40
|
+
|
41
|
+
<tr>
|
42
|
+
% filters.each do |filter|
|
43
|
+
<td>
|
44
|
+
% 100.times do |i|
|
45
|
+
% v = ##target.__send__(filter, i)
|
46
|
+
<span title="<%= filter %>(<%= i %>) = <%=h v %>"
|
47
|
+
style="background-color: <%= v %>">
|
48
|
+
|
49
|
+
</span>
|
50
|
+
% end
|
51
|
+
</td>
|
52
|
+
% end
|
53
|
+
</tr>
|
54
|
+
</table>
|
55
|
+
|
56
|
+
</body>
|
57
|
+
</html>
|
@@ -0,0 +1,173 @@
|
|
1
|
+
# -*- encoding: utf8 -*-
|
2
|
+
|
3
|
+
require "erb"
|
4
|
+
require "optparse"
|
5
|
+
require "rubygems"
|
6
|
+
|
7
|
+
libdir = File.join(File.dirname(__FILE__), "../lib")
|
8
|
+
$LOAD_PATH << libdir
|
9
|
+
require "color/rgb/jp"
|
10
|
+
|
11
|
+
def with_output_stream(output)
|
12
|
+
if output == $stdout or output == "-"
|
13
|
+
yield $stdout
|
14
|
+
else
|
15
|
+
open(output, "w"){|out| yield out }
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
|
20
|
+
name = nil
|
21
|
+
output = $stdout
|
22
|
+
ARGV.options do |opt|
|
23
|
+
opt.on("-p=PALLET"){|v| name = v}
|
24
|
+
opt.on("-o=OUTPUT"){|v| output = v}
|
25
|
+
opt.parse!
|
26
|
+
end
|
27
|
+
|
28
|
+
pallet = Color::RGB::JP.pallets.find{|e| e.name.split(/::/).last == name }
|
29
|
+
raise "unknown pallet `#{name}'" unless pallet
|
30
|
+
|
31
|
+
colors = pallet.colors
|
32
|
+
with_output_stream(output) do |out|
|
33
|
+
out.puts ERB.new(DATA.read, 0, "%<>").result(binding)
|
34
|
+
end
|
35
|
+
|
36
|
+
|
37
|
+
__END__
|
38
|
+
% def trad(name)
|
39
|
+
% Color::RGB::JP::Trad[name].rgb.html
|
40
|
+
% end
|
41
|
+
<html>
|
42
|
+
<head>
|
43
|
+
<title>color-japanese: <%= pallet %></title>
|
44
|
+
<meta http-equiv="Content-type" content="text/html; charset=UTF-8" />
|
45
|
+
<style type="text/css">
|
46
|
+
<!--
|
47
|
+
body {
|
48
|
+
color: <%= trad("暗黒色") %>;
|
49
|
+
background: <%= trad("胡粉色") %>;
|
50
|
+
}
|
51
|
+
input {
|
52
|
+
width: 10em;
|
53
|
+
}
|
54
|
+
table, th, td {
|
55
|
+
border-collapse: collapse;
|
56
|
+
border: 1px solid <%= trad("桜鼠") %>
|
57
|
+
}
|
58
|
+
th, td {
|
59
|
+
padding: 4px;
|
60
|
+
}
|
61
|
+
#search {
|
62
|
+
color: <%= trad("藍鉄") %>;
|
63
|
+
width: 100%;
|
64
|
+
}
|
65
|
+
-->
|
66
|
+
</style>
|
67
|
+
<script type="text/javascript">
|
68
|
+
<!--
|
69
|
+
var cache = {};
|
70
|
+
var colors = {};
|
71
|
+
<% colors.each_with_index do |c,i| %>
|
72
|
+
colors["c<%= i %>"] = ["<%= c.name.const_name.downcase %>", "<%= c.name.kanji %>", "<%= c.name.hiragana %>", "<%= c.name.katakana %>", "<%= c.name.romaji.downcase %>"];
|
73
|
+
<% end %>
|
74
|
+
|
75
|
+
function lookup(names, q) {
|
76
|
+
var queries = q.toLowerCase().split(/\s+/);
|
77
|
+
for (var i = 0; i < queries.length; i++) {
|
78
|
+
if (!lookup1(names, queries[i])) {
|
79
|
+
return false;
|
80
|
+
}
|
81
|
+
}
|
82
|
+
return true;
|
83
|
+
}
|
84
|
+
|
85
|
+
function lookup1(names, query) {
|
86
|
+
for (var i = 0; i < names.length; i++) {
|
87
|
+
if (names[i].indexOf(query) > -1) {
|
88
|
+
return true;
|
89
|
+
}
|
90
|
+
}
|
91
|
+
return false;
|
92
|
+
}
|
93
|
+
|
94
|
+
function do_search(q) {
|
95
|
+
for (var key in colors) {
|
96
|
+
var names = colors[key];
|
97
|
+
var e = cache[key] = cache[key] || document.getElementById(key);
|
98
|
+
if (e != undefined && lookup(names, q)) {
|
99
|
+
e.style.display = "";
|
100
|
+
} else {
|
101
|
+
e.style.display = "none";
|
102
|
+
}
|
103
|
+
}
|
104
|
+
}
|
105
|
+
|
106
|
+
function setup_event() {
|
107
|
+
var input = document.getElementById("search");
|
108
|
+
input.onfocus = function() {
|
109
|
+
if (input.value == "search") {
|
110
|
+
input.value = "";
|
111
|
+
input.style.color = "black";
|
112
|
+
}
|
113
|
+
};
|
114
|
+
input.onblur = function() {
|
115
|
+
if (input.value == "") {
|
116
|
+
input.value = "search";
|
117
|
+
input.style.color = "<%= trad("藍鉄") %>";
|
118
|
+
}
|
119
|
+
};
|
120
|
+
|
121
|
+
var form = document.getElementById("search_box");
|
122
|
+
form.onsubmit = function() {
|
123
|
+
var q = input.value;
|
124
|
+
input.style.backgroundColor = "<%= trad("虹色") %>";
|
125
|
+
window.setTimeout(function () {
|
126
|
+
do_search(q);
|
127
|
+
input.style.backgroundColor = "";
|
128
|
+
input.focus();
|
129
|
+
}, 100);
|
130
|
+
|
131
|
+
return false;
|
132
|
+
};
|
133
|
+
}
|
134
|
+
-->
|
135
|
+
</script>
|
136
|
+
|
137
|
+
</head>
|
138
|
+
<body onload="setup_event();">
|
139
|
+
<h1><%= pallet %></h1>
|
140
|
+
|
141
|
+
<form id="search_box">
|
142
|
+
<input accesskey="a" id="search" value="search"/>
|
143
|
+
</form>
|
144
|
+
|
145
|
+
<table style="width: 100%">
|
146
|
+
<tr>
|
147
|
+
<th style="width: 12%">const</th>
|
148
|
+
<th style="width: 12%">color name (kanji/hiragana)</th>
|
149
|
+
<th style="width: 12%">color name (romaji)</th>
|
150
|
+
<th>RGB</th>
|
151
|
+
</tr>
|
152
|
+
% colors.each_with_index do |c,i|
|
153
|
+
<tr id="c<%= i %>">
|
154
|
+
<td><%= c.name.const_name %></td>
|
155
|
+
<td>
|
156
|
+
% if c.name.kanji.nil?
|
157
|
+
<%= c.name.katakana %>
|
158
|
+
% else
|
159
|
+
<ruby>
|
160
|
+
<rb><%= c.name.kanji %></rb><rp>(</rp><rt><%= c.name.hiragana %></rt><rp>)</rp>
|
161
|
+
</ruby>
|
162
|
+
% end
|
163
|
+
</td>
|
164
|
+
<td><%= c.name.romaji %></td>
|
165
|
+
<td style="background: <%= c.rgb.html %>">
|
166
|
+
<input onclick="this.select()" value="<%= c.rgb.html %>"/><br>
|
167
|
+
<input onclick="this.select()" value="rgb(<%= (c.rgb.r * 255).round %>, <%= (c.rgb.g * 255).round %>, <%= (c.rgb.b * 255).round %>)"/>
|
168
|
+
</td>
|
169
|
+
</tr>
|
170
|
+
% end
|
171
|
+
</table>
|
172
|
+
</body>
|
173
|
+
</html>
|
@@ -0,0 +1,66 @@
|
|
1
|
+
@charset "Shift_JIS";
|
2
|
+
|
3
|
+
##alias myblue �I���F
|
4
|
+
##alias mypink ���[�Y
|
5
|
+
##alias myborder �X�m�[�z���C�g
|
6
|
+
|
7
|
+
h1 {
|
8
|
+
color: ##myblue;
|
9
|
+
}
|
10
|
+
|
11
|
+
h1 span {
|
12
|
+
color: ##mypink;
|
13
|
+
}
|
14
|
+
|
15
|
+
.link {
|
16
|
+
color: ##myblue;
|
17
|
+
}
|
18
|
+
|
19
|
+
.active {
|
20
|
+
color: ##mypink;
|
21
|
+
}
|
22
|
+
|
23
|
+
.comment h4 {
|
24
|
+
color: ##mypink;
|
25
|
+
}
|
26
|
+
|
27
|
+
a {
|
28
|
+
text-decoration: none;
|
29
|
+
}
|
30
|
+
|
31
|
+
a:link,
|
32
|
+
a:visited, {
|
33
|
+
color: ##myblue;
|
34
|
+
}
|
35
|
+
|
36
|
+
a:over,
|
37
|
+
a:active {
|
38
|
+
colro: white;
|
39
|
+
background-color: ##myblue;
|
40
|
+
}
|
41
|
+
|
42
|
+
body {
|
43
|
+
margin: 0;
|
44
|
+
padding: 0;
|
45
|
+
}
|
46
|
+
|
47
|
+
#header {
|
48
|
+
padding: 0 100px 1em 100px;
|
49
|
+
margin-bottom: 2em;
|
50
|
+
border-bottom: 1px dotted ##myborder;
|
51
|
+
}
|
52
|
+
|
53
|
+
#body {
|
54
|
+
padding: 0 100px 1em 100px;
|
55
|
+
}
|
56
|
+
|
57
|
+
#footer {
|
58
|
+
padding: 0 100px 1em 100px;
|
59
|
+
margin-top: 2em;
|
60
|
+
border-top: 1px dotted ##myborder;
|
61
|
+
}
|
62
|
+
|
63
|
+
address {
|
64
|
+
color: gray;
|
65
|
+
font-style: normal;
|
66
|
+
}
|
@@ -0,0 +1,60 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8" ?>
|
2
|
+
<!DOCTYPE html
|
3
|
+
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
4
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
5
|
+
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
|
6
|
+
<head>
|
7
|
+
<title>color-japanese example</title>
|
8
|
+
<meta http-equiv="Content-type" content="text/html; charset=UTF-8" />
|
9
|
+
<link href="default.css" type="text/css" rel="stylesheet" />
|
10
|
+
</head>
|
11
|
+
<body>
|
12
|
+
|
13
|
+
<div id="header">
|
14
|
+
<h1>colo<span>r</span>-japanese</h1>
|
15
|
+
|
16
|
+
<a href="#">Home</a>
|
17
|
+
<a href="#">Traditional</a>
|
18
|
+
<a href="#">JISZ8102</a>
|
19
|
+
</div>
|
20
|
+
|
21
|
+
<div id="body">
|
22
|
+
<h2>
|
23
|
+
<span class="link">Color</span> /
|
24
|
+
<span class="link">RGB</span> /
|
25
|
+
<span class="link">JP</span> /
|
26
|
+
<span class="active">Traditional</span>
|
27
|
+
</h2>
|
28
|
+
|
29
|
+
<h3>foobar</h3>
|
30
|
+
|
31
|
+
<p>
|
32
|
+
The quick brown fox jumps over the lazy dog.<br/>
|
33
|
+
The quick brown fox jumps over the lazy dog.<br/>
|
34
|
+
The quick brown fox jumps over the lazy dog.<br/>
|
35
|
+
The quick brown fox jumps over the lazy dog.<br/>
|
36
|
+
The quick brown fox jumps over the lazy dog.<br/>
|
37
|
+
The quick brown fox jumps over the lazy dog.<br/>
|
38
|
+
The quick brown fox jumps over the lazy dog.<br/>
|
39
|
+
The quick brown fox jumps over the lazy dog.<br/>
|
40
|
+
The quick brown fox jumps over the lazy dog.<br/>
|
41
|
+
The quick brown fox jumps over the lazy dog.<br/>
|
42
|
+
The quick brown fox jumps over the lazy dog.<br/>
|
43
|
+
</p>
|
44
|
+
|
45
|
+
<div class="comment">
|
46
|
+
<h4>Would you like to comment?</h4>
|
47
|
+
<p>
|
48
|
+
The quick brown fox jumps over the lazy dog.<br/>
|
49
|
+
</p>
|
50
|
+
</div>
|
51
|
+
</div>
|
52
|
+
|
53
|
+
<div id="footer">
|
54
|
+
<address>
|
55
|
+
The quick brown fox jumps over the lazy dog.
|
56
|
+
</address>
|
57
|
+
</div>
|
58
|
+
|
59
|
+
</body>
|
60
|
+
</html>
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require "optparse"
|
2
|
+
|
3
|
+
require "rubygems"
|
4
|
+
require "color/rgb/jp"
|
5
|
+
|
6
|
+
module Enumerable
|
7
|
+
def sum
|
8
|
+
self.inject(0.0){|s,e| s + e }
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
class Color::RGB
|
13
|
+
def to_a
|
14
|
+
[r, g, b]
|
15
|
+
end
|
16
|
+
|
17
|
+
def distance(other)
|
18
|
+
euclid_distance(self.to_a, other.to_a)
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def euclid_distance(a, b)
|
24
|
+
Math.sqrt(a.zip(b).map{|aa,bb| (aa - bb) ** 2 }.sum)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def palletize(pallet, color, n = 1)
|
29
|
+
pallet.sort_by {|e| color.distance(e.rgb) }[0...n]
|
30
|
+
end
|
31
|
+
|
32
|
+
|
33
|
+
pallets = [Color::RGB::JP::JISZ8102, Color::RGB::JP::Traditional]
|
34
|
+
n = 3
|
35
|
+
ARGV.options do |opt|
|
36
|
+
opt.banner = "Usage: palletize [-n] rgb_hex_values..."
|
37
|
+
opt.on("-n=N", "output top N candidates", Integer) {|v| n = v }
|
38
|
+
opt.parse!
|
39
|
+
end
|
40
|
+
if ARGV.empty?
|
41
|
+
ARGV.options.parse("-h")
|
42
|
+
exit 1
|
43
|
+
end
|
44
|
+
|
45
|
+
ARGV.each do |c|
|
46
|
+
rgb = Color::RGB.from_html(c)
|
47
|
+
puts "=== %s (%s) ===" % [c, rgb.html]
|
48
|
+
puts
|
49
|
+
pallets.each do |pallet|
|
50
|
+
puts " [%s]" % pallet.name
|
51
|
+
puts
|
52
|
+
alts = palletize(pallet, rgb, n)
|
53
|
+
alts.each_with_index do |alt, i|
|
54
|
+
puts " %2d: %-20s %s" % [i + 1, alt.name.romaji, alt.rgb.html]
|
55
|
+
end
|
56
|
+
puts
|
57
|
+
end
|
58
|
+
end
|
data/helper/helper.rb
ADDED
data/helper/rake.rb
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
require "rubygems"
|
2
|
+
require "rake"
|
3
|
+
|
4
|
+
def tasks
|
5
|
+
Rake.application.instance_eval { @tasks }
|
6
|
+
end
|
7
|
+
|
8
|
+
def current_scope
|
9
|
+
Rake.application.instance_eval { @scope.last }
|
10
|
+
end
|
11
|
+
|
12
|
+
def task_defined?(task_name)
|
13
|
+
Rake::Task.task_defined?(task_name)
|
14
|
+
end
|
15
|
+
|
16
|
+
def remove_tasks(*task_names)
|
17
|
+
task_names.flatten.each do |task_name|
|
18
|
+
remove_task(task_name)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def remove_task(task_name)
|
23
|
+
tasks.delete(task_name.to_s)
|
24
|
+
end
|
25
|
+
|
26
|
+
def lookup_task(task_name)
|
27
|
+
Rake::Task[task_name] rescue nil
|
28
|
+
end
|
29
|
+
|
30
|
+
def rakecall(task_name)
|
31
|
+
lookup_task(task_name).invoke
|
32
|
+
end
|
33
|
+
|
34
|
+
def override_task(task_args, &block)
|
35
|
+
task_name, deps = Rake.application.resolve_args(task_args)
|
36
|
+
original = lookup_task(task_name)
|
37
|
+
orgproc = lambda {} # nop
|
38
|
+
if original
|
39
|
+
Rake.application.last_comment = original.comment
|
40
|
+
deps |= original.prerequisites
|
41
|
+
orgproc = lambda{ original.execute }
|
42
|
+
end
|
43
|
+
|
44
|
+
remove_task(task_name)
|
45
|
+
Rake::Task.define_task(task_name => deps) do |t|
|
46
|
+
block.call(t, orgproc)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def task_for_windows(task_args, &block)
|
51
|
+
override_task(task_args) do |t, org|
|
52
|
+
if windows?
|
53
|
+
block.call(t)
|
54
|
+
else
|
55
|
+
org.call
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|