jekyll_plugin_support 0.5.0 → 0.5.1

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: 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