Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
48 commits
Select commit Hold shift + click to select a range
752cb84
fix: MutationObserver infinite loop crashing linux.do and WeChat pages
izscc Mar 23, 2026
2b3f235
fix: scroll-collect stops halfway on long Feishu documents
izscc Mar 23, 2026
91bbd1a
fix: 修复 Windows DLL 崩溃 + 10 个代码 BUG
Mar 25, 2026
38485f3
feat: 跨设备同步 + Windows 兼容性修复 + 扩展 bug 修复 (v1.1.0)
Mar 25, 2026
54cacc6
fix: 修复 6 个扩展 bug(GraphQL 权限、监听器泄漏、有序列表等)
Mar 25, 2026
f8d407b
fix: 修复 Windows 打包后 sys.stdout 为 None 导致启动崩溃
Mar 25, 2026
52a44a5
fix: 修复 Windows 设置向导字体乱码和 emoji 渲染问题
Mar 25, 2026
72df20d
fix: 增大设置向导窗口高度,修复步骤3按钮被截断
AchengBusiness Mar 25, 2026
f5b1f25
fix: 设置向导窗口改为可调整大小,支持最大化
AchengBusiness Mar 25, 2026
aac3719
fix: 修复跨平台内容提取和 Obsidian 渲染的多个功能性 bug
AchengBusiness Mar 25, 2026
64dde84
feat: V1.2.0 - platform folders, local image download, multi-platform…
AchengBusiness Mar 25, 2026
c90857f
fix: V1.2.1 - 多平台 bug 修复 + 飞书 JSON API + 覆盖去重选项
AchengBusiness Mar 25, 2026
17859b5
fix: V1.2.2 - 修复多个 bug
AchengBusiness Mar 25, 2026
2b29fd7
fix: 清理 Front Matter title 和文件名中的视频/媒体占位符
AchengBusiness Mar 25, 2026
fa6c38c
chore: bump version to 1.2.3
AchengBusiness Mar 25, 2026
06f094c
chore: update build workflow default version to 1.2.3
AchengBusiness Mar 25, 2026
027d8b7
docs: 更新 README - 完整更新日志 v1.0.9~v1.2.3 + 致谢原作者
AchengBusiness Mar 25, 2026
866954a
fix: 单线程服务器改为多线程,解决并发请求导致页面卡死
AchengBusiness Mar 25, 2026
540127c
fix: 修复多标签页并发竞态 + 设置向导弹窗缩小问题
AchengBusiness Mar 25, 2026
ecde087
fix: avoid wrapping LinuxDo images in nested links
izscc Mar 25, 2026
e7d25fc
release: prepare v1.2.4
izscc Mar 25, 2026
6459ea8
ci: upgrade GitHub Actions versions
izscc Mar 25, 2026
bdfe2cd
fix: 全面审计修复 - 中文FM字段、视频下载、线程安全、并发快照
AchengBusiness Mar 25, 2026
8d62b81
feat: v1.3.0 - 评论提取、iframe嵌入、Discourse多域名、embed_mode切换
AchengBusiness Mar 25, 2026
82dc57d
feat: 飞书文档一键复制功能 + 多平台浮动按钮扩展
AchengBusiness Mar 29, 2026
b918799
chore: bump version to v1.4.0
AchengBusiness Mar 29, 2026
75a3f84
feat: Discourse点赞按钮单击保存/双击点赞
AchengBusiness Mar 29, 2026
d1dfe1b
feat: 添加Discourse重复保存保护
AchengBusiness Mar 29, 2026
e92f0ef
feat: 评论点赞保存逻辑优化
AchengBusiness Mar 29, 2026
3ce1b05
fix: 发布时间转北京时间(UTC+8) + 平台名统一中文
AchengBusiness Mar 29, 2026
fd440fd
feat: 自动提取标签写入frontmatter
AchengBusiness Mar 29, 2026
f40d2de
feat: 多目标保存(飞书/Notion/HTML) + 全面错误处理审计修复
AchengBusiness Mar 29, 2026
0bda49b
fix: 全面代码质量修复 — 安全加固 + Obsidian兼容 + Markdown转义
AchengBusiness Mar 29, 2026
3b9fb99
fix: 修复一键复制/飞书/Notion/HTML导出设置无法保存的问题
AchengBusiness Mar 29, 2026
8363cb3
fix: 修复文件名含 # 号导致 Markdown 图片路径断裂的问题
AchengBusiness Mar 29, 2026
9fe77e2
revert: 还原 sanitize_filename 和图片路径的改动
AchengBusiness Mar 29, 2026
d8ea959
fix: 图片/视频引用路径添加 ./ 前缀,修复 Obsidian 路径解析
AchengBusiness Mar 29, 2026
0e5bcdb
feat: v1.5.0 — 微信视频号开关、选项面板重构、跨平台构建修复
AchengBusiness Mar 29, 2026
6925517
feat: v1.5.1 — 时区修复、配置缓存、飞书表格渲染、多平台增强
AchengBusiness Mar 29, 2026
da208f5
v1.5.2: 修复升级兼容性,更新全部描述文件
AchengBusiness Mar 29, 2026
b52eb4e
fix: 修复 X/Twitter 书签按钮卡住问题 - 为所有 fetch 调用添加超时控制
AchengBusiness Mar 29, 2026
cf479cd
feat: 增强飞书字段验证+自动创建、微信付费文章遮罩移除、Discourse超时修复
AchengBusiness Mar 29, 2026
88a74fa
fix: 飞书必需字段修正为 9 个,保存时写入分类/标签/评论数
AchengBusiness Mar 29, 2026
525050d
fix: 飞书必需字段修正为 7 个,作者改为单选类型
AchengBusiness Mar 29, 2026
f066713
feat: 飞书聊天记录提取 + Discourse多域名修复 + 代码审核修复
AchengBusiness Mar 29, 2026
58c2e38
docs: update README, spec, build config for v1.6.0
AchengBusiness Mar 29, 2026
80ec47d
feat: 全面代码审查修复 + EXE详细日志 + 崩溃防护
AchengBusiness Mar 29, 2026
325586f
fix: v1.6.0 代码审查修复 — P0 bug 2个 + 配置补全
AchengBusiness Mar 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 11 additions & 4 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ on:
version:
description: '版本号(如 1.0.0)'
required: false
default: '1.0.8'
default: '1.6.0'
# 推送 tag 时自动触发(如 git tag v1.0.0 && git push --tags)
push:
tags:
Expand Down Expand Up @@ -37,7 +37,7 @@ jobs:
- name: 安装 Python
uses: actions/setup-python@v5
with:
python-version: '3.13'
python-version: '3.12'

