sai 0.2.0 → 0.3.1
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/.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
|
|