jekyll_href 1.1.0 → 1.2.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: '0656497a33e45341646549dc55a45747f8418acd5f84298e145134bf7c10eec5'
4
- data.tar.gz: 2c938cbc5e5f09bc2b8ea42ea11dde9d28e44e74512d7ebc203bccc2d127a8f6
3
+ metadata.gz: 22db125f99912c6bd0a7cbbaa15ca8311cc7914a80ecbe6a828535ad5844fa96
4
+ data.tar.gz: 3ce4d813af1541bdae8269fa370233ffe21c890de48da1e8e400eba67be59823
5
5
  SHA512:
6
- metadata.gz: cdbdfe53569e693e1a81cb3e30b773cc239f81ce05f46ad2f20fe638dfef0777ca4cbcafd79ba9faedc9af1bb416f2a9628abbf8d82f423dd66ef36233059402
7
- data.tar.gz: 1a74a3ace7f95d965a4db351501b908345257ab6138ab9ad3f4647499230e2d2a24fcd02c17fd0577376c913dc60cb3689b526046097a33a107ccea3ea3ce484
6
+ metadata.gz: 1f4a20b4e784614fb2e21a29c274fe5a1d69f522ae728772860c8933d27305c16aa03cd4b4d2a15b49c0d65da8ce5bf5e3ca61171c6d27a073a783046b0f6c89
7
+ data.tar.gz: b5eceadcf6aabfa9f80459f79848af9176cd81dd17e073de61b8e21dc4f6ba3a09ed197d029773411a0a9ca22bf1df74119729675f6c1d4736cbeba173038529
data/.rubocop.yml CHANGED
@@ -1,19 +1,36 @@
1
- #require: rubocop-jekyll
2
- #inherit_gem:
3
- # rubocop-jekyll: .rubocop.yml
1
+ require:
2
+ # - rubocop-jekyll
3
+ - rubocop-md
4
+ - rubocop-performance
5
+ - rubocop-rake
6
+ - rubocop-rspec
7
+
8
+ # inherit_gem:
9
+ # rubocop-jekyll: .rubocop.yml
4
10
 
5
11
  AllCops:
6
12
  Exclude:
7
- - vendor/**/*
8
- - Gemfile*
13
+ - demo/_site/**/*
14
+ - exe/**/*
15
+ - vendor/**/*
16
+ - Gemfile*
9
17
  NewCops: enable
10
18
  TargetRubyVersion: 2.6
11
19
 
12
- # Gemspec/RequireMFA:
13
- # Enabled: false
20
+ Gemspec/DeprecatedAttributeAssignment:
21
+ Enabled: false
22
+
23
+ Gemspec/RequireMFA:
24
+ Enabled: false
14
25
 
15
26
  Layout/HashAlignment:
16
- EnforcedHashRocketStyle: table
27
+ EnforcedColonStyle: table
28
+ Exclude:
29
+ - jekyll_href.gemspec
30
+
31
+ Layout/InitialIndentation:
32
+ Exclude:
33
+ - README.md
17
34
 
18
35
  Layout/LineLength:
19
36
  Max: 150
@@ -21,17 +38,51 @@ Layout/LineLength:
21
38
  Layout/MultilineMethodCallIndentation:
22
39
  Enabled: false
23
40
 
41
+ Lint/RedundantCopDisableDirective:
42
+ Exclude:
43
+ - jekyll_href.gemspec
44
+
24
45
  Metrics/AbcSize:
25
- Max: 25
46
+ Max: 45
47
+
48
+ Metrics/BlockLength:
49
+ Exclude:
50
+ - jekyll_href.gemspec
51
+ - spec/**/*
52
+ Max: 40
53
+
54
+ Metrics/ClassLength:
55
+ Exclude:
56
+ - spec/**/*
57
+ Max: 40
26
58
 
27
59
  Metrics/CyclomaticComplexity:
28
- Max: 10
60
+ Max: 20
29
61
 
30
62
  Metrics/MethodLength:
31
- Max: 30
63
+ Max: 40
32
64
 
33
65
  Metrics/PerceivedComplexity:
34
- Max: 10
66
+ Max: 15
67
+
68
+ Naming/FileName:
69
+ Exclude:
70
+ - Rakefile
71
+
72
+ RSpec/ExampleLength:
73
+ Max: 20
74
+
75
+ RSpec/MultipleExpectations:
76
+ Max: 15
77
+
78
+ Style/CommandLiteral:
79
+ Enabled: false
80
+
81
+ Style/CommentedKeyword:
82
+ Enabled: false
83
+
84
+ Style/Documentation:
85
+ Enabled: false
35
86
 
