#488 by GitHub stars

deusyu/translate-book

Translate books (PDF/DOCX/EPUB) into any language using parallel sub-agents. Converts input -> Markdown chunks -> translated chunks -> HTML/DOCX/EPUB/PDF.

History

Review weekly changes to SKILL.md before updating. Dates mark the weeks in which we observed each version; checks apply to the recorded commits.

View weekly changes

SKILL.md

Week of Nov 2, 2026 · +65 / −2 lines

Before Network or broad shell → After Network or broad shell

a663b1b4f1e6 → 8a2d71cba25c

+ 55 
+ 56 Page-number lines are detected and dropped for PDF input only; EPUB and DOCX
+ 57 keep every standalone number (chapter, verse or exercise numbers). If an EPUB
+ 58 prints its page numbers as text and they show up in the chunks, delete the
+ 59 temp directory before translating and re-run with `--detect-page-numbers`.
+ 247    - 脚注:正文中的引用标记 `[^12]` 与行首的定义标记 `[^12]:` 原样保留,不要改编号、不要删除、不要移动位置,只翻译定义后面的注释文字;定义的续段保持行首四个空格的缩进
- 405 python3 {baseDir}/scripts/merge_and_build.py --temp-dir "<temp_dir>" --title "<translated_title>" --cleanup
+ 411 python3 {baseDir}/scripts/merge_and_build.py --temp-dir "<temp_dir>" --title "<translated_title>"
- 411 The `--cleanup` flag removes intermediate files (chunks, input.html, etc.) after a fully successful build. If the user asked to keep intermediates, omit `--cleanup`.
+ 417 Keep the intermediate files. The chunks, `manifest.json`, and `run_state.json`
+ 418 are what make spot fixes and selective re-translation possible after the build
+ 419 (see Step 9). Add `--cleanup` only when the user explicitly asks to delete
+ 420 intermediates, and tell them first that it permanently deletes `chunk*.md`,
+ 421 `output_chunk*.md`, `input.html`, and `input.md`: after that, fixing a single
+ 422 chunk means converting and translating the whole book again.
+ 440 
+ 441 ### 9. Spot Fixes After the Build
+ 442 
+ 443 If the user finds problems in a few places after the build, fix the affected
+ 444 chunks rather than `output.md`: whenever a chunk changes, the build re-merges
+ 445 `output.md` from the chunks and discards edits made there.
+ 446 
+ 447 1. Find the chunk: search `<temp_dir>/output_chunk*.md` for the passage.
+ 448 2. Either edit `output_chunk<NNNN>.md` directly, or have it re-translated.
+ 449 
+ 450    **Edit.** `record` stamps the chunk as matching the current source and
+ 451    glossary, so first check what the planner still expects from it:
+ 452 
+ 453    ```bash
+ 454    python3 {baseDir}/scripts/run_state.py plan "<temp_dir>"
+ 455    ```
+ 456 
+ 457    If chunk<NNNN> appears in `chunks[]` with action `translate`, recording
+ 458    would hide that. Handle it by reason:
+ 459 
+ 460    - `glossary_term_hash_changed` (its `detail` lists the term ids) or
+ 461      `glossary_term_selection_changed`: bring those terms in line with
+ 462      `glossary.py print-terms-for-chunk "<temp_dir>" "chunk<NNNN>.md"` in the
+ 463      same edit.
+ 464    - `manifest_source_hash_changed`: the source chunk was edited after
+ 465      splitting. Re-run the Step 2 `convert.py` command first, leaving out
+ 466      page-number flags such as `--strip-page-numbers`: once chunks exist,
+ 467      those flags abort and suggest deleting the cached files or the whole
+ 468      temp dir, which would also delete the translations. Without them it
+ 469      keeps the existing chunks and writes their new hashes to
+ 470      `manifest.json`. Skip this and the merge stops with "Source changed
+ 471      since splitting" even after re-translating. Plan again: the chunk is
+ 472      then queued with `source_hash_changed_since_record`.
+ 473    - `source_hash_changed_since_record` or any other reason: re-translate the
+ 474      chunk instead of editing it.
+ 475 
+ 476    Then record the edited output:
+ 477 
+ 478    ```bash
+ 479    python3 {baseDir}/scripts/run_state.py record "<temp_dir>" chunk<NNNN>
+ 480    ```
+ 481 
+ 482    **Re-translate.** Delete `output_chunk<NNNN>.md` and run Steps 3.7–4.5 again. The planner
+ 483    re-checks the whole book, so `translation_chunk_ids` can also list chunks
+ 484    the user did not mention, typically ones whose glossary terms changed after
+ 485    they were translated (`glossary_term_selection_changed` or
+ 486    `glossary_term_hash_changed` in the plan's `chunks[].reasons`). Translate
+ 487    only the chunks the user asked for; if the plan lists others, show the user
+ 488    those chunk ids with their reasons and ask before re-translating them.
+ 489 3. Re-run the Step 7 build command with the same flags. It re-merges because
+ 490    the chunk is newer than `output.md`, then regenerates the HTML and the other
+ 491    formats.

Compare on GitHub

Week of Oct 26, 2026 · Line counts unavailable

Before Not checked yet → After Network or broad shell

First observation → a663b1b4f1e6

No earlier version was observed for comparison.

Compare on GitHub

View on GitHubAdd to my skills

Verified commit 8a2d71cba25c514bfa6b6d6191b1fe21c0fe3229

git clone --filter=blob:none --no-checkout https://github.com/deusyu/translate-book.git .hotskills/deusyu-translate-book && git -C .hotskills/deusyu-translate-book checkout --detach 8a2d71cba25c514bfa6b6d6191b1fe21c0fe3229 # Copy each selected skill directory from .hotskills/deusyu-translate-book into .claude/skills/<skill-name>/
git clone --filter=blob:none --no-checkout https://github.com/deusyu/translate-book.git .hotskills/deusyu-translate-book && git -C .hotskills/deusyu-translate-book checkout --detach 8a2d71cba25c514bfa6b6d6191b1fe21c0fe3229 # Copy each selected skill directory from .hotskills/deusyu-translate-book into .agents/skills/<skill-name>/
2.4kGitHub stars
182stars in 7 days
1skill in this repository
7commits in 30 days

Heat

8.2
  • Star growth, last 7 daysAhead of 98% of tracked repositories
  • Star growth, last 24 hoursAhead of 98% of tracked repositories
  • Rank movement, last 7 daysAhead of 93% of tracked repositories
  • Commits, last 30 daysAhead of 73% of tracked repositories
  • Accounts asking about it through MCP, last 7 daysNot available
  • Hot votes this weekAhead of 0% of tracked repositories

Heat never changes the order by stars, and sponsorship never touches it. How heat works

Stars over time

Aug 2, 2026Nov 7, 20262,352

Individual skills in this repository

How it works

translate-book

When your agent uses it

Translate books (PDF/DOCX/EPUB) into any language using parallel sub-agents. Converts input -> Markdown chunks -> translated chunks -> HTML/DOCX/EPUB/PDF.

What it loads into context

Frontmatter

114 tokens

Always available to the agent

SKILL.md

6,785 tokens

When the skill is activated

Reference documents

21,139 tokens

Loaded on request

Token counts are estimates. Scripts run separately; they are not counted as reference context.

The playbook

  1. Workflow

Scripts executed separately

  • scripts/calibre_html_publish.py
  • scripts/chunk_context.py
  • scripts/convert.py
  • scripts/glossary.py
  • scripts/manifest.py
  • scripts/merge_and_build.py
  • scripts/merge_meta.py
  • scripts/meta.py
  • scripts/run_state.py
  • tests/test_calibre_html_publish.py
  • tests/test_chunk_context.py
  • tests/test_convert.py
  • tests/test_glossary.py
  • tests/test_manifest.py
  • tests/test_merge_and_build.py
  • tests/test_merge_meta.py
  • tests/test_meta.py
  • tests/test_run_state.py

Files

  • .claude/commands/release.mddoc1,315 bytes
  • .clawhubignoreasset118 bytes
  • .github/FUNDING.ymlasset68 bytes
  • .github/workflows/ci.ymlasset581 bytes
  • .gitignoreasset455 bytes
  • AGENTS.mddoc5,131 bytes
  • CLAUDE.mddoc3,861 bytes
  • LICENSEasset1,064 bytes
  • README.mddoc25,577 bytes
  • README.zh-CN.mddoc24,925 bytes
  • SKILL.mdcore27,461 bytes
  • SKILL.mdcore27,461 bytes
  • SKILL.mdcore27,461 bytes
  • SKILL.mdcore27,461 bytes
  • SKILL.mdcore27,461 bytes
  • SKILL.mdcore27,461 bytes
  • SKILL.mdcore27,461 bytes
  • SKILL.mdcore27,461 bytes
  • SKILL.mdcore27,461 bytes
  • SKILL.mdcore27,461 bytes
  • SKILL.mdcore27,461 bytes
  • SKILL.mdcore27,461 bytes
  • SKILL.mdcore27,461 bytes
  • SKILL.mdcore27,461 bytes
  • SKILL.mdcore27,461 bytes
  • SKILL.mdcore27,461 bytes
  • SKILL.mdcore27,461 bytes
  • SKILL.mdcore27,461 bytes
  • SKILL.mdcore27,461 bytes
  • SKILL.mdcore27,461 bytes
  • SKILL.mdcore27,461 bytes
  • SKILL.mdcore27,461 bytes
  • SKILL.mdcore27,461 bytes
  • SKILL.mdcore27,461 bytes
  • SKILL.mdcore27,461 bytes
  • SKILL.mdcore27,461 bytes
  • SKILL.mdcore27,461 bytes
  • SKILL.mdcore27,461 bytes
  • SKILL.mdcore27,461 bytes
  • SKILL.mdcore27,461 bytes
  • assets/poster/pages/poster-en.pageasset21,213 bytes
  • assets/poster/pages/poster.pageasset21,389 bytes
  • assets/poster/style.mddoc4,166 bytes
  • assets/poster/translate-book-poster-en.jpgasset227,579 bytes
  • assets/poster/translate-book-poster-en.pptdasset1,237 bytes
  • assets/poster/translate-book-poster.jpgasset234,120 bytes
  • assets/poster/translate-book-poster.pptdasset1,229 bytes
  • scripts/calibre_html_publish.pyruns13,336 bytes
  • scripts/chunk_context.pyruns3,897 bytes
  • scripts/convert.pyruns60,151 bytes
  • scripts/glossary.pyruns22,286 bytes
  • scripts/manifest.pyruns5,943 bytes
  • scripts/merge_and_build.pyruns45,226 bytes
  • scripts/merge_meta.pyruns43,840 bytes
  • scripts/meta.pyruns9,720 bytes
  • scripts/run_state.pyruns12,734 bytes
  • scripts/template.htmlasset13,263 bytes
  • scripts/template_ebook.htmlasset7,158 bytes
  • tests/.artifacts/.gitkeepasset1 bytes
  • tests/.artifacts/README.mddoc289 bytes
  • tests/baselines/README.mddoc3,905 bytes
  • tests/baselines/diligent-dick/SOURCE.mddoc4,329 bytes
  • tests/baselines/diligent-dick/diligent-dick.epubasset352,310 bytes
  • tests/baselines/sleepy-hollow/SOURCE.mddoc2,806 bytes
  • tests/baselines/sleepy-hollow/sleepy-hollow.epubasset287,033 bytes
  • tests/baselines/standard-alice/SOURCE.mddoc5,083 bytes
  • tests/baselines/standard-alice/standard-alice.epubasset10,635,439 bytes
  • tests/test_calibre_html_publish.pyruns3,705 bytes
  • tests/test_chunk_context.pyruns3,110 bytes
  • tests/test_convert.pyruns52,078 bytes
  • tests/test_glossary.pyruns31,506 bytes
  • tests/test_manifest.pyruns4,018 bytes
  • tests/test_merge_and_build.pyruns29,686 bytes
  • tests/test_merge_meta.pyruns93,250 bytes
  • tests/test_meta.pyruns6,242 bytes
  • tests/test_run_state.pyruns8,159 bytes
Read SKILL.md

# Book Translation Skill

You are a book translation assistant. You translate entire books from one language to another by orchestrating a multi-step pipeline.

## Workflow

### 1. Collect Parameters

Determine the following from the user's message:
- **file_path**: Path to the input file (PDF, DOCX, EPUB, or Markdown) — REQUIRED
- **target_lang**: Target language code (default: `zh`) — e.g. zh, en, ja, ko, fr, de, es
- **concurrency**: Number of parallel sub-agents per batch (default: `8`)
- **temp_root**: Optional directory under which `{filename}_temp/` should be created
- **epub_cover**: Optional explicit cover image path for EPUB output
View the complete source on GitHub

Skills included

  • translate-book

Repository facts

License
MIT
Created
Mar 15, 2026
Last pushed
Oct 29, 2026
Forks
271
Open issues
1
Project activity
Active

Rank over the last 12 weeks

Now #488 · best #420 · down 40 in 30 days

  1. #503 on Nov 1
  2. #504 on Nov 2
  3. #503 on Nov 3
  4. #491 on Nov 4
  5. #489 from Nov 5 to Nov 6
  6. #488 since Nov 7
79 earlier periods
  1. #534 on Aug 2
  2. #528 on Aug 7
  3. #524 on Aug 8
  4. #511 on Aug 9
  5. #525 on Aug 10
  6. #528 on Aug 11
  7. #524 from Aug 12 to Aug 14
  8. #508 on Aug 15
  9. #515 on Aug 16
  10. #517 on Aug 17
  11. #533 on Aug 18
  12. #525 on Aug 19
  13. #524 on Aug 20
  14. #529 on Aug 21
  15. #512 on Aug 22
  16. #530 on Aug 23
  17. #531 on Aug 24
  18. #541 on Aug 25
  19. #528 on Aug 26
  20. #540 on Aug 27
  21. #539 on Aug 28
  22. #521 on Aug 29
  23. #511 on Aug 30
  24. #538 on Aug 31
  25. #544 on Sep 1
  26. #536 on Sep 2
  27. #519 on Sep 3
  28. #472 on Sep 4
  29. #468 on Sep 5
  30. #466 on Sep 6
  31. #454 on Sep 7
  32. #456 on Sep 8
  33. #447 on Sep 9
  34. #444 on Sep 10
  35. #442 on Sep 11
  36. #439 on Sep 12
  37. #438 on Sep 13
  38. #448 on Sep 14
  39. #445 on Sep 15
  40. #452 on Sep 16
  41. #442 on Sep 17
  42. #449 on Sep 18
  43. #433 on Sep 19
  44. #441 on Sep 20
  45. #443 on Sep 21
  46. #447 on Sep 22
  47. #441 on Sep 23
  48. #432 on Sep 24
  49. #431 on Sep 25
  50. #428 on Sep 26
  51. #439 on Sep 27
  52. #444 on Sep 28
  53. #450 on Sep 29
  54. #446 on Sep 30
  55. #440 on Oct 1
  56. #439 on Oct 2
  57. #427 on Oct 3
  58. #420 on Oct 4
  59. #431 on Oct 5
  60. #437 on Oct 6
  61. #443 on Oct 7
  62. #448 on Oct 8
  63. #451 on Oct 9
  64. #444 from Oct 10 to Oct 11
  65. #456 on Oct 12
  66. #451 on Oct 13
  67. #454 on Oct 14
  68. #455 on Oct 15
  69. #450 on Oct 17
  70. #460 on Oct 18
  71. #472 from Oct 19 to Oct 20
  72. #479 on Oct 21
  73. #472 on Oct 22
  74. #471 on Oct 23
  75. #458 on Oct 24
  76. #495 on Oct 25
  77. #500 on Oct 28
  78. #501 on Oct 29
  79. #502 from Oct 30 to Oct 31

Before you install

Network or broad shell

Automated signals, not a guarantee

Checked Nov 4, 2026

Not fully analyzed: some files were too long, unreadable or missing. This never lowers the level.

Show 30 notes
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
Show all 89 signals by file

.github/FUNDING.yml

  • Network accessline 1
    # .github/FUNDING.yml github: deusyu custom: ["https://deusyu.app"]
  • Network accessline 3
    custom: ["https://deusyu.app"]

README.md

  • Network accessline 11
    > Inspired by [claude_translater](https://github.com/wizlijun/claude_translater). The original project uses shell scripts as its entry point, coordinating the Claude CLI with multiple step scripts to perform chunked translation. This projec
  • Network accessline 53
    - **Agent runtime** — Codex, Claude Code, or OpenClaw, installed and ready to run skills - **Calibre** — `ebook-convert` command must be available ([download](https://calibre-ebook.com/))
  • Network accessline 54
    - **Calibre** — `ebook-convert` command must be available ([download](https://calibre-ebook.com/))
  • Network accessline 55
    - **Pandoc** — for HTML↔Markdown conversion ([download](https://pandoc.org/))
  • Network accessline 74
    mkdir -p ~/.agents/skills git clone https://github.com/deusyu/translate-book.git ~/.agents/skills/translate-book
  • Network accessline 75
    git clone https://github.com/deusyu/translate-book.git ~/.agents/skills/translate-book
  • Network accessline 89
    mkdir -p ~/.claude/skills git clone https://github.com/deusyu/translate-book.git ~/.claude/skills/translate-book
  • Network accessline 90
    git clone https://github.com/deusyu/translate-book.git ~/.claude/skills/translate-book
  • Network accessline 170
    For bugs and feature requests, please open a [GitHub issue](https://github.com/deusyu/translate-book/issues) as described above. For questions, ideas, or anything else, you can reach me here:
  • Network accessline 172
    | Channel | Link | |---------|------| | X (Twitter) | [@0xdeusyu](https://x.com/0xdeusyu) |
  • Network accessline 173
    |---------|------| | X (Twitter) | [@0xdeusyu](https://x.com/0xdeusyu) | | Telegram | [@DeusThink](https://t.me/DeusThink) |
  • Network accessline 174
    | X (Twitter) | [@0xdeusyu](https://x.com/0xdeusyu) |
  • Network accessline 175
    | Telegram | [@DeusThink](https://t.me/DeusThink) |
  • Network accessline 176
    | Telegram Group (Chinese) | [@talkdeusyu](https://t.me/talkdeusyu) |
  • Network accessline 177
    | Telegram Channel (Chinese) | [@lovedesuyu](https://t.me/lovedesuyu) |
  • Network accessline 318
    Tracking [issue #7](https://github.com/deusyu/translate-book/issues/7) — name/term inconsistency and pronoun/gender errors across chunks. The pipeline now covers high-frequency entities, alias/spelling drift, adjacent-chunk pronoun context,
  • Network accessline 358
    [![Star History Chart](https://api.star-history.com/svg?repos=deusyu/translate-book&type=Date)](https://star-history.com/#deusyu/translate-book&Date)
  • Network accessline 364
    [![Sponsor](https://img.shields.io/github/sponsors/deusyu?label=Sponsor&logo=github)](https://github.com/sponsors/deusyu)

README.zh-CN.md

  • Network accessline 11
    > 本项目受 [claude_translater](https://github.com/wizlijun/claude_translater) 启发。原项目以 shell 脚本为入口,配合 Claude CLI 和多个步骤脚本完成分块翻译;本项目则将流程重构为可在 Codex、Claude Code 和 OpenClaw 中使用的 Agent Skill,使用 subagent 按 chunk 并行翻译,并引入 manifest 驱动的完整性校验,将续跑和多格式输出整合为
  • Network accessline 53
    - **Agent 运行环境** — Codex、Claude Code 或 OpenClaw,已安装并可运行 Skill - **Calibre** — `ebook-convert` 命令可用([下载](https://calibre-ebook.com/))
  • Network accessline 54
    - **Calibre** — `ebook-convert` 命令可用([下载](https://calibre-ebook.com/))
  • Network accessline 55
    - **Pandoc** — 用于 HTML↔Markdown 转换([下载](https://pandoc.org/))
  • Network accessline 74
    mkdir -p ~/.agents/skills git clone https://github.com/deusyu/translate-book.git ~/.agents/skills/translate-book
  • Network accessline 75
    git clone https://github.com/deusyu/translate-book.git ~/.agents/skills/translate-book
  • Network accessline 89
    mkdir -p ~/.claude/skills git clone https://github.com/deusyu/translate-book.git ~/.claude/skills/translate-book
  • Network accessline 90
    git clone https://github.com/deusyu/translate-book.git ~/.claude/skills/translate-book
  • Network accessline 170
    Bug 和功能需求请按上一节的要求提 [GitHub issue](https://github.com/deusyu/translate-book/issues)。使用上的疑问、想法或其他事情,可以通过下面这些方式找到我:
  • Network accessline 172
    | 渠道 | 链接 | |------|------| | X (Twitter) | [@0xdeusyu](https://x.com/0xdeusyu) |
  • Network accessline 173
    |------|------| | X (Twitter) | [@0xdeusyu](https://x.com/0xdeusyu) | | Telegram | [@DeusThink](https://t.me/DeusThink) |
  • Network accessline 174
    | X (Twitter) | [@0xdeusyu](https://x.com/0xdeusyu) |
  • Network accessline 175
    | Telegram | [@DeusThink](https://t.me/DeusThink) |
  • Network accessline 176
    | Telegram 交流群 | [@talkdeusyu](https://t.me/talkdeusyu) |
  • Network accessline 177
    | Telegram 频道 | [@lovedesuyu](https://t.me/lovedesuyu) |
  • Network accessline 318
    跟踪 [issue #7](https://github.com/deusyu/translate-book/issues/7) — chunk 之间的人名/术语不一致以及代词/性别错误。当前流水线已覆盖高频实体、别名/拼写漂移、相邻 chunk 的代词上下文,以及术语表变更后的精确重译。整书自然度校验仍是后续质量阶段。整体方案分为四个可独立交付的阶段。
  • Network accessline 358
    [![Star History Chart](https://api.star-history.com/svg?repos=deusyu/translate-book&type=Date)](https://star-history.com/#deusyu/translate-book&Date)
  • Network accessline 364
    [![Sponsor](https://img.shields.io/github/sponsors/deusyu?label=Sponsor&logo=github)](https://github.com/sponsors/deusyu)

SKILL.md

  • Broad permissionsline 1
    Read, Write, Edit, Bash, Glob, Grep, Agent, AskUserQuestion
  • Network accessline 3
    description: Translate books (PDF/DOCX/EPUB) into any language using parallel sub-agents. Converts input -> Markdown chunks -> translated chunks -> HTML/DOCX/EPUB/PDF. allowed-tools: Read, Write, Edit, Bash, Glob, Grep, Agent, AskUserQuesti
  • Network accessline 4
    allowed-tools: Read, Write, Edit, Bash, Glob, Grep, Agent, AskUserQuestion metadata: {"openclaw":{"requires":{"bins":["python3","pandoc","ebook-convert"],"anyBins":["calibre","ebook-convert"]},"homepage":"https://github.com/deusyu/translate
  • Network accessline 5
    metadata: {"openclaw":{"requires":{"bins":["python3","pandoc","ebook-convert"],"anyBins":["calibre","ebook-convert"]},"homepage":"https://github.com/deusyu/translate-book"}}

scripts/calibre_html_publish.py

  • Executable scriptline 1
    #!/usr/bin/env python3

scripts/chunk_context.py

  • Executable scriptline 1
    #!/usr/bin/env python3

scripts/convert.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Network accessline 94
    namespaces = {             'opf': 'http://www.idpf.org/2007/opf',
  • Network accessline 95
    'opf': 'http://www.idpf.org/2007/opf',
  • Network accessline 96
    'dc': 'http://purl.org/dc/elements/1.1/',
  • Network accessline 97
    'dcterms': 'http://purl.org/dc/terms/'
  • Possible obfuscationline 929
    metadata, body = split_front_matter(content.replace('<U+FEFF>', ''))
  • Possible obfuscationline 948
    content = content.replace('<U+FEFF>', '').replace(' ', ' ')
  • Possible obfuscationline 980
    data = base64.b64decode(data_uri.group(2))
  • Network accessline 1519
    if not calibre_path:             print("Error: Calibre ebook-convert not found")             print("Please install Calibre: https://calibre-ebook.com/")
  • Network accessline 1520
    print("Error: Calibre ebook-convert not found")             print("Please install Calibre: https://calibre-ebook.com/")             sys.exit(1)
  • Network accessline 1521
    print("Please install Calibre: https://calibre-ebook.com/")

scripts/glossary.py

  • Executable scriptline 1
    #!/usr/bin/env python3

scripts/manifest.py

  • Executable scriptline 1
    #!/usr/bin/env python3

scripts/merge_and_build.py

  • Executable scriptline 1
    #!/usr/bin/env python3

scripts/merge_meta.py

  • Executable scriptline 1
    #!/usr/bin/env python3

scripts/meta.py

  • Executable scriptline 1
    #!/usr/bin/env python3

scripts/run_state.py

  • Executable scriptline 1
    #!/usr/bin/env python3

tests/test_calibre_html_publish.py

  • Executable scriptline 1
    Executable file

tests/test_chunk_context.py

  • Executable scriptline 1
    Executable file

tests/test_convert.py

  • Executable scriptline 1
    Executable file
  • Network accessline 562
    _link("#calibre_link-1", _str("cross-reference")), _str(","), SPACE,                   _span(*_words("sic erat"), attrs=[("lang", "lat")]), SPACE,                   _link("https://example.com", _str("site"))),
  • Network accessline 563
    _span(*_words("sic erat"), attrs=[("lang", "lat")]), SPACE,                   _link("https://example.com", _str("site"))),         )
  • Network accessline 564
    _link("https://example.com", _str("site"))),
  • Network accessline 570
    doc["blocks"][0]["c"],             [*_words("A page anchor"), SPACE, _str("cross-reference,"), SPACE,              *_words("sic erat"), SPACE, _link("https://example.com", _str("site"))],
  • Network accessline 571
    [*_words("A page anchor"), SPACE, _str("cross-reference,"), SPACE,              *_words("sic erat"), SPACE, _link("https://example.com", _str("site"))],         )
  • Network accessline 572
    *_words("sic erat"), SPACE, _link("https://example.com", _str("site"))],
  • Network accessline 618
    doc = _doc(_para(             _str("A"), _span(SPACE, _span(ident="page_3")), _str("B"),             _link("https://example.com", SPACE), _str("C"),
  • Network accessline 619
    _str("A"), _span(SPACE, _span(ident="page_3")), _str("B"),             _link("https://example.com", SPACE), _str("C"),         ))
  • Network accessline 620
    _link("https://example.com", SPACE), _str("C"),
  • Network accessline 628
    # Calibre classes such as `pcalibre1` survive on external links and         # would be written out as `[site](https://example.com){.pcalibre1}`.
  • Network accessline 629
    # would be written out as `[site](https://example.com){.pcalibre1}`.
  • Network accessline 630
    link = {"t": "Link", "c": [["calibre_link-5", ["pcalibre1", "pcalibre"], [["type", "x"]]],                                    [_str("site")], ["https://example.com", "Example"]]}
  • Network accessline 631
    [_str("site")], ["https://example.com", "Example"]]}
  • Network accessline 636
    self.assertEqual(             doc["blocks"][0]["c"][-1],             {"t": "Link", "c": [["", [], []], [_str("site")], ["https://example.com", "Example"]]},
  • Network accessline 637
    doc["blocks"][0]["c"][-1],             {"t": "Link", "c": [["", [], []], [_str("site")], ["https://example.com", "Example"]]},         )
  • Network accessline 638
    {"t": "Link", "c": [["", [], []], [_str("site")], ["https://example.com", "Example"]]},
  • Network accessline 1126
    def test_leaves_remote_and_missing_images_untouched(self):         with tempfile.TemporaryDirectory() as tmp:             text = "![r](https://example.com/x.png)\n![m](missing.png)\n"
  • Network accessline 1127
    with tempfile.TemporaryDirectory() as tmp:             text = "![r](https://example.com/x.png)\n![m](missing.png)\n"             md = self._source(tmp, text)
  • Network accessline 1128
    text = "![r](https://example.com/x.png)\n![m](missing.png)\n"

tests/test_glossary.py

  • Executable scriptline 1
    Executable file

tests/test_manifest.py

  • Executable scriptline 1
    Executable file

tests/test_merge_and_build.py

  • Executable scriptline 1
    Executable file

tests/test_merge_meta.py

  • Executable scriptline 1
    Executable file

tests/test_meta.py

  • Executable scriptline 1
    Executable file

tests/test_run_state.py

  • Executable scriptline 1
    Executable file

How the signals fit together

Facts from a static read of the files at the pinned commit. They describe what the code does, not why.

Some files could not be read; the facts below still hold.

Declared and executed: 2 facts
  • Contacts www.idpf.org, which SKILL.md, the README and the plugin manifest do not mentionscripts/convert.py:95High confidence
  • Contacts purl.org, which SKILL.md, the README and the plugin manifest do not mentionscripts/convert.py:96High confidence
Signal confidence: 87 facts

and 37 more

Works with

Agent compatibility, from the files in this repository
AgentStatusEvidenceInstall to
Claude CodeNativePath .claude/commands/release.md.claude/skills/<skill-name>/
CodexNativeManifest AGENTS.md.agents/skills/<skill-name>/
CursorCompatibleStandard SKILL.md SKILL.md.cursor/skills/<skill-name>/
Gemini CLICompatibleStandard SKILL.md SKILL.md.gemini/skills/<skill-name>/
GitHub CopilotCompatibleStandard SKILL.md SKILL.md.github/skills/<skill-name>/
OpenCodeCompatibleStandard SKILL.md SKILL.md.opencode/skills/<skill-name>/
  • Native The repository ships a manifest, folder or frontmatter field for this agent.
  • Compatible A standard SKILL.md that this agent can read.
  • Unknown No evidence either way.

Derived automatically from paths, manifests and frontmatter. Not tested on each agent.

Explore alternatives and comparisons

Add this badge to your README

It updates every night and links to this page.

deusyu/translate-book: #488 on hotskills, 2.4k stars

[![deusyu/translate-book on hotskills](https://hotskills.dev/badge/deusyu-translate-book.svg)](https://hotskills.dev/skill/deusyu-translate-book/)