bridgetown-core 0.10.2 → 0.11.0

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: 1e97f803a7a5d0bbe98ccb9a14cc2dc4054b4fec9f0803f5dd030e5d5812ce72
4
- data.tar.gz: 7cec8b571520772cd25e87a75555d3f988e9d81b33181545ce93fbd294a0d99c
3
+ metadata.gz: 86af5c191c5ec6097a971ccbb66489d6d71effb8a48ffe19736a7ee8319fa672
4
+ data.tar.gz: 2d68656ef593e5d2ed3aa1e2a3b0f3de7e1e45e1ac29b439089e0d4419c61657
5
5
  SHA512:
6
- metadata.gz: 9e75fb63ae6d579080f70d8664a8a1accb035e6da4953982079873d152f0baf0dcfc7de193c1eff1cc5ac135388e39712557e6b38338d950e2f8e0d5067c204e
7
- data.tar.gz: 743fb5560819f0849c4d8c137568f7500389e46b1918e9c86f4d18a08c34a13f793c7b39402991f616f1a6ff0271df3e7b41596d47a3e37a5d766c254b1fb59c
6
+ metadata.gz: caf6380687cbab8f43986faf41b3c2ca42013e4d4157ffe714b6d89f4e81f8f1b51089636c6b6360b5033699a1f9f2cda5a46650f5686058d6c92efba81fff23
7
+ data.tar.gz: a8d429d08d30a12efe6138e8444954a7243606c1b29fe39c44d5c3882c7fe3fddac29711b1e39b7ecededd30880ecff31b2f3d1d636d5c9ead3f4b41d3999229
@@ -25,6 +25,7 @@ module Bridgetown
25
25
  "encoding" => "utf-8",
26
26
  "markdown_ext" => "markdown,mkdown,mkdn,mkd,md",
27
27
  "strict_front_matter" => false,
28
+ "slugify_categories" => true,
28
29
 
29
30
  # Filtering Content
30
31
  "limit_posts" => 0,
@@ -30,7 +30,11 @@ module Bridgetown
30
30
  def categories
31
31
  category_set = Set.new
32
32
  Array(@obj.data["categories"]).each do |category|
33
- category_set << category.to_s.downcase
33
+ category_set << if @obj.site.config["slugify_categories"]
34
+ Utils.slugify(category.to_s)
35
+ else
36
+ category.to_s.downcase
37
+ end
34
38
  end
35
39
  category_set.to_a.join("/")
36
40
  end
