jekyll-page-boilerplate 4.1.1 → 4.4.0

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: 774edface63c05ab9dba0898408bbc7ba43936fd0d67a56fb201989bb605ae15
4
- data.tar.gz: b1076c48762f122437d06ee5424afe489ff58b3e0ac1e2b61d134da964492b40
3
+ metadata.gz: 65d5d4ea29334a96097f61f901251bd077dd288ef96db98316e79c289db435ea
4
+ data.tar.gz: 44365677835697d6b07f636a14e81a96595be48274d0e3a828c9b09499282d89
5
5
  SHA512:
6
- metadata.gz: b89128cd44e91ba760b7d7655b5c14d1d26919bca83c016364ff7dae30d91f1d63b208cb0a73a07c59abeed4c463d1dc7a2f852319992308bddc27f7073b20f2
7
- data.tar.gz: 1dcc5e8279d8e0ad5e5cb84c5efc5209d86cccf8391d3b669f51fbc34407a508f808271992912ee158852d91b2f1a4bcf3accb2fb12270ddc999f9e25cef5a42
6
+ metadata.gz: 71b662bc22160d2a1550eac1beedb5ebebca1484765d1e3b18062f863a7948f8b3b7d7773c8caf6a639a8937f9609e01cfed01dc1643d0e0bc1a9c3195b7c0a2
7
+ data.tar.gz: fd59775cb1917f121ba79861a9b5aad461b0928d482e1af2a59a7b8236732b2ce397ed3594491d4372516a1611213aa14153847ae45f88db3b1340051743f59f
@@ -2,10 +2,7 @@
2
2
  module JekyllPageBoilerplate
3
3
 
4
4
  class List
5
-
6
- SPACER = '\n'
7
- REMOVE_SUFFIX = /\.\w+(?=[\s\n\r$])/
8
-
5
+
9
6
  def self.run
10
7
  Dir.glob("_boilerplates/*").map do |f|
11
8
  File.basename(f, '.*')
@@ -5,7 +5,10 @@ A boilerplate is a markdown file you place under the `_boilerplates` folder to g
5
5
  ---
6
6
  _boilerplate: # boilerplate settings
7
7
  path: _posts # the path to create the new page under.
8
- timestamp: true # when true new post/pages will include the date in the filename.
8
+ timestamp: true # when true new post/pages will include the date in the filename.
9
+ slug: '{{ title }}-{{ num }}'
10
+ # slug is a template for the filename, it cant take the same tags as everything else.
11
+ num: 0
9
12
  title: {{ boilerplate.title }} # tags like this will be replaced
10
13
  layout: post # everthing else will be copied to the new post.
11
14
  author: John Doe
@@ -24,6 +27,6 @@ Available Tags `{{ boilerplate.xxx }}`:
24
27
  - `.title`, `.name`
25
28
  - `.path`, `.file`, `.suffix`
26
29
  - `.time`, `.date`, `.timestamp`
27
- - `.random_url`
30
+ - `.random`
28
31
  - Custom tags you provide in the command `bplate post custom=1`
29
32
  - And anything you put under the `_boilerplate:` header
@@ -0,0 +1,15 @@
1
+ A boilerplate is a markdown file you place under the `_boilerplates/` folder to generate new pages for jekyll.
2
+
3
+
4
+ It can automatically timestamp and title new pages.
5
+
6
+
7
+ It will also replacing any `{{ boilerplate.xxx }}` tags with content. Available tags include `.time, .title, .date, .random`.
8
+
9
+
10
+ You can also provide custom tags with `boilerplate post nav_order=1` > `{{ boilerplate.nav_order }}`.
11
+
12
+
13
+ In the boilerplate header you can specify options like the path to generate pages under and if filenames should be timestamped. `_boilerplate: > path: '_posts/'`
14
+
15
+
@@ -2,28 +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
- TAGS_REGEX = /(?<tag>\{{2}\s{0,}boilerplate\.(?<key>[^\{\}\.\s]+)\s{0,}\}{2})/
12
+ TAGS_REGEX = /\{{2}\s{0,}boilerplate\.([^\{\}\.\s]+)\s{0,}\}{2}/
13
13
 
