콘텐츠로 이동

렌더링 계층 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에 필요한 호출은 이 한 줄뿐입니다.

템플릿은 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