@mgks/docmd 0.3.7 → 0.3.9

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 (72) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +61 -63
  3. package/bin/docmd.js +13 -16
  4. package/bin/postinstall.js +4 -4
  5. package/package.json +13 -11
  6. package/src/assets/css/docmd-highlight-dark.css +86 -1
  7. package/src/assets/css/docmd-highlight-light.css +86 -1
  8. package/src/assets/css/docmd-main.css +574 -465
  9. package/src/assets/css/docmd-theme-retro.css +105 -106
  10. package/src/assets/css/docmd-theme-ruby.css +92 -92
  11. package/src/assets/css/docmd-theme-sky.css +63 -64
  12. package/src/assets/favicon.ico +0 -0
  13. package/src/assets/images/docmd-logo-dark.png +0 -0
  14. package/src/assets/images/docmd-logo-light.png +0 -0
  15. package/src/assets/js/docmd-image-lightbox.js +2 -2
  16. package/src/assets/js/docmd-main.js +39 -1
  17. package/src/assets/js/docmd-mermaid.js +1 -1
  18. package/src/assets/js/docmd-search.js +1 -1
  19. package/src/commands/build.js +71 -370
  20. package/src/commands/dev.js +141 -80
  21. package/src/commands/init.js +107 -132
  22. package/src/commands/live.js +145 -0
  23. package/src/core/asset-manager.js +72 -0
  24. package/src/core/config-loader.js +3 -2
  25. package/src/core/config-validator.js +1 -1
  26. package/src/core/file-processor.js +13 -9
  27. package/src/core/fs-utils.js +40 -0
  28. package/src/core/html-generator.js +68 -77
  29. package/src/core/icon-renderer.js +1 -1
  30. package/src/core/logger.js +1 -1
  31. package/src/core/markdown/containers.js +1 -1
  32. package/src/core/markdown/renderers.js +1 -1
  33. package/src/core/markdown/rules.js +138 -91
  34. package/src/core/markdown/setup.js +9 -20
  35. package/src/core/navigation-helper.js +52 -40
  36. package/src/index.js +12 -0
  37. package/src/live/core.js +5 -1
  38. package/src/live/index.html +16 -1
  39. package/src/live/live.css +157 -68
  40. package/src/plugins/analytics.js +1 -1
  41. package/src/plugins/seo.js +26 -36
  42. package/src/plugins/sitemap.js +2 -2
  43. package/src/templates/layout.ejs +50 -81
  44. package/src/templates/navigation.ejs +23 -76
  45. package/src/templates/no-style.ejs +115 -129
  46. package/src/templates/partials/theme-init.js +12 -12
  47. package/src/templates/toc.ejs +6 -35
  48. package/dist/assets/css/docmd-highlight-dark.css +0 -1
  49. package/dist/assets/css/docmd-highlight-light.css +0 -1
  50. package/dist/assets/css/docmd-main.css +0 -1627
  51. package/dist/assets/css/docmd-theme-retro.css +0 -868
  52. package/dist/assets/css/docmd-theme-ruby.css +0 -629
  53. package/dist/assets/css/docmd-theme-sky.css +0 -618
  54. package/dist/assets/favicon.ico +0 -0
  55. package/dist/assets/images/docmd-logo-dark.png +0 -0
  56. package/dist/assets/images/docmd-logo-light.png +0 -0
  57. package/dist/assets/images/docmd-logo.png +0 -0
  58. package/dist/assets/js/docmd-image-lightbox.js +0 -74
  59. package/dist/assets/js/docmd-main.js +0 -222
  60. package/dist/assets/js/docmd-mermaid.js +0 -205
  61. package/dist/assets/js/docmd-search.js +0 -218
  62. package/dist/assets/js/mermaid.min.js +0 -2811
  63. package/dist/assets/js/minisearch.js +0 -2013
  64. package/dist/docmd-live.js +0 -30748
  65. package/dist/index.html +0 -201
  66. package/dist/live.css +0 -167
  67. package/docmd.config.js +0 -175
  68. package/scripts/build-live.js +0 -157
  69. package/scripts/failsafe.js +0 -37
  70. package/scripts/test-live.js +0 -54
  71. package/src/assets/images/docmd-logo.png +0 -0
  72. package/src/live/templates.js +0 -9
