Sha256: 3eccc2249c6e59adb74722f5ed09e16ac6875621662df660350c935cf675334a

Contents?: true

Size: 1.57 KB

Versions: 81

Compression:

Stored size: 1.57 KB

Contents

HEADING_TAG_DEPTHS = {
  'h0' => 0,
  'h1' => 1,
  'h2' => 2,
  'h3' => 3,
  'h4' => 4,
  'h5' => 5,
  'h6' => 6,
}.freeze

module NavigationHelper
  def navigation_from_content(content:, title: nil)
    content = "<h0 class='injected'>#{title}</h0>\n" + content if title
    document = build_document(content)

    nodes = ['<ul class="Vlt-sidemenu Vlt-sidemenu--flat navigation js-navigation">']
    last_node = nil

    document.css('.reveal').remove

    document.css('h0,h2,h3,h4,h5,h6').each do |heading|
      # If it's a header within tabbed content (including Code Snippets) we don't want to treat
      # the header as a navigation item in the sidebar
      next unless heading.ancestors('.Vlt-tabs').empty?

      # Same with callouts
      next unless heading.ancestors('.Vlt-callout').empty?

      if last_node.nil? || heading.name == last_node.name
        # Do nothing (cleaner than adding wrapping further conditions)
      elsif heading.name >= last_node.name # e.g. h2 -> h3
        nodes << '<ul>'
      else # e.g. h4 -> h2
        (HEADING_TAG_DEPTHS[last_node.name] - HEADING_TAG_DEPTHS[heading.name]).times do
          nodes << '</li></ul>'
        end
      end

      nodes << <<~HEREDOC
        <li>
          <a class="Vlt-sidemenu__link" href="##{heading.attributes['id']}" data-scrollspy-id="#{heading['data-id']}">
            #{heading.text}
          </a>
      HEREDOC
      last_node = heading
    end
    nodes << '</li></ul>'
    nodes.join("\n").html_safe
  end

  private

  def build_document(content)
    Nokogiri::HTML::DocumentFragment.parse(content)
  end
end

Version data entries

81 entries across 81 versions & 1 rubygems

Version Path
station-0.5.3 lib/nexmo_developer/app/helpers/navigation_helper.rb
station-0.5.2 lib/nexmo_developer/app/helpers/navigation_helper.rb
station-0.5.1 lib/nexmo_developer/app/helpers/navigation_helper.rb
station-0.5.0 lib/nexmo_developer/app/helpers/navigation_helper.rb
station-0.4.9 lib/nexmo_developer/app/helpers/navigation_helper.rb
station-0.4.8 lib/nexmo_developer/app/helpers/navigation_helper.rb
station-0.4.7 lib/nexmo_developer/app/helpers/navigation_helper.rb
station-0.4.6 lib/nexmo_developer/app/helpers/navigation_helper.rb
station-0.4.5 lib/nexmo_developer/app/helpers/navigation_helper.rb
station-0.4.4 lib/nexmo_developer/app/helpers/navigation_helper.rb
station-0.4.3 lib/nexmo_developer/app/helpers/navigation_helper.rb
station-0.4.2 lib/nexmo_developer/app/helpers/navigation_helper.rb
station-0.4.1 lib/nexmo_developer/app/helpers/navigation_helper.rb
station-0.4.0 lib/nexmo_developer/app/helpers/navigation_helper.rb
station-0.3.2 lib/nexmo_developer/app/helpers/navigation_helper.rb
station-0.3.1 lib/nexmo_developer/app/helpers/navigation_helper.rb
station-0.3.0 lib/nexmo_developer/app/helpers/navigation_helper.rb
station-0.2.6 lib/nexmo_developer/app/helpers/navigation_helper.rb
station-0.2.5 lib/nexmo_developer/app/helpers/navigation_helper.rb
station-0.2.4 lib/nexmo_developer/app/helpers/navigation_helper.rb