madness 1.2.4 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +38 -16
  3. data/app/public/css/main.css +652 -401
  4. data/app/public/css/main.css.map +17 -19
  5. data/app/public/js/theme.js +81 -0
  6. data/app/public/js/vendor/mermaid.min.js +2223 -847
  7. data/app/styles/_anchor.scss +11 -3
  8. data/app/styles/_breadcrumbs.scss +8 -1
  9. data/app/styles/_code.scss +26 -8
  10. data/app/styles/_footnotes.scss +29 -0
  11. data/app/styles/_general.scss +6 -3
  12. data/app/styles/_image.scss +18 -0
  13. data/app/styles/_keyboard.scss +6 -4
  14. data/app/styles/_manifest.scss +1 -2
  15. data/app/styles/_nav.scss +200 -16
  16. data/app/styles/_pandoc_code.scss +55 -51
  17. data/app/styles/_rouge.scss +57 -211
  18. data/app/styles/_scrollbar.scss +17 -3
  19. data/app/styles/_search.scss +20 -8
  20. data/app/styles/_table.scss +6 -5
  21. data/app/styles/_typography.scss +44 -16
  22. data/app/styles/_variables.scss +216 -35
  23. data/app/views/_icon.slim +23 -0
  24. data/app/views/_mobile_search.slim +1 -1
  25. data/app/views/_nav.slim +18 -8
  26. data/app/views/_nav_tree.slim +13 -0
  27. data/app/views/layout.slim +26 -1
  28. data/lib/madness/directory.rb +8 -0
  29. data/lib/madness/document.rb +1 -0
  30. data/lib/madness/inline_table_of_contents.rb +1 -0
  31. data/lib/madness/item.rb +2 -0
  32. data/lib/madness/markdown_document.rb +1 -0
  33. data/lib/madness/navigation.rb +25 -0
  34. data/lib/madness/rendering/pandoc.rb +2 -1
  35. data/lib/madness/rendering/redcarpet_custom.rb +6 -1
  36. data/lib/madness/search.rb +1 -0
  37. data/lib/madness/server.rb +1 -1
  38. data/lib/madness/settings.rb +3 -3
  39. data/lib/madness/templates/madness.yml +7 -2
  40. data/lib/madness/version.rb +1 -1
  41. metadata +10 -20
  42. data/app/public/font/fontello.eot +0 -0
  43. data/app/public/font/fontello.svg +0 -16
  44. data/app/public/font/fontello.ttf +0 -0
  45. data/app/public/font/fontello.woff +0 -0
  46. data/app/public/font/fontello.woff2 +0 -0
  47. data/app/styles/_fontello.scss +0 -59
  48. data/lib/madness/refinements/hash_refinements.rb +0 -14
