Перенос шаблонов Django на C

Недавно я написал простой и крошечный встроенный HTTP-сервер для моего приложения на С++ (QT), и я немного поиграл с Ry http-parser и любил его. Этот парень сумасшедший.

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

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

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

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

P.P.S. Я уже знаю grantlee, я изучил его источники. Ну... что С++ и он специфичен для Qt.

Ответ 1

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

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

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

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

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

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