jekyll_pre 1.1.5 → 1.1.7

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: a3eced8ae5430c67a303f08c90a38caf16c46efbad4e11232aa95ed9580c2f98
4
- data.tar.gz: 9370b4fab76dc5ba5487c0d0876907ed9366d0f1e777e63ca8250121a9a32533
3
+ metadata.gz: 97df025cc0565235360a3c42053ed994e5f33968145eef4008ae5b27a8df61fa
4
+ data.tar.gz: d8c1eba16949515b28e7696865307da8ba8e150d807f466f45e32322f1786576
5
5
  SHA512:
6
- metadata.gz: 7fc327f37d0c5dc7f54ba78837984a05603ae24bbdee5e888eebdb01bc8d377ecd08bbc4b18a68c97a9bd3f1272f359cb8da53ee7a2143938793d5dca298fb31
7
- data.tar.gz: 656acb136598d957e9b129a2ebd71cfb905f63191c6c0c09eb0565c9070c71d5790b1319289b6ac70d71f15b8710a1af5e693240102f10f5c4ecce0068784252
6
+ metadata.gz: 03bb017f63fe8cf7b780065f10e248727f4047c031c0c5d74f4a96721b95c3a4e30ba9288dc9ac176b5eeff4efb2a454e412da28a58a7489c246529fb2335ea4
7
+ data.tar.gz: 4fb5fd78dde215a9639438095fddae46c053f396edcd77cbd42662d9f3250c32928349effecc17688d377f2f09bab140f56c6af16cf061801d15667849ed2ebc
data/.rubocop.yml CHANGED
@@ -1,13 +1,63 @@
1
- # require: rubocop-jekyll
2
- # inherit_gem:
3
- # rubocop-jekyll: .rubocop.yml
1
+ require:
2
+ - rubocop-rspec
3
+ - rubocop-rake
4
4
 
5
5
  AllCops:
6
6
  Exclude:
7
- - vendor/**/*
8
- - Gemfile*
7
+ - exe/**/*
8
+ - vendor/**/*
9
+ - Gemfile*
9
10
  NewCops: enable
10
11
  TargetRubyVersion: 2.6
11
12
 
13
+ Gemspec/DeprecatedAttributeAssignment:
14
+ Enabled: false
15
+
16
+ Gemspec/RequireMFA:
17
+ Enabled: false
18
+
19
+ Layout/HashAlignment:
20
+ Enabled: false
21
+
12
22
  Layout/LineLength:
13
23
  Max: 150
24
+
25
+ Metrics/AbcSize:
26
+ Max: 25
27
+
28
+ Metrics/BlockLength:
29
+ Exclude:
30
+ - jekyll_pre.gemspec
31
+ Max: 30
32
+
33
+ Metrics/CyclomaticComplexity:
34
+ Max: 15
35
+
36
+ Metrics/MethodLength:
37
+ Max: 30
38
+
39
+ Metrics/PerceivedComplexity:
40
+ Max: 15
41
+
42
+ Naming/FileName:
43
+ Exclude:
44
+ - Rakefile
45
+
46
+ Style/Documentation:
47
+ Enabled: false
48
+
49
+ Style/FrozenStringLiteralComment:
50
+ Enabled: false
51
+
52
+ Style/TrailingCommaInHashLiteral:
53
+ EnforcedStyleForMultiline: comma
54
+
55
+ RSpec/FilePath:
56
+ IgnoreMethods: true
57
+ SpecSuffixOnly: true
58
+
59
+ RSpec/ExampleLength:
60
+ Max: 30
61
+
62
+ RSpec/MultipleExpectations:
63
+ Max: 15
data/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ ## 1.1.7
2
+ * Fixed `noselect` tag content handling.
3
+
4
+ ## 1.1.6
5
+ * Added `jekyll_plugin_support` as a dependency.
6
+
1
7
  ## 1.1.5
2
8
  * Added `class` and `style` options to allow for specifying additional CSS classes and inline CSS
3
9
  * Added `clear` option to ensure no images overlap the pre output
data/README.md CHANGED
@@ -6,10 +6,20 @@ This Jekyll plugin provides 2 new Liquid tags that work together:
6
6
 
