snibbets 2.0.32 → 2.0.34

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: e6701119f370f7f3a6190d811e5278799c973ed65b7f69a096b2675c91a2a124
4
- data.tar.gz: 6954526979c677af6c5cf3fece76c0df0eae2f83ae2975c00e2884e99a5a2cda
3
+ metadata.gz: 4bfb107dedc2d689ec1ed371dcaf1ef7fb240218af43831856acb552789a0ce2
4
+ data.tar.gz: 482355a0c4a27d707d92633c47adeb2be0db027a37311412cb903f7d47cdb0b6
5
5
  SHA512:
6
- metadata.gz: 4e3cf0a812450aacd9dd69863bb4ba02880fb57049e396ab7d02eb31b024ed12aabe1f84dd4ace68b5ccc3d2c29e09c114776fde050b4bdc5708fcf01dfe5af9
7
- data.tar.gz: 761105292b069c127ec2e32f0d39235883c4bd75d88b395d1a20b83b7fc6819aec0e9b5df67af14c7a2990196e5611aabf212afead13587ed2d62c2356489d34
6
+ metadata.gz: 40afbc2d33dc562db0e5e21ec7fe40fc10872f279c1bc95b67deb6aac9cff90e663abc0100e49c2a08ea4500e0e2eb4f442bcf34259a54b0b901cf53c883c7ce
7
+ data.tar.gz: 072cccc7e2c90dc557f4af25b9338a7cec21b00c0545b5155b07f413d6560b7d964008a8919a638b0c0b67089ccd12d568951c314c75c29d896694a3de45e19e
data/CHANGELOG.md CHANGED
@@ -1,3 +1,30 @@
1
+ ### 2.0.34
2
+
3
+ 2023-06-17 09:17
4
+
5
+ #### IMPROVED
6
+
7
+ - If a section of a snippet contains no code blocks, output the whole thing
8
+
9
+ #### FIXED
10
+
11
+ - Correct error if searching name only and no results are returned
12
+
13
+ ### 2.0.33
14
+
15
+ 2023-04-26 10:23
16
+
17
+ #### IMPROVED
18
+
19
+ - More coloring for prompts and messages
20
+ - Colorize headers in multi-snippet output
21
+ - If skylighting highlighting is enabled and the specified
22
+ - Add some normalization for some skylighting lexers
23
+
24
+ #### FIXED
25
+
26
+ - Highlighting returns empty if language contains non-alphanumeric characters
27
+
1
28
  ### 2.0.32
2
29
 
3
30
  2023-04-25 17:14
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- snibbets (2.0.32)
4
+ snibbets (2.0.34)
5
5
  mdless (~> 1.0, >= 1.0.32)
6
6
  tty-reader (~> 0.9, >= 0.9.0)
7
7
  tty-which (~> 0.5, >= 0.5.0)
@@ -17,47 +17,50 @@ GEM
17
17
  gem-release (2.2.2)
18
18
  json (2.6.3)
19
19
  language_server-protocol (3.17.0.3)
20
- mdless (1.0.32)
20
+ lint_roller (1.0.0)
21
+ mdless (1.0.33)
21
22
  multi_json (1.15.0)
22
- parallel (1.22.1)
23
+ parallel (1.23.0)
23
24
  parse_gemspec (1.0.0)
24
25
  parse_gemspec-cli (1.0.0)
25
26
  multi_json
26
27
  parse_gemspec
27
28
  thor
28
- parser (3.2.2.0)
29
+ parser (3.2.2.3)
29
30
  ast (~> 2.4.1)
31
+ racc
32
+ racc (1.7.1)
30
33
  rainbow (3.1.1)
31
34
  rake (13.0.6)
32
35
  rdoc (6.3.3)
33
- regexp_parser (2.7.0)
36
+ regexp_parser (2.8.1)
34
37
  rexml (3.2.5)
35
38
  rspec (3.12.0)
36
39
  rspec-core (~> 3.12.0)
37
40
  rspec-expectations (~> 3.12.0)
38
41
  rspec-mocks (~> 3.12.0)
39
- rspec-core (3.12.1)
42
+ rspec-core (3.12.2)
40
43
  rspec-support (~> 3.12.0)
41
- rspec-expectations (3.12.2)
44
+ rspec-expectations (3.12.3)
42
45
  diff-lcs (>= 1.2.0, < 2.0)
43
46
  rspec-support (~> 3.12.0)
44
47
  rspec-mocks (3.12.5)
45
48
  diff-lcs (>= 1.2.0, < 2.0)
46
49
  rspec-support (~> 3.12.0)
47
50
  rspec-support (3.12.0)
48
- rubocop (1.48.1)
51
+ rubocop (1.52.1)
49
52
  json (~> 2.3)
50
53
  parallel (~> 1.10)
51
- parser (>= 3.2.0.0)
54
+ parser (>= 3.2.2.3)
52
55
  rainbow (>= 2.2.2, < 4.0)
53
56
  regexp_parser (>= 1.8, < 3.0)
54
57
  rexml (>= 3.2.5, < 4.0)
55
- rubocop-ast (>= 1.26.0, < 2.0)
58
+ rubocop-ast (>= 1.28.0, < 2.0)
56
59
  ruby-progressbar (~> 1.7)
57
60
  unicode-display_width (>= 2.4.0, < 3.0)
58
- rubocop-ast (1.28.0)
61
+ rubocop-ast (1.29.0)
59
62
  parser (>= 3.2.1.0)
60
- rubocop-performance (1.16.0)
63
+ rubocop-performance (1.18.0)
61
64
  rubocop (>= 1.7.0, < 2.0)
62
65
  rubocop-ast (>= 0.4.0)
63
66
  ruby-progressbar (1.13.0)
@@ -71,13 +74,20 @@ GEM
71
74
  terminal-table
72
75
  simplecov-html (0.12.3)
73
76
  simplecov_json_formatter (0.1.4)
74
- standard (1.26.0)
77
+ standard (1.29.0)
75
78
  language_server-protocol (~> 3.17.0.2)
76
- rubocop (~> 1.48.1)
77
- rubocop-performance (~> 1.16.0)
79
+ lint_roller (~> 1.0)
80
+ rubocop (~> 1.52.0)
81
+ standard-custom (~> 1.0.0)
82
+ standard-performance (~> 1.1.0)
83
+ standard-custom (1.0.1)
84
+ lint_roller (~> 1.0)
85
+ standard-performance (1.1.0)
86
+ lint_roller (~> 1.0)
87
+ rubocop-performance (~> 1.18.0)
78
88
  terminal-table (3.0.2)
79
89
  unicode-display_width (>= 1.1.1, < 3)
80
- thor (1.2.1)
90
+ thor (1.2.2)
81
91
  tty-cursor (0.7.1)
82
92
  tty-reader (0.9.0)
83
93
  tty-cursor (~> 0.7)
data/README.md CHANGED
@@ -159,7 +159,7 @@ Snibbet's implementation of Skylighting has limited but better-looking themes, a
159
159
  ### Usage
160
160
 
161
161
  ```
162
- Snibbets v2.0.32
162
+ Snibbets v2.0.34
163
163
 
164
164
  Usage: snibbets [options] query
165
165
  -a, --all If a file contains multiple snippets, output all of them (no menu)
data/bin/snibbets CHANGED
@@ -26,6 +26,7 @@ module Snibbets
26
26
  def run
27
27
  options = Snibbets.options
28
28
  arguments = Snibbets.arguments
29
+ Color.coloring = $stdout.isatty
29
30
 
30
31
  optparse = OptionParser.new do |opts|
31
32
  opts.banner = "Usage: #{File.basename(__FILE__)} [options] query"
@@ -94,14 +95,14 @@ module Snibbets
94
95
  end
95
96
 
96
97
  opts.on('-h', '--help', 'Display this screen') do
97
- puts "Snibbets v#{VERSION}"
98
+ puts "{by}Snibbets {w}v#{VERSION}".x
98
99
  puts
99
100
  puts optparse
100
101
  Process.exit 0
101
102
  end
102
103
 
103
104
  opts.on('-v', '--version', 'Display version information') do
104
- puts "Snibbets v#{VERSION}"
105
+ puts "{by}Snibbets {w}v#{VERSION}".x
105
106
  Process.exit 0
106
107
  end
107
108
 
@@ -116,7 +117,7 @@ module Snibbets
116
117
  if arguments[:save_config]
117
118
  config = Snibbets::Config.new
118
119
  config.write_config
119
- puts "Configuration saved to #{config.config_file}"
120
+ puts "{bg}Configuration saved to {w}#{config.config_file}".x
120
121
  end
121
122
 
122
123
  if arguments[:edit_config]
@@ -127,8 +128,8 @@ module Snibbets
127
128
  end
128
129
 
129
130
  unless File.directory?(options[:source])
130
- puts 'The Snippets folder doesn\'t exist, please configure it.'
131
- puts 'Run `snibbets --configure` to open the config file for editing.'
131
+ puts '{br}The Snippets folder doesn\'t exist, please configure it.'.x
132
+ puts '{bg}Run `{bw}snibbets --configure{bg}` to open the config file for editing.'.x
132
133
  Process.exit 1
133
134
  end
134
135
 
@@ -155,7 +156,7 @@ module Snibbets
155
156
  if arguments[:save_config]
156
157
  Process.exit 0
157
158
  else
158
- puts 'No search query'
159
+ puts '{br}No search query'.x
159
160
  puts optparse
160
161
  Process.exit 1
161
162
  end
@@ -0,0 +1,329 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Cribbed from <https://github.com/flori/term-ansicolor>
4
+ module Snibbets
5
+ class ::String
6
+ def x
7
+ Color.template(self)
8
+ end
9
+
10
+ def uncolor
11
+ Color.uncolor(self)
12
+ end
13
+ end
14
+
15
+ # Terminal output color functions.
16
+ module Color
17
+ ESCAPE_REGEX = /(?<=\[)(?:(?:(?:[349]|10)[0-9]|[0-9])?;?)+(?=m)/.freeze
18
+ # All available color names. Available as methods and string extensions.
19
+ #
20
+ # @example Use a color as a method. Color reset will be added to end of string.
21
+ # Color.yellow('This text is yellow') => "\e[33mThis text is yellow\e[0m"
22
+ #
23
+ # @example Use a color as a string extension. Color reset added automatically.
24
+ # 'This text is green'.green => "\e[1;32mThis text is green\e[0m"
25
+ #
26
+ # @example Send a text string as a color
27
+ # Color.send('red') => "\e[31m"
28
+ ATTRIBUTES = [
29
+ [:clear, 0], # String#clear is already used to empty string in Ruby 1.9
30
+ [:reset, 0], # synonym for :clear
31
+ [:bold, 1],
32
+ [:dark, 2],
33
+ [:italic, 3], # not widely implemented
34
+ [:underline, 4],
35
+ [:underscore, 4], # synonym for :underline
36
+ [:blink, 5],
37
+ [:rapid_blink, 6], # not widely implemented
38
+ [:negative, 7], # no reverse because of String#reverse
39
+ [:concealed, 8],
40
+ [:strikethrough, 9], # not widely implemented
41
+ [:strike, 9], # not widely implemented
42
+ [:black, 30],
43
+ [:red, 31],
44
+ [:green, 32],
45
+ [:yellow, 33],
46
+ [:blue, 34],
47
+ [:magenta, 35],
48
+ [:purple, 35],
49
+ [:cyan, 36],
50
+ [:white, 37],
51
+ [:bgblack, 40],
52
+ [:bgred, 41],
53
+ [:bggreen, 42],
54
+ [:bgyellow, 43],
55
+ [:bgblue, 44],
56
+ [:bgmagenta, 45],
57
+ [:bgpurple, 45],
58
+ [:bgcyan, 46],
59
+ [:bgwhite, 47],
60
+ [:boldblack, 90],
61
+ [:boldred, 91],
62
+ [:boldgreen, 92],
63
+ [:boldyellow, 93],
64
+ [:boldblue, 94],
65
+ [:boldmagenta, 95],
66
+ [:boldpurple, 95],
67
+ [:boldcyan, 96],
68
+ [:boldwhite, 97],
69
+ [:boldbgblack, 100],
70
+ [:boldbgred, 101],
71
+ [:boldbggreen, 102],
72
+ [:boldbgyellow, 103],
73
+ [:boldbgblue, 104],
74
+ [:boldbgmagenta, 105],
75
+ [:boldbgpurple, 105],
76
+ [:boldbgcyan, 106],
77
+ [:boldbgwhite, 107],
78
+ [:softpurple, '0;35;40'],
79
+ [:hotpants, '7;34;40'],
80
+ [:knightrider, '7;30;40'],
81
+ [:flamingo, '7;31;47'],
82
+ [:yeller, '1;37;43'],
83
+ [:whiteboard, '1;30;47'],
84
+ [:chalkboard, '1;37;40'],
85
+ [:led, '0;32;40'],
86
+ [:redacted, '0;30;40'],
87
+ [:alert, '1;31;43'],
88
+ [:error, '1;37;41'],
89
+ [:default, '0;39']
90
+ ].map(&:freeze).freeze
91
+
92
+ ATTRIBUTE_NAMES = ATTRIBUTES.transpose.first
93
+
94
+ # Returns true if Snibbets::Color supports the +feature+.
95
+ #
96
+ # The feature :clear, that is mixing the clear color attribute into String,
97
+ # is only supported on ruby implementations, that do *not* already
98
+ # implement the String#clear method. It's better to use the reset color
99
+ # attribute instead.
100
+ def support?(feature)
101
+ case feature
102
+ when :clear
103
+ !String.instance_methods(false).map(&:to_sym).include?(:clear)
104
+ end
105
+ end
106
+
107
+ # Template coloring
108
+ class ::String
109
+ ##
110
+ ## Extract the longest valid %color name from a string.
111
+ ##
112
+ ## Allows %colors to bleed into other text and still
113
+ ## be recognized, e.g. %greensomething still finds
114
+ ## %green.
115
+ ##
116
+ ## @return [String] a valid color name
117
+ ##
118
+ def validate_color
119
+ valid_color = nil
120
+ compiled = ''
121
+ normalize_color.split('').each do |char|
122
+ compiled += char
123
+ valid_color = compiled if Color.attributes.include?(compiled.to_sym) || compiled =~ /^([fb]g?)?#([a-f0-9]{6})$/i
124
+ end
125
+
126
+ valid_color
127
+ end
128
+
129
+ ##
130
+ ## Normalize a color name, removing underscores,
131
+ ## replacing "bright" with "bold", and converting
132
+ ## bgbold to boldbg
133
+ ##
134
+ ## @return [String] Normalized color name
135
+ ##
136
+ def normalize_color
137
+ gsub(/_/, '').sub(/bright/i, 'bold').sub(/bgbold/, 'boldbg')
138
+ end
139
+
140
+ # Get the calculated ANSI color at the end of the
141
+ # string
142
+ #
143
+ # @return ANSI escape sequence to match color
144
+ #
145
+ def last_color_code
146
+ m = scan(ESCAPE_REGEX)
147
+
148
+ em = ['0']
149
+ fg = nil
150
+ bg = nil
151
+ rgbf = nil
152
+ rgbb = nil
153
+
154
+ m.each do |c|
155
+ case c
156
+ when '0'
157
+ em = ['0']
158
+ fg, bg, rgbf, rgbb = nil
159
+ when /^[34]8/
160
+ case c
161
+ when /^3/
162
+ fg = nil
163
+ rgbf = c
164
+ when /^4/
165
+ bg = nil
166
+ rgbb = c
167
+ end
168
+ else
169
+ c.split(/;/).each do |i|
170
+ x = i.to_i
171
+ if x <= 9
172
+ em << x
173
+ elsif x >= 30 && x <= 39
174
+ rgbf = nil
175
+ fg = x
176
+ elsif x >= 40 && x <= 49
177
+ rgbb = nil
178
+ bg = x
179
+ elsif x >= 90 && x <= 97
180
+ rgbf = nil
181
+ fg = x
182
+ elsif x >= 100 && x <= 107
183
+ rgbb = nil
184
+ bg = x
185
+ end
186
+ end
187
+ end
188
+ end
189
+
190
+ escape = "\e[#{em.join(';')}m"
191
+ escape += "\e[#{rgbb}m" if rgbb
192
+ escape += "\e[#{rgbf}m" if rgbf
193
+ escape + "\e[#{[fg, bg].delete_if(&:nil?).join(';')}m"
194
+ end
195
+ end
196
+
197
+ class << self
198
+ # Returns true if the coloring function of this module
199
+ # is switched on, false otherwise.
200
+ def coloring?
201
+ @coloring
202
+ end
203
+
204
+ attr_writer :coloring
205
+
206
+ ##
207
+ ## Enables colored output
208
+ ##
209
+ ## @example Turn color on or off based on TTY
210
+ ## Snibbets::Color.coloring = STDOUT.isatty
211
+ def coloring
212
+ @coloring ||= true
213
+ end
214
+
215
+ ##
216
+ ## Convert a template string to a colored string.
217
+ ## Colors are specified with single letters inside
218
+ ## curly braces. Uppercase changes background color.
219
+ ##
220
+ ## w: white, k: black, g: green, l: blue, y: yellow, c: cyan,
221
+ ## m: magenta, r: red, b: bold, u: underline, i: italic,
222
+ ## x: reset (remove background, color, emphasis)
223
+ ##
224
+ ## @example Convert a templated string
225
+ ## Color.template('{Rwb}Warning:{x} {w}you look a little {g}ill{x}')
226
+ ##
227
+ ## @param input [String, Array] The template
228
+ ## string. If this is an array, the
229
+ ## elements will be joined with a
230
+ ## space.
231
+ ##
232
+ ## @return [String] Colorized string
233
+ ##
234
+ def template(input)
235
+ input = input.join(' ') if input.is_a? Array
236
+ fmt = input.gsub(/%/, '%%')
237
+ fmt = fmt.gsub(/(?<!\\u|\$)\{(\w+)\}/i) do
238
+ Regexp.last_match(1).split('').map { |c| "%<#{c}>s" }.join('')
239
+ end
240
+
241
+ colors = { w: white, k: black, g: green, l: blue,
242
+ y: yellow, c: cyan, m: magenta, r: red,
243
+ W: bgwhite, K: bgblack, G: bggreen, L: bgblue,
244
+ Y: bgyellow, C: bgcyan, M: bgmagenta, R: bgred,
245
+ d: dark, b: bold, u: underline, i: italic, x: reset }
246
+
247
+ fmt.empty? ? input : format(fmt, colors)
248
+ end
249
+ end
250
+
251
+ ATTRIBUTES.each do |c, v|
252
+ new_method = <<-EOSCRIPT
253
+ def #{c}(string = nil)
254
+ result = ''
255
+ result << "\e[#{v}m" if Snibbets::Color.coloring?
256
+ if block_given?
257
+ result << yield
258
+ elsif string.respond_to?(:to_str)
259
+ result << string.to_str
260
+ elsif respond_to?(:to_str)
261
+ result << to_str
262
+ else
263
+ return result #only switch on
264
+ end
265
+ result << "\e[0m" if Snibbets::Color.coloring?
266
+ result
267
+ end
268
+ EOSCRIPT
269
+
270
+ module_eval(new_method)
271
+
272
+ next unless c =~ /bold/
273
+
274
+ # Accept brightwhite in addition to boldwhite
275
+ new_method = <<-EOSCRIPT
276
+ def #{c.to_s.sub(/bold/, 'bright')}(string = nil)
277
+ result = ''
278
+ result << "\e[#{v}m" if Snibbets::Color.coloring?
279
+ if block_given?
280
+ result << yield
281
+ elsif string.respond_to?(:to_str)
282
+ result << string.to_str
283
+ elsif respond_to?(:to_str)
284
+ result << to_str
285
+ else
286
+ return result #only switch on
287
+ end
288
+ result << "\e[0m" if Snibbets::Color.coloring?
289
+ result
290
+ end
291
+ EOSCRIPT
292
+
293
+ module_eval(new_method)
294
+ end
295
+
296
+ def rgb(hex)
297
+ is_bg = hex.match(/^bg?#/) ? true : false
298
+ hex_string = hex.sub(/^([fb]g?)?#/, '')
299
+
300
+ parts = hex_string.match(/(?<r>..)(?<g>..)(?<b>..)/)
301
+ t = []
302
+ %w[r g b].each do |e|
303
+ t << parts[e].hex
304
+ end
305
+ color =
306
+ "\e[#{is_bg ? '48' : '38'};2;#{t.join(';')}m"
307
+ end
308
+
309
+ # Returns an uncolored version of the string, that is all
310
+ # ANSI-sequences are stripped from the string.
311
+ def uncolor(string = nil) # :yields:
312
+ if block_given?
313
+ yield.to_str.gsub(ESCAPE_REGEX, '')
314
+ elsif string.respond_to?(:to_str)
315
+ string.to_str.gsub(ESCAPE_REGEX, '')
316
+ elsif respond_to?(:to_str)
317
+ to_str.gsub(ESCAPE_REGEX, '')
318
+ else
319
+ ''
320
+ end
321
+ end
322
+
323
+ # Returns an array of all Snibbets::Color attributes as symbols.
324
+ def attributes
325
+ ATTRIBUTE_NAMES
326
+ end
327
+ extend self
328
+ end
329
+ end
@@ -2,6 +2,7 @@ module Snibbets
2
2
  module Highlight
3
3
  class << self
4
4
  def run_command_with_input(*cmd, input: nil, fallback: nil)
5
+
5
6
  stdout, _stderr, status = Open3.capture3(*cmd, stdin_data: input)
6
7
  if status.success?
7
8
  stdout
@@ -35,10 +36,9 @@ module Snibbets
35
36
  else
36
37
  ''
37
38
  end
38
- return code if syntax.nil? || syntax.empty?
39
+ return code if syntax.nil? || syntax.empty? || !Lexers.skylight_lexer?(syntax)
39
40
 
40
41
  run_command_with_input("#{executable} #{theme}--syntax #{syntax}", input: code)
41
- # `echo #{Shellwords.escape(code)} | #{executable} #{theme}--syntax #{syntax}`
42
42
  end
43
43
 
44
44
  def highlight_fences(code, filename, syntax)
@@ -46,7 +46,8 @@ module Snibbets
46
46
 
47
47
  content.fences.each do |f|
48
48
  rx = Regexp.new(Regexp.escape(f[:code]))
49
- highlighted = highlight(f[:code].gsub(/\\k</, '\k\<'), filename, f[:lang] || syntax).strip
49
+ syn = Lexers.normalize_lexer(f[:lang] || syntax)
50
+ highlighted = highlight(f[:code].gsub(/\\k</, '\k\<'), filename, syn).strip
50
51
  code.sub!(/#{rx}/, highlighted)
51
52
  end
52
53
 
@@ -62,6 +63,7 @@ module Snibbets
62
63
 
63
64
  theme ||= Snibbets.options[:highlight_theme] || 'monokai'
64
65
  syntax ||= Lexers.syntax_from_extension(filename)
66
+ syntax = Lexers.normalize_lexer(syntax)
65
67
 
66
68
  return code if ['text'].include?(syntax)
67
69
 
@@ -69,7 +71,11 @@ module Snibbets
69
71
  pygments = TTY::Which.which('pygmentize')
70
72
 
71
73
  if Snibbets.options[:highlighter] =~ /^s/ && !skylight.nil?
72
- return highlight_skylight(skylight, code, syntax, theme)
74
+ if !Lexers.skylight_lexer?(syntax) && !pygments.nil?
75
+ return highlight_pygments(pygments, code, syntax, 'monokai')
76
+ else
77
+ return highlight_skylight(skylight, code, syntax, theme)
78
+ end
73
79
  elsif Snibbets.options[:highlighter] =~ /^p/ && !pygments.nil?
74
80
  return highlight_pygments(pygments, code, syntax, theme)
75
81
  elsif !skylight.nil?
@@ -27,6 +27,15 @@ module Snibbets
27
27
  lex
28
28
  end
29
29
 
30
+ def skylight_lexer?(lexer)
31
+ SKYLIGHT_LEXERS_DB.split(/\n/).include?(lexer)
32
+ end
33
+
34
+ def normalize_lexer(lexer)
35
+ matches = LEXER_NORMALIZERS.select { |k, v| v.include? lexer }
36
+ matches.count.positive? ? matches.keys[0] : lexer
37
+ end
38
+
30
39
  def ext_to_lang(ext)
31
40
  return nil if ext.nil?
32
41
 
@@ -233,7 +233,7 @@ nsis, nsi, nsh [nsi, nsh]
233
233
  nusmv [smv]
234
234
  objdump [objdump]
235
235
  objective-c++, objectivec++, obj-c++, objc++ [mm, hh]
236
- objective-c, objectivec, obj-c, objc [m, h]
236
+ objectivec, objective-c, obj-c, objc [m, h]
237
237
  objective-j, objectivej, obj-j, objj [j]
238
238
  ocaml [ml, mli, mll, mly]
239
239
  odin [odin]
@@ -377,3 +377,164 @@ bro [bro]
377
377
  zephir [zep]
378
378
  zig [zig]
379
379
  EOLEXERS
380
+
381
+ SKYLIGHT_LEXERS_DB=<<EOSKYLEX
382
+ abc
383
+ asn1
384
+ asp
385
+ ats
386
+ awk
387
+ actionscript
388
+ ada
389
+ agda
390
+ alert
391
+ apache
392
+ bash
393
+ bibtex
394
+ boo
395
+ c
396
+ cs
397
+ cpp
398
+ cmake
399
+ css
400
+ changelog
401
+ clojure
402
+ coffee
403
+ coldfusion
404
+ comments
405
+ commonlisp
406
+ curry
407
+ d
408
+ dtd
409
+ default
410
+ diff
411
+ djangotemplate
412
+ dockerfile
413
+ doxygen
414
+ doxygenlua
415
+ eiffel
416
+ elixir
417
+ elm
418
+ email
419
+ erlang
420
+ fsharp
421
+ fortranfixed
422
+ fortranfree
423
+ gcc
424
+ glsl
425
+ gnuassembler
426
+ m4
427
+ go
428
+ graphql
429
+ groovy
430
+ html
431
+ hamlet
432
+ haskell
433
+ haxe
434
+ ini
435
+ isocpp
436
+ idris
437
+ fasm
438
+ nasm
439
+ j
440
+ json
441
+ jsp
442
+ java
443
+ javascript
444
+ javascriptreact
445
+ javadoc
446
+ julia
447
+ kotlin
448
+ llvm
449
+ latex
450
+ lex
451
+ lilypond
452
+ literatecurry
453
+ literatehaskell
454
+ lua
455
+ mips
456
+ makefile
457
+ markdown
458
+ mathematica
459
+ matlab
460
+ maxima
461
+ mediawiki
462
+ metafont
463
+ modelines
464
+ modula2
465
+ modula3
466
+ monobasic
467
+ mustache
468
+ nim
469
+ nix
470
+ ocaml
471
+ objectivec
472
+ objectivecpp
473
+ octave
474
+ opencl
475
+ orgmode
476
+ php
477
+ povray
478
+ pascal
479
+ perl
480
+ pike
481
+ postscript
482
+ powershell
483
+ prolog
484
+ protobuf
485
+ pure
486
+ purebasic
487
+ python
488
+ qml
489
+ r
490
+ relaxng
491
+ raku
492
+ relaxngcompact
493
+ roff
494
+ ruby
495
+ rhtml
496
+ rust
497
+ sass
498
+ scss
499
+ sgml
500
+ sml
501
+ spdxcomments
502
+ sql
503
+ sqlmysql
504
+ sqlpostgresql
505
+ scala
506
+ scheme
507
+ stan
508
+ stata
509
+ swift
510
+ systemverilog
511
+ toml
512
+ tcl
513
+ tcsh
514
+ texinfo
515
+ mandoc
516
+ typescript
517
+ vhdl
518
+ verilog
519
+ xml
520
+ xul
521
+ yaml
522
+ yacc
523
+ zsh
524
+ dot
525
+ noweb
526
+ rest
527
+ sci
528
+ sed
529
+ xorg
530
+ xslt
531
+ EOSKYLEX
532
+
533
+ LEXER_NORMALIZERS = {
534
+ 'objectivec' => %w[objective-c obj-c],
535
+ 'markdown' => %w[md mmd mkdn multimarkdown],
536
+ 'bash' => %w[csh sh shell],
537
+ 'javascript' => %w[js],
538
+ 'javascriptreact' => %w[react],
539
+ 'yaml' => %w[yml]
540
+ }.freeze
data/lib/snibbets/os.rb CHANGED
@@ -12,12 +12,12 @@ module Snibbets
12
12
  os = RbConfig::CONFIG['target_os']
13
13
  case os
14
14
  when /darwin.*/i
15
- `echo #{Shellwords.escape(text)} | pbcopy`
15
+ `echo #{Shellwords.escape(text.uncolor)} | pbcopy`
16
16
  else
17
17
  if TTY::Which.exist?('xclip')
18
- `echo #{Shellwords.escape(text)} | xclip -sel c`
18
+ `echo #{Shellwords.escape(text.uncolor)} | xclip -sel c`
19
19
  elsif TTY::Which.exist('xsel')
20
- `echo #{Shellwords.escape(text)} | xsel -ib`
20
+ `echo #{Shellwords.escape(text.uncolor)} | xsel -ib`
21
21
  else
22
22
  puts 'Copy not supported on this system, please install xclip or xsel.'
23
23
  end
@@ -84,7 +84,7 @@ module Snibbets
84
84
  # if it's a fenced code block, just discard the fence and everything
85
85
  # outside it
86
86
  if block.fenced?
87
- code_blocks = block.scan(/(`{3,})(\w+)?\s*\n(.*?)\n\1/m)
87
+ code_blocks = block.scan(/(`{3,})(\S+)?\s*\n(.*?)\n\1/m)
88
88
  code_blocks.map! { |b| b[2].strip }
89
89
  return code_blocks.join("\n\n")
90
90
  end
@@ -169,7 +169,7 @@ module Snibbets
169
169
 
170
170
  next if lines.blocks.zero? && !notes
171
171
 
172
- title = if lines.count > 1 && lines[0] !~ /<block\d+>/ && lines[0] =~ /^ +/
172
+ title = if lines.count > 1 && lines[0] !~ /<block\d+>/
173
173
  lines.shift.strip.sub(/[.:]$/, '')
174
174
  else
175
175
  'Default snippet'
@@ -208,18 +208,27 @@ module Snibbets
208
208
  # becomes the title, code is gleaned from text between that and the
209
209
  # next ATX header (or end)
210
210
  sans_blocks, code_blocks = content.replace_blocks
211
-
212
- parts = if Snibbets.options[:all_notes]
213
- sans_blocks.split(/^#+/)
214
- elsif sans_blocks =~ /<block\d+>/
215
- sans_blocks.split(/\n/).each_with_object([]) do |line, arr|
216
- arr << line if line =~ /^#/ || line =~ /<block\d+>/
217
- end.join("\n").split(/^#+/)
218
- else
219
- sans_blocks.gsub(/\n{2,}/, "\n\n").split(/^#+/)
220
- end
221
-
222
- # parts.shift if parts.count > 1
211
+ parts = sans_blocks.gsub(/\n{2,}/, "\n\n").split(/^#+/)
212
+
213
+ unless Snibbets.options[:all_notes]
214
+ parts.map! do |part|
215
+ if part =~ /<block\d+>/
216
+ lines = part.split(/\n/)
217
+ title = lines.shift
218
+ out = [title.gsub(/(^#+|#+$)/, '').strip]
219
+ out.concat(lines.each_with_object([]) do |line, arr|
220
+ arr << line.gsub(/(^#+|#+$)/, '').strip if line =~ /^#/ || line =~ /<block\d+>/
221
+ end)
222
+ out.join("\n")
223
+ else
224
+ lines = part.split(/\n/)
225
+ title = lines.shift
226
+ out = title.nil? ? [] : [title.gsub(/(^#+|#+$)/, '').strip]
227
+ out.concat(lines)
228
+ out.join("\n")
229
+ end
230
+ end
231
+ end
223
232
 
224
233
  restore_blocks(parts, code_blocks)
225
234
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Snibbets
4
- VERSION = '2.0.32'
4
+ VERSION = '2.0.34'
5
5
  end
data/lib/snibbets.rb CHANGED
@@ -12,6 +12,7 @@ require 'tty-reader'
12
12
  require 'tty-which'
13
13
  require 'yaml'
14
14
  require_relative 'snibbets/version'
15
+ require_relative 'snibbets/colors'
15
16
  require_relative 'snibbets/config'
16
17
  require_relative 'snibbets/which'
17
18
  require_relative 'snibbets/string'
@@ -60,9 +61,7 @@ module Snibbets
60
61
  ag = TTY::Which.which('ag')
61
62
  ack = TTY::Which.which('ack')
62
63
  grep = TTY::Which.which('grep')
63
- if Snibbets.options[:name_only]
64
- nil
65
- elsif !rg.empty?
64
+ if !rg.empty?
66
65
  %(#{rg} -li --color=never --glob='*.#{ext}' '#{@query.rx}' "#{folder}")
67
66
  elsif !ag.empty?
68
67
  %(#{ag} -li --nocolor -G '.*.#{ext}' '#{@query.rx}' "#{folder}")
@@ -83,9 +82,14 @@ module Snibbets
83
82
  end
84
83
  end
85
84
 
86
- if try == 2 && cmd.nil?
87
- puts "No search method available on this system. Please install ripgrep, silver surfer, ack, or grep."
88
- Process.exit 1
85
+ if try == 2
86
+ if Snibbets.options[:name_only]
87
+ puts '{br}No name matches found'.x
88
+ Process.exit 1
89
+ elsif cmd.nil?
90
+ puts '{br}No search method available on this system. Please install ripgrep, silver surfer, ack, or grep.'.x
91
+ Process.exit 1
92
+ end
89
93
  end
90
94
 
91
95
  res = cmd.nil? ? '' : `#{cmd}`.strip
@@ -138,14 +142,14 @@ module Snibbets
138
142
  editor = TTY::Which.which(editor)
139
143
  system %(#{editor} "#{filepath}") if editor
140
144
  else
141
- puts "No editor configured, or editor is missing"
145
+ puts "{br}No editor configured, or editor is missing".x
142
146
  Process.exit 1
143
147
  end
144
148
  elsif TTY::Which.exist?(editor)
145
149
  editor = TTY::Which.which(editor)
146
150
  system %(#{editor} "#{filepath}") if editor
147
151
  else
148
- puts "No editor configured, or editor is missing"
152
+ puts "{br}No editor configured, or editor is missing".x
149
153
  Process.exit 1
150
154
  end
151
155
  end
@@ -163,12 +167,12 @@ module Snibbets
163
167
  reader = TTY::Reader.new
164
168
 
165
169
  # printf 'What does this snippet do? '
166
- input = reader.read_line('What does this snippet do? ').strip
170
+ input = reader.read_line('{by}What does this snippet do{bw}? '.x).strip
167
171
  # input = $stdin.gets.chomp
168
172
  title = input unless input.empty?
169
173
 
170
174
  # printf 'What language(s) does it use (separate with spaces, full names or file extensions will work)? '
171
- input = reader.read_line('What language(s) does it use (separate with spaces, full names or file extensions will work)? ').strip
175
+ input = reader.read_line('{by}What language(s) does it use ({xw}separate with spaces, full names or file extensions{by}){bw}? '.x).strip
172
176
  # input = $stdin.gets.chomp
173
177
  langs = input.split(/ +/).map(&:strip) unless input.empty?
174
178
  exts = langs.map { |lang| Lexers.lang_to_ext(lang) }.delete_if(&:nil?)
@@ -176,7 +180,7 @@ module Snibbets
176
180
 
177
181
  exts = langs if exts.empty?
178
182
 
179
- filename = "#{title}#{exts.map { |x| ".#{x}"}.join('')}.#{Snibbets.options[:extension]}"
183
+ filename = "#{title}#{exts.map { |x| ".#{x}" }.join('')}.#{Snibbets.options[:extension]}"
180
184
  filepath = File.join(File.expand_path(Snibbets.options[:source]), filename)
181
185
  File.open(filepath, 'w') do |f|
182
186
  f.puts "tags: #{tags.join(', ')}
@@ -186,7 +190,7 @@ module Snibbets
186
190
  ```"
187
191
  end
188
192
 
189
- puts "New snippet written to #{filename}."
193
+ puts "{bg}New snippet written to {bw}#{filename}.".x
190
194
 
191
195
  open_snippet_in_editor(filepath) if Snibbets.arguments[:edit_snippet]
192
196
  open_snippet_in_nvultra(filepath) if Snibbets.arguments[:nvultra]
@@ -280,8 +284,8 @@ module Snibbets
280
284
  snippets.each do |snip|
281
285
  header = File.basename(filepath, '.md')
282
286
  if $stdout.isatty
283
- puts header
284
- puts '-' * header.length
287
+ puts "{bw}#{header}{x}".x
288
+ puts "{dw}#{'-' * header.length}{x}".x
285
289
  puts ''
286
290
  end
287
291
  code = snip['code']
@@ -311,8 +315,8 @@ module Snibbets
311
315
  else
312
316
  if $stdout.isatty
313
317
  header = File.basename(filepath, '.md')
314
- warn header
315
- warn '=' * header.length
318
+ warn "{bw}#{header}{x}".x
319
+ warn "{dw}#{'=' * header.length}{x}".x
316
320
  warn ''
317
321
  end
318
322
  print_all(snippets, filepath)
@@ -321,7 +325,7 @@ module Snibbets
321
325
  print(answer.to_json, filepath)
322
326
  else
323
327
  if $stdout.isatty
324
- header = "#{File.basename(filepath, '.md')}: #{answer['title']}"
328
+ header = "{bw}#{File.basename(filepath, '.md')}: {c}#{answer['title']}{x}".x
325
329
  warn header
326
330
  warn '-' * header.length
327
331
  warn ''
@@ -340,7 +344,7 @@ module Snibbets
340
344
  snippets.each do |snippet|
341
345
  lang = snippet['language']
342
346
 
343
- puts "### #{snippet['title']} ###"
347
+ puts "{dw}### {xbw}#{snippet['title']} {xdw}### {x}".x
344
348
  puts ''
345
349
 
346
350
  print(snippet['code'], filepath, lang)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: snibbets
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.32
4
+ version: 2.0.34
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brett Terpstra
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-04-25 00:00:00.000000000 Z
11
+ date: 2023-06-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -257,6 +257,7 @@ files:
257
257
  - bin/snibbets
258
258
  - lib/snibbets.rb
259
259
  - lib/snibbets/array.rb
260
+ - lib/snibbets/colors.rb
260
261
  - lib/snibbets/config.rb
261
262
  - lib/snibbets/hash.rb
262
263
  - lib/snibbets/highlight.rb