39 个发布版本

0.6.0-beta.82024 年 6 月 20 日
0.6.0-beta.42024 年 5 月 31 日
0.4.6 2024 年 1 月 10 日
0.4.5 2023 年 9 月 20 日
0.2.0-beta.42022 年 7 月 6 日

#660 in 文本处理

Download history 89/week @ 2024-04-19 16/week @ 2024-04-26 258/week @ 2024-05-03 22/week @ 2024-05-10 276/week @ 2024-05-17 337/week @ 2024-05-24 318/week @ 2024-05-31 181/week @ 2024-06-07 134/week @ 2024-06-14 59/week @ 2024-06-21 14/week @ 2024-06-28 112/week @ 2024-07-05 28/week @ 2024-07-19 71/week @ 2024-07-26 1/week @ 2024-08-02

每月 100 次下载
用于 3 个 crates (通过 lottie)

MIT/Apache

3.5MB
5.5K SLoC

fontkit-rs

GitHub CI Status fontkit-rs npm version fontkit-rs downloads

用于加载、匹配、测量和渲染文本的工具包。

注意:此项目仍在进行中。文本测量和定位是一个复杂的话题。选择一个更成熟的库是明智的选择。

安装

npm i fontkit-rs

编译模块

npm run build
npm run build:wasi
node examples/node.mjs

构建 WASI

rustup target add wasm32-wasi
npm run build:wasi

字体查询

此模块使用特殊的字体匹配逻辑。字体的身份包含字体族(名称)、粗细、斜体和拉伸(字体宽度)。在查询时,允许提及信息的任何子集,但字体族是必需的。

然后,查询被拆分为 4 个过滤器,顺序为 family -> weight -> italic -> stretch。每个过滤器都可以筛选结果集,并且

  • 如果在任何过滤器之后结果中只有一个字体,则立即返回。
  • 如果在所有过滤器之后,剩下 0 个或多个字体,则查询失败

通用 API (WASM API)

new FontKit()

创建一个新的字体注册表

fontkit.add_font_from_buffer(buffer:Uint8Array) ->FontKey

从缓冲区添加字体,返回此字体的标准键

fontkit.query(key:FontKey) ->Font|undefined

查询字体

font.has_glyph(c: char) ->boolean

检查字体是否包含给定字符的符号

font.ascender() ->number

字体的上伸度量

font.descender() ->number

字体的下伸度量

font.units_per_em() ->number

此字体度量的单位

font.glyph_path(c: char) ->GlyphPath|undefined

获取字符的符号路径,如果有

glyphPath.scale(scaleFactor:number)

字体的符号非常大(以 units_per_em 的单位),该方法可以缩放路径以方便使用

glyphPath.translate(x:number,y:number)

平移路径

glyphPath.to_string() ->string

将符号路径导出为 SVG 路径字符串

Node.js 支持

目前此模块通过 WASI API 支持 Node.js。这需要 --experimental-wasi-unstable-preview1 标志,并且仅提供有限的 API。

示例

import { dirname } from 'path';
import { fileURLToPath } from 'url';

// Import the Node.js specific entry module
import { FontKitIndex } from '../node.js';

// Get current path, or you could use any path containing font files
const __dirname = dirname(fileURLToPath(import.meta.url));

// Create an instance of `FontKitIndex`, which is generally a font registry.
// By doing this, an object is created in Rust. So be sure to call `.free()`
// later
const fontkit = new FontKitIndex();

// Await here is needed as it initiate the WASM module
await fontkit.initiate();

// Add a search path, fonts are recursively indexed. This method could
// be called multiple times
fontkit.addSearchPath(__dirname);

// Query a font, additional params including weight, stretch, italic are supported
const font = fontkit.font('Open Sans');

// Get the actual path of the font
console.log(font.path());

// Free the memory of the registry
fontkit.free();

作为最小化的API,获取字体实际路径后,可以将文件加载到Uint8Array缓冲区中,并使用正常的WASM API来加载/使用字体。所以这里Node.js API的主要功能是索引和查询字体。

API

new FontKitIndex()

创建一个新的仅用于索引的字体注册表。存储它找到的字体信息(不是实际缓冲区)。

fontkitIndex.addSearchPath(path:string)

在路径中递归搜索新字体。支持ttf/otf/woff/woff2字体。字体被加载以获取其信息,然后立即释放。

fontkitIndex.query(family:string,weight?=400,italic?=false,strech?=5) ->Font|undefined

查询一个字体。详细信息请参阅查询

fontkitIndex.free()

释放注册表。后续调用将使程序崩溃

font.path() ->string

获取字体的路径

依赖

~3–11MB
~141K SLoC