@@ -1,39 +1,220 @@
1
+ // Theme variables.
2
+ //
3
+ // Light palette lives on :root. Dark palette overrides apply when either the
4
+ // system prefers dark OR the user has explicitly chosen dark via the toggle
5
+ // (data-theme="dark" on <html>). An explicit data-theme="light" wins back
6
+ // even when the system prefers dark.
7
+
1
8
  :root {
2
- --background-color: #fff;
3
- --blockquote-border-color: #ddd;
4
- --blockquote-color: #777;
5
- --breadcrumbs-border-color: #ccc;
6
- --code-border-color: #ddd;
7
- --font-color: #333;
8
- --font-family: "Segoe UI", "Helvetica Neue", Helvetica,Arial, freesans, sans-serif;
9
- --font-family-monospace: Consolas, "Liberation Mono", Menlo, Courier, monospace;
10
- --footnotes-color: #666;
11
- --h1-border-color: #eee;
12
- --h1-color: #333;
13
- --h2-border-color: #eee;
14
- --h2-color: #333;
15
- --h3-color: #333;
16
- --h4-color: #333;
17
- --h5-color: #333;
18
- --h6-color: #777;
19
- --highlight-color: palegreen;
20
- --hr-color: #ddd;
21
- --inline-code-bg-color: #eee;
22
- --kbd-bg-color: #fcfcfc;
23
- --kbd-border-color: #ccc;
24
- --kbd-color: #111;
25
- --kbd-shadow-color: #bbb;
26
- --link-color: #4078c0;
27
- --quiet-color: #777;
28
- --scrollbar-color: #ccc;
29
- --search-field-border-color: #ccc;
30
- --search-field-focused-border-color: #4078c0;
31
- --sidebar-bg-color: #fff;
32
- --sidebar-border-color: #ddd;
33
- --sidebar-border-right-color: #ddd;
34
- --table-alt-row-bg-color: transparent;
9
+ color-scheme: light dark;
10
+
11
+ // Surfaces
12
+ --background-color: #fdfdfd;
13
+ --sidebar-bg-color: #fafafa;
14
+ --sidebar-border-color: #ececec;
15
+ --sidebar-border-right-color: #e4e4e4;
16
+ --sidebar-hover-bg-color: #f0f0f0;
17
+ --sidebar-active-bg-color: #eef3fb;
18
+
19
+ // Typography
20
+ --font-color: #1f2328;
21
+ --font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif;
22
+ --font-family-monospace: ui-monospace, "SFMono-Regular", "SF Mono", Consolas, "Liberation Mono", Menlo, monospace;
23
+ --quiet-color: #656d76;
24
+ --footnotes-color: #656d76;
25
+
26
+ // Headings
27
+ --h1-color: #1f2328;
28
+ --h1-border-color: #eaeef2;
29
+ --h2-color: #1f2328;
30
+ --h2-border-color: #eaeef2;
31
+ --h3-color: #1f2328;
32
+ --h4-color: #1f2328;
33
+ --h5-color: #1f2328;
34
+ --h6-color: #656d76;
35
+
36
+ // Links
37
+ --link-color: #0969da;
38
+ --link-hover-color: #0550ae;
39
+
40
+ // Code
41
+ --code-border-color: #eaeef2;
42
+ --code-bg-color: #f6f8fa;
43
+ --inline-code-bg-color: #f6f8fa;
44
+ --inline-code-color: #1f2328;
45
+
46
+ // Blockquote
47
+ --blockquote-color: #656d76;
48
+ --blockquote-border-color: #d0d7de;
49
+
50
+ // Tables
51
+ --table-border-color: #eaeef2;
35
52
  --table-bg-color: transparent;
36
- --table-border-color: #ddd;
37
- --table-header-bg-color: transparent;
53
+ --table-header-bg-color: #f6f8fa;
38
54
  --table-row-bg-color: transparent;
55
+ --table-alt-row-bg-color: #fafbfc;
56
+
57
+ // Search
58
+ --search-field-bg-color: #ffffff;
59
+ --search-field-border-color: #d0d7de;
60
+ --search-field-focused-border-color: #0969da;
61
+ --search-field-shadow-color: rgba(9, 105, 218, 0.18);
62
+
63
+ // Keyboard
64
+ --kbd-color: #1f2328;
65
+ --kbd-bg-color: #f6f8fa;
66
+ --kbd-border-color: #d0d7de;
67
+ --kbd-shadow-color: #afb8c1;
68
+
69
+ // Misc
70
+ --highlight-color: #fff8c5;
71
+ --highlight-text-color: #1f2328;
72
+ --hr-color: #eaeef2;
73
+ --scrollbar-color: #d0d7de;
74
+ --scrollbar-hover-color: #afb8c1;
75
+ --breadcrumbs-border-color: #eaeef2;
76
+ --selection-bg-color: rgba(9, 105, 218, 0.20);
77
+ --selection-color: inherit;
78
+ --focus-ring-color: rgba(9, 105, 218, 0.40);
79
+
80
+ // Rouge syntax (light — derived from GitHub light)
81
+ --rouge-bg: var(--code-bg-color);
82
+ --rouge-fg: #1f2328;
83
+ --rouge-comment: #6e7781;
84
+ --rouge-comment-strong: #6e7781;
85
+ --rouge-error-fg: #82071e;
86
+ --rouge-error-bg: #ffebe9;
87
+ --rouge-keyword: #cf222e;
88
+ --rouge-operator: #cf222e;
89
+ --rouge-name: #1f2328;
90
+ --rouge-name-attribute: #116329;
91
+ --rouge-name-builtin: #953800;
92
+ --rouge-name-class: #953800;
93
+ --rouge-name-constant: #0550ae;
94
+ --rouge-name-function: #8250df;
95
+ --rouge-name-tag: #116329;
96
+ --rouge-name-variable: #953800;
97
+ --rouge-literal-string: #0a3069;
98
+ --rouge-literal-number: #0550ae;
99
+ --rouge-literal-regex: #0a3069;
100
+ --rouge-generic-deleted-fg: #82071e;
101
+ --rouge-generic-deleted-bg: #ffebe9;
102
+ --rouge-generic-inserted-fg: #116329;
103
+ --rouge-generic-inserted-bg: #dafbe1;
104
+ --rouge-generic-heading: #0550ae;
105
+ --rouge-generic-subheading: #0550ae;
106
+ --rouge-line-number: #8c959f;
107
+ }
108
+
109
+ // Manual override: user picked light.
110
+ :root[data-theme="light"] {
111
+ // Inherits :root defaults. Block exists so dark @media doesn't override it.
112
+ }
113
+
114
+ @mixin dark-palette {
115
+ color-scheme: dark;
116
+
117
+ // Surfaces
118
+ --background-color: #0d1117;
119
+ --sidebar-bg-color: #010409;
120
+ --sidebar-border-color: #21262d;
121
+ --sidebar-border-right-color: #21262d;
122
+ --sidebar-hover-bg-color: #161b22;
123
+ --sidebar-active-bg-color: #1f2937;
124
+
125
+ // Typography
126
+ --font-color: #e6edf3;
127
+ --quiet-color: #8d96a0;
128
+ --footnotes-color: #8d96a0;
129
+
130
+ // Headings
131
+ --h1-color: #f0f6fc;
132
+ --h1-border-color: #21262d;
133
+ --h2-color: #f0f6fc;
134
+ --h2-border-color: #21262d;
135
+ --h3-color: #f0f6fc;
136
+ --h4-color: #f0f6fc;
137
+ --h5-color: #f0f6fc;
138
+ --h6-color: #8d96a0;
139
+
140
+ // Links
141
+ --link-color: #58a6ff;
142
+ --link-hover-color: #79b8ff;
143
+
144
+ // Code
145
+ --code-border-color: #30363d;
146
+ --code-bg-color: #161b22;
147
+ --inline-code-bg-color: rgba(110, 118, 129, 0.30);
148
+ --inline-code-color: #e6edf3;
149
+
150
+ // Blockquote
151
+ --blockquote-color: #8d96a0;
152
+ --blockquote-border-color: #30363d;
153
+
154
+ // Tables
155
+ --table-border-color: #30363d;
156
+ --table-header-bg-color: #161b22;
157
+ --table-alt-row-bg-color: #0f1419;
158
+
159
+ // Search
160
+ --search-field-bg-color: #0d1117;
161
+ --search-field-border-color: #30363d;
162
+ --search-field-focused-border-color: #58a6ff;
163
+ --search-field-shadow-color: rgba(88, 166, 255, 0.25);
164
+
165
+ // Keyboard
166
+ --kbd-color: #e6edf3;
167
+ --kbd-bg-color: #161b22;
168
+ --kbd-border-color: #30363d;
169
+ --kbd-shadow-color: #30363d;
170
+
171
+ // Misc
172
+ --highlight-color: rgba(187, 128, 9, 0.40);
173
+ --highlight-text-color: #f0f6fc;
174
+ --hr-color: #21262d;
175
+ --scrollbar-color: #30363d;
176
+ --scrollbar-hover-color: #484f58;
177
+ --breadcrumbs-border-color: #21262d;
178
+ --selection-bg-color: rgba(56, 139, 253, 0.30);
179
+ --focus-ring-color: rgba(88, 166, 255, 0.45);
180
+
181
+ // Rouge syntax (dark — derived from GitHub dark)
182
+ --rouge-bg: var(--code-bg-color);
183
+ --rouge-fg: #e6edf3;
184
+ --rouge-comment: #8b949e;
185
+ --rouge-comment-strong: #8b949e;
186
+ --rouge-error-fg: #ffa198;
187
+ --rouge-error-bg: rgba(248, 81, 73, 0.15);
188
+ --rouge-keyword: #ff7b72;
189
+ --rouge-operator: #ff7b72;
190
+ --rouge-name: #e6edf3;
191
+ --rouge-name-attribute: #7ee787;
192
+ --rouge-name-builtin: #ffa657;
193
+ --rouge-name-class: #ffa657;
194
+ --rouge-name-constant: #79c0ff;
195
+ --rouge-name-function: #d2a8ff;
196
+ --rouge-name-tag: #7ee787;
197
+ --rouge-name-variable: #ffa657;
198
+ --rouge-literal-string: #a5d6ff;
199
+ --rouge-literal-number: #79c0ff;
200
+ --rouge-literal-regex: #7ee787;
201
+ --rouge-generic-deleted-fg: #ffdcd7;
202
+ --rouge-generic-deleted-bg: rgba(248, 81, 73, 0.15);
203
+ --rouge-generic-inserted-fg: #aff5b4;
204
+ --rouge-generic-inserted-bg: rgba(46, 160, 67, 0.15);
205
+ --rouge-generic-heading: #79c0ff;
206
+ --rouge-generic-subheading: #79c0ff;
207
+ --rouge-line-number: #6e7681;
208
+ }
209
+
210
+ // System dark — apply unless user explicitly chose light.
211
+ @media (prefers-color-scheme: dark) {
212
+ :root:not([data-theme="light"]) {
213
+ @include dark-palette;
214
+ }
215
+ }
216
+
217
+ // Manual dark override — wins over system preference.
218
+ :root[data-theme="dark"] {
219
+ @include dark-palette;
39
220
  }
