2011-10-12 1 views
2

나는 MarkupBuilder를 사용하여 taglib에서 HTML을 렌더링했다. (명확성을 위해 제거했다.) :MarkupBuilder 문자열에서 렌더링

이제는 사용자가 지정한 일부 요소를 끌어오고 싶다. 파일 시스템에있는 파일에서 나는 (다시, 단순화 된) 이와 같은 것을 가지고있다.

select() { 
    option() 
    option() 
} 

내 질문은 내가 String으로 선택하면, taglib가 파싱 할 수있는 방법이 있는가이다. 멋져서 MarkupBuilder 인스턴스에 포함 시키시겠습니까?

def formContainer = new MarkupBuilder(out) 
formConainer.form() { 
    input() { } 
    input() { } 

    // I want the select to render here 
} 

답변

1

한 가지 방법은 다음과 같습니다

String externalMarkup = ''' 
select() { 
    option() 
    option() 
} 
''' 
def out = new StringWriter() 

def formContainer = new groovy.xml.MarkupBuilder(out) 
formContainer.form() { 
    input() 
    input() 

    // Wrap the string in { -> ... } to make it a closure, and evaluate it 
    def extern = new GroovyShell().evaluate("{ it-> ${externalMarkup} }") 
    // Set the delegate of this closure to the MarkupWriter 
    extern.delegate = formContainer 
    // Then execute the closure 
    extern() 
} 
println out.toString() 

그러나, 이것은 나에게 취성 느낌 ...

이 더 나은 방법으로 값을 삽입하는 GroovyTemplateEngine을 사용할 수 있습니다 형식화 된 전체 마크 업 코드

+0

GroovyTemplateEngine 접근 방식이 마음에 듭니다. 템플릿의 Grails 태그 라이브러리에 액세스 할 수있는 방법이 있는지 알고 있습니까? – Gregg

+0

흠 ... 아니야, 생각 해보자. 나는 단지 GSP를 사용할 수 있을지 궁금해한다. –

+0

버머. 감사합니다. – Gregg