jekyll_draft 2.0.0 → 2.0.2

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: 5123990f175f9d09091e7f092a202b075067497e9b17dabf3eda397c48d9b11e
4
- data.tar.gz: 80f3912e94858f6ccc373d2a155f0b6f907c79c13ea6bb8495837d019656508b
3
+ metadata.gz: b8b48bd7048b0c4eb3836226b81c8da703f6573e5a564bf5c9ef22733be35167
4
+ data.tar.gz: 0ebe1a2cbbea83bb3f47fb3e512203a6aebfde0248cff99266e74a66536c99d7
5
5
  SHA512:
6
- metadata.gz: 406222aeae0160d0ff1ef9c5c5d5ad9af0a4f357541dd43742a58c229bc6094343960c215efd498cee33d37fb76457aac1e6d0d5183c4f16277cbf044f4c0f79
7
- data.tar.gz: eed26a657a04c4907700ef805fb41d67b2ed4842058f12918d3231035c46b2c6fe7c17b065a3a8c625410401f5376c86d3db4d40f607baa7e8c89320f623d6f5
6
+ metadata.gz: 4383047a610783981f175d29ccc86212c9b76a571ef587d06d29b487c3895e3e73737559ceeea25f4d849fe3a1fd5c64994b035378095ad355948f0bffe032b5
7
+ data.tar.gz: d2b9ec0decefb9c1b238c498c5a36735b1033362ff327c3d06760c9d0ce6a4e26bd2f657758403664f0b8a04914e8ad9396bdf6f383cac031849a2534d4e89dd
data/CHANGELOG.md CHANGED
@@ -1,9 +1,37 @@
1
1
  # Change Log
2
2
 
3
+ ## 2.0.2 / 2024-07-24
4
+
5
+ * Compatible with `jekyll_plugin_support` v1.0.0
6
+
7
+
8
+ ## 2.0.1 / 2024-02-07
9
+
10
+ * Added Jekyll block tags `if_secret` and `unless_secret`.
11
+ * Added Jekyll inline tags: `unless_draft_only`, `else_if_secret` and `else_if_not_secret`.
12
+ * Added Liquid filter: `is_secret`.
13
+ * Added method `draft_only?` and `secret?` to API module `Jekyll::Draft`.
14
+
15
+
16
+ ## 2.0.1 / 2023-11-30
17
+
18
+ * Jekyll block tags: `if_draft` and `unless_draft`.
19
+ * Jekyll inline tags: `else_if_not_draft` and `else_if_draft`.
20
+ * Jekyll inline tag `draft_html`.
21
+ * Liquid filters:
22
+ * `is_draft`
23
+ * `draft_html`
24
+ * Module `Jekyll::Draft` defines an API with the following methods:
25
+ * `draft?` returns a boolean indicating if the document passed to it is a draft.
26
+ * `draft_html` returns the same string the `draft_html` tag returns,
27
+ indicating if the document passed to it is a draft.
28
+
29
+
3
30
  ## 2.0.0 / 2023-11-29
4
31
 
5
- * Made into a Jekyll block tag, because the filter implementation had problems with infinite recursing Jekyll exerpts.
6
- This was a complete rewrite, incompatible with previous version.
32
+ * This version was published prematurely by accident.
33
+ It is broken, do not use it.
34
+ * This is a complete rewrite, incompatible with previous versions.
7
35
 
8
36
 
9
37
  ## 1.1.2 / 2023-02-25
data/README.md CHANGED
@@ -1,59 +1,379 @@
1
1
  # jekyll_draft [![Gem Version](https://badge.fury.io/rb/jekyll_draft.svg)](https://badge.fury.io/rb/jekyll_draft)
2
2
 