14
- attr_reader :config
15
14
 
16
- def self.run boilerplate, options
17
- page = self.new(boilerplate, options)
15
+ attr_reader :tags
16
+
17
+ def self.run boilerplate, *options
18
+ page = self.new(boilerplate, *options)
18
19
  page.create
19
- return "Created %s/%s" % [page.config['path'], page.config['file']]
20
+ return "Created "+ File.join(page.tags['path'], page.tags['file'])
20
21
  end
21
22
 
22
- def initialize boilerplate, options
23
- options.compact!
24
- options.transform_keys!(&:to_s)
25
- plate_path = get_boilerplate_path(boilerplate).to_s
26
-
23
+ def initialize boilerplate, *options, **params
24
+ plate_path = get_boilerplate_path(boilerplate)
27
25
  abort_unless_file_exists( plate_path )
28
26
 
29
27
  parsed_file = {}
@@ -31,31 +29,45 @@ class JekyllPageBoilerplate::Page
31
29
  parsed_file = file.read.match(READ_FILE_REGEX).named_captures
32
30
  end
33
31
 
34
- @config = get_config(parsed_file['head']).merge(options)
35
- @config['suffix'] ||= plate_path[/\.\w+$/]
36
- @config['name'] ||= plate_path[/.*(?=\.)/] || plate_path
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, :path, safe: true)
40
+
37
41
  @head = get_head(parsed_file['head'])
38
- @body = get_body(parsed_file['body'])
42
+ @body = parsed_file['body']
39
43
  end
40
44
 
41
45
  def create
42
- @config['time'] ||= Time.now.to_s
43
- @config['date'] ||= Time.now.strftime(FILE_DATE_FORMATE)
44
-
45
- abort_unless_file_exists(@config['path'])
46
-
47
- @config['file'] ||= get_new_page_filename(@config['title'] || @config['name'])
46
+ FileUtils.mkdir_p(@tags.path)
48
47
 
49
48
  scan_template :@body
50
49
  scan_template :@head
51
50
 
52
- create_new_page @config['file']
51
+ create_new_page
53
52
  end
54
-
53
+
55
54
  private
56
55
 
57
- def create_new_page filename
58
- new_file_path = File.join( @config['path'], filename )
56
+ def defaults(plate_path, timestamp: false)
57
+ basename = File.basename(plate_path, '.*')
58
+ {
59
+ suffix: plate_path[/\.\w+$/],
60
+ name: plate_path[/.*(?=\.)/] || plate_path,
61
+ basename: basename,
62
+ title: basename,
63
+ slug: '{{ title }}',
64
+ path: '_posts/',
65
+ file: '{{ slug }}{{ suffix }}',
66
+ }
67
+ end
68
+
69
+ def create_new_page
70
+ new_file_path = File.join( @tags.path, @tags.file )
59
71
 
60
72
  abort_if_file_exists(new_file_path)
61
73
 
@@ -69,35 +81,12 @@ class JekyllPageBoilerplate::Page
69
81
  end
70
82
 
71
83
  def scan_template var
