レンダリング層 render.ts
Handlebars テンプレートレンダリングのラッパー。
設計原則:薄いテンプレート
Section titled “設計原則:薄いテンプレート”テンプレートが担うのはファイルの骨組みだけです(ヘッダーコメント、import、名前空間の開閉)。トークンごとのリテラルのフォーマットはすべて target の TS 側で完了し、組み立て済みの body 文字列をテンプレートに渡します。
target.ts: トークンごとにフォーマット → body 文字列へ連結 ▼render.ts: render('android/LhTokens.kt.hbs', { package, imports, body }) ▼テンプレート: ヘッダーコメント + package 宣言 + imports + {{{body}}}利点:テンプレートに複雑な handlebars ロジックがなく、リテラルのフォーマットを変えるときは target の TS だけ、ファイルの骨組みを変えるときはテンプレートだけを触ればよく、互いに干渉しません。
loadTemplate(name: string): HandlebarsTemplateDelegate
Section titled “loadTemplate(name: string): HandlebarsTemplateDelegate”内部関数。テンプレート名から codegen/templates/<name> を読みます:
const compiled = Handlebars.compile(source, { noEscape: true })cache.set(name, compiled) // コンパイル結果をキャッシュし、再コンパイルを避けるテンプレートディレクトリは定数 TEMPLATES_DIR(codegen/templates)で指定します。
render<T>(templateName: string, data: T): string
Section titled “render<T>(templateName: string, data: T): string”唯一の外部向けインターフェース:
return loadTemplate(templateName)(data)各 target はこの 1 行を呼ぶだけで済みます。
カスタム helper なし
Section titled “カスタム helper なし”テンプレートはhandlebars の helper を一切登録しておらず、組み込みの機能だけを使います:
| 構文 | 用途 |
|---|---|
{{{ }}} |
三重波括弧 + noEscape で、フォーマット済みの body を挿入 |
{{#each}} |
import 一覧などの配列を走査 |
7 つのテンプレート
Section titled “7 つのテンプレート”| テンプレート | 生成物 |
|---|---|
android/LhTokens.kt.hbs |
LhTokens.kt および LhDarkTokens.kt(ライト / ダーク共用) |
ios/LhTokens.swift.hbs |
LhTokens.swift と LhDarkTokens.swift |
ios/LhShadow.swift.hbs |
LhShadow.swift(静的テンプレート、body スロットなし) |
harmony/LhTokens.ets.hbs |
LhTokens.ets と LhDarkTokens.ets |
harmony/LhShadow.ets.hbs |
LhShadow.ets(静的テンプレート) |
c/lh_tokens.h.hbs |
lh_tokens.h |
c/lh_dark_tokens.h.hbs |
lh_dark_tokens.h |
詳しくは テンプレート一覧 を参照してください。
Copyright © 2024-2026 FengMo WenXue