菜单

输入处理和文件处理

相关源文件

本文档介绍了 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 类中实现的层次化方法。

语法检测优先级顺序

  1. 用户指定的语言(通过 --language 标志)
  2. 语法映射(使用 MappingTarget::MapTo
  3. 完整文件名匹配(例如,DockerfileMakefile
  4. 文件扩展名(例如,.rs.py
  5. 第一行检测(shebangs、XML 声明)

检测过程会处理特殊情况,例如忽略的后缀和 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

错误处理和边缘情况

输入处理包括对各种故障情况的全面错误处理。

文件系统错误

常见错误场景

  • 文件未找到:返回带有文件路径的格式化错误。
  • 权限被拒绝:随文件上下文一起传播。
  • 目录而不是文件:特定的错误消息。
  • I/O 循环检测:防止无限循环。

二进制内容处理

二进制内容检测根据配置影响处理行为。

配置二进制行为
BinaryBehavior::NoPrinting跳过二进制内容
BinaryBehavior::AsText作为文本处理
show_nonprintable: true使用特殊符号显示

UTF-8 BOM 处理

系统在进行第一行语法检测时会自动检测并移除文件开头的 UTF-8 字节顺序标记 (BOM),从而确保带有 BOM 的文件的准确语言检测。

来源:src/input.rs219-223 src/input.rs221-223 src/assets.rs302-303

与处理管道的集成

输入处理通过 Controller 与更广泛的 bat 管道集成,该 Controller 协调从输入到最终输出的流程。

输入系统为所有后续处理提供了基础,确保内容被正确打开、验证并准备好进行语法高亮和输出格式化。

来源:src/controller.rs96-120 src/controller.rs125-144