Class: Jekyll::Page

Inherits:
Object
  • Object
show all
Includes:
Convertible
Defined in:
lib/jekyll/page.rb

Direct Known Subclasses

PageWithoutAFile

Constant Summary collapse

ATTRIBUTES_FOR_LIQUID =

Attributes for Liquid templates

%w(
  content
  dir
  excerpt
  name
  path
  url
).freeze
HTML_EXTENSIONS =

A set of extensions that are considered HTML or HTML-like so we should not alter them, this includes .xhtml through XHTM5.

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

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Convertible

#[], #asset_file?, #coffeescript_file?, #converters, #do_layout, #hook_owner, #invalid_layout?, #output_ext, #place_in_layout?, #published?, #read_yaml, #render_all_layouts, #render_liquid, #render_with_liquid?, #renderer, #sass_file?, #to_liquid, #to_s, #transform, #type, #validate_data!, #validate_permalink!, #write

Constructor Details

#initialize(site, base, dir, name) ⇒ Page

Initialize a new Page.

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.


39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/jekyll/page.rb', line 39

def initialize(site, base, dir, name)
  @site = site
  @base = base
  @dir  = dir
  @name = name
  @path = if site.in_theme_dir(base) == base # we're in a theme
            site.in_theme_dir(base, dir, name)
          else
            site.in_source_dir(base, dir, name)
          end

  process(name)
  read_yaml(PathManager.join(base, dir), name)
  generate_excerpt if site.config["page_excerpts"]

  data.default_proc = proc do |_, key|
    site.frontmatter_defaults.find(relative_path, type, key)
  end

  Jekyll::Hooks.trigger :pages, :post_init, self
end

Instance Attribute Details

#basenameObject

Returns the value of attribute basename


9
10
11
# File 'lib/jekyll/page.rb', line 9

def basename
  @basename
end

#contentObject

Returns the value of attribute content


10
11
12
# File 'lib/jekyll/page.rb', line 10

def content
  @content
end

#dataObject

Returns the value of attribute data


10
11
12
# File 'lib/jekyll/page.rb', line 10

def data
  @data
end

#dirObject

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 the String destination directory.


66
67
68
69
70
71
72
73
# File 'lib/jekyll/page.rb', line 66

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


9
10
11
# File 'lib/jekyll/page.rb', line 9

def ext
  @ext
end

#nameObject

Returns the value of attribute name


9
10
11
# File 'lib/jekyll/page.rb', line 9

def name
  @name
end

#outputObject

Returns the value of attribute output


10
11
12
# File 'lib/jekyll/page.rb', line 10

def output
  @output
end

#pagerObject

Returns the value of attribute pager


8
9
10
# File 'lib/jekyll/page.rb', line 8

def pager
  @pager
end

#siteObject

Returns the value of attribute site


8
9
10
# File 'lib/jekyll/page.rb', line 8

def site
  @site
end

Instance Method Details

#destination(dest) ⇒ Object

Obtain destination path.

dest - The String path to the destination dir.

Returns the destination file path String.


158
159
160
161
162
163
# File 'lib/jekyll/page.rb', line 158

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

#excerptObject


192
193
194
195
196
# File 'lib/jekyll/page.rb', line 192

def excerpt
  return @excerpt if defined?(@excerpt)

  @excerpt = data["excerpt"]&.to_s
end

#excerpt_separatorObject


188
189
190
# File 'lib/jekyll/page.rb', line 188

def excerpt_separator
  @excerpt_separator ||= (data["excerpt_separator"] || site.config["excerpt_separator"]).to_s
end

#generate_excerpt?Boolean

Returns:

  • (Boolean)

198
199
200
# File 'lib/jekyll/page.rb', line 198

def generate_excerpt?
  !excerpt_separator.empty? && self.class == Jekyll::Page && html?
end

#html?Boolean

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

Returns:

  • (Boolean)

171
172
173
# File 'lib/jekyll/page.rb', line 171

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)

176
177
178
# File 'lib/jekyll/page.rb', line 176

def index?
  basename == "index"
end

#inspectObject

Returns the object as a debug String.


166
167
168
# File 'lib/jekyll/page.rb', line 166

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

#pathObject

The path to the source file

Returns the path to the source file


144
145
146
# File 'lib/jekyll/page.rb', line 144

def path
  data.fetch("path") { relative_path }
end

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

Returns the String permalink or nil if none has been set.


79
80
81
# File 'lib/jekyll/page.rb', line 79

def permalink
  data.nil? ? nil : data["permalink"]
end

#process(name) ⇒ Object

Extract information from the page filename.

name - The String filename of the page file.

NOTE: `String#gsub` removes all trailing periods (in comparison to `String#chomp`) Returns nothing.


123
124
125
126
# File 'lib/jekyll/page.rb', line 123

def process(name)
  self.ext = File.extname(name)
  self.basename = name[0..-ext.length - 1].gsub(%r!\.*\z!, "")
end

#relative_pathObject

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


149
150
151
# File 'lib/jekyll/page.rb', line 149

def relative_path
  @relative_path ||= File.join(*[@dir, @name].map(&:to_s).reject(&:empty?)).sub(%r!\A/!, "")
end

#render(layouts, site_payload) ⇒ Object

Add any necessary layouts to this post

layouts - The Hash of => “layout”. site_payload - The site payload Hash.

Returns String rendered page.


134
135
136
137
138
139
# File 'lib/jekyll/page.rb', line 134

def render(layouts, site_payload)
  site_payload["page"] = to_liquid
  site_payload["paginator"] = pager.to_liquid

  do_layout(site_payload, layouts)
end

#templateObject

The template of the permalink.

Returns the template String.


86
87
88
89
90
91
92
93
94
# File 'lib/jekyll/page.rb', line 86

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

#trigger_hooks(hook_name, *args) ⇒ Object


180
181
182
# File 'lib/jekyll/page.rb', line 180

def trigger_hooks(hook_name, *args)
  Jekyll::Hooks.trigger :pages, hook_name, self, *args
end

#urlObject

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

Returns the String url.


99
100
101
102
103
104
105
# File 'lib/jekyll/page.rb', line 99

def url
  @url ||= URL.new(
    :template     => template,
    :placeholders => url_placeholders,
    :permalink    => 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”


109
110
111
112
113
114
115
# File 'lib/jekyll/page.rb', line 109

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

#write?Boolean

Returns:

  • (Boolean)

184
185
186
# File 'lib/jekyll/page.rb', line 184

def write?
  true
end