崮生(子虚) 5c118121ff v1.14.0: GSUB/GPOS 共享 gidLookup 查找表 + remapGid 数组化 + WF2_NOTRANSFORM 实验开关
- 优化340:buildGidLookup 提取导出,rewriteLayoutTablesForSubset 构造一次共享传入
  subsetGPOS/subsetGSUB(省每侧独立的 maxOrigGid 扫描+fill+Map 遍历,big3500 -4.2%)
- 优化342:remapGid/parseChainRuleFormat1or2 从 Map.get 改为 gidLookup 数组索引
  (~9ns→~1ns,语义等价:越界/-1 均映射为 null),GSUB 查询路径 Map 残余清零
- 实验341:woff2-encode.js 增加 WF2_NOTRANSFORM=1 环境变量开关,跳过 glyf/loca
  transform(规范合法 untransformed 路径,-13% CPU 但 +10% 体积,默认关闭不影响生产)

验证:tsc 通过;基准 30/30 PASS min ssim 0.9876 与基线一致;输出字节总量 449,440B
与基线完全一致;7 用例 sha256 字节级 IDENTICAL;leafer 渲染 7 用例 SSIM≥0.99;
24 字体结构扫描通过(6 个缺字均为原字体本身无此字形);40/40 边界输入扫描通过。
2026-08-27 07:57:32 +08:00
2026-04-08 22:05:17 +08:00
2026-04-08 16:27:46 +08:00
2026-04-08 15:35:11 +08:00

WebFont — Runtime Font Delivery + AI Chinese Font Skill

Subset Chinese fonts on demand — 6 characters ≈ 6KB. Use premium Chinese fonts on any web page.

中文

Chinese fonts are huge (Source Han Sans: 16MB+). You can't just @font-face them like English fonts.

This project subsets fonts on the server side — pass in the text you need, get back only those glyphs. A poster with 20 characters? The font file is 20KB, not 16MB.

<!-- One CSS block to use any Chinese font -->
<style>
@font-face {
  font-family: "MyFont";
  src: url("https://webfont.shenzilong.cn/api?font=令东齐伋复刻体&text=静心茶舍&outType=ttf") format("truetype");
}
.title { font-family: "MyFont", serif; }
</style>
<h1 class="title">静心茶舍</h1>

Who Is This For

Any project that needs Chinese Web Fonts:

  • Posters / H5 pages — a few characters subset to a few KB
  • Brand websites — premium fonts no longer limited by file size
  • Mini apps / PWA — bandwidth-sensitive, load on demand
  • Static blogs / CMS — content is known, CSS-only output
  • AI-generated pages — let AI output well-designed Chinese font solutions

Features

Live Font Demo — same content, different fonts, completely different feel

Runtime Font Delivery

Server-side subsetting + client-side incremental loading.

6 characters → server subsets font → returns ~6KB (not 16MB)

Subsetting performance (Node.js benchmark, Lingdong Qiji Fuke, avg of 50 rounds):

Case ttf woff2 Output size
Latin + digits (Hello World 123) 0.11ms 0.13ms 0.4KB
8 CJK characters 0.17ms 0.38ms 8KB
Thousand Character Classic excerpt (88 chars) 0.37ms 2.11ms 78KB

Small character sets (the common case) hit sub-millisecond subsetting; time scales linearly with glyph count, with woff2's extra cost from brotli compression (a native hard limit). Response headers X-Timing-Find/Read/Subset/Total expose per-stage timing.

JS SDK with three loading modes:

<script src="https://webfont.shenzilong.cn/webfont-sdk.js"></script>
<script>
  // Recommended: MutationObserver-driven, auto-loads new characters on DOM change
  WebFont.observeFont({ fontName: "令东齐伋复刻体.ttf", selector: ".content", family: "MySerif" });

  // Polling mode
  WebFont.loadFont({ fontName: "令东齐伋复刻体.ttf", selector: ".title", family: "MySerif" });

  // Manual text mode
  var loader = WebFont.loadText({ fontName: "令东齐伋复刻体.ttf", text: "你好世界", family: "MySerif" });
  loader.update("追加文字");
