Class: Bridgetown::GeneratedPage
- Inherits:
 - 
      Object
      
        
- Object
 - Bridgetown::GeneratedPage
 
 
- Includes:
 - LayoutPlaceable, Localizable, Publishable, Transformable
 
- Defined in:
 - bridgetown-core/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.
 - 
  
    
      #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, *args)  ⇒ 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, #localeless_path, #matches_resource?
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
      36 37 38 39 40 41 42 43 44 45 46 47 48 49 50  | 
    
      # File 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 36 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 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 11 def basename @basename end  | 
  
#content ⇒ Object
Returns the value of attribute content.
      11 12 13  | 
    
      # File 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 11 def content @content end  | 
  
#data ⇒ Object
Returns the value of attribute data.
      11 12 13  | 
    
      # File 'bridgetown-core/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 ‘/’
      77 78 79 80 81 82 83 84  | 
    
      # File 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 77 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 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 11 def ext @ext end  | 
  
#fast_refresh_order ⇒ Boolean (readonly)
      15 16 17  | 
    
      # File 'bridgetown-core/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 'bridgetown-core/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 'bridgetown-core/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 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 11 def output @output end  | 
  
#paginator ⇒ Object
Returns the value of attribute paginator.
      11 12 13  | 
    
      # File 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 11 def paginator @paginator end  | 
  
#site ⇒ Object
Returns the value of attribute site.
      11 12 13  | 
    
      # File 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 11 def site @site end  | 
  
Instance Method Details
#[](property) ⇒ Object
Accessor for data properties by Liquid
      63 64 65  | 
    
      # File 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 63 def [](property) data[property] end  | 
  
#add_permalink_suffix(template, permalink_style) ⇒ Object
      99 100 101 102 103 104 105 106 107 108 109 110 111  | 
    
      # File 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 99 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
      198 199 200 201 202 203 204  | 
    
      # File 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 198 def converter_output_ext if output_exts.size == 1 output_exts.last else output_exts[-2] end end  | 
  
#converters ⇒ Array<Bridgetown::Converter>
      213 214 215  | 
    
      # File 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 213 def converters @converters ||= site.matched_converters_for_convertible(self) end  | 
  
#destination(dest) ⇒ String
Obtain destination path.
      258 259 260 261 262 263  | 
    
      # File 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 258 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.
      283 284 285  | 
    
      # File 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 283 def html? HTML_EXTENSIONS.include?(output_ext) end  | 
  
#index? ⇒ Boolean
Returns the Boolean of whether this Page is an index file or not.
      288 289 290  | 
    
      # File 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 288 def index? basename == "index" end  | 
  
#inspect ⇒ Object
Returns the object as a debug String.
      278 279 280  | 
    
      # File 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 278 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.
      154 155 156 157 158 159 160 161 162 163 164  | 
    
      # File 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 154 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
      304 305 306 307  | 
    
      # File 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 304 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.
      185 186 187  | 
    
      # File 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 185 def output_ext @output_ext ||= permalink_ext || converter_output_ext end  | 
  
#output_exts ⇒ Object
      206 207 208 209 210  | 
    
      # File 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 206 def output_exts @output_exts ||= converters.filter_map do |c| c.output_ext(extname) end end  | 
  
#path ⇒ Object
The path to the source file
      172 173 174 175  | 
    
      # File 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 172 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
      95 96 97  | 
    
      # File 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 95 def permalink data&.permalink end  | 
  
#permalink_ext ⇒ Object
      189 190 191 192 193 194 195 196  | 
    
      # File 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 189 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
      242 243 244 245 246 247 248 249 250 251  | 
    
      # File 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 242 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
      167 168 169  | 
    
      # File 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 167 def process # no-op by default end  | 
  
#relative_path ⇒ Object
The path to the page source file, relative to the site source
      178 179 180  | 
    
      # File 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 178 def relative_path @relative_path ||= File.join(*[@dir, @name].map(&:to_s).reject(&:empty?)).delete_prefix("/") end  | 
  
#slots ⇒ Array<Bridgetown::Slot>
      68 69 70  | 
    
      # File 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 68 def slots @slots ||= [] end  | 
  
#template ⇒ String
The template of the permalink.
      116 117 118 119 120 121 122 123 124  | 
    
      # File 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 116 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
      89 90 91  | 
    
      # File 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 89 def to_liquid @liquid_drop ||= Drops::GeneratedPageDrop.new(self) end  | 
  
#to_s ⇒ Object
Returns the contents as a String.
      54 55 56  | 
    
      # File 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 54 def to_s output || content || "" end  | 
  
#transform! ⇒ Object
rubocop:todo Metrics
      217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240  | 
    
      # File 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 217 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
      292 293 294  | 
    
      # File 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 292 def trigger_hooks(hook_name, *args) Bridgetown::Hooks.trigger :generated_pages, hook_name, self, *args end  | 
  
#type ⇒ Object
      296 297 298  | 
    
      # File 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 296 def type :generated_pages end  | 
  
#unmark_for_fast_refresh! ⇒ Object
      309 310 311 312  | 
    
      # File 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 309 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.
      129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147  | 
    
      # File 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 129 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.
      268 269 270 271 272 273 274 275  | 
    
      # File 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 268 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
      300 301 302  | 
    
      # File 'bridgetown-core/lib/bridgetown-core/generated_page.rb', line 300 def write? true end  |