- name: 安装依赖
run: |
Expand Down Expand Up @@ -127,12 +127,14 @@ jobs:
merge-multiple: true

- name: 创建 GitHub Release
uses: softprops/action-gh-release@v2
uses: softprops/action-gh-release@v2.6.1
with:
name: X2MD ${{ github.ref_name }}
body: |
## X2MD ${{ github.ref_name }}

网页内容一键转 Markdown — 支持 X/Twitter、LINUX DO、Discourse、飞书(文档/聊天记录)、微信公众号,多目标保存到 Obsidian / 飞书多维表格 / Notion / HTML。

### 下载
- **Mac 版**:`X2MD_Mac.zip` — 解压后双击 `X2MD.app` 即可运行
- **Windows 版**:`X2MD_Windows.zip` — 解压后双击 `X2MD.exe` 即可运行
Expand All @@ -141,7 +143,12 @@ jobs:
### 首次使用
1. 打开应用,按向导设置保存路径
2. 解压 `X2MD_Extension.zip` 并在 `chrome://extensions/` 中加载已解压的扩展程序
3. 在 X/Twitter 页面使用书签按钮保存内容
3. 在支持的网站(X/Twitter、LINUX DO、Discourse、飞书文档/聊天记录、微信公众号)使用保存按钮保存内容
4. 打开扩展选项页面可配置多目标保存、评论提取等高级功能

