piapia123
zh

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 的片段可以直接粘
  • 全部在浏览器本地完成,内容不外传

使用方法

  1. 把 HTML 粘进输入框
  2. 需要紧凑排版时关掉「段落之间空一行」
  3. 复制产物,粘进博客、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。
内容会被上传吗?
不会。转换全在浏览器内存里完成,页面不发送任何请求,断网也能用。

相关工具