字型的建構設定包含三個基本層:
背景
要將一組字型放入 Fuchsia 版本,設定方式是 較為困難這是因為
- Fuchsia 的開發人員指南傾向於將預先建構的二進位檔案保存在 CIPD 中 而不是 Git 存放區
- Fuchsia 的字型檔案取自各種來源。
- 在 Fuchsia 系統運作的情況下,僅向客戶提供
目錄中包含
.ttf
個檔案。 - 字型中繼資料通常過於冗長、重複且容易出錯。這項服務 最好是為每個常見字型定義一次中繼資料 直接購買這些 Google Cloud 產品, 管理自己的副本
共用基礎架構和中繼資料
第一層會建立資產和中繼資料的目錄 在 Fuchsia 產品版本中使用。
字型資料存放區
字型檔案的外部來源清單會保留在
字型資料存放區。對於 Fuchsia 的開放原始碼字型,您可以在
//fontdata
。
每當字型資料存放區內容變更時,Fchsia 的 自動化基礎架構會自動進行檢查, 並將存放區描述的字型檔案 封裝成 CIPD 套件 資料上傳至 Fuchsia 的 CIPD 伺服器。
字型資料存放區包含下列檔案:
manifest.xml
這是 Jiri 資訊清單檔案。 在這個例子中,它是由一份 Git 存放區和修訂版本 ID 的清單組成,其中包含 所需的字型檔案
每個匯入的存放區都會列在 <project>
元素中。
範例項目:
<project
name="github.com/googlefonts/noto-cjk"
path="github.com/googlefonts/noto-cjk"
remote="https://fuchsia.googlesource.com/third_party/github.com/googlefonts/noto-cjk"
remotebranch="upstream/master"
revision="be6c059ac1587e556e2412b27f5155c8eb3ddbe6"/>
name
:任意名稱 (不影響任何項目)path
:決定存放區相對於根層級 結帳目錄。remote
:遠端存放區的 Git 網址remotebranch
:遠端存放區中的分支版本名稱revision
:要固定結帳項目的 Git 修訂版本雜湊
contents.json
以下是 Fuchsia 基礎架構從
將「結帳目錄」複製到暫存目錄。每個 {destination,
files}
項目都會定義暫存目錄中的頂層資料夾和
以便複製到檔案中
範例項目:
{
"destination": "material",
"files": [
"github.com/google/material-design-icons/iconfont/MaterialIcons-Regular.ttf",
"github.com/google/material-design-icons/LICENSE"
]
}
${catalog_name}.font_catalog.json
字型目錄檔案是人工撰寫的一組中繼資料,適用於所有字型 系列、資產和字體。
為方便您編輯,您可以使用 .font_catalog.json
檔案的 JSON 結構定義
於
/src/fonts/tools/schemas/font_catalog.schema.json.
標準結構定義為
在 Rust 中定義。
packing_script.py
Fuchsia 的基礎架構會在填入 暫存檔後叫用這個指令碼 目錄。
指令碼:
- 將暫存目錄的所有字型和授權檔案複製到輸出內容 目錄。
- 系統會在以下位置產生
${catalog_name}.font_pkgs.json
檔案: 輸出目錄
通常不需要修改指令碼。
基礎架構方案
如上所述,每當
fontdata
已經過修改。這份食譜:
- 使用
jiri init
和jiri update
查看參照的存放區。 - 根據
contents.json
分階段結帳的檔案。 - 叫用封裝指令碼,將檔案寫入輸出內容 目錄。
- 將輸出目錄的內容上傳至 CIPD。
CIPD 套件
開放原始碼字型套件會上傳到
fuchsia/third_party/fonts
CIPD 套件。
Jiri 預建
他透過 CIPD 套件的內容進入 Fuchsia 結帳流程
prebuilts
jiri 資訊清單:
<!-- Fonts -->
<package name="fuchsia/third_party/fonts"
version="git_revision:a10ce51e308f48c5e6d70ab5777434af46a5ddb8"
path="prebuilt/third_party/fonts"/>
您可以取得 fuchsia/third_party/fonts
套件的 version
ID
「標記」最新的執行個體
CIPD 套件頁面。
全域 GN 引數
//src/fonts/build/font_args.gni
宣告
多個字型相關建構引數其中最重要的兩項是
font_catalog_paths
:所有位置.font_catalog.json
檔案。font_pkgs_paths
:.font_pkgs.json
的所有位置 檔案。
*.font_pkgs.json
個檔案
這類檔案可透過 GN 的簡易 JSON 剖析器剖析,
read_file
。
其中包含表單的項目清單
{
"file_name": "AlphaSans-Regular.ttf",
"safe_name": "alphasans-regular-ttf",
"path_prefix": "alpha"
},
file_name
:字型檔案素材資源檔案的名稱。這是標準網頁 每個字型資產的識別碼,因此這份對照表中的鍵也是一樣。safe_name
:檔案名稱的轉換版本:轉換為小寫。 所有特殊字元替換成連字號。這可以用來 Fuchsia 套裝方案。path_prefix
:資產的父項目錄位置,相對於//prebuilt/third_party/fonts
。
在 //src/fonts/build/fonts.gni
中,
.font_pkgs.json
檔案會合併為單一 GN 範圍
做為對照表。
字型套件
除了直接在字型提供者的命名空間中提供字型素材資源外,
您也可以選擇建立單一字型 Fuchsia 套件這是
顧名思義,package
包含單一字型的
resources
專屬。
這可用於暫時的字型傳送,
fuchsia.pkg.FontResolver
。(待辦事項:其他文件的連結)。
所有可能的字型套件都會在
//src/fonts/packages/BUILD.gn
。
- 每個套件名稱的格式為
font-package-<font-safe-name>
(請參閱safe_name
),例如:font-package-roboto-regular-ttf
。 - 因此,套件的 GN 目標
//src/fonts/packages:<package-name>
,例如//src/fonts/packages:font-package-roboto-regular.ttf
。 - 每個套件網址的格式為
fuchsia-pkg://fuchsia.com/<package-name>
,例如fuchsia-pkg://fuchsia.com/font-package-roboto-regular-ttf
。
local_font_bundle
在 fonts.gni 中定義
本機字型套件是一組直接放置在
字型提供者的命名空間
config_data()
。
大部分本機字型套件都會在
//src/fonts/collections/BUILD.gn
。
範例:
```gn
local_font_bundle("small-open-fonts-local") {
asset_names = [
"MaterialIcons-Regular.ttf",
"Roboto-Regular.ttf",
"Roboto-Light.ttf",
"Roboto-Medium.ttf",
"RobotoMono-Regular.ttf",
"RobotoSlab-Regular.ttf",
]
}
產品專屬字型設定
最後,每 商品目標 就必須使用指定的字型素材資源和 該檔案會包含中繼資料
字型產品設定檔
.fontcfg.json
(或 .fontcfg.json5
) 檔案包含一組人工撰寫的
產品專屬字型設定另有
JSON 結構定義
提升編輯器使用體驗
這個檔案目前的主要用途是定義特定備用字型 鏈結,亦即當完全符合 用戶端的字體要求無法使用。
這是從 SLI 中
//src/fonts/collections/open-fonts-collection.fontcfg.json5
:
fallback_chain: [
///
///
/// SANS SERIF LATIN
"Roboto-Regular.ttf",
"Roboto-Black.ttf",
"Roboto-BlackItalic.ttf",
"Roboto-Bold.ttf",
"Roboto-BoldItalic.ttf",
"Roboto-Italic.ttf",
"Roboto-Light.ttf",
"Roboto-LightItalic.ttf",
"Roboto-Medium.ttf",
"Roboto-MediumItalic.ttf",
"Roboto-Thin.ttf",
"Roboto-ThinItalic.ttf",
"RobotoCondensed-Regular.ttf",
"RobotoCondensed-Bold.ttf",
"RobotoCondensed-BoldItalic.ttf",
"RobotoCondensed-Italic.ttf",
"RobotoCondensed-Light.ttf",
"RobotoCondensed-LightItalic.ttf",
"DroidSans-Regular.ttf",
"DroidSans-Bold.ttf",
///
///
/// SANS-SERIF NON-LATIN
"NotoNaskhArabicUI-Regular.ttf",
"NotoSansArmenian-Regular.ttf",
"NotoSansEthiopic-Regular.ttf",
"NotoSansGeorgian-Regular.ttf",
"NotoSansHebrew-Regular.ttf",
"NotoSansThaiUI-Regular.ttf",
// All Indian scripts should come after Devanagari, due to shared danda characters.
"NotoSansDevanagariUI-Regular.ttf",
"NotoSansBengaliUI-Regular.ttf",
"NotoSansGujaratiUI-Regular.ttf",
"NotoSansKannada-Regular.ttf",
"NotoSansMalayalamUI-Regular.ttf",
"NotoSansTamilUI-Regular.ttf",
"NotoSansTelugu-Regular.ttf",
///
///
/// SANS SERIF CJK
{
full_name: "Noto Sans CJK SC",
},
{
full_name: "Noto Sans CJK TC",
},
{
full_name: "Noto Sans CJK HK",
},
{
full_name: "Noto Sans CJK KR",
},
{
full_name: "Noto Sans CJK JP",
},
{
full_name: "Noto Sans CJK SC Bold",
},
{
full_name: "Noto Sans CJK TC Bold",
},
{
full_name: "Noto Sans CJK HK Bold",
},
{
full_name: "Noto Sans CJK KR Bold",
},
{
full_name: "Noto Sans CJK JP Bold",
},
{
full_name: "Noto Sans CJK SC Black",
},
{
full_name: "Noto Sans CJK TC Black",
},
{
full_name: "Noto Sans CJK HK Black",
},
{
full_name: "Noto Sans CJK KR Black",
},
{
full_name: "Noto Sans CJK JP Black",
},
{
full_name: "Noto Sans CJK SC DemiLight",
},
{
full_name: "Noto Sans CJK TC DemiLight",
},
{
full_name: "Noto Sans CJK HK DemiLight",
},
{
full_name: "Noto Sans CJK KR DemiLight",
},
{
full_name: "Noto Sans CJK JP DemiLight",
},
{
full_name: "Noto Sans CJK SC Light",
},
{
full_name: "Noto Sans CJK TC Light",
},
{
full_name: "Noto Sans CJK HK Light",
},
{
full_name: "Noto Sans CJK KR Light",
},
{
full_name: "Noto Sans CJK JP Light",
},
{
full_name: "Noto Sans CJK SC Medium",
},
{
full_name: "Noto Sans CJK TC Medium",
},
{
full_name: "Noto Sans CJK HK Medium",
},
{
full_name: "Noto Sans CJK KR Medium",
},
{
full_name: "Noto Sans CJK JP Medium",
},
{
full_name: "Noto Sans CJK SC Thin",
},
{
full_name: "Noto Sans CJK TC Thin",
},
{
full_name: "Noto Sans CJK HK Thin",
},
{
full_name: "Noto Sans CJK KR Thin",
},
{
full_name: "Noto Sans CJK JP Thin",
},
///
///
/// SERIF LATIN
"RobotoSlab-Regular.ttf",
"RobotoSlab-Bold.ttf",
"RobotoSlab-Light.ttf",
"RobotoSlab-Thin.ttf",
"DroidSerif-Regular.ttf",
"DroidSerif-Bold.ttf",
"DroidSerif-BoldItalic.ttf",
"DroidSerif-Italic.ttf",
///
///
/// SERIF CJK
{
full_name: "Noto Serif CJK SC",
},
{
full_name: "Noto Serif CJK TC",
},
{
full_name: "Noto Serif CJK KR",
},
{
full_name: "Noto Serif CJK JP",
},
{
full_name: "Noto Serif CJK SC Bold",
},
{
full_name: "Noto Serif CJK TC Bold",
},
{
full_name: "Noto Serif CJK KR Bold",
},
{
full_name: "Noto Serif CJK JP Bold",
},
{
full_name: "Noto Serif CJK SC Black",
},
{
full_name: "Noto Serif CJK TC Black",
},
{
full_name: "Noto Serif CJK KR Black",
},
{
full_name: "Noto Serif CJK JP Black",
},
{
full_name: "Noto Serif CJK SC ExtraLight",
},
{
full_name: "Noto Serif CJK TC ExtraLight",
},
{
full_name: "Noto Serif CJK KR ExtraLight",
},
{
full_name: "Noto Serif CJK JP ExtraLight",
},
{
full_name: "Noto Serif CJK SC Light",
},
{
full_name: "Noto Serif CJK TC Light",
},
{
full_name: "Noto Serif CJK KR Light",
},
{
full_name: "Noto Serif CJK JP Light",
},
{
full_name: "Noto Serif CJK SC Medium",
},
{
full_name: "Noto Serif CJK TC Medium",
},
{
full_name: "Noto Serif CJK KR Medium",
},
{
full_name: "Noto Serif CJK JP Medium",
},
{
full_name: "Noto Serif CJK SC SemiBold",
},
{
full_name: "Noto Serif CJK TC SemiBold",
},
{
full_name: "Noto Serif CJK KR SemiBold",
},
{
full_name: "Noto Serif CJK JP SemiBold",
},
///
///
/// MONOSPACE LATIN
"RobotoMono-Bold.ttf",
"RobotoMono-BoldItalic.ttf",
"RobotoMono-Italic.ttf",
"RobotoMono-Light.ttf",
"RobotoMono-LightItalic.ttf",
"RobotoMono-Regular.ttf",
"RobotoMono-Medium.ttf",
"RobotoMono-MediumItalic.ttf",
"RobotoMono-Thin.ttf",
"RobotoMono-ThinItalic.ttf",
"DroidSansMono-Regular.ttf",
///
///
/// MONOSPACE CJK
{
full_name: "Noto Sans Mono CJK SC",
},
{
full_name: "Noto Sans Mono CJK TC",
},
{
full_name: "Noto Sans Mono CJK HK",
},
{
full_name: "Noto Sans Mono CJK KR",
},
{
full_name: "Noto Sans Mono CJK JP",
},
{
full_name: "Noto Sans Mono CJK SC Bold",
},
{
full_name: "Noto Sans Mono CJK TC Bold",
},
{
full_name: "Noto Sans Mono CJK HK Bold",
},
{
full_name: "Noto Sans Mono CJK KR Bold",
},
{
full_name: "Noto Sans Mono CJK JP Bold",
},
///
///
/// CURSIVE LATIN
"Quintessential-Regular.ttf",
///
///
/// EMOJI
"NotoColorEmoji.ttf",
///
///
/// SYMBOLS
"NotoSansSymbols-Regular.ttf",
"NotoSansSymbols2-Regular.ttf",
]
如果素材資源檔案包含多個字體, ,而不只是檔案名稱:
fallback_chain: [
"SomeCompleteFont-Bold.ttf",
{ file_name: "NotoSansCJK-Regular.ttc", index: 1},
]
您必須手動定義備用鏈。請務必遵守以下規範:
- 為每個支援的指令碼至少加入一種字型。(支援一組 各產品適用的指令碼)。
- 試著至少使用
sans-serif
、serif
和monospace
的字型 家庭成員。 - 重疊涵蓋率時,將較明確的素材資源放在 請參考閱讀清單,進一步瞭解 如何選擇 Kubeflow Pipelines SDK 或 TFX舉例來說,所有 Noto Sans 指令碼專用字型都有字符 的 ASCII 範圍,但 Noto Sans Latin 變體應優先顯示。
- 覆蓋範圍重疊時,請將較小的字型檔案放在 請參考閱讀清單,進一步瞭解 如何選擇 Kubeflow Pipelines SDK 或 TFX這可減少載入備用字型時的 UI 卡頓情形。
font_collection
在 fonts.gni 中定義
在使用任何所需的 local_font_bundle
和/或字型 packages
之後
則組合成 font_collection
輸入
(如需完整說明文件,請參閱 Font.gni。)
font_packages
:字型package
的 GN 標籤 在目標產品的universe_package_labels
中。local_font_bundles
:目標的 GN 標籤 (local_font_bundle
) 產品。這些名稱將包含在字型供應程式的設定資料中。local_asset_names
:本機字型素材資源名稱清單 (視需要建立local_font_bundle
)。product_config_path
:包含以下項目的 JSON 檔案路徑 產品專屬字型設定,包括備用 鏈結。manifest_prefix
:產生的字型資訊清單檔案名稱前置字串。 預設為"all"
。
內部原理
font_collection
掃遍所有字型素材資源和
該 Pod 建立的所有套件收集 GN
中繼資料
建立對應至本機檔案中字型套件的字型清單。
範本會將這些資訊傳遞至字型資訊清單產生器 (GN 範本, Rust source),以及 字型目錄和所有字型素材資源。
資訊清單產生器會從預先定義的中繼資料的字型目錄中選取
font_collection
中的字型檔案。此網路也會讀取
每個已加入的字型檔案
每個字型檔案支援的碼點 (字元集)。
所有資料都會組合成一個 .font_manifest.json
檔案,
以 config_data
規則提供給字型提供者服務。
輸出內容
font_collection
會產生下列構件:
<manifest-prefix>.font_manifest.json
:這是中繼資料的組合 相同。將使用config_data
規則。font_packages.json
。這個檔案列出所有包含單一字型的 Fuchsia 套件,並使用config_data
規則提供給pkg-resolver
。這個 可決定透過fuchsia.pkg.FontResolver
公開的字型套件。
由 font_collection
建立的 GN 目標會包含 config_data
的
兩個 JSON 檔案,以及本機字型資產的 config_data 目標。
如果產品只使用 local 字型,只需加入
font_collection
目標設為產品依附元件標籤 (通常為
base_package_labels
)。
如果產品也會使用字型 package
,您必須明確新增這些目標
至
base_package_labels
或
universe_package_labels
,
具體取決於套件是否為臨時套件