Files
bigwo/parsers/base.py

63 lines
1.6 KiB
Python
Raw Normal View History

"""BaseParser 抽象基类和 ParserRegistry 解析器注册表"""
import os
from abc import ABC, abstractmethod
from typing import List
from exceptions import ParseError, UnsupportedFormatError
class BaseParser(ABC):
"""文件解析器抽象基类"""
@abstractmethod
def supported_extensions(self) -> List[str]:
"""返回支持的文件扩展名列表,如 ['.pdf']"""
pass
@abstractmethod
def parse(self, file_path: str) -> str:
"""
解析文件并返回纯文本/Markdown 内容
Args:
file_path: 文件路径
Returns:
提取的文本内容Markdown 格式优先
Raises:
ParseError: 文件损坏格式不支持或编码无法识别时抛出
"""
pass
class ParserRegistry:
"""根据文件扩展名自动选择合适的解析器"""
def __init__(self):
self._parsers: List[BaseParser] = []
def register(self, parser: BaseParser) -> None:
"""注册一个解析器"""
self._parsers.append(parser)
def get_parser(self, file_path: str) -> BaseParser:
"""
根据文件扩展名返回对应的解析器
Args:
file_path: 文件路径
Returns:
匹配的解析器实例
Raises:
UnsupportedFormatError: 未找到匹配的解析器时抛出
"""
ext = os.path.splitext(file_path)[1].lower()
for parser in self._parsers:
if ext in parser.supported_extensions():
return parser
raise UnsupportedFormatError(os.path.basename(file_path), ext)