本文档介绍了 bat 如何处理不同类型的输入、检测内容类型和语法,以及如何处理文件读取操作。它侧重于核心输入抽象层和将原始输入转换为用于语法高亮和打印的结构化数据的处理管道。
有关协调输入处理的 Controller 的信息,请参阅 Controller 和处理管道。有关语法高亮资源管理的详细信息,请参阅 资源管理和构建管道。
Bat 通过 InputKind 枚举支持三种主要输入类型:普通文件、标准输入和自定义读取器。这些类型被包装在提供元数据和描述的高级抽象中。
输入创建函数
| 功能 | 目的 | 输入类型 |
|---|---|---|
Input::ordinary_file() | 从文件路径创建输入 | OrdinaryFile |
Input::stdin() | 从标准输入创建输入 | StdIn |
Input::from_reader() | 从自定义读取器创建输入 | CustomReader |
Input 结构体是打开输入之前表示输入的首要接口。它包含文件大小和用户提供的名称的元数据,以及用于显示的描述。
来源:src/input.rs94-98 src/input.rs72-76 src/input.rs88-92
当输入被打开时,它们会经过验证并转换为 OpenedInput 结构体,其中包含活动的读取器。此过程包括循环检测,以防止在输出重定向到输入文件时出现无限循环。
循环检测逻辑
打开过程包括使用 clircle crate 进行复杂的循环检测,以防止 bat 读取它正在写入的文件的情况。
此验证适用于 stdin 和文件输入,确保 bat 在输出被重定向时不会创建无限循环。
来源:src/input.rs190-249 src/input.rs198-204 src/input.rs225-237
输入打开后,bat 会执行内容类型检测和语法检测,以确定如何处理和高亮内容。
InputReader 使用 content_inspector crate 通过检查输入的第一行来自动检测内容类型。
为 UTF-16 编码的文件提供了特殊处理,在这种情况下,会读取额外的字节直到遇到空终止符。
来源:src/input.rs258-278 src/input.rs269-271
语法检测遵循在 HighlightingAssets 类中实现的层次化方法。
语法检测优先级顺序
--language 标志)MappingTarget::MapTo)Dockerfile、Makefile).rs、.py)检测过程会处理特殊情况,例如忽略的后缀和 UTF-8 BOM 移除,然后再进行第一行分析。
来源:src/assets.rs210-242 src/assets.rs151-186 src/assets.rs294-307
InputReader 提供逐行读取功能,并对不同内容类型和编码进行特殊处理。
按内容类型的读取行为
| 内容类型 | 读取行为 |
|---|---|
UTF_16LE | 读取直到换行符,然后读取空字节 |
UTF_16BE | 读取直到换行符,然后读取空字节 |
| 二进制/文本 | 标准行读取 |
读取器会将第一行保存在缓冲区中,以便在进行内容类型检测的同时,将数据保留用于实际处理。
来源:src/input.rs252-294 src/input.rs280-293
输入处理包括对各种故障情况的全面错误处理。
常见错误场景
二进制内容检测根据配置影响处理行为。
| 配置 | 二进制行为 |
|---|---|
BinaryBehavior::NoPrinting | 跳过二进制内容 |
BinaryBehavior::AsText | 作为文本处理 |
show_nonprintable: true | 使用特殊符号显示 |
系统在进行第一行语法检测时会自动检测并移除文件开头的 UTF-8 字节顺序标记 (BOM),从而确保带有 BOM 的文件的准确语言检测。
来源:src/input.rs219-223 src/input.rs221-223 src/assets.rs302-303
输入处理通过 Controller 与更广泛的 bat 管道集成,该 Controller 协调从输入到最终输出的流程。
输入系统为所有后续处理提供了基础,确保内容被正确打开、验证并准备好进行语法高亮和输出格式化。