1
This commit is contained in:
@@ -0,0 +1,53 @@
|
||||
package common
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// Parser 文档解析器接口:从源文件抽取纯文本
|
||||
type Parser interface {
|
||||
// Parse 返回文档全文(保留标题/段落/空行结构,供分块器使用)
|
||||
Parse(path string) (string, error)
|
||||
}
|
||||
|
||||
var parsers = map[string]Parser{}
|
||||
|
||||
func init() {
|
||||
registerParser("txt", &textParser{})
|
||||
registerParser("md", &textParser{})
|
||||
registerParser("pdf", &pdfParser{})
|
||||
registerParser("docx", &docxParser{})
|
||||
registerParser("html", &htmlParser{})
|
||||
}
|
||||
|
||||
func registerParser(ext string, p Parser) {
|
||||
parsers[ext] = p
|
||||
}
|
||||
|
||||
// SupportedExts 返回支持的扩展名列表(不含点)
|
||||
func SupportedExts() []string {
|
||||
exts := make([]string, 0, len(parsers))
|
||||
for ext := range parsers {
|
||||
exts = append(exts, ext)
|
||||
}
|
||||
return exts
|
||||
}
|
||||
|
||||
// ParseFile 按扩展名分发解析,返回全文
|
||||
func ParseFile(path string) (string, error) {
|
||||
ext := strings.TrimPrefix(extOf(path), ".")
|
||||
p, ok := parsers[ext]
|
||||
if !ok {
|
||||
return "", fmt.Errorf("不支持的文档类型: .%s", ext)
|
||||
}
|
||||
return p.Parse(path)
|
||||
}
|
||||
|
||||
func extOf(path string) string {
|
||||
idx := strings.LastIndexByte(path, '.')
|
||||
if idx < 0 {
|
||||
return ""
|
||||
}
|
||||
return path[idx:]
|
||||
}
|
||||
Reference in New Issue
Block a user