10.6 Template

10.6 Template

Haxe는 가벼운 클래스 haxe.Template이 해석하는 사용하기 쉬운 구문을 가진 표준 템플릿 시스템을 제공합니다.

템플릿은 입력에 따라 어떤 종류의 문자열 출력을 만들어내는 데 사용되는 문자열이나 파일입니다. 작은 템플릿 예:

class Main {
  static function main() {
    var sample = "My name is ::name::, ::age:: years old";
    var user = {name: "Mark", age: 30};
    var template = new haxe.Template(sample);
    var output = template.execute(user);
    trace(output);
  }
}

콘솔은 My name is Mark, 30 years old를 추적합니다.

표현식(Expressions)

표현식은 :: 사이에 넣을 수 있으며, 구문은 다음 현재 가능성을 허용합니다:

  • ::name:: 변수 이름
  • ::expr.field:: 필드 접근
  • ::(expr):: 표현식 expr이 평가됨
  • ::(e1 op e2):: 연산 op가 e1과 e2에 적용됨
  • ::(135):: 정수 135. Float 상수는 허용되지 않음
조건(Conditions)

::if flag1::을 사용해 조건을 테스트할 수 있습니다. 선택적으로 조건 뒤에 ::elseif flag2:: 또는 ::else::가 올 수 있습니다. ::end::으로 조건을 닫습니다.

::if isValid:: valid ::else:: invalid ::end::

연산자를 사용할 수 있지만 연산자 우선순위를 다루지 않습니다. 그러므로 각 연산을 괄호 ()로 감싸야 합니다. 현재 허용되는 연산자는 +, -, *, /, >, <, >=, <=, ==, !=, &&, ||입니다.

예를 들어 ::((1 + 3) == (2 + 2))::은 true를 표시합니다.

::if (points == 10):: Great! ::end::

문자열과 비교하려면 템플릿에서 큰따옴표 "를 사용하세요.

::if (name == "Mark"):: Hi Mark ::end::
반복(Iterating)

::foreach::으로 구조체를 반복합니다. ::end::으로 루프를 닫습니다.

Name
        Age

    ::foreach users::

            ::name::
            ::age::

    ::end::
하위 템플릿(Sub-templates)

다른 템플릿에 템플릿을 포함하려면 하위 템플릿 결과 문자열을 매개변수로 전달하세요.

var users = [{name:"Mark", age:30}, {name:"John", age:45}];

var userTemplate = new haxe.Template("::foreach users:: ::name::(::age::) ::end::");
var userOutput = userTemplate.execute({users: users});

var template = new haxe.Template("The users are ::users::");
var output = template.execute({users: userOutput});
trace(output);

콘솔은 The users are Mark(30) John(45)를 추적합니다.

템플릿 매크로(Template macros)

템플릿의 일부가 렌더링되는 동안 커스텀 함수를 호출하려면 Template.execute의 인자에 macros 객체를 제공하세요. 키는 템플릿 변수 이름으로 작동하고, 값은 String을 반환해야 하는 콜백 함수를 가리킵니다. 이 매크로 함수의 첫 번째 인자는 항상 resolve() 메서드이며, 그 뒤에 주어진 인자가 옵니다. resolve 함수를 호출해 템플릿 컨텍스트에서 값을 검색할 수 있습니다. macros에 그러한 필드가 없으면 결과는 지정되지 않습니다.

다음 예는 자체를 매크로 함수 컨텍스트로 전달하고 템플릿에서 display를 실행합니다. display가 다른 곳에서 호출되지 않으므로 @:keep를 사용해 DCE가 제거하지 못하게 합니다.

class Main {
  static function main() {
    new Main();
  }

  public function new() {
    var user = {name: "Mark", distance: 3500};
    var sample = "The results: $$display(::user::,::time::)";
    var template = new haxe.Template(sample);
    var output = template.execute({user: user, time: 15}, this);
    trace(output);
  }

  @:keep function display(resolve:String->Dynamic, user:User, time:Int) {
    return user.name + " ran " + (user.distance / 1000) + " kilometers in " +
      time + " minutes";
  }
}

typedef User = {name:String, distance:Int}

콘솔은 The results: Mark ran 3.5 kilometers in 15 minutes를 추적합니다.

전역(Globals)

Template.globals 객체를 사용해 모든 haxe.Template 인스턴스에 걸쳐 적용해야 하는 값을 저장하세요. 이는 Template.execute의 컨텍스트 인자보다 우선순위가 낮습니다.

리소스 사용(Using resources)

콘텐츠를 코드에서 분리하려면 리소스 임베딩 시스템(resource embedding system)을 사용하는 것을 고려하세요. 템플릿 콘텐츠를 sample.mtt라는 새 파일에 넣고, --resource sample.mtt@my_sample을 컴파일러 인자에 추가하고, haxe.Resource.getString으로 콘텐츠를 검색하세요.

class Main {
  static function main() {
    var sample = haxe.Resource.getString("my_sample");
    var user = {name: "Mark", age: 30};
    var template = new haxe.Template(sample);
    var output = template.execute(user);
    trace(output);
  }
}

서버 측에서 템플릿 시스템을 실행할 때 간단히 neko.Lib.printphp.Lib.print을 trace 대신 사용해 HTML 템플릿을 사용자에게 표시할 수 있습니다.

관련 내용

메서드에 대한 자세한 내용은 Template API를 참조하세요.

출처: Template

더 알아보기