菜单

技术架构

相关源文件

本文档提供了 Fira Code 字体系统架构的技术概述,描述了核心组件以及它们如何协同工作以生成具有连字特性的编程字体。它涵盖了字体定义系统、连字生成系统和构建过程。有关特定字体特性和连字的更多信息,请参阅字体特性连字和编程符号

系统概览

Fira Code 架构由三个主要系统组成,它们协同工作以创建最终的字体文件

字体定义系统包含位于 FiraCode.glyphs 中的主要字体数据。连字生成系统处理并生成用于连字的 OpenType 特性代码。构建系统将字体定义编译成各种字体格式以供分发。

来源:FiraCode.glyphs1-7 clojure/fira_code/calt.clj1-10 Makefile1-7

字体定义系统

Fira Code 的核心是字体定义文件 FiraCode.glyphs,其中包含所有字形轮廓、元数据和 OpenType 特性。该文件是 Glyphs 格式,一种专业字体编辑器格式。

FiraCode.glyphs 文件定义了:

  1. 字形定义:所有字符和连字的轮廓
  2. 字符类别:具有相似属性的字符分组(例如,大写字母、小写字母)
  3. OpenType 特性:字体渲染器关于连字和其他特殊行为的指令
  4. 字体轴:可变字体字重的参数

字符类别部分尤为重要,因为它定义了“大写字母”、“小写字母”、“数字”等分组,这些分组在 OpenType 特性定义中用于确定哪些字符组合应形成连字。

来源:FiraCode.glyphs1-200 CHANGELOG.md20-30

连字生成系统

连字生成系统是 Fira Code 最具特色的组成部分之一。它使用 Clojure 代码以编程方式生成 OpenType 特性代码,从而实现字体的编程连字功能。

连字生成过程

  1. 连字定义:应形成连字的字符序列列表
  2. Clojure 处理clojure/fira_code/calt.clj308-335 中的 replace-calt 函数处理这些定义
  3. 优先级排序:连字根据clojure/fira_code/calt.clj36-55定义的优先级规则进行排序
  4. 规则生成:每个连字被转换为 OpenType 替换规则
  5. 特性集成:生成的规则与手动编写的特性文件合并

该系统还处理特殊情况,例如

来源:clojure/fira_code/calt.clj1-335 features/calt/underscores.fea1-17 features/calt/hyphen_arrows.fea1-52 features/calt/numbersigns.fea1-10

构建与打包系统

构建系统将字体定义编译成各种字体格式以供分发。

构建过程使用 Docker 来确保构建环境的一致性。Dockerfile Dockerfile1-9 设置了所需的依赖项,包括 Python、字体工具和转换实用程序。

主要步骤包括:

  1. Docker 环境:使用 Dockerfile 创建一个一致的环境
  2. 构建脚本build.sh 脚本协调字体生成过程
  3. 字体生成:专用脚本生成可变字体、OTF 文件和 TTF 文件
  4. Web 字体转换:OTF 和 TTF 文件被转换为 WOFF 和 WOFF2 格式以用于 Web
  5. 打包:所有生成的字体都被打包以供分发

Makefile 提供了简化的命令来触发这些过程

make build    # Builds all font files
make package  # Creates distribution packages

来源:Makefile1-7 Dockerfile1-9 script/everything1-10

连字处理详解

Fira Code 功能的核心是其连字处理系统。本节将解释连字是如何定义的以及如何将其转换为 OpenType 特性代码。

连字处理的关键组成部分

  1. 手动与自动生成:某些连字被标记为手动(在 clojure/fira_code/calt.clj217-221 中定义,并从自动生成中排除
  2. 优先级系统:连字被分配优先级 clojure/fira_code/calt.clj36-55 来确定处理顺序
  3. 规则生成liga->rule 函数 clojure/fira_code/calt.clj224-292 将连字定义转换为 OpenType 替换规则
  4. 特殊处理:某些连字组合在特定上下文中会被忽略 clojure/fira_code/calt.clj58-204
  5. 特性集成:生成的代码被集成到 calt (Contextual Alternates) OpenType 特性中

该系统还通过专门的特性文件支持多字符序列

来源: clojure/fira_code/calt.clj308-335 clojure/fira_code/calt.clj224-292 clojure/fira_code/calt.clj36-55

文件组织

Fira Code 代码库组织在几个关键目录和文件中

目录/文件目的
FiraCode.glyphs主字体定义文件
clojure/用于生成连字功能的 Clojure 代码
features/OpenType 功能定义
script/构建和打包脚本
Dockerfile构建环境的容器定义
Makefile用于构建和打包的简化命令

这些目录中的关键文件

来源: FiraCode.glyphs1-7 clojure/fira_code/calt.clj1-10 features/calt/underscores.fea1-17 Makefile1-7 Dockerfile1-9 script/everything1-10

数据流转

Fira Code 架构的整体数据流遵循此模式

  1. FiraCode.glyphs 中的字体定义提供了字符轮廓和基本元数据
  2. Clojure 代码处理连字定义并生成 OpenType 功能代码
  3. 手动功能文件为复杂序列添加了专门的处理
  4. 构建脚本将字体定义编译为各种格式
  5. 生成的字体文件包含渲染连字所需的所有必要信息

这种模块化方法允许对字体的不同方面进行专门处理,特别是 Fira Code 独有的复杂连字系统。

来源: Makefile1-7 clojure/fira_code/calt.clj308-335 features/calt/hyphen_arrows.fea1-52

总结

Fira Code 的技术架构围绕三个主要系统设计

  1. 字体定义系统:定义字体的视觉外观和基本元数据
  2. 连字生成系统:提供使 Fira Code 独一无二的编程连字
  3. 构建和打包系统:生成各种格式的最终字体文件

关键创新在于连字生成系统,它使用 Clojure 代码以编程方式生成 OpenType 功能代码,以处理复杂的连字规则。这种方法允许大量的编程连字,同时保持灵活性和可管理性。

构建系统使用 Docker 来确保一致性,模块化方法允许不同方面的字体独立开发。最终结果是字体提供跨多种平台和文本编辑器的广泛连字支持。

有关架构特定方面的更多详细信息,请参阅字体定义系统连字生成系统构建和打包系统

来源: FiraCode.glyphs1-7 clojure/fira_code/calt.clj1-335 Makefile1-7 Dockerfile1-9