l43_simple_color 0.1.0 → 0.2.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 793394d98f0864039fd93bd7b2583af664e3971724e33bf2b4b69ea1cf0a603f
4
- data.tar.gz: e12a143d0677d3f893d73668e98a5f67acfa5c9cd5f523bdd638d9043180bf93
3
+ metadata.gz: e4eb4f71f5445e06dc4dac9a05dd23129551f43a1d576a0610ce04cf9192ec1d
4
+ data.tar.gz: a9d0a1d7ab3d65180009ffc456e8081aebfd9e33a63436c6b490afa305eece4c
5
5
  SHA512:
6
- metadata.gz: 90abaee7aec5928b49e95df11819aadd2c5706b0f0f51997b4f991c48425adb1b81e4e01327c88cf39aebd5476c57700c75e22dd2b356ce81063b4a5ee9abd57
7
- data.tar.gz: 126a632592ede353fddb3c950744ec1ad04786deba69afe1dfbc749db9d94bd1d13166161c3ee0e0048b1119da3b449692230072312947fe4112441a30b7ca5d
6
+ metadata.gz: 3c9498643606ebbf94451660ad85b775e58989843006cf53ecfd6d74d285fdb57914df3ea752d88db1af7090488dca9053a659e83bd9b33bcc50f58b8184b502
7
+ data.tar.gz: da9b9c9ec8148288c02254985549d07848048cb2c2c44f80d260d4d4e33b29e137e1f3b0b9903c7456fc9a25685439b26ccbd812d889d3184100946bb79c1c60
data/bin/simple_color ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+ require_relative "../lib/l43/simple_color"
4
+ require_relative "../lib/l43/simple_color/cli"
5
+
6
+ L43::SimpleColor::Cli.run(ARGV)
7
+
8
+ # SPDX-License-Identifier: AGPL-3.0-or-later
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'colorize'
4
+ module L43
5
+ module SimpleColor
6
+ module Cli extend self
7
+ include Colorize
8
+ def run(argv)
9
+ device = make_device(argv.first)
10
+ device.map { |line|
11
+ puts(xcolorize!(line))
12
+ }
13
+ end
14
+
15
+ private
16
+ def make_device(fn)
17
+ (fn ? File.open(fn) : $stdin).each(chomp: true)
18
+ end
19
+ end
20
+ end
21
+ end
22
+ # SPDX-License-Identifier: AGPL-3.0-or-later
@@ -0,0 +1,294 @@
1
+ # frozen_string_literal: true
2
+
3
+ module L43
4
+ module SimpleColor
5
+ BadColor = Class.new(RuntimeError)
6
+
7
+ module ColorData
8
+ ANSI_CODE_SPLITTING_STRING = "__"
9
+
10
+ CSI = "\e["
11
+
12
+ Bold = "\x1b[1m"
13
+ Dim = "\x1b[2m"
14
+ Reset = "\x1b[0m"
15
+ Underline = "\x1b[4m"
16
+
17
+ Colors = {
18
+ black: "\x1b[30m",
19
+ blue: "\x1b[34m",
20
+ cyan: "\x1b[36m",
21
+ green: "\x1b[32m",
22
+ magenta: "\x1b[35m",
23
+ red: "\x1b[31m",
24
+ white: "\x1b[37m",
25
+ yellow: "\x1b[33m",
26
+
27
+ bgblack: "\x1b[40m",
28
+ bgblue: "\x1b[44m",
29
+ bgcyan: "\x1b[46m",
30
+ bggreen: "\x1b[42m",
31
+ bgmagenta: "\x1b[45m",
32
+ bgred: "\x1b[41m",
33
+ bgwhite: "\x1b[47m",
34
+ bgyellow: "\x1b[43m",
35
+
36
+ b: Bold,
37
+ bold: Bold,
38
+ d: Dim,
39
+ dim: Dim,
40
+ r: Reset,
41
+ reset: Reset,
42
+ ul: Underline,
43
+ underline: Underline,
44
+ }
45
+
46
+ RGB_COLORS = {
47
+ aqua: [0, 255, 255],
48
+ aquamarine1: [95, 255, 215],
49
+ aquamarine3: [95, 215, 175],
50
+ azure1: [240, 255, 255],
51
+ blue1: [0, 0, 255],
52
+ blue3: [0, 0, 175],
53
+ blue_violet: [95, 0, 255],
54
+ cadet_blue: [95, 175, 135],
55
+ chartreuse1: [135, 255, 0],
56
+ chartreuse2: [95, 255, 0],
57
+ chartreuse3: [95, 175, 0],
58
+ chartreuse4: [95, 135, 0],
59
+ cornflower_blue: [95, 135, 255],
60
+ cornsilk1: [255, 255, 215],
61
+ cyan1: [0, 255, 255],
62
+ cyan2: [0, 255, 215],
63
+ cyan3: [0, 215, 175],
64
+ dark_blue: [0, 0, 135],
65
+ dark_cyan: [0, 175, 135],
66
+ dark_goldenrod: [175, 135, 0],
67
+ dark_green: [0, 95, 0],
68
+ dark_khaki: [175, 175, 95],
69
+ dark_magenta: [135, 0, 135],
70
+ dark_olive_green1: [215, 255, 95],
71
+ dark_olive_green2: [175, 255, 95],
72
+ dark_olive_green3: [135, 175, 95],
73
+ dark_orange3: [175, 95, 0],
74
+ dark_orange: [255, 135, 0],
75
+ dark_red: [95, 0, 0],
76
+ dark_sea_green1: [175, 255, 215],
77
+ dark_sea_green2: [175, 215, 175],
78
+ dark_sea_green3: [135, 215, 175],
79
+ dark_sea_green4: [95, 135, 95],
80
+ dark_sea_green: [135, 175, 135],
81
+ dark_slate_gray1: [135, 255, 255],
82
+ dark_slate_gray2: [95, 255, 255],
83
+ dark_slate_gray3: [135, 215, 215],
84
+ dark_turquoise: [0, 215, 215],
85
+ dark_violet: [135, 0, 215],
86
+ deep_pink1: [255, 0, 135],
87
+ deep_pink2: [255, 0, 95],
88
+ deep_pink3: [215, 0, 95],
89
+ deep_pink4: [95, 0, 95],
90
+ deep_sky_blue1: [0, 175, 255],
91
+ deep_sky_blue2: [0, 175, 215],
92
+ deep_sky_blue3: [0, 135, 175],
93
+ deep_sky_blue4: [0, 95, 95],
94
+ dodger_blue1: [0, 135, 255],
95
+ dodger_blue2: [0, 95, 255],
96
+ dodger_blue3: [0, 95, 215],
97
+ fuchsia: [255, 0, 255],
98
+ gold1: [255, 215, 0],
99
+ gold3: [175, 175, 0],
100
+ green1: [0, 255, 0],
101
+ green3: [0, 175, 0],
102
+ green4: [0, 135, 0],
103
+ green_yellow: [175, 255, 0],
104
+ grey0: [0, 0, 0],
105
+ grey100: [255, 255, 255],
106
+ grey11: [28, 28, 28],
107
+ grey15: [38, 38, 38],
108
+ grey19: [48, 48, 48],
109
+ grey23: [58, 58, 58],
110
+ grey27: [68, 68, 68],
111
+ grey30: [78, 78, 78],
112
+ grey35: [88, 88, 88],
113
+ grey37: [95, 95, 95],
114
+ grey39: [98, 98, 98],
115
+ grey3: [8, 8, 8],
116
+ grey42: [108, 108, 108],
117
+ grey46: [118, 118, 118],
118
+ grey50: [128, 128, 128],
119
+ grey53: [135, 135, 135],
120
+ grey54: [138, 138, 138],
121
+ grey58: [148, 148, 148],
122
+ grey62: [158, 158, 158],
123
+ grey63: [175, 135, 175],
124
+ grey66: [168, 168, 168],
125
+ grey69: [175, 175, 175],
126
+ grey70: [178, 178, 178],
127
+ grey74: [188, 188, 188],
128
+ grey78: [198, 198, 198],
129
+ grey7: [18, 18, 18],
130
+ grey82: [208, 208, 208],
131
+ grey84: [215, 215, 215],
132
+ grey85: [218, 218, 218],
133
+ grey89: [228, 228, 228],
134
+ grey93: [238, 238, 238],
135
+ grey: [128, 128, 128],
136
+ honeydew2: [215, 255, 215],
137
+ hot_pink2: [215, 95, 175],
138
+ hot_pink3: [175, 95, 135],
139
+ hot_pink: [255, 95, 175],
140
+ indian_red1: [255, 95, 95],
141
+ indian_red: [175, 95, 95],
142
+ khaki1: [255, 255, 135],
143
+ khaki3: [215, 215, 95],
144
+ light_coral: [255, 135, 135],
145
+ light_cyan1: [215, 255, 255],
146
+ light_cyan3: [175, 215, 215],
147
+ light_goldenrod1: [255, 255, 95],
148
+ light_goldenrod2: [215, 215, 135],
149
+ light_goldenrod3: [215, 175, 95],
150
+ light_green: [135, 255, 95],
151
+ light_pink1: [255, 175, 175],
152
+ light_pink3: [215, 135, 135],
153
+ light_pink4: [135, 95, 95],
154
+ light_salmon1: [255, 175, 135],
155
+ light_salmon3: [175, 135, 95],
156
+ light_sea_green: [0, 175, 175],
157
+ light_sky_blue1: [175, 215, 255],
158
+ light_sky_blue3: [135, 175, 175],
159
+ light_slate_blue: [135, 135, 255],
160
+ light_slate_grey: [135, 135, 175],
161
+ light_steel_blue1: [215, 215, 255],
162
+ light_steel_blue3: [175, 175, 215],
163
+ light_steel_blue: [175, 175, 255],
164
+ light_yellow3: [215, 215, 175],
165
+ lime: [0, 255, 0],
166
+ magenta1: [255, 0, 255],
167
+ magenta2: [215, 0, 255],
168
+ magenta3: [175, 0, 175],
169
+ maroon: [128, 0, 0],
170
+ medium_orchid1: [215, 95, 255],
171
+ medium_orchid3: [175, 95, 175],
172
+ medium_orchid: [175, 95, 215],
173
+ medium_purple1: [175, 135, 255],
174
+ medium_purple2: [175, 95, 255],
175
+ medium_purple3: [135, 95, 175],
176
+ medium_purple4: [95, 95, 135],
177
+ medium_purple: [135, 135, 215],
178
+ medium_spring_green: [0, 255, 175],
179
+ medium_turquoise: [95, 215, 215],
180
+ medium_violet_red: [175, 0, 135],
181
+ misty_rose1: [255, 215, 215],
182
+ misty_rose3: [215, 175, 175],
183
+ navajo_white1: [255, 215, 175],
184
+ navajo_white3: [175, 175, 135],
185
+ navy: [0, 0, 128],
186
+ navy_blue: [0, 0, 95],
187
+ olive: [128, 128, 0],
188
+ orange: [255, 128, 0],
189
+ orange1: [255, 175, 0],
190
+ orange3: [215, 135, 0],
191
+ orange4: [95, 95, 0],
192
+ orange_red1: [255, 95, 0],
193
+ orchid1: [255, 135, 255],
194
+ orchid2: [255, 135, 215],
195
+ orchid: [215, 95, 215],
196
+ pale_green1: [135, 255, 175],
197
+ pale_green3: [95, 215, 95],
198
+ pale_turquoise1: [175, 255, 255],
199
+ pale_turquoise4: [95, 135, 135],
200
+ pale_violet_red1: [255, 135, 175],
201
+ pink1: [255, 175, 215],
202
+ pink3: [215, 135, 175],
203
+ plum1: [255, 175, 255],
204
+ plum2: [215, 175, 255],
205
+ plum3: [215, 135, 215],
206
+ plum4: [135, 95, 135],
207
+ purple3: [95, 0, 215],
208
+ purple4: [95, 0, 135],
209
+ purple: [128, 0, 128],
210
+ red1: [255, 0, 0],
211
+ red3: [175, 0, 0],
212
+ rosy_brown: [175, 135, 135],
213
+ royal_blue1: [95, 95, 255],
214
+ salmon1: [255, 135, 95],
215
+ sandy_brown: [255, 175, 95],
216
+ sea_green1: [95, 255, 135],
217
+ sea_green2: [95, 255, 95],
218
+ sea_green3: [95, 215, 135],
219
+ silver: [192, 192, 192],
220
+ sky_blue1: [135, 215, 255],
221
+ sky_blue2: [135, 175, 255],
222
+ sky_blue3: [95, 175, 215],
223
+ slate_blue1: [135, 95, 255],
224
+ slate_blue3: [95, 95, 175],
225
+ spring_green1: [0, 255, 135],
226
+ spring_green2: [0, 215, 135],
227
+ spring_green3: [0, 175, 95],
228
+ spring_green4: [0, 135, 95],
229
+ steel_blue1: [95, 175, 255],
230
+ steel_blue3: [95, 135, 215],
231
+ steel_blue: [95, 135, 175],
232
+ tan: [215, 175, 135],
233
+ teal: [0, 128, 128],
234
+ thistle1: [255, 215, 255],
235
+ thistle3: [215, 175, 215],
236
+ turquoise2: [0, 215, 255],
237
+ turquoise4: [0, 135, 135],
238
+ violet: [215, 135, 255],
239
+ wheat1: [255, 255, 175],
240
+ wheat4: [135, 135, 95],
241
+ yellow1: [255, 255, 0],
242
+ yellow2: [215, 255, 0],
243
+ yellow3: [175, 215, 0],
244
+ yellow4: [135, 135, 0]
245
+ }.map do |k, rgb|
246
+ [k, [CSI, "38;2;", *rgb.join(";"), "m"].join]
247
+ end.to_h
248
+
249
+ ExtendedColors =
250
+ (0..255)
251
+ .map {["color#{it}".to_sym, [CSI, "38;5;", it, "m"].join ]}
252
+ .to_h
253
+ .merge(RGB_COLORS)
254
+ .freeze
255
+
256
+ def get_chunk(sym, extended: false)
257
+ code = Colors.fetch(sym.to_sym) do
258
+ if extended
259
+ ExtendedColors.fetch(sym.to_sym) {
260
+ [:error, "bad color code :#{sym}"]
261
+ }
262
+ else
263
+ [:error, "bad color code :#{sym}"]
264
+ end
265
+ end
266
+ use_color? ? code : ""
267
+ end
268
+
269
+ def get_chunk!(sym, extended: false)
270
+ case get_chunk(sym, extended:)
271
+ in :error, msg
272
+ raise BadColor, msg
273
+ in result
274
+ result
275
+ end
276
+ end
277
+
278
+ def get_chunks(sym, extended:)
279
+ sym.to_s.split(ANSI_CODE_SPLITTING_STRING).map do
280
+ case get_chunk(it, extended:)
281
+ in [:error, _messag] => error
282
+ return error
283
+ in encoded
284
+ encoded
285
+ end
286
+ end
287
+ .join
288
+ end
289
+
290
+ def use_color? = @__use_color__ ||= !ENV['NO_COLOR']
291
+ end
292
+ end
293
+ end
294
+ # SPDX-License-Identifier: AGPL-3.0-or-later
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'l43/simple_color/color_data'
4
+ module L43
5
+ module SimpleColor
6
+ module Colorize extend self
7
+ include ColorData
8
+ class Parser
9
+ private
10
+ def initialize(str, reset: true)
11
+ end
12
+ end
13
+
14
+ ColorSpecRgx = %r{(?:\s|\A):[__[:alnum:]]+(?:\s|\z)}
15
+ Meta = %r{[:\s]+}
16
+
17
+ def colorize(str, reset: true, extended: false)
18
+ case _colorize(str, extended:)
19
+ in String => encoded
20
+ reset ? encoded + get_chunk(:reset) : encoded
21
+ in error
22
+ error
23
+ end
24
+ end
25
+
26
+ def colorize!(str, reset: true, extended: false)
27
+ case colorize(str, reset:, extended:)
28
+ in [:error, msg]
29
+ raise BadColor, msg
30
+ in result
31
+ result
32
+ end
33
+ end
34
+
35
+ def xcolorize(str, reset: true) = colorize(str, reset:, extended: true)
36
+ def xcolorize!(str, reset: true) = colorize!(str, reset:, extended: true)
37
+
38
+ private
39
+ def _colorize(str, reset: true, extended: false)
40
+ case _replace_color_codes(str, extended:)
41
+ in [:error, _msg] => error
42
+ error
43
+ in coded
44
+ coded.gsub("::", ":")
45
+ end
46
+ end
47
+
48
+ def _replace_color_codes(str, extended: false)
49
+ str.gsub ColorSpecRgx do |match|
50
+ spec = match.gsub(Meta, "")
51
+ case get_chunks(spec, extended:)
52
+ in [:error, _message] => error
53
+ return error
54
+ in code
55
+ code
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
62
+ # SPDX-License-Identifier: AGPL-3.0-or-later
@@ -2,7 +2,7 @@
2
2
 
