做HTML转Markdown的转换器,本以为是个无聊活:遍历DOM,遇到h1输出一个#,遇到h2输出两个#,收工。第一次拿真实站点测试,对象是一个Next.js文档站,结果回来一大坨加粗文本,标题结构一个都没有。
问题出在Tailwind。那个站点把div当成视觉上的标题来用,整页找不到一个h标签。从语义上看是灾难,从视觉上看却是一份完全合格的文档页。转换器只认div,于是什么也没识别出来。
修法不是把HTML解析写得更聪明,而是承认一件事:标题是视觉概念,不是标签概念。作者在结构遍历之前加了一道启发式扫描,先找那些类名命中常见标题模式的元素,比如text-xl、text-2xl、text-3xl、font-bold、font-semibold以及mb-间距标记,把它们提升为标题。这套做法不好看,也脆弱,在大概80%的Tailwind站点上能跑通。
接着又撞上一个Bootstrap站点,用的是真h标签,但视觉上被降级了。启发式规则选择相信标签,输出里就多了一个#,而页面上那里显示的只是一个小副标题。于是又得加一道反向检查:如果真标题标签带着视觉降级的类名(h1到h6的Bootstrap类),输出时也相应降级。
结论是,HTML转Markdown不是解析问题,而是两套本体论之间的翻译问题。写HTML的人按视觉层级思考,读Markdown的人按文档结构思考,两者能对上纯属偶然。每换一个CSS框架,就是换一种“什么看起来像标题”的方言。
这道启发式处理最后被放在一个可选开关后面,默认关闭。原因是它出错的频率足够高,作者不想给任何人制造意外。如果流水线要处理营销站点和用工具类CSS搭的文档,就打开它;如果处理的是CMS产出的语义化HTML,就保持关闭。
作者也在问:还有谁在被Tailwind标题税折磨?想听听别人找到过哪些不靠猜的启发式规则。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.