refactor: 重构解析器架构并添加编码检测和配置管理
简化 parse_input() 为纯调度器,通过遍历 readers 的 supports() 方法识别输入类型,移除 URL 特殊处理和文件检查逻辑。各 reader 的 parse() 方法负责完整验证(文件存在、格式有效性)。 新增功能: - 添加 chardet 编码自动检测,支持多种中文编码回退机制 - 创建统一配置类管理编码、下载超时、日志等级等配置项 - HTML reader 支持本地文件编码检测和 URL 统一处理 安全性改进: - 修复 safe_open_zip() 路径遍历漏洞,使用 pathlib 规范化路径 - 添加边界检查,search_markdown() 检查负数参数 其他改进: - 修复类型注解(argparse.Namespace) - 日志系统仅输出 ERROR 级别,避免干扰 Markdown 输出 - 更新 BaseReader 接口文档,明确 supports() 和 parse() 职责划分 - 同步 delta specs 到主 specs(document-reading、html-reader、configuration、encoding-detection)
This commit is contained in:
@@ -5,7 +5,7 @@ HTML/URL 文档解析能力,支持多种解析方法。
|
||||
## Requirements
|
||||
|
||||
### Requirement: HTML 文档解析
|
||||
系统 SHALL 支持解析 HTML 格式文档和 URL 网页,按优先级尝试多个解析器。
|
||||
系统 SHALL 支持解析 HTML 格式文档和 URL 网页,URL 处理逻辑在 HTML reader 内部统一处理。
|
||||
|
||||
#### Scenario: 按优先级尝试解析器
|
||||
- **WHEN** 解析 HTML 内容
|
||||
@@ -20,7 +20,15 @@ HTML/URL 文档解析能力,支持多种解析方法。
|
||||
- **THEN** 系统返回失败列表并退出非零状态码
|
||||
|
||||
### Requirement: URL 下载
|
||||
系统 SHALL 支持从 URL 下载网页内容,按优先级尝试多个下载器。
|
||||
系统 SHALL 在 HTML reader 内部处理 URL 下载,而非在 parse_input() 中特殊处理。
|
||||
|
||||
#### Scenario: HTML reader 支持 URL
|
||||
- **WHEN** 调用 HtmlReader.supports(input_path) 且 input_path 为 URL
|
||||
- **THEN** 返回 True
|
||||
|
||||
#### Scenario: HTML reader 解析 URL
|
||||
- **WHEN** 调用 HtmlReader.parse(input_path) 且 input_path 为 URL
|
||||
- **THEN** 系统调用内部的 download_and_parse() 方法
|
||||
|
||||
#### Scenario: 按优先级尝试下载器
|
||||
- **WHEN** 输入为 URL
|
||||
@@ -190,3 +198,48 @@ HTML/URL 文档解析能力,支持多种解析方法。
|
||||
#### Scenario: html2text 解析器在独立文件
|
||||
- **WHEN** 使用 html2text 解析器
|
||||
- **THEN** 从 readers/html/html2text.py 导入
|
||||
|
||||
### Requirement: HTML 文件编码检测
|
||||
系统 SHALL 在读取本地 HTML 文件时使用编码自动检测。
|
||||
|
||||
#### Scenario: 读取 HTML 文件使用编码检测
|
||||
- **WHEN** 解析本地 HTML 文件
|
||||
- **THEN** 系统使用 encoding_detection.read_text_file() 读取文件
|
||||
|
||||
#### Scenario: 编码检测成功
|
||||
- **WHEN** 编码检测成功读取文件
|
||||
- **THEN** 系统继续解析 HTML 内容
|
||||
|
||||
#### Scenario: 编码检测失败
|
||||
- **WHEN** 编码检测失败
|
||||
- **THEN** 系统返回错误信息包含编码检测失败原因
|
||||
|
||||
### Requirement: HTML reader 统一处理 URL 和文件
|
||||
系统 SHALL 在 HTML reader 的 parse() 方法中统一处理 URL 和本地文件。
|
||||
|
||||
#### Scenario: parse() 判断输入类型
|
||||
- **WHEN** 调用 HtmlReader.parse(file_path)
|
||||
- **THEN** 系统判断 file_path 是 URL 还是本地文件
|
||||
|
||||
#### Scenario: URL 调用 download_and_parse
|
||||
- **WHEN** file_path 为 URL
|
||||
- **THEN** 系统调用 self.download_and_parse(file_path)
|
||||
|
||||
#### Scenario: 本地文件读取并解析
|
||||
- **WHEN** file_path 为本地文件
|
||||
- **THEN** 系统使用编码检测读取文件,然后解析 HTML 内容
|
||||
|
||||
### Requirement: HTML reader supports() 支持 URL
|
||||
系统 SHALL 在 HTML reader 的 supports() 方法中同时支持 URL 和 HTML 文件扩展名。
|
||||
|
||||
#### Scenario: supports() 识别 URL
|
||||
- **WHEN** 调用 HtmlReader.supports(file_path) 且 file_path 以 http:// 或 https:// 开头
|
||||
- **THEN** 返回 True
|
||||
|
||||
#### Scenario: supports() 识别 HTML 文件
|
||||
- **WHEN** 调用 HtmlReader.supports(file_path) 且 file_path 以 .html 或 .htm 结尾
|
||||
- **THEN** 返回 True
|
||||
|
||||
#### Scenario: supports() 不支持其他类型
|
||||
- **WHEN** 调用 HtmlReader.supports(file_path) 且 file_path 既非 URL 也非 HTML 文件
|
||||
- **THEN** 返回 False
|
||||
|
||||
Reference in New Issue
Block a user