Files

220 lines
5.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# webook
📖 一个命令行工具,将 Markdown 笔记目录渲染为 Web 预览页面。
## 特性
- **双栏布局** — 左侧文件导航树 + 右侧内容预览
- **自动导航** — 启动时递归扫描目录结构,生成可折叠的文件树
- **元信息展示** — 显示笔记标题、创建时间、修改时间、字数统计
- **主题包机制** — 内置多套主题,主题与明暗模式分离,方便后续扩展
- **可隐藏侧边栏** — 专注于阅读内容
- **搜索过滤** — 侧边栏顶部搜索框,快速过滤文件(快捷键 `Ctrl+K` / `Cmd+K`
- **代码高亮** — 基于 highlight.js,支持 190+ 编程语言
- **本地图片** — 自动重写相对路径图片链接,支持本地静态资源
- **热更新** — 文件变更时自动刷新浏览器(WebSocket)
- **响应式设计** — 移动端自动适配
## 安装
```bash
npm install -g webook
```
或本地开发:
```bash
git clone <repo-url>
cd webook
npm install
npm link # 将 webook 链接到全局
```
## 使用
### 基本用法
```bash
# 预览当前目录下的 Markdown 笔记
webook
# 预览指定目录
webook ~/my-notes
# 指定端口
webook ~/my-notes --port=3000
# 指定监听地址和网站标题
webook ~/my-notes --host=0.0.0.0 --title="我的知识库"
```
### 参数说明
| 参数 | 说明 | 默认值 |
|------|------|--------|
| `<dir>` | 笔记根目录路径 | 当前目录 `.` |
| `--port, -p <number>` | 监听端口(被占用时自动递增) | `8000` |
| `--host, -h <address>` | 监听地址 | `127.0.0.1` |
| `--title, -t <title>` | 网站标题 | 根目录名 |
| `--theme <path>` | 额外叠加的自定义 CSS 文件路径 | 无 |
| `--open` | 启动后自动打开浏览器 | `false` |
| `--version, -V` | 显示版本号 | — |
### 示例
```bash
# 最小化使用
webook
# 完整参数
webook ~/Documents/notes --port=8080 --host=0.0.0.0 --title="我的笔记" --open
# 使用自定义主题
webook ./docs --theme=./my-theme.css
```
## 页面功能
### 侧边栏
- **文件树**:自动递归生成,目录可折叠/展开
- **搜索**:输入关键词实时过滤文件,按 `Esc` 清空搜索
- **隐藏**:点击工具栏 `☰` 按钮或使用快捷键
### 内容区
- 显示笔记标题、创建时间、修改时间、字数
- 支持 Markdown 全部语法:标题、表格、代码块、引用、列表、任务列表等
- 代码块自动语法高亮
### 主题切换
- 顶部下拉框可切换内置主题包
- 点击工具栏 `🌙` / `☀︎` 按钮切换浅/暗模式
- 主题包与明暗模式都会自动保存,下次打开保持
### 移动端
- 在手机上浏览时,侧边栏默认隐藏
- 点击右下角浮动按钮打开侧边栏
- 点击遮罩层或选文件后自动关闭
## 主题扩展
### 内置主题目录
每个主题都放在独立文件夹下,便于后续新增、替换和维护:
```text
public/themes/
├── default/
│ ├── manifest.json
│ ├── theme.css
│ ├── highlight-light.css
│ └── highlight-dark.css
└── paper/
├── manifest.json
├── theme.css
├── highlight-light.css
└── highlight-dark.css
```
`manifest.json` 示例:
```json
{
"id": "paper",
"label": "Paper",
"defaultMode": "light",
"stylesheet": "theme.css",
"highlight": {
"light": "highlight-light.css",
"dark": "highlight-dark.css"
}
}
```
`theme.css` 通过 `data-theme-id``data-color-mode` 覆盖变量。建议参考 `public/themes/default/theme.css`
```css
html[data-theme-id="paper"][data-color-mode="light"] {
--bg: #f3ece1;
--text: #3f2f21;
--brand: #8a5a2b;
--body-bg: linear-gradient(180deg, #fff8ed 0%, #f3ece1 100%);
/* ... */
}
html[data-theme-id="paper"][data-color-mode="dark"] {
--bg: #17120d;
--text: #f1e4d4;
--brand: #d1a16c;
/* ... */
}
```
### 外部覆盖样式
通过 `--theme` 参数传入外部 CSS 文件路径(支持相对路径和绝对路径),会在内置主题之后加载,适合做局部覆盖:
```bash
webook ./docs --theme=./my-theme.css
webook ./docs --theme=/absolute/path/to/my-theme.css
```
## 目录结构要求
webook 只扫描 `.md``.markdown` 文件。目录推荐按主题分组:
```
my-notes/
├── README.md # 首页(如果存在会自动加载)
├── 编程/
│ ├── JavaScript.md
│ └── Python.md
├── 阅读/
│ └── 读书笔记.md
└── 工具/
└── Git常用命令.md
```
- 隐藏文件(`.` 开头)和 `node_modules` 会被自动跳过
- 目录和文件均按名称字母排序(中文按拼音)
## npm 发布
要将 webook 发布到 npm(例如 `@wu2kong/webook`),修改 `package.json` 中的 `name` 字段:
```json
{
"name": "@wu2kong/webook",
...
}
```
然后:
```bash
npm login
npm publish --access public
```
发布后,用户可以通过以下命令安装:
```bash
npm install -g @wu2kong/webook
```
## 技术栈
- **后端**: Node.js + Express
- **Markdown 渲染**: markdown-it
- **代码高亮**: highlight.js
- **文件监听**: chokidar
- **热更新**: WebSocket (ws)
- **CLI**: commander
## License
MIT