Class: Bridgetown::GeneratedPage

Inherits:
Object
  • Object
show all
Includes:
LayoutPlaceable, LiquidRenderable, Localizable, Publishable, Transformable
Defined in:
bridgetown-core/lib/bridgetown-core/generated_page.rb

Direct Known Subclasses

Paginate::PaginationPage, PrototypePage

Constant Summary collapse

HTML_EXTENSIONS =

A set of extensions that are considered HTML or HTML-like so we should not alter them

%w(
  .html
  .xhtml
  .htm
).freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Transformable

#transform_content, #transform_with_layout

Methods included from Publishable

#publishable?, #published?

Methods included from Localizable

#all_locales, #localeless_path, #matches_resource?

Methods included from LiquidRenderable

#liquid_engine_configured?, #render_with_liquid?, #yaml_file?

Methods included from LayoutPlaceable

#no_layout?, #place_in_layout?

Constructor Details

#initialize(site, base, dir, name, from_plugin: false) ⇒ GeneratedPage

Initialize a new GeneratedPage.

site - The Site object. base - The String path to the source. dir - The String path between the source and the file. name - The String filename of the file. from_plugin - true if the Page file is located in a Gem-based plugin folder rubocop:disable Metrics/ParameterLists



37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 37

def initialize(site, base, dir, name, from_plugin: false)
  @site = site
  @base = base
  @dir  = dir
  @name = name
  @ext = File.extname(name)
  @basename = File.basename(name, ".*")
  @path = from_plugin ? File.join(base, dir, name) : site.in_source_dir(base, dir, name)

  process

  self.data ||= HashWithDotAccess::Hash.new

  Bridgetown::Hooks.trigger :generated_pages, :post_init, self
end

Instance Attribute Details

#basenameObject

Returns the value of attribute basename.



12
13
14
# File 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 12

def basename
  @basename
end

#contentObject

Returns the value of attribute content.



12
13
14
# File 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 12

def content
  @content
end

#dataObject

Returns the value of attribute data.



12
13
14
# File 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 12

def data
  @data
end

#dirString

The generated directory into which the page will be placed upon generation. This is derived from the permalink or, if permalink is absent, will be ‘/’

Returns:

  • (String)


78
79
80
81
82
83
84
85
# File 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 78

def dir
  if url.end_with?("/")
    url
  else
    url_dir = File.dirname(url)
    url_dir.end_with?("/") ? url_dir : "#{url_dir}/"
  end
end

#extObject Also known as: extname

Returns the value of attribute ext.



12
13
14
# File 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 12

def ext
  @ext
end

#fast_refresh_orderBoolean (readonly)

Returns:

  • (Boolean)


16
17
18
# File 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 16

def fast_refresh_order
  @fast_refresh_order
end

#nameObject

Returns the value of attribute name.



12
13
14
# File 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 12

def name
  @name
end

#original_resourceObject

Returns the value of attribute original_resource.



12
13
14
# File 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 12

def original_resource
  @original_resource
end

#outputObject

Returns the value of attribute output.



12
13
14
# File 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 12

def output
  @output
end

#paginatorObject

Returns the value of attribute paginator.



12
13
14
# File 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 12

def paginator
  @paginator
end

#siteObject

Returns the value of attribute site.



12
13
14
# File 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 12

def site
  @site
end

Instance Method Details

#[](property) ⇒ Object

Accessor for data properties by Liquid

Parameters:

  • property (String)

    name of the property to retrieve

Returns:

  • (Object)


64
65
66
# File 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 64

def [](property)
  data[property]
end

#converter_output_extObject



183
184
185
186
187
188
189
# File 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 183

def converter_output_ext
  if output_exts.size == 1
    output_exts.last
  else
    output_exts[-2]
  end
end

#convertersArray<Bridgetown::Converter>

Returns:



198
199
200
# File 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 198

def converters
  @converters ||= site.matched_converters_for_convertible(self)
end

#destination(dest) ⇒ String

Obtain destination path.

Parameters:

  • dest (String)

    path to the destination dir

Returns:

  • (String)


243
244
245
246
247
248
# File 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 243

def destination(dest)
  path = site.in_dest_dir(dest, URL.unescape_path(url))
  path = File.join(path, "index") if url.end_with?("/")
  path << output_ext unless path.end_with? output_ext
  path
end

#html?Boolean

Returns the Boolean of whether this Page is HTML or not.

Returns:

  • (Boolean)


268
269
270
# File 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 268

def html?
  HTML_EXTENSIONS.include?(output_ext)
end

#index?Boolean

Returns the Boolean of whether this Page is an index file or not.

Returns:

  • (Boolean)


273
274
275
# File 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 273

def index?
  basename == "index"
end

#inspectObject

Returns the object as a debug String.



263
264
265
# File 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 263

def inspect
  "#<#{self.class} #{relative_path}>"
end

#layoutBridgetown::Layout

Layout associated with this resource This will output a warning if the layout can’t be found.

Returns:



139
140
141
142
143
144
145
146
147
148
149
# File 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 139

def layout
  return @layout if @layout
  return if no_layout?

  @layout = site.layouts[data.layout].tap do |layout|
    unless layout
      Bridgetown.logger.warn "Generated Page:", "Layout '#{data.layout}' " \
                                                "requested via #{relative_path} does not exist."
    end
  end