3
3
  module L43
4
4
  module SimpleColor
5
- VERSION = '0.1.0'
5
+ VERSION = '0.2.0'
6
6
  end
7
7
  end
8
8
  # SPDX-License-Identifier: AGPL-3.0-or-later
@@ -1,74 +1,56 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'l43/simple_color/color_data'
4
+ require 'l43/simple_color/colorize'
3
5
  module L43
4
6
  module SimpleColor extend self
5
- Bold = "\x1b[1m"
6
- Dim = "\x1b[2m"
7
- Reset = "\x1b[0m"
8
- Underline = "\x1b[4m"
7
+ include ColorData
9
8
 
10
- Colors = {
11
- black: "\x1b[30m",
12
- blue: "\x1b[34m",
13
- cyan: "\x1b[36m",
14
- green: "\x1b[32m",
15
- magenta: "\x1b[35m",
16
- red: "\x1b[31m",
17
- white: "\x1b[37m",
18
- yellow: "\x1b[33m",
19
9
 
20
- bgblack: "\x1b[40m",
21
- bgblue: "\x1b[44m",
22
- bgcyan: "\x1b[46m",
23
- bggreen: "\x1b[42m",
24
- bgmagenta: "\x1b[45m",
25
- bgred: "\x1b[41m",
26
- bgwhite: "\x1b[47m",
27
- bgyellow: "\x1b[43m",
28
10
 
29
- b: Bold,
30
- bold: Bold,
31
- d: Dim,
32
- dim: Dim,
33
- r: Reset,
34
- reset: Reset,
35
- ul: Underline,
36
- underline: Underline,
37
- }
11
+ def xcolor(*chunks, reset: true) = color(*chunks, extended: true, reset:)
12
+ def xcolor!(*chunks, reset: true) = color!(*chunks, extended: true, reset:)
38
13
 
39
- def color(*chunks, reset: true)
14
+ def color(*chunks, reset: true, extended: false)
40
15
  reset = reset ? :reset : ""
41
16
  [*chunks.flatten, reset].map do |chunk|
42
- format_chunk(chunk)
43
- end.compact.join
17
+ result = format_chunk(chunk, extended:)
18
+ case result
19
+ in [:error, _message] => error
20
+ return error
21
+ in encoded
22
+ encoded
23
+ end
24
+ end.join
44
25
  end
45
26
 
46
- def putc(*chunks, reset: true, device: $stderr)
47
- colored = color(chunks, reset:)
48
- device.puts colored
27
+ def color!(*chunks, reset: true, extended: false)
28
+ case color(*chunks, reset:, extended:)
29
+ in :error, msg
30
+ raise BadColor, msg
31
+ in colored
32
+ colored
33
+ end
49
34
  end
50
35
 
36
+ def putcol(*chunks, reset: true, device: $stderr, extended: false) = device.puts color!(chunks, reset:, extended:)
37
+ def xputcol(*chunks, reset: true, device: $stderr) = device.puts color!(chunks, reset:, extended: true)
38
+
51
39
  private
52
- def format_chunk(chunk)
40
+ def format_chunk(chunk, extended:)
53
41
  case chunk
