DarkLordis
Новичок
На сколько это полная ерунда? SAX для XTML
В процессе производства сайтов с динамическим содержимым к программисту поступают результаты работы дизайнера и верстальщика в виде html+css, ну и конечно набор картинок. Типичный способ добавления динамического содержания – html injection. Результирующий файл представляет из себя чередующиеся участки php кода и html. Результат труда программиста выглядит не очень красиво. Визуально работать с такими текстами затруднительно. Одновременная работа программиста с дизайнером и верстальщиком не всегда реальна. В свое время это вынуждало программистов пользоваться «шаблонизаторами».
Однако существует и другой способ. Конечно, наше решение не универсальная панацея и мы не можем украсить нашу статью лозунгом «делай так и никак иначе», но иногда действительно помогает.
В последнее время верстальщики используют XHTML, отличающийся более строгим подходом к синтаксису. Этим мы и воспользуемся.
Итак, исходное положение: руки на клавиатуре, дизайн сайта в виде html+css, лень, головная боль и отсутствие времени по выбору.
1. В доступное место положите parser.php .
2. Создайте новый файл типа *.php с содержимым типа:
В результате вывода данного файла вы должны получить страницу неотличимую от design.htm
3. Теперь вы можете изменять выдачу ананализатора по своему усмотрению. Например, надо добавить вызов какой-либо функции как реакцию на событие onload для страницы. Добавим реализацию следующего метода к нашему классу main
4. Формат XHTML хорош тем, что в нем для каждого блока div обычно присутствует свойство id. Воспользуемся этим и изменим содержимое какого-нибудь div’а. Добавляем пару функций:
Аналогично можно поступить с тегами имеющими уникальное значение параметра name.
5. Все остальное теперь зависит только от вашей фантазии. Все что надо расположить до выдачи html расположите в методе-конструкторе (в данном случае function main) до строки
О том как это работает…
Класс parser представляет из себя рекурсивный нисходящий анализатор html. Считывание из файла производится посимвольно (существует и версия с буферизированным вводом но преимуществ не выявлено). При получении HTML тега производится поиск функции его обработки вида tag_<имя тега>($text, $args, $path). В качестве параметра $text передается внутренний текст тега, $args содержит ассоциативный массив параметров тега, а $path имена родительских тегов. Функция должна возвратить обработанный текст, в противном случае, его содержимое будет потеряно. Для простоты конструирования возвращаемого текста используется метод recombine класса parser. Метод recombine($tag, $text, $args) возвращает тег $tag c параметрами $args и внутренним текстом $text.
Варианты данного класса могут быть использованы (и используются) для анализа XML файлов.
Главные особенности метода – несомненная простота и отсутствие изменений, вносимых в html файлы.
В процессе производства сайтов с динамическим содержимым к программисту поступают результаты работы дизайнера и верстальщика в виде html+css, ну и конечно набор картинок. Типичный способ добавления динамического содержания – html injection. Результирующий файл представляет из себя чередующиеся участки php кода и html. Результат труда программиста выглядит не очень красиво. Визуально работать с такими текстами затруднительно. Одновременная работа программиста с дизайнером и верстальщиком не всегда реальна. В свое время это вынуждало программистов пользоваться «шаблонизаторами».
Однако существует и другой способ. Конечно, наше решение не универсальная панацея и мы не можем украсить нашу статью лозунгом «делай так и никак иначе», но иногда действительно помогает.
В последнее время верстальщики используют XHTML, отличающийся более строгим подходом к синтаксису. Этим мы и воспользуемся.
Итак, исходное положение: руки на клавиатуре, дизайн сайта в виде html+css, лень, головная боль и отсутствие времени по выбору.
1. В доступное место положите parser.php .
2. Создайте новый файл типа *.php с содержимым типа:
PHP:
<?php
require_once("parser.php");
class main extends parser
{
function main()
{
echo $this->parse_file("design.htm");
}
}
new main;
?>
3. Теперь вы можете изменять выдачу ананализатора по своему усмотрению. Например, надо добавить вызов какой-либо функции как реакцию на событие onload для страницы. Добавим реализацию следующего метода к нашему классу main
PHP:
function tag_body($text, $args, $path)
{
$args["onload"] = "function();";
return $this->recombine("body", $text, $args);
}
PHP:
function tag_div($text, $args, $path)
{
if(isset($args['id']))
{
$element = "id_".$args['id'];
if(method_exists($this, $element))
return $this->$element($text, $args, $path);
}
return $this->recombine("div", $text, $args);
}
function id_menu($text, $args, $path)
{
$text = "Hello world!";
return $this->recombine("div", $text, $args);
}
5. Все остальное теперь зависит только от вашей фантазии. Все что надо расположить до выдачи html расположите в методе-конструкторе (в данном случае function main) до строки
PHP:
echo $this->parse_file("design.htm");
Класс parser представляет из себя рекурсивный нисходящий анализатор html. Считывание из файла производится посимвольно (существует и версия с буферизированным вводом но преимуществ не выявлено). При получении HTML тега производится поиск функции его обработки вида tag_<имя тега>($text, $args, $path). В качестве параметра $text передается внутренний текст тега, $args содержит ассоциативный массив параметров тега, а $path имена родительских тегов. Функция должна возвратить обработанный текст, в противном случае, его содержимое будет потеряно. Для простоты конструирования возвращаемого текста используется метод recombine класса parser. Метод recombine($tag, $text, $args) возвращает тег $tag c параметрами $args и внутренним текстом $text.
Варианты данного класса могут быть использованы (и используются) для анализа XML файлов.
Главные особенности метода – несомненная простота и отсутствие изменений, вносимых в html файлы.