end

#mark_for_fast_refresh!Object



289
290
291
292
# File 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 289

def mark_for_fast_refresh!
  @fast_refresh_order = site.fast_refresh_ordering
  site.fast_refresh_ordering += 1
end

#output_extString

The output extension of the page.

Returns:

  • (String)


170
171
172
# File 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 170

def output_ext
  @output_ext ||= permalink_ext || converter_output_ext
end

#output_extsObject



191
192
193
194
195
# File 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 191

def output_exts
  @output_exts ||= converters.filter_map do |c|
    c.output_ext(extname)
  end
end

#pathObject

The path to the source file



157
158
159
160
# File 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 157

def path
  # TODO: is this trip really necessary?!
  data.fetch("path") { relative_path }
end

The full path and filename of the post. Defined in the YAML of the post body



96
97
98
# File 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 96

def permalink
  data&.permalink
end


174
175
176
177
178
179
180
181
# File 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 174

def permalink_ext
  page_permalink = permalink
  if page_permalink &&
      !page_permalink.end_with?("/")
    permalink_ext = File.extname(page_permalink)
    permalink_ext unless permalink_ext.empty?
  end
end

#place_into_layoutsObject



227
228
229
230
231
232
233
234
235
236
# File 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 227

def place_into_layouts
  Bridgetown.logger.debug "Placing in Layouts:", relative_path
  rendered_output = content.dup

  site.validated_layouts_for(self, data.layout).each do |layout|
    rendered_output = transform_with_layout(layout, rendered_output, self)
  end

  self.output = rendered_output
end

#processObject

Overide this in subclasses for custom initialization behavior



152
153
154
# File 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 152

def process
  # no-op by default
end

#relative_pathObject

The path to the page source file, relative to the site source



163
164
165
# File 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 163

def relative_path
  @relative_path ||= File.join(*[@dir, @name].map(&:to_s).reject(&:empty?)).delete_prefix("/")
end

#slotsArray<Bridgetown::Slot>

Returns:



69
70
71
# File 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 69

def slots
  @slots ||= []
end

#templateString

The template of the permalink.

Returns:

  • (String)


103
104
105
106
107
108
109
110
111
# File 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 103

def template
  if !html?
    "/:path/:basename:output_ext"
  elsif index?
    "/:path/"
  else
    Utils.add_permalink_suffix("/:path/:basename", site.permalink_style)
  end
end

#to_liquidBridgetown::Drops::GeneratedPageDrop

Liquid representation of current page



90
91
92
# File 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 90

def to_liquid
  @liquid_drop ||= Drops::GeneratedPageDrop.new(self)
end

#to_sObject

Returns the contents as a String.



55
56
57
# File 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 55

def to_s
  output || content || ""
end

#transform!Object

rubocop:todo Metrics



202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
# File 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 202

def transform! # rubocop:todo Metrics
  Bridgetown.logger.debug "Transforming:", relative_path

  internal_error = nil
  Signalize.effect do
    if !@fast_refresh_order && @previously_transformed_content
      self.content = @previously_transformed_content
      mark_for_fast_refresh! if site.config.fast_refresh && write?
      next
    end

    trigger_hooks :pre_render
    @previously_transformed_content ||= content
    self.content = transform_content(self)
    place_in_layout? ? place_into_layouts : self.output = content.dup
    trigger_hooks :post_render
  rescue StandardError, SyntaxError => e
    internal_error = e
  end

  raise internal_error if internal_error

  self
end

#trigger_hooks(hook_name, *args) ⇒ Object



277
278
279
# File 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 277

def trigger_hooks(hook_name, *args)
  Bridgetown::Hooks.trigger :generated_pages, hook_name, self, *args
end

#typeObject



281
282
283
# File 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 281

def type
  :generated_pages
end

#unmark_for_fast_refresh!Object



294
295
296
297
# File 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 294

def unmark_for_fast_refresh!
  @fast_refresh_order = nil
  original_resource&.unmark_for_fast_refresh!
end

#urlString Also known as: relative_url

The generated relative url of this page. e.g. /about.html.

Returns:

  • (String)


116
117
118
119
120
121
122
# File 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 116

def url
  @url ||= URL.new(
    template:,
    placeholders: url_placeholders,
    permalink:
  ).to_s
end

#url_placeholdersObject

Returns a hash of URL placeholder names (as symbols) mapping to the desired placeholder replacements. For details see “url.rb”



127
128
129
130
131
132
133
# File 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 127

def url_placeholders
  {
    path: @dir,
    basename: @basename,
    output_ext:,
  }
end

#write(dest) ⇒ Object

Write the generated page file to the destination directory.

Parameters:

  • dest (String)

    path to the destination dir



253
254
255
256
257
258
259
260
# File 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 253

def write(dest)
  path = destination(dest)
  FileUtils.mkdir_p(File.dirname(path))
  Bridgetown.logger.debug "Writing:", path
  File.write(path, output, mode: "wb")
  unmark_for_fast_refresh!
  Bridgetown::Hooks.trigger :generated_pages, :post_write, self
end

#write?Boolean

Returns:

  • (Boolean)


285
286
287
# File 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 285

def write?
  true
end