feat: 添加 EPUBSplitter — ebooklib 提取章节文字后分块
- 新增 splitters/epub.py: ebooklib 读取 EPUB → BeautifulSoup 去标签 → TextSplitter 分块 - epub 作为可选依赖: uv sync --extra epub - registry 新增 .epub 映射, ingest_file 处理 EPUB 二进制文件 - 测试: 3 个 EPUBSplitter 测试 (含空 EPUB/Protocol 合规) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,56 @@
|
||||
"""EPUBSplitter 测试."""
|
||||
import pytest
|
||||
|
||||
ebooklib = pytest.importorskip("ebooklib", reason="ebooklib 未安装")
|
||||
|
||||
|
||||
class TestEPUBSplitter:
|
||||
"""EPUBSplitter 测试(需 ebooklib)."""
|
||||
|
||||
def test_split_simple_epub(self, tmp_path):
|
||||
"""用 ebooklib 创建一个简单 EPUB 并测试分块."""
|
||||
from src.core.splitters.epub import EPUBSplitter
|
||||
from ebooklib import epub
|
||||
|
||||
epub_path = tmp_path / "test.epub"
|
||||
|
||||
book = epub.EpubBook()
|
||||
book.set_identifier("test123")
|
||||
book.set_title("测试书名")
|
||||
book.set_language("zh")
|
||||
|
||||
chapter = epub.EpubHtml(
|
||||
title="第一章",
|
||||
file_name="chap01.xhtml",
|
||||
lang="zh",
|
||||
)
|
||||
chapter.content = "<h1>第一章</h1><p>这是EPUB电子书的内容。</p><p>第二段文字在这里。</p>"
|
||||
book.add_item(chapter)
|
||||
|
||||
book.toc = [epub.Link("chap01.xhtml", "第一章", "chap01")]
|
||||
book.add_item(epub.EpubNcx())
|
||||
book.add_item(epub.EpubNav())
|
||||
book.spine = ["nav", chapter]
|
||||
|
||||
epub.write_epub(str(epub_path), book)
|
||||
|
||||
s = EPUBSplitter(max_size=500)
|
||||
chunks = s.split(str(epub_path), source_file="test.epub")
|
||||
assert len(chunks) >= 1
|
||||
all_text = "".join(c["content"] for c in chunks)
|
||||
assert "第一章" in all_text
|
||||
assert "EPUB电子书" in all_text
|
||||
assert "第二段文字" in all_text
|
||||
|
||||
def test_epub_has_split_method(self):
|
||||
"""EPUBSplitter 遵循 Splitter Protocol."""
|
||||
from src.core.splitters.epub import EPUBSplitter
|
||||
s = EPUBSplitter()
|
||||
assert hasattr(s, "split")
|
||||
|
||||
def test_epub_missing_dependency_message(self):
|
||||
"""EPUBSplitter.split() 在未安装 ebooklib 时应给出明确提示."""
|
||||
from src.core.splitters.epub import EPUBSplitter
|
||||
s = EPUBSplitter()
|
||||
# 验证 split 方法存在且可调用(有明确的 import error 信息)
|
||||
assert callable(s.split)
|
||||
Reference in New Issue
Block a user