@@ -1,180 +1,166 @@
1
+ <%# Source file from the docmd project — https://github.com/docmd-io/docmd %>
2
+
1
3
  <!DOCTYPE html>
2
4
  <html lang="en">
3
5
  <head>
4
6
  <meta charset="UTF-8">
5
7
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
-
7
8
  <% if (frontmatter.components?.meta !== false) { %>
8
- <%- metaTagsHtml || '' %>
9
- <title><%= pageTitle %><% if (frontmatter.components?.siteTitle !== false) { %> : <%= siteTitle %><% } %></title>
10
- <% if (description && !(metaTagsHtml && metaTagsHtml.includes('name="description"'))) { %>
11
- <meta name="description" content="<%= description %>">
12
- <% } %>
9
+ <%- metaTagsHtml || '' %>
10
+ <title><%= pageTitle %><% if (frontmatter.components?.siteTitle !== false) { %> : <%= siteTitle %><% } %></title>
11
+ <% if (description && !(metaTagsHtml && metaTagsHtml.includes('name="description"'))) { %>
12
+ <meta name="description" content="<%= description %>">
13
+ <% } %>
13
14
  <% } %>
14
-
15
15
  <% if (frontmatter.components?.favicon !== false) { %>
16
- <%- faviconLinkHtml || '' %>
16
+ <%- faviconLinkHtml || '' %>
17
17
  <% } %>
18
-
19
18
  <% if (frontmatter.components?.themeMode !== false) { %>
20
- <script>window.DOCMD_DEFAULT_MODE = "<%= defaultMode %>";</script>
19
+ <script>window.DOCMD_DEFAULT_MODE = "<%= defaultMode %>";</script>
21
20
  <% } %>
22
-
23
21
  <% if (frontmatter.components?.css !== false) { %>
24
- <link rel="stylesheet" href="<%= relativePathToRoot %>assets/css/docmd-main.css">
25
- <% if (frontmatter.components?.highlight !== false) { %>
26
- <link rel="stylesheet" href="<%= relativePathToRoot %>assets/css/docmd-highlight-<%= defaultMode === 'dark' ? 'dark' : 'light' %>.css" id="highlight-theme">
27
- <% } %>
22
+ <link rel="stylesheet" href="<%= relativePathToRoot %>assets/css/docmd-main.css">
23
+ <% if (frontmatter.components?.highlight !== false) { %>
24
+ <link rel="stylesheet" href="<%= relativePathToRoot %>assets/css/docmd-highlight-<%= defaultMode === 'dark' ? 'dark' : 'light' %>.css" id="highlight-theme">
25
+ <% } %>
28
26
  <% } %>
29
-
30
27
  <% if (frontmatter.components?.themeMode !== false) { %>
31
- <%- themeInitScript %>
28
+ <%- themeInitScript %>
32
29
  <% } %>
33
-
34
30
  <% if (frontmatter.components?.theme !== false) { %>
35
- <%- themeCssLinkHtml || '' %>
31
+ <%- themeCssLinkHtml || '' %>
36
32
  <% } %>
37
-
38
33
  <% if (frontmatter.components?.customCss !== false && customCssFiles && customCssFiles.length > 0) { %>
39
- <% customCssFiles.forEach(cssFile => { %>
40
- <link rel="stylesheet" href="<%= relativePathToRoot %><%- cssFile.startsWith('/') ? cssFile.substring(1) : cssFile %>">
41
- <% }); %>
34
+ <% customCssFiles.forEach(cssFile => { %>
35
+ <link rel="stylesheet" href="<%= relativePathToRoot %><%- cssFile.startsWith('/') ? cssFile.substring(1) : cssFile %>">
36
+ <% }); %>
42
37
  <% } %>
43
-
44
38
  <% if (frontmatter.components?.pluginStyles !== false) { %>
45
- <%- pluginStylesHtml || '' %>
39
+ <%- pluginStylesHtml || '' %>
46
40
  <% } %>
47
-
48
41
  <% if (frontmatter.components?.pluginHeadScripts !== false) { %>
49
- <%- pluginHeadScriptsHtml || '' %>
42
+ <%- pluginHeadScriptsHtml || '' %>
50
43
  <% } %>
51
-
52
44
  <% if (frontmatter.customHead) { %>
53
- <%- frontmatter.customHead %>
45
+ <%- frontmatter.customHead %>
54
46
  <% } %>
