Перенос шаблонов 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.