File size: 11,591 Bytes
41abe6f
 
 
 
 
 
 
 
 
 
 
c787815
faea044
41abe6f
 
f0e4f4e
41abe6f
 
4d75b2f
41abe6f
 
 
 
 
 
fc4bb8e
fc53af8
41abe6f
4d75b2f
41abe6f
 
 
4d75b2f
 
09b8269
41abe6f
 
f0e4f4e
41abe6f
f0e4f4e
4d75b2f
 
41abe6f
f0e4f4e
41abe6f
 
 
 
 
4d75b2f
41abe6f
 
 
 
 
 
4d75b2f
41abe6f
 
 
 
 
 
 
 
491be64
41abe6f
 
 
fc53af8
41abe6f
4d75b2f
 
41abe6f
 
 
 
 
 
 
4d75b2f
 
f0e4f4e
41abe6f
 
4d75b2f
 
41abe6f
4f96538
41abe6f
 
a69a7bc
41abe6f
 
 
4f96538
a8a49bb
f61071a
a8a49bb
 
 
 
4f96538
41abe6f
 
 
 
 
 
4f96538
41abe6f
a69a7bc
a134179
41abe6f
 
 
 
353a17d
41abe6f
 
 
323f21e
41abe6f
 
 
 
 
4d75b2f
 
41abe6f
4d75b2f
 
41abe6f
 
 
f0e4f4e
41abe6f
 
 
4d75b2f
52b728f
 
 
 
 
 
f0e4f4e
41abe6f
08e78fb
1143003
281e432
1143003
 
 
 
 
 
 
f0e4f4e
41abe6f
9150073
7ceca57
41abe6f
 
1
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
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
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<title>VOMEBOOK Search</title>
<link rel="manifest" href="/manifest.json">
<meta name="theme-color" content="#1a1c1e">
<link rel="apple-touch-icon" href="/icons/icon-192.png">
<link rel="icon" type="image/png" sizes="192x192" href="/icons/icon-192.png">
<link rel="icon" type="image/png" sizes="512x512" href="/icons/icon-512.png">
<script>fetch("/api/ping", { cache: "no-store" }).catch(() => {});</script>
<link rel="stylesheet" href="/static/style.css?v=phrases-4">
</head>
<body class="dark">

<header id="header">
  <div class="header-left">
    <button id="hamburger-btn" class="icon-btn" aria-label="打开数据包导航" aria-controls="left-sidebar" aria-expanded="true"><span class="ui-icon ui-icon-menu" aria-hidden="true"></span></button>
    <a id="header-logo" class="header-logo" href="https://huggingface.co/VOMEBOOK" title="VOMEBOOK">
      <span id="header-title">VOMEBOOK</span>
    </a>
  </div>
  <div class="header-center">
    <div class="search-box">
      <span class="search-icon"><span class="ui-icon ui-icon-search" aria-hidden="true"></span></span>
      <input type="search" id="search-input" class="search-input" aria-label="搜索 TXT 文件和正文" aria-controls="search-history-dropdown" aria-expanded="false" placeholder="全文搜索 TXT 正文..." autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false">
      <kbd class="search-kbd">/</kbd>
      <div id="search-history-dropdown" class="search-history-dropdown" role="region" aria-label="搜索历史" style="display:none"></div>
    </div>
  </div>
  <div class="header-right">
    <button id="settings-btn" class="icon-btn" aria-label="打开搜索过滤" aria-controls="right-sidebar" aria-expanded="false"><span class="ui-icon ui-icon-sliders" aria-hidden="true"></span></button>
    <button id="mobile-toggle-btn" class="icon-btn" aria-label="切换手机或电脑模式" aria-pressed="false" title="手机/电脑模式切换"><span id="mobile-toggle-icon" class="ui-icon ui-icon-devices" aria-hidden="true"></span></button>
    <button id="theme-btn" class="icon-btn" aria-label="切换到白天模式" title="白天模式"><svg class="theme-icon-svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><path d="M20 15.5A8 8 0 1 1 8.5 4 6.5 6.5 0 0 0 20 15.5Z"/></svg></button>
  </div>

