sai 0.2.0 → 0.3.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.yardopts +1 -1
- data/CHANGELOG.md +38 -1
- data/README.md +39 -241
- data/docs/USAGE.md +351 -0
- data/lib/sai/ansi/color_parser.rb +109 -0
- data/lib/sai/ansi/sequence_processor.rb +269 -0
- data/lib/sai/ansi/sequenced_string.rb +475 -0
- data/lib/sai/ansi/style_parser.rb +66 -0
- data/lib/sai/ansi.rb +0 -27
- data/lib/sai/conversion/color_sequence.rb +4 -4
- data/lib/sai/conversion/rgb/color_classifier.rb +209 -0
- data/lib/sai/conversion/rgb/color_indexer.rb +48 -0
- data/lib/sai/conversion/rgb/color_space.rb +192 -0
- data/lib/sai/conversion/rgb/color_transformer.rb +140 -0
- data/lib/sai/conversion/rgb.rb +23 -269
- data/lib/sai/decorator/color_manipulations.rb +157 -0
- data/lib/sai/decorator/delegation.rb +84 -0
- data/lib/sai/decorator/gradients.rb +363 -0
- data/lib/sai/decorator/hex_colors.rb +56 -0
- data/lib/sai/decorator/named_colors.rb +780 -0
- data/lib/sai/decorator/named_styles.rb +276 -0
- data/lib/sai/decorator/rgb_colors.rb +64 -0
- data/lib/sai/decorator.rb +35 -795
- data/lib/sai/mode_selector.rb +19 -19
- data/lib/sai/named_colors.rb +437 -0
- data/lib/sai.rb +753 -23
- data/sig/manifest.yaml +3 -0
- data/sig/sai/ansi/color_parser.rbs +77 -0
- data/sig/sai/ansi/sequence_processor.rbs +178 -0
- data/sig/sai/ansi/sequenced_string.rbs +380 -0
- data/sig/sai/ansi/style_parser.rbs +59 -0
- data/sig/sai/ansi.rbs +0 -10
- data/sig/sai/conversion/rgb/color_classifier.rbs +165 -0
- data/sig/sai/conversion/rgb/color_indexer.rbs +41 -0
- data/sig/sai/conversion/rgb/color_space.rbs +129 -0
- data/sig/sai/conversion/rgb/color_transformer.rbs +99 -0
- data/sig/sai/conversion/rgb.rbs +15 -198
- data/sig/sai/decorator/color_manipulations.rbs +125 -0
- data/sig/sai/decorator/delegation.rbs +47 -0
- data/sig/sai/decorator/gradients.rbs +267 -0
- data/sig/sai/decorator/hex_colors.rbs +48 -0
- data/sig/sai/decorator/named_colors.rbs +1491 -0
- data/sig/sai/decorator/named_styles.rbs +72 -0
- data/sig/sai/decorator/rgb_colors.rbs +52 -0
- data/sig/sai/decorator.rbs +25 -202
- data/sig/sai/mode_selector.rbs +19 -19
- data/sig/sai/named_colors.rbs +65 -0
- data/sig/sai.rbs +1485 -44
- metadata +38 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0c45105e60b5f7a3a93d837080975996e96a340aef0ad3fd86cd4b5a1be17e8f
|
4
|
+
data.tar.gz: baf93c18ef40221c86c329deeeaabbe7a3619744d3a80a9349314624a4af3995
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c1540fe3fd55f0a338ff04ff6f9794e831b831c040637f4cdd4f0de0ab0a689a55f95d5c1a744f3ae25b0bc7452983044568e83b6e665439672142cd2abd811b
|
7
|
+
data.tar.gz: 4244b0401b7fd0af26665a0a5b5622dd09bd364e4166bc8d12a6c69f94a52b09511d56afe2cd8eaedf1401c402b3ba63845aa900c147e408312221dcc243e21d
|
data/.yardopts
CHANGED
data/CHANGELOG.md
CHANGED
@@ -6,6 +6,41 @@ The format is based on [Keep a Changelog], and this project adheres to [Break Ve
|
|
6
6
|
|
7
7
|
## [Unreleased]
|
8
8
|
|
9
|
+
## [0.3.1] - 2025-01-22
|
10
|
+
|
11
|
+
### Added
|
12
|
+
|
13
|
+
* [#8](https://github.com/aaronmallen/sai/pull/8) - Add color manipulation methods for darkening and lightening colors
|
14
|
+
by [@aaronmallen](https://github.com/aaronmallen)
|
15
|
+
* [#9](https://github.com/aaronmallen/sai/pull/9) - Add gradient and rainbow color effects for text and backgrounds by
|
16
|
+
[@aaronmallen](https://github.com/aaronmallen)
|
17
|
+
* [#13](https://github.com/aaronmallen/sai/pull/13) - Add support for over 360 named colors expanding the color palette
|
18
|
+
by [@aaronmallen](https://github.com/aaronmallen)
|
19
|
+
|
20
|
+
### Changed
|
21
|
+
|
22
|
+
* [#10](https://github.com/aaronmallen/sai/pull/10) - Refactor `Sai::Decorator` into component modules by
|
23
|
+
[@aaronmallen](https://github.com/aaronmallen)
|
24
|
+
* [#11](https://github.com/aaronmallen/sai/pull/11) - Refactor `Sai::Conversion::RGB` into component modules by
|
25
|
+
[@aaronmallen](https://github.com/aaronmallen)
|
26
|
+
* [#12](https://github.com/aaronmallen/sai/pull/12) - Refactor ANSI sequence processing into specialized parser classes
|
27
|
+
by [@aaronmallen](https://github.com/aaronmallen)
|
28
|
+
|
29
|
+
## [0.3.0] - 2025-01-20
|
30
|
+
|
31
|
+
### Added
|
32
|
+
|
33
|
+
* [#6](https://github.com/aaronmallen/sai/pull/6) - Add `Sai::ANSI::SequencedString` for ANSI string manipulation by
|
34
|
+
[@aaronmallen](https://github.com/aaronmallen)
|
35
|
+
|
36
|
+
### Changed
|
37
|
+
|
38
|
+
* [#5](https://github.com/aaronmallen/sai/pull/5) - Remove unnecessary error handling in `Sai::Decorator` by
|
39
|
+
[@aaronmallen](https://github.com/aaronmallen)
|
40
|
+
|
41
|
+
* [#6](https://github.com/aaronmallen/sai/pull/6) - Changed `Sai::Decorator#decorate` now returns a
|
42
|
+
`Sai::ANSI::SequencedString` by [@aaronmallen](https://github.com/aaronmallen)
|
43
|
+
|
9
44
|
## [0.2.0] - 2025-01-20
|
10
45
|
|
11
46
|
### Added
|
@@ -29,5 +64,7 @@ The format is based on [Keep a Changelog], and this project adheres to [Break Ve
|
|
29
64
|
|
30
65
|
<!-- versions -->
|
31
66
|
|
32
|
-
[Unreleased]: https://github.com/aaronmallen/sai/compare/0.
|
67
|
+
[Unreleased]: https://github.com/aaronmallen/sai/compare/0.3.1..HEAD
|
68
|
+
[0.3.1]: https://github.com/aaronmallen/sai/compare/0.3.0..0.3.1
|
69
|
+
[0.3.0]: https://github.com/aaronmallen/sai/compare/0.2.0..0.3.0
|
33
70
|
[0.2.0]: https://github.com/aaronmallen/sai/compare/0.1.0..0.2.0
|
data/README.md
CHANGED
@@ -1,36 +1,43 @@
|
|
1
1
|
# Sai
|
2
2
|
|
3
3
|
[](https://rubygems.org/gems/sai)
|
4
|
+
[](https://app.codacy.com/gh/aaronmallen/sai)
|
5
|
+
[](https://app.codacy.com/gh/aaronmallen/sai/coverage)
|
4
6
|
[](./LICENSE)
|
5
|
-
[](https://rubydoc.info/gems/sai/0.
|
7
|
+
[](https://rubydoc.info/gems/sai/0.3.1)
|
6
8
|
[](https://github.com/aaronmallen/sai/issues?q=state%3Aopen%20)
|
7
9
|
|
8
10
|
An elegant color management system for crafting sophisticated CLI applications
|
9
11
|
|
10
12
|
```ruby
|
11
|
-
|
12
|
-
puts Sai.
|
13
|
-
puts Sai.
|
13
|
+
# Create beautiful CLI applications with intuitive color management
|
14
|
+
puts Sai.rgb(255, 128, 0).bold.decorate('Warning: Battery Low')
|
15
|
+
puts Sai.hex('#4834d4').italic.decorate('Processing request...')
|
16
|
+
puts Sai.bright_cyan.on_blue.underline.decorate('Download Complete!')
|
17
|
+
|
18
|
+
# Adjust color brightness
|
19
|
+
puts Sai.red.darken_text(0.3).decorate('Subtle Error Message')
|
20
|
+
puts Sai.blue.lighten_text(0.5).decorate('Highlighted Info')
|
21
|
+
|
22
|
+
# Analyze and manipulate ANSI-encoded text
|
23
|
+
text = Sai.sequence("\e[31mError:\e[0m Connection failed")
|
24
|
+
puts text.without_color # Keep formatting, remove colors
|
25
|
+
puts text.stripped # Get plain text without any formatting
|
14
26
|
```
|
15
27
|
|
16
28
|
Sai (彩) - meaning 'coloring' or 'paint' in Japanese - is a powerful and intuitive system for managing color output in
|
17
29
|
command-line applications. Drawing inspiration from traditional Japanese artistic techniques, Sai brings vibrancy and
|
18
30
|
harmony to terminal interfaces through its sophisticated color management.
|
19
31
|
|
20
|
-
Sai empowers developers to create beautiful, colorful CLI applications that maintain visual consistency across different
|
21
|
-
terminal capabilities. Like its artistic namesake, it combines simplicity and sophistication to bring rich, adaptive
|
22
|
-
color to your terminal interfaces.
|
23
|
-
|
24
32
|
## Features
|
25
33
|
|
26
|
-
*
|
27
|
-
*
|
28
|
-
*
|
29
|
-
*
|
30
|
-
*
|
31
|
-
*
|
34
|
+
* Rich color support (True Color, 256 colors, ANSI, and basic modes)
|
35
|
+
* Automatic terminal capability detection and color mode adaptation
|
36
|
+
* RGB, Hex, and named color (**over 360 named colors**) support with bright variants
|
37
|
+
* Comprehensive text styling (bold, italic, underline, etc.)
|
38
|
+
* Advanced ANSI sequence parsing and manipulation
|
39
|
+
* Intelligent color downgrading for compatibility
|
32
40
|
* Respects NO_COLOR environment variable
|
33
|
-
* Can be used directly or included in classes/modules
|
34
41
|
|
35
42
|
## Installation
|
36
43
|
|
@@ -42,20 +49,20 @@ gem 'sai'
|
|
42
49
|
|
43
50
|
Or install it yourself as:
|
44
51
|
|
45
|
-
```
|
52
|
+
```ruby
|
46
53
|
gem install sai
|
47
54
|
```
|
48
55
|
|
49
|
-
|
50
|
-
|
51
|
-
|
56
|
+
> [!IMPORTANT]
|
57
|
+
> If you're upgrading from version 0.2.0, please see our [Migration Guide](docs/migrations/0.2.0-0.3.0.md) for
|
58
|
+
> important changes.
|
52
59
|
|
53
|
-
|
60
|
+
## Quick Start
|
54
61
|
|
55
62
|
```ruby
|
56
63
|
require 'sai'
|
57
64
|
|
58
|
-
#
|
65
|
+
# Basic usage
|
59
66
|
puts Sai.red.decorate('Error!')
|
60
67
|
puts Sai.bright_blue.on_white.decorate('Info')
|
61
68
|
|
@@ -63,234 +70,25 @@ puts Sai.bright_blue.on_white.decorate('Info')
|
|
63
70
|
puts Sai.rgb(255, 128, 0).decorate('Custom color')
|
64
71
|
puts Sai.on_rgb(0, 255, 128).decorate('Custom background')
|
65
72
|
|
66
|
-
#
|
67
|
-
puts Sai.
|
68
|
-
puts Sai.
|
73
|
+
# Color manipulation
|
74
|
+
puts Sai.blue.lighten_text(0.5).decorate('Lightened blue')
|
75
|
+
puts Sai.red.darken_text(0.3).decorate('Darkened red')
|
69
76
|
|
70
77
|
# Applying styles
|
71
78
|
puts Sai.bold.underline.decorate('Important')
|
72
79
|
puts Sai.red.bold.italic.decorate('Error!')
|
73
80
|
|
74
|
-
#
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
.decorate('Styled text')
|
80
|
-
```
|
81
|
-
|
82
|
-
### Module Inclusion
|
83
|
-
|
84
|
-
```ruby
|
85
|
-
class CLI
|
86
|
-
include Sai
|
87
|
-
|
88
|
-
def error(message)
|
89
|
-
puts decorator.red.bold.decorate(message)
|
90
|
-
end
|
91
|
-
|
92
|
-
def info(message)
|
93
|
-
puts decorator.bright_blue.decorate(message)
|
94
|
-
end
|
95
|
-
|
96
|
-
def success(message)
|
97
|
-
puts decorator.with_mode(color_mode.ansi_auto).green.decorate(message)
|
98
|
-
end
|
99
|
-
end
|
100
|
-
|
101
|
-
cli = CLI.new
|
102
|
-
cli.error('Something went wrong!')
|
103
|
-
cli.info('Processing...')
|
104
|
-
cli.success('Done!')
|
105
|
-
```
|
106
|
-
|
107
|
-
### Defining Reusable Styles
|
108
|
-
|
109
|
-
Sai decorators can be assigned to constants to create reusable styles throughout your application:
|
110
|
-
|
111
|
-
```ruby
|
112
|
-
module Style
|
113
|
-
ERROR = Sai.bold.bright_white.on_red
|
114
|
-
WARNING = Sai.black.on_yellow
|
115
|
-
SUCCESS = Sai.bright_green
|
116
|
-
INFO = Sai.bright_blue
|
117
|
-
HEADER = Sai.bold.bright_cyan.underline
|
118
|
-
end
|
119
|
-
|
120
|
-
# Use your defined styles
|
121
|
-
puts Style::ERROR.decorate('Something went wrong!')
|
122
|
-
puts Style::SUCCESS.decorate('Operation completed successfully')
|
123
|
-
|
124
|
-
# Styles can be further customized when needed
|
125
|
-
puts Style::ERROR.italic.decorate('Critical error!')
|
126
|
-
```
|
127
|
-
|
128
|
-
> [!TIP]
|
129
|
-
> This pattern is particularly useful for maintaining consistent styling across your application and creating theme
|
130
|
-
> systems. You can even build on existing styles:
|
131
|
-
>
|
132
|
-
> ```ruby
|
133
|
-
> module Theme
|
134
|
-
> PRIMARY = Sai.rgb(63, 81, 181)
|
135
|
-
> SECONDARY = Sai.rgb(255, 87, 34)
|
136
|
-
>
|
137
|
-
> BUTTON = PRIMARY.bold
|
138
|
-
> LINK = SECONDARY.underline
|
139
|
-
> HEADER = PRIMARY.bold.underline
|
140
|
-
> end
|
141
|
-
> ```
|
142
|
-
|
143
|
-
## Features
|
144
|
-
|
145
|
-
### Color Support
|
146
|
-
|
147
|
-
Sai supports up to 16.7 million colors (true color/24-bit) depending on your terminal's capabilities. Colors can be
|
148
|
-
specified in several ways:
|
149
|
-
|
150
|
-
#### RGB Colors
|
151
|
-
|
152
|
-
```ruby
|
153
|
-
# Specify any RGB color (0-255 per channel)
|
154
|
-
Sai.rgb(255, 128, 0).decorate('Orange text')
|
155
|
-
Sai.on_rgb(0, 255, 128).decorate('Custom green background')
|
156
|
-
```
|
157
|
-
|
158
|
-
#### Hex Colors
|
159
|
-
|
160
|
-
```ruby
|
161
|
-
# Use any hex color code
|
162
|
-
Sai.hex('#FF8000').decorate('Orange text')
|
163
|
-
Sai.on_hex('#00FF80').decorate('Custom green background')
|
164
|
-
```
|
165
|
-
|
166
|
-
#### Named Color Shortcuts
|
167
|
-
|
168
|
-
For convenience, Sai provides shortcuts for common ANSI colors:
|
169
|
-
|
170
|
-
Standard colors:
|
171
|
-
|
172
|
-
```ruby
|
173
|
-
Sai.red.decorate('Red text')
|
174
|
-
Sai.blue.decorate('Blue text')
|
175
|
-
Sai.on_green.decorate('Green background')
|
176
|
-
```
|
177
|
-
|
178
|
-
Bright variants:
|
179
|
-
|
180
|
-
```ruby
|
181
|
-
Sai.bright_red.decorate('Bright red text')
|
182
|
-
Sai.bright_blue.decorate('Bright blue text')
|
183
|
-
Sai.on_bright_green.decorate('Bright green background')
|
184
|
-
```
|
185
|
-
|
186
|
-
Available named colors:
|
187
|
-
|
188
|
-
* black/bright_black
|
189
|
-
* red/bright_red
|
190
|
-
* green/bright_green
|
191
|
-
* yellow/bright_yellow
|
192
|
-
* blue/bright_blue
|
193
|
-
* magenta/bright_magenta
|
194
|
-
* cyan/bright_cyan
|
195
|
-
* white/bright_white
|
196
|
-
|
197
|
-
> [!TIP]
|
198
|
-
> While named colors provide convenient shortcuts, remember that Sai supports the full RGB color space. Don't feel
|
199
|
-
> limited to just these predefined colors!
|
200
|
-
|
201
|
-
### Text Styles
|
202
|
-
|
203
|
-
Available styles:
|
204
|
-
|
205
|
-
* bold
|
206
|
-
* dim
|
207
|
-
* italic
|
208
|
-
* underline
|
209
|
-
* blink
|
210
|
-
* rapid_blink
|
211
|
-
* reverse
|
212
|
-
* conceal
|
213
|
-
* strike
|
214
|
-
|
215
|
-
Style removal:
|
216
|
-
|
217
|
-
* no_blink
|
218
|
-
* no_italic
|
219
|
-
* no_underline
|
220
|
-
* no_reverse
|
221
|
-
* no_conceal
|
222
|
-
* no_strike
|
223
|
-
* normal_intensity
|
224
|
-
|
225
|
-
### Color Mode Detection & Downgrading
|
226
|
-
|
227
|
-
Sai automatically detects your terminal's color capabilities and adapts the output appropriately:
|
228
|
-
|
229
|
-
* True Color terminals (24-bit): Full access to all 16.7 million colors
|
230
|
-
* 256-color terminals (8-bit): Colors are mapped to the closest available color in the 256-color palette
|
231
|
-
* ANSI terminals (4-bit): Colors are mapped to the 16 standard ANSI colors
|
232
|
-
* Basic terminals (3-bit): Colors are mapped to the 8 basic ANSI colors
|
233
|
-
* NO_COLOR: All color sequences are stripped when the NO_COLOR environment variable is set
|
234
|
-
|
235
|
-
> [!NOTE]
|
236
|
-
> This automatic downgrading ensures your application looks great across all terminal types without any extra code!
|
237
|
-
|
238
|
-
### Color Mode Selection
|
239
|
-
|
240
|
-
Sai provides flexible color mode selection through its `mode` interface:
|
241
|
-
|
242
|
-
```ruby
|
243
|
-
# Use automatic mode detection (default)
|
244
|
-
Sai.with_mode(Sai.mode.auto)
|
245
|
-
|
246
|
-
# Force specific color modes
|
247
|
-
puts Sai.with_mode(Sai.mode.true_color).red.decorate('24-bit color')
|
248
|
-
puts Sai.with_mode(Sai.mode.advanced).red.decorate('256 colors')
|
249
|
-
puts Sai.with_mode(Sai.mode.ansi).red.decorate('16 colors')
|
250
|
-
puts Sai.with_mode(Sai.mode.basic).red.decorate('8 colors')
|
251
|
-
puts Sai.with_mode(Sai.mode.no_color).red.decorate('No color')
|
252
|
-
|
253
|
-
# Use automatic downgrading
|
254
|
-
puts Sai.with_mode(Sai.mode.advanced_auto).red.decorate('256 colors or less')
|
255
|
-
puts Sai.with_mode(Sai.mode.ansi_auto).red.decorate('16 colors or less')
|
256
|
-
puts Sai.with_mode(Sai.mode.basic_auto).red.decorate('8 colors or less')
|
81
|
+
# Working with ANSI sequences
|
82
|
+
text = Sai.sequence("\e[31mError:\e[0m Details here")
|
83
|
+
puts text.without_color # Remove colors but keep formatting
|
84
|
+
puts text.without_style # Remove formatting but keep colors
|
85
|
+
puts text.stripped # Get plain text
|
257
86
|
```
|
258
87
|
|
259
|
-
|
260
|
-
> When using fixed color modes (like `true_color` or `advanced`), Sai will not automatically downgrade colors for
|
261
|
-
> terminals with lower color support. For automatic color mode adjustment, use modes ending in `_auto`
|
262
|
-
> (like `advanced_auto` or `ansi_auto`).
|
88
|
+
## Documentation
|
263
89
|
|
264
|
-
|
265
|
-
|
266
|
-
* Explicitly set specific color modes
|
267
|
-
* Use automatic mode detection (default)
|
268
|
-
* Set maximum color modes with automatic downgrading
|
269
|
-
* Disable colors entirely
|
270
|
-
|
271
|
-
### Terminal Support Detection
|
272
|
-
|
273
|
-
You can check the terminal's capabilities:
|
274
|
-
|
275
|
-
```ruby
|
276
|
-
# Using directly
|
277
|
-
Sai.support.true_color? # => true/false
|
278
|
-
Sai.support.advanced? # => true/false
|
279
|
-
Sai.support.ansi? # => true/false
|
280
|
-
Sai.support.basic? # => true/false
|
281
|
-
Sai.support.color? # => true/false
|
282
|
-
|
283
|
-
# Using included module
|
284
|
-
class CLI
|
285
|
-
include Sai
|
286
|
-
|
287
|
-
def check_support
|
288
|
-
if terminal_color_support.true_color?
|
289
|
-
puts "Terminal supports true color!"
|
290
|
-
end
|
291
|
-
end
|
292
|
-
end
|
293
|
-
```
|
90
|
+
* [Complete Usage Guide](docs/USAGE.md) - Comprehensive documentation of all features
|
91
|
+
* [API Documentation](https://rubydoc.info/gems/sai/0.3.1) - Detailed API reference
|
294
92
|
|
295
93
|
## Contributing
|
296
94
|
|