菜单

连字生成系统

相关源文件

连字生成系统负责创建OpenType特性代码,以实现Fira Code独特的编程连字。该系统将定义的连字序列列表转换为优化的OpenType替换规则,并嵌入字体中,从而使诸如 =>!= 等字符组合能够显示为统一的字形。

有关字体整体结构的更多信息,请参阅 字体定义系统。有关生成字体文件如何构建的详细信息,请参阅 构建和打包系统

系统概览

连字生成系统结合了自动化规则生成和手动编写的特性代码,创建全面的OpenType替换规则,以处理各种编程连字,同时妥善处理边缘情况和特殊场景。

来源: clojure/fira_code/calt.clj308-335 features/calt/underscores.fea features/calt/equal_arrows.fea features/calt/center.fea features/calt/numbersigns.fea features/calt/hyphen_arrows.fea

连字处理流程

连字生成过程遵循一个多阶段的流程,将抽象的连字定义转换为具体的OpenType规则

来源: clojure/fira_code/calt.clj308-335

该系统的核心是 replace-calt 函数,它

  1. 过滤掉需要手动处理的连字
  2. 按优先级和长度对剩余的连字进行排序
  3. 将每个连字转换为OpenType替换规则
  4. 将所有规则组装成完整的特性定义
  5. 使用新的特性代码更新字体对象

连字优先级

该系统应用优先级规则,以确保某些连字先于其他连字处理,从而防止替换顺序中出现意外冲突。

来源: clojure/fira_code/calt.clj36-55 clojure/fira_code/calt.clj295-305

优先级系统确保

  1. 特殊情况连字(如 <|>)以最高优先级(0)进行处理
  2. 基本箭头连字(如 |><| 等)具有优先级 1
  3. 双符号(如 <<>>||)具有优先级 2
  4. 较长的连字优先于较短的连字处理
  5. 当优先级和长度相同时,按字母顺序排列

规则生成逻辑

该系统为每个连字长度生成定制的OpenType替换规则,处理长度为2到5个字符的连字。

来源: clojure/fira_code/calt.clj224-292

对于每个连字长度,该系统

  1. 创建一个命名的查找块
  2. 添加必要的忽略规则以处理边缘情况
  3. 添加使用“间隔符”字形进行的替换规则,以实现增量匹配
  4. 组装完整的OpenType特性代码

例如,一个3个字符的连字,如 <=>,会生成以下规则:

  • 在某些上下文中跳过替换(使用忽略规则)
  • 将第一个字符替换为间隔符字形
  • 将第二个字符替换为间隔符字形
  • 将第三个字符替换为连字字形

特殊情况处理

该系统包含多种机制来处理特殊情况和边缘情况

手动连字

一些连字组合被排除在自动生成之外,因为它们需要特殊处理

["slash" "backslash"]  ; /\
["backslash" "slash"]  ; \/

来源: clojure/fira_code/calt.clj216-221

忽略前缀

某些字符序列不应触发其后的连字

["parenleft" "question" "colon"]       ; (?:
["parenleft" "question" "equal"]       ; (?=
["parenleft" "question" "less" "equal"] ; (?<=

来源: clojure/fira_code/calt.clj11-20

忽略规则

复杂的忽略规则可防止在特定上下文中形成连字

["slash" "asterisk"]
["asterisk" "slash"]
["colon" "colon"]

来源: clojure/fira_code/calt.clj58-204

手动特性文件

除了自动生成的规则外,该系统还包含一些手动编写的特性文件,用于处理特定类型的连字

特性文件目的
underscores.fea处理如下下划线序列: ___
equal_arrows.fea处理基于等号的箭头,如 ==>
hyphen_arrows.fea处理基于连字符的箭头,如 -->
center.fea垂直对齐组合,如 :>
numbersigns.fea处理井号序列,如 ###

来源: features/calt/underscores.fea features/calt/equal_arrows.fea features/calt/hyphen_arrows.fea features/calt/center.fea features/calt/numbersigns.fea

这些文件包含手动调整的替换规则,用以补充自动生成的规则,通常处理更复杂的替换模式或不符合通用模式的特殊情况。

与字体的集成

连字生成系统通过 glyphs.clj 模块中的 update-code 函数与字体定义系统集成。

来源: clojure/fira_code/calt.clj clojure/fira_code/glyphs.clj155-158

update-code 函数

  1. 定位字体对象中的“calt”特性
  2. 将其代码替换为新生成的特性代码
  3. 返回更新后的字体对象以供进一步处理

展示和测试

extras/showcases.txt 文件既是文档也是测试资源,列出了所有支持的连字组合。

此文件特别有价值,用于

  • 可视化支持的字符组合
  • 测试所有连字的渲染
  • 验证连字在不同上下文中的正确显示

来源: extras/showcases.txt

性能考量

连字生成系统针对以下方面进行了优化:

  1. 规则排序:正确排序的规则可防止OpenType替换中的冲突
  2. 特性文件大小:最小化OpenType特性文件的大小
  3. 字体兼容性:确保连字在不同渲染引擎上都能正常工作

该系统跟踪并报告有关生成规则的指标

  • 对、三和四元组的数量
  • 处理的连字总数

来源: clojure/fira_code/calt.clj327-333

总结

连字生成系统是 Fira Code 的关键组成部分,它将简单的字符序列定义转换为复杂的 OpenType 替换规则。通过将自动规则生成与手工制作的特征文件相结合,它创建了一套全面的连字,从而提高了代码的可读性,同时又能妥善处理边缘情况和特殊场景。

该系统与字体定义系统的集成可确保生成的规则正确地整合到字体中,从而使用户能够在不同的平台和环境中获得 Fira Code 独特的编程连字。