npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

dsh-patent-invalidation-pptx

v1.2.0

Published

DSH 插件:给一份「创造性最佳组合方式分析」文本 + 涉案专利 PDF + 对比文件 PDF,直接生成**口审展示 .pptx**——套用你给的模板(母版/封面/封底/logo),正文一律 ≥18pt、放不下自动分页,附图按图号(图3/图1a/[图4])从对比文件里裁出来贴上;出片后自动静态自检(页数/字号下限/形状越界/图片关系/关键文字),可选渲染 PNG 预览。四个工具:patent_invalidation_plan(只读解析成计划)、patent_invalidation_figures(抽附

Readme

dsh-patent-invalidation-pptx — 口审展示 PPT 生成器

给一份 「创造性最佳组合方式分析」文本(.docx) + 涉案专利 PDF + 对比文件 PDF(D1/D2/D4…), 直接生成一份能讲的 口审展示 .pptx:

  • 套你的模板:保留模板 pptx 的母版 / 版式 / 主题 / 封面(自动填案件信息)/ 封底,只替换中间页;
  • 正文 ≥18pt,放不下自动分页(表格按行分、长文按段落分、单段超长按行切,续页标注"(续N)");
  • 附图按图号抽:从对比文件 PDF 里认图注(图 3、图1a、[图4]),同页多图按图注切"图带", 再按像素墨迹紧裁(页眉/页码家具自动剔除)→ 300dpi PNG,贴到对应页;优先用附图标注版(图自带中文释义); 一页多图给 y0/y1 就能拆(候选图带自动回显);图注印在位图里时跑 OCR 给「图号→页/图带」映射(需人工确认);
  • 解析覆盖广:组合方式含「惯用手段/公知常识」、引文定位(D1说明书第1页第1段/D7更正译文第[0026]段/ 倒数第N段)、裸图号就近归属(结合图1、图3A)都能自动认;认不到的进 candidates(原文片段+段落序号)照抄回填;
  • 出片即自检:包结构/图片关系、正文最小字号、形状越界、关键文字、该有图处有没有图、表格放不放得下自己的行; 图号→页码对照表随 PPT 存档、附图联系表(montage)一次复核整批裁切;
  • 可选渲染预览:自动探测宿主自带的 LibreOffice Kit 渲染 PNG,肉眼核验用(静态自检绿 ≠ 版面可用)。

安装

方式一:npm(不需要本机安装 git)

DSH 桌面端 → 侧栏「插件」→「添加插件」,输入:

dsh-patent-invalidation-pptx

方式二:从 Gitee 仓库安装(需要本机已安装 git;地址必须带结尾的 .git)

https://gitee.com/hc905/dsh-patent-invalidation-pptx.git

不带 .git 的裸地址(https://gitee.com/hc905/dsh-patent-invalidation-pptx)会被 pnpm 当成 tarball 去解包,报 ERR_PNPM_TARBALL_EXTRACT;实测 pnpm 11.7.0 必须带 .git。

方式三:本地路径(开发用)

link:<插件目录的绝对路径>

装完重启 DSH。改代码后同样必须重启:host 按模块 URL 缓存插件。

同一台机器不要同时装「npm 版」「git 版」「本地 link 版」——三者的挂载 id 都是 patent-invalidation-pptx,会冲突。

本地开发安装(本机现状)

插件源码在本目录,profile 用 link: 安装(改代码生效需重启 DSH:host 按模块 URL 缓存插件)。

// ~/.dsh/profiles/desktop/package.json
"dependencies": { "dsh-patent-invalidation-pptx": "link:D:/Dgit/Dplugins/dsh-patent-invalidation-pptx" },
"dsh": { "profile": { "bundles": [ /* … */ "dsh-patent-invalidation-pptx" ] } }
# ~/.dsh/profiles/desktop/cordis.patch.yml
- id: patent-invalidation-pptx
  disabled: false
cd $env:USERPROFILE\.dsh\profiles\desktop
pnpm install        # 建好 link 与依赖
# 然后重启 DSH

卸载

# 在 profile 目录执行(npm / git / 本地 link 都用这个包名)
pnpm remove dsh-patent-invalidation-pptx
# 再把 profile 的 dsh.profile.bundles 里的 dsh-patent-invalidation-pptx 删掉,然后重启 DSH

四个工具

| 工具 | 作用 | 写文件 | |---|---|---| | patent_invalidation_plan | 读分析文本 → 口审展示计划(组合方式/最接近现有技术/逐特征公开情况与强度/区别技术特征/专项分析/引文/附图需求);可选落盘 JSON | 否(除可选 planPath) | | patent_invalidation_figures | 按图号从 PDF 抽附图 PNG;图注在位图里时可用 pages 指定页码 | PNG | | patent_invalidation_pptx | 计划 + 附图 + 模板 → .pptx,并做静态自检 + 可选预览 | PPTX / PNG | | patent_invalidation_verify | 复核任意 .pptx(含手工改过的成品) | 否 |

用法(口审场景里的典型调用)

patent_invalidation_plan(
  analysisPath = "…/26-125298CN-…创造性最佳证据组合方式分析(版本11).docx",
  patentPath   = "…/CN102804493B-涉案专利.pdf",
  references   = [
    { code:"D1", path:"…/D1-CN100416828C-附图标注版.pdf" },
    { code:"D2", path:"…/D2-WO2008106855A1中文译文-标注版.pdf" },
    { code:"D4", path:"…/D4-中文译文-标注版.pdf" },
  ],
  extraFigures = [{ doc:"D2", fig:"1a" }, { doc:"D4", fig:"4", page:39 }],
  planPath     = "…/plan.json")
patent_invalidation_pptx(analysisPath=…, references=…, extraFigures=…, preview=true)
→ outPath / slideCount / slides / figures / verify / preview

插件市场的卡片标题/描述

市场列表里那张卡片显示的中文标题不来自 package.json,而来自包里的 locale/zh.json → meta.title / meta.description(英文界面读 locale/en.json):

{ "meta": { "title": "口审展示 PPT 生成", "description": "……" } }
  • 缺 locale/zh.json 时,卡片标题会回落成包名(dsh-patent-invalidation-pptx), 描述回落成 package.json 的 description——所以想改标题就改这个文件。
  • 本插件已带 locale/zh.json + locale/en.json;改完刷新市场面板即可(等待重启的插件要重启后才登记)。
  • package.json 的 exports 与 files 里都已有 ./locale/*.json,不用再动。

计划是纯 JSON,可改

patent_invalidation_plan(planPath=…) 落盘后可直接改,再 patent_invalidation_pptx(planJson=…) 出片:

  • features[].d1 / .others / .strength:表里措辞;features[].evidence:覆盖表"主要证据"列(按句边界截断加「…」);
  • focus[].lines:专项页段落;quotes[].figures:原文页右侧挂的附图;
  • figures[].caption / .page / .y0 / .y1 / .sourcePath:图注、页码、页内图带(一页多图拆分);
  • case.*:封面案件信息。

解析不到的不会静默丢:返回里的 candidates(组合方式/引文/图号)带原文片段+段落序号,照抄回填即可(P12)。

出片参数(常用)

| 参数 | 默认 | 说明 | |---|---|---| | focusFigureLayout | stack | 焦点页两图排布:stack 上下叠放(同占 5.3in 宽,红字释义可读)/ side 并排 / proportional 按比例分宽等高 | | trimFurniture | true | 裁图剔除页眉/页码家具(孤立墨迹带);剔了什么逐条回显 | | montage | true | 抽图后拼「附图联系表」PNG,一次复核整批裁切 | | maxEvidenceChars | 240 | 覆盖表"主要证据"列截断长度(按句边界截断) | | focusMaxLines | 12 | 专项页最多搬几段分析文字 | | preview | false | LibreOffice 渲染预览 PNG(自动探测宿主 kit;探测不到会说明出路) |

patent_invalidation_figures 的 bands(与 figs 对齐的 {y0,y1})用于一页多图拆分; 找不到图注时返回 ocrMap(OCR 猜测的「图号→页/图带」映射,需人工确认)与 suggestedBands(墨迹空白带候选)。

作业纪律(P12–P17)

  1. plan → 看 candidates/warnings → 补 plan.json → planJson 出片(回填=照抄候选,不重读全文);
  2. 图号→页码对照表先行、随 PPT 存档(插件自动写 <成品>-图号页码对照.md);
  3. 事实性断言必须有出处:图号只认 OCR 词表/渲染图/图注文本,不许猜;部件断言看图确认;
  4. 静态自检绿 ≠ 版面可用:出片 → 渲染关键页 → 肉眼复核 → 必要时改 plan 重出;
  5. 多图 montage 一次复核(页眉/页码批量裁进来这类问题只有拼图看才明显);
  6. 成品先落工作区、定稿再复制案卷目录(plan/裁图/预览都留工作区;工作区外写不进去是宿主沙箱策略,报错里附了复制命令)。

排版口径

| 元素 | 字号 | |---|---| | 页标题 | 25pt | | 表头 | 20pt | | 表格正文 | 18pt | | 正文段落 | 19pt | | 强调段 / 特征原文 | 20–21pt | | 末页(模板封底) | 不约束 |

行高估算含 1.22 的字形系数(少了它会系统性低估约 20%,表格就会顶出页面),分页再留 3% 安全系数。

表格量高另有两条"宁可高估"的口径(2026-10-13 真事故):

  • 中西文自动间距:PowerPoint/LibreOffice 会在中文与西文/数字之间插约 1/4 em 的间隙。 "D4更正译文第[0025]段…" 这类单元格不算它会低估 15–20% 行数 → 表格贪心装页后每页最后一行 被页面下沿裁掉。lib/text.js 的 scriptSpacing 就是为此存在的(表格行高必开)。
  • 量什么就写什么:单元格字号以前没落到 run 上,量高按 fontSize(18pt)、渲染按正文默认 19pt —— 又一个系统性低估。现在 cellXml 会把表格字号写进每个 run。

页序

  1. 封面(模板) →
  2. 组合方式:【…】 + 最接近现有技术的逐特征公开情况表 + 区别技术特征 →
  3. 对比文件对各项技术特征的覆盖(特征…)(4 列,分页) →
  4. Dx所公开的内容(附图 + 逐特征说明;Dx = 最接近文件) →
  5. 其他对比文件及公知常识的公开情况(特征…)(3 列,分页;"其他对比文件"按组合方式推—— 以D1为基准 → D2/D4及公知常识的公开情况,以D2为基准 → D1/D4及公知常识的公开情况) →
  6. 重点技术特征:特征1-N(左文右图;多图时左侧并排两张;文字多时续页改双栏) →
  7. D2第6页第二段(原文 + 解读,来自分析文本;同一段被引多次会合并成一张,取最全的解读) →
  8. 对比文件附图:…(计划里点名但页内没引用的图) →
  9. 封底(模板)

编码禁忌(2026-10-13 真事故换来的)

  • package.json / cordis.patch.yml 必须是无 BOM 的 UTF-8。 PowerShell 5.1 的 Set-Content -Encoding UTF8 会写 UTF-8 BOM;带 BOM 的 package.json 会让 host 的严格 JSON.parse 失败,于是插件被判成 「未安装 / not installed」(GET /dsh-market/installed 的 activation 字段会直接写出来)。要命的是 import() 能容忍 BOM,所以离线跑工具一切正常, 只有 host 里看不见插件——批量改名/脚本生成文件之后必须复查 BOM。

  • scripts/*.ps1 保持纯 ASCII。 Windows PowerShell 5.1 把无 BOM 的 .ps1 按 ANSI 读, 非 ASCII 文本可能吞掉字符串里的 $(本插件已按此约定,注释全英文)。

  • 自检脚本现在会先做清单自检:BOM、package.json 是否合法 JSON、dsh.bundle.patch 指向存在、 cordis.patch.yml 的 insert id 与包名一致、skills/<id>/SKILL.md 存在;沙箱也会把 cordis.patch.yml 一起复制过去。

  • render() 里 content 块的 text 必须是字符串(写成 [ … ].join('\n')),不能把行数组直接交给 DSH。 DSH 只做无损 JSON 快照、不会替你拼接,于是请求体里出现 {"type":"text","text":["…","…"]}, DeepSeek Messages 网关整包 422:

    Failed to deserialize the JSON body into the target type:
    messages[887].content: invalid type: sequence, expected a string

    要命的地方在于:这条工具结果会原样落进会话日志,只要它在历史里,该会话之后每一次请求 都会被拒(本次事故就是 patent_invalidation_verify 的第一次成功返回把会话打毒,只能改日志或换会话)。 四个工具(plan / figures / pptx / verify)的四处 render 都必须 join;scripts/selfcheck-tools.mjs 现在会严格校验这一点(旧版把它 join 掉再看,等于把这类缺陷藏起来)。

  • 工具返回值必须能无损 JSON 化(2026-10-13 第二起同类事故)。DSH 照 JSON 快照校验返回值, 于是 figures[].page/error(抽图失败时)、verify.slides[].minFontPt(纯图片页)这些 undefined 字段,以及 verify.minFontPt 的 Infinity,会让整次调用报 value is not lossless JSON——出片明明成功,调用方却什么都拿不到(连 verify 的问题清单都看不到)。 现在四个工具的返回统一过 jsonSafe()(丢 undefined、非有限数换 null), selfcheck-tools.mjs 也加了 jsonLossProblems() 断言。

已知边界

  • 图注在位图里的 PDF(本案 D4 中文译文的 [图4] 就是印在扫描页上的):按图注定位会失败, 工具会在错误信息里列出候选附图页,并跑 OCR 给「图号→页/图带」映射(ocrMap,需人工确认), 确认后用 extraFigures[].page(一页多图再加 y0/y1)指定即可。
  • 一页多图(图1/图2 同页):suggestedBands 给候选图带(墨迹空白带切分),照抄进 bands/y0/y1; 图号归属由人工定,插件不猜。
  • 静态自检证明不了"字没有被视觉裁切"——那要用渲染预览看(preview=true)。不过自检现在会 按同一套量高复核表格:算出来的下沿越过版面底就报问题(表格…超过可用版面下沿…), 这是裁切事故的静态预警。
  • 专项页文字偏多时,调小 focusMaxLines(默认 12;抽取阶段另有 6 段的默认上限),片子上会注明 "本节另有 N 段见《分析文本》",不静默丢内容。
  • preview=true 在受限沙箱里可能起不了子进程(管道被禁),此时返回里会写明 预览:跳过 — 渲染进程无法启动:…,而不是伪装成渲染失败。
  • 自检按放映顺序(presentation.xml 的 sldIdLst)遍历幻灯片;部件名与页序不一致的成品 (插过页、调过页序)也能正确判"末页封底豁免"。

分析文本的抽取口径(2026-10-13 补)

  • "最接近文件"以正文为准:以D2作为最接近的现有技术 时,特征表里"D2的公开情况"才是 最接近文件那一列(以前写死 D1,导致以 D2 为基准的分析文本整列错位、第 2 页该列全空、 「D2所公开的内容」整页缺失)。
  • 区别技术特征两种写法都认:区别技术特征在于:(i)…(ii)…,以及 …需由其他证据补足的内容为:特征1-3(由D4补足)与特征1-6(由D1及公知常识补足)。
  • 引文去重:同一段原文在理由/专项/小结里被引多次时合并成一张原文页,取最全的解读。
  • 专项块清洗:落款/日期、(一)…括号小标题、…如下表所列这类过渡句都不进专项页; 一个特征最多留 6 段(按"是否点到自己、有没有出处、是不是结论句"排序,多余段数写在片子上)。

离线自检 / 无重启调试

# 回归测试(node --test:解析三组正则 / 一页多图 y0/y1 / 家具剔除 / 句边界截断 /
# 焦点页排布 / 原文页挂图 / LibreOffice 路径探测 / 备份约定 + 端到端跑自带自检)
npm test

# 在沙箱里跑四个工具(stub 掉 dsh-tools/dsh-skill,用 profile 里的 pdfjs/canvas)
powershell -ExecutionPolicy Bypass -File scripts/sandbox-tools.ps1 `
  -Docx "<分析.docx>" -Patent "<涉案专利.pdf>" `
  -D1 "<D1.pdf>" -D2 "<D2.pdf>" -D4 "<D4.pdf>" `
  -Template "<模板.pptx>" -Out "<输出>\deck.pptx" `
  -Extra "D2:1a,D4:4:39" -Preview

npm test 里的端到端用例会合成分析文本 + 最小模板,把 scripts/selfcheck-tools.mjs (plan → figures → pptx → verify + output.schema/JSON 无损校验 + 清单自检)整链路跑绿。 scripts/selfcheck-tools.mjs 也可以直接跑(需要能解析 pdfjs-dist / @napi-rs/canvas / @deepseek-ai/*)。

变更记录

见 CHANGELOG.md。

许可证

MIT(见 LICENSE)。