렌더링 계층 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
섹션 제목: “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
섹션 제목: “render<T>(templateName: string, data: T): string”유일한 외부 인터페이스입니다:
return loadTemplate(templateName)(data)각 target에 필요한 호출은 이 한 줄뿐입니다.
커스텀 helper는 없습니다
섹션 제목: “커스텀 helper는 없습니다”템플릿은 handlebars helper를 하나도 등록하지 않고, 내장 기능만 사용합니다:
| 문법 | 용도 |
|---|---|
{{{ }}} |
삼중 중괄호 + noEscape, 미리 포맷팅된 body 삽입 |
{{#each}} |
import 목록 등의 배열 순회 |
7개 템플릿
섹션 제목: “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