jekyll-page-boilerplate 4.2.1 → 4.4.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 +4 -4
- data/lib/jekyll_page_boilerplate/list.rb +1 -4
- data/lib/jekyll_page_boilerplate/msg/description.md +4 -4
- data/lib/jekyll_page_boilerplate/msg/gem_description.md +2 -2
- data/lib/jekyll_page_boilerplate/page.rb +39 -74
- data/lib/jekyll_page_boilerplate/tags.rb +70 -0
- data/lib/jekyll_page_boilerplate/version.rb +1 -1
- data/lib/jekyll_page_boilerplate.rb +1 -0
- data/lib/jekyll_page_boilerplate_cli.rb +1 -1
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bb95ce2295263ff136c816e08bbeccc5ace0b1aaa55e585f9450387312408729
|
4
|
+
data.tar.gz: 82419e9b79e8117d1df87abaa13f2e37c6e08b90ff48ffe27ce8c4b3f00d1577
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7059ff250593c82acc0e0bb0f258f80d8d131efc6fcd842acc2717b711d2876271eb99badb2b13b0593b327935a787d9d13dc7ea3a72b9c2feebcc39eb7a050c
|
7
|
+
data.tar.gz: b736fbaa7aea45219699902443f61ba95ebebf2cad9cb2a2957328e530f4132d9f1665076fab9664c78e76a4c0eb256b669b24f866337b11163d0c0505083448
|
@@ -6,9 +6,9 @@ A boilerplate is a markdown file you place under the `_boilerplates` folder to g
|
|
6
6
|
_boilerplate: # boilerplate settings
|
7
7
|
path: _posts # the path to create the new page under.
|
8
8
|
timestamp: true # when true new post/pages will include the date in the filename.
|
9
|
-
|
10
|
-
slug
|
11
|
-
|
9
|
+
slug: '{{ title }}-{{ num }}'
|
10
|
+
# slug is a template for the filename, it cant take the same tags as everything else.
|
11
|
+
num: 0
|
12
12
|
title: {{ boilerplate.title }} # tags like this will be replaced
|
13
13
|
layout: post # everthing else will be copied to the new post.
|
14
14
|
author: John Doe
|
@@ -27,6 +27,6 @@ Available Tags `{{ boilerplate.xxx }}`:
|
|
27
27
|
- `.title`, `.name`
|
28
28
|
- `.path`, `.file`, `.suffix`
|
29
29
|
- `.time`, `.date`, `.timestamp`
|
30
|
-
- `.
|
30
|
+
- `.random`
|
31
31
|
- Custom tags you provide in the command `bplate post custom=1`
|
32
32
|
- And anything you put under the `_boilerplate:` header
|
@@ -1,10 +1,10 @@
|
|
1
|
-
A boilerplate is a markdown file you place under the `_boilerplates
|
1
|
+
A boilerplate is a markdown file you place under the `_boilerplates/` folder to generate new pages for jekyll.
|
2
2
|
|
3
3
|
|
4
4
|
It can automatically timestamp and title new pages.
|
5
5
|
|
6
6
|
|
7
|
-
It will also replacing any `{{ boilerplate.xxx }}` tags with content. Available tags include `.time, .title, .date, .
|
7
|
+
It will also replacing any `{{ boilerplate.xxx }}` tags with content. Available tags include `.time, .title, .date, .random`.
|
8
8
|
|
9
9
|
|
10
10
|
You can also provide custom tags with `boilerplate post nav_order=1` > `{{ boilerplate.nav_order }}`.
|
@@ -2,31 +2,26 @@
|
|
2
2
|
require 'yaml'
|
3
3
|
require "stringex"
|
4
4
|
require 'securerandom'
|
5
|
+
require 'fileutils'
|
5
6
|
|
6
7
|
class JekyllPageBoilerplate::Page
|
7
8
|
|
8
9
|
BOILERPLATES_PATH = '_boilerplates'
|
9
|
-
FILE_DATE_FORMATE = '%Y-%m-%d'
|
10
10
|
READ_CONFIG_REGEX = /[\r\n\s]{0,}^_boilerplate:(\s*^[\t ]{1,2}.+$)+[\r\s\n]{0,}(?![^\r\s\n])/
|
11
11
|
READ_FILE_REGEX = /^-{3}\s*^(?<head>[\s\S]*)^-{3}\s^(?<body>[\s\S]*)/
|
12
12
|
TAGS_REGEX = /\{{2}\s{0,}boilerplate\.([^\{\}\.\s]+)\s{0,}\}{2}/
|
13
|
-
TAG_SLUG = /\{{2}\s{0,}([^\{\}\.\s]+)\s{0,}\}{2}/
|
14
13
|
|
15
14
|
|
15
|
+
attr_reader :tags
|
16
16
|
|
17
|
-
|
18
|
-
|
19
|
-
def self.run boilerplate, options
|
20
|
-
page = self.new(boilerplate, options)
|
17
|
+
def self.run boilerplate, *options
|
18
|
+
page = self.new(boilerplate, *options)
|
21
19
|
page.create
|
22
|
-
return "Created
|
20
|
+
return "Created "+ File.join(page.tags['path'], page.tags['file'])
|
23
21
|
end
|
24
22
|
|
25
|
-
def initialize boilerplate, options
|
26
|
-
|
27
|
-
options.transform_keys!(&:to_s)
|
28
|
-
plate_path = get_boilerplate_path(boilerplate).to_s
|
29
|
-
|
23
|
+
def initialize boilerplate, *options, **params
|
24
|
+
plate_path = get_boilerplate_path(boilerplate)
|
30
25
|
abort_unless_file_exists( plate_path )
|
31
26
|
|
32
27
|
parsed_file = {}
|
@@ -34,39 +29,46 @@ class JekyllPageBoilerplate::Page
|
|
34
29
|
parsed_file = file.read.match(READ_FILE_REGEX).named_captures
|
35
30
|
end
|
36
31
|
|
37
|
-
@
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
32
|
+
@tags = JekyllPageBoilerplate::Tags.new(
|
33
|
+
defaults(plate_path),
|
34
|
+
get_header_config(parsed_file['head']),
|
35
|
+
*options,
|
36
|
+
params
|
37
|
+
)
|
38
|
+
@tags[:file] = '{{ date }}-{{ slug }}{{ suffix }}' if @tags.timestamp
|
39
|
+
@tags.fill(:slug, :file, safe: true)
|
40
|
+
@tags.fill(:path, safe: false)
|
41
|
+
|
47
42
|
@head = get_head(parsed_file['head'])
|
48
|
-
@body =
|
43
|
+
@body = parsed_file['body']
|
49
44
|
end
|
50
45
|
|
51
46
|
def create
|
52
|
-
@
|
53
|
-
@config['date'] ||= Time.now.strftime(FILE_DATE_FORMATE)
|
54
|
-
|
55
|
-
abort_unless_file_exists(@config['path'])
|
56
|
-
|
57
|
-
scan_slug
|
58
|
-
@config['file'] ||= @config['slug']
|
47
|
+
FileUtils.mkdir_p(@tags.path)
|
59
48
|
|
60
49
|
scan_template :@body
|
61
50
|
scan_template :@head
|
62
51
|
|
63
|
-
create_new_page
|
52
|
+
create_new_page
|
64
53
|
end
|
65
|
-
|
54
|
+
|
66
55
|
private
|
67
56
|
|
68
|
-
def
|
69
|
-
|
57
|
+
def defaults(plate_path, timestamp: false)
|
58
|
+
basename = File.basename(plate_path, '.*')
|
59
|
+
{
|
60
|
+
suffix: plate_path[/\.\w+$/],
|
61
|
+
name: plate_path[/.*(?=\.)/] || plate_path,
|
62
|
+
basename: basename,
|
63
|
+
title: basename,
|
64
|
+
slug: '{{ title }}',
|
65
|
+
path: '_posts/',
|
66
|
+
file: '{{ slug }}{{ suffix }}',
|
67
|
+
}
|
68
|
+
end
|
69
|
+
|
70
|
+
def create_new_page
|
71
|
+
new_file_path = File.join( @tags.path, @tags.file )
|
70
72
|
|
71
73
|
abort_if_file_exists(new_file_path)
|
72
74
|
|
@@ -81,43 +83,11 @@ class JekyllPageBoilerplate::Page
|
|
81
83
|
|
82
84
|
def scan_template var
|
83
85
|
instance_variable_get(var).scan(TAGS_REGEX).flatten.uniq.each do |tag|
|
84
|
-
instance_variable_get(var).gsub! /\{{2}\s{0,}boilerplate\.#{tag}\s{0,}\}{2}/,
|
86
|
+
instance_variable_get(var).gsub! /\{{2}\s{0,}boilerplate\.#{tag}\s{0,}\}{2}/, @tags[tag].to_s
|
85
87
|
end
|
86
88
|
end
|
87
89
|
|
88
|
-
def
|
89
|
-
@config['slug'].scan(TAG_SLUG).flatten.uniq do |tag|
|
90
|
-
@config['slug'].gsub! /\{{2}\s{0,}#{tag}\s{0,}\}{2}/, get_tag_value(tag)
|
91
|
-
end
|
92
|
-
@config['slug'].gsub!(/[^0-9A-Za-z\.\-_]/, '-')
|
93
|
-
@config['slug'].downcase!
|
94
|
-
end
|
95
|
-
|
96
|
-
def get_tag_value(key)
|
97
|
-
return @config[key] if @config[key]
|
98
|
-
return @config['name'] if key == 'title'
|
99
|
-
key = key.split('=')
|
100
|
-
return Tag.send(key[0].to_sym, *key[1]&.split(','))
|
101
|
-
end
|
102
|
-
|
103
|
-
class Tag
|
104
|
-
class << self
|
105
|
-
def method_missing *args
|
106
|
-
''
|
107
|
-
end
|
108
|
-
|
109
|
-
def random_url length = nil
|
110
|
-
length && length = length.to_i
|
111
|
-
SecureRandom.urlsafe_base64(length)
|
112
|
-
end
|
113
|
-
end
|
114
|
-
end
|
115
|
-
|
116
|
-
def get_body markdown
|
117
|
-
return markdown
|
118
|
-
end
|
119
|
-
|
120
|
-
def get_config head
|
90
|
+
def get_header_config head
|
121
91
|
return YAML.load(head.match(READ_CONFIG_REGEX).to_s)['_boilerplate']
|
122
92
|
end
|
123
93
|
|
@@ -125,15 +95,10 @@ class JekyllPageBoilerplate::Page
|
|
125
95
|
return head.gsub( READ_CONFIG_REGEX, '')
|
126
96
|
end
|
127
97
|
|
128
|
-
|
129
98
|
def get_boilerplate_path plate_name
|
130
|
-
return Dir.glob(
|
131
|
-
"#{File.join(BOILERPLATES_PATH, plate_name)}*"
|
132
|
-
).first
|
99
|
+
return Dir.glob( "#{File.join(BOILERPLATES_PATH, plate_name)}*" ).first.to_s
|
133
100
|
end
|
134
101
|
|
135
|
-
|
136
|
-
|
137
102
|
def abort_if_file_exists(file_path)
|
138
103
|
if File.exist?(file_path)
|
139
104
|
raise "#{file_path} already exists!"
|
@@ -0,0 +1,70 @@
|
|
1
|
+
|
2
|
+
class JekyllPageBoilerplate::Tags
|
3
|
+
|
4
|
+
FILE_DATE_FORMATE = '%Y-%m-%d'
|
5
|
+
FILL_SCAN = /\{{2}\s{0,}([^\{\}\.\s]+)\s{0,}\}{2}/
|
6
|
+
|
7
|
+
def self.[] *args
|
8
|
+
self.new *args
|
9
|
+
end
|
10
|
+
|
11
|
+
def initialize *args, **params
|
12
|
+
@tags = {}
|
13
|
+
add(*args, params)
|
14
|
+
end
|
15
|
+
|
16
|
+
def []= key, val
|
17
|
+
@tags[key.to_s] = val
|
18
|
+
end
|
19
|
+
|
20
|
+
def add *args, **params
|
21
|
+
args.map! {|h| h.transform_keys(&:to_s).compact }
|
22
|
+
params.transform_keys!(&:to_s).compact!
|
23
|
+
@tags.merge!(*args, params)
|
24
|
+
self
|
25
|
+
end
|
26
|
+
|
27
|
+
def [] key
|
28
|
+
key = key.to_s
|
29
|
+
@tags[key] ||= fetch(*key.split(/\s*=\s*|\s*,\s*/))
|
30
|
+
end
|
31
|
+
|
32
|
+
def fill *keys, safe: false
|
33
|
+
keys.map!(&:to_s)
|
34
|
+
keys.each do |k|
|
35
|
+
@tags[k].scan(FILL_SCAN).flatten.uniq.each do |tag|
|
36
|
+
@tags[k].gsub! /\{{2}\s{0,}#{tag.to_s}\s{0,}\}{2}/, self[tag].to_s
|
37
|
+
end
|
38
|
+
end
|
39
|
+
if safe
|
40
|
+
keys.each do |k|
|
41
|
+
@tags[k] = safe(k)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
self
|
45
|
+
end
|
46
|
+
|
47
|
+
def safe key
|
48
|
+
self[key].to_s.downcase.gsub(/[^0-9a-z\.\-\/]+/, '-')
|
49
|
+
end
|
50
|
+
|
51
|
+
def fetch key, *params
|
52
|
+
case key
|
53
|
+
when 'safe'
|
54
|
+
safe(params.join(','))
|
55
|
+
when 'time'
|
56
|
+
Time.now.to_s
|
57
|
+
when 'date'
|
58
|
+
Time.now.strftime(FILE_DATE_FORMATE)
|
59
|
+
when 'random'
|
60
|
+
SecureRandom.hex(*params.map(&:to_i))
|
61
|
+
else
|
62
|
+
''
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
|
67
|
+
def method_missing key
|
68
|
+
@tags[key.to_s]
|
69
|
+
end
|
70
|
+
end
|
@@ -11,7 +11,7 @@ class JekyllPageBoilerplate::Application < Bales::Application
|
|
11
11
|
option :path, type: String, long_form: '--path', short_form: '-p',
|
12
12
|
description: "`<path>/title.md`"
|
13
13
|
option :slug, type: String, long_form: '--slug', short_form: '-u',
|
14
|
-
description: "`path/<slug-template
|
14
|
+
description: "`path/<slug-template>.md` `{{title}}-{{date}}`"
|
15
15
|
option :timestamp, type: TrueClass, long_form: '--timestamp', short_form: '-s',
|
16
16
|
description: "`path/<time.now>-title.md`"
|
17
17
|
option :suffix, type: String, long_form: '--suffix', short_form: '-x',
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jekyll-page-boilerplate
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.
|
4
|
+
version: 4.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sean Ferney
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-05-
|
11
|
+
date: 2022-05-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bales
|
@@ -45,13 +45,13 @@ dependencies:
|
|
45
45
|
- !ruby/object:Gem::Version
|
46
46
|
version: 2.8.5
|
47
47
|
description: |+
|
48
|
-
A boilerplate is a markdown file you place under the `_boilerplates
|
48
|
+
A boilerplate is a markdown file you place under the `_boilerplates/` folder to generate new pages for jekyll.
|
49
49
|
|
50
50
|
|
51
51
|
It can automatically timestamp and title new pages.
|
52
52
|
|
53
53
|
|
54
|
-
It will also replacing any `{{ boilerplate.xxx }}` tags with content. Available tags include `.time, .title, .date, .
|
54
|
+
It will also replacing any `{{ boilerplate.xxx }}` tags with content. Available tags include `.time, .title, .date, .random`.
|
55
55
|
|
56
56
|
|
57
57
|
You can also provide custom tags with `boilerplate post nav_order=1` > `{{ boilerplate.nav_order }}`.
|
@@ -78,6 +78,7 @@ files:
|
|
78
78
|
- lib/jekyll_page_boilerplate/msg/description.md
|
79
79
|
- lib/jekyll_page_boilerplate/msg/gem_description.md
|
80
80
|
- lib/jekyll_page_boilerplate/page.rb
|
81
|
+
- lib/jekyll_page_boilerplate/tags.rb
|
81
82
|
- lib/jekyll_page_boilerplate/version.rb
|
82
83
|
- lib/jekyll_page_boilerplate_cli.rb
|
83
84
|
homepage: https://github.com/CodeKarmaDev/jekyll-page-boilerplate
|