Портирование шаблонизатора Django на C - PullRequest
10 голосов
/ 30 мая 2010

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

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

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

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

PS Простые фрагменты кода, а также ссылки на инструменты и библиотеки очень добро пожаловать!

PPS Я уже знаю о grantlee , я взглянул на его источники.Ну ... это C ++ и он специфичен для Qt.

Ответы [ 4 ]

6 голосов
/ 07 июня 2010

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

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

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

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

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

4 голосов
/ 16 апреля 2014

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

1 голос
/ 06 июля 2011

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

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

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

1 голос
/ 04 сентября 2010

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

...