====== 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}}