2014-05-21 41 views
1

我正在使用「動態」Freemarker模板,這意味着可以根據用戶提交的輸入更改模板。我希望能夠做兩件事情:對Freemarker模板的內省或操縱

  1. 檢查模板的解析的語法樹,看它所包含的內容,尤其是標識符和$ {}變量。
  2. 操縱該分析樹,添加/刪除元素。

現在,我完成了一些醜陋的正則表達式和字符串操作。這很醜陋,容易出錯,所以我很想利用Freemarker在Java中的模板表示。

根據JavaDoc,Template.getRootTreeNode似乎是我想要的開始:我可以檢索一個模板的DOM類分析樹,一個TemplateElement實例。但是TemplateElement的許多具體實現並不公開。 JavaDoc甚至不記錄TemplateElement。看起來我能從TemplateElement獲得有用信息的唯一方法是編寫生活在Freemarker包中的代碼。是否有Freemarker-Blessed方式檢查模板?

理想情況下,我們將有適當的TemplateElement層次結構的文檔並將其子類公開。雖然這不會讓我直接修改模板,但至少可以讓我檢查模板的元素。

以下問題也被要求在幾年前,其結果有限:

How can I introspect a freemarker template to find out what variables it uses?

更新

我已經開始了Github的開源項目,使解析的反思Freemarker模板,以允許我上面討論的那種程序分析和操作。歡迎反饋:

freemarker-introspection

回答

0

FreeMarker的目前沒有進行檢查模板,更不用說修改它們發佈的API。這將是有用的,但它只是沒有它。所以,我想知道你是否可以從另一個角度來解決問題。你說你正在動態生成模板,除非模板本身是用戶提交的,否則你可以存儲用戶提交的信息,而不是模板本身,或者類似的東西。

+0

感謝您的回覆。不幸的是,模板本身是用戶提交的。看起來Freemarker目前狀態的解決方案是讓我在freemarker.core包中編寫我自己的類來訪問包本地類和字段,特別是TemplateElement的子類。你認爲Freemarker的維護人員可以隨時對公開的getters訪問那些不可訪問的領域嗎?哪裏纔是我進行這種談話的正確地點?謝謝。 –

+0

我現在是FreeMarker的維護者。我同意這樣一個API會很有用,但是......我有一個巨大的TODO列表和非常有限的時間。並且TODO列表中有些東西會影響更多用戶(例如,正確的地圖處理)。如果爲此類添加公共API,將來可能很容易成爲另一個向後兼容性障礙,如果做得不好的話......因此,這種情況很快就不會發生。 – ddekany

+0

我可以欣賞你的需要優先。如果我們能夠想出一個您可以接受的方法,我很樂意做這項工作。 –