2010-05-30 26 views
10

我最近爲我的C++應用程序(QT)編寫了一個簡單而小巧的嵌入式HTTP服務器,並且我用Ry's http-parser深愛它。這傢伙是瘋了將Django的模板引擎移植到C

所以我告訴自己:「嘿!爲什麼不將django模板引擎移植到C?」那太棒了! 我知道,這不是一件容易的事(我根本不知道),但我真的很喜歡這樣做。所以,我來到這裏尋找靈感,想法,意見......

我真的很想對這個問題,想法,什麼已經完成,其中主要的問題,我會遇到一些指針(以及如何解決這些問題) - 如何不重新發明輪子......無論如何,你有這個想法:)

非常感謝!

P.S.簡單的代碼片段和鏈接工具和庫是非常歡迎

P.P.S.我已經知道grantlee,我看了一下它的來源。那麼......這是C++,它特定於Qt。

+0

我剛剛發現這個http://github.com/panyam/mango也許,它會有幫助嗎?我仍然不知道它是什麼,但我正在閱讀源 – sandra 2010-05-30 15:02:40

+1

這是關於將Django模板移植到erlang,但至少它是關於移植這個特定的項目:[爲Erlang編寫模板編譯器](http:// www .evanmiller.org/write-a-template-compiler-for-erlang.html) – miku 2010-05-31 10:07:50

+0

謝謝@ @ MYYN!我想我明白了,這篇文章確實非常棒! – sandra 2010-05-31 13:38:11

回答

6

嗯,我不明白爲什麼在Django模板代碼什麼將是很難用C實現的模板語法看起來有點Python的,但它實際上不是蟒蛇;他們爲它實現了自己的解析器。所以首先看的是django template implementation in python。這實際上不是很多代碼,而且它很容易理解。

當然,C會更加冗長。你所寫的正是一個編譯器:它讀入一些代碼(django模板)並用另一種語言(html)寫出一些代碼。因此,您可以在C中找到有關編寫編譯器的所有文檔(即標記器+解析器+代碼生成器)。

首先你可能想要生成一個語法樹。 Django模板的語法非常有規律...每個{% whatever %}塊都有相應的{% endwhatever %}塊,所以您的解析器實際上可以生成樹,而不必知道所有whatever關鍵字可能是什麼。

然後,您將遍歷樹,爲每個塊執行「代碼生成」階段。例如,通過檢查if參數的值,並打印其內容或不顯示任何內容(取決於if子句是true還是false),您可以使用codegen {% if %}。等與while循環,過濾器,塊等

你要知道,這一切都是大量的工作......你有沒有考慮只是嵌入Python解釋器到您的C程序? (說真的!這並不難做到,因爲Python解釋器是開源的。)

+0

謝謝,apenwarr!這正是我現在正在做的事情。首先編寫一個標記器,然後爲每個標記編寫一個解析器。並組裝整個事情。這並不容易,我必須找到一種很好的方式來聲明和使用不同類型變量的上下文。但無論如何這很有趣:) – sandra 2010-06-07 22:28:20

0

你還在這個嗎?我很想看看你想出了什麼,並很快用它作爲出發點。我現在有幾件事情正在使用,就像ctypes中的幾個簡單的POSIX正則表達式一樣,爲我執行最常見的操作。循環大量替換而不留下cpp證明會更快。

1

如果你或其他人有興趣在C++實現Django的模板引擎,我的工作就可以了:http://git.fawek.net/Cjango/。它尚未準備好,但。

+0

它如何處理自定義模板標籤和過濾器? – 2010-09-03 22:12:49

+0

TagNodeFactory和FilterFactory是客戶端用於注入自定義功能的兩個接口。前者需要一個工廠函數(用於每個標籤名稱),以便在模板樹中每次需要時分配TagNode子類的對象。對於後者,您只需將Filter對象分配給給定的過濾器名稱即可。 – 2010-09-03 23:25:22

1

僅供參考,onion有一個Django鏈接模板系統。

它將模板編譯爲C,甚至允許對它們進行一點gdb調試。

生成的代碼是相當洋蔥的,但有些工作可以更通用。

4

如果它有用,Synth框架以C++完全獨立地重新實現了Django的模板系統。它包括所有built-in tags and filters以及對定製的支持;除了庫本身外,還有Python綁定,此外還有一個本地命令行工具,可以從任意源(如JSON,INI或XML)讀取數據。