Groovy模板-代码生成



我正在寻求与groovy模板一起使用的代码的建议和操作。

网络上的所有模板示例都使用了非常有限的逻辑,但我根本无法克服这个障碍,而且我的模板中的代码非常丰富。

这可以接受吗?有什么更好的方法可以做到这一点?

谢谢Peter

任务是生成TCL类型的代码,特别是if-then-elsif/else-type containt

if { [streq $pm_enrichment('a1') "'aaaa2'"] && [strlen $pm_enrichment('aaaa3')] &&
    [strlen $pm_enrichment('aaaa4') ] } { 
     set pm_enrichment('ResultAAA') 0 
}
elseif { [streq $pm_enrichment('b1') "'bb2'"] && [strlen $pm_enrichment('bbb3')] &&
[strlen $pm_enrichment('bbbb4') ] } { 
     set pm_enrichment('ResultBBB') 1 
}
else { [streq $pm_enrichment('c1') "'cc2'"] && [strlen $pm_enrichment('ccc3')] &&
[strlen $pm_enrichment('cccc4') ] } { 
     set pm_enrichment('ResultCCC') 2G 
} 

//////////////////////////////////////
def dataCasesClosure= {->
    pos=0
    arrSorted = []
    mapStmt.each{arrSorted.add(it.key) }
    arrSorted = arrSorted.sort()
    outStr=''''''
arrSorted.each { i ->
    tmpStatement = statement
    tmpResultStmt = resultStmt
    list=mapStmt[i]
    resultList=mapResultStmt[i]
pos=0
int index = tmpStatement.indexOf(keyword);
while (index >=0){
    val = list[pos].replaceAll(~'"','')
    pos +=1
    tmpStatement=tmpStatement.replaceFirst( ~/#/,/${val}/)
    index = tmpStatement.indexOf(keyword, index+keyword.length())   ;
}
if (tmpStatement ==~/W+$/) {
    tmpStatement=tmpStatement[0..-2]
}
pos=0
index = tmpResultStmt.indexOf(keyword);
while (index >=0){
    val = resultList[pos]
    pos +=1
    tmpResultStmt=tmpResultStmt.replaceFirst( ~/#/,/${val}/)                
    index = tmpResultStmt.indexOf(keyword, index+keyword.length())  ;
}
if (i==0) {
    outStr= "if {${tmpStatement} } { ntt ${tmpResultStmt} n  }"
} else if (i < arrSorted.size()-1  ){
    outStr += "elseif {${tmpStatement} } { ntt ${tmpResultStmt} n  }"
} else {
    outStr += "else {${tmpStatement} } { ntt ${tmpResultStmt} n  }"
}
}
outStr
} // ### dataCasesClosure
def valuesIfThenStmt= [
"statement":dataCasesClosure
]
tplIfThenStmt = '''
##############################
${statement}
'''
def engine = new SimpleTemplateEngine()
templateResult = engine.createTemplate(tplIfThenStmt).make(valuesIfThenStmt)
println templateResult.toString()

如果这就是你所要生成的全部内容,那么这个模板就太夸张了。您可以直接调用dataCasesClosure来获取其输出。

假设它是一个更大模板的一部分,那么我认为使用闭包为特别复杂的部分生成输出是非常合理的,就像您所做的那样。我个人在极端规模上做到了这一点,并取得了良好的效果。

最新更新