7
7
  * A `pre` block tag that can optionally display a copy button.
8
8
  ```
9
- {% pre [copyButton] [shell] [headline words] %}
9
+ {% pre [Options] [headline words] %}
10
10
  Contents of pre tag
11
11
  {% endpre %}
12
12
  ```
13
+ `Options` are:
14
+ - `clear` – Line break after floating HTML elements
15
+ - `class="class names"` – Apply CSS styles
16
+ - `copyButton` – Generate a copy button
17
+ - `dark` – Dark mode
18
+ - `label='This is a label'` – Apply text above pre tag
19
+ - `number` – Number the lines
20
+ - `shell` – Equivalent to `label='Shell'`
21
+ - `style` – Apply CSS styles
22
+
13
23
  The generated <pre></pre> tag has an `data-lt-active="false"` attribute, so [LanguageTool](https://forum.languagetool.org/t/avoid-spell-check-on-certain-html-inputs-manually/3944) does not check the spelling or grammar of the contents.
14
24
  * A `noselect` tag that can renders HTML content passed to it unselectable.
15
25
  ```
@@ -39,8 +49,9 @@ Below are the CSS declarations that I defined pertaining to the pre and noselect
39
49
  }
40
50
  ```
41
51
 
52
+
42
53
  ## Additional Information
43
- More information is available on [my web site](https://www.mslinn.com/blog/2020/10/03/jekyll-plugins.html#jekyll_pre).
54
+ More information is available on [my website](https://www.mslinn.com/blog/2020/10/03/jekyll-plugins.html#jekyll_pre).
44
55
 
45
56
 
46
57
  ## Installation
@@ -57,10 +68,6 @@ And then execute:
57
68
 
58
69
  $ bundle install
59
70
 
60
- Or install it yourself as:
61
-
62
- $ gem install jekyll_pre
63
-
64
71
 
65
72
  ## Usage
66
73
 
@@ -175,6 +182,20 @@ After checking out the repo, run `bin/setup` to install dependencies.
175
182
  You can also run `bin/console` for an interactive prompt that will allow you to experiment.
176
183
 
177
184
 
185
+ ## Test
186
+ A test website is provided in the `demo` directory.
187
+ 1. Set breakpoints.
188
+
189
+ 2. Initiate a debug session from the command line:
190
+ ```shell
191
+ $ bin/attach demo
192
+ ```
193
+
194
+ 3. Once the `Fast Debugger` signon appears, launch the Visual Studio Code launch configuration called `Attach rdebug-ide`.
195
+
196
+ 4. View the generated website at [`http://localhost:4444`](http://localhost:4444)
197
+
198
+
178
199
  ### Build and Install Locally
179
200
  To build and install this gem onto your local machine, run:
180
201
  ```shell
data/Rakefile CHANGED
@@ -1,7 +1,5 @@
1
- # frozen_string_literal: true
2
-
3
- require "bundler/gem_tasks"
4
- require "rspec/core/rake_task"
1
+ require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
5
3
 
6
4
  RSpec::Core::RakeTask.new(:spec)
7
- task :default => :spec
5
+ task default: :spec
data/jekyll_pre.gemspec CHANGED
@@ -1,48 +1,36 @@
1
- # frozen_string_literal: true
1
+ require_relative 'lib/jekyll_pre/version'
2
2
 
3
- require_relative "lib/jekyll_pre/version"
4
-
5
- # rubocop:disable Metrics/BlockLength
6
3
  Gem::Specification.new do |spec|
7
- github = "https://github.com/mslinn/jekyll_pre"
4
+ github = 'https://github.com/mslinn/jekyll_pre'
8
5
 
9
- spec.authors = ["Mike Slinn"]
10
- spec.bindir = "exe"
6
+ spec.authors = ['Mike Slinn']
7
+ spec.bindir = 'exe'
11
8
  spec.description = <<~END_OF_DESC
12
9
  Jekyll tags pre and noselect, for HTML <pre/> tag, prompts and unselectable text. Can number lines.
13
10
  END_OF_DESC
14
- spec.email = ["mslinn@mslinn.com"]
15
- spec.files = Dir[".rubocop.yml", "LICENSE.*", "Rakefile", "{lib,spec}/**/*", "*.gemspec", "*.md"]
16
- spec.homepage = "https://www.mslinn.com/blog/2020/10/03/jekyll-plugins.html#pre"
17
- spec.license = "MIT"
11
+ spec.email = ['mslinn@mslinn.com']
12
+ spec.files = Dir['.rubocop.yml', 'LICENSE.*', 'Rakefile', '{lib,spec}/**/*', '*.gemspec', '*.md']
13
+ spec.homepage = 'https://www.mslinn.com/blog/2020/10/03/jekyll-plugins.html#pre'
14
+ spec.license = 'MIT'
18
15
  spec.metadata = {
19
- "allowed_push_host" => "https://rubygems.org",
20
- "bug_tracker_uri" => "#{github}/issues",
21
- "changelog_uri" => "#{github}/CHANGELOG.md",
22
- "homepage_uri" => spec.homepage,
23
- "source_code_uri" => github,
16
+ 'allowed_push_host' => 'https://rubygems.org',
17
+ 'bug_tracker_uri' => "#{github}/issues",
18
+ 'changelog_uri' => "#{github}/CHANGELOG.md",
19
+ 'homepage_uri' => spec.homepage,
20
+ 'source_code_uri' => github,
24
21
  }
25
- spec.name = "jekyll_pre"
22
+ spec.name = 'jekyll_pre'
26
23
  spec.post_install_message = <<~END_MESSAGE
27
24
 
28
25
  Thanks for installing #{spec.name}!
29
26
 
30
27
  END_MESSAGE
31
- spec.require_paths = ["lib"]
32
- spec.required_ruby_version = ">= 2.6.0"
33
- spec.summary = "Jekyll tags pre and noselect, for HTML <pre/> tag, prompts and unselectable text. Can number lines."
34
- spec.test_files = spec.files.grep(%r!^(test|spec|features)/!)
28
+ spec.require_paths = ['lib']
29
+ spec.required_ruby_version = '>= 2.6.0'
30
+ spec.summary = 'Jekyll tags pre and noselect, for HTML <pre/> tag, prompts and unselectable text. Can number lines.'
31
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
35
32
  spec.version = JekyllPreVersion::VERSION
36
33
 
37
- spec.add_dependency "jekyll", ">= 3.5.0"
38
- spec.add_dependency "jekyll_plugin_logger"
39
- spec.add_dependency "key-value-parser"
40
- spec.add_dependency "shellwords"
41
-
42
- # spec.add_development_dependency "debase"
43
- # spec.add_development_dependency "rubocop-jekyll"
44
- # spec.add_development_dependency "rubocop-rake"
45
- # spec.add_development_dependency "rubocop-rspec"
46
- # spec.add_development_dependency "ruby-debug-ide"
34
+ spec.add_dependency 'jekyll', '>= 3.5.0'
35
+ spec.add_dependency 'jekyll_plugin_support', '~> 0.4.0'
47
36
  end
48
- # rubocop:enable Metrics/BlockLength
@@ -1,5 +1,3 @@
1
- # frozen_string_literal: true
2
-
3
1
  module JekyllPreVersion
4
- VERSION = "1.1.5"
2
+ VERSION = '1.1.7'.freeze
5
3
  end
data/lib/jekyll_pre.rb CHANGED
@@ -1,37 +1,13 @@
1
- # frozen_string_literal: true
2
-
3
1
  require 'liquid'
4
2
  require 'jekyll_plugin_logger'
5
- require 'key_value_parser'
6
- require 'shellwords'
3
+ require 'jekyll_plugin_support'
7
4
  require_relative 'jekyll_pre/version'
8
- require_relative 'jekyll_tag_helper'
9
5
 
10
6
  module JekyllPluginPreName
11
- PLUGIN_NAME = 'jekyll_pre'
7
+ PLUGIN_NAME = 'jekyll_pre'.freeze
12
8
  end
13
9
 
14
- # """
15
- # \\{% pre %}
16
- # Content here
17
- # \\{% endpre %}
18
- #
19
- # \\{% pre copyButton %}
20
- # Content here
21
- # \\{% endpre %}"""
22
- #
23
- # \\{% pre shell %}
24
- # Content here
25
- # \\{% endpre %}
26
- #
27
- # \\{% pre copyButton shell %}
28
- # Content here
29
- # \\{% endpre %}
30
- #
31
- # \\{% pre copyButton label %}
32
- # Content here
33
- # \\{% endpre %}"""
34
- class PreTagBlock < Liquid::Block
10
+ class PreTagBlock < JekyllSupport::JekyllBlock
35
11
  @@prefix = "<button class='copyBtn' data-clipboard-target="
36
12
  @@suffix = " title='Copy to clipboard'><img src='/assets/images/clippy.svg' " \
37
13
  "alt='Copy to clipboard' style='width: 13px'></button>"
@@ -44,7 +20,7 @@ class PreTagBlock < Liquid::Block
44
20
  "#{@@prefix}'##{pre_id}'#{@@suffix}"
45
21
  end
46
22
 
47
- def self.make_pre(make_copy_button, number_lines, label, dark, highlight_pattern, css_class, style, clear, content) # rubocop:disable Metrics/ParameterLists, Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity, Metrics/MethodLength
23
+ def self.make_pre(make_copy_button, number_lines, label, dark, highlight_pattern, css_class, style, clear, content) # rubocop:disable Metrics/ParameterLists
48
24
  pre_clear = label_clear = ''
49
25
  if clear
50
26
  if label.to_s.empty?
@@ -67,10 +43,13 @@ class PreTagBlock < Liquid::Block
67
43
  copy_button = make_copy_button ? PreTagBlock.make_copy_button(pre_id) : ''
68
44
  content = PreTagBlock.highlight(content, highlight_pattern) if highlight_pattern
69
45
  content = PreTagBlock.number_content(content) if number_lines
70
- "#{label}<pre data-lt-active='false' class='maxOneScreenHigh copyContainer#{dark}#{pre_clear}#{css_class}'#{style} id='#{pre_id}'>#{copy_button}#{content.strip}</pre>"
46
+
47
+ classes = "maxOneScreenHigh copyContainer#{dark}#{pre_clear}#{css_class}"
48
+ pre_content = "#{copy_button}#{content.strip}"
49
+ "#{label}<pre data-lt-active='false' class='#{classes}'#{style} id='#{pre_id}'>#{pre_content}</pre>"
71
50
  end
72
51
 
73
- def self.number_content(content) # rubocop:disable Metrics/MethodLength
52
+ def self.number_content(content)
74
53
  lines = content.split("\n")
75
54
  digits = lines.length.to_s.length
76
55
  i = 0
@@ -84,65 +63,33 @@ class PreTagBlock < Liquid::Block
84
63
  result
85
64
  end
86
65
 
87
- # @param _tag_name [String] is the name of the tag, which we already know.
88
- # @param markup [String] the arguments from the web page.
89
- # @param _tokens [Liquid::ParseContext] tokenized command line
90
- # By default it has two keys: :locale and :line_numbers, the first is a Liquid::I18n object, and the second,
91
- # a boolean parameter that determines if error messages should display the line number the error occurred.
92
- # This argument is used mostly to display localized error messages on Liquid built-in Tags and Filters.
93
- # See https://github.com/Shopify/liquid/wiki/Liquid-for-Programmers#create-your-own-tags
94
- # @return [void]
95
- def initialize(_tag_name, markup, _tokens)
96
- super
97
- markup = '' if markup.nil?
98
- markup.strip!
99
-
100
- @logger = PluginMetaLogger.instance.new_logger(self, PluginMetaLogger.instance.config)
101
- @helper = JekyllTagHelper.new(tag_name, markup, @logger)
102
- end
103
-
104
- # Method prescribed by the Jekyll plugin lifecycle.
105
- # @param liquid_context [Liquid::Context]
106
- # @return [String]
107
- def render(liquid_context) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
108
- content = super
109
- @helper.liquid_context = liquid_context
66
+ def render_impl(text)
67
+ text.strip!
110
68
 
111
- @clear = @helper.parameter_specified?('clear')
112
- @class = @helper.parameter_specified?('class')
69
+ @clear = @helper.parameter_specified? 'clear'
70
+ @class = @helper.parameter_specified? 'class'
113
71
  @highlight = @helper.parameter_specified? 'highlight'
114
72
  @make_copy_button = @helper.parameter_specified? 'copyButton'
115
73
  @number_lines = @helper.parameter_specified? 'number'
116
74
  @dark = ' dark' if @helper.parameter_specified? 'dark'
75
+ @style = @helper.parameter_specified? 'style'
117
76
  @label = @helper.parameter_specified? 'label'
118
- @style = @helper.parameter_specified?('style')
119
77
 
120
78
  # If a label was specified, use it, otherwise concatenate any dangling parameters and use that as the label
121
- @label ||= @helper.params.join(' ')
79
+ @label ||= @helper.argv.join(' ')
122
80
 
123
81
  @logger.debug { "@make_copy_button = '#{@make_copy_button}'; @label = '#{@label}'" }
124
- PreTagBlock.make_pre(@make_copy_button, @number_lines, @label, @dark, @highlight, @class, @style, @clear, content)
82
+ self.class.make_pre(@make_copy_button, @number_lines, @label, @dark, @highlight, @class, @style, @clear, text)
125
83
  end
126
84
  end
127
85
 
128
86
  # """\\{% noselect %} or \\{% noselect this all gets copied.
129
87
  # Also, space before the closing percent is signficant %}"""
130
- class UnselectableTag < Liquid::Tag
131
- # @param _tag_name [String] is the name of the tag, which we already know.
132
- # @param markup [String] the arguments from the web page.
133
- # @param _tokens [Liquid::ParseContext] tokenized command line
134
- # @return [void]
135
- def initialize(_tag_name, markup, _tokens)
136
- super
137
- @logger = PluginMetaLogger.instance.new_logger(self)
138
-
139
- @markup = markup
140
- @markup = '$ ' if @markup.nil? || @markup.empty?
141
- @logger.debug { "UnselectableTag: markup= '#{@markup}'" }
142
- end
143
-
144
- def render(_)
145
- "<span class='unselectable'>#{@markup}</span>"
88
+ class UnselectableTag < JekyllSupport::JekyllTag
89
+ def render_impl
90
+ text = @argument_string
91
+ text = '$ ' if text.nil? || text.empty?
92
+ "<span class='unselectable'>#{text}</span>"
146
93
  end
147
94
  end
148
95
 
data/spec/pre_spec.rb CHANGED
@@ -1,14 +1,12 @@
1
- # frozen_string_literal: true
2
-
3
- require "fileutils"
4
- require "jekyll"
5
- require "key_value_parser"
6
- require "shellwords"
7
- require_relative "../lib/jekyll_pre"
1
+ require 'fileutils'
2
+ require 'jekyll'
3
+ require 'key_value_parser'
4
+ require 'shellwords'
5
+ require_relative '../lib/jekyll_pre'
8
6
 
9
7
  RSpec.describe(PreTagBlock) do
10
- it "parses arguments" do
11
- argv = Shellwords.split "number copyButton shell"
8
+ it 'parses arguments' do
9
+ argv = Shellwords.split 'number copyButton shell'
12
10
  options = KeyValueParser.new.parse(argv)
13
11
  # puts options.map { |k, v| "#{k} = #{v}" }.join("\n")
14
12
 
@@ -17,7 +15,7 @@ RSpec.describe(PreTagBlock) do
17
15
  expect(options[:shell]).to be true
18
16
  end
19
17
 
20
- it "numbers content lines" do
18
+ it 'numbers content lines' do
21
19
  content = <<~END_CONTENT
22
20
  Line 1
23
21
  Line 2
@@ -30,7 +28,7 @@ RSpec.describe(PreTagBlock) do
30
28
  Line 9
31
29
  Line 10
32
30
  END_CONTENT
33
- numbered_content = PreTagBlock.number_content(content)
31
+ numbered_content = described_class.number_content(content)
34
32
  expected_content = <<~END_CONTENT
35
33
  <span class='unselectable numbered_line'> 1: </span>Line 1
36
34
  <span class='unselectable numbered_line'> 2: </span> Line 2
@@ -46,7 +44,7 @@ RSpec.describe(PreTagBlock) do
46
44
  expect(numbered_content).to eq(expected_content)
47
45
  end
48
46
 
49
- it "highlights regex patterns" do
47
+ it 'highlights regex patterns' do
50
48
  content = <<~END_CONTENT
51
49
  Line 1
52
50
  Line 2
@@ -59,7 +57,7 @@ RSpec.describe(PreTagBlock) do
59
57
  Line 9
60
58
  Line 10
61
59
  END_CONTENT
62
- highlighted = PreTagBlock.highlight(content, ".*2").split("\n")[1]
60
+ highlighted = described_class.highlight(content, '.*2').split("\n")[1]
63
61
  expect(highlighted).to eq("<span class='bg_yellow'> Line 2</span>")
64
62
  end
65
63
  end
data/spec/spec_helper.rb CHANGED
@@ -1,19 +1,17 @@
1
- # frozen_string_literal: true
1
+ require 'jekyll'
2
+ require 'fileutils'
3
+ require 'key_value_parser'
4
+ require 'shellwords'
2
5
 
3
- require "jekyll"
4
- require "fileutils"
5
- require "key_value_parser"
6
- require "shellwords"
7
-
8
- require_relative "../lib/jekyll_pre"
6
+ require_relative '../lib/jekyll_pre'
9
7
 
10
8
  Jekyll.logger.log_level = :info
11
9
 
12
10
  RSpec.configure do |config|
13
11
  config.filter_run :focus
14
- config.order = "random"
12
+ # config.order = 'random'
15
13
  config.run_all_when_everything_filtered = true
16
14
 
17
15
  # See https://relishapp.com/rspec/rspec-core/docs/command-line/only-failures
18
- config.example_status_persistence_file_path = "spec/status_persistence.txt"
16
+ config.example_status_persistence_file_path = 'spec/status_persistence.txt'
19
17
  end
@@ -1,5 +1,5 @@
1
1
  example_id | status | run_time |
2
2
  ----------------------- | ------ | --------------- |
3
- ./spec/pre_spec.rb[1:1] | passed | 0.00187 seconds |
4
- ./spec/pre_spec.rb[1:2] | passed | 0.00285 seconds |
5
- ./spec/pre_spec.rb[1:3] | passed | 0.00056 seconds |
3
+ ./spec/pre_spec.rb[1:1] | passed | 0.00075 seconds |
4
+ ./spec/pre_spec.rb[1:2] | passed | 0.00044 seconds |
5
+ ./spec/pre_spec.rb[1:3] | passed | 0.00018 seconds |
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jekyll_pre
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.5
4
+ version: 1.1.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mike Slinn
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-05-04 00:00:00.000000000 Z
11
+ date: 2023-02-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jekyll
@@ -25,47 +25,19 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: 3.5.0
27
27
  - !ruby/object:Gem::Dependency
28
- name: jekyll_plugin_logger
28
+ name: jekyll_plugin_support
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ">="
32
- - !ruby/object:Gem::Version
33
- version: '0'
34
- type: :runtime
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - ">="
39
- - !ruby/object:Gem::Version
40
- version: '0'
41
- - !ruby/object:Gem::Dependency
42
- name: key-value-parser
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - ">="
31
+ - - "~>"
46
32
  - !ruby/object:Gem::Version
47
- version: '0'
33
+ version: 0.4.0
48
34
  type: :runtime
49
35
  prerelease: false
50
36
  version_requirements: !ruby/object:Gem::Requirement
51
37
  requirements:
52
- - - ">="
53
- - !ruby/object:Gem::Version
54
- version: '0'
55
- - !ruby/object:Gem::Dependency
56
- name: shellwords
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - ">="
60
- - !ruby/object:Gem::Version
61
- version: '0'
62
- type: :runtime
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - ">="
38
+ - - "~>"
67
39
  - !ruby/object:Gem::Version
68
- version: '0'
40
+ version: 0.4.0
69
41
  description: 'Jekyll tags pre and noselect, for HTML <pre/> tag, prompts and unselectable
70
42
  text. Can number lines.
71
43
 
@@ -84,7 +56,6 @@ files:
84
56
  - jekyll_pre.gemspec
85
57
  - lib/jekyll_pre.rb
86
58
  - lib/jekyll_pre/version.rb
87
- - lib/jekyll_tag_helper.rb
88
59
  - spec/pre_spec.rb
89
60
  - spec/spec_helper.rb
90
61
  - spec/status_persistence.txt
@@ -1,92 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'shellwords'
4
- require 'key_value_parser'
5
-
6
- # Parses arguments and options
7
- class JekyllTagHelper
8
- attr_reader :argv, :liquid_context, :logger, :params, :tag_name
9
-
10
- def self.escape_html(string)
11
- string.gsub('&', '&amp;')
12
- .gsub('{', '&#123;')
13
- .gsub('}', '&#125;')
14
- .gsub('<', '&lt;')
15
- end
16
-
17
- # Expand a environment variable reference
18
- def self.expand_env(str, die_if_undefined: false)
19
- str.gsub(/\$([a-zA-Z_][a-zA-Z0-9_]*)|\${\g<1>}|%\g<1>%/) do
20
- envar = Regexp.last_match(1)
21
- raise FlexibleError, "flexible_include error: #{envar} is undefined".red, [] if !ENV.key?(envar) && die_if_undefined # Suppress stack trace
22
-
23
- ENV[envar]
24
- end
25
- end
26
-
27
- # strip leading and trailing quotes if present
28
- def self.remove_quotes(string)
29
- string.strip.gsub(/\A'|\A"|'\Z|"\Z/, '').strip if string
30
- end
31
-
32
- def initialize(tag_name, markup, logger)
33
- @tag_name = tag_name
34
- @argv = Shellwords.split(markup)
35
- @keys_values = KeyValueParser.new.parse(@argv) # Hash[Symbol, String|Boolean]
36
- @logger = logger
37
- @logger.debug { "@keys_values='#{@keys_values}'" }
38
- end
39
-
40
- def delete_parameter(name)
41
- @params.delete(name)
42
- @argv.delete_if { |x| x.start_with? name }
43
- @keys_values.delete(name.to_sym)
44
- end
45
-
46
- # @return if parameter was specified, returns value and removes it from the available tokens
47
- def parameter_specified?(name)
48
- value = @keys_values[name.to_sym]
49
- delete_parameter(name)
50
- value
51
- end
52
-
53
- PREDEFINED_SCOPE_KEYS = [:include, :page].freeze
54
-
55
- # Finds variables defined in an invoking include, or maybe somewhere else
56
- # @return variable value or nil
57
- def dereference_include_variable(name)
58
- @liquid_context.scopes.each do |scope|
59
- next if PREDEFINED_SCOPE_KEYS.include? scope.keys.first
60
-
61
- value = scope[name]
62
- return value if value
63
- end
64
- nil
65
- end
66
-
67
- # @return value of variable, or the empty string
68
- def dereference_variable(name)
69
- value = @liquid_context[name] # Finds variables named like 'include.my_variable', found in @liquid_context.scopes.first
70
- value ||= @page[name] if @page # Finds variables named like 'page.my_variable'
71
- value ||= dereference_include_variable(name)
72
- value ||= ''
73
- value
74
- end
75
-
76
- # Sets @params by replacing any Liquid variable names with their values
77
- def liquid_context=(context)
78
- @liquid_context = context
79
- @params = @keys_values.map { |k, _v| lookup_variable(k) }
80
- end
81
-
82
- def lookup_variable(symbol)
83
- string = symbol.to_s
84
- return string unless string.start_with?('{{') && string.end_with?('}}')
85
-
86
- dereference_variable(string.delete_prefix('{{').delete_suffix('}}'))
87
- end
88
-
89
- def page
90
- @liquid_context.registers[:page]
91
- end
92
- end