@@ -0,0 +1,23 @@
1
+ - case name.to_sym
2
+ - when :home
3
+ svg.icon-svg viewBox="0 0 24 24" aria-hidden="true"
4
+ path d="M3 10.75 12 3l9 7.75"
5
+ path d="M5 9.25V21h5v-6h4v6h5V9.25"
6
+ - when :search
7
+ svg.icon-svg viewBox="0 0 24 24" aria-hidden="true"
8
+ circle cx="11" cy="11" r="7"
9
+ line x1="16.5" y1="16.5" x2="21" y2="21"
10
+ - when :moon
11
+ svg.icon-svg.icon-moon viewBox="0 0 24 24" aria-hidden="true"
12
+ path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"
13
+ - when :sun
14
+ svg.icon-svg.icon-sun viewBox="0 0 24 24" aria-hidden="true"
15
+ circle cx="12" cy="12" r="4"
16
+ line x1="12" y1="2" x2="12" y2="4"
17
+ line x1="12" y1="20" x2="12" y2="22"
18
+ line x1="2" y1="12" x2="4" y2="12"
19
+ line x1="20" y1="12" x2="22" y2="12"
20
+ line x1="4.93" y1="4.93" x2="6.34" y2="6.34"
21
+ line x1="17.66" y1="17.66" x2="19.07" y2="19.07"
22
+ line x1="4.93" y1="19.07" x2="6.34" y2="17.66"
23
+ line x1="17.66" y1="6.34" x2="19.07" y2="4.93"
@@ -1,2 +1,2 @@
1
1
  a#mobile-search href="#{config.base_uri}/_search"
