docnest 0.1.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.
- package/LICENSE +21 -0
- package/README.md +61 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +83 -0
- package/dist/config.d.ts +36 -0
- package/dist/config.js +79 -0
- package/dist/server.d.ts +20 -0
- package/dist/server.js +814 -0
- package/package.json +60 -0
- package/server/favicon.ico +0 -0
- package/server/static/css/highlight.css +72 -0
- package/server/static/css/styles.css +5762 -0
- package/server/static/favicon.ico +0 -0
- package/server/static/img/404-deep-space-light.webp +0 -0
- package/server/static/img/404-deep-space.webp +0 -0
- package/server/static/js/core/doc-client-nav.js +260 -0
- package/server/static/js/core/doc-pdf-export.js +579 -0
- package/server/static/js/core/mermaid-init.js +36 -0
- package/server/static/js/core/sidebar.js +141 -0
- package/server/static/js/core/theme.js +138 -0
- package/server/static/js/diagram/diagram-controls.js +90 -0
- package/server/static/js/diagram/diagram-download.js +594 -0
- package/server/static/js/diagram/diagram-drag.js +157 -0
- package/server/static/js/diagram/diagram-viewer.js +405 -0
- package/server/static/js/diagram/diagram-zoom.js +67 -0
- package/server/static/js/utils/app.js +14 -0
- package/server/static/js/utils/modal-stack.js +33 -0
- package/server/views/dir.ejs +142 -0
- package/server/views/doc.ejs +483 -0
- package/server/views/index.ejs +77 -0
- package/server/views/not-found.ejs +57 -0
- package/server/views/partials/breadcrumbs.ejs +15 -0
- package/server/views/partials/diagram-viewer.ejs +16 -0
- package/server/views/partials/header.ejs +37 -0
- package/server/views/partials/sidebar.ejs +19 -0
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="zh-CN">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover">
|
|
6
|
+
<title><%= docsTitle %></title>
|
|
7
|
+
<link rel="icon" href="/favicon.ico?v=<%= assetVersion %>" sizes="any">
|
|
8
|
+
<link id="markdown-theme" rel="stylesheet" href="/vendor/github-markdown-css/github-markdown-light.css?v=<%= assetVersion %>">
|
|
9
|
+
<link rel="stylesheet" href="/static/css/styles.css?v=<%= assetVersion %>">
|
|
10
|
+
<link rel="stylesheet" href="/static/css/highlight.css?v=<%= assetVersion %>">
|
|
11
|
+
<script src="/mermaid/mermaid.min.js?v=<%= assetVersion %>"></script>
|
|
12
|
+
<script>
|
|
13
|
+
window.DOCNEST_CONFIG = {
|
|
14
|
+
watermarkEnabled: <%= docsWatermarkEnabled ? 'true' : 'false' %>,
|
|
15
|
+
watermarkText: <%- JSON.stringify(docsWatermarkText) %>
|
|
16
|
+
};
|
|
17
|
+
</script>
|
|
18
|
+
<!-- 基础功能模块 -->
|
|
19
|
+
<script src="/static/js/core/theme.js?v=<%= assetVersion %>"></script>
|
|
20
|
+
<script src="/static/js/core/mermaid-init.js?v=<%= assetVersion %>"></script>
|
|
21
|
+
<script src="/static/js/core/sidebar.js?v=<%= assetVersion %>"></script>
|
|
22
|
+
</head>
|
|
23
|
+
<body>
|
|
24
|
+
<div class="container">
|
|
25
|
+
<%- include('partials/header', { showBackLink: false }) %>
|
|
26
|
+
<div class="content">
|
|
27
|
+
<%- include('partials/sidebar') %>
|
|
28
|
+
<main class="main-content">
|
|
29
|
+
<div class="welcome">
|
|
30
|
+
<h2>欢迎使用文档中心</h2>
|
|
31
|
+
<p>请从左侧目录选择要查看的文档。</p>
|
|
32
|
+
</div>
|
|
33
|
+
</main>
|
|
34
|
+
</div>
|
|
35
|
+
</div>
|
|
36
|
+
<%- include('partials/diagram-viewer') %>
|
|
37
|
+
<!-- 按依赖顺序加载模块 -->
|
|
38
|
+
<script src="/static/js/utils/modal-stack.js?v=<%= assetVersion %>"></script>
|
|
39
|
+
<script src="/static/js/diagram/diagram-viewer.js?v=<%= assetVersion %>"></script>
|
|
40
|
+
<script src="/static/js/diagram/diagram-zoom.js?v=<%= assetVersion %>"></script>
|
|
41
|
+
<script src="/static/js/diagram/diagram-drag.js?v=<%= assetVersion %>"></script>
|
|
42
|
+
<script src="/static/js/diagram/diagram-controls.js?v=<%= assetVersion %>"></script>
|
|
43
|
+
<script src="/static/js/diagram/diagram-download.js?v=<%= assetVersion %>"></script>
|
|
44
|
+
<script src="/static/js/utils/app.js?v=<%= assetVersion %>"></script>
|
|
45
|
+
<script src="/socket.io/socket.io.js"></script>
|
|
46
|
+
<script>
|
|
47
|
+
// 实时更新功能
|
|
48
|
+
(function() {
|
|
49
|
+
const socket = io();
|
|
50
|
+
|
|
51
|
+
socket.on('file-changed', function(data) {
|
|
52
|
+
console.log('文件已更新:', data.path);
|
|
53
|
+
// 刷新整个页面以更新目录树
|
|
54
|
+
location.reload();
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
socket.on('file-added', function(data) {
|
|
58
|
+
console.log('新文件已添加:', data.path);
|
|
59
|
+
location.reload();
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
socket.on('file-deleted', function(data) {
|
|
63
|
+
console.log('文件已删除:', data.path);
|
|
64
|
+
location.reload();
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
socket.on('connect', function() {
|
|
68
|
+
console.log('✅ 已连接到服务器,实时更新已启用');
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
socket.on('disconnect', function() {
|
|
72
|
+
console.log('❌ 与服务器断开连接');
|
|
73
|
+
});
|
|
74
|
+
})();
|
|
75
|
+
</script>
|
|
76
|
+
</body>
|
|
77
|
+
</html>
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="zh-CN">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover">
|
|
6
|
+
<title>文件未找到 - <%= docsTitle %></title>
|
|
7
|
+
<link rel="icon" href="/favicon.ico?v=<%= assetVersion %>" sizes="any">
|
|
8
|
+
<link id="markdown-theme" rel="stylesheet" href="/vendor/github-markdown-css/github-markdown-light.css?v=<%= assetVersion %>">
|
|
9
|
+
<link rel="stylesheet" href="/static/css/styles.css?v=<%= assetVersion %>">
|
|
10
|
+
<link rel="stylesheet" href="/static/css/highlight.css?v=<%= assetVersion %>">
|
|
11
|
+
<script src="/static/js/core/theme.js?v=<%= assetVersion %>"></script>
|
|
12
|
+
<script src="/static/js/core/sidebar.js?v=<%= assetVersion %>"></script>
|
|
13
|
+
</head>
|
|
14
|
+
<body class="not-found-page">
|
|
15
|
+
<div class="container">
|
|
16
|
+
<%- include('partials/header', { showBackLink: true }) %>
|
|
17
|
+
<div class="content">
|
|
18
|
+
<%- include('partials/sidebar') %>
|
|
19
|
+
<main class="main-content not-found-main">
|
|
20
|
+
<section class="deep-space-404" aria-labelledby="not-found-title">
|
|
21
|
+
<div class="deep-space-404__content">
|
|
22
|
+
<p class="deep-space-404__eyebrow">DEEP SPACE · SIGNAL LOST</p>
|
|
23
|
+
<p class="deep-space-404__code" aria-label="错误 404">404</p>
|
|
24
|
+
<h2 id="not-found-title">这份文档,暂时失联</h2>
|
|
25
|
+
<p class="deep-space-404__description">
|
|
26
|
+
它可能已迁移、重命名,或正穿过一片未知的事件视界。
|
|
27
|
+
</p>
|
|
28
|
+
<% if (requestedPath) { %>
|
|
29
|
+
<p class="deep-space-404__path">
|
|
30
|
+
<span>最后坐标</span>
|
|
31
|
+
<code title="<%= requestedPath %>"><%= requestedPath %></code>
|
|
32
|
+
</p>
|
|
33
|
+
<% } %>
|
|
34
|
+
<div class="deep-space-404__actions">
|
|
35
|
+
<a class="deep-space-404__primary-action" href="/">返回文档目录</a>
|
|
36
|
+
<button class="deep-space-404__secondary-action" type="button" id="not-found-back">
|
|
37
|
+
返回上一页
|
|
38
|
+
</button>
|
|
39
|
+
</div>
|
|
40
|
+
</div>
|
|
41
|
+
<p class="deep-space-404__caption" aria-hidden="true">LOCAL DOCUMENT SERVICE</p>
|
|
42
|
+
</section>
|
|
43
|
+
</main>
|
|
44
|
+
</div>
|
|
45
|
+
</div>
|
|
46
|
+
<script src="/static/js/utils/app.js?v=<%= assetVersion %>"></script>
|
|
47
|
+
<script>
|
|
48
|
+
document.getElementById('not-found-back')?.addEventListener('click', () => {
|
|
49
|
+
if (window.history.length > 1) {
|
|
50
|
+
window.history.back();
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
window.location.assign('/');
|
|
54
|
+
});
|
|
55
|
+
</script>
|
|
56
|
+
</body>
|
|
57
|
+
</html>
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
<nav class="breadcrumbs" aria-label="面包屑导航">
|
|
2
|
+
<ol>
|
|
3
|
+
<li class="breadcrumb-item"><a href="/" class="breadcrumb-link">首页</a></li>
|
|
4
|
+
<% breadcrumbs.forEach(function(crumb) { %>
|
|
5
|
+
<li class="breadcrumb-separator" aria-hidden="true">/</li>
|
|
6
|
+
<% if (crumb.isLast) { %>
|
|
7
|
+
<li class="breadcrumb-item breadcrumb-current" aria-current="page"><%= crumb.name %></li>
|
|
8
|
+
<% } else if (crumb.url) { %>
|
|
9
|
+
<li class="breadcrumb-item"><a href="<%= crumb.url %>" class="breadcrumb-link"><%= crumb.name %></a></li>
|
|
10
|
+
<% } else { %>
|
|
11
|
+
<li class="breadcrumb-item breadcrumb-text"><%= crumb.name %></li>
|
|
12
|
+
<% } %>
|
|
13
|
+
<% }); %>
|
|
14
|
+
</ol>
|
|
15
|
+
</nav>
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<!-- 图表查看器模态框 -->
|
|
2
|
+
<div id="diagram-viewer" class="diagram-viewer">
|
|
3
|
+
<div class="diagram-viewer-content">
|
|
4
|
+
<button class="diagram-viewer-close" onclick="closeDiagramViewer()">×</button>
|
|
5
|
+
<div class="diagram-viewer-controls">
|
|
6
|
+
<button onclick="zoomDiagram('out')">缩小</button>
|
|
7
|
+
<span class="zoom-info" id="zoom-info">100%</span>
|
|
8
|
+
<button onclick="zoomDiagram('in')">放大</button>
|
|
9
|
+
<button onclick="resetDiagramZoom()">重置</button>
|
|
10
|
+
<button onclick="toggleFullscreen()" class="fullscreen-btn" id="fullscreen-btn">⛶ 全屏</button>
|
|
11
|
+
<button onclick="copyCurrentDiagram()" class="copy-btn">📋 复制</button>
|
|
12
|
+
<button onclick="downloadCurrentDiagram()" class="download-btn">⬇️ 下载</button>
|
|
13
|
+
</div>
|
|
14
|
+
<div id="diagram-viewer-svg-container" class="diagram-viewer-svg-container"></div>
|
|
15
|
+
</div>
|
|
16
|
+
</div>
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
<header class="header">
|
|
2
|
+
<div class="header-content">
|
|
3
|
+
<div class="header-title-group">
|
|
4
|
+
<h1>
|
|
5
|
+
<% if (docsLogo) { %><img class="brand-logo" src="<%= docsLogo %>" alt=""><% } else { %>📚<% } %>
|
|
6
|
+
<%= docsTitle %>
|
|
7
|
+
</h1>
|
|
8
|
+
<% if (typeof showBackLink !== 'undefined' && showBackLink) { %>
|
|
9
|
+
<a href="/" class="back-link">← 返回目录</a>
|
|
10
|
+
<% } else { %>
|
|
11
|
+
<p class="subtitle"><%= docsSubtitle %></p>
|
|
12
|
+
<% } %>
|
|
13
|
+
</div>
|
|
14
|
+
<div class="header-meta">
|
|
15
|
+
<div class="header-actions">
|
|
16
|
+
<% if (typeof showPrintButton !== 'undefined' && showPrintButton) { %>
|
|
17
|
+
<button type="button" id="print-doc-btn" class="header-action-btn print-btn" title="打印当前文章">
|
|
18
|
+
<span class="print-icon">🖨️</span>
|
|
19
|
+
<span class="header-action-text">打印</span>
|
|
20
|
+
</button>
|
|
21
|
+
<% } %>
|
|
22
|
+
<% if (typeof showPdfButton !== 'undefined' && showPdfButton) { %>
|
|
23
|
+
<button type="button" id="download-doc-pdf-btn" class="header-action-btn download-pdf-btn" title="下载当前文章 PDF">
|
|
24
|
+
<span class="download-pdf-icon">⬇️</span>
|
|
25
|
+
<span class="header-action-text">下载 PDF</span>
|
|
26
|
+
</button>
|
|
27
|
+
<% } %>
|
|
28
|
+
<div class="theme-selector">
|
|
29
|
+
<button id="theme-toggle" class="header-action-btn theme-toggle" title="点击切换:跟随系统 / 浅色 / 深色">
|
|
30
|
+
<span class="theme-icon">💻</span>
|
|
31
|
+
<span class="theme-text">跟随系统</span>
|
|
32
|
+
</button>
|
|
33
|
+
</div>
|
|
34
|
+
</div>
|
|
35
|
+
</div>
|
|
36
|
+
</div>
|
|
37
|
+
</header>
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
<aside class="sidebar" id="sidebar">
|
|
2
|
+
<h2>目录</h2>
|
|
3
|
+
<nav class="tree-nav">
|
|
4
|
+
<%- treeHtml %>
|
|
5
|
+
</nav>
|
|
6
|
+
</aside>
|
|
7
|
+
<div class="sidebar-chrome" id="sidebar-chrome">
|
|
8
|
+
<button
|
|
9
|
+
type="button"
|
|
10
|
+
class="sidebar-collapse-toggle"
|
|
11
|
+
id="sidebar-collapse-toggle"
|
|
12
|
+
aria-label="收起目录"
|
|
13
|
+
aria-expanded="true"
|
|
14
|
+
title="收起目录"
|
|
15
|
+
>
|
|
16
|
+
<span class="sidebar-collapse-icon" aria-hidden="true">‹</span>
|
|
17
|
+
</button>
|
|
18
|
+
<div class="sidebar-resizer" id="sidebar-resizer"></div>
|
|
19
|
+
</div>
|