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.
- checksums.yaml +4 -4
- data/README.md +38 -16
- data/app/public/css/main.css +652 -401
- data/app/public/css/main.css.map +17 -19
- data/app/public/js/theme.js +81 -0
- data/app/public/js/vendor/mermaid.min.js +2223 -847
- data/app/styles/_anchor.scss +11 -3
- data/app/styles/_breadcrumbs.scss +8 -1
- data/app/styles/_code.scss +26 -8
- data/app/styles/_footnotes.scss +29 -0
- data/app/styles/_general.scss +6 -3
- data/app/styles/_image.scss +18 -0
- data/app/styles/_keyboard.scss +6 -4
- data/app/styles/_manifest.scss +1 -2
- data/app/styles/_nav.scss +200 -16
- data/app/styles/_pandoc_code.scss +55 -51
- data/app/styles/_rouge.scss +57 -211
- data/app/styles/_scrollbar.scss +17 -3
- data/app/styles/_search.scss +20 -8
- data/app/styles/_table.scss +6 -5
- data/app/styles/_typography.scss +44 -16
- data/app/styles/_variables.scss +216 -35
- data/app/views/_icon.slim +23 -0
- data/app/views/_mobile_search.slim +1 -1
- data/app/views/_nav.slim +18 -8
- data/app/views/_nav_tree.slim +13 -0
- data/app/views/layout.slim +26 -1
- data/lib/madness/directory.rb +8 -0
- data/lib/madness/document.rb +1 -0
- data/lib/madness/inline_table_of_contents.rb +1 -0
- data/lib/madness/item.rb +2 -0
- data/lib/madness/markdown_document.rb +1 -0
- data/lib/madness/navigation.rb +25 -0
- data/lib/madness/rendering/pandoc.rb +2 -1
- data/lib/madness/rendering/redcarpet_custom.rb +6 -1
- data/lib/madness/search.rb +1 -0
- data/lib/madness/server.rb +1 -1
- data/lib/madness/settings.rb +3 -3
- data/lib/madness/templates/madness.yml +7 -2
- data/lib/madness/version.rb +1 -1
- metadata +10 -20
- data/app/public/font/fontello.eot +0 -0
- data/app/public/font/fontello.svg +0 -16
- data/app/public/font/fontello.ttf +0 -0
- data/app/public/font/fontello.woff +0 -0
- data/app/public/font/fontello.woff2 +0 -0
- data/app/styles/_fontello.scss +0 -59
- data/lib/madness/refinements/hash_refinements.rb +0 -14
data/app/styles/_variables.scss
CHANGED
|
@@ -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
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
--
|
|
6
|
-
--
|
|
7
|
-
--
|
|
8
|
-
--
|
|
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
|
-
--
|
|
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-
|
|
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
|
-
|
|
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'
|
|
4
|
-
|
|
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'
|
|
8
|
-
|
|
7
|
+
a.icon href="#{config.base_uri}/_search" accesskey='s' title="Search"
|
|
8
|
+
== slim :_icon, locals: { name: :search }
|
|
9
9
|
|
|
10
|
-
|
|
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.
|
|
14
|
-
|
|
15
|
-
|
|
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
|
data/app/views/layout.slim
CHANGED
|
@@ -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
|
-
|
|
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 }
|
data/lib/madness/directory.rb
CHANGED
|
@@ -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
|
data/lib/madness/document.rb
CHANGED
data/lib/madness/item.rb
CHANGED
data/lib/madness/navigation.rb
CHANGED
|
@@ -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
|
-
|
|
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
|
data/lib/madness/search.rb
CHANGED
data/lib/madness/server.rb
CHANGED
data/lib/madness/settings.rb
CHANGED
|
@@ -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:
|
|
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)&.
|
|
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
|
|
47
|
-
mermaid:
|
|
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
|
data/lib/madness/version.rb
CHANGED