2
- i.icon-search
2
+ == slim :_icon, locals: { name: :search }
data/app/views/_nav.slim CHANGED
@@ -1,15 +1,25 @@
1
1
  nav
2
2
  .icon-bar
3
- a.icon href="#{config.base_uri}/" accesskey='h' class=('wide' unless nav.with_search?)
4
- i.icon-home
3
+ a.icon href="#{config.base_uri}/" accesskey='h' title="Home"
4
+ == slim :_icon, locals: { name: :home }
5
5
 
6
6
  - if nav.with_search?
7
- a.icon href="#{config.base_uri}/_search" accesskey='s' style='text-align:right'
8
- i.icon-search
7
+ a.icon href="#{config.base_uri}/_search" accesskey='s' title="Search"
8
+ == slim :_icon, locals: { name: :search }
9
9
 
10
- - if nav.caption
10
+ .icon-spacer
11
+
12
+ a.icon.theme-toggle href="#" role="button" aria-label="Toggle dark mode" title="Toggle theme"
13
+ == slim :_icon, locals: { name: :moon }
14
+ == slim :_icon, locals: { name: :sun }
15
+
16
+
17
+ - if nav.caption && !nav.tree?
11
18
  .caption = "#{nav.caption}:"
12
19
 
13
- - nav.links.each do |item|
14
- a.document href="#{item.href}" class=('strong' if item.type == :dir)
15
- = item.label
20
+ - if nav.tree?
21
+ == slim :_nav_tree, locals: { items: nav.tree, current_path: nav.current_path }
22
+ - else
23
+ - nav.links.each do |item|
24
+ a.document href="#{item.href}" class=('strong' if item.type == :dir)
25
+ = item.label
@@ -0,0 +1,13 @@
1
+ - items.each do |item|
2
+ - if item.dir? && item.children && item.children.any?
3
+ - is_open = current_path == item.path || current_path.start_with?("#{item.path}/")
4
+ details.tree-folder open=is_open
5
+ summary.tree-summary
6
+ span.tree-chevron aria-hidden="true"
7
+ a.document.strong href="#{item.href}" = item.label
8
+ .tree-children
9
+ == slim :_nav_tree, locals: { items: item.children, current_path: current_path }
10
+ - elsif item.dir?
11
+ a.document.strong href="#{item.href}" = item.label
12
+ - else
13
+ a.document href="#{item.href}" = item.label
@@ -8,6 +8,16 @@ html
8
8
  title = locals[:title]
