Skip to content

feat(english): add Tensurafan source - #2701

Merged
rajarsheechatterjee merged 2 commits into
lnreader:masterfrom
RibatTRW:fm/lnreader-tensurafan-plugin
Oct 19, 2026
Merged

rajarsheechatterjee merged 2 commits into
lnreader:masterfrom
RibatTRW:fm/lnreader-tensurafan-plugin

Conversation

@RibatTRW

@RibatTRW RibatTRW commented Oct 18, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Adds a new English source for Tensurafan (https://tensurafan.github.io), the fan translation of That Time I Got Reincarnated as a Slime, as requested in #2697. The novel lists every volume plus the side stories and special booklets in reading order, and a plugin setting lets readers choose which of the site's selectable name terms appear in chapters.

What Changed

  • Added a standalone English plugin, plugins/english/tensurafan.ts (id tensurafan, v1.0.0), for https://tensurafan.github.io. It exposes the site's That Time I Got Reincarnated as a Slime volumes as chapters. It reads each volume's table of contents with a ranged fetch and parses the chapter content from the volume page.
  • Added a termSet plugin setting (Default / Official / Text-to-speech friendly terms). It mirrors the site's "Set All Terms to ..." choices under Extras > Manage Selectable terms and applies to chapters opened after the change.
  • Added the plugin icon at public/static/src/en/tensurafan/icon.png.

Closes #2697

This plugin and PR were authored by an AI agent (Claude Code); please review accordingly.

🤖 Generated with Claude Code

Screenshots

Plugin playground, live against tensurafan.github.io:

Playground: popular listing with the Tensura novel and cover

Playground: novel details and start of the 157-chapter list

Playground: Volume 8.5 side stories in the chapter list

Playground: special booklet chapters at the end of the list

Playground: chapter text (Volume 6 Chapter 1)

Playground: search "slime" finds the novel

Playground: unrelated search returns no results

Risk Assessment

✅ Low: A new, self-contained plugin with an icon. The live volume list includes booklets (b1, b5) and side stories (8.5, 13.5), and every table of contents ends well within the 24,000-byte range the plugin reads.

Testing

The live check passed all four methods. A direct run showed 157 chapters across Volumes 6-21, the 8.5 and 13.5 side stories and the Special Booklets, with author and artist filled in, and the booklet chapter returned clean HTML. The term-set option behaved correctly: in Volume 6 the default set kept "Souei" 87 times, the official set replaced all 87 with "Soei", and the TTS set kept the default. The playground showed Tensurafan in Popular and Parse Novel, and Parse Chapter rendered a side-story chapter. One gap: the Parse Chapter screenshot is of a side story (8.5), not a booklet.

  • Live validation: ✅ go - 4 of 4 scenarios driven live against the product
Scenario Result Live Evidence
Live check: popular, search, parseNovel and parseChapter against tensurafan.github.io ✅ pass live check:plugin output: 4/4 PASS, 157 chapters
Novel page lists side stories (8.5, 13.5) and Special Booklets alongside volumes ✅ pass live parseNovel run: 26 side-story/booklet chapters; booklet chapter parsed to 33k chars with no iframe, script or onclick
Term-set plugin option swaps names (default, official, TTS) ✅ pass live Volume 6 term counts: default Souei 87; official Soei 87, Souei 0; tts unchanged
Playground shows plugin and renders chapter content ✅ pass live tensurafan-popular.png, tensurafan-parsenovel.png, tensurafan-parsechapter-sidestory.png
  • Evidence: Playground popular (local file: ~/.no-mistakes/evidence/01M566PGVZ6N7REC3EE4E158PN/tensurafan-popular.png)
  • Evidence: Playground parse novel (157 chapters) (local file: ~/.no-mistakes/evidence/01M566PGVZ6N7REC3EE4E158PN/tensurafan-parsenovel.png)
  • Evidence: Playground parse chapter (side story) (local file: ~/.no-mistakes/evidence/01M566PGVZ6N7REC3EE4E158PN/tensurafan-parsechapter-sidestory.png)

Pipeline

Updates from git push no-mistakes

✅ **intent** - passed

✅ No issues found.

✅ **Rebase** - passed

✅ No issues found.

✅ **Review** - passed

✅ No issues found.

✅ **Test** - passed

✅ No issues found.

  • Live validation: ✅ go - 4 of 4 scenarios driven live against the product
Scenario Result Live Evidence
Live check: popular, search, parseNovel and parseChapter against tensurafan.github.io ✅ pass live check:plugin output: 4/4 PASS, 157 chapters
Novel page lists side stories (8.5, 13.5) and Special Booklets alongside volumes ✅ pass live parseNovel run: 26 side-story/booklet chapters; booklet chapter parsed to 33k chars with no iframe, script or onclick
Term-set plugin option swaps names (default, official, TTS) ✅ pass live Volume 6 term counts: default Souei 87; official Soei 87, Souei 0; tts unchanged
Playground shows plugin and renders chapter content ✅ pass live tensurafan-popular.png, tensurafan-parsenovel.png, tensurafan-parsechapter-sidestory.png
  • npm run check:plugin -- plugins/english/tensurafan.ts (all 4 checks pass)
  • esbuild-bundled plugin driven directly: parseNovel chapter list, Special Booklets chapter, termSet default/official/tts counts on Volume 6
  • npm run dev:start playground driven in headless Chromium over CDP: Popular, Parse Novel, Parse Chapter on /read/v8_5#story-1
✅ **Document** - passed

✅ No issues found.

✅ **Lint** - passed

✅ No issues found.

✅ **Push** - passed

✅ No issues found.

@greptile-apps

greptile-apps Bot commented Oct 18, 2026 •

Copy link
Copy Markdown

RetriggerView in GreptileConfidence Score: 3/5

[Medium impact] Adds a new content source plugin for a fan site.

Remove embedded frames from chapter HTML before merging.

Findings

  1. P1 Security Chapter content can run code ▶

Summary

Adds Tensurafan as a single-series English source.

  • Readers can browse Tensurafan's Slime novel as volume chapters.
  • Opened Tensurafan chapters contain cleaned section text.
  • Readers can choose which Tensurafan names appear in chapters.

Reviews (1) · Last reviewed commit: "feat(english): add Tensurafan source" · Reviewed by Greptile

Comment thread plugins/english/tensurafan.ts Outdated

const $ = loadCheerio(body, null, false);
// The full-page title card repeats the heading that follows it as text.
$('script, style, noscript, p.pagebreak').remove();

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 security Chapter content can run code

parseChapter leaves iframe elements and their srcdoc attributes intact. If the source serves malicious chapter HTML, it can put an encoded script inside srcdoc. Removing script elements does not inspect HTML inside an attribute, and the attribute loop ignores srcdoc.

The playground inserts the returned HTML directly, so that script can read or change the playground page. Remove iframe elements before returning chapter HTML.

How this was verified: Remote chapter HTML reaches dangerouslySetInnerHTML, while neither cleanup step removes an unsandboxed iframe containing script in srcdoc.

Suggested change
$('script, style, noscript, p.pagebreak').remove();
$('script, style, noscript, iframe, p.pagebreak').remove();

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks. parseChapter now also removes iframe, object and embed elements from the chapter HTML (commit e56ddef).

…HTML

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@rajarsheechatterjee
rajarsheechatterjee merged commit 9df390e into lnreader:master Oct 19, 2026
3 checks passed
rajarsheechatterjee pushed a commit that referenced this pull request Oct 19, 2026
Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Tensurafan plugin

2 participants