3
- This is a Jekyll plugin that provides two Liquid filters: `is_draft` and `draft_html`.
3
+ Jekyll has various ways of specifying that a page or document is
4
+ visible when the website is published in `production` mode.
5
+ The Jekyll documentation is scattered and incomplete regarding this topic.
6
+ This plugin’s filters provide a simple means for marking draft pages in `development` mode.
7
+
8
+ A secret document is a special form of a draft document.
9
+ Secrets are always drafts, but not the converse.
10
+
11
+ `Jekyll_draft` provides the following:
12
+
13
+ * Jekyll block tags: `if_draft` and `unless_draft`.
14
+ * Jekyll block tags: `if_secret` and `unless_secret`.
15
+ * Jekyll inline tags: `else_if_not_draft`, `else_if_draft`, `else_if_not_secret` and `else_if_secret`.
16
+ These are meant for use within `if_draft`, `unless_draft`, `if_secret` and `unless_secret`, respectively.
17
+ Both of them are identical; they are both provided so usage seems natural.
18
+ * Jekyll inline tag `draft_html`, which generates HTML that indicates if the document
19
+ it is embedded within is a draft or a secret.
20
+ * Liquid filters:
21
+ * `is_draft` returns a boolean indicating if the document passed to it is a draft.
22
+ * `is_secret` returns a boolean indicating if the document passed to it is a secret.
23
+ * `draft_html` returns the same string the `draft_html` tag returns,
24
+ indicating if the document passed to it is a draft.
25
+ * Module `Jekyll::Draft` defines an API that your plugin can call.
26
+ It has the following methods:
27
+ * `draft?` returns a boolean indicating if the document passed to it is a draft or a secret.
28
+ * `draft_only?` returns a boolean indicating if the document passed to it is a draft and not a secret.
29
+ * `draft_html` returns the same string that `draft_html` tag returns;
30
+ the response indicates if the document passed to it is a draft.
31
+ * `root` returns the path to the root of the collection that the document passed to it is a member of.
32
+ This method is not functionally related to Jekyll draft documents;
33
+ it should be packaged separately ... maybe one day...
34
+ * `secret?` returns a boolean indicating if the document passed to it is a draft.
35
+
36
+ The difference between the tag called `draft_html` and the filter of the same name
37
+ is that the tag only works on the document that it is embedded in,
38
+ while the filter works on any document passed to it.
39
+ Both the tag and the filter call the same API methods defined in the `Jekyll::Draft` module.
40
+
41
+ More information is available on [Mike Slinn’s website](https://www.mslinn.com/jekyll_plugins/jekyll_draft.html).
42
+
43
+
44
+ ## Front Matter
45
+
46
+ To mark a blog as a draft, put it in the `_drafts` directory.
47
+
48
+ To mark any other article as a draft, add the following to its front matter:
49
+
50
+ ```text
51
+ published: false
52
+ ```
53
+
54
+ To mark any article (including blog posts) as a secret, add the following to its front matter:
55
+
56
+ ```text
57
+ secret: true
58
+ ```
59
+
60
+ Secret documents are a type of draft document, so the above implies:
61
+
62
+ ```text
63
+ published: false
64
+ secret: true
65
+ ```
66
+
67
+
68
+ ## Demo
69
+
70
+ The [demo](demo) subdirectory has working examples of this Jekyll plugin's functionality
71
+ in a demonstration website.
72
+ It can be used to debug the plugin or it can run freely.
73
+ Please examine the <code>HTML</code> files in the demo to see how the plugin works.
74
+
75
+ To run the demo freely from the command line, type:
76
+
77
+ ```console
78
+ $ demo/_bin/debug -r
79
+ ```
4
80
 
5
- More information is available on my website about [my Jekyll plugins](https://www.mslinn.com/blog/2020/10/03/jekyll-plugins.html#draft).
81
+ Now point your web browser to http://localhost:4444.
82
+ You should see:
83
+
84
+ ![jekyll_draft demo](jekyll_draft_demo.png)
85
+
86
+ When the demonstration is running, any time you modify the <code>.html</code> files,
87
+ the demo website will regenerate.
88
+ Each time you make a change, the website instantly regenerates.
89
+ This helps the learning experience.
90
+
91
+ Please play with the contents of the <code>.html</code> files,
92
+ so you can learn how to write Jekyll pages that include this functionality.
6
93
 
7
94
 
8
95
  ## Installation
9
96
 
10
- Add the following to your CSS:
97
+ ### For Use In A Jekyll Website
98
+
99
+ 1. Add the CSS found in [`demo/assets/css/jekyll_draft.css`](demo/assets/css/jekyll_draft.css) to your Jekyll layout(s).
100
+
101
+ 2. Add the following to your Jekyll website's `Gemfile`, within the `jekyll_plugins` group:
102
+
103
+ ```ruby
104
+ group :jekyll_plugins do
105
+ gem 'jekyll_draft', '>2.0.0' # v2.0.0 was a dud, do not use it
106
+ end
107
+ ```
108
+
109
+ 3. Type:
110
+
111
+ ```shell
112
+ $ bundle
113
+ ```
114
+
115
+
116
+ ### For Use In a Gem
117
+
118
+ 1. Add the following to your gem&rsquo;s `.gemspec`:
119
+
120
+ ```ruby
121
+ spec.add_dependency 'jekyll_draft', '>2.0.0' # v2.0.0 was a dud, do not use it
122
+ ```
123
+
124
+ 2. Type:
125
+
126
+ ```shell
127
+ $ bundle
128
+ ```
129
+
130
+
131
+ ## Usage in a Web Page
11
132
 
12
- ```css
13
- .jekyll_draft {
14
- background-color: #fefeab;
15
- padding-bottom: 2px;
16
- padding-left: 0.5em;
17
- padding-right: 0.5em;
18
- padding-top: 2px;
19
- }
133
+ ### `if_draft`, `unless_draft`, `if_secret` and `unless_secret` Block Tags
134
+
135
+ The `if_draft` and `if_secret` block tags acts as `if-then` or `if-then-else` programming constructs.
136
+
137
+ The following generates `<p>This is a draft or a secret document!</p>`
138
+ if the document it is embedded in is a draft, and the Jekyll website generation was performed in development mode:
139
+
140
+ ```html
141
+ {% if_draft %}
142
+ <p>This is a draft or a secret document!</p>
143
+ {% endif_draft %}
20
144
  ```
21
145
 
22
- Add this line to your Jekyll website's `Gemfile`, within the `jekyll_plugins` group:
146
+ The following generates `<p>This is a draft document!</p>`
147
+ if the document it is embedded in is a draft and not a secret, and the Jekyll website generation was performed in development mode:
23
148
 
24
- ```ruby
25
- group :jekyll_plugins do
26
- gem 'jekyll_draft'
27
- end
149
+ ```html
150
+ {% if_draft_only %}
151
+ <p>This is a draft document!</p>
152
+ {% endif_draft %}
28
153
  ```
29
154
 
30
- And then execute:
155
+ The following generates `<p>This is a secret document!</p>`
156
+ if the document it is embedded in is a secret, and the Jekyll website generation was performed in development mode:
31
157
 
32
- ```shell
33
- $ bundle
158
+ ```html
159
+ {% if_secret %}
160
+ <p>This is a secret document!</p>
161
+ {% endif_draft %}
34
162
  ```
35
163
 
164
+ The following enhances the previous example by also generating `<p>This is not a draft or a secret document!</p>`
165
+ when in production mode:
36
166
 
37
- ## Usage
167
+ ```html
168
+ {% if_draft %}
169
+ <p>This is a draft or a secret document!</p>
170
+ {% else_if_not_secret %}
171
+ <p>This is not a secret document, but might be a draft!</p>
172
+ {% else_if_not_draft %}
173
+ <p>This is not a draft or a secret document!</p>
174
+ {% endif_draft %}
175
+ ```
38
176
 
39
- ### `is_draft`
177
+ The `unless_draft`, `unless_draft_only` and `unless_secret` block tags acts as Ruby
178
+ [unless-then](https://rubystyle.guide/#unless-for-negatives) or
179
+ an [unless-then-else](https://rubystyle.guide/#no-else-with-unless) programming constructs.
40
180
 
41
- This filter detects if a page is invisible when published in `production` mode,
42
- and either returns `true` or `false`.
181
+ ```html
182
+ {% unless_draft %}
183
+ <p>This is not a draft or a secret document!</p>
184
+ {% endunless_draft %}
185
+ ```
43
186
 
44
187
  ```html
45
- {{ page | is_draft }} => true
188
+ {% unless_draft_only %}
189
+ <p>This is not a draft document, but might be a secret!</p>
190
+ {% endunless_draft %}
46
191
  ```
47
192
 
48
- ### `draft_html`
193
+ ```html
194
+ {% unless_secret %}
195
+ <p>This is not a secret document, but might be a draft!</p>
196
+ {% endunless_draft %}
197
+ ```
49
198
 
50
- This filter generates HTML to display if a page is invisible when published in `production` mode.
199
+ This is how you can specify an `else` clause for `unless_draft`:
200
+
201
+ ```html
202
+ {% unless_draft %}
203
+ <p>This is not a draft document!</p>
204
+ {% else_if_draft %}
205
+ <p>This is a draft document!</p>
206
+ {% endunless_draft %}
207
+ ```
208
+
209
+ ```html
210
+ {% unless_draft %}
211
+ <p>This is not a draft document!</p>
212
+ {% else_if_draft %}
213
+ <p>This is a draft or a secret document!</p>
214
+ {% else_if_draft_only %}
215
+ <p>This is a draft document!</p>
216
+ {% else_if_secret %}
217
+ <p>This is a secret document!</p>
218
+ {% endunless_draft %}
219
+ ```
220
+
221
+ You can use the keywords `else_if_draft` and `else_if_not_draft` interchangeably.
222
+ They are actually made by registering the same code twice with different subclass names.
223
+ Use the keyword that makes the most sense to you.
224
+
225
+
226
+ ### `draft_html` Inline Tag
227
+
228
+ Here is an example of embedding the `draft_html` inline tag into an HTML document:
229
+
230
+ ```html
231
+ <p>Is this a draft document? Look here to see: {% draft_html %}</p>
232
+ ```
233
+
234
+ By default, if the document is a draft or a secret, and the Jekyll website generation was performed in development mode,
235
+ `draft_html` emits ` <i class='jekyll_draft>Draft</i>` or ` <i class='jekyll_secret>Secret</i>` ,
236
+ otherwise it does not emit anything.
237
+
238
+ You can change this behavior several ways:
239
+
240
+ * Add the `published_output` parameter to specify the HTML that should be emitted if the document is not a draft or a secret,
241
+ and the Jekyll website generation was performed in development mode.
242
+ The default message will continue to be output for draft documents when the `published_output` parameter is used.
243
+
244
+ ```html
245
+ {% draft_html published_output="<p>Not a draft or a secret</p>" %}
246
+ ```
247
+
248
+ * Add the `draft_output` parameter to specify the HTML that should be emitted if the document is a draft,
249
+ the `secret_output` parameter to specify the HTML that should be emitted if the document is a secret,
250
+ and the Jekyll website generation was performed in development mode:
251
+
252
+ ```html
253
+ {% draft_html
254
+ draft_output="<p>Is a draft</p>"
255
+ %}
256
+ {% draft_html
257
+ draft_output="<p>Is a draft</p>"
258
+ published_output="<p>Not a draft</p>"
259
+ %}
260
+ {% draft_html
261
+ secret_output="<p>Is a secret</p>"
262
+ %}
263
+ {% draft_html
264
+ draft_output="<p>Is a draft</p>"
265
+ published_output="<p>Not a draft or a secret</p>"
266
+ secret_output="<p>Is a secret</p>"
267
+ %}
268
+ ```
269
+
270
+ * Add the `draft_class` parameter to specify the CSS class that should be added
271
+ to the emitted HTML if the document is a draft,
272
+ add the `secret_class` parameter to specify the CSS class that should be added
273
+ to the emitted HTML if the document is a secret,
274
+ and the Jekyll website generation was performed in development mode:
275
+
276
+ ```html
277
+ {% draft_html draft_class="my_draft_class" %}
278
+ {% draft_html
279
+ draft_class="my_draft_class"
280
+ published_output="<p>Not a draft or a secret</p>"
281
+ %}
282
+ {% draft_html draft_class="my_draft_class" secret_class="my_secret_class" %}
283
+ {% draft_html
284
+ draft_class="my_draft_class"
285
+ published_output="<p>Not a draft or a secret</p>"
286
+ secret_class="my_secret_class"
287
+ %}
288
+ ```
289
+
290
+ * Add the `draft_style` parameter to specify the CSS class that should be added
291
+ to the emitted HTML if the document is a draft,
292
+ and the Jekyll website generation was performed in development mode:
293
+
294
+ ```html
295
+ {% draft_html draft_style="font-size: 24pt;" %}
296
+ {% draft_html secret_style="font-size: 24pt; color: red;" %}
297
+ {% draft_html
298
+ draft_class="my_draft_class"
299
+ draft_style="font-size: 24pt;"
300
+ secret_class="my_secret_class"
301
+ secret_style="font-size: 24pt; color: red;"
302
+ %}
303
+ {% draft_html
304
+ draft_class="my_draft_class"
305
+ draft_style="font-size: 24pt;"
306
+ published_output="<p>Not a draft or a secret</p>"
307
+ secret_class="my_secret_class"
308
+ secret_style="font-size: 24pt; color: red;"
309
+ %}
310
+ ```
311
+
312
+
313
+ ### Liquid Filters
314
+
315
+ #### `draft_html`
316
+
317
+ By default, the draft_html Liquid filter generates HTML if a page is invisible when published in `production` mode.
51
318
  If the page is not a draft then the empty string is returned.
52
- The generated HTML for draft pages is:<br>
53
- `" &lt;i class='jekyll_draft'>Draft&lt;/i>"`
319
+
320
+ The optional parameters for the `draft_html` inline tag are not available for
321
+ use with the `draft_html` filter.
322
+
323
+ The default generated HTML for draft pages is:<br>
324
+ `" <i class='jekyll_draft'>Draft</i>"`
325
+
326
+ The default generated HTML for secret pages is:<br>
327
+ `" <i class='jekyll_secret'>Secret</i>"`
328
+
329
+ Invoke the filter like the following; the output depends on whether the document is a draft or a secret:
330
+
331
+ ```html
332
+ {{ page | draft_html }} => " <i class='jekyll_draft'>Draft</i>"
333
+ {{ page | draft_html }} => " <i class='jekyll_secret'>Secret</i>"
334
+ ```
335
+
336
+ Here is a code snippet that shows the <code>draft_html</code> filter in use:
337
+
338
+ ```html
339
+ {% assign docs = site.myCollection | sort: "order" %}
340
+ <ol id="titles">
341
+ {% for doc in docs %}
342
+ <li>
343
+ <a href="{{doc.url}}" class="title">{{doc.title}}</a>{{ doc | draft_html }}
344
+ </li>
345
+ {% endfor %}
346
+ </ol>
347
+ ```
348
+
349
+
350
+ #### `is_draft`
351
+
352
+ This filter detects if a page is invisible when published in `production` mode,
353
+ and either returns `true` or `false`.
354
+
355
+ ```html
356
+ {{ page | is_draft }} <!-- true for draft and secret documents in development mode -->
357
+ ```
358
+
359
+
360
+ #### `is_draft_only`
361
+
362
+ This filter detects if a page is invisible when published in `production` mode,
363
+ and either returns `true` or `false`.
364
+
365
+ ```html
366
+ {{ page | is_draft_only }} <!-- true for draft documents in development mode, but not secret documents -->
367
+ ```
368
+
369
+
370
+ #### `is_secret`
371
+
372
+ This filter detects if a page is invisible when published in `production` mode,
373
+ and either returns `true` or `false`.
54
374
 
55
375
  ```html
56
- {{ page | draft_html }} => " <i class='bg_light_yellow' style='padding-left: 0.5em; padding-right: 0.5em;'>Draft</i>"
376
+ {{ page | is_secret }} <!-- true for secret documents in development mode, but not draft documents -->
57
377
  ```
58
378
 
59
379
 
@@ -62,32 +382,50 @@ The generated HTML for draft pages is:<br>
62
382
  ```ruby
63
383
  require 'jekyll_draft'
64
384
 
65
- puts 'Found a draft' if Jekyll::Draft.is_draft post
385
+ puts 'Found a draft or a secret' if Jekyll::Draft.is_draft post
66
386
 
67
- draft = Jekyll::Draft.draft_html post
387
+ draft_or_secret = Jekyll::Draft.draft_html post
68
388
  ```
69
389
 
70
390
 
71
- ## Demo
391
+ ## Usage in a Plugin
72
392
 
73
- The [`demo`](./demo) directory contains a demonstration website, which uses the plugin.
74
- To run, type:
393
+ The methods in `lib/draft_html.rb` can be invoked by qualifying them with `Jekyll::Draft`.
394
+ Here is a complete example of a Jekyll Support plugin that displays an indication of whether the page is a draft or not:
75
395
 
76
- ```console
77
- $ demo/_bin/debug -r
78
- ```
396
+ ```ruby
397
+ require 'jekyll_plugin_support'
398
+
399
+ module MyPluginTag
400
+ MyPluginError = JekyllSupport.define_error
401
+ PLUGIN_NAME = 'my_plugin'.freeze
402
+ VERSION = '0.1.0'.freeze
403
+
404
+ class MyPluginTag < JekyllSupport::JekyllTag
405
+ def render_impl
406
+ <<~HEREDOC
407
+ Draft or not? #{Jekyll::Draft.draft_html(@page)}
408
+ HEREDOC
409
+ end
410
+ end
411
+ end
79
412
 
80
- Now point your web browser to http://localhost:4444
413
+ Liquid::Template.register_tag(MyPluginTag::PLUGIN_NAME, MyPluginTag::MyPluginTag)
414
+ PluginMetaLogger.instance.info { "Loaded #{MyPluginTag::PLUGIN_NAME} v#{MyPluginTag::VERSION} plugin." }
415
+ ```
81
416
 
82
417
 
83
418
  ## Development
84
419
 
85
- After checking out the repo, run `bin/setup` to install dependencies. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
420
+ ### Setup
421
+
422
+ After checking out the repo, run `bin/setup` to install dependencies.
423
+ You can also run `bin/console` for an interactive prompt that will allow you to experiment.
86
424
 
87
425
  Install development dependencies like this:
88
426
 
89
427
  ```shell
90
- $ BUNDLE_WITH="development" bundle
428
+ $ BUNDLE_WITH=development bundle
91
429
  ```
92
430
 
93
431
  To install this gem onto your local machine, run:
@@ -96,39 +434,72 @@ To install this gem onto your local machine, run:
96
434
  $ bundle exec rake install
97
435
  ```
98
436
 
99
- To release a new version,
100
-
101
- 1. Update the version number in `version.rb`.
102
- 2. Commit all changes to git; if you don't the next step might fail with an unexplainable error message.
103
- 3. Run the following:
104
-
105
- ```shell
106
- $ bundle exec rake release
107
- ```
437
+ ### Debugging The Demo
108
438
 
109
- The above creates a git tag for the version, commits the created tag,
110
- and pushes the new `.gem` file to [RubyGems.org](https://rubygems.org).
439
+ Set breakpoints, then use the Visual Studio Code launch configuration called `Debug Demo`.
111
440
 
112
441
 
113
- ### Debugging
442
+ ### Debugging From Another Jekyll Site
114
443
 
115
444
  Run `bin/attach` and pass the directory name of a Jekyll website that has a suitable script called `_bin/debug`.
116
445
  The `demo` subdirectory fits this description.
117
446
 
118
447
  ```console
119
448
  $ bin/attach demo
120
- Successfully uninstalled jekyll_draft-0.1.0
121
- jekyll_draft 0.1.0 built to pkg/jekyll_draft-0.1.0.gem.
122
- jekyll_draft (0.1.0) installed.
123
- Fast Debugger (ruby-debug-ide 0.7.3, debase 0.2.4.1, file filtering is supported) listens on 0.0.0.0:1234
449
+ Successfully uninstalled jekyll_draft-1.1.2
450
+ Successfully uninstalled jekyll_draft-2.0.0
451
+ jekyll_draft 2.0.0 built to pkg/jekyll_draft-2.0.0.gem.
452
+ jekyll_draft (2.0.0) installed.
453
+ jekyll_draft 2.0.0 built to pkg/jekyll_draft-2.0.0.gem.
454
+ jekyll_draft (2.0.0) installed.
455
+ Fetching gem metadata from https://rubygems.org/..........
456
+ Resolving dependencies...
457
+ Bundle complete! 21 Gemfile dependencies, 104 gems now installed.
458
+ Use `bundle info [gemname]` to see where a bundled gem is installed.
459
+
460
+
461
+ INFO PluginMetaLogger: Loaded else_if_draft v0.1.0 plugin.
462
+ INFO PluginMetaLogger: Loaded else_if_not_draft v0.1.0 plugin.
463
+ INFO PluginMetaLogger: Loaded String and String, v2.0.0 plugin.
464
+ INFO PluginMetaLogger: Loaded if_draft v2.0.0 plugin.
465
+ INFO PluginMetaLogger: Loaded unless_draft v2.0.0 plugin.
466
+ INFO PluginMetaLogger: Loaded String and String, v2.0.0 plugin.
467
+ INFO PluginMetaLogger: Loaded exec v1.4.2 plugin.
468
+ INFO PluginMetaLogger: Loaded noselect v1.4.2 plugin.
469
+ INFO PluginMetaLogger: Loaded pre v1.4.2 plugin.
470
+ INFO PluginMetaLogger: Loaded jekyll_pre v1.4.2 plugin.
471
+ Configuration file: /mnt/f/work/jekyll/my_plugins/jekyll_draft/demo/_config.yml
472
+ Cleaner: Removing /mnt/f/work/jekyll/my_plugins/jekyll_draft/demo/_site...
473
+ Cleaner: Removing /mnt/f/work/jekyll/my_plugins/jekyll_draft/demo/.jekyll-metadata...
474
+ Cleaner: Removing /mnt/f/work/jekyll/my_plugins/jekyll_draft/demo/.jekyll-cache...
475
+ Cleaner: Nothing to do for .sass-cache.
476
+ DEBUGGER: Debugger can attach via TCP/IP (127.0.0.1:45409)
477
+ DEBUGGER: wait for debugger connection...
124
478
  ```
125
479
 
126
480
  Now attach to the debugger process.
127
- This git repo includes a [Visual Studio Code launcher](./.vscode/launch.json) for this purpose labeled `Listen for rdebug-ide`.
481
+ This git repo includes a [Visual Studio Code launcher](.vscode/launch.json) for this purpose labeled `Attach rdbg`.
482
+ It uses TCP/IP port 45409 to attach; you might need to modify that value.
128
483
 
129
484
  Now point your web browser to http://localhost:4444
130
485
 
131
486
 
487
+ ### Releasing A New Version
488
+
489
+ To release a new version,
490
+
491
+ 1. Update the version number in `version.rb`.
492
+ 2. Commit all changes to git; if you don't the next step might fail with an unexplainable error message.
493
+ 3. Run the following:
494
+
495
+ ```shell
496
+ $ bundle exec rake release
497
+ ```
498
+
499
+ The above creates a git tag for the version, commits the created tag,
500
+ and pushes the new `.gem` file to [RubyGems.org](https://rubygems.org).
501
+
502
+
132
503
  ## Contributing
133
504
 
134
505
  Bug reports and pull requests are welcome on GitHub at https://github.com/mslinn/jekyll_draft.
data/jekyll_draft.gemspec CHANGED
@@ -32,5 +32,5 @@ Gem::Specification.new do |spec| # rubocop:disable Metrics/BlockLength
32
32
  spec.version = DraftVersion::VERSION
33
33
 
34
34
  spec.add_dependency 'jekyll', '>= 3.5.0'
35
- spec.add_dependency 'jekyll_plugin_support'
35
+ spec.add_dependency 'jekyll_plugin_support', '>=1.0.0'
36
36
  end
data/lib/draft.rb CHANGED
@@ -1,29 +1,54 @@
1
+ require 'jekyll_plugin_logger'
2
+
1
3
  # Define these methods outside of the JekyllDraft class so they can be invoked externally and tested more easily
2
- module Draft
3
- # @return true by checking in this order:
4
- # - document is in _drafts directory, detectable by doc['draft']==true
5
- # - document front matter contains 'published: false'
6
- def draft?(doc)
7
- return true if doc.respond_to?(:draft) && doc.draft
8
- return true if doc.key?('draft') && doc['draft'] # ignore !doc['draft']
9
- return !doc['published'] if doc.key?('published')
10
-
11
- false
12
- rescue StandardError => e
13
- @logger.error { e }
14
- false
15
- end
4
+ module Jekyll
5
+ module Draft
6
+ @logger = PluginMetaLogger.instance.new_logger(self, PluginMetaLogger.instance.config)
16
7
 
17
- # @param doc [Jekyll::Drops::DocumentDrop]
18
- # @return HTML that indicates if a doc is a draft or not
19
- def draft_html
20
- return '' unless is_draft
8
+ # @return true by checking in this order:
9
+ # - document is in _drafts directory, detectable by doc['draft']==true
10
+ # - document front matter contains 'published: false'
11
+ def draft?(doc)
12
+ if doc.respond_to? :data
13
+ return !doc.data['published'] if doc.data.key? 'published'
14
+ return doc.data['draft'] if doc.data.key? 'draft'
15
+ end
16
+ if doc.respond_to? :[]
17
+ return !doc['published'] if doc.key? 'published'
18
+ return doc['draft'] if doc.key? 'draft'
19
+ end
21
20
 
22
- " <i class='jekyll_draft'>Draft</i>"
23
- rescue StandardError => e
24
- @logger.error { e }
25
- ''
26
- end
21
+ return doc.draft if doc.respond_to? :draft
22
+
23
+ false
24
+ rescue StandardError => e
25
+ @logger.error { e }
26
+ false
27
+ end
28
+
29
+ # @param doc [Jekyll::Drops::DocumentDrop]
30
+ # @return HTML that indicates if a doc is a draft or not
31
+ def draft_html(doc)
32
+ return '' unless draft? doc
27
33
 
28
- module_function :draft?, :draft_html
34
+ " <i class='jekyll_draft'>Draft</i>"
35
+ rescue StandardError => e
36
+ @logger.error { e.full_message }
37
+ ''
38
+ end
39
+
40
+ # @return path to root of the collection that doc is a member of
41
+ def root(doc, site)
42
+ return '/index.html' unless doc.respond_to?(:collection)
43
+
44
+ collection_name = doc.collection
45
+ docs = site.key?(collection_name) ? site[collection_name] : site.collections[collection_name].docs
46
+ index = docs.find { |d| d.url.end_with? 'index.html' }
47
+ return index.url if index
48
+
49
+ docs.min.url
50
+ end
51
+
52
+ module_function :draft?, :draft_html, :root
53
+ end
29
54
  end
data/lib/draft_html.rb CHANGED
@@ -1,13 +1,27 @@
1
1
  require 'jekyll_plugin_support'
2
2
 
3
- class Else < JekyllSupport::JekyllTag
3
+ class DraftHtml < JekyllSupport::JekyllTag
4
4
  VERSION = '0.1.0'.freeze
5
- PLUGIN_NAME = 'else'.freeze
5
+ DRAFT_HTML = 'draft_html'.freeze unless defined? Else::VERSION
6
6
 
7
7
  def render_impl
8
- " <i class='jekyll_draft'>Draft</i>" if Draft.draft?(@page)
8
+ is_draft = Jekyll::Draft.draft?(@page)
9
+
10
+ published_output = @helper.parameter_specified? 'published_output'
11
+ return published_output if !is_draft && published_output
12
+ return unless is_draft
13
+
14
+ draft_output = @helper.parameter_specified? 'draft_output'
15
+ return draft_output if draft_output
16
+
17
+ draft_class = @helper.parameter_specified? 'class'
18
+ dc = " #{draft_class}" if draft_class
19
+
20
+ draft_style = @helper.parameter_specified? 'style'
21
+ ds = " style='#{draft_style}'" if draft_style
22
+
23
+ " <i class='jekyll_draft#{dc}'#{ds}>Draft</i>"
9
24
  end
10
25
 
11
- JekyllPluginHelper.register(self, PLUGIN_NAME)
12
- PluginMetaLogger.instance.info { "Loaded #{PLUGIN_NAME.class} v#{DraftVersion::VERSION} plugin." }
26
+ ::JekyllSupport::JekyllPluginHelper.register(self, DRAFT_HTML)
13
27
  end
data/lib/else.rb CHANGED
@@ -1,13 +1,19 @@
1
1
  require 'jekyll_plugin_support'
2
2
 
3
- class Else < JekyllSupport::JekyllTag
3
+ class ElseBase < JekyllSupport::JekyllTag
4
4
  VERSION = '0.1.0'.freeze
5
- PLUGIN_NAME = 'else'.freeze
5
+ ELSE_DRAFT = 'else_if_draft'.freeze
6
+ ELSE_NOT_DRAFT = 'else_if_not_draft'.freeze
6
7
 
7
8
  def render_impl
8
9
  RECORD_SEPARATOR
9
10
  end
11
+ end
12
+
13
+ class ElseDraft < ElseBase
14
+ ::JekyllSupport::JekyllPluginHelper.register(self, ELSE_DRAFT)
15
+ end
10
16
 
11
- JekyllPluginHelper.register(self, PLUGIN_NAME)
12
- PluginMetaLogger.instance.info { "Loaded #{PLUGIN_NAME.class} v#{DraftVersion::VERSION} plugin." }
17
+ class ElseNotDraft < ElseBase
18
+ ::JekyllSupport::JekyllPluginHelper.register(self, ELSE_NOT_DRAFT)
13
19
  end
data/lib/filters.rb ADDED
@@ -0,0 +1,21 @@
1
+ require 'jekyll_plugin_logger'
2
+ require 'yaml'
3
+
4
+ # Jekyll filters that detect draft documents
5
+ module Jekyll
6
+ module DraftFilter
7
+ def is_draft(doc) # rubocop:disable Naming/PredicateName
8
+ Draft.draft? doc
9
+ end
10
+
11
+ def draft_html(doc)
12
+ Draft.draft_html doc
13
+ end
14
+
15
+ def root(doc, site)
16
+ Draft.root(doc, site)
17
+ end
18
+ end
19
+
20
+ Liquid::Template.register_filter(DraftFilter)
21
+ end
data/lib/if_draft.rb CHANGED
@@ -1,17 +1,27 @@
1
1
  require 'jekyll_plugin_support'
2
2
 
3
- # Jekyll inline plugin that detects draft documents
4
- class JekyllDraft < JekyllSupport::JekyllBlock
5
- PLUGIN_NAME = 'if_draft'.freeze
6
- VERSION = DraftVersion::VERSION
3
+ # Jekyll block tags that detect draft documents
4
+ class DraftBase < JekyllSupport::JekyllBlock
5
+ IF_DRAFT = 'if_draft'.freeze
6
+ UNLESS_DRAFT = 'unless_draft'.freeze
7
+ VERSION = DraftVersion::VERSION.freeze
7
8
 
8
9
  def render_impl(content)
9
10
  true_value, false_value, extra = content.split(RECORD_SEPARATOR)
10
11
  raise DraftError, "Warning: More than one else clause detected" if extra
11
12
 
12
- Draft.draft?(@page) ? true_value : false_value
13
+ if @tag_name == IF_DRAFT
14
+ return ::Jekyll::Draft.draft?(@page) ? true_value : false_value
15
+ end
16
+
17
+ ::Jekyll::Draft.draft?(@page) ? false_value : true_value
13
18
  end
19
+ end
20
+
21
+ class IfDraft < DraftBase
22
+ ::JekyllSupport::JekyllPluginHelper.register(self, IF_DRAFT)
23
+ end
14
24
 
15
- JekyllPluginHelper.register(self, PLUGIN_NAME)
16
- PluginMetaLogger.instance.info { "Loaded #{PLUGIN_NAME.class} v#{DraftVersion::VERSION} plugin." }
25
+ class UnlessDraft < DraftBase
26
+ ::JekyllSupport::JekyllPluginHelper.register(self, UNLESS_DRAFT)
17
27
  end
@@ -1,3 +1,3 @@
1
1
  module DraftVersion
2
- VERSION = '2.0.0'.freeze
2
+ VERSION = '2.0.2'.freeze
3
3
  end
data/lib/jekyll_draft.rb CHANGED
@@ -10,5 +10,7 @@ RECORD_SEPARATOR = "\u{241E}".freeze
10
10
  DraftError = JekyllSupport.define_error
11
11
 
12
12
  require_relative 'draft'
13
- require_relative 'else'
14
13
  require_relative 'if_draft'
14
+ require_relative 'else'
15
+ require_relative 'draft_html'
16
+ require_relative 'filters'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jekyll_draft
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 2.0.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-11-29 00:00:00.000000000 Z
11
+ date: 2024-07-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jekyll
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '0'
33
+ version: 1.0.0
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: '0'
40
+ version: 1.0.0
41
41
  description: 'This Jekyll filter detects draft documents.
42
42
 
43
43
  '
@@ -56,6 +56,7 @@ files:
56
56
  - lib/draft.rb
57
57
  - lib/draft_html.rb
58
58
  - lib/else.rb
59
+ - lib/filters.rb
59
60
  - lib/if_draft.rb
60
61
  - lib/jekyll_draft.rb
61
62
  - lib/jekyll_draft/version.rb
@@ -91,7 +92,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
91
92
  - !ruby/object:Gem::Version
92
93
  version: '0'
93
94
  requirements: []
94
- rubygems_version: 3.3.7
95
+ rubygems_version: 3.5.16
95
96
  signing_key:
96
97
  specification_version: 4
97
98
  summary: This Jekyll filter detects draft documents.