9
9
  meta name="HandheldFriendly" content="true"
10
10
  meta name="viewport" content="width=device-width, initial-scale=1"
11
+ meta name="color-scheme" content="light dark"
12
+ javascript:
13
+ (function () {
14
+ try {
15
+ var stored = localStorage.getItem('madness-theme');
16
+ if (stored === 'dark' || stored === 'light') {
17
+ document.documentElement.setAttribute('data-theme', stored);
18
+ }
19
+ } catch (e) {}
20
+ })();
11
21
  link href='#{config.base_uri}/css/main.css' rel='stylesheet' type='text/css'
12
22
  - custom_css.each do |file|
13
23
  link href="#{config.base_uri}/#{file}" rel='stylesheet' type='text/css'
@@ -20,7 +30,22 @@ html
20
30
  - if config.mermaid
21
31
  script src="#{config.base_uri}/js/vendor/mermaid.min.js"
22
32
  javascript:
23
- mermaid.initialize({startOnLoad:true});
33
+ (function () {
34
+ function currentTheme() {
35
+ var t = document.documentElement.getAttribute('data-theme');
36
+ if (t) return t;
37
+ return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
38
+ }
39
+ window.mermaid.initialize({
40
+ startOnLoad: true,
41
+ theme: currentTheme() === 'dark' ? 'dark' : 'default'
42
+ });
43
+ })();
44
+
45
+ script src="#{config.base_uri}/js/theme.js" defer=true
24
46
 