</header>
<div id="app-body" class="app-body">

  <aside id="left-sidebar" class="sidebar left-sidebar" aria-labelledby="sidebar-title">
    <div class="sidebar-header"><span id="sidebar-title">数据包</span><button id="sidebar-expand-btn" class="icon-btn-sm" aria-label="展开数据包导航" aria-expanded="false" title="展开/收起侧边栏" style="display:none">↔</button></div>
    <div id="sidebar-content" class="sidebar-content"><div class="sidebar-loading">加载中...</div></div>

  </aside>

  <main id="main-content" class="main-content">
    <div id="status-bar" class="status-bar">
      <div class="status-left">
        <span id="result-count" class="result-count" role="status"></span>
        <label class="multi-toggle" id="multi-toggle-label" style="display:none"><input type="checkbox" id="multi-select-toggle"><span>多选</span></label>
      </div>
      <div class="status-right">
        <button id="clear-filters-btn" class="text-btn" style="display:none">清空筛选</button>
        <div class="sort-group">
          <span class="sort-label">排序:</span>
          <select id="sort-select" class="sort-select" aria-label="排序方式">
            <option value="relevance">相关度</option>
            <option value="name">文件名</option>
            <option value="size">文件大小</option>
          </select>
        </div>
      </div>
    </div>
    <div id="multi-action-bar" class="multi-action-bar" style="display:none">
      <button id="multi-select-all" class="multi-action-btn">全选</button>
      <button id="multi-deselect" class="multi-action-btn">取消选择</button>
      <button id="multi-batch-download" class="multi-action-btn primary">批量下载</button>
      <button id="multi-zip-download" class="multi-action-btn primary">合并下载</button>
      <span id="multi-selected-count" class="multi-selected-count" role="status" aria-live="polite" aria-atomic="true"></span>
    </div>
    <div id="results-container" class="results-container" aria-busy="false" role="region" aria-label="搜索结果">
      <div id="results-list" class="results-list" role="list"></div>
      <div id="results-loading" class="loading-spinner" style="display:none"><div class="spinner"></div></div>
      <div id="empty-state" class="empty-state" style="display:none">
        <div class="empty-title">没有找到结果</div>
        <div id="empty-desc" class="empty-desc">试试其他关键词</div>
        <button id="empty-random-btn" class="random-big-btn">随机来一篇</button>
      </div>
    </div>
    <div id="load-info" class="load-info" role="status" aria-live="polite" aria-atomic="true" style="display:none">已加载 <span id="loaded-count">0</span> / <span id="total-count">0</span> 条</div>
    <div id="preview-panel" class="preview-panel" role="dialog" aria-modal="true" aria-label="文件预览" tabindex="-1" hidden style="display:none"></div>

  </main>

  <aside id="right-sidebar" class="sidebar right-sidebar" aria-label="搜索过滤">
    <div class="sidebar-header"><span>搜索过滤</span><button id="close-filters-btn" class="icon-btn-sm" aria-label="关闭搜索过滤">×</button></div>
    <div class="sidebar-content">
      <div class="filter-section" id="fulltext-toggle-section">
        <label class="toggle-row">
          <span class="toggle-label">全文搜索</span>
          <input type="checkbox" id="fulltext-toggle" checked>
          <span class="toggle-switch"></span>
        </label>
      </div>
      <div class="filter-section" id="search-paths-toggle-section">
        <label class="toggle-row">
          <span class="toggle-label">搜索文件夹名</span>
          <input type="checkbox" id="search-paths-toggle" checked>
          <span class="toggle-switch"></span>
        </label>
      </div>
      <div class="filter-section" id="history-toggle-section">
        <label class="toggle-row">
          <span class="toggle-label">记录搜索历史</span>
          <input type="checkbox" id="history-toggle" checked>
          <span class="toggle-switch"></span>
        </label>
      </div>
      <div class="filter-section" id="exact-search-section">
        <label class="toggle-row">
          <span class="toggle-label">精准搜索</span>
          <input type="checkbox" id="exact-search-toggle" checked>
          <span class="toggle-switch"></span>
        </label>
      </div>
      <div id="filter-source-section" class="filter-section">
        <div class="filter-section-title"><span class="filter-title-leading"><span>数据包过滤</span><button id="source-filter-cancel" class="text-btn-sm" hidden>取消</button></span></div>
        <div id="filter-source-list" class="filter-checkbox-list"></div>
      </div>
      <div id="filter-folder-section" class="filter-section">
        <div class="filter-section-title"><span class="filter-title-leading"><span>路径过滤</span><button id="folder-filter-cancel" class="text-btn-sm" hidden>取消</button></span><span class="filter-actions"><button type="button" id="folder-toggle-all" class="text-btn-sm" aria-label="展开所有子目录" title="展开所有子目录" aria-controls="filter-folder-tree" aria-expanded="false" disabled>展开</button><button id="folder-select-all" class="text-btn-sm">全选</button><button id="folder-deselect-all" class="text-btn-sm">反选</button></span></div>
        <div id="filter-folder-tree" class="filter-folder-tree"></div>
      </div>
      <div class="filter-section">
        <div class="filter-section-title">文件大小</div>
        <div class="filter-size-row">
          <input type="number" id="filter-min-size" class="size-input" aria-label="最小文件大小" placeholder="最小" min="0" step="0.1">
          <select id="filter-min-unit" class="size-unit" aria-label="最小文件大小单位"><option value="B">B</option><option value="KB">KB</option><option value="MB" selected>MB</option><option value="GB">GB</option></select>
          <span class="size-sep">—</span>
          <input type="number" id="filter-max-size" class="size-input" aria-label="最大文件大小" placeholder="最大" min="0" step="0.1">
          <select id="filter-max-unit" class="size-unit" aria-label="最大文件大小单位"><option value="B">B</option><option value="KB">KB</option><option value="MB" selected>MB</option><option value="GB">GB</option></select>
        </div>
      </div>
    </div>

  </aside>
