HTML 转 Markdown
文本所有处理都在浏览器本地完成,数据不上传服务器
把一段 HTML 变成 Markdown。标题、段落、加粗斜体、链接图片、引用、无序与有序列表(含嵌套)、围栏代码块(语言从 class 里取)、GFM 管道表格都覆盖到了,从网页、富文本编辑器或 Markdown 编辑器里复制出来的内容可以直接粘。三件事值得单独说:正文里会撞上 Markdown 语法的字符会被转义(否则一段含 `*` 的文字会被解析成斜体,而用户看到的只是产物莫名其妙变了样);代码块的围栏会按内容里的反引号自动加长(内容含三反引号时用三个围栏,代码块会提前闭合、后面整段跑成正文);`javascript:` 这类协议不会转成链接,只留文字 —— 产物是要粘进你自己的博客的,一个可点的 XSS 入口不该由这个工具生产。
功能
- 标题、段落、加粗、斜体、删除线、行内代码、链接、图片
- 无序与有序列表(含嵌套,按标记宽度缩进),省略 </li> 的写法也认
- 围栏代码块,语言从 class="language-xxx" 或 "lang-xxx" 里取
- GFM 管道表格,缺少的单元格补空、单元格里的竖线自动转义
- 引用、分隔线、换行(行尾两个空格的硬换行)
- 正文里的 Markdown 语法字符自动转义,不会被解析成格式
- 代码块围栏按内容里的反引号自动加长
- javascript: / data: 这类协议不转成可点的链接
- script 与 style 整块丢掉,不把脚本塞进产物
- 认不出的标签保留文字、丢掉标签 —— 产物里不会混着两种语法
- 富文本编辑器(UEditor、CKEditor、TinyMCE)导出的带 inline style 的片段可以直接粘
- 全部在浏览器本地完成,内容不外传
使用方法
- 把 HTML 粘进输入框
- 需要紧凑排版时关掉「段落之间空一行」
- 复制产物,粘进博客、Issue、文档或 README
常见问题
- 为什么正文里的星号变成了 \*?
- 因为 Markdown 会把 `*` 当成斜体的开始。一段含 `a*b*c` 的正文原样输出,渲染出来是 `a` + 斜体 `b` + `c` —— 用户看到的只是「产物莫名其妙变了样」。转义成 `a\*b\*c` 之后渲染出来还是原来那几个字符。同样的处理也用在反引号、下划线、方括号与尖括号上。`#` 与 `-` 刻意不转:它们只在行首才有块级含义,而全转掉的代价是产物里到处是反斜杠(`C#` 会变成 `C\#`)。
- 代码块的语言是怎么来的?
- 从 `<pre><code class="language-js">` 里的 class 取,`language-` 与 `lang-` 两种前缀都认(前者是 GitHub 与 highlight.js 的写法,后者是 Prism 的)。取不到就输出不带语言的围栏。另外围栏长度会按内容自动加长:内容里含三反引号时用四反引号包起来,否则代码块会在那一行提前闭合,后面的内容全跑成正文。
- 为什么链接被「降级」成了纯文字?
- 因为它的地址用了 `javascript:`、`data:` 这类协议。这类地址在正常正文里几乎没有出现的理由,而产物是要粘进你自己的博客或工单的 —— 一个 `[点这里](javascript:...)` 粘过去就是一个可点的 XSS 入口。工具这边只放行 http、https、ftp、mailto、tel 等几种正常协议,其余的只保留文字。
- 表格转出来为什么多了表头?
- 因为 Markdown 的表格必须有表头,没有表头那几行就没法用管道语法表达。所以源表格里全是 `<td>` 时,第一行会被当成表头。另外源表格里缺少的单元格会补空,单元格内的竖线会被转义成 `\|`(不转义的话那一格会把表格切断)。
- UEditor 这类富文本编辑器导出的内容能转吗?
- 能。编辑器导出的 HTML 通常带一大堆 inline style(`text-indent`、`font-family`、`text-align`)与层层嵌套的 `<div>`/`<span>`,这个工具会丢掉样式、保留文字,因为这些样式在 Markdown 里没有对应物,硬转成内联 HTML 只会让产物没法读。这是刻意的取舍:拿到干净的文字,而不是拿到一份带着原样样式的 HTML。
- 内容会被上传吗?
- 不会。转换全在浏览器内存里完成,页面不发送任何请求,断网也能用。
相关工具
Markdown 预览
文本左栏写 Markdown、右栏实时渲染,标题自动带锚点与目录,代码块按语言着色并可一键复制;粘进来的 HTML 只当文本显示,内容不上传。
HTML 格式化
格式化在线 HTML 格式化与压缩:按标签层级缩进,文本与行内标签保持同一行,script 与 pre 内容原样保留。代码不出浏览器,不上传服务器。
表格转换
文本把 CSV、TSV 或 Markdown 表格互转:Markdown 表格、ASCII 边框表、HTML、JSON、CSV。按 RFC 4180 处理引号,列宽按显示宽度对齐。
文本清洗
文本清洗从日志或表格里复制出来的一列内容:去重行、排序、去空行、去首尾空白、去行号、合并多空格,规则逐条开关。粘贴的内容只在本机处理。
文本对比
文本把两份文本逐行对比,高亮标出新增、删除与未改动的行,改动按最小差异对齐,而不是整段标成变了。全部在浏览器本地完成,内容不上传。
字数统计
文本中英混排的文本到底有多长?中文按字、英文按词分开统计,给出字符数、行数、字节数、阅读与朗读时长,以及会被切成几条短信。全部在本机完成。