====== Handlebars.java ======
* https://github.com/jknack/handlebars.java
===== SafeString =====
Handlebars는 헬퍼가 리턴한 값을 기본적으로 HTML Escape하지만, 헬퍼가 return할 때 이를 ''SafeString''객체로 감싸서 리턴하면 HTML Escape을 하지 않는다. 물론, 해당 Escape에 대한 보안 책임은 헬퍼를 만든 프로그래머가 져야한다.
handlebars.registerHelper("blog-list", new Helper>() {
public CharSequence apply(List list, Options options) {
String ret = "";
for (Blog blog: list) {
ret += "- " + options.fn(blog) + "
";
}
return new Handlebars.SafeString(ret + "
");
}
});
===== Handlebar javscript precompile =====
* [[http://blog.javarouka.me/2014/08/handlebars-for-java_31.html|Handlebars (for Java) 서버, 클라이언트 동시에 사용하기]]
* ''precompile''과 ''embedded'' 사용.
===== Options =====
* ''com.github.jknack.handlebars.Options''의 ''fn'' 객체에서 현재 템플릿 위치에 대한 정보를 얻을 수 있다.
* ''options.fn.text()'' : helper 문자열 자체
* ''options.fn.filename()'' : 템플릿 파일
* ''options.fn.position()[0]'' : 현재 호출 위치 line number.
* ''options.fn.position()[1]'' : 현재 호출 위치 column number.
===== 중첩 블럭(nested block)에서 상위 컨텍스트 참조 =====
''%%{{#each}}%%'' 같은 블럭 컨텍스트는 인자로 받은 객체를 새로운 컨텍스트로 만드는데, ''%%{{#each}}%%''가 중첩해서 나오고, 상위 컨텍스트와 하위 컨텍스트에 동일 프라퍼티가 있을 경우 상위 컨텍스트 프라퍼티 접근이 어려울 수 있다.
이때는 **''../propertyName''** 를 사용하면 상위 컨텍스트 프라퍼티에 접근 가능하다.
Handlebars 3.x 부터는 block 의 컨텍스트에 명시적으로 이름 지정이 가능해져서 상위 컨텍스트와의 이름 충돌 회피가 더 쉬워졌다.
===== Array/List by index =====
* ''index''에 숫자 대입
{{people.[index]}}
===== each with index / key =====
* [[http://handlebarsjs.com/builtin_helpers.html|HandlebarsJs builtin helpers 참조]]
* List/Array index
{{#each array}}
{{@index}}: {{this}}
{{/each}}
* Map Key
{{#each object}}
{{@key}}: {{this}}
{{/each}}