Module: Asciidoctor::Html::Template

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

Overview

The template for the book layout

Class Method Summary collapse

Class Method Details

.appendix_title(chapname, numeral, doctitle, num_appendices) ⇒ Object



24
25
26
27
# File 'lib/asciidoctor/html/template.rb', line 24

def self.appendix_title(chapname, numeral, doctitle, num_appendices)
  numeral = num_appendices == 1 ? "" : " #{numeral}"
  %(<span class="title-prefix">#{chapname}#{numeral}</span>#{doctitle})
end


63
64
65
# File 'lib/asciidoctor/html/template.rb', line 63

def self.footer(author, year)
  %(<footer class="footer">&#169; #{year} #{author}</footer>\n)
end

.head(title, langs) ⇒ Object



73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
# File 'lib/asciidoctor/html/template.rb', line 73

def self.head(title, langs)
  <<~HTML
    <head>
      <meta charset="utf-8">
      <meta name="viewport" content="width=device-width, initial-scale=1">
      <title>#{title}</title>
      <link rel="apple-touch-icon" sizes="180x180" href="#{FAVICON_PATH}/apple-touch-icon.png">
      <link rel="icon" type="image/png" sizes="32x32" href="#{FAVICON_PATH}/favicon-32x32.png">
      <link rel="icon" type="image/png" sizes="16x16" href="#{FAVICON_PATH}/favicon-16x16.png">
      <link rel="manifest" href="#{FAVICON_PATH}/site.webmanifest">
      <link rel="stylesheet" href="#{CSS_PATH}/styles.css">
      <link rel="stylesheet" href="#{Highlightjs::CDN_PATH}/styles/tomorrow-night-blue.min.css">
      <script src="#{Highlightjs::CDN_PATH}/highlight.min.js"></script>
      #{highlightjs langs}
      <script id="MathJax-script" async src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
    </head>
  HTML
end

.header(title) ⇒ Object



51
52
53
54
55
56
57
58
59
60
61
# File 'lib/asciidoctor/html/template.rb', line 51

def self.header(title)
  <<~HTML
    <header class="header">
      <a class="home" href="./">#{title}</a>
      <button type="button" class="btn menu" data-bs-toggle="collapse" data-bs-target="#sidebar"
              aria-expanded="false" aria-controls="sidebar">
        <i class="bi bi-list"></i>
      </button>
    </header>
  HTML
end

.highlightjs(langs) ⇒ Object



67
68
69
70
71
# File 'lib/asciidoctor/html/template.rb', line 67

def self.highlightjs(langs)
  langs.map do |lang|
    %(<script src="#{Highlightjs::CDN_PATH}/languages/#{lang}.min.js"></script>)
  end.join("\n  ")
end

.html(content, nav_items, opts = {}) ⇒ Object

opts:

  • title: String

  • author: String

  • date: Date

  • chapnum: Int

  • chaptitle: String

  • langs: Array



99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
# File 'lib/asciidoctor/html/template.rb', line 99

def self.html(content, nav_items, opts = {})
  <<~HTML
    <!DOCTYPE html>
    <html lang="en">
    #{head opts[:title], opts[:langs]}
    <body>
    #{header opts[:title]}
    #{sidebar nav_items}
    #{main content, opts[:chapnum], opts[:chaptitle], opts[:author], opts[:date].year}
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.6/dist/js/bootstrap.bundle.min.js"
            integrity="sha384-j1CDi7MgGQ12Z7Qab0qlWQ/Qqz24Gc6BM0thvEMVjHnfYGF0rmFCozFSxQBxwHKO"
            crossorigin="anonymous"></script>
    <script>
    const touch = matchMedia('(hover: none)').matches;
    #{Highlightjs::PLUGIN}
    hljs.highlightAll();
    addEventListener('hashchange', function() {
      collapse = bootstrap.Collapse.getInstance("#sidebar");
      if(collapse) collapse.hide();
    });
    #{Popovers::POPOVERS}
    </script>
    </body>
    </html>
  HTML
end

.main(content, chapnum, chaptitle, author, year) ⇒ Object



39
40
41
42
43
44
45
46
47
48
49
# File 'lib/asciidoctor/html/template.rb', line 39

def self.main(content, chapnum, chaptitle, author, year)
  <<~HTML
    <main class="main">
    <div class="content-container">
    <h2>#{nav_text chapnum, chaptitle}</h2>
    #{content}
    #{footer author, year}
    </div>
    </main>
  HTML
end


11
12
13
14
15
16
# File 'lib/asciidoctor/html/template.rb', line 11

def self.nav_item(target, text, content = "", active: false)
  active_class = active ? %( class="active") : ""
  link = %(<a href="#{target}">#{text}</a>)
  subnav = content.empty? ? content : "\n#{content}\n"
  %(<li#{active_class}>#{link}#{subnav}</li>\n)
end


18
19
20
21
22
# File 'lib/asciidoctor/html/template.rb', line 18

def self.nav_text(chapnum, chaptitle)
  return chaptitle if chapnum.empty?

  %(<span class="title-mark">#{chapnum}</span>#{chaptitle})
end


29
30
31
32
33
34
35
36
37
# File 'lib/asciidoctor/html/template.rb', line 29

def self.sidebar(nav_items)
  <<~HTML
    <div id="sidebar" class="sidebar collapse collapse-horizontal">
    <nav id="sidenav"><ul>
    #{nav_items.join "\n"}
    </ul></nav>
    </div> <!-- .sidebar -->
  HTML
end