记录生成的FreeMarker模板中的行/字符位置

时间:2016-02-19 17:37:46

标签: java freemarker

有没有办法从生成的FreeMarker模板中记录特定的行/字符位置?目的是突出显示生成的输出文件的特定部分,而不必解析生成的输出文件。

例如,我们说我有这个模板:

function foo()
{
   ordinary_crap();
   ordinary_crap();
   do_something_special();<@mark foospecial>
   ordinary_crap();
}

function bar()
{
   ordinary_crap();
   do_something_really_special();<@mark barspecial>
   ordinary_crap();
   ordinary_crap();
}

function baz()
{
   foo();<@mark foo_call_1>
   ordinary_crap();
   bar();<@mark bar_call_1>
}

我希望<@mark>指令不产生任何生成的输出,而是将标记名称foospecialbarspecialfoo_call_1bar_call_1与该行相关联和<@mark>指令在生成的输出中的位置。上面的示例我显示了独立的单点,但是使用开始/结束对标记特定范围也很有用。

我能看到的替代方案是

  • 独立解析输出 - 并非总是可能,例如,如果输出中存在多个相同的实例,我想突出显示其中的特定实例?
  • 添加&#34;标记提示&#34;并通过我自己的后处理步骤删除它们。例如

     <mark name="years">Fourscore and seven</mark> years ago 
     something really brilliant happened to a really nice guy named
     <mark name="niceguyname">Fred</mark>.
    

    然后我可以对此进行后处理并移除<mark >标签(假设它们不与其他内容发生冲突),记录我的位置。

但这两件事看起来都很糟糕。

1 个答案:

答案 0 :(得分:1)

TemplateDirectiveModel实施(我假设您实施mark的方式而不是#macro),致电env.getCurrentDirectiveCallPlace()。返回的DirectiveCallPlace具有getBeginColumn()getBeginLine()方法。