コンテンツにスキップ

レンダリング層 render.ts

Handlebars テンプレートレンダリングのラッパー。

テンプレートが担うのはファイルの骨組みだけです(ヘッダーコメント、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 行を呼ぶだけで済みます。

テンプレートはhandlebars の helper を一切登録しておらず、組み込みの機能だけを使います:

構文 用途
{{{ }}} 三重波括弧 + noEscape で、フォーマット済みの body を挿入
{{#each}} import 一覧などの配列を走査
テンプレート 生成物
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