将Django的模板引擎移植到C语言

时间:2010-05-30 14:44:56

标签: python c django templates django-templates

我最近为我的C ++应用程序(QT)编写了一个简单而小巧的嵌入式HTTP服务器,我玩了Ry's http-parser喜欢它。这家伙疯狂

所以我告诉自己:“嘿!为什么不将django模板引擎移植到C?”那真棒! 我知道,这不是一件容易的事(根本不是,我知道),但我真的很想实现这一点。所以我来到这里寻求灵感,想法,意见......

我真的很想就这个主题,想法,已经完成的事情,我将遇到的哪些主要问题(以及如何解决这些问题)提出一些指示 - 如何不重新发明轮子...无论如何,你得到了主意:)

万分感谢!

P.S。简单的代码片段以及指向工具和库的链接非常欢迎!

P.P.S。我已经知道grantlee,我看了一下它的来源。嗯......这是C ++,它特定于Qt。

4 个答案:

答案 0 :(得分:6)

嗯,我不明白为什么django模板代码中的任何内容都难以在C中实现。模板语法看起来有点pythonic,但它实际上并不是python;他们为它实现了自己的解析器。所以首先要看的是django template implementation in python。这真的不是很多代码,而且相当容易理解。

当然,C会更加冗长。你正在编写的只是一个编译器:它读入一些代码(django模板)并用另一种语言(html)写出一些代码。因此,您可以找到有关在C中编写编译器的所有文档(即令牌化器+解析器+代码生成器)都是相关的。

首先,您可能希望生成语法树。 django模板的语法是非常规则的...每个{% whatever %}块都有一个对应的{% endwhatever %}块,因此您的解析器实际上可以生成树而不会真正知道所有whatever关键字可能是什么

然后,您遍历树,为每个块执行“代码生成”阶段。例如,您可以通过检查if参数的值,并打印其内容或不打印来代码{% if %},具体取决于if子句是true还是false。等等循环,过滤器,块等等。

请注意,这一切都是很多工作......您是否考虑过在您的C程序中嵌入python解释器? (说真的!这并不难,因为python解释器是开源的。)

答案 1 :(得分:4)

如果它有用,Synth框架在C ++中完全独立地重新实现了Django的模板系统。它包括所有built-in tags and filters以及对自定义的支持;除了库本身之外,还有一些Python绑定,除了一个本机命令行工具,它可以从任意来源读取数据,如JSON,INI或XML。

答案 2 :(得分:1)

如果您或其他任何人对Django模板引擎的C ++实现感兴趣,我正在研究它:http://git.fawek.net/Cjango/。但它还没准备好。

答案 3 :(得分:1)

作为参考,onion有一个Django-link模板系统。

它将模板编译为C,甚至允许对它们进行一些gdb调试。

生成的代码非常以洋葱为导向,但通过一些工作,它可以更通用。