С чего начать при написании нового скриптового «языка»? - PullRequest
4 голосов
/ 16 сентября 2010

Мне нужно написать базовый движок сценариев / шаблонов, который будет работать под PHP. В идеале я мог бы смешать свой собственный язык разметки с (X) HTML-шаблоном и запустить документ через анализатор на стороне сервера, чтобы динамически заменить мою собственную разметку на (X) HTML, подаваемый из базы данных.

К сожалению, несмотря на все мои знания PHP и сценариев, я не совсем уверен, с чего начать. Моим первым инстинктом было запустить весь документ через какой-то синтаксический анализатор регулярных выражений и сопоставить мою пользовательскую разметку с конкретными функциями PHP ... но это кажется мне немного медленным и сложным.

Какие существуют ресурсы / учебные пособия / примеры, которые могут указать мне правильное направление? Для сравнения, мне действительно нравится новый движок шаблонов Razor для .NET MVC ... Я не хочу полностью использовать его для проекта PHP, но создание чего-то подобного было бы замечательно.


Обновление

ОК, позвольте мне уточнить мое объяснение немного подробнее ... Я занимаюсь разработкой веб-сайтов для WordPress. Многие из моих клиентов хотят настроить свои сайты, но убегают всякий раз, когда я начинаю говорить о PHP. Это язык сценариев, который выглядит слишком сложным для непрофессионала, чтобы даже заинтересоваться им.

Что я хочу сделать, так это создать собственную форму разметки специально для WordPress. Таким образом, вместо того, чтобы иметь вызовы функций PHP (get_header() и get_footer() и if(has_posts()) ...) в файле темы, у вас будет XML с пространством имен (<wpml:header /> и <wpml:footer /> и <wpml:loop> ... </wpml:loop>), который переводится в тоже самое. Было бы лучше отделить ваши файлы шаблонов от серверного скрипта (есть несколько тем, которые помещают целые функции PHP непосредственно в файлы шаблонов PHP !!!), и не-разработчикам было бы легче начать работать с настройкой темы WordPress.

Имея это в виду, уже предложенные решения TWIG и Mackrell определенно поддерживают идею встраивания "слепков" скриптов в файл, но на самом деле они не помогают мне разобрать пользовательскую разметку XML / XHTML в нечто, распознаваемое код на стороне сервера.

Итак ... с чего начать при создании нового процессора разметки на стороне сервера?

Ответы [ 4 ]

5 голосов
/ 16 сентября 2010

Похоже, вам нужен шаблонный язык, который поддерживает расширение с помощью пользовательских токенов. Учитывая, что сам PHP удовлетворяет эту потребность, я полагаю, вам также нужна какая-то песочница.

Для этого я бы предложил TWIG .

По умолчанию он использует тот же базовый синтаксис, что и Django и Jinja2 для Python или Liquid для Ruby (хотя и не рекомендуется, это настраивается), и он компилируется в кешированный PHP для скорости.

Он поддерживает песочницу и авто-экранирование параметров, а также подстановку и наследование блоков, вы выбираете, к каким переменным он получает доступ, и вы можете настроить любую комбинацию по умолчанию, а также пользовательские токены и фильтры.

Smarty также может удовлетворить ваши потребности, но я не уверен, обладает ли он всеми вышеупомянутыми функциями, его синтаксис, на мой взгляд, не такой элегантный, и мне говорят, что это более болезненно чем это стоит.

Что бы вы ни делали, подумайте долго и усердно, прежде чем изобретать свой собственный язык шаблонов. Как правило, в долгосрочной перспективе это огромная боль, которая рано или поздно заканчивается на The Daily WTF рядом с BobX .

Обновление: У меня сложилось впечатление, что вы одержимы использованием пространства имен XML для шаблонов. Стоит ли заново изобретать весь движок шаблонов, чтобы пользователи могли использовать <wpml:header /> вместо {{header}}? TWIG не позволяет пользователям вставлять произвольные сценарии ... только переменные и конструкции управления потоком, которые вы явно одобрили.

4 голосов
/ 16 сентября 2010

Другой вариант - проанализировать ваш шаблон в документе xml и преобразовать его в другой документ xml, где ваши собственные теги будут заменены другими тегами (например, <?php инструкции по обработке). В этом случае XSL - это то, что вы ищете.

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

Для пользовательского XML вы можете использовать PHP XML-парсер , желательно SAX для исполнения.

Smarty - очень хороший PHP-движок шаблонов со встроенными тегами,блоки и функции.Вы можете расширить их, чтобы создать свои собственные и даже удалить встроенные (для Smarty 3).

Если вам нужно создать свой собственный скрипт, я предлагаю вам проверить анализатор языка как Lex и Yacc .Вы должны будете определить свой язык таким образом, как эти изображения SQLite , но не графически, а текстуально.Доступны другие грамматический синтаксический анализатор .Те, что я дал, являются одними из самых старых и самых известных, но это было сделано для C ++.

Вы, вероятно, захотите избегать делать это самостоятельно (например, используя RegExp).Очень скоро у вас будет много несоответствий в вашем сценарии.Несмотря на то, что RegExp сами по себе являются своего рода языком, интерпретируемым автоматом.

Вы можете смешивать два: синтаксический анализатор XML и общий анализатор.Выезд Конечный автомат (FSM) .

0 голосов
/ 16 сентября 2010

Я бы начал в XML с определения типичной разметки страницы, а затем перешел бы к расшифровке XML на выбранном вами языке, а затем взял это и создал HTML.

xml должен быть группой узлов, описывающих ваш конкретный язык.

Итак ...

<MyPage>
  <MyElement id="myid" type="MyType1">
    <MyElement id="myid" type="MyType1" Text="Some text"/>
  </MyElement>
  etc...

Я бы более внимательно посмотрел в интернете, чтобы увидеть, есть ли уже что-то перестроенное, что бы соответствовало вашим потребностям, прежде чем начинать что-то подобное, что имеет реальный потенциал стать одной из тех вещей, которые выходят из контроль и невозможно поддерживать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...