55
47
  </head>
56
- <body
57
- <%
58
- if (frontmatter.components?.theme !== false) {
59
- %> data-theme="<%= defaultMode %>"<%
60
- }
61
- %><%
62
- if (frontmatter.bodyClass) {
63
- %> class="<%= frontmatter.bodyClass %>"<%
64
- }
65
- %> data-copy-code-enabled="<%= config.copyCode === true %>">
48
+ <body<% if (frontmatter.components?.theme !== false) { %> data-theme="<%= defaultMode %>"<% } %><% if (frontmatter.bodyClass) { %> class="<%= frontmatter.bodyClass %>"<% } %> data-copy-code-enabled="<%= config.copyCode === true %>">
66
49
  <% if (frontmatter.components?.layout === true || frontmatter.components?.layout === 'full') { %>
67
- <div class="main-content-wrapper">
68
- <% if (frontmatter.components?.header !== false) { %>
69
- <header class="page-header">
70
- <% if (frontmatter.components?.pageTitle !== false) { %>
71
- <h1><%= pageTitle %></h1>
72
- <% } %>
73
- </header>
50
+ <div class="main-content-wrapper">
51
+ <% if (frontmatter.components?.header !== false) { %>
52
+ <header class="page-header">
53
+ <% if (frontmatter.components?.pageTitle !== false) { %>
54
+ <h1><%= pageTitle %></h1>
74
55
  <% } %>
75
- <main class="content-area">
76
- <div class="content-layout">
77
- <div class="main-content">
78
- <%- content %>
79
- </div>
56
+ </header>
57
+ <% } %>
58
+ <main class="content-area">
59
+ <div class="content-layout">
60
+ <div class="main-content"><%- content %></div>
61
+ <% if (frontmatter.components?.toc !== false && headings && headings.length > 0) { %>
62
+ <div class="toc-sidebar">
63
+ <%- include('toc', { content, headings, navigationHtml, isActivePage }) %>
80
64
  </div>
81
- </main>
82
- <% if (frontmatter.components?.footer !== false) { %>
83
- <footer class="page-footer">
84
- <div class="footer-content">
85
- <div class="user-footer">
86
- <%- footerHtml || '' %>
87
- </div>
88
- <% if (frontmatter.components?.branding !== false) { %>
89
- <div class="branding-footer">
90
- Build with <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M19 14c1.49-1.46 3-3.21 3-5.5A5.5 5.5 0 0 0 16.5 3c-1.76 0-3 .5-4.5 2-1.5-1.5-2.74-2-4.5-2A5.5 5.5 0 0 0 2 8.5c0 2.3 1.5 4.05 3 5.5l7 7Z"></path><path d="M12 5 9.04 7.96a2.17 2.17 0 0 0 0 3.08c.82.82 2.13.85 3 .07l2.07-1.9a2.82 2.82 0 0 1 3.79 0l2.96 2.66"></path><path d="m18 15-2-2"></path><path d="m15 18-2-2"></path></svg> <a href="https://docmd.mgks.dev" target="_blank" rel="noopener">docmd.</a>
91
- </div>
92
- <% } %>
93
- </div>
94
- </footer>
95
- <% } %>
96
- </div>
97
- <% } else if (frontmatter.components?.sidebar === true) { %>
98
- <aside class="sidebar">
99
- <% if (frontmatter.components?.logo !== false && logo && logo.light && logo.dark) { %>
100
- <div class="sidebar-header">
101
- <a href="<%= logo.href || (relativePathToRoot + 'index.html') %>" class="logo-link">
102
- <img src="<%= relativePathToRoot %><%- logo.light.startsWith('/') ? logo.light.substring(1) : logo.light %>" alt="<%= logo.alt || siteTitle %>" class="logo-light" <% if (logo.height) { %>style="height: <%= logo.height %>;"<% } %>>
103
- <img src="<%= relativePathToRoot %><%- logo.dark.startsWith('/') ? logo.dark.substring(1) : logo.dark %>" alt="<%= logo.alt || siteTitle %>" class="logo-dark" <% if (logo.height) { %>style="height: <%= logo.height %>;"<% } %>>
104
- </a>
65
+ <% } %>
66
+ </div>
67
+ </main>
68
+ <% if (frontmatter.components?.footer !== false) { %>
69
+ <footer class="page-footer">
70
+ <div class="footer-content">
71
+ <div class="user-footer"><%- footerHtml || '' %></div>
72
+ <% if (frontmatter.components?.branding !== false) { %>
73
+ <div class="branding-footer">
74
+ Build with <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M19 14c1.49-1.46 3-3.21 3-5.5A5.5 5.5 0 0 0 16.5 3c-1.76 0-3 .5-4.5 2-1.5-1.5-2.74-2-4.5-2A5.5 5.5 0 0 0 2 8.5c0 2.3 1.5 4.05 3 5.5l7 7Z"></path><path d="M12 5 9.04 7.96a2.17 2.17 0 0 0 0 3.08c.82.82 2.13.85 3 .07l2.07-1.9a2.82 2.82 0 0 1 3.79 0l2.96 2.66"></path><path d="m18 15-2-2"></path><path d="m15 18-2-2"></path></svg> <a href="https://docmd.io" target="_blank" rel="noopener">docmd.</a>
105
75
  </div>
76
+ <% } %>
77
+ </div>
78
+ </footer>
79
+ <% } %>
80
+ </div>
81
+ <% } else if (frontmatter.components?.sidebar === true) { %>
82
+ <aside class="sidebar">
83
+ <% if (frontmatter.components?.logo !== false && logo && logo.light && logo.dark) { %>
84
+ <div class="sidebar-header">
85
+ <a href="<%= logo.href || (relativePathToRoot + 'index.html') %>" class="logo-link">
86
+ <img src="<%= relativePathToRoot %><%- logo.light.startsWith('/') ? logo.light.substring(1) : logo.light %>" alt="<%= logo.alt || siteTitle %>" class="logo-light" <% if (logo.height) { %>style="height: <%= logo.height %>;"<% } %>>
87
+ <img src="<%= relativePathToRoot %><%- logo.dark.startsWith('/') ? logo.dark.substring(1) : logo.dark %>" alt="<%= logo.alt || siteTitle %>" class="logo-dark" <% if (logo.height) { %>style="height: <%= logo.height %>;"<% } %>>
88
+ </a>
89
+ </div>
90
+ <% } %>
91
+ <% if (frontmatter.components?.navigation !== false) { %>
92
+ <%- navigationHtml %>
93
+ <% } %>
94
+ <% if (frontmatter.components?.themeToggle !== false && theme && theme.enableModeToggle) { %>
95
+ <button id="theme-toggle-button" aria-label="Toggle theme" class="theme-toggle-button">
96
+ <%- renderIcon('sun', { class: 'icon-sun' }) %> <%- renderIcon('moon', { class: 'icon-moon' }) %>
97
+ </button>
98
+ <% } %>
99
+ </aside>
100
+ <div class="main-content-wrapper">
101
+ <% if (frontmatter.components?.header !== false) { %>
102
+ <header class="page-header">
103
+ <% if (frontmatter.components?.pageTitle !== false) { %>
104
+ <h1><%= pageTitle %></h1>
106
105
  <% } %>
107
- <% if (frontmatter.components?.navigation !== false) { %>
108
- <%- navigationHtml %>
109
- <% } %>
110
- <% if (frontmatter.components?.themeToggle !== false && theme && theme.enableModeToggle) { %>
111
- <button id="theme-toggle-button" aria-label="Toggle theme" class="theme-toggle-button">
112
- <%- renderIcon('sun', { class: 'icon-sun' }) %>
113
- <%- renderIcon('moon', { class: 'icon-moon' }) %>
114
- </button>
115
- <% } %>
116
- </aside>
117
- <div class="main-content-wrapper">
118
- <% if (frontmatter.components?.header !== false) { %>
119
- <header class="page-header">
120
- <% if (frontmatter.components?.pageTitle !== false) { %>
121
- <h1><%= pageTitle %></h1>
122
- <% } %>
123
- </header>
124
- <% } %>
125
- <main class="content-area">
126
- <div class="content-layout">
127
- <div class="main-content">
128
- <%- content %>
129
- </div>
130
- <% if (frontmatter.components?.toc !== false && headings && headings.length > 0) { %>
131
- <div class="toc-sidebar">
132
- <%- include('toc', { content, headings, navigationHtml, isActivePage }) %>
133
- </div>
134
- <% } %>
106
+ </header>
107
+ <% } %>
108
+ <main class="content-area">
109
+ <div class="content-layout">
110
+ <div class="main-content"><%- content %></div>
111
+ <% if (frontmatter.components?.toc !== false && headings && headings.length > 0) { %>
112
+ <div class="toc-sidebar">
113
+ <%- include('toc', { content, headings, navigationHtml, isActivePage }) %>
135
114
  </div>
136
- </main>
137
- <% if (frontmatter.components?.footer !== false) { %>
138
- <footer class="page-footer">
139
- <div class="footer-content">
140
- <div class="user-footer">
141
- <%- footerHtml || '' %>
142
- </div>
143
- <% if (frontmatter.components?.branding !== false) { %>
144
- <div class="branding-footer">
145
- Build with <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M19 14c1.49-1.46 3-3.21 3-5.5A5.5 5.5 0 0 0 16.5 3c-1.76 0-3 .5-4.5 2-1.5-1.5-2.74-2-4.5-2A5.5 5.5 0 0 0 2 8.5c0 2.3 1.5 4.05 3 5.5l7 7Z"></path><path d="M12 5 9.04 7.96a2.17 2.17 0 0 0 0 3.08c.82.82 2.13.85 3 .07l2.07-1.9a2.82 2.82 0 0 1 3.79 0l2.96 2.66"></path><path d="m18 15-2-2"></path><path d="m15 18-2-2"></path></svg> <a href="https://docmd.mgks.dev" target="_blank" rel="noopener">docmd.</a>
146
- </div>
147
- <% } %>
148
- </div>
149
- </footer>
150
- <% } %>
151
- </div>
115
+ <% } %>
116
+ </div>
117
+ </main>
118
+ <% if (frontmatter.components?.footer !== false) { %>
119
+ <footer class="page-footer">
120
+ <div class="footer-content">
121
+ <div class="user-footer"><%- footerHtml || '' %></div>
122
+ <% if (frontmatter.components?.branding !== false) { %>
123
+ <div class="branding-footer">
124
+ Build with <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M19 14c1.49-1.46 3-3.21 3-5.5A5.5 5.5 0 0 0 16.5 3c-1.76 0-3 .5-4.5 2-1.5-1.5-2.74-2-4.5-2A5.5 5.5 0 0 0 2 8.5c0 2.3 1.5 4.05 3 5.5l7 7Z"></path><path d="M12 5 9.04 7.96a2.17 2.17 0 0 0 0 3.08c.82.82 2.13.85 3 .07l2.07-1.9a2.82 2.82 0 0 1 3.79 0l2.96 2.66"></path><path d="m18 15-2-2"></path><path d="m15 18-2-2"></path></svg> <a href="https://docmd.io" target="_blank" rel="noopener">docmd.</a>
125
+ </div>
126
+ <% } %>
127
+ </div>
128
+ </footer>
129
+ <% } %>
130
+ </div>
152
131
  <% } else { %>
153
- <%- content %>
132
+ <%- content %>
154
133
  <% } %>
155
134
 
156
135
  <% if (frontmatter.components?.scripts === true) { %>
157
136
  <% if (frontmatter.components?.mainScripts === true) { %>
158
- <script src="<%= relativePathToRoot %>assets/js/docmd-main.js"></script>
137
+ <script>window.DOCMD_ROOT = "<%= relativePathToRoot %>";</script>
138
+ <script src="<%= relativePathToRoot %>assets/js/docmd-main.js"></script>
159
139
  <% } %>
160
140
 
161
141
  <% if (frontmatter.components?.lightbox === true && frontmatter.components?.mainScripts === true) { %>
162
- <script src="<%= relativePathToRoot %>assets/js/docmd-image-lightbox.js"></script>
142
+ <script src="<%= relativePathToRoot %>assets/js/docmd-image-lightbox.js"></script>
163
143
  <% } %>
164
144
 
145
+ <!-- Mermaid & MiniSearch from CDN -->
146
+ <script src="https://cdn.jsdelivr.net/npm/mermaid@11.12.2/dist/mermaid.min.js"></script>
147
+ <script src="<%= relativePathToRoot %>assets/js/docmd-mermaid.js"></script>
148
+
149
+ <script src="https://cdn.jsdelivr.net/npm/minisearch@7.2.0/dist/umd/index.min.js"></script>
150
+ <script src="<%= relativePathToRoot %>assets/js/docmd-search.js"></script>
151
+
165
152
  <% if (frontmatter.components?.customJs === true && customJsFiles && customJsFiles.length > 0) { %>
166
- <% customJsFiles.forEach(jsFile => { %>
167
- <script src="<%= relativePathToRoot %><%- jsFile.startsWith('/') ? jsFile.substring(1) : jsFile %>"></script>
168
- <% }); %>
153
+ <% customJsFiles.forEach(jsFile => { %>
154
+ <script src="<%= relativePathToRoot %><%- jsFile.startsWith('/') ? jsFile.substring(1) : jsFile %>"></script>
155
+ <% }); %>
169
156
  <% } %>
170
157
 
171
158
  <% if (frontmatter.components?.pluginBodyScripts === true) { %>
172
- <%- pluginBodyScriptsHtml || '' %>
159
+ <%- pluginBodyScriptsHtml || '' %>
173
160
  <% } %>
174
161
  <% } %>
175
-
176
162
  <% if (frontmatter.customScripts) { %>
177
- <%- frontmatter.customScripts %>
163
+ <%- frontmatter.customScripts %>
178
164
  <% } %>
179
165
  </body>
180
- </html>
166
+ </html>
@@ -1,27 +1,27 @@
1
- // Source file from the docmd project — https://github.com/mgks/docmd
2
-
3
- /*
4
- * Initialize the theme from localStorage
5
- */
1
+ /* Source file from the docmd project — https://github.com/docmd-io/docmd */
6
2
 
7
3
  (function() {
8
4
  try {
9
- // Determine Theme
10
5
  var localValue = localStorage.getItem('docmd-theme');
11
6
  var configValue = window.DOCMD_DEFAULT_MODE || 'light';
12
7
  var theme = localValue ? localValue : configValue;
13
8
 
14
- // Set HTML Attribute (for main CSS variables)
9
+ // Set HTML Attribute
15
10
  document.documentElement.setAttribute('data-theme', theme);
16
11
 
17
- // Handle Highlight.js Theme (if present)
12
+ // Resolve 'system' to actual mode for Highlight.js
13
+ var effectiveTheme = theme;
14
+ if (theme === 'system') {
15
+ effectiveTheme = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
16
+ }
17
+
18
+ // Handle Highlight.js Theme
18
19
  var highlightLink = document.getElementById('highlight-theme');
19
20
  if (highlightLink) {
20
21
  var baseHref = highlightLink.getAttribute('data-base-href');
21
- // Check if the current href matches the desired theme
22
- // If not, swap it immediately before the browser renders code blocks
23
- if (baseHref && !highlightLink.href.includes('docmd-highlight-' + theme)) {
24
- highlightLink.href = baseHref + 'docmd-highlight-' + theme + '.css';
22
+ if (baseHref) {
23
+ // Force load the resolved theme (light/dark)
24
+ highlightLink.href = baseHref + 'docmd-highlight-' + effectiveTheme + '.css';
25
25
  }
26
26
  }
27
27
  } catch (e) {
@@ -1,56 +1,28 @@
1
- <%# src/templates/toc.ejs %>
1
+ <%# Source file from the docmd project — https://github.com/docmd-io/docmd %>
2
+
2
3
  <%
3
- // Helper function to decode HTML entities
4
4
  function decodeHtmlEntities(html) {
5
- return html
6
- .replace(/&amp;/g, '&')
7
- .replace(/&lt;/g, '<')
8
- .replace(/&gt;/g, '>')
9
- .replace(/&quot;/g, '"')
10
- .replace(/&#39;/g, "'")
11
- .replace(/&nbsp;/g, ' ');
5
+ return html.replace(/&amp;/g, '&').replace(/&lt;/g, '<').replace(/&gt;/g, '>').replace(/&quot;/g, '"').replace(/&#39;/g, "'").replace(/&nbsp;/g, ' ');
12
6
  }
13
-
14
- // Use the isActivePage flag if provided, otherwise fall back to checking navigationHtml
15
7
  const shouldShowToc = typeof isActivePage !== 'undefined' ? isActivePage :
16
8
  (typeof navigationHtml !== 'undefined' && navigationHtml && navigationHtml.includes('class="active"'));
17
9
 
18
10
  if (shouldShowToc && !frontmatter?.toc || frontmatter?.toc !== 'false') {
19
- // If direct headings aren't available, we'll try to extract them from the content
20
11
  let tocHeadings = [];
21
12
  if (headings && headings.length > 0) {
22
- // Use provided headings if available
23
13
  tocHeadings = headings.filter(h => h.level >= 2 && h.level <= 4);
24
14
  } else if (content) {
25
- // Basic regex to extract headings from HTML content
26
15
  const headingRegex = /<h([2-4])[^>]*?(?:id="([^"]*)")?[^>]*?>([\s\S]*?)<\/h\1>/g;
27
16
  let match;
28
17
  let contentStr = content.toString();
29
-
30
18
  while ((match = headingRegex.exec(contentStr)) !== null) {
31
19
  const level = parseInt(match[1], 10);
32
- // Use ID if available, or generate one from the text
33
20
  let id = match[2];
34
- // Remove any HTML tags inside the heading text
35
- const textWithTags = match[3].replace(/<\/?[^>]+(>|$)/g, '');
36
- // Decode HTML entities
37
- const text = decodeHtmlEntities(textWithTags);
38
-
39
- if (!id) {
40
- // Generate an ID from the heading text if none exists
41
- id = text
42
- .toLowerCase()
43
- .replace(/\s+/g, '-')
44
- .replace(/[^\w-]/g, '')
45
- .replace(/--+/g, '-')
46
- .replace(/^-+|-+$/g, '');
47
- }
48
-
21
+ const text = decodeHtmlEntities(match[3].replace(/<\/?\w+[^>]*>/g, '')); // Stripped tags
22
+ if (!id) id = text.toLowerCase().replace(/\s+/g, '-').replace(/[^\w-]/g, '').replace(/--+/g, '-').replace(/^-+|-+$/g, '');
49
23
  tocHeadings.push({ id, level, text });
50
24
  }
51
25
  }
52
-
53
- // Only show TOC if there are enough headings
54
26
  if (tocHeadings.length > 1) {
55
27
  %>
56
28
  <div class="toc-container">
@@ -63,5 +35,4 @@ if (shouldShowToc && !frontmatter?.toc || frontmatter?.toc !== 'false') {
63
35
  <% }); %>
64
36
  </ul>
65
37
  </div>
66
- <% }
67
- } %>
38
+ <% } } %>
@@ -1 +0,0 @@
1
- pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}.hljs{color:#abb2bf;background:#282c34}.hljs-comment,.hljs-quote{color:#5c6370;font-style:italic}.hljs-doctag,.hljs-formula,.hljs-keyword{color:#c678dd}.hljs-deletion,.hljs-name,.hljs-section,.hljs-selector-tag,.hljs-subst{color:#e06c75}.hljs-literal{color:#56b6c2}.hljs-addition,.hljs-attribute,.hljs-meta .hljs-string,.hljs-regexp,.hljs-string{color:#98c379}.hljs-attr,.hljs-number,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-pseudo,.hljs-template-variable,.hljs-type,.hljs-variable{color:#d19a66}.hljs-bullet,.hljs-link,.hljs-meta,.hljs-selector-id,.hljs-symbol,.hljs-title{color:#61aeee}.hljs-built_in,.hljs-class .hljs-title,.hljs-title.class_{color:#e6c07b}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}.hljs-link{text-decoration:underline}
@@ -1 +0,0 @@
1
- pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}.hljs{color:#383a42;background:#fafafa}.hljs-comment,.hljs-quote{color:#a0a1a7;font-style:italic}.hljs-doctag,.hljs-formula,.hljs-keyword{color:#a626a4}.hljs-deletion,.hljs-name,.hljs-section,.hljs-selector-tag,.hljs-subst{color:#e45649}.hljs-literal{color:#0184bb}.hljs-addition,.hljs-attribute,.hljs-meta .hljs-string,.hljs-regexp,.hljs-string{color:#50a14f}.hljs-attr,.hljs-number,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-pseudo,.hljs-template-variable,.hljs-type,.hljs-variable{color:#986801}.hljs-bullet,.hljs-link,.hljs-meta,.hljs-selector-id,.hljs-symbol,.hljs-title{color:#4078f2}.hljs-built_in,.hljs-class .hljs-title,.hljs-title.class_{color:#c18401}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}.hljs-link{text-decoration:underline}