25
47
  body
26
48
  == yield
49
+ a.floating-theme-toggle href="#" role="button" aria-label="Toggle dark mode" title="Toggle theme"
50
+ == slim :_icon, locals: { name: :moon }
51
+ == slim :_icon, locals: { name: :sun }
@@ -2,6 +2,7 @@ module Madness
2
2
  # Represents a directory with markdown file sand subflders.
3
3
  class Directory
4
4
  include ServerHelper
5
+
5
6
  using ArrayRefinements
6
7
  using StringRefinements
7
8
 
@@ -15,6 +16,13 @@ module Madness
15
16
  @list ||= (dirs + files)
16
17
  end
17
18
 
19
+ def tree
20
+ @tree ||= list.map do |item|
21
+ item.children = self.class.new(item.path).tree if item.dir?
22
+ item
23
+ end
24
+ end
25
+
18
26
  private
19
27
 
20
28
  def files
@@ -2,6 +2,7 @@ module Madness
2
2
  # Handle a single document path.
3
3
  class Document
4
4
  include ServerHelper
5
+
5
6
  using StringRefinements
6
7
 
7
8
  attr_reader :base, :path, :type, :file, :dir, :title
@@ -2,6 +2,7 @@ module Madness
2
2
  # Generate a markdown Table of Contents for a single document
3
3
  class InlineTableOfContents
4
4
  include ServerHelper
5
+
5
6
  using StringRefinements
6
7
 
7
8
  attr_reader :text
data/lib/madness/item.rb CHANGED
@@ -1,9 +1,11 @@
1
1
  module Madness
2
2
  class Item
3
3
  include ServerHelper
4
+
4
5
  using StringRefinements
5
6
 
6
7
  attr_reader :path, :type
8
+ attr_accessor :children
7
9
 
8
10
  def initialize(path, type)
9
11
  @path = path
@@ -4,6 +4,7 @@ module Madness
4
4
  # Handle a pure markdown document.
5
5
  class MarkdownDocument
6
6
  include ServerHelper
7
+
7
8
  using StringRefinements
8
9
 
9
10
  attr_reader :markdown, :title
@@ -2,6 +2,7 @@ module Madness
2
2
  # Handle the navigation links for a given directory
3
3
  class Navigation
4
4
  include ServerHelper
5
+
5
6
  using ArrayRefinements
6
7
  using StringRefinements
7
8
 
@@ -19,6 +20,18 @@ module Madness
19
20
  end
20
21
  end
21
22
 
23
+ def tree?
24
+ config.nav_tree
25
+ end
26
+
27
+ def tree
28
+ @tree ||= sort_tree(root_directory.tree)
29
+ end
30
+
31
+ def current_path
32
+ dir
33
+ end
34
+
22
35
  def caption
23
36
  @caption ||= (dir == docroot ? 'Index' : File.basename(dir).to_label)
24
37
  end
@@ -33,6 +46,18 @@ module Madness
33
46
  @directory ||= Directory.new(dir)
34
47
  end
35
48
 
49
+ def root_directory
50
+ @root_directory ||= Directory.new(docroot)
51
+ end
52
+
53
+ def sort_tree(items)
54
+ sorted = config.sort_order == 'mixed' ? items.nat_sort(by: :href) : items
55
+ sorted.each do |item|
56
+ item.children = sort_tree(item.children) if item.dir? && item.children
57
+ end
58
+ sorted
59
+ end
60
+
36
61
  def config
37
62
  Settings.instance
38
63
  end
@@ -1,3 +1,4 @@
1
+ require 'cgi'
1
2
  require 'pandoc-ruby'
2
3
 
3
4
  module Madness
@@ -18,7 +19,7 @@ module Madness
18
19
 
19
20
  def process_mermaid_blocks(text)
