资讯详情

资讯详情

保留含站内链接的内容列表:深入 Defuddle 的 content-list-with-internal-links 回归测试

后端【免费下载链接】defuddleGet the main content of any page as Markdown.项目地址https://gitcode.com/gh_mirrors/de/defuddle点击查看免费下载本篇以 Defuddle 仓库中的回归测试期望输出 content-list-with-internal-links.md 为核心讲清这个 fixture 验证的技术点为什么一个嵌在正文中间、列表项里带站内相对链接如/plain-text的无序列表必须完整保留、而不是被误判为面包屑导航或元数据块删除。读完你会掌握 Defuddle「fixture → 期望输出」回归测试的工作机制以及src/removals/content-patterns.ts中各列表删除启发式与「内容列表」之间的判定边界并能照着范式为自己的页面结构补充回归用例。测试工件的构成fixture 与期望输出成对出现Defuddle 的正文内容提取有大量基于内容模式的删除逻辑面包屑、元数据列表、相关帖子区块等这些启发式天然存在误伤正文的风险。仓库用「HTML fixture 期望 Markdown 输出」成对的文件来锁定行为输入 fixturetests/fixtures/content-patterns--content-list-with-internal-links.html期望输出tests/expected/content-patterns--content-list-with-internal-links.md测试驱动文件 tests/fixtures.test.ts 会自动发现tests/fixtures/下所有.html文件由 tests/helpers.ts 中的getFixtures()提供逐个跑 Defuddle再与tests/expected/下同名的.md文件比对。期望文件的格式统一为一个 JSON 元数据前言title、author、site、published四个字段不含正文后接contentMarkdown正文。该文件头部的注释明确说明了新增与更新基线的方式新增.html后运行npm test会生成基线删除期望文件后重跑则会重新生成。输入 fixture一篇列表项内嵌站内链接的短博客文章fixture HTML 结构非常克制刻意不含任何语义化 class 命名以验证「纯靠内容特征」也能正确处理body nav a href/Example Blog/a a href/aboutAbout/a /nav main article h1Personal style guide/h1 pStyle emerges from consistency, .../p pA style can be a system, a pattern, a set of personal guidelines. Here are a few of mine:/p ul liI wear monochromatic clothing without logos/li liI use a specific date format everywhere/li liI pluralize tag and folder names (e.g. groups not group)/li liI use a href/plain-textplain text files/a for all my writing/li liI ask myself a href/annual-reviewreflection questions every year/a every year/li liI meal prep lunches every week, and exercise twice a week/li liI write a href/brevityshort essays/a, less than 500 words/li /ul pCollect constraints you enjoy. .../p pHaving a style collapses hundreds of future decisions into one, and gives you focus./p /article /main /body以上为节选示意完整 38 行原文见 fixture 文件。关键要素有三个head里的meta nameauthor contentJane Doe正文中间一个 7 项的无序列表其中 3 个列表项内含站内相对链接/plain-text、/annual-review、/brevity列表前面是一个以冒号结尾的引导段落 Here are a few of mine:。这三点分别对应后文要讲的元数据提取与两条列表保护规则。期望输出完整保留列表站内链接被解析为绝对 URL期望文件 tests/expected/content-patterns--content-list-with-internal-links.md 全文如下json { title: Personal style guide, author: Jane Doe, site: Example Blog, published: } Style emerges from consistency, and having a style opens your imagination. Your mind should be flexible, but your process should be repeatable. A style can be a system, a pattern, a set of personal guidelines. Here are a few of mine: - I wear monochromatic clothing without logos - I use a specific date format everywhere - I pluralize tag and folder names (e.g. groups not group) - I use [plain text files](https://content-patterns--content-list-with-internal-links/plain-text) for all my writing - I ask myself [reflection questions every year](https://content-patterns--content-list-with-internal-links/annual-review) - I meal prep lunches every week, and exercise twice a week - I write [short essays](https://content-patterns--content-list-with-internal-links/brevity), less than 500 words Collect constraints you enjoy. Unusual constraints make things more fun. You can always change them later. Having a style collapses hundreds of future decisions into one, and gives you focus.从这份期望输出可以读出四个断言列表未被删除。7 个列表项全部保留在正文中段说明内容模式删除逻辑没有把正文中间的业务列表当成导航或元数据。站内相对链接被解析为绝对 URL。原始href/plain-text变成了https://content-patterns--content-list-with-internal-links/plain-text。这个主机名不是 fixture 里写的而是测试框架注入的测试 URL——tests/fixtures.test.ts 中若 HTML 头部没有!-- {url: ...} --前言注释就以文件名去掉扩展名和letters--前缀后拼成https://name作为文档 URL。因此链接是相对该测试 URL 解析出的这也锁定了「相对链接必须按页面 URL 解析」这一行为。标题与元数据提取正确。title取自h1author取自meta nameauthorsite取自导航品牌名 Example Blogfixture 中没有任何日期元素所以published为空字符串。这正是测试注释所说的「JSON 元数据不含 content作为前言」的比对内容由 tests/fixtures.test.ts 的createComparableResult()序列化生成。h1与nav未混入正文。标题被提取到元数据而非正文顶部导航也不在 Markdown 中出现。焦点辨析为什么「带站内链接的内容列表」值得单独设防src/removals/content-patterns.ts中有三处列表删除启发式各自都可能误伤这类列表fixture 的存在正是把它们划出了边界。面包屑判定isBreadcrumbListisBreadcrumbList 用于识别 CMS 注入的Home › Posts › Title型导航判定条件同时满足才删除列表项 2~8 个至少一个链接指向站点根或浅层路径/、/archive这类每个li文本不超过 8 词且不含img/p/figure/blockquote。fixture 的列表项是完整句子例如 I use plain text files for all my writing 已超出 8 词阈值因此在词数检查上就被排除不会误判为面包屑。边界元数据列表位置 形态双重门槛removeByContentPattern 中的元数据列表块 针对日期/阅读时长/作者这类「标签 值」短列表要求全部满足才删除列表必须靠近内容开头或结尾文本位置距开头和结尾都在 500 字符以内——fixture 的列表位于正文中段不满足位置条件每项不超过 8 词且不能以句末标点.!?结尾——fixture 列表项是句子不满足列表总文本不超过 30 词关键保护若列表的前一个兄弟元素是标题或以:结尾的段落则直接跳过——注释写明「those are content lists, not standalone metadata」L740-L748。fixture 列表前面正是以冒号结尾的 Here are a few of mine: 段落这一条保护规则由该 fixture 直接验证。尾部外链列表只认站外链接尾部外链列表删除 会把「标题 全是站外链接的列表」整体移除联盟推荐、产品盘点类内容其前提是用new URL(href, url).hostname与当前页主机比对所有项都指向站外才成立。fixture 的列表项全是站内链接且列表后还有正文段落不满足「最后一个有效块」检查两条都不成立。这三组启发式都挂在removeByContentPattern上由主流程 src/defuddle.ts 调用该 fixture 保证当列表处在正文中段、列表项带站内链接、且由冒号段落引导时任何一条启发式都不应触发删除。测试如何运行与比对运行入口就是 tests/fixtures.test.ts 中的test.each(fixtures)读取 fixture HTML解析出测试 URL有前言注释用注释否则用文件名兜底注入一个永远 reject 的fetch禁用网络保证 DOM 提取路径确定、可离线复现注释里提到这是为了避免 X 站 extractor 因占位 ID 撞上真实推文而请求外网以{ separateMarkdown: true, fetch: offlineFetch }调用Defuddle(doc, url, ...)实现见 src/node.ts断言content与contentMarkdown非空期望文件不存在时写出基线存在时用 tests/helpers.ts 的normalizeMarkdownHtml归一化后做全等比较——该函数只对正文中的内嵌 SVG 做属性排序归一代码围栏内内容保持逐字节一致避免假阳性/假阴性。由于比对是全量文本相等任何一条启发式误删这个列表哪怕只少一行- I use ...npm test都会因 diff 失败从而把「误伤内容列表」类回归直接暴露出来。实践参考如何为新的易误伤结构补一个用例这个 fixture 展示的模式可以直接复用在 tests/fixtures/ 下新建.html文件名即期望文件基名如content-patterns--xxx.html如需固定测试 URL可在 HTML 头部加!-- {url: https://...} --前言注释否则以https://文件名去前缀兜底运行npm test生成tests/expected/content-patterns--xxx.md基线人工审阅生成的 Markdown 与 JSON 元数据前言是否符合预期这正是测试头注释中 Review 步骤的要求若需要说明某个删除决策可参考removeByContentPattern的debugRemovals记录格式step/reason/textPreview见 src/removals/content-patterns.ts结合调试输出定位是哪条启发式触发了删除。该模式的价值在于它不要求测试作者预先写出断言语句而是把「完整输出快照」作为契约让标题提取、元数据提取、链接解析、列表存废四类行为在同一条 fixture 里被一次性锁定。赞分享后端【免费下载链接】defuddleGet the main content of any page as Markdown.项目地址https://gitcode.com/gh_mirrors/de/defuddle点击查看免费下载相关推荐Front-End-Checklist 弱内部链接Weak Internal Links审计指南从内链图构建到核心内容策略Front End Checklist 弱内部链接Weak Internal Links审计指南从内链图构建到核心内容策略 本篇指南围绕 Front En深入解析 Pandoc $...$ 行内公式解析从 9193 回归测试看换行保留与 % 注释深入解析 Pandoc $...$ 行内公式解析从 9193 回归测试看换行保留与 % 注释 导读 在 Pandoc 中用 $...$ 包裹的内容会被识别为文档开发工具CLIPandoc Markdown 写入器链接属性保留与 autolink 判定命令回归测试 7692 深度解析Pandoc Markdown 写入器链接属性保留与 autolink 判定命令回归测试 7692 深度解析 导读 本文以 pandoc 仓库中的命令回归测试文档开发工具CLI上一篇Xilem虚拟滚动技术大数据列表的性能优化方案下一篇Parsec VDD社区支持与资源GitHub、文档与用户交流平台创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →