2010-05-30 3 views
10

Недавно я написал простой и крошечный встроенный HTTP-сервер для моего приложения на C++ (QT), и я немного сыграл с Ry's http-parser и любил. Этот парень crazy.Портирование механизма шаблонов Django на C

Так что я сказал себе: «Эй, почему бы не перенести двигатель шаблона django на C?» Это было бы здорово! Я знаю, это будет непростая задача (совсем не я знаю), но я бы очень хотел это реализовать. Поэтому я пришел сюда для вдохновения, идей, мнений ...

Мне очень хотелось бы иметь некоторые указания по теме, идеи, что уже сделано, с какими основными проблемами я столкнусь (и как их решить)) - Как не изобретать велосипед ... во всяком случае, у вас есть идея :)

Спасибо, миллион раз!

P.S. Простые фрагменты кода, ссылки на инструменты и библиотеки - очень приветствуются!

P.P.S. Я уже знаю grantlee, я изучил его источники. Ну ... это C++, и это характерно для Qt.

+0

Я просто нашел это http://github.com/panyam/mango, может быть, это поможет? Я до сих пор не знаю, что это такое, но я читаю источники. – sandra

+1

Речь идет о переносе шаблонов django в erlang, но по крайней мере это касается переноса этого конкретного проекта: [Write A Template Compiler For Erlang] (http: // www .evanmiller.org/write-a-template-compiler-for-erlang.html) – miku

+0

Спасибо, @ MYYN! Я думаю, что у меня есть идея, статья очень приятная! – sandra

ответ

6

Хмм, я не понимаю, почему что-либо в коде шаблонов django было бы сложно реализовать на C. Синтаксис шаблона выглядит немного пифоническим, но на самом деле это не python; они внедрили для этого свой собственный парсер. Итак, первое, что нужно посмотреть, это django template implementation in python. Это действительно не очень много кода, и это достаточно легко понять.

Конечно, C будет гораздо более подробным. То, что вы пишете, - это точно компилятор: он читает в некотором коде (шаблоны django) и выписывает код на другом языке (html). Таким образом, вся документация, которую вы можете найти о написании компиляторов в C (то есть, токенизаторы + парсеры + генераторы кода), имеет значение.

Сначала вы, вероятно, захотите сгенерировать дерево синтаксиса. Синтаксис шаблонов django очень правильный ... каждый блок {% whatever %} имеет соответствующий блок {% endwhatever %}, поэтому ваш синтаксический анализатор может фактически генерировать дерево, не зная, какими могут быть все ключевые слова whatever.

Затем вы проходите через дерево, выполняя фазу «code gen» для каждого блока. Например, вы должны ввести код {% if %}, проверив значение параметра if и распечатав его содержимое или ничего, в зависимости от того, является ли предложение if истинным или ложным. И так далее с петлями, фильтрами, блоками и т. Д.

Помните, все это очень много работы ... считаете ли вы просто встраивание интерпретатора python в вашу программу на C? (Серьезно! Это не так сложно сделать, поскольку интерпретатор python является открытым исходным кодом.)

+0

Спасибо, apenwarr! Это на самом деле то, что я делаю прямо сейчас. Сначала написание токенизатора, а затем парсер для каждого токена. и собрать все это. Это будет непросто, и я должен найти хороший способ объявить и использовать Контексты переменных разных типов. Но это все равно :) – sandra

0

Вы все еще работаете над этим? Мне было бы интересно увидеть, что вы придумали, и использовать его в качестве отправной точки довольно скоро. Сейчас у меня есть пара вещей, которые вы используете сейчас, как пару простых POSIX-регулярных выражений в ctypes, чтобы выполнять самые распространенные операции для меня. Было доказано, что он быстрее, если зацикливать большое количество замен, не выходя из cpp.

1

Если вы или кто-либо еще интересуетесь реализацией механизма шаблонов Django на C++, я над этим работаю: http://git.fawek.net/Cjango/. Хотя он еще не готов.

+0

Как обрабатывать пользовательские теги и фильтры шаблонов? –

+0

TagNodeFactory и FilterFactory - это два интерфейса, которые клиентская сторона будет использовать для ввода пользовательских функций. Первая принимает заводскую функцию (для каждого имени тега), которая выделяет объект подкласса TagNode каждый раз, когда это необходимо в дереве шаблонов. С последним вы просто назначаете объект Filter заданному имени фильтра. –

1

Для справки onion имеет систему шаблонов Django.

Он скомпилирует шаблон на C и даже позволяет немного отлаживать gdb на них.

Созданный код довольно ориентирован на лук, но с некоторой работой он может быть более общим.

4

В случае, если это полезно, инфраструктура Synth имеет полную автономную повторную реализацию системы шаблонов Django на C++. Он включает в себя все built-in tags and filters, а также поддержку пользовательских; помимо самой библиотеки, есть привязки Python, в дополнение к встроенному инструменту командной строки, который может считываться в данных из произвольных источников, таких как JSON, INI или XML.

Смежные вопросы