jekyll_pre 1.2.1 → 1.2.2

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: c319e1e24db16309a2df595cd44df695cd239eba0c477af076a12fc25033e292
4
- data.tar.gz: edddecc3b1265d3741d4c7a5eac9cf6980f305541fa003f14f67d7a0165c3766
3
+ metadata.gz: 6097d5cc2c288233bb1bdb16683fa3116ec244edead6a25d971d0f002932d939
4
+ data.tar.gz: ab7f388db1f0e9dbfc0f677ea1e830b8486f02acc6da3aa95f08654c2f7de3a4
5
5
  SHA512:
6
- metadata.gz: 6cef3e92951e7d2f53107a8ade5dd04d52b8bc505fd4112bb0689a8bf7a245b6088c3e56238a211a73362c1ff6cf978ff3646ed289b667533e2495838f7127e4
7
- data.tar.gz: c5b8067ee37fe465aa697acc30bdb8e6d54b85c020da4fa80d788f978a72d729745c9b3556caa563edbb358d770b95e0e07e6bf0addf23aad0818c0cf2e4b00d
6
+ metadata.gz: e3069935c7ad9b664004cb4235002ab12fb6e91911876a9cb5113e880c3f6b3a565d84c51bd5706470866fd82d1a6c168c0b26b88cbf59cf9d3adfc49ce9e392
7
+ data.tar.gz: 5e14ff1c554fda49eb095538fef25297f13bf8cdf48d508747227db69e0fa32a698193f391dbb9981f19914f4a6a15656d9db4ad50240b1bf6162c01af68c77b
data/.rubocop.yml CHANGED
@@ -1,6 +1,9 @@
1
1
  require:
2
- - rubocop-rspec
3
- - rubocop-rake
2
+ # - rubocop-jekyll
3
+ - rubocop-md
4
+ - rubocop-performance
5
+ - rubocop-rake
6
+ - rubocop-rspec
4
7
 
5
8
  AllCops:
6
9
  Exclude:
data/CHANGELOG.md CHANGED
@@ -1,3 +1,8 @@
1
+ ## 1.2.2
2
+ * Added `exec` tag.
3
+ * Demarked CSS for the `exec`, `noselect`, and `pre` tags in `demo/assets/css/style.css`
4
+ within `/* Start of pre tag css */` and `/* End of pre tag css */`.
5
+
1
6
  ## 1.2.1
2
7
  * Updated to `jekyll_plugin_support` v0.5.1 so the `noselect` tag is more efficient.
3
8
 
data/README.md CHANGED
@@ -2,7 +2,7 @@ Jekyll_pre
2
2
  [![Gem Version](https://badge.fury.io/rb/jekyll_pre.svg)](https://badge.fury.io/rb/jekyll_pre)
3
3
  ===========
4
4
 
5
- This Jekyll plugin provides 2 new Liquid tags that work together:
5
+ This Jekyll plugin provides 3 new Liquid tags that work together:
6
6
 
7
7
  * A `pre` block tag that can optionally display a copy button.
8
8
  ```
@@ -27,6 +27,7 @@ This Jekyll plugin provides 2 new Liquid tags that work together:
27
27
  - `style` – Apply CSS styles
28
28
 
29
29
  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.
30
+
30
31
  * A `noselect` tag that can renders HTML content passed to it unselectable,
31
32
  and generates a <code>$</code> prompt if no content is provided.
32
33
  ```
@@ -35,6 +36,8 @@ This Jekyll plugin provides 2 new Liquid tags that work together:
35
36
  {% endpre %}
36
37
  ```
37
38
 
39
+ * An `exec` tag that executes shell commands and incorporates the command and its output into the content of the `pre` tag.
40
+ Output data is escaped, whitespace is condensed, and wrapped in the same `unselectable` class as does `unselectable`.
38
41
  ## CSS
39
42
  Below are the CSS declarations that I defined pertaining to the pre and noselect tags that produced the above images:
40
43
  ```css
data/lib/exec_tag.rb ADDED
@@ -0,0 +1,65 @@
1
+ require 'jekyll_plugin_support'
2
+ require_relative 'jekyll_pre/version'
3
+
4
+ module ExecTag
5
+ class ExecTag < JekyllSupport::JekyllTag
6
+ include JekyllPreVersion
7
+
8
+ def render_impl
9
+ parse_args
10
+
11
+ command = @helper.remaining_markup
12
+ response = `#{command}`
13
+ if $CHILD_STATUS.success?
14
+ response = compress response
15
+ else
16
+ msg = "Error: executing '#{command}' on line #{@line_number} (after front matter) of #{@page['path']} returned error code #{$CHILD_STATUS.exitstatus}"
17
+ raise PreError, msg.red, [] if @die_if_nonzero
18
+
19
+ @logger.error { msg }
20
+ response = "<span class='error'>Error: error code #{$CHILD_STATUS.exitstatus}</span>"
21
+ end
22
+
23
+ <<~END_OUTPUT
24
+ #{Rack::Utils.escape_html(command)}
25
+ <span class='unselectable'>#{response}</span>
26
+ END_OUTPUT
27
+ rescue PreError => e
28
+ raise PreError, e.message, []
29
+ rescue StandardError => e
30
+ msg = remove_html_tags(e.message) + " from executing '#{command}' on line #{@line_number} (after front matter) of #{@page['path']}"
31
+ raise PreError, msg.red, [] if die_if_error
32
+ end
33
+
34
+ private
35
+
36
+ def compress(response)
37
+ result = response.chomp
38
+ result = result.strip unless @no_strip
39
+ result = result.gsub('\n\n', '<br>\n')
40
+ result = Rack::Utils.escape_html(result) unless @no_escape
41
+ result
42
+ end
43
+
44
+ def parse_args
45
+ @no_escape = @helper.parameter_specified? 'no_escape'
46
+ @no_strip = @helper.parameter_specified? 'no_strip'
47
+ @die_if_nonzero = @helper.parameter_specified?('die_if_nonzero') # Implies die_if_error
48
+ @die_if_error = @helper.parameter_specified?('die_if_error') | @die_if_nonzero
49
+ end
50
+
51
+ JekyllPluginHelper.register(self, 'exec')
52
+ end
53
+
54
+ private
55
+
56
+ def die(msg)
57
+ msg_no_html = remove_html_tags(msg)
58
+ @logger.error("#{@page['path']} - #{msg_no_html}")
59
+ raise PreError, "#{@page['path']} - #{msg_no_html.red}", []
60
+ end
61
+
62
+ def remove_html_tags(string)
63
+ string.gsub(/<[^>]*>/, '')
64
+ end
65
+ end
@@ -1,3 +1,3 @@
1
1
  module JekyllPreVersion
2
- VERSION = '1.2.1'.freeze
2
+ VERSION = '1.2.2'.freeze
3
3
  end
data/lib/jekyll_pre.rb CHANGED
@@ -1,98 +1,17 @@
1
- require 'liquid'
2
- require 'jekyll_plugin_logger'
3
- require 'jekyll_plugin_support'
4
- require_relative 'jekyll_pre/version'
5
-
6
1
  module JekyllPluginPreName
7
2
  PLUGIN_NAME = 'jekyll_pre'.freeze
8
3
  end
9
4
 
10
- class PreTagBlock < JekyllSupport::JekyllBlock
11
- @@prefix = "<button class='copyBtn' data-clipboard-target="
12
- @@suffix = " title='Copy to clipboard'><img src='/assets/images/clippy.svg' " \
13
- "alt='Copy to clipboard' style='width: 13px'></button>"
14
-
15
- def self.highlight(content, pattern)
16
- content.gsub(Regexp.new(pattern), "<span class='bg_yellow'>\\0</span>")
17
- end
18
-
19
- def self.make_copy_button(pre_id)
20
- "#{@@prefix}'##{pre_id}'#{@@suffix}"
21
- end
22
-
23
- def self.make_pre(make_copy_button, number_lines, label, dark, highlight_pattern, css_class, style, clear, content) # rubocop:disable Metrics/ParameterLists
24
- pre_clear = label_clear = ''
25
- if clear
26
- if label.to_s.empty?
27
- pre_clear = ' clear'
28
- else
29
- label_clear = ' clear'
30
- end
31
- end
32
- css_class = css_class ? " #{css_class}" : ''
33
- style = style ? " style='#{style}'" : ''
34
- dark_label = ' darkLabel' if dark
35
- label = if label.to_s.empty?
36
- ''
37
- elsif label.to_s.downcase.strip == 'shell'
38
- "<div class='codeLabel unselectable#{dark_label}#{label_clear}' data-lt-active='false'>Shell</div>"
39
- else
40
- "<div class='codeLabel unselectable#{dark_label}#{label_clear}' data-lt-active='false'>#{label}</div>"
41
- end
42
- pre_id = "id#{SecureRandom.hex(6)}"
43
- copy_button = make_copy_button ? PreTagBlock.make_copy_button(pre_id) : ''
44
- content = PreTagBlock.highlight(content, highlight_pattern) if highlight_pattern
45
- content = PreTagBlock.number_content(content) if number_lines
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>"
50
- end
5
+ require_relative './exec_tag'
6
+ require_relative './noselect_tag'
7
+ require_relative './pre_tag_block'
51
8
 
52
- def self.number_content(content)
53
- lines = content.split("\n")
54
- digits = lines.length.to_s.length
55
- i = 0
56
- numbered_content = lines.map do |line|
57
- i += 1
58
- number = i.to_s.rjust(digits, ' ')
59
- "<span class='unselectable numbered_line'> #{number}: </span>#{line}"
60
- end
61
- result = numbered_content.join("\n")
62
- result += "\n" unless result.end_with?("\n")
63
- result
64
- end
65
-
66
- def render_impl(text)
67
- text.strip!
68
-
69
- @clear = @helper.parameter_specified? 'clear'
70
- @class = @helper.parameter_specified? 'class'
71
- @highlight = @helper.parameter_specified? 'highlight'
72
- @make_copy_button = @helper.parameter_specified? 'copyButton'
73
- @number_lines = @helper.parameter_specified? 'number'
74
- @dark = ' dark' if @helper.parameter_specified? 'dark'
75
- @style = @helper.parameter_specified? 'style'
76
- @label = @helper.parameter_specified? 'label'
77
-
78
- # If a label was specified, use it, otherwise concatenate any dangling parameters and use that as the label
79
- @label ||= @helper.argv.join(' ')
80
-
81
- @logger.debug { "@make_copy_button = '#{@make_copy_button}'; @label = '#{@label}'" }
82
- self.class.make_pre(@make_copy_button, @number_lines, @label, @dark, @highlight, @class, @style, @clear, text)
83
- end
84
- end
9
+ PreError = Class.new(Liquid::Error)
85
10
 
86
- # """\\{% noselect %} or \\{% noselect this all gets copied.
87
- # Also, space before the closing percent is signficant %}"""
88
- class UnselectableTag < JekyllSupport::JekyllTagNoArgParsing
89
- def render_impl
90
- text = @argument_string
91
- text = '$ ' if text.nil? || text.empty?
92
- "<span class='unselectable'>#{text}</span>"
93
- end
11
+ module JekyllPreModule
12
+ include NoSelectTag
13
+ include PreTagBlock
14
+ include ExecTag
94
15
  end
95
16
 
96
17
  PluginMetaLogger.instance.info { "Loaded #{JekyllPluginPreName::PLUGIN_NAME} v#{JekyllPreVersion::VERSION} plugin." }
97
- Liquid::Template.register_tag('pre', PreTagBlock)
98
- Liquid::Template.register_tag('noselect', UnselectableTag)
@@ -0,0 +1,18 @@
1
+ require 'jekyll_plugin_support'
2
+ require_relative 'jekyll_pre/version'
3
+
4
+ module NoSelectTag
5
+ # """\\{% noselect %} or \\{% noselect this all gets copied.
6
+ # Also, space before the closing percent is signficant %}"""
7
+ class NoSelectTag < JekyllSupport::JekyllTagNoArgParsing
8
+ include JekyllPreVersion
9
+
10
+ def render_impl
11
+ text = @argument_string
12
+ text = '$ ' if text.nil? || text.empty?
13
+ "<span class='unselectable'>#{text}</span>"
14
+ end
15
+
16
+ JekyllPluginHelper.register(self, 'noselect')
17
+ end
18
+ end
@@ -0,0 +1,84 @@
1
+ require 'jekyll_plugin_support'
2
+ require_relative 'jekyll_pre/version'
3
+
4
+ module PreTagBlock
5
+ class PreTagBlock < JekyllSupport::JekyllBlock
6
+ include JekyllPreVersion
7
+
8
+ @@prefix = "<button class='copyBtn' data-clipboard-target="
9
+ @@suffix = " title='Copy to clipboard'><img src='/assets/images/clippy.svg' " \
10
+ "alt='Copy to clipboard' style='width: 13px'></button>"
11
+
12
+ def self.highlight(content, pattern)
13
+ content.gsub(Regexp.new(pattern), "<span class='bg_yellow'>\\0</span>")
14
+ end
15
+
16
+ def self.make_copy_button(pre_id)
17
+ "#{@@prefix}'##{pre_id}'#{@@suffix}"
18
+ end
19
+
20
+ def self.make_pre(make_copy_button, number_lines, label, dark, highlight_pattern, css_class, style, clear, content) # rubocop:disable Metrics/ParameterLists
21
+ pre_clear = label_clear = ''
22
+ if clear
23
+ if label.to_s.empty?
24
+ pre_clear = ' clear'
25
+ else
26
+ label_clear = ' clear'
27
+ end
28
+ end
29
+ css_class = css_class ? " #{css_class}" : ''
30
+ style = style ? " style='#{style}'" : ''
31
+ dark_label = ' darkLabel' if dark
32
+ label = if label.to_s.empty?
33
+ ''
34
+ elsif label.to_s.downcase.strip == 'shell'
35
+ "<div class='codeLabel unselectable#{dark_label}#{label_clear}' data-lt-active='false'>Shell</div>"
36
+ else
37
+ "<div class='codeLabel unselectable#{dark_label}#{label_clear}' data-lt-active='false'>#{label}</div>"
38
+ end
39
+ pre_id = "id#{SecureRandom.hex(6)}"
40
+ copy_button = make_copy_button ? PreTagBlock.make_copy_button(pre_id) : ''
41
+ content = PreTagBlock.highlight(content, highlight_pattern) if highlight_pattern
42
+ content = PreTagBlock.number_content(content) if number_lines
43
+
44
+ classes = "maxOneScreenHigh copyContainer#{dark}#{pre_clear}#{css_class}"
45
+ pre_content = "#{copy_button}#{content.strip}"
46
+ "#{label}<pre data-lt-active='false' class='#{classes}'#{style} id='#{pre_id}'>#{pre_content}</pre>"
47
+ end
48
+
49
+ def self.number_content(content)
50
+ lines = content.split("\n")
51
+ digits = lines.length.to_s.length
52
+ i = 0
53
+ numbered_content = lines.map do |line|
54
+ i += 1
55
+ number = i.to_s.rjust(digits, ' ')
56
+ "<span class='unselectable numbered_line'> #{number}: </span>#{line}"
57
+ end
58
+ result = numbered_content.join("\n")
59
+ result += "\n" unless result.end_with?("\n")
60
+ result
61
+ end
62
+
63
+ def render_impl(text)
64
+ text.strip!
65
+
66
+ @clear = @helper.parameter_specified? 'clear'
67
+ @class = @helper.parameter_specified? 'class'
68
+ @highlight = @helper.parameter_specified? 'highlight'
69
+ @make_copy_button = @helper.parameter_specified? 'copyButton'
70
+ @number_lines = @helper.parameter_specified? 'number'
71
+ @dark = ' dark' if @helper.parameter_specified? 'dark'
72
+ @style = @helper.parameter_specified? 'style'
73
+ @label = @helper.parameter_specified? 'label'
74
+
75
+ # If a label was specified, use it, otherwise concatenate any dangling parameters and use that as the label
76
+ @label ||= @helper.argv.join(' ')
77
+
78
+ @logger.debug { "@make_copy_button = '#{@make_copy_button}'; @label = '#{@label}'" }
79
+ self.class.make_pre(@make_copy_button, @number_lines, @label, @dark, @highlight, @class, @style, @clear, text)
80
+ end
81
+
82
+ JekyllPluginHelper.register(self, 'pre')
83
+ end
84
+ end
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.2.1
4
+ version: 1.2.2
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-17 00:00:00.000000000 Z
11
+ date: 2023-03-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jekyll
@@ -54,8 +54,11 @@ files:
54
54
  - README.md
55
55
  - Rakefile
56
56
  - jekyll_pre.gemspec
57
+ - lib/exec_tag.rb
57
58
  - lib/jekyll_pre.rb
58
59
  - lib/jekyll_pre/version.rb
60
+ - lib/noselect_tag.rb
61
+ - lib/pre_tag_block.rb
59
62
  - spec/pre_spec.rb
60
63
  - spec/spec_helper.rb
61
64
  - spec/status_persistence.txt