2012-06-21 5 views
3

내 프로젝트에서 일부 HTML 코드를 생성하기 위해 StringTemplate V4를 사용하고 있습니다. 템플릿에 HTML 서식이 있어야하므로 기본 구분 기호 <>을 사용하는 것이 매우 어려울 것입니다.StringTemplate V4에서 <를 구분 기호로 사용하지 않으려면 어떻게해야하나요?

따라서 구분 기호를 인수로 전달하는 그룹을 만들고 있습니다 (권장 사항 : this question). 단순히 작동하지 않습니다. 여기

내 테스트 코드입니다 :

public void testTemplate() { 
    char sep = '$'; 
    STGroup stGroup = new STGroupString("temp", 
      "<html>hello, $name$!</html>", sep, sep); 
    System.out.println("Group created"); 
    ST st = stGroup.getInstanceOf("temp"); 
    if (st == null) { 
     System.out.println("Failed to get template!"); 
    } else { 
     st.add("name", "Guest"); 
     System.out.println("Template initialized correctly"); 
    } 
} 

그리고 이것은 내가 얻을 출력입니다 :

temp 1:1: invalid character '<' 
temp 1:5: invalid character '>' 
temp 1:1: garbled template definition starting at 'html' 
temp 1:6: garbled template definition starting at 'hello' 
temp 1:13: invalid character '$' 
temp 1:18: invalid character '$' 
temp 1:19: invalid character '!' 
temp 1:21: invalid character '<' 
temp 1:22: invalid character '/' 
temp 1:14: garbled template definition starting at 'name' 
temp 1:26: invalid character '>' 
temp 1:22: garbled template definition starting at 'html' 
Failed to get template! 

내가 여기서 무엇을 놓치고?

+0

그냥 템플릿과 함께 작동하지만 실제 코드에서 렌더러를 등록해야하기 때문에 그룹을 사용해야합니다. – elias

답변

4

STGroupString 생성자에 제공된 템플릿이 올바른 "그룹 템플릿"구문이 아닙니다.

특수 구문 시도가 필요없는 그룹 템플릿으로 활용하려면 다음 작업을 수행하세요.

STGroup group = new STGroup('$', '$'); 
group.registerRenderer(...); 
CompiledST compiledTemplate = group.defineTemplate("name", ...); 
compiledTemplate.hasFormalArgs = false; // very important! 

// later on... 
ST template = group.getInstanceOf("name"); 

을 (이것은 위의 내가 유형을 보장하기 위해 노력했다, 그래서 YMMV 내 C# 코드의 적응이다/이름은 유효 구문은 정확하지만 확인하지는 않았습니다. 필요에 따라 업데이트/수정하십시오.)

해피 코딩.

+1

그것은 일했다! 고마워요! :) – elias

+0

당신도 환영합니다. 지난 주에이 문제에 대해서도 만났습니다. –

+0

'defineTemplate (String, String)'메소드가'testing을위한 Javadoc '주석을 가지고 있다는 것이 다소 이상합니다. 그래서 이것은 의도 된 방법이 아닐 수도 있습니다. – wvdz

1

위의 매우 흥미로운 속임수 (pst로)는 "유효한 그룹 템플릿 구문이 아닙니다."라는 힌트도 제공합니다.

그래서, 참조를 위해, 여기에 같은 그룹에 대한 올바른 구문을 사용하여 자신의 코드에 대한 대안입니다

:

STGroup groupS = new STGroupString("some group", "val(value) ::= \"<span>Value is {value; format=\\\"%1.5f\\\"}</span>\"", '{', '}'); 
groupS.registerRenderer(Number.class, new NumberRenderer()); 
ST valTpl = groupS.getInstanceOf("val"); 
valTpl.add("value", 3.14159265358979353); 
System.out.println(valTpl.render()); 

구문은 많은 탈출로, 자바 문자열 내에서 다루기 힘든하게 ...