### 升级用户须知
- 从旧版本升级后首次运行,应用会自动合并新增配置字段并更新扩展文件
- 你的已有设置(保存路径等)不会被覆盖

### 系统要求
- Mac: macOS 12+
Expand Down
144 changes: 126 additions & 18 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
# X2MD

把 X/Twitter、LINUX DO、飞书、微信公众号内容一键保存为 Obsidian 可用的 Markdown。
把 X/Twitter、LINUX DO、飞书(知识库/云文档/聊天记录)、微信公众号内容一键保存为 Obsidian 可用的 Markdown。

[![GitHub Repo](https://img.shields.io/badge/GitHub-izscc%2Fx2md-181717?logo=github)](https://github.com/izscc/x2md)
[![Latest Release](https://img.shields.io/github/v/release/izscc/x2md)](https://github.com/izscc/x2md/releases/latest)
[![Build](https://img.shields.io/github/actions/workflow/status/izscc/x2md/build.yml?label=build)](https://github.com/izscc/x2md/actions/workflows/build.yml)

> **致谢**: 感谢 [@AchengBusiness](https://github.com/AchengBusiness) 提供 Windows 兼容性修复、多平台 Bug 修复、新功能与测试套件,这批改动已合并回主仓库。

## 教程导览图

![X2MD 快速上手流程](docs/images/tutorial-flow.svg)
Expand All @@ -17,6 +19,7 @@
- 你需要把 Thread / Note 长文转成可编辑 Markdown,用于二次创作。
- 你在 LINUX DO 论坛中看到值得收藏的帖子。
- 你在飞书知识库阅读团队文档,想要本地留档。
- 你想把飞书网页版的聊天记录导出为 Markdown 存档。
- 你在微信公众号看到好文章,想保存完整 Markdown 副本。

## 支持平台
Expand All @@ -25,19 +28,21 @@
|------|----------|------|
| X / Twitter | 点击书签按钮 | 支持 Tweet、Thread、Note/Article、图片和视频 |
| LINUX DO | 点赞 / 悬浮保存按钮 | 支持话题帖子内容 |
| 飞书 | 悬浮保存按钮 | 支持 wiki 知识库和 docx 云文档(自动滚动收集完整内容) |
| Discourse(自定义域名) | 悬浮保存按钮 | 支持任意 Discourse 论坛(在选项页面配置域名) |
| 飞书文档 | 悬浮保存按钮 | 支持 wiki/docx/docs/sheets/mindnotes/minutes(自动滚动收集完整内容) |
| 飞书聊天记录 | 悬浮保存按钮 | 支持网页版 messenger 聊天记录导出(内部 API + DOM 双策略) |
| 微信公众号 | 悬浮保存按钮 | 支持公众号文章(含图片、代码块、引用等) |

## 3 分钟快速上手(推荐)

### 第 1 步:下载客户端(基于 GitHub Release)

- 打开 [Releases](https://github.com/izscc/x2md/releases/latest)
- 当前最新版本(截至 2026-03-24):[`v1.0.8`](https://github.com/izscc/x2md/releases/tag/v1.0.8)
- 当前最新版本:[`v1.6.0`](https://github.com/izscc/x2md/releases/tag/v1.6.0)
- 下载对应平台包:
- Mac: [`X2MD_Mac.zip`](https://github.com/izscc/x2md/releases/download/v1.0.8/X2MD_Mac.zip)
- Windows: [`X2MD_Windows.zip`](https://github.com/izscc/x2md/releases/download/v1.0.8/X2MD_Windows.zip)
- 扩展: [`X2MD_Extension.zip`](https://github.com/izscc/x2md/releases/download/v1.0.8/X2MD_Extension.zip)
- Mac: [`X2MD_Mac.zip`](https://github.com/izscc/x2md/releases/download/v1.6.0/X2MD_Mac.zip)
- Windows: [`X2MD_Windows.zip`](https://github.com/izscc/x2md/releases/download/v1.6.0/X2MD_Windows.zip)
- 扩展: [`X2MD_Extension.zip`](https://github.com/izscc/x2md/releases/download/v1.6.0/X2MD_Extension.zip)

### 第 2 步:首次运行并完成向导

Expand All @@ -58,10 +63,11 @@

1. **X / Twitter**:打开任意推文页,点击推文操作区的书签按钮。
2. **LINUX DO**:打开话题页,点赞帖子或点击右上角悬浮 MD 按钮。
3. **飞书**:打开 wiki 或 docx 页面,点击右上角悬浮 MD 按钮。
4. **微信公众号**:打开公众号文章页,点击右上角悬浮 MD 按钮。
5. 扩展会将内容发送到本地服务并生成 Markdown。
6. 到你设置的目录查看 `.md` 文件。
3. **飞书文档**:打开 wiki/docx/docs/sheets/mindnotes/minutes 页面,点击右上角悬浮 MD 按钮。
4. **飞书聊天记录**:打开飞书网页版 messenger 页面,点击右上角悬浮 MD 按钮。
5. **微信公众号**:打开公众号文章页,点击右上角悬浮 MD 按钮。
6. 扩展会将内容发送到本地服务并生成 Markdown。
7. 到你设置的目录查看 `.md` 文件。

### 第 5 步:在 Obsidian 中查看结果

Expand All @@ -71,15 +77,30 @@

## 常用配置(进阶)

配置文件为根目录的 `config.json`常用字段:
配置文件位于应用数据目录下的 `config.json`(Mac: `~/Library/Application Support/X2MD/`,Windows: `%APPDATA%/X2MD/`),也可通过扩展选项页面可视化修改。常用字段:

**基础设置:**
- `save_paths`: Markdown 输出目录列表
- `filename_format`: 文件名模板,支持 `{summary}` `{date}` `{author}`
- `max_filename_length`: 文件名长度上限
- `video_save_path`: 视频保存路径
- `enable_video_download`: 是否下载视频
- `video_duration_threshold`: 超长视频二次确认阈值(分钟)
- `show_site_save_icon`: 是否在支持的站点显示悬浮保存按钮
- `enable_platform_folders`: 是否按平台分子文件夹(Twitter/、LINUX DO/、Discourse/、飞书/、飞书聊天/、微信公众号/)
- `download_images`: 是否下载远程图片到本地(存入 `assets/` 子目录)
- `overwrite_existing`: 是否覆盖已存在的同名文件(基于 Front Matter `源:` URL 去重)

**多目标保存:**
- `save_to_obsidian`: 保存到本地 Markdown(默认开启)
- `save_to_feishu`: 保存到飞书多维表格(需配置飞书 App ID/Secret/Token)
- `save_to_notion`: 保存到 Notion 数据库(需配置 Notion Token)
- `export_html`: 同时导出 HTML 文件

**评论提取:**
- `enable_comments`: 是否提取评论
- `max_comments`: 最大评论数
- `comments_display`: 评论展示方式(`details` 折叠 / `inline` 内联)

推荐模板示例:

Expand All @@ -88,7 +109,14 @@
"filename_format": "{summary}_{date}_{author}",
"max_filename_length": 60,
"enable_video_download": true,
"video_duration_threshold": 5
"video_duration_threshold": 5,
"enable_platform_folders": true,
"download_images": true,
"overwrite_existing": false,
"save_to_obsidian": true,
"save_to_feishu": false,
"save_to_notion": false,
"enable_comments": false
}
```

Expand Down Expand Up @@ -159,7 +187,7 @@ CI 工作流见 [`.github/workflows/build.yml`](./.github/workflows/build.yml)
│ ├── dom_utils.js # 共享 DOM 工具函数
│ ├── article_markdown.js # X Article 富文本转 Markdown
│ ├── discourse.js # LINUX DO 话题帖子提取
│ ├── feishu.js # 飞书 wiki/docx block 解析
│ ├── feishu.js # 飞书 wiki/docx/messenger 提取与解析
│ ├── wechat.js # 微信公众号文章提取
│ ├── site_actions.js # 站点识别与悬浮按钮配置
│ ├── content.js # 内容脚本主入口
Expand All @@ -171,7 +199,87 @@ CI 工作流见 [`.github/workflows/build.yml`](./.github/workflows/build.yml)

## 更新日志

### v1.0.8(2026-03-24)
### v1.6.0(2026-03-29)

- 新增飞书网页版聊天记录提取(messenger 页面),支持内部 API 注入 + DOM 双策略自动降级
- 新增 Discourse 多域名悬浮保存按钮支持(自定义域名在选项页面配置后,悬浮按钮自动生效)
- 修复自定义 Discourse 域名点击悬浮按钮无反应的问题(`handleFloatingSave` 缺少 discourse case)
- 修复自定义 Discourse 域名列表未同步到 `site_actions.js` 导致悬浮按钮不显示的问题
- 新增 `sendToBackground` 诊断日志,便于排查数据发送问题
- 扩展飞书 URL 匹配:新增 sheets、mindnotes 路径支持
- 统一所有组件版本号到 1.6.0

### v1.5.2(2026-03-29)

- 修复版本升级后设置向导不弹出、扩展文件不更新的问题
- 新增配置自动合并:升级版本后新增的配置字段自动补全,不覆盖用户已有设置
- 新增扩展版本检测:通过 manifest.json 版本号判断是否需要更新本地 extension 文件夹
- 更新设置向导描述:反映多平台(X/Twitter、LINUX DO、飞书、微信公众号)和多目标保存能力
- 统一所有组件版本号到 1.5.2(server.py / manifest.json / x2md.spec / build.yml)

### v1.5.1(2026-03-28)

- 修复 PyInstaller 打包环境下 `ZoneInfo("Asia/Shanghai")` 时区错误导致飞书文章保存 500 的问题
- 新增 ZoneInfo 运行时验证,打包缺失 tzdata 时自动降级为 UTC+8 timedelta
- 补全 config.json 所有缺失的默认字段(飞书多维表格、Notion、HTML 导出等 15+ 字段)
- 新增错误日志 traceback 完整输出,便于排查 Markdown 构建异常

### v1.5.0(2026-03-27)

- 新增完整选项面板:9 大分类设置(外观、保存目标、文件路径、媒体嵌入、内容提取、飞书、Notion、HTML 导出、同步)
- 新增多目标保存:Obsidian + 飞书多维表格 + Notion + HTML 导出
- 新增评论提取功能:支持 Discourse 评论、楼层范围筛选
- 新增 Discourse 多域名支持
- 新增配置导入/导出功能
- 新增图片嵌入模式切换(本地/远程链接)

### v1.2.4(2026-03-25)

- 合并 [@AchengBusiness](https://github.com/AchengBusiness) 的跨平台修复与增强:Windows 兼容性修复、平台分类文件夹、图片本地下载、覆盖/去重、飞书 JSON API、配置导入导出
- 新增 66 个自动化测试(23 个服务端回归 + 43 个 Obsidian 渲染),发布前全部通过
- 修复 LinuxDo lightbox 图片被包成嵌套链接的问题,确保导出 Markdown 为直接图片引用
- README 下载链接、版本徽章与发版口径切回主仓库
### v1.2.3(2026-03-25)

- 修复视频占位符 `[MEDIA_VIDEO_URL:xxx]` 泄漏到 Front Matter title 和文件名的 Bug
- 同步所有组件版本号到 1.2.3(server.py / manifest.json / x2md.spec)
- 新增 43 个 Obsidian 渲染专项测试,全部 66 个测试 100% 通过

### v1.2.2(2026-03-25)

- 修复飞书嵌套列表只输出 children 丢失父级文本的问题
- 修复飞书 `document.head` 为 null 时注入 CSS 崩溃
- 修复 background.js 中 `noteResultVideos` 死代码导致视频合并失败
- 修复 Twitter GraphQL 提取中 `note_tweet` 结构变化的兼容性
- 修复微信公众号代码块 `<br>` 未转换为换行的问题

### v1.2.1(2026-03-25)

- 新增覆盖/去重选项:基于 Front Matter `源:` URL 自动跳过已保存文件
- 新增飞书 JSON API 提取策略(3 层自动降级:JSON API -> DOM -> 滚动收集)
- 修复 LINUX DO 有序列表和嵌套列表缩进
- 修复多个平台 Front Matter 字段缺失问题

### v1.2.0(2026-03-25)

- 新增平台分类文件夹功能(Twitter/、LinuxDo/、Feishu/、WeChat/)
- 新增图片本地下载功能(远程图片 -> assets/ 子目录,相对路径引用)
- 修复跨平台内容提取和 Obsidian 渲染的多个 Bug

### v1.1.0(2026-03-24)

- 新增跨设备配置同步功能
- 修复 Windows 打包后 `sys.stdout` 为 None 导致启动崩溃
- 修复 Windows 设置向导字体乱码和 emoji 渲染问题
- 修复 6 个扩展 Bug(GraphQL 权限、监听器泄漏、有序列表等)

### v1.0.9(2026-03-24)

- 修复 Windows DLL 崩溃(strip 损坏 DLL + UPX 压缩 Python/VC++ DLL)
- 修复 10 个代码 Bug(路径处理、编码、Front Matter 格式等)
- PyInstaller spec 增加 DLL 保护白名单

### v1.0.8(2026-03-24)- 原版最终版本

- 修复飞书虚拟渲染导致丢失 85% 内容的问题,新增滚动收集机制
- 补充飞书 iframe、table、base_refer、synced_source 等 block 类型
Expand All @@ -190,8 +298,8 @@ CI 工作流见 [`.github/workflows/build.yml`](./.github/workflows/build.yml)

- 修复 X 长文代码块语言标签未并入 Markdown fenced code block 的问题

## GitHub 数据来源
## 致谢

感谢所有贡献者,特别是 [@AchengBusiness](https://github.com/AchengBusiness) 为本次跨平台增强版带来的大量修复、功能和测试补充。

- 仓库信息: <https://api.github.com/repos/izscc/x2md>
- 语言统计: <https://api.github.com/repos/izscc/x2md/languages>
- 最新发布: <https://api.github.com/repos/izscc/x2md/releases/latest>
如果这个工具对你有帮助,欢迎给 [izscc/x2md](https://github.com/izscc/x2md) 点个 Star。
59 changes: 53 additions & 6 deletions config.json
Original file line number Diff line number Diff line change
@@ -1,9 +1,56 @@
{
"port": 9527,
"save_paths": [
"/Users/zscc.in/Desktop/船仓文件/Obsidian/OB/00-资料库/📄 素材库"
],
"filename_format": "{summary}",
"save_paths": [],
"filename_format": "{summary}_{date}_{author}",
"max_filename_length": 60,
"setup_completed": false
}
"setup_completed": false,
"show_site_save_icon": true,
"enable_copy_unlock": false,
"enable_video_download": true,
"video_duration_threshold": 5,
"video_save_path": "",
"enable_platform_folders": true,
"platform_folder_names": {
"Twitter/X": "Twitter",
"LINUX DO": "LINUX DO",
"Discourse": "Discourse",
"飞书": "飞书",
"飞书聊天": "飞书聊天",
"微信公众号": "微信公众号"
},
"download_images": true,
"image_subfolder": "assets",
"enable_wechat_video_channel": false,
"overwrite_existing": false,
"sync_enabled": true,
"enable_comments": false,
"comments_display": "details",
"max_comments": 200,
"comment_floor_range": "",
"discourse_domains": [
"linux.do"
],
"embed_mode": "local",
"save_to_obsidian": true,
"save_to_feishu": false,
"save_to_notion": false,
"export_html": false,
"feishu_api_domain": "feishu",
"feishu_app_id": "",
"feishu_app_secret": "",
"feishu_app_token": "",
"feishu_table_id": "",
"feishu_upload_md": false,
"feishu_upload_html": false,
"notion_token": "",
"notion_database_id": "",
"notion_prop_title": "标题",
"notion_prop_url": "链接",
"notion_prop_author": "作者",
"notion_prop_tags": "标签",
"notion_prop_saved_date": "保存日期",
"notion_prop_type": "类型",
"html_export_folder": "X2MD导出",
"theme": "dark",
"notion_prop_comment_count": "评论数"
}
27 changes: 23 additions & 4 deletions extension/article_markdown.js
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@
const style = safeGetComputedStyle(element, options);
const fontWeight = style.fontWeight;
const numericWeight = parseInt(fontWeight, 10);
return fontWeight === "bold" || Number.isFinite(numericWeight) && numericWeight >= 700;
return fontWeight === "bold" || (Number.isFinite(numericWeight) && numericWeight >= 700);
}

function isBlockElement(element, options = {}) {
Expand Down Expand Up @@ -178,22 +178,40 @@
if (text.includes("![](") || text.includes("[MEDIA_VIDEO_URL:") || text.includes("[[VIDEO_HOLDER_")) {
return markdown;
}
return `[${text}](${href})`;
return `[${escapeMdLinkText(text)}](${escapeMdLinkUrl(href)})`;
}

if (isBoldElement(element, options) && markdown.trim()) {
markdown = `**${markdown.replace(/\*\*/g, "")}**`;
}

// 斜体
if ((tag === "em" || tag === "i") && markdown.trim()) {
markdown = `*${markdown.trim()}*`;
}

// 删除线
if ((tag === "del" || tag === "s") && markdown.trim()) {
markdown = `~~${markdown.trim()}~~`;
}

if (tag === "h1") markdown = `\n# ${markdown.replace(/\*\*/g, "").trim()}\n`;
else if (tag === "h2") markdown = `\n## ${markdown.replace(/\*\*/g, "").trim()}\n`;
else if (tag === "h3") markdown = `\n### ${markdown.replace(/\*\*/g, "").trim()}\n`;
else if (tag === "h4" || tag === "h5" || tag === "h6") markdown = `\n#### ${markdown.replace(/\*\*/g, "").trim()}\n`;
else if (tag === "h4") markdown = `\n#### ${markdown.replace(/\*\*/g, "").trim()}\n`;
else if (tag === "h5") markdown = `\n##### ${markdown.replace(/\*\*/g, "").trim()}\n`;
else if (tag === "h6") markdown = `\n###### ${markdown.replace(/\*\*/g, "").trim()}\n`;
else if (tag === "blockquote") {
const lines = markdown.trim().split("\n").filter((line) => line.trim() !== "");
markdown = "\n" + lines.map((line) => "> " + line).join("\n") + "\n";
} else if (tag === "li") {
markdown = `\n- ${markdown.trim()}\n`;
const parentTag = (element.parentElement?.tagName || "").toLowerCase();
if (parentTag === "ol") {
const idx = Array.from(element.parentElement.children).indexOf(element) + 1;
markdown = `\n${idx}. ${markdown.trim()}\n`;
} else {
markdown = `\n- ${markdown.trim()}\n`;
}
} else if (isBlockElement(element, options)) {
markdown = `\n${markdown}\n`;
}
Expand All @@ -217,5 +235,6 @@
module.exports = exported;
}

globalScope.X2MD = Object.assign(globalScope.X2MD || {}, exported);
Object.assign(globalScope, exported);
})(typeof globalThis !== "undefined" ? globalThis : this);
Loading