MarkupBuilder рендеринг из строки - PullRequest
2 голосов
/ 12 октября 2011

Я использую MarkupBuilder для рендеринга некоторого HTML-кода из taglib следующим образом (урезано для ясности):

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

Теперь предположим, что где-то внутри формы () я хочу добавить некоторые указанные элементыпользователем, поэтому в файле в файловой системе у меня есть что-то вроде этого (опять же, упрощенно) ...

select() {
  option()
  option()
}

Мой вопрос, если я читаю, что выбрать в качестве строки, есть лиспособ для taglib проанализировать его как groovy и сделать его частью экземпляра MarkupBuilder?

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

   // I want the select to render here
}

1 Ответ

1 голос
/ 12 октября 2011

Один из способов сделать это был бы:

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 чтобы вставить ваши значения в отформатированный полный бит разметки

...