vitepress-plugin-filelist 0.6.2 → 0.7.1
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/README.md +28 -2
- package/dist/client/browser/index.d.ts +35 -1
- package/dist/client/browser/index.js +622 -214
- package/dist/client/ssr/index.d.ts +35 -1
- package/dist/client/ssr/index.js +362 -23
- package/dist/client/style.css +175 -1
- package/package.json +8 -2
package/README.md
CHANGED
|
@@ -9,9 +9,10 @@
|
|
|
9
9
|
- 📦 批量打包 ZIP(基于 `client-zip`),带进度、可取消;Chrome / Edge 边下载边写入磁盘,不受大小限制;保留目录结构,不同目录的同名文件不会互相覆盖
|
|
10
10
|
- 📄 大目录每个文件夹先显示 200 条,可“显示更多 / 全部显示”
|
|
11
11
|
- ⬇️ 单文件下载(`fs/get` 的 `raw_url`,回退 `/d/`):交给浏览器下载;OpenList 自己的 `/p/`、`/d/` 链接在当前页直接下载、不打开新标签页,存储直链在新标签页打开
|
|
12
|
-
- 👁️ 弹窗预览(不跳转):图片、音视频、文本、PDF;Office 等其它类型显示文件信息与下载
|
|
12
|
+
- 👁️ 弹窗预览(不跳转):图片、音视频、文本、PDF;Markdown / HTML 可在源码与渲染之间切换;Office 等其它类型显示文件信息与下载
|
|
13
13
|
- 🔐 目录密码输入,可选只读 token
|
|
14
|
-
- 🔎
|
|
14
|
+
- 🔎 筛选并高亮关键词;“深度搜索”读取未展开的子目录,结果直接出现在原位置
|
|
15
|
+
- ↕️ 按名称 / 大小 / 日期排序;名称排序跟随界面语言(中文按拼音、英文按字母),数字按自然顺序
|
|
15
16
|
- 🎨 紧凑表格:按文件类型着色的扩展名标签、层级引导线,跟随 VitePress 亮 / 暗主题
|
|
16
17
|
- 📱 窄容器(< 560px)自动切换为双行列表与 44px 触控区,勾选后工具栏变为吸顶操作条
|
|
17
18
|
- 🌐 使用 `/api/fs/list`、`/api/fs/get`、`/api/public/settings`
|
|
@@ -83,6 +84,8 @@ export default {
|
|
|
83
84
|
| `password` | `string` | `''` | 目录密码,也可以在运行时输入 |
|
|
84
85
|
| `rememberPassword` | `boolean` | `true` | 输入密码时是否提供“在此标签页中记住”开关;`false` 时不写入 sessionStorage |
|
|
85
86
|
| `pageSize` | `number` | `200` | 每个文件夹先显示的条数,之后显示“显示更多 / 全部显示”;`0` 全部显示 |
|
|
87
|
+
| `deepSearchLimit` | `number` | `500` | 深度搜索每次最多读取的文件夹数,之后可“继续” |
|
|
88
|
+
| `deepSearch` | `'manual' \| 'auto'` | `'manual'` | `auto`:输入关键词即自动深度搜索(适合挂载目录不大的站点) |
|
|
86
89
|
| `zipWarnSize` | `number` | `500`(触屏 `200`) | 需在内存中打包的浏览器(Firefox、Safari)超过该大小(MB)先确认;`0` 不提示 |
|
|
87
90
|
| `zipMaxSize` | `number` | `2048`(触屏 `1024`) | 同上,超过该大小(MB)不打包;`0` 不限制 |
|
|
88
91
|
| `title` | `string` | `''` | 工具栏标题;为空时回退到 OpenList 的 `site_title` |
|
|
@@ -144,6 +147,16 @@ interface FileListSource {
|
|
|
144
147
|
- 数据一次全部取回,只减少渲染:排序后再截取,勾选文件夹 / 全选包含未显示的文件,输入筛选词时显示全部匹配
|
|
145
148
|
- 刷新后保留已展开的条数
|
|
146
149
|
|
|
150
|
+
## 筛选与深度搜索
|
|
151
|
+
|
|
152
|
+
- 输入关键词后立即筛选已加载的内容,显示匹配项及其所在目录,关键词高亮;搜索框右侧的 ×(或 Esc)清除筛选,回到原来的展开状态
|
|
153
|
+
- 挂载目录下还有未加载的子文件夹时,列表末尾居中显示“只筛选了已加载的内容,**尝试深度搜索**”
|
|
154
|
+
- 深度搜索不使用 OpenList 的搜索接口(无需搜索索引):组件逐个读取未加载的子文件夹(同时 4 个,每次最多 `deepSearchLimit` 个),匹配项出现在原位置,可勾选、打包、预览、下载
|
|
155
|
+
- 点过一次即进入**深度搜索状态**,直到清空关键词:更换关键词、刷新、解锁文件夹后都会自动继续,不再出现按钮;刷新时结果保留,读完一次性替换
|
|
156
|
+
- 搜索中可“停止”,达到上限或停止后显示“继续”
|
|
157
|
+
- 深度搜索无法进入的加密文件夹会显示在结果中(带锁,提示“未搜索(需要密码)”),可原地输入密码,解锁后自动搜索其中内容
|
|
158
|
+
- `deep-search="auto"` 时输入关键词即自动进入深度搜索状态
|
|
159
|
+
|
|
147
160
|
## 刷新与目录密码
|
|
148
161
|
|
|
149
162
|
- **刷新**:保留当前列表并调暗,表头下方显示进度条;完成后整体替换,已展开的目录和仍存在的勾选会保留。刷新失败时保留旧数据并提示。刷新只重新读取 OpenList 的目录缓存(游客没有写权限,无法强制刷新存储)
|
|
@@ -171,9 +184,13 @@ interface FileListSource {
|
|
|
171
184
|
| 图片 | png、jpg、gif、webp、svg、avif | `<img>`,可旋转、切换原始大小 |
|
|
172
185
|
| 视频 / 音频 | mp4、webm、mov / mp3、m4a、flac、wav | 原生播放器(格式以浏览器支持为准) |
|
|
173
186
|
| 文本 | txt、md、json、csv、yaml、日志与常见代码 | 只读取前 1 MB(Range 请求),纯文本显示 |
|
|
187
|
+
| Markdown / HTML | md、markdown / html、htm | 默认显示源码;可切换为“渲染”(见下) |
|
|
174
188
|
| PDF | pdf | 优先使用 OpenList `iframe_previews` 中配置的 PDF 查看器;未配置时用浏览器自带阅读器(下载后以 Blob 显示,上限 50 MB) |
|
|
175
189
|
| 其它(含 Office、压缩包) | — | 弹窗内显示文件信息和下载按钮 |
|
|
176
190
|
|
|
191
|
+
- Markdown 渲染:使用 VitePress 正文样式;内容经 DOMPurify 过滤(去掉脚本、事件属性等);只有 http(s) / mailto 链接可点击并在新标签页打开,相对链接显示为文字;相对路径的图片显示为“[图片:替代文字]”。渲染库按需加载
|
|
192
|
+
- HTML 渲染:放在空 `sandbox` 的 iframe 中,禁止脚本、表单和弹窗,无法访问当前页面;网页引用的相对路径资源不会加载
|
|
193
|
+
- 源码 / 渲染的选择在当前页面内记住
|
|
177
194
|
- 弹窗内 ← / → 切换当前列表中的可预览文件,Esc 或点击遮罩关闭
|
|
178
195
|
- 读取文本和浏览器 PDF 需要文件地址允许跨域:经 OpenList 代理(`/p/`)时由 OpenList 的 CORS 设置决定;网盘直链由网盘决定。失败时显示“无法在页面内预览”和下载按钮
|
|
179
196
|
- `iframe_previews` 来自 `/api/public/settings`,与 OpenList 网页端使用同一配置,占位符 `$url`、`$e_url`、`$b_url`、`$durl`、`$name` 的含义一致
|
|
@@ -260,6 +277,15 @@ pnpm test # Vitest:工具函数、密码、下载、FileList 组件
|
|
|
260
277
|
pnpm run pack:check
|
|
261
278
|
```
|
|
262
279
|
|
|
280
|
+
浏览器测试(Playwright,Chromium 桌面 / 手机、WebKit):`demo/e2e` 下的测试站点连接本地模拟 OpenList(`e2e/mock-openlist.mjs`),检查行高与位移、密码、刷新、显示更多、单文件下载、ZIP(内存 / 流式 / 取消 / 失败)等。
|
|
281
|
+
|
|
282
|
+
```bash
|
|
283
|
+
pnpm run e2e:site # 构建插件和测试站点
|
|
284
|
+
pnpm run test:e2e # 自动启动模拟 OpenList 与站点预览
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
CI 每次推送和 PR 都会运行,三种环境均为必过项。
|
|
288
|
+
|
|
263
289
|
源码结构(`src/client`):
|
|
264
290
|
|
|
265
291
|
| 文件 | 职责 |
|
|
@@ -92,6 +92,28 @@ interface FileListLabels {
|
|
|
92
92
|
unlockFolder: string;
|
|
93
93
|
/** @deprecated Network failures now append `corsHint`. */
|
|
94
94
|
networkHint: string;
|
|
95
|
+
/** Deep search: the row at the end of a filtered list. `{count}` where noted */
|
|
96
|
+
deepHint: string;
|
|
97
|
+
deepSearch: string;
|
|
98
|
+
deepRunning: string;
|
|
99
|
+
deepStop: string;
|
|
100
|
+
deepDone: string;
|
|
101
|
+
deepCapped: string;
|
|
102
|
+
deepContinue: string;
|
|
103
|
+
deepSkipped: string;
|
|
104
|
+
deepFailed: string;
|
|
105
|
+
/** Beside a locked folder shown in deep search results. */
|
|
106
|
+
deepLocked: string;
|
|
107
|
+
/** The × in the filter box. */
|
|
108
|
+
clearFilter: string;
|
|
109
|
+
/** Markdown / HTML preview: the source / rendered switch. */
|
|
110
|
+
viewMode: string;
|
|
111
|
+
viewSource: string;
|
|
112
|
+
viewRendered: string;
|
|
113
|
+
/** Above a rendered HTML file. */
|
|
114
|
+
htmlSandboxNote: string;
|
|
115
|
+
/** Stands in for a Markdown image with a relative path. `{alt}` */
|
|
116
|
+
imageOmitted: string;
|
|
95
117
|
/** Title of the dialog when a batch ZIP fails (the reason is the text). */
|
|
96
118
|
batchFailedTitle: string;
|
|
97
119
|
batchFailedHint: string;
|
|
@@ -156,6 +178,16 @@ interface FileListProps {
|
|
|
156
178
|
* everything. Data is still loaded in full; only rendering is limited.
|
|
157
179
|
*/
|
|
158
180
|
pageSize?: number;
|
|
181
|
+
/**
|
|
182
|
+
* Deep search loads at most this many folders per click (“Continue” goes on).
|
|
183
|
+
* Defaults to `500`.
|
|
184
|
+
*/
|
|
185
|
+
deepSearchLimit?: number;
|
|
186
|
+
/**
|
|
187
|
+
* `manual` (default): “Try deep search” starts deep search mode.
|
|
188
|
+
* `auto`: typing a keyword starts it at once (for small mounts).
|
|
189
|
+
*/
|
|
190
|
+
deepSearch?: 'manual' | 'auto';
|
|
159
191
|
/**
|
|
160
192
|
* Browsers that must build the ZIP in memory (Firefox, Safari) ask first above
|
|
161
193
|
* this many MB. Defaults to 500 (200 on touch devices); `0` never asks.
|
|
@@ -192,6 +224,8 @@ declare const _default: import("vue").DefineComponent<FileListProps, {}, {}, {},
|
|
|
192
224
|
title: string;
|
|
193
225
|
rememberPassword: boolean;
|
|
194
226
|
pageSize: number;
|
|
227
|
+
deepSearchLimit: number;
|
|
228
|
+
deepSearch: "manual" | "auto";
|
|
195
229
|
locale: FileListLocale;
|
|
196
230
|
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
197
231
|
declare global {
|
|
@@ -310,7 +344,7 @@ export declare function previewKind(name: string): PreviewKind;
|
|
|
310
344
|
export declare function totalSize(items: Array<{
|
|
311
345
|
size?: number;
|
|
312
346
|
}>): number;
|
|
313
|
-
export declare function compareNodes(a: SortableNode, b: SortableNode, key: SortKey, ascending?: boolean): number;
|
|
347
|
+
export declare function compareNodes(a: SortableNode, b: SortableNode, key: SortKey, ascending?: boolean, locale?: string): number;
|
|
314
348
|
interface IframePreview {
|
|
315
349
|
label: string;
|
|
316
350
|
scheme: string;
|