Class: Bridgetown::GeneratedPage
- Inherits:
-
Object
- Object
- Bridgetown::GeneratedPage
- Includes:
- LayoutPlaceable, Localizable, Publishable, Transformable
- Defined in:
- lib/bridgetown-core/generated_page.rb
Direct Known Subclasses
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
-
#basename ⇒ Object
Returns the value of attribute basename.
-
#content ⇒ Object
Returns the value of attribute content.
-
#data ⇒ Object
Returns the value of attribute data.
-
#dir ⇒ String
The generated directory into which the page will be placed upon generation.
-
#ext ⇒ Object
(also: #extname)
Returns the value of attribute ext.
- #fast_refresh_order ⇒ Boolean readonly
-
#name ⇒ Object
Returns the value of attribute name.
-
#original_resource ⇒ Object
Returns the value of attribute original_resource.
-
#output ⇒ Object
Returns the value of attribute output.
-
#paginator ⇒ Object
Returns the value of attribute paginator.
-
#site ⇒ Object
Returns the value of attribute site.
Instance Method Summary collapse
-
#[](property) ⇒ Object
Accessor for data properties by Liquid.
- #add_permalink_suffix(template, permalink_style) ⇒ Object
- #converter_output_ext ⇒ Object
- #converters ⇒ Array<Bridgetown::Converter>
-
#destination(dest) ⇒ String
Obtain destination path.
-
#html? ⇒ Boolean
Returns the Boolean of whether this Page is HTML or not.
-
#index? ⇒ Boolean
Returns the Boolean of whether this Page is an index file or not.
-
#initialize(site, base, dir, name, from_plugin: false) ⇒ GeneratedPage
constructor
Initialize a new GeneratedPage.
-
#inspect ⇒ Object
Returns the object as a debug String.
-
#layout ⇒ Bridgetown::Layout
Layout associated with this resource This will output a warning if the layout can't be found.
- #mark_for_fast_refresh! ⇒ Object
-
#output_ext ⇒ String
The output extension of the page.
- #output_exts ⇒ Object
-
#path ⇒ Object
The path to the source file.
-
#permalink ⇒ Object
The full path and filename of the post.
- #permalink_ext ⇒ Object
- #place_into_layouts ⇒ Object
-
#process ⇒ Object
Overide this in subclasses for custom initialization behavior.
-
#relative_path ⇒ Object
The path to the page source file, relative to the site source.
- #roda_app ⇒ Object
-
#roda_app= ⇒ Object
NOTE: these are no-op methods, only here to provide "compatibility" with
Bridgetown::Resource::Basein edge case rendering contexts. - #slots ⇒ Array<Bridgetown::Slot>
-
#template ⇒ String
The template of the permalink.
-
#to_liquid ⇒ Bridgetown::Drops::GeneratedPageDrop
Liquid representation of current page.
-
#to_s ⇒ Object
Returns the contents as a String.
-
#transform! ⇒ Object
rubocop:todo Metrics.
- #trigger_hooks(hook_name) ⇒ Object
- #type ⇒ Object
- #unmark_for_fast_refresh! ⇒ Object
-
#url ⇒ String
(also: #relative_url)
The generated relative url of this page.
-
#write(dest) ⇒ Object
Write the generated page file to the destination directory.
- #write? ⇒ Boolean
Methods included from Transformable
#transform_content, #transform_with_layout
Methods included from Publishable
Methods included from Localizable
#all_locales, #locale_index_key, #localeless_path, #matches_resource?, sort_by_locale
Methods included from LayoutPlaceable
#no_layout?, #place_in_layout?
Constructor Details
#initialize(site, base, dir, name, from_plugin: false) ⇒ GeneratedPage
Initialize a new GeneratedPage
rubocop:disable Metrics/ParameterLists
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
# File 'lib/bridgetown-core/generated_page.rb', line 43 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
#basename ⇒ Object
Returns the value of attribute basename.
11 12 13 |
# File 'lib/bridgetown-core/generated_page.rb', line 11 def basename @basename end |
#content ⇒ Object
Returns the value of attribute content.
11 12 13 |
# File 'lib/bridgetown-core/generated_page.rb', line 11 def content @content end |
#data ⇒ Object
Returns the value of attribute data.
11 12 13 |
# File 'lib/bridgetown-core/generated_page.rb', line 11 def data @data end |
#dir ⇒ String
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 '/'
84 85 86 87 88 89 90 91 |
# File 'lib/bridgetown-core/generated_page.rb', line 84 def dir if url.end_with?("/") url else url_dir = File.dirname(url) url_dir.end_with?("/") ? url_dir : "#{url_dir}/" end end |
#ext ⇒ Object Also known as: extname
Returns the value of attribute ext.
11 12 13 |
# File 'lib/bridgetown-core/generated_page.rb', line 11 def ext @ext end |
#fast_refresh_order ⇒ Boolean (readonly)
15 16 17 |
# File 'lib/bridgetown-core/generated_page.rb', line 15 def fast_refresh_order @fast_refresh_order end |
#name ⇒ Object
Returns the value of attribute name.
11 12 13 |
# File 'lib/bridgetown-core/generated_page.rb', line 11 def name @name end |
#original_resource ⇒ Object
Returns the value of attribute original_resource.
11 12 13 |
# File 'lib/bridgetown-core/generated_page.rb', line 11 def original_resource @original_resource end |
#output ⇒ Object
Returns the value of attribute output.
11 12 13 |
# File 'lib/bridgetown-core/generated_page.rb', line 11 def output @output end |
#paginator ⇒ Object
Returns the value of attribute paginator.
11 12 13 |
# File 'lib/bridgetown-core/generated_page.rb', line 11 def paginator @paginator end |
#site ⇒ Object
Returns the value of attribute site.
11 12 13 |
# File 'lib/bridgetown-core/generated_page.rb', line 11 def site @site end |
Instance Method Details
#[](property) ⇒ Object
Accessor for data properties by Liquid
70 71 72 |
# File 'lib/bridgetown-core/generated_page.rb', line 70 def [](property) data[property] end |
#add_permalink_suffix(template, permalink_style) ⇒ Object
106 107 108 109 110 111 112 113 114 115 116 117 118 |
# File 'lib/bridgetown-core/generated_page.rb', line 106 def add_permalink_suffix(template, permalink_style) template = template.dup case permalink_style when :pretty, :simple template << "/" else template << "/" if permalink_style.to_s.end_with?("/") template << ":output_ext" if permalink_style.to_s.end_with?(".*") end template end |
#converter_output_ext ⇒ Object
205 206 207 208 209 210 211 |
# File 'lib/bridgetown-core/generated_page.rb', line 205 def converter_output_ext if output_exts.size == 1 output_exts.last else output_exts[-2] end end |
#converters ⇒ Array<Bridgetown::Converter>
220 221 222 |
# File 'lib/bridgetown-core/generated_page.rb', line 220 def converters @converters ||= site.matched_converters_for_convertible(self) end |
#destination(dest) ⇒ String
Obtain destination path.
265 266 267 268 269 270 |
# File 'lib/bridgetown-core/generated_page.rb', line 265 def destination(dest) path = site.in_dest_dir(dest, Utils.unencode_uri(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.
290 291 292 |
# File 'lib/bridgetown-core/generated_page.rb', line 290 def html? HTML_EXTENSIONS.include?(output_ext) end |
#index? ⇒ Boolean
Returns the Boolean of whether this Page is an index file or not.
295 296 297 |
# File 'lib/bridgetown-core/generated_page.rb', line 295 def index? basename == "index" end |
#inspect ⇒ Object
Returns the object as a debug String.
285 286 287 |
# File 'lib/bridgetown-core/generated_page.rb', line 285 def inspect "#<#{self.class} #{relative_path}>" end |
#layout ⇒ Bridgetown::Layout
Layout associated with this resource This will output a warning if the layout can't be found.
161 162 163 164 165 166 167 168 169 170 171 |
# File 'lib/bridgetown-core/generated_page.rb', line 161 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
311 312 313 314 |
# File 'lib/bridgetown-core/generated_page.rb', line 311 def mark_for_fast_refresh! @fast_refresh_order = site.fast_refresh_ordering site.fast_refresh_ordering += 1 end |
#output_ext ⇒ String
The output extension of the page.
192 193 194 |
# File 'lib/bridgetown-core/generated_page.rb', line 192 def output_ext @output_ext ||= permalink_ext || converter_output_ext end |
#output_exts ⇒ Object
213 214 215 216 217 |
# File 'lib/bridgetown-core/generated_page.rb', line 213 def output_exts @output_exts ||= converters.filter_map do |c| c.output_ext(extname) end end |
#path ⇒ Object
The path to the source file
179 180 181 182 |
# File 'lib/bridgetown-core/generated_page.rb', line 179 def path # TODO: is this trip really necessary?! data.fetch("path") { relative_path } end |
#permalink ⇒ Object
The full path and filename of the post. Defined in the YAML of the post body
102 103 104 |
# File 'lib/bridgetown-core/generated_page.rb', line 102 def permalink data&.permalink end |
#permalink_ext ⇒ Object
196 197 198 199 200 201 202 203 |
# File 'lib/bridgetown-core/generated_page.rb', line 196 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_layouts ⇒ Object
249 250 251 252 253 254 255 256 257 258 |
# File 'lib/bridgetown-core/generated_page.rb', line 249 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 |
#process ⇒ Object
Overide this in subclasses for custom initialization behavior
174 175 176 |
# File 'lib/bridgetown-core/generated_page.rb', line 174 def process # no-op by default end |
#relative_path ⇒ Object
The path to the page source file, relative to the site source
185 186 187 |
# File 'lib/bridgetown-core/generated_page.rb', line 185 def relative_path @relative_path ||= File.join(*[@dir, @name].map(&:to_s).reject(&:empty?)).delete_prefix("/") end |
#roda_app ⇒ Object
33 |
# File 'lib/bridgetown-core/generated_page.rb', line 33 def roda_app = nil |
#roda_app= ⇒ Object
NOTE: these are no-op methods, only here to provide "compatibility" with
Bridgetown::Resource::Base in edge case rendering contexts. There's
actually no case when a GeneratedPage will have a linkage with the Roda
app because GeneratedPage instances are only used in static builds.
32 |
# File 'lib/bridgetown-core/generated_page.rb', line 32 def roda_app=(*); end |
#slots ⇒ Array<Bridgetown::Slot>
75 76 77 |
# File 'lib/bridgetown-core/generated_page.rb', line 75 def slots @slots ||= [] end |
#template ⇒ String
The template of the permalink.
123 124 125 126 127 128 129 130 131 |
# File 'lib/bridgetown-core/generated_page.rb', line 123 def template if !html? "/:dir/:basename:output_ext" elsif index? "/:dir/" else add_permalink_suffix("/:dir/:basename", site.permalink_style) end end |
#to_liquid ⇒ Bridgetown::Drops::GeneratedPageDrop
Liquid representation of current page
96 97 98 |
# File 'lib/bridgetown-core/generated_page.rb', line 96 def to_liquid @liquid_drop ||= Drops::GeneratedPageDrop.new(self) end |
#to_s ⇒ Object
Returns the contents as a String.
61 62 63 |
# File 'lib/bridgetown-core/generated_page.rb', line 61 def to_s output || content || "" end |
#transform! ⇒ Object
rubocop:todo Metrics
224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 |
# File 'lib/bridgetown-core/generated_page.rb', line 224 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) ⇒ Object
299 300 301 |
# File 'lib/bridgetown-core/generated_page.rb', line 299 def trigger_hooks(hook_name, *) Bridgetown::Hooks.trigger(:generated_pages, hook_name, self, *) end |
#type ⇒ Object
303 304 305 |
# File 'lib/bridgetown-core/generated_page.rb', line 303 def type :generated_pages end |
#unmark_for_fast_refresh! ⇒ Object
316 317 318 319 |
# File 'lib/bridgetown-core/generated_page.rb', line 316 def unmark_for_fast_refresh! @fast_refresh_order = nil original_resource&.unmark_for_fast_refresh! end |
#url ⇒ String Also known as: relative_url
The generated relative url of this page. e.g. /about.html.
136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 |
# File 'lib/bridgetown-core/generated_page.rb', line 136 def url return @url if @url tmpl = permalink || template placeholders = { dir: @dir, basename:, output_ext: } results = placeholders.inject(tmpl) do |result, token| break result if result.index(":").nil? if token.last.nil? # Remove leading "/" to avoid generating urls with `//` result.gsub("/:#{token.first}", "") else result.gsub(":#{token.first}", token.last) end end.then { Addressable::URI.normalize_component _1 } @url = "/#{results.sub("#", "%23")}".gsub("..", "/").gsub("./", "").squeeze("/") end |
#write(dest) ⇒ Object
Write the generated page file to the destination directory.
275 276 277 278 279 280 281 282 |
# File 'lib/bridgetown-core/generated_page.rb', line 275 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
307 308 309 |
# File 'lib/bridgetown-core/generated_page.rb', line 307 def write? true end |