有没有办法找到使用 JavaScript 的字体中可用的所有功能

Is there a way to find all features available in a font with JavaScript

提问人:giannicash 提问时间:11/23/2020 最后编辑:stefan judisgiannicash 更新时间:9/6/2023 访问量:307

问:

我正在用Nuxt和Contentful开发一个网站。 我使用FontFace加载了一些字体。我需要以这种方式加载它们,因为它是一个字体设计俱乐部网站,他们需要在发布新字体时加载他们的字体。

他们要求我展示那些加载的字体的所有功能,例如连字、样式替代等。

JavaScript 中有没有办法知道哪些功能可用于字体?

JavaScript 字体 opentype font-feature-settings

评论


答:

0赞 Mike 'Pomax' Kamermans 11/24/2020 #1

你需要能够将 GSUB 解析到一定深度的代码,以便为所有脚本/langsys 提供所有功能,这对于您自己编写来说是一件非常复杂的事情。

我为该任务编写了 lib-font(人们在 https://wakamaifondue.com 上使用它,这是对“我的字体能做什么”的玩法,一个在线字体分析服务),测试代码涵盖了您通常需要查询字体的许多内容,包括获取所有功能: 有关列出所有 script/langsys/feature/lookup 集的示例, 看看 lib-font 的 GSUB 测试函数,简化/压缩的代码是:

const { GSUB } = font.opentype.tables;

GSUB.getSupportedScripts().forEach((script) => {
  GSUB.getSupportedLangSys(script).forEach((lang) => {
    const langSysTable = GSUB.getLangSysTable(script, lang);

    GSUB.getFeatures(langSysTable).forEach((feature) => {
      const { lookupListIndices, featureTag } = feature;
      const lookupIDs = lookupListIndices;

      lookupIDs.forEach((id) => {
        GSUB.getLookup(id).forEach((lookup) =>
          console.log(font, script, lang, featureTag, id, lookup)
        );
      });
    });
  });
});

评论

1赞 Mike 'Pomax' Kamermans 11/25/2020
奇怪的是,看到人们投反对票的答案就是字面上的答案。字体解析的 GSUB 端非常复杂,检测所有功能意味着您要么使用其他人编写的基于 JS 的字体解析器,例如 Font.js (ES6) 或 Harfbuzz (WASM) 等,要么您自己从头开始实现它,这是一个惊人的工作量,保证让您在单个任务上停留数周。
0赞 Tom 7/6/2022 #2

Opentype.features.js npm 包可以做到这一点

除了列出短(4 个字符)标签外,它还列出了功能描述(如果字体中可用)

此外,它还列出了与字体功能相关的 unicode 字符。