Class: NavGenerator::Generator

Inherits:
Jekyll::Generator
  • Object
show all
Defined in:
lib/generators/nav-generator.rb

Instance Method Summary collapse

Instance Method Details



35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/generators/nav-generator.rb', line 35

def breadcrumb_for_parent(page_list, parentPage, grandParentPage)
  parentPageTitle = parentPage && parentPage.data['title']
  pages = page_list
    .filter { |page| page.data['parent'] == parentPageTitle && page.data['title'] != nil }
    .sort_by { |page| [page.data['nav_order'] || 999, page.data['title']] }  

  nav = pages.map { |page|
    children = breadcrumb_for_parent(page_list, page, parentPage)
    
    # Attach parent/grandparent URLs for rendering breadcrumb
    page.data['parent_url'] = parentPage&.url
    page.data['grand_parent_url'] = grandParentPage&.url

    {
      'parent_url' => parentPage&.url,
      'grand_parent_url' => grandParentPage&.url
    }
  }
end

#generate(site) ⇒ Object

Generate a sorted page heirarchy based on parent / grand_parent TODO: If a new page is added to the site, need to hook into incremental rebuild and flush nav.html cache



5
6
7
8
9
10
11
12
13
# File 'lib/generators/nav-generator.rb', line 5

def generate(site)
  nav = nav_for_parent(site.pages, nil, nil)
  
  # Breadcrumbs
  breadcrumb = breadcrumb_for_parent(site.pages, nil, nil)
  
  # Attach nav data to the default layout
  site.layouts['default'].data['nav'] = nav
end


15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/generators/nav-generator.rb', line 15

def nav_for_parent(page_list, parentPage, grandParentPage)
  parentPageTitle = parentPage && parentPage.data['title']
  pages = page_list
    .filter { |page| page.data['parent'] == parentPageTitle && page.data['title'] != nil && page.data['nav_exclude'] != true }
    .sort_by { |page| [page.data['nav_order'] || 999, page.data['title']] }  

  nav = pages.map { |page|
    children = page.data['has_children'] && nav_for_parent(page_list, page, parentPage)

    # Attach the child data to the page itself, used to render the footer Table of Contents
    page.data['children'] = children
    
    {
      'title' => page.data['title'],
      'url' => page.url,
      'children' => children
    }
  }
end