菜单

控制器和处理管道

相关源文件

本文档介绍了 bat 中的 Controller 组件,它充当将输入文件处理为格式化输出的中央协调器。Controller 管理数据在 bat 处理管道中的流动,从文件打开到语法高亮和最终输出生成。

有关打印机如何处理格式化和显示内容的信息,请参阅 打印机系统

Controller 概述

Controller 负责协调将输入文件转换为格式化输出的整个过程。它管理

  1. 打开和处理输入文件
  2. 选择和配置适当的打印机
  3. 处理输出目的地(分页符或 stdout)
  4. 协调语法高亮和格式化

来源:src/controller.rs22-322 src/bin/bat/main.rs278-285

Controller 结构和初始化

Controller 的结构相对简单,包含对配置和高亮资产的引用

Controller 使用对 Config 对象(包含用户偏好)和 HighlightingAssets(提供语法高亮功能)的引用来初始化

来源:src/controller.rs22-27 src/controller.rs29-37

处理管道流程

Controller 管理的处理管道遵循以下步骤

来源:src/controller.rs43-123 src/controller.rs125-322

输入处理

Controller 通过其 run 方法接受一个 Input 对象向量,并按顺序处理每个对象

对于每个输入

  1. 确定适当的输出类型(分页符或 stdout)
  2. 打开输入,创建一个 OpenedInput,其中包含输入读取器和元数据
  3. 如果需要,收集 Git diff 信息(用于更改指示符)
  4. 基于配置创建和配置打印机
  5. 通过打印机处理文件

来源:src/controller.rs39-41 src/controller.rs125-144

打印机管理

Controller 根据配置在两种打印机实现之间进行选择

  1. SimplePrinter:当启用 loop_through 时,用于“cat”类行为,具有最小格式化
  2. InteractivePrinter:用于具有语法高亮、行号和其他视觉元素的丰富输出

打印机在 print_input 方法中选择和创建

两种打印机都实现了 Printer trait,该 trait 定义了打印标题、页脚和行内容的接口。

来源:src/controller.rs175-185 src/printer.rs71-90 src/printer.rs92-173 src/printer.rs189-861

文件处理

Controller 通过两个主要方法处理文件

  1. print_file:处理整体文件打印,包括标题和页脚
  2. print_file_ranges:逐行处理文件内容,根据配置的行范围进行过滤

行处理算法

Controller 使用行缓冲区来支持诸如超前查看行范围和在不连续行范围之间实现“片段”指示符等功能。

来源:src/controller.rs197-233 src/controller.rs235-322

行范围过滤

Controller 应用行范围过滤,仅显示文件的相关部分。这在 print_file_ranges 方法中实现

对于每一行

  1. 检查该行是否在配置的行范围之内
  2. 如果该行在范围内,则正常打印
  3. 如果该行超出范围,则会被完全跳过,或者被处理为语法高亮(但不显示)
  4. 如果需要在不连续的范围之间插入“片段”指示符,则会插入

这种过滤机制支持诸如仅显示文件的一部分或在 Git diff 中仅显示更改的行等功能。

来源:src/controller.rs235-321

与高亮资产的集成

Controller 与 HighlightingAssets 系统集成以实现语法高亮

Controller 创建的 InteractivePrinter 使用这些资产来

  1. 检测输入文件的适当语法
  2. 应用配置的颜色主题
  3. 根据语法规则高亮文件内容

来源:src/controller.rs22-27 src/controller.rs175-185 src/assets.rs210-242

输出管理

Controller 通过 OutputTypeOutputHandle 抽象来管理输出

  1. OutputType:确定是使用分页符还是直接 stdout,并设置适当的句柄
  2. OutputHandle:为写入不同输出目的地提供统一的接口

输出选择考虑了

  • 终端是否交互式
  • 配置的分页模式
  • 输入源类型(stdin vs 文件)
  • 是否提供了自定义输出句柄

来源:src/controller.rs49-79 src/controller.rs88-92

错误处理

Controller 在整个处理管道中包含全面的错误处理

  1. 对于输入打开错误,会显示相应的消息
  2. 对于处理错误,处理会继续处理其他文件
  3. 错误可以根据输出模式定向到不同的目的地

run_with_error_handler 方法允许自定义错误处理

来源: src/controller.rs43-123 src/controller.rs105-119

Controller 用法

Controller 在两种主要上下文中被使用

  1. 命令行应用程序:在 main.rs 中,Controller 根据命令行参数处理文件
  1. 库 API:在 PrettyPrinter 中,Controller 为 bat 库 API 提供了核心功能

来源: src/bin/bat/main.rs278-285 src/pretty_printer.rs325-335

总结

Controller 处于 bat 处理流程的核心,协调将输入文件转换为格式化输出的过程。它提供了连接配置、高亮资源和打印机组件以构成一个统一系统的中央协调点。

通过管理从输入到输出的处理流程,Controller 实现了 bat 的关键功能,包括语法高亮、行过滤和格式化输出,同时保持了代码库内清晰的关注点分离。