HTML 转纯文本转换器只做一件事, 而且全部在浏览器里完成: 粘贴一份 HTML 文档, 按下 转换为文本, 得到剥离标记后人们能读到的纯文本. 不存储, 不上传; 解析器是浏览器自带的 DOMParser, 运行在本机.
粘贴 HTML 并点击转换
这里没有实时转换: 输入保持原样, 直到按下 转换为文本 按钮, 输出面板才填充内容. 一个 保留段落结构 复选框控制输出布局, 默认开启. 开着时文本保留块级换行; 关掉时所有内容连成一行连续的词. 如果输入为空或只有空格, 按钮什么都不做, 也不出现错误信息, 所以误粘贴空白并不是失败状态.
两种输出形态: 段落或单行
复选框开启时, 转换器按块遍历文档. 每个浏览器会渲染成独立行的元素, 比如段落, 标题, 列表项, 表格行, 都会另起一行, 并且与前面的内容之间隔一个空行. 复选框关闭时, 这些换行全部变成单个空格: 同一份文档以一个扁平的词串返回, 词序不变, 没有任何换行. 文本内的空白两种方式下都会被归一, 连续空格或杂散的制表符都压成一个空格.
什么会消失: 脚本, 样式和注释
三类内容永远到不了输出. 转换器在读任何东西之前移除所有 script, style 和 noscript 元素, 所以内联 JavaScript, CSS 规则和后备块全部消失. HTML 注释以同样的方式被跳过: 两个段落之间的注释不留痕迹, 连空行都没有. 存活下来的是可见文本和其中的实体, 因为解析器在读取时解码它们: & 变回裸的 & 符号, <tag> 变成尖括号里的字面单词.
表格, 列表和图片
表格以纯文本行返回: 每一行成为自己的一行, 每个单元格与下一个之间只有一个空格, 输出里没有任何制表符或竖线字符. 列表表现像一组块, 所以每个列表项落在自己的一行, 项与项之间隔一个空行. 图片是输出可能让人意外的地方: img 标签完全不贡献任何内容, 它的 alt 属性也从不被读取, 所以包裹着图片的段落会把图片前后的文本直接连在一起, 嵌在单词中间的 img 可能让两段文字粘成一片.
br 和 hr: 是换行, 不是空行
不是所有换行都是块级换行. 段落里的 br 或 hr 插入一个单换行: 下一个词从下一行开始, 但两者之间没有空行, 这让诗或地址保持为同一个视觉块. 这与段落标签关闭时不同, 后者添加完整的空行分隔. 在单行模式下, 两种换行最终都变成同一个空格, 所以这个区别只在保留段落结构时才有意义.
唯一的例外: pre 块保留空白
转换器里的一切都走同一条空白规则, 只有一个标签例外. pre 块被逐字复制: 它的文本内容按原样取出, 缩进, 空行都在, 后面跟着与其他块一样的空行. 把代码示例放进 pre 标签, 它会以你输入的样子原样返回, 这正是 pre 成为保留代码和列对齐文本的标准位置的原因, 当文档其余部分被压平的时候.
复制, 清除, 以及下一步
流程刻意做得很小. 只有当有内容可复制时, 输出上才出现 复制 按钮; 清除 一次按键同时清空输入和输出. 没有交换控件, 因为输出是没有结构的纯文本, 没有可回喂的内容, 页面上也不在任何访问之间保留任何东西. 如果标记在转换前就很乱, 先用 HTML 格式化 规范缩进. 如果你需要这些特殊字符的反方向, HTML 实体编解码器 能为你编码和解码它们, 如果内容以 Markdown 开始, Markdown 预览 会在你导出之前展示渲染结果, 而 HTML 格式化教程 深入讲格式化那一边.