36
87
  Style/FrozenStringLiteralComment:
37
88
  Enabled: false
@@ -42,6 +93,10 @@ Style/PercentLiteralDelimiters:
42
93
  Style/RegexpLiteral:
43
94
  Enabled: false
44
95
 
96
+ Style/StringConcatenation:
97
+ Exclude:
98
+ - spec/**/*
99
+
45
100
  Style/StringLiterals:
46
101
  Enabled: false
47
102
 
@@ -49,4 +104,4 @@ Style/StringLiteralsInInterpolation:
49
104
  Enabled: false
50
105
 
51
106
  Style/TrailingCommaInHashLiteral:
52
- Enabled: false
107
+ EnforcedStyleForMultiline: comma
data/CHANGELOG.md CHANGED
@@ -1,3 +1,12 @@
1
+ ## 1.2.1 / 2023-03-21
2
+ * Added `shy` and `wbr` options.
3
+
4
+ ## 1.2.0 / 2023-02-16
5
+ * Updated to `jekyll_plugin_support` v1.5.0
6
+
7
+ ## 1.1.1 / 2023-02-14
8
+ * Now dependent on `jekyll_plugin_support`
9
+
1
10
  ## 1.1.0 / 2023-02-03
2
11
  * Updated to `jekyll_all_collections` plugin v0.2.0.
3
12
  * Fixed insidious bug where a valid link was not used properly.
data/README.md CHANGED
@@ -5,27 +5,35 @@
5
5
  `Jekyll_href` is a Jekyll plugin that provides a new Liquid tag: `href`.
6
6
  It provides a convenient way to generate formatted and clickable URIs.
7
7
  The Liquid tag generates an `a href` HTML tag,
8
- which by default contains `target="_blank"` and `rel=nofollow`.
8
+ which by default contains `target="_blank"` and `rel="nofollow"`.
9
9
 
10
10
  If the url starts with `http`, or the `match` keyword is specified:
11
11
  - The url will open in a new tab or window.
12
- - The url will include `rel=nofollow` for SEO purposes.
12
+ - The url will include `rel="nofollow"` for SEO purposes.
13
13
 
14
14
  CAUTION: if linked text contains a single or double quote,
15
15
  you will see the error message: `Liquid Exception: Unmatched quote`.
16
- Instead, use ' (`'`), " (`"`), ‘ (`‘`),
17
- ’ (`’`), “ (`“`), and ” (`”`)
16
+ Instead, use:
18
17
 
