bridgetown-core 0.21.4 → 1.0.0.alpha4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (127) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +35 -0
  3. data/Rakefile +5 -5
  4. data/bin/bridgetown +2 -0
  5. data/bridgetown-core.gemspec +3 -0
  6. data/lib/bridgetown-core/cache.rb +3 -5
  7. data/lib/bridgetown-core/cleaner.rb +2 -10
  8. data/lib/bridgetown-core/collection.rb +62 -86
  9. data/lib/bridgetown-core/commands/base.rb +62 -2
  10. data/lib/bridgetown-core/commands/build.rb +33 -12
  11. data/lib/bridgetown-core/commands/concerns/actions.rb +2 -2
  12. data/lib/bridgetown-core/commands/concerns/build_options.rb +3 -10
  13. data/lib/bridgetown-core/commands/concerns/configuration_overridable.rb +3 -1
  14. data/lib/bridgetown-core/commands/console.rb +3 -3
  15. data/lib/bridgetown-core/commands/doctor.rb +13 -11
  16. data/lib/bridgetown-core/commands/new.rb +14 -6
  17. data/lib/bridgetown-core/commands/plugins.rb +8 -11
  18. data/lib/bridgetown-core/commands/serve/servlet.rb +4 -4
  19. data/lib/bridgetown-core/commands/serve.rb +37 -37
  20. data/lib/bridgetown-core/commands/start.rb +106 -0
  21. data/lib/bridgetown-core/commands/webpack/webpack.defaults.js.erb +2 -2
  22. data/lib/bridgetown-core/commands/webpack.rb +1 -1
  23. data/lib/bridgetown-core/component.rb +2 -6
  24. data/lib/bridgetown-core/concerns/liquid_renderable.rb +2 -2
  25. data/lib/bridgetown-core/concerns/site/configurable.rb +1 -13
  26. data/lib/bridgetown-core/concerns/site/content.rb +7 -118
  27. data/lib/bridgetown-core/concerns/site/extensible.rb +3 -4
  28. data/lib/bridgetown-core/concerns/site/localizable.rb +3 -1
  29. data/lib/bridgetown-core/concerns/site/processable.rb +8 -20
  30. data/lib/bridgetown-core/concerns/site/renderable.rb +19 -30
  31. data/lib/bridgetown-core/concerns/site/ssr.rb +53 -0
  32. data/lib/bridgetown-core/concerns/site/writable.rb +6 -9
  33. data/lib/bridgetown-core/configuration.rb +19 -48
  34. data/lib/bridgetown-core/configurations/minitesting.rb +1 -1
  35. data/lib/bridgetown-core/configurations/turbo.rb +1 -1
  36. data/lib/bridgetown-core/converter.rb +1 -0
  37. data/lib/bridgetown-core/converters/erb_templates.rb +8 -5
  38. data/lib/bridgetown-core/converters/liquid_templates.rb +5 -2
  39. data/lib/bridgetown-core/converters/markdown/kramdown_parser.rb +1 -1
  40. data/lib/bridgetown-core/converters/smartypants.rb +1 -0
  41. data/lib/bridgetown-core/current.rb +4 -0
  42. data/lib/bridgetown-core/drops/collection_drop.rb +1 -1
  43. data/lib/bridgetown-core/drops/drop.rb +4 -4
  44. data/lib/bridgetown-core/drops/generated_page_drop.rb +23 -0
  45. data/lib/bridgetown-core/drops/resource_drop.rb +3 -3
  46. data/lib/bridgetown-core/drops/site_drop.rb +3 -47
  47. data/lib/bridgetown-core/entry_filter.rb +1 -0
  48. data/lib/bridgetown-core/filters/url_filters.rb +2 -0
  49. data/lib/bridgetown-core/filters.rb +11 -12
  50. data/lib/bridgetown-core/frontmatter_defaults.rb +44 -82
  51. data/lib/bridgetown-core/{page.rb → generated_page.rb} +34 -60
  52. data/lib/bridgetown-core/generators/prototype_generator.rb +46 -58
  53. data/lib/bridgetown-core/helpers.rb +8 -3
  54. data/lib/bridgetown-core/hooks.rb +2 -2
  55. data/lib/bridgetown-core/layout.rb +15 -4
  56. data/lib/bridgetown-core/liquid_renderer.rb +1 -3
  57. data/lib/bridgetown-core/log_adapter.rb +1 -1
  58. data/lib/bridgetown-core/log_writer.rb +7 -1
  59. data/lib/bridgetown-core/model/base.rb +12 -4
  60. data/lib/bridgetown-core/model/builder_origin.rb +23 -11
  61. data/lib/bridgetown-core/model/origin.rb +3 -0
  62. data/lib/bridgetown-core/model/plugin_origin.rb +34 -0
  63. data/lib/bridgetown-core/model/repo_origin.rb +1 -1
  64. data/lib/bridgetown-core/plugin_manager.rb +10 -10
  65. data/lib/bridgetown-core/publisher.rb +1 -1
  66. data/lib/bridgetown-core/rack/boot.rb +55 -0
  67. data/lib/bridgetown-core/rack/logger.rb +22 -0
  68. data/lib/bridgetown-core/rack/roda.rb +66 -0
  69. data/lib/bridgetown-core/rack/routes.rb +88 -0
  70. data/lib/bridgetown-core/rack/static_indexes.rb +30 -0
  71. data/lib/bridgetown-core/reader.rb +16 -48
  72. data/lib/bridgetown-core/readers/layout_reader.rb +2 -2
  73. data/lib/bridgetown-core/readers/plugin_content_reader.rb +8 -7
  74. data/lib/bridgetown-core/renderer.rb +2 -12
  75. data/lib/bridgetown-core/resource/base.rb +34 -11
  76. data/lib/bridgetown-core/resource/permalink_processor.rb +23 -12
  77. data/lib/bridgetown-core/resource/relations.rb +2 -3
  78. data/lib/bridgetown-core/resource/taxonomy_term.rb +1 -5
  79. data/lib/bridgetown-core/resource/transformer.rb +8 -6
  80. data/lib/bridgetown-core/ruby_template_view.rb +6 -8
  81. data/lib/bridgetown-core/site.rb +4 -8
  82. data/lib/bridgetown-core/static_file.rb +14 -21
  83. data/lib/bridgetown-core/tags/find.rb +6 -6
  84. data/lib/bridgetown-core/tags/highlight.rb +5 -5
  85. data/lib/bridgetown-core/tags/include.rb +22 -32
  86. data/lib/bridgetown-core/tags/link.rb +4 -0
  87. data/lib/bridgetown-core/tags/live_reload_dev_js.rb +13 -0
  88. data/lib/bridgetown-core/tags/post_url.rb +9 -14
  89. data/lib/bridgetown-core/tags/render_content.rb +2 -2
  90. data/lib/bridgetown-core/tasks/bridgetown_tasks.rake +60 -0
  91. data/lib/bridgetown-core/url.rb +5 -4
  92. data/lib/bridgetown-core/utils/aux.rb +57 -0
  93. data/lib/bridgetown-core/utils/ruby_exec.rb +3 -45
  94. data/lib/bridgetown-core/utils/ruby_front_matter.rb +22 -7
  95. data/lib/bridgetown-core/utils.rb +44 -11
  96. data/lib/bridgetown-core/version.rb +2 -2
  97. data/lib/bridgetown-core/watcher.rb +4 -6
  98. data/lib/bridgetown-core.rb +16 -23
  99. data/lib/site_template/Gemfile.erb +6 -2
  100. data/lib/site_template/README.md +6 -6
  101. data/lib/site_template/Rakefile +49 -0
  102. data/lib/site_template/bridgetown.config.yml +2 -3
  103. data/lib/site_template/config/puma.rb +27 -0
  104. data/lib/site_template/config.ru +7 -0
  105. data/lib/site_template/package.json.erb +1 -9
  106. data/lib/site_template/server/roda_app.rb +22 -0
  107. data/lib/site_template/server/routes/hello.rb.sample +10 -0
  108. data/lib/site_template/src/_components/head.liquid +2 -1
  109. data/lib/site_template/src/_layouts/default.liquid +1 -1
  110. data/lib/site_template/src/about.md +0 -1
  111. data/lib/site_template/src/posts.md +2 -3
  112. metadata +63 -18
  113. data/lib/bridgetown-core/concerns/data_accessible.rb +0 -20
  114. data/lib/bridgetown-core/concerns/validatable.rb +0 -56
  115. data/lib/bridgetown-core/document.rb +0 -437
  116. data/lib/bridgetown-core/drops/document_drop.rb +0 -80
  117. data/lib/bridgetown-core/drops/excerpt_drop.rb +0 -19
  118. data/lib/bridgetown-core/drops/page_drop.rb +0 -18
  119. data/lib/bridgetown-core/excerpt.rb +0 -200
  120. data/lib/bridgetown-core/readers/data_reader.rb +0 -89
  121. data/lib/bridgetown-core/readers/page_reader.rb +0 -26
  122. data/lib/bridgetown-core/readers/post_reader.rb +0 -109
  123. data/lib/bridgetown-core/regenerator.rb +0 -202
  124. data/lib/bridgetown-core/related_posts.rb +0 -55
  125. data/lib/site_template/config/.keep +0 -0
  126. data/lib/site_template/start.js +0 -17
  127. data/lib/site_template/sync.js +0 -35