54
42
  when String
55
43
  chunk
56
44
  when Integer
57
45
  " " * chunk
58
46
  when nil
59
- "\n" + get_chunk!(:reset)
47
+ "\n" + get_chunk(:reset)
60
48
  else
61
- format_color(chunk) if use_color?
49
+ get_chunks(chunk, extended:) if use_color?
62
50
  end
63
51
  end
64
52
 
65
- def format_color(sym)
66
- sym.to_s.split("_").map { get_chunk!(it) }.join
67
- end
68
-
69
- def get_chunk!(sym) = Colors.fetch(sym.to_sym) { raise ArgumentError, "bad color spec: #{sym.inspect}" }
70
53
 
71
- def use_color? = @__use_color__ ||= !ENV['NO_COLOR']
72
54
  end
73
55
  end
74
56
  # SPDX-License-Identifier: AGPL-3.0-or-later
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: l43_simple_color
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Robert Dober
@@ -27,14 +27,19 @@ description: 'Colorize chunks of strings with ANSI colors.
27
27
 
28
28
  '
29
29
  email: robert.dober@gmail.com
30
- executables: []
30
+ executables:
31
+ - simple_color
31
32
  extensions: []
32
33
  extra_rdoc_files: []
33
34
  files:
34
35
  - LICENSE
35
36
  - README.md
37
+ - bin/simple_color
36
38
  - lib/l43.rb
37
39
  - lib/l43/simple_color.rb
40
+ - lib/l43/simple_color/cli.rb
41
+ - lib/l43/simple_color/color_data.rb
42
+ - lib/l43/simple_color/colorize.rb
38
43
  - lib/l43/simple_color/version.rb
39
44
  homepage: https://www.codeberg.org/lab419/l43_simple_color.git
40
45
  licenses: