searchlink 2.3.80 → 2.3.81

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 040bc3ed8a6923d3918ae560c892bbabc0fa3a8a226ec218482f524784c0a8a4
4
- data.tar.gz: 5c61240d61bf69657b4ccea5f8dceb30fe4320f87badf805d89e378570ce59cf
3
+ metadata.gz: ce66d54f12c512c8e3e4508cf86d9dfde5e0be920a7bfe30bdc6071caceba54d
4
+ data.tar.gz: 744eb155302ed0901f3eba23ed8c50b73e8834040389662cfd4ae715843041e3
5
5
  SHA512:
6
- metadata.gz: 386cc4c402d41b7a5f1f7cf95d3dac34bc5f2b94391d359ee70e54e289ff7b03d44f12527ad5cc11162a5118543e296cd1677b574e8a0e8918cbb5727ee267af
7
- data.tar.gz: cb4d2facc9641b35c15e13d3df91948fa807072fd6f141340beb15f798e22ffab8c5d686e20389f04816dca8df557e7da86c222fda05e70fda18899e9f758728
6
+ metadata.gz: c9210886c698b4e82e7bb6d5b56732febef66c612ebe90351e66e0a4fcd9b6494ecac4b2bac5422b288bde4b25ba2d40b7bcb8737af467e757fafc19c8827a69
7
+ data.tar.gz: a36ba8e0be0f29f3f4cc31558ecdc0ba76b35e48cd2ecdd1a0ff35b9ce014dbfcc5063084111b1b26694e335b82ba86e391d63a855623cb6297c00e6560c3324
@@ -411,7 +411,7 @@ module Curl
411
411
  m = Regexp.last_match
412
412
  headers[m[1]] = m[2]
413
413
  else
414
- source = lines[idx..-1].join("\n")
414
+ source = lines[idx..].join("\n")
415
415
  break
416
416
  end
417
417
  end
@@ -75,7 +75,7 @@ module Curl
75
75
  m = Regexp.last_match
76
76
  headers[m[1]] = m[2]
77
77
  else
78
- source = lines[idx..-1].join("\n")
78
+ source = lines[idx..].join("\n")
79
79
  break
80
80
  end
81
81
  end
@@ -151,7 +151,7 @@ module SL
151
151
  end
152
152
  terms_p = search_terms.split(/ +/)
153
153
  if terms_p.length > highest_token
154
- remainder = terms_p[highest_token - 1..-1].join(" ")
154
+ remainder = terms_p[highest_token - 1..].join(" ")
155
155
  terms_p = terms_p[0..highest_token - 2]
156
156
  terms_p.push(remainder)
157
157
  end
@@ -252,6 +252,24 @@ module SL
252
252
  end
253
253
  end
254
254
 
255
+ if input =~ /\[\n(.*?\n)+\]\((.*?)?\)/
256
+ input.gsub!(/\[\n(((\s*(?:[-+*]|\d+\.)?\s+)*(!\S+ +)?(.*?))\n)+\]\((!\S+.*?)?\)/) do
257
+ m = Regexp.last_match
258
+ lines = m[0].split(/\n/)
259
+ lines = lines[1..-2]
260
+ lines.map do |l|
261
+ el_rx = /(\s*(?:[-+*]|\d+\.)?\s+)?(!\S+ )?(\w.*?)$/
262
+ if l =~ el_rx
263
+ els = l.match(el_rx)
264
+ search = els[2] ? els[2].strip : (m[6] ? m[6] : "!g")
265
+ "#{els[1]}[#{els[3].strip}](#{search})"
266
+ else
267
+ l
268
+ end
269
+ end.join("\n")
270
+ end
271
+ end
272
+
255
273
  if input =~ /\[(.*?)\]\((.*?)\)/
256
274
  lines = input.split(/\n/)
257
275
  out = []
@@ -263,11 +281,11 @@ module SL
263
281
  SL.line_num = num - line_difference
264
282
  @cursor_difference = 0
265
283
  # ignore links in code blocks
266
- if line =~ /^( {4,}|\t+)[^*+\-]/
284
+ if line =~ /^(( {4,}|\t+)[^*+-])/
267
285
  out.push(line)
268
286
  next
269
287
  end
270
- if line =~ /^[~`]{3,}/
288
+ if line =~ /^\s*[~`]{3,}/
271
289
  if in_code_block
272
290
  in_code_block = false
273
291
  out.push(line)
@@ -605,7 +623,7 @@ module SL
605
623
  end
606
624
  terms_p = terms.split(/ +/)
607
625
  if terms_p.length > highest_token
608
- remainder = terms_p[highest_token - 1..-1].join(" ")
626
+ remainder = terms_p[highest_token - 1..].join(" ")
609
627
  terms_p = terms_p[0..highest_token - 2]
610
628
  terms_p.push(remainder)
611
629
  end
@@ -65,18 +65,17 @@ module Plist
65
65
 
66
66
  def parse
67
67
  plist_tags = PTag.mappings.keys.join("|")
68
- start_tag = /<(#{plist_tags})([^>]*)>/i
69
- end_tag = %r{</(#{plist_tags})[^>]*>}i
68
+ start_tag = /<(#{plist_tags})([^>]*)>/i
69
+ end_tag = %r{</(#{plist_tags})[^>]*>}i
70
70
 
71
71
  require "strscan"
72
72
 
73
73
  @scanner = StringScanner.new(@xml)
74
74
  until @scanner.eos?
75
- if @scanner.scan(COMMENT_START)
76
- @scanner.scan(COMMENT_END)
77
- elsif @scanner.scan(XMLDECL_PATTERN)
78
- elsif @scanner.scan(DOCTYPE_PATTERN)
79
- elsif @scanner.scan(start_tag)
75
+ next unless @scanner.scan(COMMENT_START)
76
+
77
+ @scanner.scan(COMMENT_END)
78
+ if @scanner.scan(start_tag)
80
79
  @listener.tag_start(@scanner[1], nil)
81
80
  @listener.tag_end(@scanner[1]) if @scanner[2] =~ %r{/$}
82
81
  elsif @scanner.scan(TEXT)
@@ -88,117 +87,121 @@ module Plist
88
87
  end
89
88
  end
90
89
  end
91
- end
92
90
 
93
- class PTag
94
- @@mappings = {}
95
- def self.mappings
96
- @@mappings
97
- end
91
+ class PTag
92
+ @@mappings = {}
93
+ def self.mappings
94
+ @@mappings
95
+ end
98
96
 
99
- def self.inherited(sub_class)
100
- key = sub_class.to_s.downcase
101
- key.gsub!(/^plist::/, "")
102
- key.gsub!(/^p/, "") unless key == "plist"
97
+ def self.inherited(sub_class)
98
+ key = sub_class.to_s.downcase
99
+ key.gsub!(/^plist::/, "")
100
+ key.gsub!(/^p/, "") unless key == "plist"
103
101
 
104
- @@mappings[key] = sub_class
105
- end
102
+ @@mappings[key] = sub_class
103
+ super
104
+ end
106
105
 
107
- attr_accessor :text, :children
108
- def initialize
109
- @children = []
110
- end
106
+ attr_accessor :text, :children
107
+
108
+ def initialize
109
+ @children = []
110
+ end
111
111
 
112
- def to_ruby
113
- raise "Unimplemented: " + self.class.to_s + "#to_ruby on #{inspect}"
112
+ def to_ruby
113
+ raise "Unimplemented: #{self.class}#to_ruby on #{inspect}"
114
+ end
114
115
  end
115
- end
116
116
 
117
- class PList < PTag
118
- def to_ruby
119
- children.first&.to_ruby
117
+ class PList < PTag
118
+ def to_ruby
119
+ children.first&.to_ruby
120
+ end
120
121
  end
121
- end
122
122
 
123
- class PDict < PTag
124
- def to_ruby
125
- dict = {}
126
- key = nil
123
+ class PDict < PTag
124
+ def to_ruby
125
+ dict = {}
126
+ key = nil
127
127
 
128
- children.each do |c|
129
- if key.nil?
130
- key = c.to_ruby
131
- else
132
- dict[key] = c.to_ruby
133
- key = nil
128
+ children.each do |c|
129
+ if key.nil?
130
+ key = c.to_ruby
131
+ else
132
+ dict[key] = c.to_ruby
133
+ key = nil
134
+ end
134
135
  end
135
- end
136
136
 
137
- dict
137
+ dict
138
+ end
138
139
  end
139
- end
140
140
 
141
- class PKey < PTag
142
- def to_ruby
143
- CGI.unescapeHTML(text || "")
141
+ class PKey < PTag
142
+ def to_ruby
143
+ CGI.unescapeHTML(text || "")
144
+ end
144
145
  end
145
- end
146
146
 
147
- class PString < PTag
148
- def to_ruby
149
- CGI.unescapeHTML(text || "")
147
+ class PString < PTag
148
+ def to_ruby
149
+ CGI.unescapeHTML(text || "")
150
+ end
150
151
  end
151
- end
152
152
 
153
- class PArray < PTag
154
- def to_ruby
155
- children.collect(&:to_ruby)
153
+ class PArray < PTag
154
+ def to_ruby
155
+ children.collect(&:to_ruby)
156
+ end
156
157
  end
157
- end
158
158
 
159
- class PInteger < PTag
160
- def to_ruby
161
- text.to_i
159
+ class PInteger < PTag
160
+ def to_ruby
161
+ text.to_i
162
+ end
162
163
  end
163
- end
164
164
 
165
- class PTrue < PTag
166
- def to_ruby
167
- true
165
+ class PTrue < PTag
166
+ def to_ruby
167
+ true
168
+ end
168
169
  end
169
- end
170
170
 
171
- class PFalse < PTag
172
- def to_ruby
173
- false
171
+ class PFalse < PTag
172
+ def to_ruby
173
+ false
174
+ end
174
175
  end
175
- end
176
176
 
177
- class PReal < PTag
178
- def to_ruby
179
- text.to_f
177
+ class PReal < PTag
178
+ def to_ruby
179
+ text.to_f
180
+ end
180
181
  end
181
- end
182
182
 
183
- require "date"
184
- class PDate < PTag
185
- def to_ruby
186
- DateTime.parse(text)
183
+ require "date"
184
+
185
+ class PDate < PTag
186
+ def to_ruby
187
+ DateTime.parse(text)
188
+ end
187
189
  end
188
- end
189
190
 
190
- require "base64"
191
- class PData < PTag
192
- def to_ruby
193
- data = Base64.decode64(text.gsub(/\s+/, ""))
194
-
195
- begin
196
- Marshal.load(data)
197
- rescue Exception
198
- io = StringIO.new
199
- io.write data
200
- io.rewind
201
- io
191
+ require "base64"
192
+
193
+ class PData < PTag
194
+ def to_ruby
195
+ data = Base64.decode64(text.gsub(/\s+/, ""))
196
+
197
+ begin
198
+ Marshal.load(data)
199
+ rescue Exception
200
+ io = StringIO.new
201
+ io.write data
202
+ io.rewind
203
+ io
204
+ end
202
205
  end
203
206
  end
204
207
  end
@@ -216,7 +216,7 @@ module SL
216
216
  else
217
217
  if terms.split(/ +/).count > 1
218
218
  parts = terms.split(/ +/)
219
- gist = search_user_gists(parts[0], parts[1..-1].join(" "))
219
+ gist = search_user_gists(parts[0], parts[1..].join(" "))
220
220
 
221
221
  if gist
222
222
  url = gist[:url]
@@ -30,15 +30,15 @@ module SL
30
30
 
31
31
  data = Curl::Json.new("https://is.gd/create.php?format=json&url=#{CGI.escape(long_url)}", symbolize_names: true)
32
32
 
33
- if data.json.key?('errorcode')
34
- SL.add_error('Error creating is.gd url', data.json[:errorcode])
33
+ if data.json.key?("errorcode")
34
+ SL.add_error("Error creating is.gd url", data.json[:errorcode])
35
35
  return [false, title, link_text]
36
36
  end
37
37
 
38
38
  link = data.json[:shorturl]
39
39
  rtitle = SL::URL.title(long_url)
40
40
  title = rtitle
41
- link_text = rtitle if link_text == '' && !SL.titleize
41
+ link_text = rtitle if link_text == "" && !SL.titleize
42
42
  [link, title, link_text]
43
43
  end
44
44
  end
@@ -49,7 +49,6 @@ module SL
49
49
  aff ||= SL.config["itunes_affiliate"]
50
50
 
51
51
  url = "https://itunes.apple.com/search?term=#{terms.url_encode}&country=#{SL.config['country_code']}&entity=#{entity}&limit=1"
52
- puts url
53
52
  begin
54
53
  page = Curl::Json.new(url, compressed: true)
55
54
  json = page.json
@@ -9,8 +9,8 @@ module SL
9
9
  {
10
10
  trigger: "pb",
11
11
  searches: [
12
- ["pb", "Pinboard Bookmark Search"]
13
- ]
12
+ ["pb", "Pinboard Bookmark Search"],
13
+ ],
14
14
  }
15
15
  end
16
16
 
@@ -26,7 +26,6 @@ module SL
26
26
  end
27
27
 
28
28
  bookmarks.gsub!(/[\u{1F600}-\u{1F6FF}]/, "")
29
-
30
29
  bookmarks = JSON.parse(bookmarks)
31
30
  updated = Time.now
32
31
  { "update_time" => updated, "bookmarks" => bookmarks }
@@ -100,8 +99,8 @@ module SL
100
99
  def search(_, search_terms, link_text)
101
100
  unless SL.config["pinboard_api_key"]
102
101
  SL.add_error("Missing Pinboard API token",
103
- 'Find your api key at https://pinboard.in/settings/password and add it
104
- to your configuration (pinboard_api_key: YOURKEY)')
102
+ "Find your api key at https://pinboard.in/settings/password and add it
103
+ to your configuration (pinboard_api_key: YOURKEY)")
105
104
  return false
106
105
  end
107
106
 
@@ -149,14 +148,14 @@ module SL
149
148
  full_text = [bm["description"], bm["extended"], bm["tags"]].join(" ")
150
149
 
151
150
  score = if title_tags.matches_exact(search_terms)
152
- 14.0
153
- elsif full_text.matches_exact(search_terms)
154
- 13.0
155
- elsif full_text.matches_any(search_terms)
156
- full_text.matches_score(search_terms)
157
- else
158
- 0
159
- end
151
+ 14.0
152
+ elsif full_text.matches_exact(search_terms)
153
+ 13.0
154
+ elsif full_text.matches_any(search_terms)
155
+ full_text.matches_score(search_terms)
156
+ else
157
+ 0
158
+ end
160
159
 
161
160
  return [bm["href"], bm["description"]] if score == 14
162
161
 
@@ -166,7 +165,7 @@ module SL
166
165
  score: score,
167
166
  href: bm["href"],
168
167
  title: bm["description"],
169
- date: bm["time"]
168
+ date: bm["time"],
170
169
  })
171
170
  end
172
171
 
@@ -3,7 +3,7 @@
3
3
  module SL
4
4
  # YouTube Search/Linking
5
5
  class YouTubeSearch
6
- YOUTUBE_RX = %r{(?:youtu\.be/|youtube\.com/watch\?v=)?(?<id>[a-z0-9_\-]+)$}i.freeze
6
+ YOUTUBE_RX = %r{(?:youtu\.be/|youtube\.com/watch\?v=)?(?<id>[a-z0-9_-]+)$}i.freeze
7
7
 
8
8
  class << self
9
9
  def settings
@@ -19,7 +19,7 @@ module SL
19
19
  def search(search_type, search_terms, link_text)
20
20
  if SL::URL.url?(search_terms) && search_terms =~ YOUTUBE_RX
21
21
  url = search_terms
22
- elsif search_terms =~ /^[a-z0-9_\-]+$/i
22
+ elsif search_terms =~ /^[a-z0-9_-]+$/i
23
23
  url = "https://youtube.com/watch?v=#{search_terms}"
24
24
  else
25
25
  url, title = SL.ddg("site:youtube.com #{search_terms}", link_text)
@@ -53,7 +53,7 @@ module SL
53
53
  searches.each do |s|
54
54
  out << "<tr>
55
55
  <td>
56
- <code>!#{s[0].is_a?(Array) ? "#{s[0][0]} (#{s[0][1..-1].join(',')})" : s[0]}
56
+ <code>!#{s[0].is_a?(Array) ? "#{s[0][0]} (#{s[0][1..].join(',')})" : s[0]}
57
57
  </code>
58
58
  </td><td>#{s[1]}</td></tr>"
59
59
  end
@@ -72,7 +72,7 @@ module SL
72
72
 
73
73
  searches.each do |s|
74
74
  shortcut = if s[0].is_a?(Array)
75
- "#{s[0][0]} (#{s[0][1..-1].join(',')})"
75
+ "#{s[0][0]} (#{s[0][1..].join(',')})"
76
76
  else
77
77
  s[0]
78
78
  end
@@ -100,13 +100,13 @@ module SL
100
100
 
101
101
  def valid_searches
102
102
  searches = []
103
- plugins[:search].each { |_, plugin| searches.push(plugin[:trigger]) }
103
+ plugins[:search].each_value { |plugin| searches.push(plugin[:trigger]) }
104
104
  searches
105
105
  end
106
106
 
107
107
  def valid_search?(term)
108
108
  valid = false
109
- valid = true if term =~ /^(#{valid_searches.join("|")})$/
109
+ valid = true if term =~ /^(#{valid_searches.join('|')})$/
110
110
  valid = true if SL.config["custom_site_searches"].keys.include? term
111
111
  # SL.notify("Invalid search#{did_you_mean(term)}", term) unless valid
112
112
  valid
@@ -166,7 +166,7 @@ module SL
166
166
  end
167
167
 
168
168
  def do_search(search_type, search_terms, link_text, timeout: SL.config["timeout"])
169
- plugins[:search].each do |_title, plugin|
169
+ plugins[:search].each_value do |plugin|
170
170
  trigger = plugin[:trigger].gsub(/(^\^|\$$)/, "")
171
171
  if search_type =~ /^#{trigger}$/
172
172
  search = proc { plugin[:class].search(search_type, search_terms, link_text) }
@@ -91,7 +91,7 @@ module SL
91
91
  ## @return { description_of_the_return_value }
92
92
  ##
93
93
  def fix_gist_file
94
- sub(/^file-/, "").sub(/-([^\-]+)$/, '.\1')
94
+ sub(/^file-/, "").sub(/-([^-]+)$/, '.\1')
95
95
  end
96
96
 
97
97
  # Turn a string into a slug, removing spaces and
@@ -160,7 +160,7 @@ module SL
160
160
  # force trailing slash
161
161
  path.sub!(%r{/?$}, "/")
162
162
  # remove last path element
163
- path.sub!(%r{/[^/]+[.\-][^/]+/$}, "")
163
+ path.sub!(%r{/[^/]+[.-][^/]+/$}, "")
164
164
  # remove starting/ending slashes
165
165
  path.gsub!(%r{(^/|/$)}, "")
166
166
  # split at slashes, delete sections that are shorter
@@ -277,7 +277,7 @@ module SL
277
277
 
278
278
  next if parts.length == 1
279
279
 
280
- remaining_separators = seo_title_separators[i..-1].map { |s| Regexp.escape(s) }.join("")
280
+ remaining_separators = seo_title_separators[i..].map { |s| Regexp.escape(s) }.join("")
281
281
  seps = Regexp.new("^[^#{remaining_separators}]+$")
282
282
 
283
283
  longest = parts.longest_element.strip
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Secrets
4
+ GH_AUTH_TOKEN = "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"
5
+ end
@@ -5,6 +5,22 @@ module SL
5
5
  # URL module
6
6
  module URL
7
7
  class << self
8
+ def follow_redirects(url, limit = 5)
9
+ return url if limit.zero?
10
+
11
+ uri = URI.parse(url)
12
+ response = Net::HTTP.get_response(uri)
13
+
14
+ case response
15
+ when Net::HTTPSuccess
16
+ response.uri.to_s
17
+ when Net::HTTPRedirection
18
+ follow_redirects(response["location"], limit - 1)
19
+ else
20
+ url
21
+ end
22
+ end
23
+
8
24
  # Validates that a link exists and returns 200
9
25
  def valid_link?(uri_str, limit = 5)
10
26
  return false unless uri_str
@@ -130,6 +146,17 @@ module SL
130
146
  # end
131
147
 
132
148
  begin
149
+ if url =~ %r{https://(amzn.to|(www\.)?amazon\.com)/}
150
+ final_url = follow_redirects(url)
151
+ m = final_url.match(%r{https://www.amazon.com/(.*?)/dp/})
152
+ title = if m
153
+ m[1].gsub(/-/, " ")
154
+ else
155
+ url.remove_protocol
156
+ end
157
+ return title
158
+ end
159
+
133
160
  page = Curl::Html.new(url)
134
161
 
135
162
  title = page.title || nil
@@ -146,7 +173,6 @@ module SL
146
173
  title.remove_protocol
147
174
  rescue StandardError
148
175
  SL.add_error("Error retrieving title", "Error determining title for #{url.strip}")
149
- warn "Error retrieving title for #{url.strip}"
150
176
  url.remove_protocol
151
177
  end
152
178
  end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SL
4
- VERSION = '2.3.80'
4
+ VERSION = "2.3.81"
5
5
  end
6
6
 
7
7
  # Main module
@@ -44,7 +44,11 @@ module SL
44
44
  "Accept" => "application/vnd.github+json",
45
45
  "X-GitHub-Api-Version" => "2022-11-28",
46
46
  }
47
- headers["Authorization"] = "Bearer #{Secrets::GH_AUTH_TOKEN}" if defined? Secrets::GH_AUTH_TOKEN
47
+ if defined? Secrets::GH_AUTH_TOKEN
48
+ headers["Authorization"] = "Bearer #{Secrets::GH_AUTH_TOKEN}"
49
+ elsif SL.config['github_token']
50
+ headers["Authorization"] = "Bearer #{SL.settings["github_token"]}"
51
+ end
48
52
 
49
53
  url = "https://api.github.com/repos/ttscoff/searchlink/releases/latest"
50
54
  page = Curl::Json.new(url, headers: headers)
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: searchlink
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.80
4
+ version: 2.3.81
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brett Terpstra
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2024-12-19 00:00:00.000000000 Z
10
+ date: 2025-01-05 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: base64
@@ -248,6 +247,20 @@ dependencies:
248
247
  - - "~>"
249
248
  - !ruby/object:Gem::Version
250
249
  version: 0.9.5
250
+ - !ruby/object:Gem::Dependency
251
+ name: pastel
252
+ requirement: !ruby/object:Gem::Requirement
253
+ requirements:
254
+ - - "~>"
255
+ - !ruby/object:Gem::Version
256
+ version: '0.8'
257
+ type: :development
258
+ prerelease: false
259
+ version_requirements: !ruby/object:Gem::Requirement
260
+ requirements:
261
+ - - "~>"
262
+ - !ruby/object:Gem::Version
263
+ version: '0.8'
251
264
  description: macOS System Service for inline web searches
252
265
  email:
253
266
  - me@brettterpstra.com
@@ -301,6 +314,7 @@ files:
301
314
  - lib/searchlink/searches/youtube.rb
302
315
  - lib/searchlink/semver.rb
303
316
  - lib/searchlink/string.rb
317
+ - lib/searchlink/tokens.rb
304
318
  - lib/searchlink/url.rb
305
319
  - lib/searchlink/util.rb
306
320
  - lib/searchlink/version.rb
@@ -309,7 +323,6 @@ homepage: https://github.com/ttscoff/searchlink
309
323
  licenses:
310
324
  - MIT
311
325
  metadata: {}
312
- post_install_message:
313
326
  rdoc_options: []
314
327
  require_paths:
315
328
  - lib
@@ -324,8 +337,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
324
337
  - !ruby/object:Gem::Version
325
338
  version: '0'
326
339
  requirements: []
327
- rubygems_version: 3.5.3
328
- signing_key:
340
+ rubygems_version: 3.6.2
329
341
  specification_version: 4
330
342
  summary: Create Markdown links from web searches without leaving your editor.
331
343
  test_files: []