jekyll_plugin_support 0.5.0 → 0.5.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: ad3dd2c6f00993d77f9db69e844a1f70e52c21ac1ef66c47294cc7683dee5743
4
- data.tar.gz: 121436f415bbcb0cddffa4f9b9c26f735e899aa733df38749e5be2856d56d238
3
+ metadata.gz: d0856ddeea29e8a1e24f0a4997aecb7f6b6b22eae587ca8466142686b65557b7
4
+ data.tar.gz: ac8a8a047666f89b055b6ab90d6535b59e7f34441405852f5905ed6a517cbc27
5
5
  SHA512:
6
- metadata.gz: b6d186e5d5347b7857cef3318a152a4a9db75e57ebe7dc244dd0574542b47b2c97c4ba55af03065099cca94c3ca3fb3e666268fb4e2427683b94a0c058388a7b
7
- data.tar.gz: 1529488c906cc7c687356f22b65223f347d75eb35f1747742466166921b266c4f172233eaf638bb06af7fdf6fcd93e67d0f6ca25cbde0f98139edb05fb07d64a
6
+ metadata.gz: 8122412d70d1c99a6195834a51faa25f0d7beb59a23c18db0beba2883c83f5625920a63495b7ff21abf891faf97ae2ffe085c764c2be9d178bfeb37a7ae4e2f5
7
+ data.tar.gz: abd34bf8420c7040e7015ce131a8ae3ea01158a552637a4e8d63c51095c138bdf87fd11bff1c3fb3f35fbd3e8b728a09934c4aefe0bbe29817703bdb032a8114
data/CHANGELOG.md CHANGED
@@ -1,3 +1,6 @@
1
+ ## 0.5.1 / 2023-02-17
2
+ * `no_arg_parsing` optimization added.
3
+
1
4
  ## 0.5.0 / 2023-02-15
2
5
  * Plugins now register themselves
3
6
  * Plugins now report their name and version
data/README.md CHANGED
@@ -19,7 +19,7 @@ And then execute:
19
19
 
20
20
  $ bundle install
21
21
 
22
- ## Usage
22
+ ## General Usage
23
23
  `JekyllSupport::JekyllBlock` and `JekyllSupport::JekyllTag`
24
24
  provide support for Jekyll tag blocks and Jekyll tags, respectively.
25
25
  They are very similar in construction and usage.
@@ -47,8 +47,10 @@ For block tags, a single parameter is required, which contains any text enclosed
47
47
  Your implementation of `render_impl` can access `@page` and `@site`,
