Class: Bridgetown::GeneratedPage
- Inherits:
-
Object
- Object
- Bridgetown::GeneratedPage
- Includes:
- LayoutPlaceable, LiquidRenderable, 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.
-
#name ⇒ Object
Returns the value of attribute name.
-
#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.
- #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.
-
#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.
- #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
- #trigger_hooks(hook_name, *args) ⇒ Object
- #type ⇒ Object
-
#url ⇒ String
(also: #relative_url)
The generated relative url of this page.
-
#url_placeholders ⇒ Object
Returns a hash of URL placeholder names (as symbols) mapping to the desired placeholder replacements.
-
#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, #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
33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
# File 'lib/bridgetown-core/generated_page.rb', line 33 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 = if from_plugin File.join(base, dir, name) else site.in_source_dir(base, dir, name) end 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.
12 13 14 |
# File 'lib/bridgetown-core/generated_page.rb', line 12 def basename @basename end |
#content ⇒ Object
Returns the value of attribute content.
12 13 14 |
# File 'lib/bridgetown-core/generated_page.rb', line 12 def content @content end |
#data ⇒ Object
Returns the value of attribute data.
12 13 14 |
# File 'lib/bridgetown-core/generated_page.rb', line 12 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 '/'
78 79 80 81 82 83 84 85 |
# File '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 |
#ext ⇒ Object Also known as: extname
Returns the value of attribute ext.
12 13 14 |
# File 'lib/bridgetown-core/generated_page.rb', line 12 def ext @ext end |
#name ⇒ Object
Returns the value of attribute name.
12 13 14 |
# File 'lib/bridgetown-core/generated_page.rb', line 12 def name @name end |
#output ⇒ Object
Returns the value of attribute output.
12 13 14 |
# File 'lib/bridgetown-core/generated_page.rb', line 12 def output @output end |
#paginator ⇒ Object
Returns the value of attribute paginator.
12 13 14 |
# File 'lib/bridgetown-core/generated_page.rb', line 12 def paginator @paginator end |
#site ⇒ Object
Returns the value of attribute site.
12 13 14 |
# File 'lib/bridgetown-core/generated_page.rb', line 12 def site @site end |
Instance Method Details
#[](property) ⇒ Object
Accessor for data properties by Liquid
64 65 66 |
# File 'lib/bridgetown-core/generated_page.rb', line 64 def [](property) data[property] end |
#converter_output_ext ⇒ Object
183 184 185 186 187 188 189 |
# File '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 |
#converters ⇒ Array<Bridgetown::Converter>
198 199 200 |
# File 'lib/bridgetown-core/generated_page.rb', line 198 def converters @converters ||= site.matched_converters_for_convertible(self) end |
#destination(dest) ⇒ String
Obtain destination path.
229 230 231 232 233 234 |
# File 'lib/bridgetown-core/generated_page.rb', line 229 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.
253 254 255 |
# File 'lib/bridgetown-core/generated_page.rb', line 253 def html? HTML_EXTENSIONS.include?(output_ext) end |
#index? ⇒ Boolean
Returns the Boolean of whether this Page is an index file or not.
258 259 260 |
# File 'lib/bridgetown-core/generated_page.rb', line 258 def index? basename == "index" end |
#inspect ⇒ Object
Returns the object as a debug String.
248 249 250 |
# File 'lib/bridgetown-core/generated_page.rb', line 248 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.
139 140 141 142 143 144 145 146 147 148 149 |
# File '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 |
#output_ext ⇒ String
The output extension of the page.
170 171 172 |
# File 'lib/bridgetown-core/generated_page.rb', line 170 def output_ext @output_ext ||= permalink_ext || converter_output_ext end |
#output_exts ⇒ Object
191 192 193 194 195 |
# File 'lib/bridgetown-core/generated_page.rb', line 191 def output_exts @output_exts ||= converters.filter_map do |c| c.output_ext(extname) end end |
#path ⇒ Object
The path to the source file
157 158 159 160 |
# File 'lib/bridgetown-core/generated_page.rb', line 157 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
96 97 98 |
# File 'lib/bridgetown-core/generated_page.rb', line 96 def permalink data&.permalink end |
#permalink_ext ⇒ Object
174 175 176 177 178 179 180 181 |
# File '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_layouts ⇒ Object
213 214 215 216 217 218 219 220 221 222 |
# File 'lib/bridgetown-core/generated_page.rb', line 213 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
152 153 154 |
# File 'lib/bridgetown-core/generated_page.rb', line 152 def process # no-op by default end |
#relative_path ⇒ Object
The path to the page source file, relative to the site source
163 164 165 |
# File '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 |
#slots ⇒ Array<Bridgetown::Slot>
69 70 71 |
# File 'lib/bridgetown-core/generated_page.rb', line 69 def slots @slots ||= [] end |
#template ⇒ String
The template of the permalink.
103 104 105 106 107 108 109 110 111 |
# File '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_liquid ⇒ Bridgetown::Drops::GeneratedPageDrop
Liquid representation of current page
90 91 92 |
# File 'lib/bridgetown-core/generated_page.rb', line 90 def to_liquid @liquid_drop ||= Drops::GeneratedPageDrop.new(self) end |
#to_s ⇒ Object
Returns the contents as a String.
55 56 57 |
# File 'lib/bridgetown-core/generated_page.rb', line 55 def to_s output || content || "" end |
#transform! ⇒ Object
202 203 204 205 206 207 208 209 210 211 |
# File 'lib/bridgetown-core/generated_page.rb', line 202 def transform! Bridgetown.logger.debug "Transforming:", relative_path trigger_hooks :pre_render self.content = transform_content(self) place_in_layout? ? place_into_layouts : self.output = content.dup trigger_hooks :post_render self end |
#trigger_hooks(hook_name, *args) ⇒ Object
262 263 264 |
# File 'lib/bridgetown-core/generated_page.rb', line 262 def trigger_hooks(hook_name, *args) Bridgetown::Hooks.trigger :generated_pages, hook_name, self, *args end |
#type ⇒ Object
266 267 268 |
# File 'lib/bridgetown-core/generated_page.rb', line 266 def type :generated_pages end |
#url ⇒ String Also known as: relative_url
The generated relative url of this page. e.g. /about.html.
116 117 118 119 120 121 122 |
# File 'lib/bridgetown-core/generated_page.rb', line 116 def url @url ||= URL.new( template: template, placeholders: url_placeholders, permalink: permalink ).to_s end |
#url_placeholders ⇒ Object
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 'lib/bridgetown-core/generated_page.rb', line 127 def url_placeholders { path: @dir, basename: @basename, output_ext: output_ext, } end |
#write(dest) ⇒ Object
Write the generated page file to the destination directory.
239 240 241 242 243 244 245 |
# File 'lib/bridgetown-core/generated_page.rb', line 239 def write(dest) path = destination(dest) FileUtils.mkdir_p(File.dirname(path)) Bridgetown.logger.debug "Writing:", path File.write(path, output, mode: "wb") Bridgetown::Hooks.trigger :generated_pages, :post_write, self end |
#write? ⇒ Boolean
270 271 272 |
# File 'lib/bridgetown-core/generated_page.rb', line 270 def write? true end |