termcolorlight 1.0.1 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
![HTML ScreenCapture](html_ss.png)
|
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
|