@@ -0,0 +1,126 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bridgetown
4
+ class PrototypeGenerator < Generator
5
+ priority :low
6
+
7
+ def generate(site)
8
+ @site = site
9
+ @configured_collection = "posts"
10
+
11
+ prototype_pages = site.pages.select do |page|
12
+ page.data["prototype"].is_a?(Hash)
13
+ end
14
+
15
+ if prototype_pages.length.positive?
16
+ site.pages.reject! do |page|
17
+ prototype_pages.include? page
18
+ end
19
+
20
+ prototype_pages.each do |prototype_page|
21
+ search_term = validate_search_term(prototype_page)
22
+ next if search_term.nil?
23
+
24
+ terms_matching_pages(search_term).each do |term|
25
+ generate_new_page_from_prototype(prototype_page, search_term, term).data
26
+ end
27
+ end
28
+ end
29
+ end
30
+
31
+ def validate_search_term(prototype_page)
32
+ search_term = prototype_page.data["prototype"]["term"]
33
+ return nil unless search_term.is_a?(String)
34
+
35
+ if prototype_page.data["prototype"]["collection"]
36
+ @configured_collection = prototype_page.data["prototype"]["collection"]
37
+ end
38
+
39
+ # Categories and Tags are unique in that singular and plural front matter
40
+ # can be present for each
41
+ search_term.sub(%r!^category$!, "categories").sub(%r!^tag$!, "tags")
42
+ end
43
+
44
+ def generate_new_page_from_prototype(prototype_page, search_term, term)
45
+ new_page = PrototypePage.new(prototype_page)
46
+ # Use the original specified term so we get "tag" back, not "tags":
47
+ new_page.data[prototype_page.data["prototype"]["term"]] = term
48
+
49
+ process_title_data_placeholder(new_page, prototype_page, search_term, term)
50
+ process_title_simple_placeholders(new_page, prototype_page, term)
51
+
52
+ new_page.data["pagination"] = {} unless new_page.data["pagination"].is_a?(Hash)
53
+ new_page.data["pagination"]["enabled"] = true
54
+ new_page.data["pagination"]["collection"] = @configured_collection
55
+ new_page.data["pagination"]["where_query"] = [search_term, term]
56
+ new_page.slugify_term(term)
57
+ @site.pages << new_page
58
+ new_page
59
+ end
60
+
61
+ def terms_matching_pages(search_term)
62
+ selected_docs = @site.documents.select do |document|
63
+ document.respond_to?(:collection) && document.collection.label == @configured_collection
64
+ end
65
+
66
+ Bridgetown::Paginate::Generator::PaginationIndexer.index_documents_by(
67
+ selected_docs, search_term
68
+ ).keys
69
+ end
70
+
71
+ def process_title_data_placeholder(new_page, prototype_page, search_term, term)
72
+ if prototype_page["prototype"]["data"]
73
+ if new_page.data["title"]&.include?(":prototype-data-label")
74
+ related_data = @site.data[prototype_page["prototype"]["data"]].dig(term)
75
+ if related_data
76
+ new_page.data["#{search_term}_data"] = related_data
77
+ data_label = related_data[prototype_page["prototype"]["data_label"]]
78
+ new_page.data["title"] = new_page.data["title"].gsub(
79
+ ":prototype-data-label", data_label
80
+ )
81
+ end
82
+ end
83
+ end
84
+ end
85
+
86
+ def process_title_simple_placeholders(new_page, _prototype_page, term)
87
+ if new_page.data["title"]&.include?(":prototype-term-titleize")
88
+ new_page.data["title"] = new_page.data["title"].gsub(
89
+ ":prototype-term-titleize", Bridgetown::Utils.titleize_slug(term)
90
+ )
91
+ end
92
+
93
+ if new_page.data["title"]&.include?(":prototype-term")
94
+ new_page.data["title"] = new_page.data["title"].gsub(
95
+ ":prototype-term", term
96
+ )
97
+ end
98
+ end
99
+ end
100
+
101
+ class PrototypePage < Page
102
+ def initialize(prototype_page)
103
+ @site = prototype_page.site
104
+ @url = ""
105
+ @name = "index.html"
106
+ @path = prototype_page.path
107
+
108
+ process(@name)
109
+
110
+ self.data = Bridgetown::Utils.deep_merge_hashes prototype_page.data, {}
111
+ self.content = prototype_page.content
112
+
113
+ # Perform some validation that is also performed in Bridgetown::Page
114
+ validate_data! prototype_page.path
115
+ validate_permalink! prototype_page.path
116
+
117
+ @dir = Pathname.new(prototype_page.relative_path).dirname.to_s
118
+ @path = site.in_source_dir(@dir, @name)
119
+ end
120
+
121
+ def slugify_term(term)
122
+ term_slug = Bridgetown::Utils.slugify(term)
123
+ @url = "/#{@dir}/#{term_slug}/"
124
+ end
125
+ end
126
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Bridgetown
4
- VERSION = "0.10.2"
4
+ VERSION = "0.11.0"
5
5
  end
@@ -10,6 +10,7 @@
10
10
  "devDependencies": {
11
11
  "@babel/core": "^7.9.0",
12
12
  "@babel/plugin-proposal-class-properties": "^7.8.3",
13
+ "@babel/plugin-transform-runtime": "^7.9.0",
13
14
  "@babel/preset-env": "^7.9.0",
14
15
  "babel-loader": "^8.1.0",
15
16
  "css-loader": "^3.4.2",
@@ -17,7 +17,7 @@ module.exports = {
17
17
  filename: "all.[contenthash].js"
18
18
  },
19
19
  resolve: {
20
- extensions: [".js"]
20
+ extensions: [".js", ".jsx"]
21
21
  },
22
22
  plugins: [
23
23
  new MiniCssExtractPlugin({
@@ -30,7 +30,7 @@ module.exports = {
30
30
  module: {
31
31
  rules: [
32
32
  {
33
- test: /\.js/,
33
+ test: /\.(js|jsx)/,
34
34
  use: {
35
35
  loader: "babel-loader",
36
36
  options: {
@@ -38,7 +38,13 @@ module.exports = {
38
38
  "@babel/preset-env"
39
39
  ],
40
40
  plugins: [
41
- "@babel/plugin-proposal-class-properties"
41
+ "@babel/plugin-proposal-class-properties",
42
+ [
43
+ "@babel/plugin-transform-runtime",
44
+ {
45
+ "helpers": false
46
+ }
47
+ ]
42
48
  ]
43
49
  }
44
50
  }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bridgetown-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.10.2
4
+ version: 0.11.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bridgetown Team
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-04-20 00:00:00.000000000 Z
11
+ date: 2020-04-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: addressable
@@ -231,6 +231,7 @@ files:
231
231
  - lib/bridgetown-core/filters/url_filters.rb
232
232
  - lib/bridgetown-core/frontmatter_defaults.rb
233
233
  - lib/bridgetown-core/generator.rb
234
+ - lib/bridgetown-core/generators/prototype_generator.rb
234
235
  - lib/bridgetown-core/hooks.rb
235
236
  - lib/bridgetown-core/layout.rb
236
237
  - lib/bridgetown-core/liquid_extensions.rb