jekyll_plugin_support 0.8.2 → 0.8.3

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: cbe2d54d363697f10987c73cdd5e7f1f901f170109747f4319553b37251d14a5
4
- data.tar.gz: 454e854eec50272cbb21bb107e9095585ea9dc4acaf066ee738cf322bdf6465a
3
+ metadata.gz: c9953a9a01da37cddcb43f16784ba12afbb90eeea9df7b7346b6593e7d7b483e
4
+ data.tar.gz: 69d7a9885fc9d3dfaa8308f8a4cfc989a42e3a0b6e5af76ce65a9b0b7dd081b1
5
5
  SHA512:
6
- metadata.gz: 58712d203762e16b5ed848f4bff32cdfb43494871c69482b3a29b5d76180dc3b67406fe42b0662e14ded8174bf4d7a49eab16c1c81c66721402d38be4a24ecd4
7
- data.tar.gz: 10782bbeb291185bdb17a0d0cd5e37ab999f3c74569b415bc5d3892221bf8e43426cd2244be37b4a5ebc90ae2aa3d9d0327f8f5e3c5b0c7da9d9b06cc1cc3546
6
+ metadata.gz: ca1c2618a298fda325a4aa4a4b9d62e1c16d1ead64c1737390aa73fdd4326f7c7d6f3830155a6c6aa7c286fc50ec376c8c4ffcd4ba6698b00f1ce85769217368
7
+ data.tar.gz: 32702f17fbfb0bcc87df9f6f7033b210adade31c67d29aaa4daa7ebc0d3c4677a885ec088404caa787f00697d4d81f1e017108e4fc6c2a5ec9f5f19a5c16839a
data/CHANGELOG.md CHANGED
@@ -1,6 +1,11 @@
1
1
  # Change Log
2
2
 
3
3
 
4
+ ## 0.8.3 / 2024-01-05
5
+
6
+ * Variables defined in front matter of layouts and pages are now handled.
7
+
8
+
4
9
  ## 0.8.2 / 2024-01-03
5
10
 
6
11
  * `JekyllSupport::JekyllBlock` and `JekyllSupport::JekyllTag` subclasses now have automatically created error classes,
data/README.md CHANGED
@@ -86,20 +86,6 @@ For block tags, a single parameter is required, which contains text passed from
86
86
  Your implementation of render_impl can parse parameters passed to the tag / block tag, as described in