48
48
  and can parse parameters passed to the tag / block tag, [as described here](https://mslinn.com/jekyll/10100-jekyll-plugin-background.html#params):
49
49
 
50
+ ### For a tag:
50
51
  ```ruby
51
- # For a tag:
52
+ require 'jekyll_plugin_support'
53
+
52
54
  module Jekyll
53
55
  class MyTag < JekyllSupport::JekyllTag
54
56
  VERSION = '0.1.0'.freeze
@@ -56,12 +58,16 @@ module Jekyll
56
58
  def render_impl
57
59
  # Your code here
58
60
  end
61
+
62
+ JekyllPluginHelper.register(self, 'demo_tag')
59
63
  end
60
64
  end
61
65
  ```
62
66
 
67
+ ### For a tag block:
63
68
  ```ruby
64
- # For a tag block:
69
+ require 'jekyll_plugin_support'
70
+
65
71
  module Jekyll
66
72
  class MyBlock < JekyllSupport::JekyllBlock
67
73
  VERSION = '0.1.0'.freeze
@@ -69,6 +75,8 @@ module Jekyll
69
75
  def render_impl(text)
70
76
  # Your code here
71
77
  end
78
+
79
+ JekyllPluginHelper.register(self, 'demo_block')
72
80
  end
73
81
  end
74
82
  ```
@@ -79,12 +87,15 @@ For example, if `lib/my_plugin/version.rb` looks like this:
79
87
 
80
88
  ```ruby
81
89
  module MyPluginVersion
82
- VERSION = '0.5.0'.freeze
90
+ VERSION = '0.5.1'.freeze
83
91
  end
84
92
  ```
85
93
 
86
94
  Then your plugin can incorporate the `VERSION` constant into your plugin like this:
87
95
  ```ruby
96
+ require 'jekyll_plugin_support'
97
+ require_relative 'my_block/version'
98
+
88
99
  module Jekyll
89
100
  class MyBlock < JekyllSupport::JekyllBlock
90
101
  include MyPluginVersion
@@ -92,10 +103,18 @@ module Jekyll
92
103
  def render_impl(text)
93
104
  # Your code here
94
105
  end
106
+
107
+ JekyllPluginHelper.register(self, 'demo_tag')
95
108
  end
96
109
  end
97
110
  ```
98
111
 
112
+ ### `no_arg_parsing` Optimization
113
+ If your tag or block plugin only needs access to the raw arguments passed from the web page,
114
+ without tokenization, and you expect that the plugin might be invoked with large amounts of text,
115
+ derive your plugin from `JekyllBlockNoArgParsing` or `JekyllTagNoArgParsing`.
116
+
117
+
99
118
  ## Additional Information
100
119
  More information is available on
101
120
  [Mike Slinn&rsquo;s website](https://www.mslinn.com/blog/2020/10/03/jekyll-plugins.html).
@@ -1,3 +1,3 @@
1
1
  module JekyllPluginSupportVersion
2
- VERSION = '0.5.0'.freeze
2
+ VERSION = '0.5.1'.freeze
3
3
  end
@@ -5,6 +5,12 @@ require_relative 'jekyll_plugin_support/version'
5
5
 
6
6
  # @author Copyright 2022 Michael Slinn
7
7
  # @license SPDX-License-Identifier: Apache-2.0``
8
+ module NoArgParsing
9
+ attr_accessor :no_arg_parsing
10
+
11
+ @no_arg_parsing = true
12
+ end
13
+
8
14
  module JekyllSupport
9
15
  # Base class for Jekyll block tags
10
16
  class JekyllBlock < Liquid::Block
@@ -22,9 +28,10 @@ module JekyllSupport
22
28
  def initialize(tag_name, argument_string, parse_context)
23
29
  super
24
30
  @tag_name = tag_name
25
- @logger = PluginMetaLogger.instance.new_logger(self, PluginMetaLogger.instance.config)
26
- @helper = JekyllPluginHelper.new(tag_name, argument_string, @logger)
27
31
  @argument_string = argument_string
32
+ @logger = PluginMetaLogger.instance.new_logger(self, PluginMetaLogger.instance.config)
33
+ @logger.debug { "#{self.class}: respond_to?(:no_arg_parsing) #{respond_to?(:no_arg_parsing) ? 'yes' : 'no'}." }
34
+ @helper = JekyllPluginHelper.new(tag_name, argument_string, @logger, respond_to?(:no_arg_parsing))
28
35
  end
29
36
 
30
37
  # Method prescribed by the Jekyll plugin lifecycle.
@@ -33,8 +40,7 @@ module JekyllSupport
33
40
  text = super
34
41
  @helper.liquid_context = liquid_context
35
42
 
36
- # The names of front matter variables are hash keys for @page
37
- @page = liquid_context.registers[:page] # Jekyll::Drops::DocumentDrop
43
+ @page = liquid_context.registers[:page] # Type Jekyll::Drops::DocumentDrop
38
44
  @site = liquid_context.registers[:site]
39
45
  @config = @site.config
40
46
  @envs = liquid_context.environments.first
@@ -51,6 +57,17 @@ module JekyllSupport
51
57
  end
52
58
  end
53
59
 
60
+ class JekyllBlockNoArgParsing < JekyllBlock
61
+ def initialize(tag_name, argument_string, parse_context)
62
+ class << self
63
+ include NoArgParsing
64
+ end
65
+
66
+ super
67
+ @logger.debug { "#{self.class}: respond_to?(:o_arg_parsing) #{respond_to?(:no_arg_parsing) ? 'yes' : 'no'}." }
68
+ end
69
+ end
70
+
54
71
  # Base class for Jekyll tags
55
72
  class JekyllTag < Liquid::Tag
56
73
  attr_reader :argument_string, :helper, :line_number, :logger, :page, :site
@@ -67,9 +84,10 @@ module JekyllSupport
67
84
  def initialize(tag_name, argument_string, parse_context)
68
85
  super
69
86
  @tag_name = tag_name
70
- @logger = PluginMetaLogger.instance.new_logger(self, PluginMetaLogger.instance.config)
71
- @helper = JekyllPluginHelper.new(tag_name, argument_string, @logger)
72
87
  @argument_string = argument_string
88
+ @logger = PluginMetaLogger.instance.new_logger(self, PluginMetaLogger.instance.config)
89
+ @logger.debug { "#{self.class}: respond_to?(:no_arg_parsing) #{respond_to?(:no_arg_parsing) ? 'yes' : 'no'}." }
90
+ @helper = JekyllPluginHelper.new(tag_name, argument_string, @logger, respond_to?(:no_arg_parsing))
73
91
  end
74
92
 
75
93
  # Method prescribed by the Jekyll plugin lifecycle.
@@ -94,7 +112,18 @@ module JekyllSupport
94
112
  # Jekyll plugins must override this method, not render, so their plugin can be tested more easily
95
113
  # @page and @site are available
96
114
  def render_impl
97
- abort "JekyllTag render_impl for tag #{@tag_name} must be overridden, but it was not."
115
+ abort "#{self.class}.render_impl for tag #{@tag_name} must be overridden, but it was not."
116
+ end
117
+ end
118
+
119
+ class JekyllTagNoArgParsing < JekyllTag
120
+ def initialize(tag_name, argument_string, parse_context)
121
+ class << self
122
+ include NoArgParsing
123
+ end
124
+
125
+ super
126
+ @logger.debug { "#{self.class}: respond_to?(:no_arg_parsing) #{respond_to?(:no_arg_parsing) ? 'yes' : 'no'}." }
98
127
  end
99
128
  end
100
129
  end
@@ -3,7 +3,7 @@ require 'key_value_parser'
3
3
 
4
4
  # Base class for all types of Jekyll plugin helpers
5
5
  class JekyllPluginHelper
6
- attr_reader :argv, :keys_values, :liquid_context, :logger, :markup, :params, :tag_name
6
+ attr_reader :argv, :keys_values, :liquid_context, :logger, :markup, :no_arg_parsing, :params, :tag_name
7
7
 
8
8
  # Expand an environment variable reference
9
9
  def self.expand_env(str, die_if_undefined: false)
@@ -45,20 +45,37 @@ class JekyllPluginHelper
45
45
  # This argument is used mostly to display localized error messages on Liquid built-in Tags and Filters.
46
46
  # See https://github.com/Shopify/liquid/wiki/Liquid-for-Programmers#create-your-own-tags
47
47
  # @return [void]
48
- def initialize(tag_name, markup, logger)
48
+ def initialize(tag_name, markup, logger, no_arg_parsing)
49
49
  @tag_name = tag_name
50
50
  @logger = logger
51
+ @no_arg_parsing = no_arg_parsing
51
52
  reinitialize(markup.strip)
52
53
  @logger.debug { "@keys_values='#{@keys_values}'" }
53
54
  end
54
55
 
56
+ def warn_fetch(variable)
57
+ abort "Error: Argument parsing was suppressed, but an attempt to obtain the value of #{variable} was made"
58
+ end
59
+
60
+ def warn_parse(meth)
61
+ abort "Error: Argument parsing was suppressed, but an attempt to invoke #{meth} was made"
62
+ end
63
+
55
64
  def reinitialize(markup)
56
65
  # @keys_values was a Hash[Symbol, String|Boolean] but now it is Hash[String, String|Boolean]
57
66
  @markup = markup
58
- @argv = Shellwords.split(self.class.expand_env(markup))
59
- @keys_values = KeyValueParser \
60
- .new({}, { array_values: false, normalize_keys: false, separator: /=/ }) \
61
- .parse(@argv)
67
+ if @no_arg_parsing
68
+ define_singleton_method(:argv) { warn_fetch :argv }
69
+ define_singleton_method(:keys_values) { warn_fetch :keys_values }
70
+ define_singleton_method(:params) { warn_fetch :params }
71
+ define_singleton_method(:parameter_specified?) { |_name| warn_parse(:parameter_specified?) }
72
+ define_singleton_method(:delete_parameter) { |_name| warn_parse(:delete_parameter) }
73
+ else
74
+ @argv = Shellwords.split(self.class.expand_env(markup))
75
+ @keys_values = KeyValueParser \
76
+ .new({}, { array_values: false, normalize_keys: false, separator: /=/ }) \
77
+ .parse(@argv)
78
+ end
62
79
  end
63
80
 
64
81
  def delete_parameter(key)
@@ -106,7 +123,7 @@ class JekyllPluginHelper
106
123
  # Sets @params by replacing any Liquid variable names with their values
107
124
  def liquid_context=(context)
108
125
  @liquid_context = context
109
- @params = @keys_values.map { |k, _v| lookup_variable(k) }
126
+ @params = @keys_values.map { |k, _v| lookup_variable(k) } unless respond_to?(:no_arg_parsing) && no_arg_parsing
110
127
  end
111
128
 
112
129
  def lookup_variable(symbol)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jekyll_plugin_support
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.5.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-16 00:00:00.000000000 Z
11
+ date: 2023-02-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jekyll