72
- instance_variable_get(var).scan(TAGS_REGEX).uniq.each do |tag, key|
73
- instance_variable_get(var).gsub! /\{{2}\s{0,}boilerplate\.#{key}\s{0,}\}{2}/, get_tag_value(key)
84
+ instance_variable_get(var).scan(TAGS_REGEX).flatten.uniq.each do |tag|
85
+ instance_variable_get(var).gsub! /\{{2}\s{0,}boilerplate\.#{tag}\s{0,}\}{2}/, @tags[tag].to_s
74
86
  end
75
87
  end
76
88
 
77
- def get_tag_value(key)
78
- return @config[key] if @config[key]
79
- key = key.split('=')
80
- return Tag.send(key[0].to_sym, *key[1]&.split(','))
81
- end
82
-
83
- class Tag
84
- class << self
85
- def method_missing *args
86
- ''
87
- end
88
-
89
- def random_url length = nil
90
- length && length = length.to_i
91
- SecureRandom.urlsafe_base64(length)
92
- end
93
- end
94
- end
95
-
96
- def get_body markdown
97
- return markdown
98
- end
99
-
100
- def get_config head
89
+ def get_header_config head
101
90
  return YAML.load(head.match(READ_CONFIG_REGEX).to_s)['_boilerplate']
102
91
  end
103
92
 
@@ -105,25 +94,10 @@ class JekyllPageBoilerplate::Page
105
94
  return head.gsub( READ_CONFIG_REGEX, '')
106
95
  end
107
96
 
108
-
109
97
  def get_boilerplate_path plate_name
110
- return Dir.glob(
111
- "#{File.join(BOILERPLATES_PATH, plate_name)}*"
112
- ).first
113
- end
114
-
115
-
116
- def get_new_page_filename title
117
- title = title.to_url
118
- title = "#{title}#{@config['suffix']}"
119
- if @config['timestamp']
120
- title = "#{@config['date']}-#{title}"
121
- end
122
- return title
98
+ return Dir.glob( "#{File.join(BOILERPLATES_PATH, plate_name)}*" ).first.to_s
123
99
  end
124
100
 
125
-
126
-
127
101
  def abort_if_file_exists(file_path)
128
102
  if File.exist?(file_path)
129
103
  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
@@ -1,3 +1,3 @@
1
1
  module JekyllPageBoilerplate
2
- VERSION = "4.1.1"
2
+ VERSION = "4.4.0"
3
3
  end
@@ -1,5 +1,6 @@
1
1
  require "jekyll_page_boilerplate/version"
2
2
  require "jekyll_page_boilerplate/msg"
3
+ require "jekyll_page_boilerplate/tags"
3
4
  require "jekyll_page_boilerplate/page"
4
5
  require "jekyll_page_boilerplate/init"
5
6
  require "jekyll_page_boilerplate/list"
@@ -10,15 +10,17 @@ class JekyllPageBoilerplate::Application < Bales::Application
10
10
  description: "`path/<title>.md`"
11
11
  option :path, type: String, long_form: '--path', short_form: '-p',
12
12
  description: "`<path>/title.md`"
13
+ option :slug, type: String, long_form: '--slug', short_form: '-u',
14
+ description: "`path/<slug-template>.md` `{{title}}-{{date}}`"
13
15
  option :timestamp, type: TrueClass, long_form: '--timestamp', short_form: '-s',
14
16
  description: "`path/<time.now>-title.md`"
15
17
  option :suffix, type: String, long_form: '--suffix', short_form: '-x',
16
18
  description: "`path/title.<md, markdown, txt>`"
17
19
 
18
- action do |plate, *custom, title: nil, path: nil, timestamp: nil, suffix: nil|
20
+ action do |plate, *custom, title: nil, slug: nil, path: nil, timestamp: nil, suffix: nil|
19
21
  custom = Hash[custom.map {|v| v.split('=')}]
20
22
  JekyllPageBoilerplate.page plate, custom.merge({
21
- title: title, path: path,
23
+ title: title, path: path, slug: slug,
22
24
  suffix: suffix, timestamp: timestamp
23
25
  })
24
26
  end
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.1.1
4
+ version: 4.4.0
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 00:00:00.000000000 Z
11
+ date: 2022-05-17 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/<boilerplate>.md` folder to generate new pages for jekyll.
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, .random_url`.
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 }}`.
@@ -76,7 +76,9 @@ files:
76
76
  - lib/jekyll_page_boilerplate/list.rb
77
77
  - lib/jekyll_page_boilerplate/msg.rb
78
78
  - lib/jekyll_page_boilerplate/msg/description.md
79
+ - lib/jekyll_page_boilerplate/msg/gem_description.md
79
80
  - lib/jekyll_page_boilerplate/page.rb
81
+ - lib/jekyll_page_boilerplate/tags.rb
80
82
  - lib/jekyll_page_boilerplate/version.rb
81
83
  - lib/jekyll_page_boilerplate_cli.rb
82
84
  homepage: https://github.com/CodeKarmaDev/jekyll-page-boilerplate