Module: Asciidoctor::Html::Tabs

Defined in:
lib/asciidoctor/html/tabs.rb

Overview

Helpers for the tabs conversion

Class Method Summary collapse

Class Method Details

.convert_tabs(node) ⇒ Object



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/asciidoctor/html/tabs.rb', line 9

def self.convert_tabs(node)
  tabs_id = node.attr "tabs-id"
  nav = [%(<div class="nav nav-tabs" role="tablist">)]
  panes = [%(<div class="tab-content">)]
  pane_number = 1
  node.items.each do |terms, dd|
    return %(<p class="text-danger">Definition is required.</p>) unless dd

    active = pane_number == 1
    tab_id = "tab-#{tabs_id}-#{pane_number}"
    pane_id = "#{tab_id}-pane"
    terms.each do |dt|
      class_attr = %( class="nav-link#{" active" if active}")
      target_attr = %( data-bs-target="##{pane_id}")
      selected_attr = %( aria-selected="#{active ? "true" : "false"}")
      other_attrs = %( data-bs-toggle="tab" type="button" role="tab" aria-controls="#{pane_id}")
      id_attr = %( id="#{tab_id}")
      nav << %(<button#{id_attr}#{class_attr}#{target_attr}#{other_attrs}#{selected_attr}>#{dt.text}</button>)
    end

    class_attr = %( class="tab-pane#{" show active" if active}")
    id_attr = %( id="#{pane_id}")
    other_attrs = %( role="tabpanel" aria-labelledby="#{tab_id}" tabindex="0")
    panes << %(<div#{id_attr}#{class_attr}#{other_attrs}>)
    panes << %(<p>#{dd.text}</p>) if dd.text?
    panes << dd.content if dd.blocks?
    panes << "</div>"
    pane_number += 1
  end
  nav << "</div> <!-- .nav.nav-tabs -->\n"
  panes << "</div> <!-- .tab-content -->\n"
  content = %(<div class="tabs">\n#{nav.join("\n")}#{panes.join("\n")}</div> <!-- .tabs -->\n)
  Utils.wrap_id_classes_with_title(content, node, node.id, "tabs-wrapper")
end