MarkItDown
MarkItDown 源码导读:追踪一次 UTF-8 文本转换
在固定提交上阅读核心与 PlainTextConverter,理解接受条件、字符集解码、游标恢复和有针对性的插件回归测试。
你将学会
- 纯文本转换器先接受元数据,再解码内容。
- 声明字符集会改变实际解码路径。
- 游标测试与空输出测试检查不同契约。
开始前需要
- 具备基础 Python 与命令行知识
- 准备一份内容可核验且不含敏感信息的文档
使用本章清单解释并验证文档导入流程中的对应环节。
先看结论
- 纯文本转换器先接受元数据,再解码内容。
- 声明字符集会改变实际解码路径。
- 游标测试与空输出测试检查不同契约。
用两个小文件建立阅读路线
本文核对提交 b6e8bbdce628d564c6af031b5f26cda6e818ea10 中的 _markitdown.py 与 converters/_plain_text_converter.py。从公开输入方法进入 _convert 派发循环,再阅读 PlainTextConverter。这些观察仅覆盖所列文件,不能推导出每个 PDF、Office 或云转换器的行为。
一个包含标题与重音字符的 UTF-8 小样本便于理解这条路线。传入字节流,提供匹配的 StreamInfo 扩展名与字符集,再检查返回文本。下方示例是供读者在固定环境执行的回归样本,不是本文已执行的运行跟踪或性能测量。
接受输入与解码是两个步骤
当 StreamInfo 提供 charset 时,PlainTextConverter.accepts 返回真;否则检查认可的扩展名和 MIME 前缀。接受方法只检查元数据,不消费字节流,因此满足派发器要求的游标不变约束。
PlainTextConverter.convert 读取字节;有声明字符集时按该字符集解码,否则使用 charset_normalizer 的最佳结果并转为文本。最终包装成 DocumentConverterResult。它不会凭空给任意纯文本建立文档大纲,也不会自动推断表格结构。
把阅读结果变成窄而明确的测试
可以编写自定义转换器,让接受探测临时读取字节后再 seek 回原位,以测试流契约。故意不恢复游标的错误探测应触发派发器断言。相比扫描一堆无关文件并只比较退出状态,这种测试更容易定位问题。
把无效的声明编码与未知格式分开测试。解码异常发生在转换器接受输入之后,属于转换尝试失败路径。也应测试返回空文本的转换器:结果对象存在,并不代表导入应用应当接受毫无信息的输出。
实施步骤
- 1
固定所引提交并阅读两个源码文件。
- 2
在该环境运行 BytesIO 样本。
- 3
增加无效字符集样本并观察异常。
- 4
增加验证游标恢复的自定义接受探测测试。
可复制示例
from io import BytesIO
from markitdown import MarkItDown, StreamInfo
stream = BytesIO("# Example\n\nCafé\n".encode("utf-8"))
result = MarkItDown(enable_plugins=False).convert_stream(
stream, stream_info=StreamInfo(extension=".txt", charset="utf-8")
)
assert "Café" in result.markdown
print(result.markdown)常见问题
这是源码分析还是实际运行跟踪?
这是对所引源码的分析,并附上供读者执行的样本,没有报告实际运行测量。
纯文本转换会重建语义结构吗?
所检查的转换器负责解码并返回文本,样本中的标题来自输入本身。