Module: Asciidoctor::Html::Template

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

Overview

The template for the book layout

Constant Summary collapse

<<~HTML
  <button type="button" id="menu-btn" class="btn menu"
          aria-expanded="false" aria-controls="sidebar">
    <i class="bi bi-list"></i>
  </button>
HTML

Class Method Summary collapse

Class Method Details

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



33
34
35
36
# File 'lib/asciidoctor/html/template.rb', line 33

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


95
96
97
98
99
100
101
102
103
104
# File 'lib/asciidoctor/html/template.rb', line 95

def self.footer(authors)
  <<~HTML
    <footer class="footer">
      <div class="footer-left">&#169; <span id="cr-year"></span> #{authors}</div>
      <div class="footer-right">Built with
        <a href="https://github.com/ravirajani/asciidoctor-html">asciidoctor-html</a>
      </div>
    </footer>
  HTML
end

.head(title, description, authors, langs) ⇒ Object



112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
# File 'lib/asciidoctor/html/template.rb', line 112

def self.head(title, description, authors, langs)
  <<~HTML
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    #{%(<meta name="description" content="#{description}">) if description}
    #{%(<meta name="author" content="#{authors}">) if authors}
    <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" crossorigin="anonymous">
    <link rel="stylesheet" href="#{CSS_PATH}/styles.css">
    <link rel="stylesheet" href="#{Highlightjs::CDN_PATH}/styles/tomorrow-night-blue.min.css">
    <script defer src="#{Highlightjs::CDN_PATH}/highlight.min.js"></script>
    #{highlightjs langs}
    <script>
      MathJax = {
        tex: {
          inlineMath: {'[+]': [['$', '$']]}
        }
      };
    </script>
    <script defer src="https://cdn.jsdelivr.net/npm/mathjax@4/tex-chtml.js"></script>
    <script defer src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.6/dist/js/bootstrap.bundle.min.js"
          integrity="sha384-j1CDi7MgGQ12Z7Qab0qlWQ/Qqz24Gc6BM0thvEMVjHnfYGF0rmFCozFSxQBxwHKO"
          crossorigin="anonymous"></script>
  HTML
end

.header(title, short_title) ⇒ Object



86
87
88
89
90
91
92
93
# File 'lib/asciidoctor/html/template.rb', line 86

def self.header(title, short_title)
  <<~HTML
    <header class="header">
      <a class="home d-none d-sm-block" href="./">#{title}</a>
      <a class="home d-block d-sm-none" href="./">#{short_title}</a>
    </header>
  HTML
end

.highlightjs(langs) ⇒ Object



106
107
108
109
110
# File 'lib/asciidoctor/html/template.rb', line 106

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

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

opts:

  • title: String

  • short_title: String

  • authors: String

  • description: String

  • chapheading: String

  • chapsubheading: String

  • langs: Array

  • at_head_end: String

  • at_body_end: String



151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
# File 'lib/asciidoctor/html/template.rb', line 151

def self.html(content, nav_items, opts = {})
  nav = (nav_items.size > 1)
  <<~HTML
    <!DOCTYPE html>
    <html lang="en">
    <head>
    #{head opts[:title], opts[:description], opts[:authors], opts[:langs]}
    #{opts[:at_head_end]}
    </head>
    <body>
    #{sidebar(nav_items) if nav}
    <div id="page" class="page">
    #{MENU_BTN if nav}
    #{header opts[:title], opts[:short_title]}
    #{main content:, **opts}
    </div> <!-- .page -->
    <script>document.getElementById("cr-year").textContent = (new Date()).getFullYear();</script>
    <script type="module">
    #{Highlightjs::PLUGIN}
    #{Popovers::POPOVERS}
    #{Sidebar::TOGGLE if nav}
    #{Scroll::SCROLL}
    </script>
    #{opts[:at_body_end]}
    </body>
    </html>
  HTML
end

.main(opts) ⇒ Object

opts:

  • chapheading: String

  • chapsubheading: String

  • content: String

  • authors: String

  • date: Date



55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/asciidoctor/html/template.rb', line 55

def self.main(opts)
  <<~HTML
    <main id="main" class="main">
    <div id="content-container" class="content-container">
    #{%(<h1 class="chapheading">#{opts[:chapheading]}</h1>) if opts[:chapheading]}
    <h1 class="chaptitle">#{opts[:chapsubheading]}</h1>
    #{opts[:content]}
    #{footer opts[:authors]}
    </div>
    </main>
  HTML
end


20
21
22
23
24
25
# File 'lib/asciidoctor/html/template.rb', line 20

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


27
28
29
30
31
# File 'lib/asciidoctor/html/template.rb', line 27

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

  %(<div class="nav-mark">#{chapprefix}</div>#{chaptitle})
end


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

def self.sidebar(nav_items)
  <<~HTML
    <div id="sidebar" class="sidebar">
    <button id="sidebar-dismiss-btn" class="btn dismiss"><i class="bi bi-x-lg"></i></button>
    <nav><ul>
    #{nav_items.join "\n"}
    </ul></nav>
    </div> <!-- .sidebar -->
  HTML
end

.sitemap(entries) ⇒ Object



68
69
70
71
72
73
74
75
76
# File 'lib/asciidoctor/html/template.rb', line 68

def self.sitemap(entries)
  <<~XML
    <?xml version="1.0" encoding="UTF-8"?>
    <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">

    #{entries.join "\n"}
    </urlset>
  XML
end

.sitemap_entry(url) ⇒ Object



78
79
80
81
82
83
84
# File 'lib/asciidoctor/html/template.rb', line 78

def self.sitemap_entry(url)
  <<~XML
    <url>
      <loc>#{url}</loc>
    </url>
  XML
end