module GuidesStyle18F::NavigationMenu

Public Class Methods

apply_nav_update(url, nav, nav_data, original) click to toggle source
# File lib/guides_style_18f/navigation.rb, line 192
def self.apply_nav_update(url, nav, nav_data, original)
  orig = original[url]
  if orig.nil?
    apply_new_nav_item(url, nav, nav_data, original)
  else
    orig['text'] = nav['text']
    orig.delete('generated')
  end
end
apply_new_nav_item(url, nav, nav_data, original) click to toggle source
# File lib/guides_style_18f/navigation.rb, line 202
def self.apply_new_nav_item(url, nav, nav_data, original)
  parent_url = File.dirname(url || '/')
  parent = original["#{parent_url}/"]
  if parent_url == '/'
    nav_data << (original[url] = nav)
  elsif parent.nil?
    nav_data << nav.merge(orphan_url: url)
  else
    (parent['children'] ||= []) << nav
  end
end
check_for_orphaned_items(nav_data) click to toggle source
# File lib/guides_style_18f/navigation.rb, line 214
def self.check_for_orphaned_items(nav_data)
  orphan_urls = nav_data.map { |nav| nav[:orphan_url] }.compact
  unless orphan_urls.empty?
    fail(StandardError, "Parent pages missing for the following:\n  " +
      orphan_urls.join("\n  "))
  end
end
map_nav_items_by_url(parent_url, nav_data) click to toggle source
# File lib/guides_style_18f/navigation.rb, line 145
def self.map_nav_items_by_url(parent_url, nav_data)
  nav_data.flat_map do |nav|
    url = File.join('', parent_url, nav['url'] || '')
    [[url, nav]].concat(map_nav_items_by_url(url, nav['children'] || []))
  end
end
page_nav(front_matter) click to toggle source
remove_stale_children(parent) click to toggle source
# File lib/guides_style_18f/navigation.rb, line 185
def self.remove_stale_children(parent)
  children = (parent['children'] || [])
  children.delete_if { |nav| nav['delete'] }
  parent.delete 'children' if children.empty?
  children.each { |child| remove_stale_children(child) }
end
remove_stale_nav_entries(nav_data, original, updated) click to toggle source
# File lib/guides_style_18f/navigation.rb, line 173
def self.remove_stale_nav_entries(nav_data, original, updated)
  # Remove old entries whose pages have been deleted
  original.each do |url, nav|
    if !updated.member?(url) && nav['internal'] && !nav['generated']
      nav['delete'] = true
    end
  end
  original.delete_if { |_url, nav| nav['delete'] }
  nav_data.delete_if { |nav| nav['delete'] }
  nav_data.each { |nav| remove_stale_children(nav) }
end
update_navigation_data(nav_data, basedir, config_data) click to toggle source
# File lib/guides_style_18f/navigation.rb, line 133
def self.update_navigation_data(nav_data, basedir, config_data)
  original = map_nav_items_by_url('/', nav_data).to_h
  updated = updated_nav_data(basedir)
  remove_stale_nav_entries(nav_data, original, updated)
  updated.map { |url, nav| apply_nav_update(url, nav, nav_data, original) }
  if config_data['generate_nodes']
    GeneratedNodes.create_homes_for_orphans(original, nav_data)
  else
    check_for_orphaned_items(nav_data)
  end
end
updated_nav_data(basedir) click to toggle source
# File lib/guides_style_18f/navigation.rb, line 152
def self.updated_nav_data(basedir)
  front_matter = FrontMatter.load basedir
  errors = FrontMatter.validate_with_message_upon_error front_matter
  abort errors + "\n_config.yml not updated" if errors
  front_matter.values.sort_by { |fm| fm['permalink'] }
    .map { |fm| [fm['permalink'], page_nav(fm)] }.to_h
end