class SwedbankPay::SidebarParser

The Sidebar renderer

Attributes

pages[R]

Public Class Methods

new(site) click to toggle source
# File lib/sidebar_parser.rb, line 13
def initialize(site)
  raise ArgumentError, 'Site cannot be nil' if site.nil?
  raise ArgumentError, 'Site must be a Jekyll::Site' unless site.is_a? Jekyll::Site

  @pages = convert(site.pages)
end

Public Instance Methods

parse(tree) click to toggle source
# File lib/sidebar_parser.rb, line 20
def parse(tree)
  raise ArgumentError, 'tree cannot be nil' if tree.nil?
  raise ArgumentError, 'tree must be a SidebarTreeBuilder' unless tree.is_a? SidebarTreeBuilder

  parse_html(tree)
end

Private Instance Methods

convert(pages) click to toggle source
# File lib/sidebar_parser.rb, line 29
def convert(pages)
  pages_hash = {}

  pages.each do |jekyll_page|
    if skippable? jekyll_page
      SidebarLogger.debug("Skipping <#{jekyll_page['url']}>")
      next
    end

    sidebar_page = SidebarPage.new(jekyll_page)
    pages_hash[sidebar_page.path] = sidebar_page
  end

  pages_hash
end
find_headers(page) click to toggle source
# File lib/sidebar_parser.rb, line 60
def find_headers(page)
  headers = []

  # Don't include headers in the sidebar if we're on a card overview page.
  return headers if page.card_overview? || !page.anchor_headings?

  page.doc.xpath('//h2').each do |header|
    id = header['id']

    next unless id

    child_markup = header.last_element_child
    hash = child_markup['href'].to_s if child_markup.respond_to? :[]
    title = header.content.strip

    headers.push({ id: id, title: title, hash: hash })
  end

  headers
end
find_sidebar_container(page) click to toggle source
# File lib/sidebar_parser.rb, line 81
def find_sidebar_container(page)
  sidebar_containers = page.doc.xpath('//*[@id="dx-sidebar-main-nav-ul"]')

  if sidebar_containers.empty?
    SidebarLogger.error("No sidebar container found in <#{page.filename}>!")
    return nil
  end

  sidebar_containers.first
end
parse_html(pages) click to toggle source
# File lib/sidebar_parser.rb, line 45
def parse_html(pages)
  return if pages.nil? || pages.empty?

  pages.each do |page|
    page.load
    page.headers = find_headers(page)
    page.sidebar_container = find_sidebar_container(page)
    page.freeze

    parse_html(page.children)
  end

  pages
end
skippable?(jekyll_page) click to toggle source
# File lib/sidebar_parser.rb, line 92
def skippable?(jekyll_page)
  return true if jekyll_page.is_a? JekyllRedirectFrom::RedirectPage
  return true if jekyll_page.is_a? JekyllRedirectFrom::PageWithoutAFile

  false
end