</script>

All modes share the same character set per font — zero duplicate requests, zero flicker.

AI Chinese Font Skill

Inject Chinese font application capability into AI (Claude, Cursor, Copilot, etc.). With the Skill Prompt, AI can:

  • Auto-select fonts matching the scene
  • Handle Chinese-English mixed typesetting
  • Build proper font hierarchy
  • Generate fallback chains and runtime loading strategies
Prompt: "Build a zen-style tea brand website"

Without Skill: font-family: sans-serif → system default → looks generic

With Skill: zen style → serif heading + kai body → auto subset → visual quality leap

Quick Start

API Only

No SDK needed. One CSS block to use any Chinese font. Server returns only the character subset you need.

@font-face {
  font-family: "MyFont";
  src: url("https://webfont.shenzilong.cn/api?font=令东齐伋复刻体&text=你的文字&outType=ttf") format("truetype");
}

Self-hosted

# Node.js / LLRT
pnpm install && pnpm build && pnpm build_backend
node ./dist_backend/app.cjs

Docker (~30MB image):

services:
  webfont:
    image: docker.io/llej0/web-font:latest
    ports:
      - "8087:8087"
    volumes:
      - ./fonts:/home/font
    environment:
      - ENABLE_TEMP_UPLOAD=true
      - ADMIN_API_KEY=your-secret-key
      - SUBSET_CACHE_MAX_SIZE=10485760
      # Temp font retention (seconds), auto-deleted if unused. Default: 10800 (3h)
      - TEMP_RETENTION_SECONDS=10800
      # Max concurrent font subsetting. Default: 4
      - SUBSET_CONCURRENCY=4

API Reference

Endpoint Description
GET /api?font={name}&text={chars}&outType={woff2|ttf} Subset font to specified characters
GET /api/fonts List available fonts
GET /api/config Get server configuration
POST /api/upload?mode=temp Temporary font upload (auto-cleanup)
POST /api/upload?mode=admin Permanent font upload (requires API key)

Font name supports fuzzy matching: exact → prefix → contains.

Architecture

┌──────────────────────────────────────────────────────────────┐
│                        Use Cases                              │
│  Posters/H5  ·  Brand Sites  ·  Blogs  ·  Mini Apps  ·  AI  │
└──────────────────────────┬───────────────────────────────────┘
                           │
              ┌────────────┴────────────┐
              │   AI Chinese Font Skill │ ← Chinese font application
              │   + AI Skill Prompt     │ ← Chinese font application
              └────────────┬────────────┘
                           │
              ┌────────────┴────────────┐
              │   Runtime Font Delivery │ ← On-demand subsetting + incremental loading
              │   SDK + API             │
              └────────────┬────────────┘
                           │
              ┌────────────┴────────────┐
              │   Subset Engine         │ ← fonteditor-core
              │   parse → subset →      │   Font parsing, subsetting, format conversion
              │   optimize → serialize  │
              └─────────────────────────┘

Project Structure

web-font/
├── backend/            # Server: HTTP API + font subsetting engine
│   ├── routes/         # API route handlers
│   ├── font_util/      # Font subsetting core
│   └── server/         # HTTP server (Node.js + LLRT dual runtime)
├── src/                # Frontend: Vue 3 SPA
├── public/
│   └── webfont-sdk.js  # Runtime Font Delivery SDK
├── skills/             # AI Chinese Font Skill
├── examples/           # Before/After demo pages
└── vendor/             # fonteditor-core

Acknowledgments

License

MIT © 崮生

Description
No description provided
Readme 38 MiB
Languages
TypeScript 64.4%
Svelte 27%
JavaScript 4.9%
HTML 2.5%
CSS 1.2%