用途:在 xberg 中完成 MIME 类型检测,并把 MIME 路由到对应的文档提取器。检测流程为:策略 → 内容与/或扩展名证据 → validate_mime_type → registry.get(mime) → extractor。
主要能力:detect_mime_type(path, check_exists) 仅基于路径,不读取字节,先按小写扩展名查 EXT_TO_MIME,再尝试 tree-sitter 扩展名检测(需 tree-sitter 特性),最后用 mime_guess::from_path;check_exists 只控制文件存在性检查。detect_mime_type_from_bytes(bytes) 通过 infer crate 做魔数检测,是唯一的内容嗅探入口。validate_mime_type(mime) 解析媒体类型,用大小写不敏感的 essence 匹配 SUPPORTED_MIME_TYPES,返回注册的 MIME 拼写,charset 等参数不影响路由,且不查询提取器注册表。
注册表:FORMATS 是唯一数据源,EXT_TO_MIME 与 SUPPORTED_MIME_TYPES 由它迭代派生,无法手工编辑。注册表发布 106 种格式、140 个唯一扩展名、53 个别名,由 scripts/sync_supported_counts.py verify 校验;运行时可用性为静态注册表与已注册提取器的交集。扩展名查找大小写不敏感。
用法:通过 get_document_extractor_registry() 获取注册表,读取锁后调用 guard.get(mime_type),返回 Arc<dyn DocumentExtractor>,无匹配时返回 Err 而非 None,并选择优先级最高的提取器。提取器可注册通配族,如 "image/*" 匹配 image/png、image/jpeg 等。新增格式需在 crates/xberg/src/core/mime.rs 的 FORMATS 中添加一个 FormatEntry,运行 scripts/sync_supported_counts.py sync 更新计数并 verify,实现 InternalDocumentExtractor 并让 supported_mime_types() 返回该 MIME,最后在 crates/xberg/src/extractors/mod.rs::register_default_extractors() 注册。
限制与规则:提取前应调用 validate_mime_type(),但它不证明提取器存在;detect_mime_type 不检查内容;提取默认 PreferContent,做有界内容检查并回退到受支持的扩展名,ContentOnly 用于忽略文件名,TrustExtension 仅用于可信来源;显式具体 MIME 具有权威性,application/octet-stream 例外,会触发基于策略的检测;不要编辑 EXT_TO_MIME 或 SUPPORTED_MIME_TYPES,应编辑 FORMATS。