Class: JekyllDefaultLayout::Generator

Inherits:
Jekyll::Generator
  • Object
show all
Defined in:
lib/jekyll-default-layout/generator.rb

Overview

Injects front matter defaults to set default layouts, if they exist

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(site) ⇒ Generator

Returns a new instance of Generator.



11
12
13
# File 'lib/jekyll-default-layout/generator.rb', line 11

def initialize(site)
  @site = site
end

Instance Attribute Details

#siteObject

Returns the value of attribute site.



6
7
8
# File 'lib/jekyll-default-layout/generator.rb', line 6

def site
  @site
end

Instance Method Details

#collection?(document) ⇒ Boolean

Returns:

  • (Boolean)


88
89
90
# File 'lib/jekyll-default-layout/generator.rb', line 88

def collection?(document)
  document.is_a?(Jekyll::Document) && !post?(document)
end

#documentsObject

rubocop:enable Metrics/PerceivedComplexity, Metrics/CyclomaticComplexity



72
73
74
# File 'lib/jekyll-default-layout/generator.rb', line 72

def documents
  [site.pages, site.collections.values.map(&:docs)].flatten
end

#generate(site) ⇒ Object



15
16
17
18
19
20
21
22
# File 'lib/jekyll-default-layout/generator.rb', line 15

def generate(site)
  @site = site
  documents.each do |document|
    next unless should_set_layout?(document)

    document.data["layout"] = layout_for(document)
  end
end

#html?(document) ⇒ Boolean

Returns:

  • (Boolean)


44
45
46
# File 'lib/jekyll-default-layout/generator.rb', line 44

def html?(document)
  document.extname == ".html"
end

#html_pages_enabled?Boolean

HTML pages are only given a default layout when the user opts in via jekyll-default-layout: { html_pages: true } in _config.yml.

Returns:

  • (Boolean)


50
51
52
53
# File 'lib/jekyll-default-layout/generator.rb', line 50

def html_pages_enabled?
  config = site.config["jekyll-default-layout"]
  config.is_a?(Hash) && config["html_pages"] == true
end

#index?(document) ⇒ Boolean

Returns:

  • (Boolean)


92
93
94
# File 'lib/jekyll-default-layout/generator.rb', line 92

def index?(document)
  document.url == "/"
end

#layout_exists?(layout) ⇒ Boolean

Does the given layout exist for the site?

Returns:

  • (Boolean)


30
31
32
# File 'lib/jekyll-default-layout/generator.rb', line 30

def layout_exists?(layout)
  !site.layouts[layout].nil?
end

#layout_for(document) ⇒ Object

What layout is appropriate for this document, if any rubocop:disable Metrics/PerceivedComplexity, Metrics/CyclomaticComplexity



57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/jekyll-default-layout/generator.rb', line 57

def layout_for(document)
  if index?(document) && layout_exists?("home")
    "home"
  elsif page?(document) && layout_exists?("page")
    "page"
  elsif post?(document) && layout_exists?("post")
    "post"
  elsif collection?(document) && layout_exists?(document.collection.label)
    document.collection.label
  elsif layout_exists?("default")
    "default"
  end
end

#layout_specified?(document) ⇒ Boolean

Has the user already specified a default for this layout? Note: We must use to_liquid, and not data, to ensure front matter defaults

Returns:

  • (Boolean)


36
37
38
# File 'lib/jekyll-default-layout/generator.rb', line 36

def layout_specified?(document)
  document.to_liquid.key? "layout"
end

#markdown?(document) ⇒ Boolean

Returns:

  • (Boolean)


40
41
42
# File 'lib/jekyll-default-layout/generator.rb', line 40

def markdown?(document)
  markdown_converter.matches(document.extname)
end

#markdown_converterObject



76
77
78
# File 'lib/jekyll-default-layout/generator.rb', line 76

def markdown_converter
  @markdown_converter ||= site.find_converter_instance(Jekyll::Converters::Markdown)
end

#page?(document) ⇒ Boolean

Returns:

  • (Boolean)


84
85
86
# File 'lib/jekyll-default-layout/generator.rb', line 84

def page?(document)
  document.is_a?(Jekyll::Page)
end

#post?(document) ⇒ Boolean

Returns:

  • (Boolean)


80
81
82
# File 'lib/jekyll-default-layout/generator.rb', line 80

def post?(document)
  document.is_a?(Jekyll::Document) && document.collection.label == "posts"
end

#should_set_layout?(document) ⇒ Boolean

Returns:

  • (Boolean)


24
25
26
27
# File 'lib/jekyll-default-layout/generator.rb', line 24

def should_set_layout?(document)
  !layout_specified?(document) &&
    (markdown?(document) || (html?(document) && html_pages_enabled?))
end