建構設定

字型的建構設定包含三個基本層:

  1. 共用基礎架構和中繼資料
  2. 可重複使用的字型組合
  3. 產品專屬設定

背景

要將一組字型放入 Fuchsia 版本,設定方式是 較為困難這是因為

  • Fuchsia 的開發人員指南傾向於將預先建構的二進位檔案保存在 CIPD 中 而不是 Git 存放區
  • Fuchsia 的字型檔案取自各種來源。
  • 在 Fuchsia 系統運作的情況下,僅向客戶提供 目錄中包含 .ttf 個檔案。
    • 字型檔案並非完全自述內容;重要的中繼資料 必須取得的 外部。
    • 其他中繼資料片段,例如 也能取得字型支援的碼點 但從每個字型檔案的執行階段中 建構容器
    • 用戶端應用程式可能不清楚系統搜尋的字型 ;可能想要求 一般字型系列 指定 style 和 language,但實際上並未設定明確的特定字詞 字型檔案
  • 字型中繼資料通常過於冗長、重複且容易出錯。這項服務 最好是為每個常見字型定義一次中繼資料 直接購買這些 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 已經過修改。這份食譜:

  1. 使用 jiri initjiri update 查看參照的存放區。
  2. 根據 contents.json 分階段結帳的檔案。
  3. 叫用封裝指令碼,將檔案寫入輸出內容 目錄。
  4. 將輸出目錄的內容上傳至 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 套件頁面

fuchsia/third_party/fonts CIPD 套件的螢幕截圖,醒目顯示執行個體的標記,開頭為「git_revision:」

全域 GN 引數

//src/fonts/build/font_args.gni 宣告 多個字型相關建構引數其中最重要的兩項是

*.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-serifserifmonospace 的字型 家庭成員。
  • 重疊涵蓋率時,將較明確的素材資源放在 請參考閱讀清單,進一步瞭解 如何選擇 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_labelsuniverse_package_labels, 具體取決於套件是否為臨時套件