</div>

<footer id="footer" class="footer">
  <div class="hitokoto"></div>
  <button id="random-book-btn" class="random-book-btn" title="随机来一篇">
    <span class="ui-icon ui-icon-book" aria-hidden="true"></span>
    <span>随机来一篇</span>
  </button>

</footer>
<div id="overlay" class="overlay" style="display:none"></div>
<div id="toast" class="toast" role="status" aria-live="polite" style="display:none"></div>
<section id="speech-panel" class="speech-panel" aria-label="朗读设置" hidden>
  <div class="speech-heading"><span id="speech-title">朗读</span><button type="button" id="speech-collapse" class="icon-btn-sm" aria-label="收起设置,继续播放" title="收起,继续播放"><svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="1.7" aria-hidden="true"><path d="M5 12h14"/></svg></button><button type="button" id="speech-stop" class="icon-btn-sm" aria-label="停止朗读" title="停止朗读">×</button></div>
  <p id="speech-status" class="speech-note" role="status">从当前阅读位置开始</p>
  <label class="speech-setting" for="speech-pitch"><span>音高</span><input id="speech-pitch" type="range" min="-3" max="3" step="1" value="0"><output id="speech-pitch-value">0</output></label>
  <label class="speech-setting" for="speech-speed"><span>语速</span><input id="speech-speed" type="range" min="0.5" max="2" step="0.05" value="1"><output id="speech-speed-value">1.0×</output></label>
  <label class="speech-setting" for="speech-timer"><span>睡眠定时</span><select id="speech-timer"><option value="off">关闭</option><option value="clip">读完当前句</option><option value="5">5 分钟</option><option value="15">15 分钟</option><option value="30">30 分钟</option><option value="60">60 分钟</option></select></label>
  <div class="speech-transport"><button type="button" id="speech-previous" class="text-btn" aria-label="上一句">上一句</button><button type="button" id="speech-play" class="speech-play">暂停</button><button type="button" id="speech-next" class="text-btn" aria-label="下一句">下一句</button></div>
  <div class="speech-links"><button type="button" id="speech-visible" class="text-btn">从当前阅读位置开始</button><button type="button" id="speech-locate" class="text-btn">回到播放位置</button></div>
</section>

<script>if ("serviceWorker" in navigator) { navigator.serviceWorker.register("/sw.js", { scope: "/" }); }</script>
<script src="/static/tts-client.js?v=clips-11"></script>
<script src="/static/app.js?v=result-path-1"></script>
</body>
</html>