feat: 添加 doc/xls/ppt 旧格式文档支持

- 新增 DocReader,支持 markitdown 和 pypandoc-binary 解析器
- 新增 XlsReader,支持 unstructured、markitdown 和 pandas+xlrd 解析器
- 新增 PptReader,支持 markitdown 解析器
- 添加 olefile 依赖用于验证 OLE2 格式
- 更新 config.py 添加 doc/xls/ppt 依赖配置
- 更新 --advice 支持 doc/xls/ppt 格式
- 添加相应的测试用例
- 同步 specs 到主目录
This commit is contained in:
2026-03-10 23:09:13 +08:00
parent e53e64d386
commit cf10458dd6
32 changed files with 756 additions and 5 deletions

View File

@@ -0,0 +1 @@
"""测试 DocReader 模块。"""

View File

@@ -0,0 +1,21 @@
"""测试所有 DOC Readers 的一致性。"""
import pytest
from readers.doc import markitdown, pypandoc
class TestDocReadersConsistency:
"""验证 DOC Readers 模块结构正确。"""
def test_parsers_importable(self):
"""测试所有 parser 模块可以正确导入。"""
# 验证模块导入成功
assert markitdown is not None
assert pypandoc is not None
assert hasattr(markitdown, 'parse')
assert hasattr(pypandoc, 'parse')
def test_parser_functions_callable(self):
"""测试 parse 函数是可调用的。"""
assert callable(markitdown.parse)
assert callable(pypandoc.parse)

View File

@@ -0,0 +1,25 @@
"""测试 MarkItDown DOC Reader 的解析功能。"""
import pytest
import os
from readers.doc import markitdown
class TestMarkitdownDocReaderParse:
"""测试 MarkItDown DOC Reader 的 parse 方法。"""
def test_module_importable(self):
"""测试模块可以正确导入。"""
assert markitdown is not None
assert hasattr(markitdown, 'parse')
assert callable(markitdown.parse)
def test_file_not_exists(self, tmp_path):
"""测试文件不存在的情况。"""
non_existent_file = str(tmp_path / "non_existent.doc")
content, error = markitdown.parse(non_existent_file)
# 验证返回 None 和错误信息
assert content is None
assert error is not None

View File

@@ -0,0 +1,25 @@
"""测试 pypandoc DOC Reader 的解析功能。"""
import pytest
import os
from readers.doc import pypandoc
class TestPypandocDocReaderParse:
"""测试 pypandoc DOC Reader 的 parse 方法。"""
def test_module_importable(self):
"""测试模块可以正确导入。"""
assert pypandoc is not None
assert hasattr(pypandoc, 'parse')
assert callable(pypandoc.parse)
def test_file_not_exists(self, tmp_path):
"""测试文件不存在的情况。"""
non_existent_file = str(tmp_path / "non_existent.doc")
content, error = pypandoc.parse(non_existent_file)
# 验证返回 None 和错误信息
assert content is None
assert error is not None

View File

@@ -0,0 +1 @@
"""测试 PptReader 模块。"""

View File

@@ -0,0 +1,18 @@
"""测试所有 PPT Readers 的一致性。"""
import pytest
from readers.ppt import markitdown
class TestPptReadersConsistency:
"""验证 PPT Readers 模块结构正确。"""
def test_parsers_importable(self):
"""测试所有 parser 模块可以正确导入。"""
# 验证模块导入成功
assert markitdown is not None
assert hasattr(markitdown, 'parse')
def test_parser_functions_callable(self):
"""测试 parse 函数是可调用的。"""
assert callable(markitdown.parse)

View File

@@ -0,0 +1,25 @@
"""测试 MarkItDown PPT Reader 的解析功能。"""
import pytest
import os
from readers.ppt import markitdown
class TestMarkitdownPptReaderParse:
"""测试 MarkItDown PPT Reader 的 parse 方法。"""
def test_module_importable(self):
"""测试模块可以正确导入。"""
assert markitdown is not None
assert hasattr(markitdown, 'parse')
assert callable(markitdown.parse)
def test_file_not_exists(self, tmp_path):
"""测试文件不存在的情况。"""
non_existent_file = str(tmp_path / "non_existent.ppt")
content, error = markitdown.parse(non_existent_file)
# 验证返回 None 和错误信息
assert content is None
assert error is not None

View File

@@ -0,0 +1 @@
"""测试 XlsReader 模块。"""

View File

@@ -0,0 +1,24 @@
"""测试所有 XLS Readers 的一致性。"""
import pytest
from readers.xls import unstructured, markitdown, pandas
class TestXlsReadersConsistency:
"""验证 XLS Readers 模块结构正确。"""
def test_parsers_importable(self):
"""测试所有 parser 模块可以正确导入。"""
# 验证模块导入成功
assert unstructured is not None
assert markitdown is not None
assert pandas is not None
assert hasattr(unstructured, 'parse')
assert hasattr(markitdown, 'parse')
assert hasattr(pandas, 'parse')
def test_parser_functions_callable(self):
"""测试 parse 函数是可调用的。"""
assert callable(unstructured.parse)
assert callable(markitdown.parse)
assert callable(pandas.parse)

View File

@@ -0,0 +1,25 @@
"""测试 MarkItDown XLS Reader 的解析功能。"""
import pytest
import os
from readers.xls import markitdown
class TestMarkitdownXlsReaderParse:
"""测试 MarkItDown XLS Reader 的 parse 方法。"""
def test_module_importable(self):
"""测试模块可以正确导入。"""
assert markitdown is not None
assert hasattr(markitdown, 'parse')
assert callable(markitdown.parse)
def test_file_not_exists(self, tmp_path):
"""测试文件不存在的情况。"""
non_existent_file = str(tmp_path / "non_existent.xls")
content, error = markitdown.parse(non_existent_file)
# 验证返回 None 和错误信息
assert content is None
assert error is not None

View File

@@ -0,0 +1,25 @@
"""测试 pandas XLS Reader 的解析功能。"""
import pytest
import os
from readers.xls import pandas
class TestPandasXlsReaderParse:
"""测试 pandas XLS Reader 的 parse 方法。"""
def test_module_importable(self):
"""测试模块可以正确导入。"""
assert pandas is not None
assert hasattr(pandas, 'parse')
assert callable(pandas.parse)
def test_file_not_exists(self, tmp_path):
"""测试文件不存在的情况。"""
non_existent_file = str(tmp_path / "non_existent.xls")
content, error = pandas.parse(non_existent_file)
# 验证返回 None 和错误信息
assert content is None
assert error is not None

View File

@@ -0,0 +1,25 @@
"""测试 unstructured XLS Reader 的解析功能。"""
import pytest
import os
from readers.xls import unstructured
class TestUnstructuredXlsReaderParse:
"""测试 unstructured XLS Reader 的 parse 方法。"""
def test_module_importable(self):
"""测试模块可以正确导入。"""
assert unstructured is not None
assert hasattr(unstructured, 'parse')
assert callable(unstructured.parse)
def test_file_not_exists(self, tmp_path):
"""测试文件不存在的情况。"""
non_existent_file = str(tmp_path / "non_existent.xls")
content, error = unstructured.parse(non_existent_file)
# 验证返回 None 和错误信息
assert content is None
assert error is not None