87
87
  [Tag Parameter Parsing](http://mslinn.com/jekyll/10100-jekyll-plugin-background.html#params).
88
88
 
89
- The following variables are predefined within `render`.
90
- See the [Jekyll documentation](https://jekyllrb.com/docs/variables/) for more information.
91
-
92
- * `@argument_string` – Original unparsed string from the tag in the web page
93
- * `@config` – Jekyll [configuration data](https://jekyllrb.com/docs/configuration/)
94
- * `@layout` – Front matter specified in layouts
95
- * `@mode` – [possible values](https://jekyllrb.com/docs/configuration/environments/)
96
- are `development`, `production`, or `test`
97
- * `@page` – Jekyll [page variable](https://jekyllrb.com/docs/variables/#page-variables)
98
- * `@paginator` – Only has a value when a paginator is active; they are only available in index files.
99
- * `@site` – Jekyll [site variable](https://jekyllrb.com/docs/variables/#site-variables)
100
- * `@tag_name` – Name of the inline tag or block plugin
101
- * `@theme` – Theme variables (introduced in Jekyll 4.3.0)
102
-
103
89
 
104
90
  ## General Usage
105
91
 
@@ -107,8 +93,9 @@ Please see the [`demo/`](demo/) project for a well-documented set of demonstrati
107
93
  Additional information is available [here](https://mslinn.com/jekyll/10200-jekyll-plugin-background.html) and the
108
94
  [`jekyll_plugin_support`](https://www.mslinn.com/jekyll_plugins/jekyll_plugin_support.html) documentation.
109
95
 
110
- `JekyllSupport::JekyllBlock` and `JekyllSupport::JekyllTag`
111
- provide support for Jekyll block tags and Jekyll inline tags, respectively.
96
+ [`JekyllSupport::JekyllBlock`](https://github.com/mslinn/jekyll_plugin_support/blob/master/lib/jekyll_plugin_support_block.rb) and
97
+ [`JekyllSupport::JekyllTag`](https://github.com/mslinn/jekyll_plugin_support/blob/master/lib/jekyll_plugin_support_tag.rb) provide
98
+ support for Jekyll block tags and Jekyll inline tags, respectively.
112
99
  They are similar in construction and usage.
113
100
 
114
101
  Instead of subclassing your Jekyll block tag class from `Liquid::Block`,
@@ -152,10 +139,10 @@ For block tags, a single parameter is required, which contains any text enclosed
152
139
 
153
140
  * [`@layout`](https://jekyllrb.com/docs/variables/#global-variables) Layout information
154
141
 
155
- * [`@logger`](jekyll_plugin_logger) `jekyll_plugin_logger` instance for your Jekyll plugin.
142
+ * `@logger` [`jekyll_plugin_logger`](https://github.com/mslinn/jekyll_plugin_logger) instance for your Jekyll plugin.
156
143
 
157
144
  * [`@mode`](https://jekyllrb.com/docs/configuration/environments/)
158
- Indicates `production` or `development` mode.
145
+ Indicates `production`, `test` or `development` mode.
159
146
 
160
147
  * [`@page`](https://jekyllrb.com/docs/variables/#page-variables) Page variables
161
148
 
@@ -198,91 +185,94 @@ both [`demo/_plugins/demo_inline_tag.rb`](demo/_plugins/demo_inline_tag.rb) and
198
185
  @name2 = @helper.parameter_specified? 'name2'
199
186
  ```
200
187
 
188
+ If an argument has a variable reference in it, the value of the variable is substituted for the reference.
189
+ For example, given:
201
190
 
202
- ### Automatically Created Error Classes
191
+ * `_layouts/default.html` defines a variable called `var_layout` in its front matter.
192
+ * `index.html` defines a variable called `var_page` in its front matter.
193
+ * `index.html` assigns a variable called `x` via the liquid `assign` statement.
203
194
 
204
- `JekyllSupport::JekyllBlock` and `JekyllSupport::JekyllTag` subclasses
205
- automatically create error classes, named after the subclass.
195
+ ... then the following references in a page will be substituted for their values in arguments and in block tag bodies:
206
196
 
207
- For example, if you create a `JekyllSupport::JekyllBlock` subclass called `DemoBlockTag`,
208
- the automatically generated error class will be called `DemoBlockTagError`.
197
+ ```html
198
+ {% my_block_tag
199
+ param1="x={{x}}"
200
+ param2="var_page={{page.var_page}}"
201
+ param3="var_layout={{layout.var_layout}}"
202
+ %}
209
203
 
210
- Although you could use it as you would any other error class, `JekyllPluginSupport` provides some helper methods.
211
- These methods fill in the page path and line number that caused the error, shorten the stack trace,
212
- log an error message, and can be used to return an HTML-friendly version of the message to the web page.
204
+ Assigned variables do not need a namespace: x={{x}}
213
205
 
214
- The following example is a shortened version of `demo/_plugins/demo_block_tag.rb`.
215
- You might want to write similar code in your `rescue` blocks.
206
+ Page variables must be qualified with the 'page' namespace:
207
+ var_page={{page.var_page}}
216
208
 
217
- ```ruby
218
- class DemoBlock < JekyllSupport::JekyllBlock
219
- VERSION = '0.1.2'.freeze
209
+ Layout variables must be qualified with the 'layout' namespace:
210
+ var_layout={{layout.var_layout}}
211
+ {% endmy_block_tag %}
212
+ ```
220
213
 
221
- def render_impl(text)
222
- raise DemoBlockTagError, 'Fall down, go boom.'
223
- rescue DemoBlockTagError => e
224
- e.shorten_backtrace
225
- @logger.error e.logger_message
226
- raise e if @die_on_demo_block_error
214
+ You can see similar code in [`demo/demo_inline_tag.html`](demo/demo_inline_tag.html).
227
215
 
228
- e.html_message
229
- end
230
- end
231
- ```
216
+ The `page['excerpt']` and `page['output']` key/value pairs are removed from processing because of recursion issues.
217
+ You cannot look up those values from a `jekyll_plugin_support` plugin.
232
218
 
233
- Error class methods have been provided for standardized and convenient error handling:
234
219
 
235
- * `shorten_backtrace` - most of the lines that spew from a Jekyll backtrace are uninteresting.
236
- * `logger_message` - The message is constructed from the string provided when the error was raised,
237
- with the page path and line number added.
238
- * `html_message` - The same as `logger_message`, but constructed with HTML.
220
+ ### Keyword Options
239
221
 
222
+ For all keyword options, values specified in the document _may_ be provided.
223
+ If a value is not provided, the value `true` is assumed.
224
+ Otherwise, if a value is provided, it _must_ be wrapped in single or double quotes.
240
225
 
241
- ### Self-Reporting Upon Registration
242
226
 
243
- When each tag is registered, it self-reports, for example:
227
+ ### Examples
244
228
 
245
- ```text
246
- INFO PluginMetaLogger: Loaded plugin demo_inline_tag v0.1.2. It has:
247
- Error class: DemoTagError
248
- CSS class for error messages: demo_tag_error
229
+ The following examples use the `die_if_error` keyword option for the
230
+ [`pre`](https://www.mslinn.com/jekyll_plugins/jekyll_pre.html#tag) and
231
+ [`exec`](https://www.mslinn.com/jekyll_plugins/jekyll_pre.html#tag_exec)
232
+ tags from the [`jekyll_pre`](https://www.mslinn.com/jekyll_plugins/jekyll_pre.html) plugin %}.
249
233
 
250
- _config.yml contains the following configuration for this plugin:
251
- {"die_on_demo_tag_error"=>false, "die_on_standard_error"=>false}
252
234
 
235
+ #### Specifying Tag Option Values
253
236
 
254
- INFO PluginMetaLogger: Loaded plugin demo_inline_tag_no_arg v0.1.0. It has:
255
- Error class: DemoTagNoArgsError
256
- CSS class for error messages: demo_tag_no_args_error
237
+ The following sets `die_if_error` `true`:
257
238
 
258
- _config.yml does not contain configuration information for this plugin.
259
- You could add a section containing default values by specifying a section for the tag name,
260
- and an entry whose name starts with `die_on_`, followed by a snake_case version of the error name.
239
+ ```html
240
+ {% pre die_if_error %} ... {% endpre %}
241
+ ```
261
242
 
262
- demo_inline_tag_no_arg:
263
- die_on_demo_tag_no_args_error: false
243
+ The above is the same as writing:
244
+
245
+ ```html
246
+ {% pre die_if_error='true' %} ... {% endpre %}
264
247
  ```
265
248
 
266
- ### Example
249
+ Or writing:
250
+
251
+ ```html
252
+ {% pre die_if_error="true" %} ... {% endpre %}
253
+ ```
267
254
 
268
- [`demo/index.html`](demo/index.html), contains the following inline tag invocation:
255
+ Neglecting to provide surrounding quotes around the provided value causes the parser to not recognize the option.
256
+ Instead, what you had intended to be the keyword/value pair will be parsed as part of the command.
257
+ For the `pre` tag, this means the erroneous string becomes part of the `label` value,
258
+ unless `label` is explicitly specified.
259
+ For the `exec` tag, this means the erroneous string becomes part of the command to execute.
260
+ The following demonstrates the error.
269
261
 
270
262
  ```html
271
- {% demo_inline_tag keyword1 name1='value1' unreferenced_key unreferenced_name="unreferenced_value" %}
263
+ {% pre die_if_error=false %} ... {% endpre %}
272
264
  ```
273
265
 
274
- The `demo/_plugins/demo_inline_tag.rb` plugin uses `@helper.parameter_specified?` provided by
275
- `jekyll_support_plugin` to parse the string passed to the tag, which is
276
- `keyword1 name1='value1' unreferenced_key unreferenced_name="unreferenced_value"`.
266
+ The above causes the label to be `die_if_error=false`.
277
267
 
278
- * Because `keyword1` was referenced by `@helper.parameter_specified?` above,
279
- that keyword option is removed from the argument string.
280
- * Because the `name1` key/value parameter was referenced by `@helper.parameter_specified?` above,
281
- that name/value pair is removed from the argument string.
282
- * The remainder of the argument string is now `unreferenced_key unreferenced_name="unreferenced_value"`.
268
+ ```html
269
+ {% exec die_if_error=false ls %} ... {% endpre %}
270
+ ```
271
+
272
+ The above causes the command to be executed to be `die_if_error=false ls` instead of `ls`.
283
273
 
284
274
 
285
- ### To Quote Or Not To Quote
275
+ ### Quoting
286
276
 
287
277
  Parameter values can be quoted.
288
278
 
@@ -300,6 +290,7 @@ The following examples both yield the same result:
300
290
  * `pay_tuesday="maybe not"`
301
291
  * `pay_tuesday='maybe not'`
302
292
 
293
+
303
294
  ### Remaining Markup
304
295
 
305
296
  After your plugin has parsed all the keyword options and name/value parameters,
@@ -328,13 +319,12 @@ In the following example web page, the Liquid variable called `var1` is expanded
328
319
  Liquid variables `var1` and `var2` are expanded and passed to the `my_plugin` plugin.
329
320
 
330
321
  ```html
331
- This is the value of <code>var1</code>: {{var1}}.
322
+ This is the value of var1: {{var1}}.
332
323
 
333
324
  {% my_plugin param1="{{var1}}" param2="{{var2}}" %}
334
325
  ```
335
326
 
336
- `Jekyll_plugin_support` expands all but one of the
337
- [plugin variables described above](#predefined-variables),
327
+ `Jekyll_plugin_support` expands most of the [plugin variables described above](#predefined-variables),
338
328
  replacing Liquid variable references with their values.
339
329
  The exception is `@argument_string`, which is not expanded.
340
330
 
@@ -404,6 +394,71 @@ Similarly, the letters `y` and `z` are pronounced {{y}} and {{z}}.
404
394
  ```
405
395
 
406
396
 
397
+ ### Automatically Created Error Classes
398
+
399
+ `JekyllSupport::JekyllBlock` and `JekyllSupport::JekyllTag` subclasses
400
+ automatically create error classes, named after the subclass.
401
+
402
+ For example, if you create a `JekyllSupport::JekyllBlock` subclass called `DemoBlockTag`,
403
+ the automatically generated error class will be called `DemoBlockTagError`.
404
+
405
+ Although you could use it as you would any other error class, `JekyllPluginSupport` provides some helper methods.
406
+ These methods fill in the page path and line number that caused the error, shorten the stack trace,
407
+ log an error message, and can be used to return an HTML-friendly version of the message to the web page.
408
+
409
+ The following example is a shortened version of `demo/_plugins/demo_block_tag.rb`.
410
+ You might want to write similar code in your `rescue` blocks.
411
+
412
+ ```ruby
413
+ class DemoBlock < JekyllSupport::JekyllBlock
414
+ VERSION = '0.1.2'.freeze
415
+
416
+ def render_impl(text)
417
+ raise DemoBlockTagError, 'Fall down, go boom.'
418
+ rescue DemoBlockTagError => e
419
+ e.shorten_backtrace
420
+ @logger.error e.logger_message
421
+ raise e if @die_on_demo_block_error
422
+
423
+ e.html_message
424
+ end
425
+ end
426
+ ```
427
+
428
+ Error class methods have been provided for standardized and convenient error handling:
429
+
430
+ * `shorten_backtrace` - most of the lines that spew from a Jekyll backtrace are uninteresting.
431
+ * `logger_message` - The message is constructed from the string provided when the error was raised,
432
+ with the page path and line number added.
433
+ * `html_message` - The same as `logger_message`, but constructed with HTML.
434
+
435
+
436
+ ### Self-Reporting Upon Registration
437
+
438
+ When each tag is registered, it self-reports, for example:
439
+
440
+ ```text
441
+ INFO PluginMetaLogger: Loaded plugin demo_inline_tag v0.1.2. It has:
442
+ Error class: DemoTagError
443
+ CSS class for error messages: demo_tag_error
444
+
445
+ _config.yml contains the following configuration for this plugin:
446
+ {"die_on_demo_tag_error"=>false, "die_on_standard_error"=>false}
447
+
448
+
449
+ INFO PluginMetaLogger: Loaded plugin demo_inline_tag_no_arg v0.1.0. It has:
450
+ Error class: DemoTagNoArgsError
451
+ CSS class for error messages: demo_tag_no_args_error
452
+
453
+ _config.yml does not contain configuration information for this plugin.
454
+ You could add a section containing default values by specifying a section for the tag name,
455
+ and an entry whose name starts with `die_on_`, followed by a snake_case version of the error name.
456
+
457
+ demo_inline_tag_no_arg:
458
+ die_on_demo_tag_no_args_error: false
459
+ ```
460
+
461
+
407
462
  ## `no_arg_parsing` Optimization
408
463
 
409
464
  If your tag or block plugin only needs access to the raw arguments passed from the web page,
@@ -434,6 +489,22 @@ Using the `attribution` option cause subclasses to replace their usual output wi
434
489
  The `id` attribute is in the sample HTML above is randomized so more than one attribution can appear on a page.
435
490
 
436
491
 
492
+ ### Attribution Generation
493
+
494
+ You can decide where you want the attribution string for your Jekyll tag to appear by invoking `@helper.attribute`.
495
+ For example, this is how the
496
+ [`jekyll_outline` tag](https://github.com/mslinn/jekyll_outline/blob/v1.1.1/lib/outline_tag.rb#L32-L46) generates output:
497
+
498
+ ```html
499
+ <<~HEREDOC
500
+ <div class="outer_posts">
501
+ #{make_entries(collection)&.join("\n")}
502
+ </div>
503
+ #{@helper.attribute if @helper.attribution}
504
+ HEREDOC
505
+ ```
506
+
507
+
437
508
  ### Usage
438
509
 
439
510
  Typical usage for the `attribution` tag is:
@@ -444,7 +515,7 @@ Typical usage for the `attribution` tag is:
444
515
  {% endmy_block_tag %}
445
516
  ```
446
517
 
447
- Normal processing of `my_block_tag` is augmented by interpolating the attribution format string,
518
+ The normal processing of `my_block_tag` is augmented by interpolating the attribution format string,
448
519
  which is a Ruby-compatible interpolated string.
449
520
 
450
521
  The default attribution format string is:
@@ -463,21 +534,6 @@ An alternative attribution string can be specified properties can be output usin
463
534
  {% my_tag attribution="Generated by the #{name} #{version} Jekyll plugin, written by #{author} #{date}" %}
464
535
  ```
465
536
 
466
- ### Attribution Generation
467
-
468
- You can decide where you want the attribution string for your Jekyll tag to appear by invoking `@helper.attribute`.
469
- For example, this is how the
470
- [`jekyll_outline` tag](https://github.com/mslinn/jekyll_outline/blob/v1.1.1/lib/outline_tag.rb#L32-L46) generates output:
471
-
472
- ```html
473
- <<~HEREDOC
474
- <div class="outer_posts">
475
- #{make_entries(collection)&.join("\n")}
476
- </div>
477
- #{@helper.attribute if @helper.attribution}
478
- HEREDOC
479
- ```
480
-
481
537
 
482
538
  ## Development
483
539
 
@@ -1,3 +1,3 @@
1
1
  module JekyllPluginSupportVersion
2
- VERSION = '0.8.2'.freeze
2
+ VERSION = '0.8.3'.freeze
3
3
  end
@@ -40,11 +40,13 @@ module JekyllSupport
40
40
  end
41
41
 
42
42
  # Add variable definitions from _config.yml to liquid_context
43
- # Modifies liquid_context in the caller (call by reference)
43
+ # Modifies liquid_context in the caller
44
+ # (call by object reference, see https://stackoverflow.com/a/1872159/553865)
44
45
  # @return modified liquid_context
45
46
  # See README.md#configuration-variable-definitions
46
47
  # See demo/variables.html
47
48
  def self.inject_vars(_logger, liquid_context)
49
+ # TODO: Modify a deep clone? Do I dare?
48
50
  site = liquid_context.registers[:site]
49
51
 
50
52
  plugin_variables = site.config['liquid_vars']
@@ -68,10 +70,46 @@ module JekyllSupport
68
70
  liquid_context
69
71
  end
70
72
 
71
- def self.lookup_liquid_variables(liquid_context, markup)
73
+ def self.dump_stack(stack, cycles, interval)
74
+ stack_depth = stack.length
75
+ puts "Stack depth is #{stack_depth}"
76
+ num_entries = cycles * interval
77
+ return unless stack_depth > interval * 5
78
+
79
+ stack.last(num_entries).each_with_index do |x, i|
80
+ msg = " #{i}: #{x}"
81
+ (i % interval).zero? ? puts(msg.yellow) : puts(msg)
82
+ end
83
+ end
84
+
85
+ # Modifies a clone of markup_original so variable references are replaced by their values
86
+ # @param markup_original to be cloned
87
+ # @return modified markup_original
88
+ def self.lookup_liquid_variables(liquid_context, markup_original)
89
+ markup = markup_original.clone
90
+ page = liquid_context.registers[:page]
91
+ envs = liquid_context.environments.first
92
+ layout = envs[:layout]
93
+
94
+ # process layout variables
95
+ layout&.each do |name, value|
96
+ markup.gsub!("{{layout.#{name}}}", value.to_s)
97
+ end
98
+
99
+ # process page variables
100
+ # puts "\nStarting page variable processing of #{page['path']}; stack has #{caller.length} elements".green
101
+ keys = page.keys
102
+ %w[excerpt output].each { |key| keys.delete key }
103
+ # puts " Filtered keys: #{keys.join ' '}"
104
+ # keys.each { |key| puts " #{key}: #{page[key]}" }
105
+ keys&.each do |key|
106
+ markup.gsub!("{{page.#{key}}}", page[key].to_s)
107
+ end
108
+
109
+ # Process assigned, captured and injected variables
72
110
  liquid_context.scopes.each do |scope|
73
- scope.each do |name, value|
74
- markup = markup.gsub("{{#{name}}}", value.to_s)
111
+ scope&.each do |name, value|
112
+ markup.gsub!("{{#{name}}}", value.to_s)
75
113
  end
76
114
  end
77
115
  markup
@@ -57,7 +57,8 @@ module JekyllSupport
57
57
 
58
58
  @mode = @config['env']&.key?('JEKYLL_ENV') ? @config['env']['JEKYLL_ENV'] : 'development'
59
59
 
60
- @helper.reinitialize JekyllSupport.lookup_liquid_variables liquid_context, @argument_string
60
+ markup = JekyllSupport.lookup_liquid_variables liquid_context, @argument_string
61
+ @helper.reinitialize markup
61
62
 
62
63
  render_impl
63
64
  rescue StandardError => e
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.8.2
4
+ version: 0.8.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mike Slinn
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-01-04 00:00:00.000000000 Z
11
+ date: 2024-01-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: facets