reline 0.4.0 → 0.4.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 24b02f1563ed151bd0b67246977442d845c887048264399384dddf506b4d6de2
4
- data.tar.gz: 3d51b1b162709f7d378e782a4f28b6b1e99b0fe3fa8929846481c4c6ab9dae5e
3
+ metadata.gz: b632074a7d879f8c00b4af972fb39af64a4775fbfdf0bedd252fa629891b77b4
4
+ data.tar.gz: 2406a738d92b076047ee697f527e4839cfd3012975a188784197cfddba3ce277
5
5
  SHA512:
6
- metadata.gz: 0a467797d4c4191c3b9949b5048fc3cadae9e837bdf086565e51206f7d6786774ae13b6081f6e418fdf4ee62c82d02e369d50a4cca9955918ebfb682d5875a7d
7
- data.tar.gz: 65e0a409b22c3f5ebeb8bd3b068168bdabac6cda5d0b8b7d6d07dacbe90265055a7eeb24f433a455b9bd6ca06dbe3f9d2018987ea1a098dedc96d6a6eb16430c
6
+ metadata.gz: 84f7857bea1edc1bdf6035c68be9c6278e3f9749b6978d5bdbe7471495d9b44ade2be95752446a82afbab7d653fff679523bc7d697a511cc8d2772ec190cdf49
7
+ data.tar.gz: 966a26ac5a42a2f8f21bc330e92469fa1543e87346f743282a7dc585611e4d0061a4db223367dac35fe37803984f8eec4126a1f5d4cd573c96bd2476b832f94e
data/lib/reline/face.rb CHANGED
@@ -74,6 +74,13 @@ class Reline::Face
74
74
  @definition[name] = values
75
75
  end
76
76
 
77
+ def reconfigure
78
+ @definition.each_value do |values|
79
+ values.delete(:escape_sequence)
80
+ values[:escape_sequence] = format_to_sgr(values.to_a).freeze
81
+ end
82
+ end
83
+
77
84
  def [](name)
78
85
  @definition.dig(name, :escape_sequence) or raise ArgumentError, "unknown face: #{name}"
79
86
  end
@@ -82,6 +89,14 @@ class Reline::Face
82
89
 
83
90
  def sgr_rgb(key, value)
84
91
  return nil unless rgb_expression?(value)
92
+ if Reline::Face.truecolor?
93
+ sgr_rgb_truecolor(key, value)
94
+ else
95
+ sgr_rgb_256color(key, value)
96
+ end
97
+ end
98
+
99
+ def sgr_rgb_truecolor(key, value)
85
100
  case key
86
101
  when :foreground
87
102
  "38;2;"
@@ -90,6 +105,24 @@ class Reline::Face
90
105
  end + value[1, 6].scan(/../).map(&:hex).join(";")
91
106
  end
92
107
 
108
+ def sgr_rgb_256color(key, value)
109
+ # 256 colors are
110
+ # 0..15: standard colors, hight intensity colors
111
+ # 16..232: 216 colors (R, G, B each 6 steps)
112
+ # 233..255: grayscale colors (24 steps)
113
+ # This methods converts rgb_expression to 216 colors
114
+ rgb = value[1, 6].scan(/../).map(&:hex)
115
+ # Color steps are [0, 95, 135, 175, 215, 255]
116
+ r, g, b = rgb.map { |v| v <= 95 ? v / 48 : (v - 35) / 40 }
117
+ color = (16 + 36 * r + 6 * g + b)
118
+ case key
119
+ when :foreground
120
+ "38;5;#{color}"
121
+ when :background
122
+ "48;5;#{color}"
123
+ end
124
+ end
125
+
93
126
  def format_to_sgr(ordered_values)
94
127
  sgr = "\e[" + ordered_values.map do |key_value|
95
128
  key, value = key_value
@@ -124,6 +157,15 @@ class Reline::Face
124
157
 
125
158
  private_constant :SGR_PARAMETERS, :Config
126
159
 
160
+ def self.truecolor?
161
+ @force_truecolor || %w[truecolor 24bit].include?(ENV['COLORTERM'])
162
+ end
163
+
164
+ def self.force_truecolor
165
+ @force_truecolor = true
166
+ @configs&.each_value(&:reconfigure)
167
+ end
168
+
127
169
  def self.[](name)
128
170
  @configs[name]
129
171
  end
@@ -1,3 +1,3 @@
1
1
  module Reline
2
- VERSION = '0.4.0'
2
+ VERSION = '0.4.1'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: reline
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - aycabta
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-11-07 00:00:00.000000000 Z
11
+ date: 2023-11-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: io-console