@@ -1,437 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Bridgetown
4
- # TODO: to be retired once the Resource engine is made official
5
- class Document
6
- extend Forwardable
7
- include DataAccessible
8
- include Comparable
9
- include LayoutPlaceable
10
- include LiquidRenderable
11
- include Publishable
12
-
13
- attr_reader :path, :site, :extname, :collection, :type
14
- attr_accessor :content, :output
15
-
16
- def_delegator :self, :read_post_data, :post_read
17
-
18
- YAML_FRONT_MATTER_REGEXP = %r!\A(---\s*\n.*?\n?)^((---|\.\.\.)\s*$\n?)!m.freeze
19
- DATELESS_FILENAME_MATCHER = %r!^(?:.+/)*(.*)(\.[^.]+)$!.freeze
20
- DATE_FILENAME_MATCHER = %r!^(?>.+/)*?(\d{2,4}-\d{1,2}-\d{1,2})-([^/]*)(\.[^.]+)$!.freeze
21
-
22
- YAML_FILE_EXTS = %w(.yaml .yml).freeze
23
-
24
- #
25
-
26
- # Class-wide cache to stash and retrieve regexp to detect "super-directories"
27
- # of a particular Bridgetown::Document object.
28
- #
29
- # dirname - The *special directory* for the Document.
30
- # e.g. "_posts" for Documents from the `site.posts` collection.
31
- def self.superdirs_regex(dirname)
32
- @superdirs_regex ||= {}
33
- @superdirs_regex[dirname] ||= %r!#{dirname}.*!
34
- end
35
-
36
- #
37
-
38
- # Create a new Document.
39
- #
40
- # path - the path to the file
41
- # relations - a hash with keys :site and :collection, the values of which
42
- # are the Bridgetown::Site and Bridgetown::Collection to which this
43
- # Document belong.
44
- #
45
- # Returns nothing.
46
- def initialize(path, relations = {})
47
- @site = relations[:site]
48
- @path = path
49
- @extname = File.extname(path)
50
- @collection = relations[:collection]
51
- @type = @collection.label.to_sym
52
-
53
- @has_yaml_header = nil
54
-
55
- data.default_proc = proc do |_, key|
56
- site.frontmatter_defaults.find(relative_path, type, key.to_s)
57
- end
58
-
59
- trigger_hooks(:post_init)
60
- end
61
-
62
- # Fetch the Document's data.
63
- #
64
- # Returns a Hash containing the data. An empty hash is returned if
65
- # no data was read.
66
- def data
67
- @data ||= HashWithDotAccess::Hash.new
68
- end
69
-
70
- # Merge some data in with this document's data.
71
- #
72
- # Returns the merged data.
73
- def merge_data!(other, source: "YAML front matter")
74
- merge_categories!(other)
75
- Utils.deep_merge_hashes!(data, other)
76
- merge_date!(source)
77
- data
78
- end
79
-
80
- # Returns the document date. If metadata is not present then calculates it
81
- # based on Bridgetown::Site#time or the document file modification time.
82
- #
83
- # Return document date string.
84
- def date
85
- data["date"] ||= site.time # TODO: this doesn't reflect documented behavior
86
- end
87
-
88
- # Return document file modification time in the form of a Time object.
89
- #
90
- # Return document file modification Time object.
91
- def source_file_mtime
92
- File.mtime(path)
93
- end
94
-
95
- # The path to the document, relative to the collections_dir.
96
- #
97
- # Returns a String path which represents the relative path from the collections_dir
98
- # to this document.
99
- def relative_path
100
- @relative_path ||= path.sub("#{site.collections_path}/", "")
101
- end
102
-
103
- # FIXME: spinning up a new Renderer object just to get an extension
104
- # seems excessive
105
- #
106
- # The output extension of the document.
107
- #
108
- # Returns the output extension
109
- def output_ext
110
- @output_ext ||= Bridgetown::Renderer.new(site, self).output_ext
111
- end
112
-
113
- # The base filename of the document, without the file extname.
114
- #
115
- # Returns the basename without the file extname.
116
- def basename_without_ext
117
- @basename_without_ext ||= File.basename(path, ".*")
118
- end
119
-
120
- # The base filename of the document.
121
- #
122
- # Returns the base filename of the document.
123
- def basename
124
- @basename ||= File.basename(path)
125
- end
126
-
127
- # Produces a "cleaned" relative path.
128
- # The "cleaned" relative path is the relative path without the extname
129
- # and with the collection's directory removed as well.
130
- # This method is useful when building the URL of the document.
131
- #
132
- # NOTE: `String#gsub` removes all trailing periods (in comparison to `String#chomp`)
133
- #
134
- # Examples:
135
- # When relative_path is "_methods/site/generate...md":
136
- # cleaned_relative_path
137
- # # => "/site/generate"
138
- #
139
- # Returns the cleaned relative path of the document.
140
- def cleaned_relative_path
141
- @cleaned_relative_path ||=
142
- relative_path[0..-extname.length - 1]
143
- .sub(collection.relative_directory, "")
144
- .gsub(%r!\.*\z!, "")
145
- end
146
-
147
- # Determine whether the document is a YAML file.
148
- #
149
- # Returns true if the extname is either .yml or .yaml, false otherwise.
150
- def yaml_file?
151
- YAML_FILE_EXTS.include?(extname)
152
- end
153
-
154
- # The URL template where the document would be accessible.
155
- #
156
- # Returns the URL template for the document.
157
- def url_template
158
- collection.url_template
159
- end
160
-
161
- # Construct a Hash of key-value pairs which contain a mapping between
162
- # a key in the URL template and the corresponding value for this document.
163
- #
164
- # Returns the Hash of key-value pairs for replacement in the URL.
165
- def url_placeholders
166
- @url_placeholders ||= Drops::UrlDrop.new(self)
167
- end
168
-
169
- # The permalink for this Document.
170
- # Permalink is set via the data Hash.
171
- #
172
- # Returns the permalink or nil if no permalink was set in the data.
173
- def permalink
174
- data&.permalink
175
- end
176
-
177
- # The computed URL for the document. See `Bridgetown::URL#to_s` for more details.
178
- #
179
- # Returns the computed URL for the document.
180
- def url
181
- @url ||= URL.new(
182
- template: url_template,
183
- placeholders: url_placeholders,
184
- permalink: permalink
185
- ).to_s
186
- end
187
-
188
- # The full path to the output file.
189
- #
190
- # base_directory - the base path of the output directory
191
- #
192
- # Returns the full path to the output file of this document.
193
- def destination(base_directory)
194
- dest = site.in_dest_dir(base_directory)
195
- path = site.in_dest_dir(dest, URL.unescape_path(url))
196
- if url.end_with? "/"
197
- path = File.join(path, "index.html")
198
- else
199
- path << output_ext unless path.end_with? output_ext
200
- end
201
- path
202
- end
203
-
204
- # Write the generated Document file to the destination directory.
205
- #
206
- # dest - The String path to the destination dir.
207
- #
208
- # Returns nothing.
209
- def write(dest)
210
- path = destination(dest)
211
- FileUtils.mkdir_p(File.dirname(path))
212
- Bridgetown.logger.debug "Writing:", path
213
- File.write(path, output, mode: "wb")
214
-
215
- trigger_hooks(:post_write)
216
- end
217
-
218
- # Read in the file and assign the content and data based on the file contents.
219
- # Merge the frontmatter of the file with the frontmatter default
220
- # values
221
- #
222
- # Returns nothing.
223
- def read(opts = {})
224
- Bridgetown.logger.debug "Reading:", relative_path
225
-
226
- if yaml_file?
227
- @data = YAMLParser.load_file(path)
228
- else
229
- begin
230
- merge_defaults
231
- read_content(**opts)
232
- read_post_data
233
- rescue StandardError => e
234
- handle_read_error(e)
235
- end
236
- end
237
- end
238
-
239
- # Create a Liquid-understandable version of this Document.
240
- #
241
- # Returns a Hash representing this Document's data.
242
- def to_liquid
243
- @to_liquid ||= Drops::DocumentDrop.new(self)
244
- end
245
-
246
- # The inspect string for this document.
247
- # Includes the relative path and the collection label.
248
- #
249
- # Returns the inspect string for this document.
250
- def inspect
251
- "#<#{self.class} #{relative_path} collection=#{collection.label}>"
252
- end
253
-
254
- # Compare this document against another document.
255
- # Comparison is a comparison between the 2 paths of the documents.
256
- #
257
- # Returns -1, 0, +1 or nil depending on whether this doc's path is less than,
258
- # equal or greater than the other doc's path. See String#<=> for more details.
259
- def <=>(other)
260
- return nil unless other.respond_to?(:data)
261
-
262
- cmp = data["date"] <=> other.data["date"]
263
- cmp = path <=> other.path if cmp.nil? || cmp.zero?
264
- cmp
265
- end
266
-
267
- # Determine whether this document should be written.
268
- # Based on the Collection to which it belongs.
269
- #
270
- # True if the document has a collection and if that collection's #write?
271
- # method returns true, and if the site's Publisher will publish the document.
272
- # False otherwise.
273
- def write?
274
- collection&.write? && site.publisher.publish?(self)
275
- end
276
-
277
- # The Document excerpt_separator, from the YAML Front-Matter or site
278
- # default excerpt_separator value
279
- #
280
- # Returns the document excerpt_separator
281
- def excerpt_separator
282
- @excerpt_separator ||= (data["excerpt_separator"] || site.config["excerpt_separator"]).to_s
283
- end
284
-
285
- # Whether to generate an excerpt
286
- #
287
- # Returns true if the excerpt separator is configured.
288
- def generate_excerpt?
289
- !excerpt_separator.empty?
290
- end
291
-
292
- def next_doc
293
- pos = collection.docs.index { |post| post.equal?(self) }
294
- collection.docs[pos + 1] if pos && pos < collection.docs.length - 1
295
- end
296
-
297
- def previous_doc
298
- pos = collection.docs.index { |post| post.equal?(self) }
299
- collection.docs[pos - 1] if pos&.positive?
300
- end
301
-
302
- def trigger_hooks(hook_name, *args)
303
- Bridgetown::Hooks.trigger collection.label.to_sym, hook_name, self, *args if collection
304
- Bridgetown::Hooks.trigger :documents, hook_name, self, *args
305
- end
306
-
307
- def id
308
- @id ||= File.join(File.dirname(url), (data["slug"] || basename_without_ext).to_s)
309
- end
310
-
311
- # Calculate related posts.
312
- #
313
- # Returns an Array of related Posts.
314
- def related_posts
315
- @related_posts ||= Bridgetown::RelatedPosts.new(self).build
316
- end
317
-
318
- # Override of method_missing to check in @data for the key.
319
- def method_missing(method, *args, &blck)
320
- if data.key?(method.to_s)
321
- Bridgetown::Deprecator.deprecation_message "Document##{method} is now a key "\
322
- "in the #data hash."
323
- Bridgetown::Deprecator.deprecation_message "Called by #{caller(0..0)}."
324
- data[method.to_s]
325
- else
326
- super
327
- end
328
- end
329
-
330
- def respond_to_missing?(method, *)
331
- data.key?(method.to_s) || super
332
- end
333
-
334
- private
335
-
336
- def merge_categories!(other)
337
- if other.key?("categories") && !other["categories"].nil?
338
- other["categories"] = other["categories"].split if other["categories"].is_a?(String)
339
- other["categories"] = (data["categories"] || []) | other["categories"]
340
- end
341
- end
342
-
343
- def merge_date!(source)
344
- if data.key?("date")
345
- data["date"] = Utils.parse_date(
346
- data["date"].to_s,
347
- "Document '#{relative_path}' does not have a valid date in the #{source}."
348
- )
349
- end
350
- end
351
-
352
- def merge_defaults
353
- defaults = @site.frontmatter_defaults.all(relative_path, type)
354
- merge_data!(defaults, source: "front matter defaults") unless defaults.empty?
355
- end
356
-
357
- def read_content(**opts)
358
- self.content = File.read(path, **Utils.merged_file_read_opts(site, opts))
359
- if content =~ YAML_FRONT_MATTER_REGEXP
360
- self.content = $POSTMATCH
361
- data_file = YAMLParser.load(Regexp.last_match(1))
362
- merge_data!(data_file, source: "YAML front matter") if data_file
363
- end
364
- end
365
-
366
- def read_post_data
367
- populate_title
368
- populate_categories
369
- populate_tags
370
- determine_locale
371
- generate_excerpt
372
- end
373
-
374
- def handle_read_error(error)
375
- if error.is_a? Psych::SyntaxError
376
- Bridgetown.logger.error "Error:", "YAML Exception reading #{path}: #{error.message}"
377
- else
378
- Bridgetown.logger.error "Error:", "could not read file #{path}: #{error.message}"
379
- end
380
-
381
- if site.config["strict_front_matter"] || error.is_a?(Bridgetown::Errors::FatalException)
382
- raise error
383
- end
384
- end
385
-
386
- def populate_title
387
- if relative_path =~ DATE_FILENAME_MATCHER
388
- date, slug, ext = Regexp.last_match.captures
389
- modify_date(date)
390
- elsif relative_path =~ DATELESS_FILENAME_MATCHER
391
- slug, ext = Regexp.last_match.captures
392
- end
393
-
394
- # slugs shouldn't end with a period
395
- # `String#gsub!` removes all trailing periods (in comparison to `String#chomp!`)
396
- slug.gsub!(%r!\.*\z!, "")
397
-
398
- # Try to ensure the user gets a title.
399
- data["title"] ||= Utils.titleize_slug(slug)
400
- # Only overwrite slug & ext if they aren't specified.
401
- data["slug"] ||= slug
402
- data["ext"] ||= ext
403
- end
404
-
405
- def populate_categories
406
- data.categories = Utils.pluralized_array_from_hash(
407
- data, :category, :categories
408
- ).map(&:to_s)
409
- end
410
-
411
- def populate_tags
412
- data.tags = Utils.pluralized_array_from_hash(data, :tag, :tags)
413
- end
414
-
415
- def determine_locale
416
- unless data["locale"]
417
- # if locale key isn't directly set, look for alternative front matter
418
- # or look at the filename pattern: slug.locale.ext
419
- alernative = data["language"] || data["lang"] ||
420
- basename_without_ext.split(".")[1..-1].last
421
-
422
- data["locale"] = alernative if !alernative.nil? &&
423
- site.config[:available_locales].include?(alernative)
424
- end
425
- end
426
-
427
- def modify_date(date)
428
- if !data["date"] || data["date"].to_i == site.time.to_i
429
- merge_data!({ "date" => date }, source: "filename")
430
- end
431
- end
432
-
433
- def generate_excerpt
434
- data["excerpt"] ||= Bridgetown::Excerpt.new(self) if generate_excerpt?
435
- end
436
- end
437
- end
@@ -1,80 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Bridgetown
4
- module Drops
5
- class DocumentDrop < Drop
6
- extend Forwardable
7
-
8
- NESTED_OBJECT_FIELD_BLACKLIST = %w(
9
- content output excerpt next previous
10
- ).freeze
11
-
12
- mutable false
13
-
14
- def_delegator :@obj, :relative_path, :path
15
- def_delegators :@obj,
16
- :id,
17
- :output,
18
- :content,
19
- :to_s,
20
- :relative_path,
21
- :url,
22
- :date,
23
- :related_posts
24
-
25
- private def_delegator :@obj, :data, :fallback_data
26
-
27
- def collection
28
- @collection ||= @obj.collection.to_liquid
29
- end
30
-
31
- def excerpt
32
- fallback_data["excerpt"].to_s
33
- end
34
-
35
- def <=>(other)
36
- return nil unless other.is_a? DocumentDrop
37
-
38
- cmp = self["date"] <=> other["date"]
39
- cmp = self["path"] <=> other["path"] if cmp.nil? || cmp.zero?
40
- cmp
41
- end
42
-
43
- def previous
44
- @previous ||= @obj.previous_doc.to_liquid
45
- end
46
-
47
- def next
48
- @next ||= @obj.next_doc.to_liquid
49
- end
50
-
51
- # Generate a Hash for use in generating JSON.
52
- # This is useful if fields need to be cleared before the JSON can generate.
53
- #
54
- # state - the JSON::State object which determines the state of current processing.
55
- #
56
- # Returns a Hash ready for JSON generation.
57
- def hash_for_json(state = nil)
58
- to_h.tap do |hash|
59
- # use collection label in the hash
60
- hash["collection"] = hash["collection"]["label"] if hash["collection"]
61
-
62
- if state && state.depth >= 2
63
- hash["previous"] = collapse_document(hash["previous"]) if hash["previous"]
64
- hash["next"] = collapse_document(hash["next"]) if hash["next"]
65
- end
66
- end
67
- end
68
-
69
- # Generate a Hash which breaks the recursive chain.
70
- # Certain fields which are normally available are omitted.
71
- #
72
- # Returns a Hash with only non-recursive fields present.
73
- def collapse_document(doc)
74
- doc.keys.each_with_object({}) do |(key, _), result|
75
- result[key] = doc[key] unless NESTED_OBJECT_FIELD_BLACKLIST.include?(key)
76
- end
77
- end
78
- end
79
- end
80
- end
@@ -1,19 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Bridgetown
4
- module Drops
5
- class ExcerptDrop < DocumentDrop
6
- def layout
7
- @obj.doc.data["layout"]
8
- end
9
-
10
- def date
11
- @obj.doc.date
12
- end
13
-
14
- def excerpt
15
- nil
16
- end
17
- end
18
- end
19
- end
@@ -1,18 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Bridgetown
4
- module Drops
5
- class PageDrop < Drop
6
- extend Forwardable
7
-
8
- mutable false
9
-
10
- def_delegators :@obj, :content, :dir, :name, :path, :url, :pager
11
- private def_delegator :@obj, :data, :fallback_data
12
-
13
- def relative_url
14
- @obj.relative_url
15
- end
16
- end
17
- end
18
- end