20
21
  text.gsub(/```mermaid\s+(.+?)\s+```/m) do
21
- "<div class='mermaid'>#{$1.strip}</div>"
22
+ "<div class='mermaid'>#{CGI.escapeHTML($1.strip)}</div>"
22
23
  end
23
24
  end
24
25
  end
@@ -1,3 +1,4 @@
1
+ require 'cgi'
1
2
  require 'redcarpet'
2
3
  require 'rouge'
3
4
  require 'rouge/plugins/redcarpet'
@@ -9,7 +10,11 @@ module Madness
9
10
 
10
11
  def block_code(code, language)
11
12
  if language == 'mermaid'
12
- "<div class='mermaid'>#{code}</div>"
13
+ # Escape HTML so diagrams using < > characters (class diagrams with
14
+ # <|-- realization arrows, <<interface>> annotations, etc.) survive
15
+ # the browser's HTML parser. Mermaid reads .textContent, which gives
16
+ # back the decoded source.
17
+ "<div class='mermaid'>#{CGI.escapeHTML(code)}</div>"
13
18
  else
14
19
  super
15
20
  end
@@ -3,6 +3,7 @@ require 'shellwords'
3
3
  module Madness
4
4
  class Search
5
5
  include ServerHelper
6
+
6
7
  using StringRefinements
7
8
 
8
9
  def initialize(path = nil)
@@ -42,7 +42,7 @@ module Madness
42
42
  nav = Navigation.new dir
43
43
  breadcrumbs = Breadcrumbs.new(path).links
44
44
 
45
- if (nav.links.count == 1) && (doc.type == :empty)
45
+ if nav.links.one? && doc.type == :empty
46
46
  redirect to(nav.links.first.href)
47
47
  end
48
48
 
@@ -9,7 +9,6 @@ module Madness
9
9
  # 3. Any override provided later (for example, by the CommandLine class)
10
10
  class Settings
11
11
  include Singleton
12
- using HashRefinements
13
12
 
14
13
  def initialize
15
14
  reset
@@ -60,11 +59,12 @@ module Madness
60
59
  base_uri: nil,
61
60
  sort_order: 'dirs_first',
62
61
  sidebar: true,
62
+ nav_tree: false,
63
63
  auto_h1: true,
64
64
  auto_nav: true,
65
65
  auto_toc: true,
66
66
  highlighter: true,
67
- mermaid: false,
67
+ mermaid: true,
68
68
  copy_code: true,
69
69
  shortlinks: false,
70
70
  source_link: nil,
@@ -84,7 +84,7 @@ module Madness
84
84
 
85
85
  def file_data
86
86
  result = if file_exist?
87
- ExtendedYAML.load(filename)&.symbolize_keys
87
+ ExtendedYAML.load(filename)&.transform_keys(&:to_sym)
88
88
  else
89
89
  {}
90
90
  end
@@ -28,6 +28,11 @@ sort_order: dirs_first
28
28
  # enable sidebar
29
29
  sidebar: true
30
30
 
31
+ # render the sidebar as a recursive tree of the entire docroot, with
32
+ # collapsible folders. when false, the sidebar shows only the current
33
+ # folder's immediate children.
34
+ nav_tree: false
35
+
31
36
  # add H1 title to files that do not have one
32
37
  auto_h1: true
33
38
 
@@ -43,8 +48,8 @@ auto_toc: true
43
48
  highlighter: true
44
49
 
45
50
  # enable mermaid diagramming and charting
46
- # put your diagram code inside <div class='mermaid'>...</div>
47
- mermaid: false
51
+ # put your diagram code inside ```mermaid ... ``` code fence
52
+ mermaid: true
48
53
 
49
54
  # enable the copy to clipboard icon for code snippets
50
55
  copy_code: true
@@ -1,3 +1,3 @@
1
1
  module Madness
2
- VERSION = '1.2.4'
2
+ VERSION = '1.3.0'
3
3
  end