termcolorlight 1.0.1 → 1.1.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.
- checksums.yaml +4 -4
- data/.gitignore +2 -0
- data/README.md +17 -1
- data/html_ss.png +0 -0
- data/lib/termcolorlight.rb +5 -4
- data/lib/termcolorlight/html.rb +176 -0
- data/spec/termcolorlight_html_spec.rb +170 -0
- data/spec/termcolorlight_spec.rb +6 -1
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ac7c7270e7a4af913ceb1bc407d1ab29218a981a
|
4
|
+
data.tar.gz: ef1686b75a7a44bede28fe31e9445c5b2cb28b48
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a7edf680a26cc6dd614573001e6bf4b247649ab8c9fe9de64483a97621d4bf13c2e1a95703642257588ac3076cc5a4de05453da0d91bf7cc321037a1c177d547
|
7
|
+
data.tar.gz: 7b8207e7e7041eca074828ebb34be141a01e05cce4c2bdb35473d5a7eaa2e2a6d4cc5327340d11d92ad444a9f039ae585c4e68b4d6250d18fee65e447d7f3c01
|
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -29,9 +29,18 @@ TermColorLight.parse("<red>strings</red>") # => \e[31mstrings\e[0m
|
|
29
29
|
"<red>strings</red>".termcolor # a ditto
|
30
30
|
|
31
31
|
str = "<div>container</div>"
|
32
|
-
"<bold><green>#{str.escape}</green></bold>" # => \e[1m\e[32m<div>container</div>\e[0m\e[1m\e[0m
|
32
|
+
"<bold><green>#{str.escape}</green></bold>".termcolor # => \e[1m\e[32m<div>container</div>\e[0m\e[1m\e[0m
|
33
33
|
```
|
34
34
|
|
35
|
+
```ruby
|
36
|
+
require "termcolorlight/html"
|
37
|
+
str = "<div>container</div>"
|
38
|
+
TermColorLight.to_html("<bold><green>#{str.escape}</green></bold>")
|
39
|
+
# => <span style="font-weight:bold"><span style="color:lime"><div>container</div></span></span>
|
40
|
+
```
|
41
|
+
|
42
|
+

|
43
|
+
|
35
44
|
You can use the following tags.
|
36
45
|
|
37
46
|
```
|
@@ -94,6 +103,13 @@ TermColorLight.parse 0.850000 0.000000 0.850000 ( 0.853439)
|
|
94
103
|
|
95
104
|
Oops...
|
96
105
|
|
106
|
+
## Changelogs
|
107
|
+
|
108
|
+
### version 1.1.0 (2014/10/03)
|
109
|
+
|
110
|
+
+ add a method **TermColorLight.to_html**
|
111
|
+
- Perfect emuration of terminal
|
112
|
+
|
97
113
|
## Contributing
|
98
114
|
|
99
115
|
1. Fork it ( https://github.com/whiteleaf7/termcolorlight/fork )
|
data/html_ss.png
ADDED
Binary file
|
data/lib/termcolorlight.rb
CHANGED
@@ -8,7 +8,7 @@ require "strscan"
|
|
8
8
|
module TermColorLight
|
9
9
|
module_function
|
10
10
|
|
11
|
-
VERSION = "1.0
|
11
|
+
VERSION = "1.1.0"
|
12
12
|
|
13
13
|
TAGS = {
|
14
14
|
# foreground colors
|
@@ -30,7 +30,6 @@ module TermColorLight
|
|
30
30
|
|
31
31
|
def parse(str)
|
32
32
|
stack = []
|
33
|
-
current_tag = ""
|
34
33
|
ss = StringScanner.new(str.to_s)
|
35
34
|
buffer = ""
|
36
35
|
until ss.eos?
|
@@ -78,8 +77,10 @@ module TermColorLight
|
|
78
77
|
buf
|
79
78
|
end
|
80
79
|
|
81
|
-
def strip_tag(str)
|
82
|
-
|
80
|
+
def strip_tag(str, do_unescape = true)
|
81
|
+
result = str.gsub(/<.+?>/, "")
|
82
|
+
result = TermColorLight.unescape(result) if do_unescape
|
83
|
+
result
|
83
84
|
end
|
84
85
|
|
85
86
|
def create_escape_sequence(indexes) # :nodoc:
|
@@ -0,0 +1,176 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
#
|
3
|
+
# Copyright 2014 whiteleaf. All rights reserved.
|
4
|
+
#
|
5
|
+
|
6
|
+
require_relative "../termcolorlight"
|
7
|
+
|
8
|
+
#
|
9
|
+
# TermColorLight.to_html 実装用エクステンション
|
10
|
+
#
|
11
|
+
module TermColorLight
|
12
|
+
module_function
|
13
|
+
|
14
|
+
# 色定義
|
15
|
+
# フォーマット: "name" => ["暗い色", "明るい色"]
|
16
|
+
@@colors = {
|
17
|
+
"black" => %w(black #888), "white" => %w(#bbb white),
|
18
|
+
"red" => %w(indianred red), "green" => %w(green lime),
|
19
|
+
"yellow" => %w(goldenrod yellow), "blue" => %w(#33c #33f),
|
20
|
+
"magenta" => %w(darkmagenta magenta), "cyan" => %w(darkcyan cyan),
|
21
|
+
"fg_default" => %w(white white),
|
22
|
+
"bg_default" => %w(#333 #333)
|
23
|
+
}
|
24
|
+
@@decoration_styles = {
|
25
|
+
"underline" => "text-decoration:underline",
|
26
|
+
"underscore" => "text-decoration:underline",
|
27
|
+
"bold" => "font-weight:bold",
|
28
|
+
"blink" => "text-decoration:blink",
|
29
|
+
"concealed" => "visibility:hidden",
|
30
|
+
}
|
31
|
+
|
32
|
+
def set_colors(hash)
|
33
|
+
@@colors.merge!(hash)
|
34
|
+
end
|
35
|
+
|
36
|
+
def set_styles(hash)
|
37
|
+
@@decoration_styles.merge!(hash)
|
38
|
+
end
|
39
|
+
|
40
|
+
def default_foreground_color=(color)
|
41
|
+
@@colors["fg_default"] = [color, color]
|
42
|
+
end
|
43
|
+
|
44
|
+
def default_background_color=(color)
|
45
|
+
@@colors["bg_default"] = [color, color]
|
46
|
+
end
|
47
|
+
|
48
|
+
def to_html(str)
|
49
|
+
@@before_fg_color = @@before_bg_color = nil
|
50
|
+
ss = StringScanner.new(str.to_s)
|
51
|
+
result = parse_for_html(ss)
|
52
|
+
end
|
53
|
+
|
54
|
+
def parse_for_html(ss, fgcolor = "fg_default", bgcolor = "bg_default",
|
55
|
+
intensity = false, reverse = false, parent = nil)
|
56
|
+
buffer = ""
|
57
|
+
until ss.eos?
|
58
|
+
case
|
59
|
+
when ss.scan(/[^<]+/)
|
60
|
+
buffer.concat(ss.matched)
|
61
|
+
when ss.scan(/<([a-z_]+?)>/i)
|
62
|
+
tag = ss[1].downcase
|
63
|
+
unless valid_tag?(tag)
|
64
|
+
raise ParseError, "Unknown tag name (got '#{tag}')"
|
65
|
+
end
|
66
|
+
tmp_fg = fgcolor
|
67
|
+
tmp_bg = bgcolor
|
68
|
+
tmp_intensity = intensity
|
69
|
+
tmp_reverse = reverse
|
70
|
+
influence_of_color = false
|
71
|
+
styles = []
|
72
|
+
case
|
73
|
+
when color_tag?(tag)
|
74
|
+
tmp_fg = tag
|
75
|
+
influence_of_color = true
|
76
|
+
when tag =~ /^on_(.+)$/
|
77
|
+
tmp_bg = $1
|
78
|
+
unless valid_tag?(tmp_bg)
|
79
|
+
raise ParseError, "Unknown tag name (got '#{tag}')"
|
80
|
+
end
|
81
|
+
influence_of_color = true
|
82
|
+
when tag == "bold"
|
83
|
+
tmp_intensity = true
|
84
|
+
influence_of_color = true
|
85
|
+
when tag == "reverse"
|
86
|
+
tmp_reverse = true
|
87
|
+
influence_of_color = true
|
88
|
+
end
|
89
|
+
if influence_of_color
|
90
|
+
styles += build_color(tmp_fg, tmp_bg, tmp_intensity, tmp_reverse)
|
91
|
+
end
|
92
|
+
decoration = @@decoration_styles[tag]
|
93
|
+
styles << decoration if decoration
|
94
|
+
buffer.concat("<span style=\"#{styles.join(";")}\">")
|
95
|
+
buffer.concat(parse_for_html(ss, tmp_fg, tmp_bg, tmp_intensity, tmp_reverse, tag))
|
96
|
+
when ss.scan(/<\/([a-z_]+?)>/i)
|
97
|
+
tag = ss[1].downcase
|
98
|
+
if tag != parent
|
99
|
+
raise ParseError, "Missing end tag for '#{parent}' (got '#{tag}')"
|
100
|
+
end
|
101
|
+
return buffer.concat("</span>")
|
102
|
+
end
|
103
|
+
end
|
104
|
+
if parent
|
105
|
+
raise ParseError, "Missing end tag for '#{parent}'"
|
106
|
+
end
|
107
|
+
buffer
|
108
|
+
end
|
109
|
+
|
110
|
+
def valid_tag?(tag)
|
111
|
+
TAGS.include?(tag)
|
112
|
+
end
|
113
|
+
|
114
|
+
def color_tag?(tag)
|
115
|
+
@@colors.include?(tag)
|
116
|
+
end
|
117
|
+
|
118
|
+
def influence_of_color?(tag)
|
119
|
+
TAGS_INFLUENCE_OF_COLOR.include?(tag)
|
120
|
+
end
|
121
|
+
|
122
|
+
def build_color(fgcolor, bgcolor, intensity, reverse)
|
123
|
+
style = []
|
124
|
+
if reverse
|
125
|
+
fg_intensity = 0
|
126
|
+
bg_intensity = intensity ? 1 : 0
|
127
|
+
tmp = fgcolor
|
128
|
+
fgcolor = bgcolor
|
129
|
+
bgcolor = tmp
|
130
|
+
else
|
131
|
+
fg_intensity = intensity ? 1 : 0
|
132
|
+
bg_intensity = 0
|
133
|
+
end
|
134
|
+
if fgcolor != "fg_default"
|
135
|
+
color = @@colors[fgcolor][fg_intensity]
|
136
|
+
if @@before_fg_color != color
|
137
|
+
style << "color:#{color}"
|
138
|
+
@@before_fg_color = color
|
139
|
+
end
|
140
|
+
end
|
141
|
+
if bgcolor != "bg_default"
|
142
|
+
color = @@colors[bgcolor][bg_intensity]
|
143
|
+
if @@before_bg_color != color
|
144
|
+
style << "background:#{color}"
|
145
|
+
@@before_bg_color = color
|
146
|
+
end
|
147
|
+
end
|
148
|
+
style
|
149
|
+
end
|
150
|
+
|
151
|
+
def output_test_sheets
|
152
|
+
puts <<-HTML
|
153
|
+
<html><head>
|
154
|
+
<style>body{color:#{@@colors["fg_default"][0]};background:#{@@colors["bg_default"][0]}}</style>
|
155
|
+
</head><body><table>
|
156
|
+
HTML
|
157
|
+
@@colors.each_key do |color|
|
158
|
+
next if color =~ /default/
|
159
|
+
puts "<tr><td>"
|
160
|
+
puts to_html("<#{color}>#{color}</#{color}>")
|
161
|
+
puts "</td><td>"
|
162
|
+
puts to_html("<bold><#{color}>#{color}</#{color}></bold>")
|
163
|
+
puts "</td><td>"
|
164
|
+
puts to_html("<on_#{color}>on_#{color}</on_#{color}>")
|
165
|
+
puts "</td><td>"
|
166
|
+
puts to_html("<reverse><bold><#{color}>#{color}</#{color}></bold></reverse>")
|
167
|
+
puts "</td></tr>"
|
168
|
+
end
|
169
|
+
puts "</table></body></html>"
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
if $0 == __FILE__
|
174
|
+
TermColorLight.output_test_sheets
|
175
|
+
end
|
176
|
+
|
@@ -0,0 +1,170 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
#
|
3
|
+
# Copyright 2014 whiteleaf. All rights reserved.
|
4
|
+
#
|
5
|
+
|
6
|
+
require "termcolorlight/html"
|
7
|
+
|
8
|
+
describe TermColorLight do
|
9
|
+
describe ".to_html" do
|
10
|
+
context "give color tag" do
|
11
|
+
it do
|
12
|
+
expect(TermColorLight.to_html("<red>red</red>"))
|
13
|
+
.to eq '<span style="color:indianred">red</span>'
|
14
|
+
end
|
15
|
+
|
16
|
+
it "white is not white" do
|
17
|
+
expect(TermColorLight.to_html("<white>white?</white>"))
|
18
|
+
.to eq '<span style="color:#bbb">white?</span>'
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
context "give bold tag" do
|
23
|
+
it do
|
24
|
+
expect(TermColorLight.to_html("<bold>bold</bold>"))
|
25
|
+
.to eq '<span style="font-weight:bold">bold</span>'
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should be bold when double bold" do
|
29
|
+
expect(TermColorLight.to_html("<bold><bold>bold</bold>bold</bold>"))
|
30
|
+
.to eq '<span style="font-weight:bold"><span style="font-weight:bold">bold</span>bold</span>'
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
context "give bold and color tag" do
|
35
|
+
it do
|
36
|
+
expect(TermColorLight.to_html("<bold><red>str</red>bold</bold>"))
|
37
|
+
.to eq '<span style="font-weight:bold"><span style="color:red">str</span>bold</span>'
|
38
|
+
end
|
39
|
+
|
40
|
+
it do
|
41
|
+
expect(TermColorLight.to_html("<red><bold>BOLD RED</bold> NORMAL RED</red>"))
|
42
|
+
.to eq '<span style="color:indianred"><span style="color:red;font-weight:bold">BOLD RED</span> NORMAL RED</span>'
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
context "give underline" do
|
47
|
+
it do
|
48
|
+
expect(TermColorLight.to_html("<underline>str</underline>"))
|
49
|
+
.to eq '<span style="text-decoration:underline">str</span>'
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
context "give background color" do
|
54
|
+
it do
|
55
|
+
expect(TermColorLight.to_html("<on_red>str</on_red>"))
|
56
|
+
.to eq '<span style="background:indianred">str</span>'
|
57
|
+
end
|
58
|
+
|
59
|
+
it "with bold" do
|
60
|
+
expect(TermColorLight.to_html("<bold><on_green>str</on_green></bold>"))
|
61
|
+
.to eq '<span style="font-weight:bold"><span style="background:green">str</span></span>'
|
62
|
+
end
|
63
|
+
|
64
|
+
it "with bold" do
|
65
|
+
expect(TermColorLight.to_html("<on_green><bold>str</bold> non bold</on_green>"))
|
66
|
+
.to eq '<span style="background:green"><span style="font-weight:bold">str</span> non bold</span>'
|
67
|
+
end
|
68
|
+
|
69
|
+
it "with color tag" do
|
70
|
+
expect(TermColorLight.to_html("<on_cyan>bgcyan <yellow>yellow</yellow> bgcyan</on_cyan>"))
|
71
|
+
.to eq '<span style="background:darkcyan">bgcyan <span style="color:goldenrod">yellow</span> bgcyan</span>'
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
context "give reverse" do
|
76
|
+
it do
|
77
|
+
expect(TermColorLight.to_html("<reverse>str</reverse>"))
|
78
|
+
.to eq '<span style="color:#333;background:white">str</span>'
|
79
|
+
end
|
80
|
+
|
81
|
+
it "do nothing when double reverse" do
|
82
|
+
expect(TermColorLight.to_html("<reverse><reverse>foo</reverse>bar</reverse>"))
|
83
|
+
.to eq '<span style="color:#333;background:white"><span style="">foo</span>bar</span>'
|
84
|
+
end
|
85
|
+
|
86
|
+
context "with color tag" do
|
87
|
+
it do
|
88
|
+
expect(TermColorLight.to_html("<reverse><white>str</white></reverse>"))
|
89
|
+
.to eq '<span style="color:#333;background:white"><span style="background:#bbb">str</span></span>'
|
90
|
+
end
|
91
|
+
|
92
|
+
it do
|
93
|
+
expect(TermColorLight.to_html("<reverse><blue>str</blue> foo</reverse>"))
|
94
|
+
.to eq '<span style="color:#333;background:white"><span style="background:#33c">str</span> foo</span>'
|
95
|
+
end
|
96
|
+
|
97
|
+
it do
|
98
|
+
expect(TermColorLight.to_html("<blue><reverse>str</reverse></blue>"))
|
99
|
+
.to eq '<span style="color:#33c"><span style="color:#333;background:#33c">str</span></span>'
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
context "with background tag" do
|
104
|
+
it do
|
105
|
+
expect(TermColorLight.to_html("<reverse><on_red>str</on_red></reverse>"))
|
106
|
+
.to eq '<span style="color:#333;background:white"><span style="color:indianred">str</span></span>'
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
context "with bold tag" do
|
111
|
+
it do
|
112
|
+
expect(TermColorLight.to_html("<reverse><bold>str</bold></reverse>"))
|
113
|
+
.to eq '<span style="color:#333;background:white"><span style="font-weight:bold">str</span></span>'
|
114
|
+
end
|
115
|
+
|
116
|
+
it do
|
117
|
+
expect(TermColorLight.to_html("<reverse><bold><red>str</red></bold></reverse>"))
|
118
|
+
.to eq '<span style="color:#333;background:white"><span style="font-weight:bold"><span style="background:red">str</span></span></span>'
|
119
|
+
end
|
120
|
+
|
121
|
+
it do
|
122
|
+
expect(TermColorLight.to_html("<reverse><red><bold>str</bold></red></reverse>"))
|
123
|
+
.to eq '<span style="color:#333;background:white"><span style="background:indianred"><span style="background:red;font-weight:bold">str</span></span></span>'
|
124
|
+
end
|
125
|
+
|
126
|
+
it do
|
127
|
+
expect(TermColorLight.to_html("<bold><green><reverse>str</reverse></green></bold>"))
|
128
|
+
.to eq '<span style="font-weight:bold"><span style="color:lime"><span style="color:#333;background:lime">str</span></span></span>'
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
context "give entities" do
|
134
|
+
it "should be keep entities" do
|
135
|
+
expect(TermColorLight.to_html("<>&%apos; ")).to eq "<>&%apos; "
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
describe "abnormal" do
|
140
|
+
context "invalid tag" do
|
141
|
+
it "raise error" do
|
142
|
+
expect { TermColorLight.parse("<unknown>hoge</unknown>") }
|
143
|
+
.to raise_error(TermColorLight::ParseError, "Unknown tag name (got 'unknown')")
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
context "invalid background color" do
|
148
|
+
it "raise error" do
|
149
|
+
expect { TermColorLight.parse("<on_unknown>hoge</on_unknown>") }
|
150
|
+
.to raise_error(TermColorLight::ParseError, "Unknown tag name (got 'on_unknown')")
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
context "invalid tag order" do
|
155
|
+
it "raise error" do
|
156
|
+
expect { TermColorLight.parse("<bold><red>hoge</bold></red>") }
|
157
|
+
.to raise_error(TermColorLight::ParseError, "Missing end tag for 'red' (got 'bold')")
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
context "when unclose tag" do
|
162
|
+
it "raise error" do
|
163
|
+
expect { TermColorLight.parse("<red>hoge") }
|
164
|
+
.to raise_error(TermColorLight::ParseError, "Missing end tag for 'red'")
|
165
|
+
end
|
166
|
+
end
|
167
|
+
end
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
data/spec/termcolorlight_spec.rb
CHANGED
@@ -245,10 +245,15 @@ describe TermColorLight do
|
|
245
245
|
end
|
246
246
|
|
247
247
|
describe ".strip_tag" do
|
248
|
-
it do
|
248
|
+
it "should be strop tag and unescaped entity" do
|
249
249
|
expect(TermColorLight.strip_tag("<red>"'foo&bar <></red>"))
|
250
250
|
.to eq %!"'foo&bar <>!
|
251
251
|
end
|
252
|
+
|
253
|
+
it "shoul be strip tag and NOT unescaped entity" do
|
254
|
+
expect(TermColorLight.strip_tag("<red>"'foo&bar <></red>", false))
|
255
|
+
.to eq ""'foo&bar <>"
|
256
|
+
end
|
252
257
|
end
|
253
258
|
end
|
254
259
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: termcolorlight
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- whiteleaf7
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-10-02 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: |
|
14
14
|
This gem is library that convert color tags (e.g. <red>str</red>) to
|
@@ -26,7 +26,10 @@ files:
|
|
26
26
|
- README.md
|
27
27
|
- Rakefile
|
28
28
|
- benchmark.rb
|
29
|
+
- html_ss.png
|
29
30
|
- lib/termcolorlight.rb
|
31
|
+
- lib/termcolorlight/html.rb
|
32
|
+
- spec/termcolorlight_html_spec.rb
|
30
33
|
- spec/termcolorlight_spec.rb
|
31
34
|
- termcolorlight.gemspec
|
32
35
|
homepage: http://github.com/whiteleaf7/termcolorlight
|
@@ -54,4 +57,5 @@ signing_key:
|
|
54
57
|
specification_version: 4
|
55
58
|
summary: convert color tags to ansicolor library
|
56
59
|
test_files:
|
60
|
+
- spec/termcolorlight_html_spec.rb
|
57
61
|
- spec/termcolorlight_spec.rb
|