18
+ - `'` (')
19
+ - `"` (")
20
+ - `‘` (‘)
21
+ - `’` (’)
22
+ - `“` (“)
23
+ - `”` (”)
24
+
25
+
26
+ ## Configuration
19
27
  In `_config.yml`, if a section called `plugin-vars` exists,
20
28
  then its name/value pairs are available for substitution.
21
29
  ```yaml
22
- plugin-vars:
23
- django-github: 'https://github.com/django/django/blob/3.1.7'
24
- django-oscar-github: 'https://github.com/django-oscar/django-oscar/blob/3.0.2'
30
+ plugin-vars:
31
+ django-github: 'https://github.com/django/django/blob/3.1.7'
32
+ django-oscar-github: 'https://github.com/django-oscar/django-oscar/blob/3.0.2'
25
33
  ```
26
34
 
27
35
 
28
- ## Syntax 1 (requires `url` does not have embedded spaces):
36
+ ## Syntax 1 (requires `url` does not have embedded spaces)
29
37
  ```
30
38
  {% href [match | [follow] [blank|notarget]] url text to display %}
31
39
  ```
@@ -34,7 +42,7 @@ then its name/value pairs are available for substitution.
34
42
  3. The square brackets denote optional keyword parameters, and should not be typed.
35
43
 
36
44
 
37
- ## Syntax 2 (always works):
45
+ ## Syntax 2 (always works)
38
46
  This syntax is recommended when the URL contains a colon (:).
39
47
  ```
40
48
  {% href [match | [follow] [blank|notarget]]
@@ -48,9 +56,9 @@ This syntax is recommended when the URL contains a colon (:).
48
56
  3. The square brackets denote optional keyword parameters, and should not be typed.
49
57
 
50
58
 
51
- ## Syntax 3 (implicit URL):
59
+ ## Syntax 3 (implicit URL)
52
60
  ```
53
- {% href [match | [follow] [blank|notarget]] www.domain.com %}
61
+ {% href [match | [follow] [blank|notarget]] [shy|wbr] www.domain.com %}
54
62
  ```
55
63
  The URI provided, for example `www.domain.com`,
56
64
  is used to form the URL by prepending `https://`,
@@ -94,6 +102,50 @@ The `match` option looks through the pages collection for a URL with containing
94
102
  `Match` implies `follow` and `notarget`.
95
103
 
96
104
 
105
+ ### `shy`
106
+ `shy` is only applicable for syntax 3 (implicit URL).
107
+ This option causes displayed urls to have an ­ inserted after each slash (/).
108
+ If both `shy` and `wbr` are specified, `wbr` prevails.
109
+
110
+ For example:
111
+ ```
112
+ {% href shy mslinn.com/path/to/page.html %}
113
+ ```
114
+ Expands to:
115
+ ```
116
+ <a href="https://mslinn.com/path/to/page.html">mslinn.com/&shy;path/&shy;to/&shy;page.html</a>
117
+ ```
118
+
119
+ ### `shy`
120
+ `shy` is only applicable for syntax 3 (implicit URL).
121
+ This option causes displayed urls to have an [`&amp;shy;`](https://developer.mozilla.org/en-US/docs/Web/CSS/hyphens) inserted after each slash (/).
122
+ If both `shy` and `wbr` are specified, `wbr` prevails.
123
+
124
+ For example:
125
+ ```
126
+ {% href shy mslinn.com/path/to/page.html %}
127
+ ```
128
+ Expands to:
129
+ ```
130
+ <a href="https://mslinn.com/path/to/page.html" rel="nofollow" target="_blank">mslinn.com/&shy;path/&shy;to/&shy;page.html</a>
131
+ ```
132
+
133
+ ### `wbr`
134
+ `wbr` is only applicable for syntax 3 (implicit URL).
135
+ It add [line break opportunites](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/wbr).
136
+ This option causes displayed urls to have an `&lt;wbr&gt;` inserted after each slash (/).
137
+ If both `shy` and `wbr` are specified, `wbr` prevails.
138
+
139
+ For example:
140
+ ```
141
+ {% href wbr mslinn.com/path/to/page.html %}
142
+ ```
143
+ Expands to:
144
+ ```
145
+ <a href="https://mslinn.com/path/to/page.html" rel="nofollow" target="_blank">mslinn.com/<wbr>path/<wbr>to/<wbr>page.html</a>
146
+ ```
147
+
148
+
97
149
  ## Examples
98
150
  1. Generates `nofollow` and `target` attributes:
99
151
  ```
data/Rakefile CHANGED
@@ -1,2 +1,3 @@
1
- require "bundler/gem_tasks"
1
+ require 'bundler/gem_tasks'
2
+
2
3
  task default: %i[]
data/jekyll_href.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  require_relative 'lib/jekyll_href/version'
2
2
 
3
- Gem::Specification.new do |spec| # rubocop:disable Metrics/BlockLength
3
+ Gem::Specification.new do |spec|
4
4
  github = 'https://github.com/mslinn/jekyll_href'
5
5
 
6
6
  spec.authors = ['Mike Slinn']
@@ -32,8 +32,5 @@ Gem::Specification.new do |spec| # rubocop:disable Metrics/BlockLength
32
32
  spec.version = JekyllHrefVersion::VERSION
33
33
 
34
34
  spec.add_dependency 'jekyll', '>= 3.5.0'
35
- spec.add_dependency 'jekyll_all_collections', '>= 0.2.0'
36
- spec.add_dependency 'jekyll_plugin_logger'
37
- spec.add_dependency 'key-value-parser'
38
- spec.add_dependency 'shellwords'
35
+ spec.add_dependency 'jekyll_all_collections', '~> 0.3.0', '>= 0.3.1'
39
36
  end
@@ -1,3 +1,3 @@
1
1
  module JekyllHrefVersion
2
- VERSION = '1.1.0'.freeze
2
+ VERSION = '1.2.1'.freeze
3
3
  end
data/lib/jekyll_href.rb CHANGED
@@ -1,47 +1,32 @@
1
1
  require 'jekyll_all_collections'
2
2
  require 'jekyll_plugin_logger'
3
+ require 'jekyll_plugin_support'
3
4
  require 'liquid'
4
5
  require_relative 'jekyll_href/version'
5
- require_relative './jekyll_tag_helper2'
6
6
 
7
7
  # @author Copyright 2020 Michael Slinn
8
8
  # @license SPDX-License-Identifier: Apache-2.0
9
9
  # Generates an href.
10
10
 
11
11
  # Implements href Jekyll tag
12
- class ExternalHref < Liquid::Tag # rubocop:disable Metrics/ClassLength
12
+ class ExternalHref < JekyllSupport::JekyllTag # rubocop:disable Metrics/ClassLength
13
13
  attr_reader :follow, :helper, :line_number, :match, :page, :path, :site, :text, :target, :url
14
14
  attr_accessor :link
15
15
 
16
- # @param tag_name [String] is the name of the tag, which we already know.
17
- # @param markup [String] the arguments from the web page.
18
- # @param _tokens [Liquid::ParseContext] tokenized command line
19
- # By default it has two keys: :locale and :line_numbers, the first is a Liquid::I18n object, and the second,
20
- # a boolean parameter that determines if error messages should display the line number the error occurred.
21
- # This argument is used mostly to display localized error messages on Liquid built-in Tags and Filters.
22
- # See https://github.com/Shopify/liquid/wiki/Liquid-for-Programmers#create-your-own-tags
23
- # @return [void]
24
- def initialize(tag_name, markup, _tokens)
25
- super
26
- markup = '' if markup.nil?
27
- markup.strip!
28
-
29
- @logger = PluginMetaLogger.instance.new_logger(self, PluginMetaLogger.instance.config)
30
- @helper = JekyllTagHelper2.new(tag_name, markup, @logger)
31
- end
16
+ include JekyllHrefVersion
32
17
 
33
18
  # Method prescribed by the Jekyll plugin lifecycle.
34
19
  # @param liquid_context [Liquid::Context]
35
20
  # @return [String]
36
- def render(liquid_context)
37
- super
38
- globals_initial(liquid_context)
21
+ def render_impl
22
+ globals_initial
39
23
  linkk = compute_linkk
40
24
  linkk = replace_vars(linkk)
41
25
  @link_save = linkk
42
26
  @helper_save = @helper.clone
43
27
  globals_update(@helper.argv, linkk) # Sets @link and @text, might clear @follow and @target
44
28
  handle_match if @match
29
+
45
30
  "<a href='#{@link}'#{@target}#{@follow}>#{@text}</a>"
46
31
  end
47
32
 
@@ -77,21 +62,19 @@ class ExternalHref < Liquid::Tag # rubocop:disable Metrics/ClassLength
77
62
  abort msg.red
78
63
  end
79
64
 
80
- def globals_initial(liquid_context)
81
- # Sets @follow, @helper, @match, @page, @path, @site, @target, @url
82
- @helper.liquid_context = liquid_context
83
-
84
- @page = liquid_context.registers[:page]
65
+ # Sets @follow, @helper, @match, @path, @shy, @target, @url, @wbr
66
+ def globals_initial
85
67
  @path = @page['path']
86
- @site = liquid_context.registers[:site]
87
68
  AllCollectionsHooks.compute(@site)
88
69
 
89
70
  @follow = @helper.parameter_specified?('follow') ? '' : " rel='nofollow'"
90
71
  @match = @helper.parameter_specified?('match')
91
72
  @blank = @helper.parameter_specified?('blank')
73
+ @shy = @helper.parameter_specified?('shy')
92
74
  @target = @blank ? " target='_blank'" : nil
93
75
  @target ||= @helper.parameter_specified?('notarget') ? '' : " target='_blank'"
94
76
  @url = @helper.parameter_specified?('url')
77
+ @wbr = @helper.parameter_specified?('wbr')
95
78
  end
96
79
 
97
80
  # Might set @follow, @linkk, @target, and @text
@@ -108,10 +91,19 @@ class ExternalHref < Liquid::Tag # rubocop:disable Metrics/ClassLength
108
91
  else
109
92
  @text = tokens.join(' ').strip
110
93
  if @text.to_s.empty?
111
- @text = "<code>#{linkk}</code>"
94
+ text = linkk
95
+ text = linkk.gsub('/', '/&shy;') if @shy
96
+ text = linkk.gsub('/', '/<wbr>') if @wbr
97
+ @text = "<code>#{text}</code>"
112
98
  @link = "https://#{linkk}"
113
99
  else
114
- @link = linkk
100
+ @link = if @shy
101
+ linkk.gsub('/', '/&shy;')
102
+ elsif @wbr
103
+ linkk.gsub('/', '/<wbr>')
104
+ else
105
+ linkk
106
+ end
115
107
  end
116
108
  end
117
109
 
@@ -154,7 +146,7 @@ class ExternalHref < Liquid::Tag # rubocop:disable Metrics/ClassLength
154
146
  @text = "<i>#{@link} is not available</i>"
155
147
  when 1
156
148
  @link = url_matches.first
157
- @link = "#{@link}\##{@fragment}" if @fragment
149
+ @link = "#{@link}##{@fragment}" if @fragment
158
150
  else
159
151
  abort "Error: More than one url matched '#{@path}': #{url_matches.join(', ')}"
160
152
  end
@@ -171,7 +163,6 @@ class ExternalHref < Liquid::Tag # rubocop:disable Metrics/ClassLength
171
163
  @logger.debug { "@link=#{@link}" }
172
164
  text
173
165
  end
174
- end
175
166
 
176
- PluginMetaLogger.instance.info { "Loaded jekyll_href v#{JekyllHrefVersion::VERSION} plugin." }
177
- Liquid::Template.register_tag('href', ExternalHref)
167
+ JekyllPluginHelper.register(self, 'href')
168
+ end
data/spec/href_spec.rb CHANGED
@@ -40,8 +40,7 @@ class TestParseContext < Liquid::ParseContext
40
40
  end
41
41
  end
42
42
 
43
- # Lets get this party started
44
- class MyTest # rubocop:disable Metrics/ClassLength
43
+ class MyTest
45
44
  Dir.chdir 'demo'
46
45
 
47
46
  RSpec.describe ExternalHref do
@@ -60,14 +59,14 @@ class MyTest # rubocop:disable Metrics/ClassLength
60
59
  end
61
60
 
62
61
  it "Obtains internal link with blank" do
63
- href = ExternalHref.send(
62
+ href = described_class.send(
64
63
  :new,
65
64
  'href',
66
- 'blank ./path/page.html internal link text'.dup,
65
+ + 'blank ./path/page.html internal link text',
67
66
  parse_context
68
67
  )
69
- href.send(:globals_initial, parse_context)
70
- linkk = href.send(:compute_linkk)
68
+ href.send :globals_initial
69
+ linkk = href.send :compute_linkk
71
70
  href.send(:globals_update, href.helper.argv, linkk)
72
71
  expect(href.follow).to eq('')
73
72
  expect(href.link).to eq('./path/page.html')
@@ -76,10 +75,10 @@ class MyTest # rubocop:disable Metrics/ClassLength
76
75
  end
77
76
 
78
77
  it "Obtains external link with text" do
79
- href = ExternalHref.send(
78
+ href = described_class.send(
80
79
  :new,
81
80
  'href',
82
- 'https://feeds.soundcloud.com/users/soundcloud:users:7143896/sounds.rss SoundCloud RSS Feed'.dup,
81
+ + 'https://feeds.soundcloud.com/users/soundcloud:users:7143896/sounds.rss SoundCloud RSS Feed',
83
82
  parse_context
84
83
  )
85
84
  href.send(:globals_initial, parse_context)
@@ -92,10 +91,10 @@ class MyTest # rubocop:disable Metrics/ClassLength
92
91
  end
93
92
 
94
93
  it "Obtains external link using url parameter with text" do
95
- href = ExternalHref.send(
94
+ href = described_class.send(
96
95
  :new,
97
96
  'href',
98
- 'url="https://feeds.soundcloud.com/users/soundcloud:users:7143896/sounds.rss" SoundCloud RSS Feed'.dup,
97
+ + 'url="https://feeds.soundcloud.com/users/soundcloud:users:7143896/sounds.rss" SoundCloud RSS Feed',
99
98
  parse_context
100
99
  )
101
100
  href.send(:globals_initial, parse_context)
@@ -108,10 +107,10 @@ class MyTest # rubocop:disable Metrics/ClassLength
108
107
  end
109
108
 
110
109
  it "Obtains external link without scheme or text" do
111
- href = ExternalHref.send(
110
+ href = described_class.send(
112
111
  :new,
113
112
  'href',
114
- 'super-fake-merger.com'.dup,
113
+ + 'super-fake-merger.com',
115
114
  parse_context
116
115
  )
117
116
  href.send(:globals_initial, parse_context)
@@ -124,10 +123,10 @@ class MyTest # rubocop:disable Metrics/ClassLength
124
123
  end
125
124
 
126
125
  it "Expands YAML hash with link text" do
127
- href = ExternalHref.send(
126
+ href = described_class.send(
128
127
  :new,
129
128
  'href',
130
- '{{github}}/diasks2/confidential_info_redactor <code>confidential_info_redactor</code>'.dup,
129
+ + '{{github}}/diasks2/confidential_info_redactor <code>confidential_info_redactor</code>',
131
130
  parse_context
132
131
  )
133
132
  href.send(:globals_initial, parse_context)
@@ -141,10 +140,10 @@ class MyTest # rubocop:disable Metrics/ClassLength
141
140
  end
142
141
 
143
142
  it "Obtains external link with follow" do
144
- href = ExternalHref.send(
143
+ href = described_class.send(
145
144
  :new,
146
145
  'href',
147
- 'follow https://www.mslinn.com Awesome'.dup,
146
+ + 'follow https://www.mslinn.com Awesome',
148
147
  parse_context
149
148
  )
150
149
  href.send(:globals_initial, parse_context)
@@ -157,10 +156,10 @@ class MyTest # rubocop:disable Metrics/ClassLength
157
156
  end
158
157
 
159
158
  it "Obtains external link with follow and notarget" do
160
- href = ExternalHref.send(
159
+ href = described_class.send(
161
160
  :new,
162
161
  'href',
163
- 'follow notarget https://www.mslinn.com Awesome'.dup,
162
+ + 'follow notarget https://www.mslinn.com Awesome',
164
163
  parse_context
165
164
  )
166
165
  href.send(:globals_initial, parse_context)
@@ -173,10 +172,10 @@ class MyTest # rubocop:disable Metrics/ClassLength
173
172
  end
174
173
 
175
174
  it "Obtains external link with blank" do
176
- href = ExternalHref.send(
175
+ href = described_class.send(
177
176
  :new,
178
177
  'href',
179
- 'blank https://www.mslinn.com Awesome'.dup,
178
+ + 'blank https://www.mslinn.com Awesome',
180
179
  parse_context
181
180
  )
182
181
  href.send(:globals_initial, parse_context)
@@ -189,10 +188,10 @@ class MyTest # rubocop:disable Metrics/ClassLength
189
188
  end
190
189
 
191
190
  it "Implicitly computes external link from text" do
192
- href = ExternalHref.send(
191
+ href = described_class.send(
193
192
  :new,
194
193
  'href',
195
- 'www.mslinn.com'.dup,
194
+ + 'www.mslinn.com',
196
195
  parse_context
197
196
  )
198
197
  href.send(:globals_initial, parse_context)
@@ -205,10 +204,10 @@ class MyTest # rubocop:disable Metrics/ClassLength
205
204
  end
206
205
 
207
206
  it "Implicitly computes external link from text with follow and notarget" do
208
- href = ExternalHref.send(
207
+ href = described_class.send(
209
208
  :new,
210
209
  'href',
211
- 'follow notarget www.mslinn.com'.dup,
210
+ + 'follow notarget www.mslinn.com',
212
211
  parse_context
213
212
  )
214
213
  href.send(:globals_initial, parse_context)
@@ -221,10 +220,10 @@ class MyTest # rubocop:disable Metrics/ClassLength
221
220
  end
222
221
 
223
222
  it "Implicitly computes external link from text with blank" do
224
- href = ExternalHref.send(
223
+ href = described_class.send(
225
224
  :new,
226
225
  'href',
227
- 'follow blank www.mslinn.com'.dup,
226
+ + 'follow blank www.mslinn.com',
228
227
  parse_context
229
228
  )
230
229
  href.send(:globals_initial, parse_context)
@@ -237,10 +236,10 @@ class MyTest # rubocop:disable Metrics/ClassLength
237
236
  end
238
237
 
239
238
  it "Obtains mailto without text" do
240
- href = ExternalHref.send(
239
+ href = described_class.send(
241
240
  :new,
242
241
  'href',
243
- 'mailto:mslinn@mslinn.com'.dup,
242
+ + 'mailto:mslinn@mslinn.com',
244
243
  parse_context
245
244
  )
246
245
  href.send(:globals_initial, parse_context)
@@ -253,10 +252,10 @@ class MyTest # rubocop:disable Metrics/ClassLength
253
252
  end
254
253
 
255
254
  it "Obtains mailto with text" do
256
- href = ExternalHref.send(
255
+ href = described_class.send(
257
256
  :new,
258
257
  'href',
259
- 'mailto:mslinn@mslinn.com Mike Slinn'.dup,
258
+ + 'mailto:mslinn@mslinn.com Mike Slinn',
260
259
  parse_context
261
260
  )
262
261
  href.send(:globals_initial, parse_context)
@@ -1,15 +1,15 @@
1
1
  example_id | status | run_time |
2
2
  ----------------------------------------------------------------- | ------ | --------------- |
3
- /mnt/_/work/jekyll/my_plugins/jekyll_href/spec/href_spec.rb[1:1] | passed | 0.00581 seconds |
4
- /mnt/_/work/jekyll/my_plugins/jekyll_href/spec/href_spec.rb[1:2] | passed | 0.00416 seconds |
5
- /mnt/_/work/jekyll/my_plugins/jekyll_href/spec/href_spec.rb[1:3] | passed | 0.00401 seconds |
6
- /mnt/_/work/jekyll/my_plugins/jekyll_href/spec/href_spec.rb[1:4] | passed | 0.00384 seconds |
7
- /mnt/_/work/jekyll/my_plugins/jekyll_href/spec/href_spec.rb[1:5] | passed | 0.00401 seconds |
8
- /mnt/_/work/jekyll/my_plugins/jekyll_href/spec/href_spec.rb[1:6] | passed | 0.00405 seconds |
9
- /mnt/_/work/jekyll/my_plugins/jekyll_href/spec/href_spec.rb[1:7] | passed | 0.00501 seconds |
10
- /mnt/_/work/jekyll/my_plugins/jekyll_href/spec/href_spec.rb[1:8] | passed | 0.00461 seconds |
11
- /mnt/_/work/jekyll/my_plugins/jekyll_href/spec/href_spec.rb[1:9] | passed | 0.00397 seconds |
12
- /mnt/_/work/jekyll/my_plugins/jekyll_href/spec/href_spec.rb[1:10] | passed | 0.0039 seconds |
13
- /mnt/_/work/jekyll/my_plugins/jekyll_href/spec/href_spec.rb[1:11] | passed | 0.00404 seconds |
14
- /mnt/_/work/jekyll/my_plugins/jekyll_href/spec/href_spec.rb[1:12] | passed | 0.00427 seconds |
15
- /mnt/_/work/jekyll/my_plugins/jekyll_href/spec/href_spec.rb[1:13] | passed | 0.0041 seconds |
3
+ /mnt/f/work/jekyll/my_plugins/jekyll_href/spec/href_spec.rb[1:1] | passed | 0.00817 seconds |
4
+ /mnt/f/work/jekyll/my_plugins/jekyll_href/spec/href_spec.rb[1:2] | passed | 0.00349 seconds |
5
+ /mnt/f/work/jekyll/my_plugins/jekyll_href/spec/href_spec.rb[1:3] | passed | 0.0033 seconds |
6
+ /mnt/f/work/jekyll/my_plugins/jekyll_href/spec/href_spec.rb[1:4] | passed | 0.00307 seconds |
7
+ /mnt/f/work/jekyll/my_plugins/jekyll_href/spec/href_spec.rb[1:5] | passed | 0.00315 seconds |
8
+ /mnt/f/work/jekyll/my_plugins/jekyll_href/spec/href_spec.rb[1:6] | passed | 0.0032 seconds |
9
+ /mnt/f/work/jekyll/my_plugins/jekyll_href/spec/href_spec.rb[1:7] | passed | 0.0035 seconds |
10
+ /mnt/f/work/jekyll/my_plugins/jekyll_href/spec/href_spec.rb[1:8] | passed | 0.00323 seconds |
11
+ /mnt/f/work/jekyll/my_plugins/jekyll_href/spec/href_spec.rb[1:9] | passed | 0.0032 seconds |
12
+ /mnt/f/work/jekyll/my_plugins/jekyll_href/spec/href_spec.rb[1:10] | passed | 0.00307 seconds |
13
+ /mnt/f/work/jekyll/my_plugins/jekyll_href/spec/href_spec.rb[1:11] | passed | 0.00317 seconds |
14
+ /mnt/f/work/jekyll/my_plugins/jekyll_href/spec/href_spec.rb[1:12] | passed | 0.00357 seconds |
15
+ /mnt/f/work/jekyll/my_plugins/jekyll_href/spec/href_spec.rb[1:13] | passed | 0.0035 seconds |
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jekyll_href
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mike Slinn
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-02-11 00:00:00.000000000 Z
11
+ date: 2023-03-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jekyll
@@ -28,58 +28,22 @@ dependencies:
28
28
  name: jekyll_all_collections
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ">="
32
- - !ruby/object:Gem::Version
33
- version: 0.2.0
34
- type: :runtime
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - ">="
31
+ - - "~>"
39
32
  - !ruby/object:Gem::Version
40
- version: 0.2.0
41
- - !ruby/object:Gem::Dependency
42
- name: jekyll_plugin_logger
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
33
+ version: 0.3.0
45
34
  - - ">="
46
35
  - !ruby/object:Gem::Version
47
- version: '0'
36
+ version: 0.3.1
48
37
  type: :runtime
49
38
  prerelease: false
50
39
  version_requirements: !ruby/object:Gem::Requirement
51
40
  requirements:
52
- - - ">="
53
- - !ruby/object:Gem::Version
54
- version: '0'
55
- - !ruby/object:Gem::Dependency
56
- name: key-value-parser
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - ">="
41
+ - - "~>"
60
42
  - !ruby/object:Gem::Version
61
- version: '0'
62
- type: :runtime
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - ">="
67
- - !ruby/object:Gem::Version
68
- version: '0'
69
- - !ruby/object:Gem::Dependency
70
- name: shellwords
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - ">="
74
- - !ruby/object:Gem::Version
75
- version: '0'
76
- type: :runtime
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
43
+ version: 0.3.0
80
44
  - - ">="
81
45
  - !ruby/object:Gem::Version
82
- version: '0'
46
+ version: 0.3.1
83
47
  description: 'Generates an ''a href'' tag, possibly with target=''_blank'' and rel=''nofollow''.
84
48
 
85
49
  '
@@ -97,7 +61,6 @@ files:
97
61
  - jekyll_href.gemspec
98
62
  - lib/jekyll_href.rb
99
63
  - lib/jekyll_href/version.rb
100
- - lib/jekyll_tag_helper2.rb
101
64
  - spec/href_spec.rb
102
65
  - spec/spec_helper.rb
103
66
  - spec/status_persistence.txt
@@ -1,94 +0,0 @@
1
- require 'shellwords'
2
- require 'key_value_parser'
3
-
4
- # Parses arguments and options
5
- class JekyllTagHelper2
6
- attr_reader :argv, :keys_values, :liquid_context, :logger, :markup, :params, :tag_name
7
-
8
- # Expand a environment variable reference
9
- def self.expand_env(str, die_if_undefined: false)
10
- str.gsub(/\$([a-zA-Z_][a-zA-Z0-9_]*)|\${\g<1>}|%\g<1>%/) do
11
- envar = Regexp.last_match(1)
12
- raise HrefError, "jekyll_href error: #{envar} is undefined".red, [] \
13
- if !ENV.key?(envar) && die_if_undefined # Suppress stack trace
14
-
15
- ENV[envar]
16
- end
17
- end
18
-
19
- # strip leading and trailing quotes if present
20
- def self.remove_quotes(string)
21
- string.strip.gsub(/\A'|\A"|'\Z|"\Z/, '').strip if string
22
- end
23
-
24
- def initialize(tag_name, markup, logger)
25
- # @keys_values was a Hash[Symbol, String|Boolean] but now it is Hash[String, String|Boolean]
26
- @tag_name = tag_name
27
- @markup = markup # Useful for debugging
28
- @argv = Shellwords.split(JekyllTagHelper2.expand_env(markup))
29
- @keys_values = KeyValueParser \
30
- .new({}, { array_values: false, normalize_keys: false, separator: /=/ }) \
31
- .parse(@argv)
32
- @logger = logger
33
- @logger.debug { "@keys_values='#{@keys_values}'" }
34
- end
35
-
36
- def delete_parameter(key)
37
- return if @keys_values.empty?
38
-
39
- @params.delete(key)
40
- @argv.delete_if { |x| x == key or x.start_with?("#{key}=") }
41
- @keys_values.delete(key)
42
- end
43
-
44
- # @return if parameter was specified, removes it from the available tokens and returns value
45
- def parameter_specified?(name)
46
- return false if @keys_values.empty?
47
-
48
- key = name
49
- key = name.to_sym if @keys_values.first.first.instance_of?(Symbol)
50
- value = @keys_values[key]
51
- delete_parameter(name)
52
- value
53
- end
54
-
55
- PREDEFINED_SCOPE_KEYS = %i[include page].freeze
56
-
57
- # Finds variables defined in an invoking include, or maybe somewhere else
58
- # @return variable value or nil
59
- def dereference_include_variable(name)
60
- @liquid_context.scopes.each do |scope|
61
- next if PREDEFINED_SCOPE_KEYS.include? scope.keys.first
62
-
63
- value = scope[name]
64
- return value if value
65
- end
66
- nil
67
- end
68
-
69
- # @return value of variable, or the empty string
70
- def dereference_variable(name)
71
- value = @liquid_context[name] # Finds variables named like 'include.my_variable', found in @liquid_context.scopes.first
72
- value ||= @page[name] if @page # Finds variables named like 'page.my_variable'
73
- value ||= dereference_include_variable(name)
74
- value ||= ''
75
- value
76
- end
77
-
78
- # Sets @params by replacing any Liquid variable names with their values
79
- def liquid_context=(context)
80
- @liquid_context = context
81
- @params = @keys_values.map { |k, _v| lookup_variable(k) }
82
- end
83
-
84
- def lookup_variable(symbol)
85
- string = symbol.to_s
86
- return string unless string.start_with?('{{') && string.end_with?('}}')
87
-
88
- dereference_variable(string.delete_prefix('{{').delete_suffix('}}'))
89
- end
90
-
91
- def page
92
- @liquid_context.registers[:page]
93
- end
94
- end