Достопочтенное Ретро! Благо ты или зло?
Вздохом какого ветра к нам тебя занесло?
© Роберт Рождественский
Есть вещи, которые просто нравятся, их приятно держать в руках, они просты, они понятны. Время их расцвета ушло, но сами они не канули в лету, и к ним возвращаются снова и снова. Это касается не только предметов материального мира. Всегда найдётся программист, которому интересно писать на ассемблере, или прямо в машинных кодах, любитель простоты, минимализма, ретро. Попробуем вернуться к SSI, благо, это и проще ассемблера, и значительно моложе.
Технология SSI в своё время позволяла (и сейчас позволяет), делать сайты, в которых часть контента выносилась в отдельный файл, включаемый сервером «на лету». Обычно в отдельные файлы выносились: хидер, сайдбар, футер. Для обычного сайта с простой структурой этого хватало с лихвой. Выигрыш же состоял в том, что использовались простые, быстрые и надёжные решения, которые фактически без программирования реализовывали функционал CMS. Да и вообще, минимальный стек технологий — это любопытно.
Типичная страница сайта «на инклудах» выглядела так:
<html> <head> <title>Название страницы</title> </head> <body> <div id="header"><?php include ("header.php");?></div> <div id="sidebar"><?php include ("sidebar.php");?></div> <div id="footer"><?php include ("footer.php");?></div> </body> </html>
Но работа с множеством страничек вызывала некоторое неудобство. Появились CMS, которые снимали одни вопросы, и ставили другие. Интересным решением было хранение базы данных в виде одного html файла, в котором страницы обозначались тегами Н1, Н2, Н3. При этом цифра тега говорила в вложенности страницы. Идею эту я наблюдал в CMSimple cmsimple.org, хотя возможно, кто-то это придумал и ранее. На базе этой идеи наверняка создано достаточно много CMS (да и сам пробовал, каюсь, чего уж там).
Главный недостаток такого решения — необходимость ворочать большой html файл. Есть конечно возможность сделать индекс, но по большому счёту это уже не так интересно. Одно дело редактировать десяток статей в одном файле, другое — тысячи. Примем как данность, что такой движок уместен для небольшого сайта, и не важно, СДЛ это, или сателлит — мы ведь обсуждаем технологию.
SSI и БД в HTML
Что за изгибы моды? Время сошло с ума:
Бабушкины комоды в блочные лезут дома!
Вспомнив о SSI, я задался вопросом: а нельзя ли подобный подход реализовать с помощью этой технологии? Сказано — сделано. Прямо в html файле можно создать переменную, значением которой и будет база данных сайта:
<!--#set var="db" value="Your html db">
Осталось научиться делать выборку из этой базы данных. Для этого пригодится переменная QUERY_STRING, которая хранит строку запроса к сайту. Настроив реврайты в htaccess и используя возможность условных выражений с поддержкой регулярных выражений (сорри за тавтологию), сервер сможет делать выборку нужной статьи из базы.
К сожалению, в SSI нет циклов, поэтому перебрать базу данных и сформировать сайдбар со списком страниц не получится: его придётся делать вручную. Неудобно, но это ограничения SSI. Также мне сильно не хватило возможности поместить в переменную содержание сайта, чего-то такого:
<!--#set var="db" file="db.html">
Такая опция позволила бы базу данных поместить в отдельный файл, соответственно код «движка» был бы более чистым и читаемым. Так что «лапша-код», это наше всё.
Для эксперимента решил сделать простой сайт, чтобы попробовать в деле предлагаемое решение. Темой выбран латино-американский танец Румба (исходники ниже). Первое впечатление — сайт работает быстро. Поскольку размер «движка» вместе с базой данных чуть больше 10 килобайт, это не удивительно. Запишем это в плюс. Плюс этот будет оставаться таковым до тех пор, пока размер БД не вырастет к примеру до мегабайта. При этом необходимость формирования меню вручную остановит от ваяния большого сайта гораздо раньше. Кроме того, копипастя что-либо в БД, необходимо не забывать заменять двойные кавычки на одинарные.
Ничего необычного и сложного. Вполне возможное решение. Важно, что странички благодаря реврайтам поисковые системы будут индексировать как отдельные, а не как одну целую. Этим конечно никого не удивишь, но упомянуть не помешает. Также в плюс запишем малую нагрузку на сервер. Не самый важный фактор для маленького сайта, но пусть будет. Если есть желание прикрутить дескрипшены — это также не проблема, достаточно ввести ещё один тег в состав разметки записей-статей.
Эти файлы нужно создать на сайте, чтобы увидеть пример в действии:
AddDefaultCharset utf-8 AddType text/html .html AddHandler server-parsed .html DirectoryIndex rumba.shtml?query=start RewriteEngine on RewriteRule ^([a-zA-Z0-9-]+)\.html$ rumba.shtml?query=$1
<!--#set var="rumba_title" value="" --> <!--#set var="rumba_content" value="" --> <!--#set var="rumba_menu" value="" --> <!--#set var="rumba_error_title" value="Страница не найдена" --> <!--#set var="rumba_error_text" value="<h2>404</h2>Страница не найдена" --> <!--#set var="rumba_menu" value="<ul> <li><a href='./'>Главная</a></li> <li><a href='./history.html'>История румбы</a></li> <li><a href='./cha-cha-cha.html'>Румба и Ча-ча-ча</a></li> <li><a href='./types.html'>Виды румбы</a></li> <li><a href='./emotion.html'>Эмоциональное содержание танца</a></li> <li><a href='./hits.html'>Хиты румбы</a></li> </ul>" --> <!--#set var="rumba_db" value="<articles> <article id='start'> <h2>Румба — парный кубинский танец африканского происхождения</h2> <text> <a href='https://ru.wikipedia.org/wiki/Румба'>Ру́мба</a> (исп. rumba) — у этого слова есть два различных значения: <ol> <li>Одно из них относится к направлению танцев и музыке, родившихся на Кубе. Наиболее известным из них является rumba Guaguanco. Так же популярными являются rumba Yambu и rumba Columbia. Каждый из этих видов румбы имеет свою стилистику музыки и танцевания, но в целом они очень близки.</li> <li>Другое значение появилось сравнительно недавно и относится к танцу из программы бальных танцев, который входит в программу соревнований. В этом значении румба является самым медленным из пяти танцев соревновательной латино-американской программы (остальные четыре — пасодобль, самба, ча-ча-ча и джайв). Танец и музыка румбы из соревновательной программы латино-американских танцев происходят от кубинских музыкальных стилей и танцев болеро и сон.</li> </ol> </text> </article> <article id='history'> <h2>История румбы</h2> <text> Румба появилась в Гаване в 19-м веке в комбинации с европейским контрдансом. Название «Rumba», возможно, происходит от названия танцевальных групп в 1807 году — «rumboso orquestra», хотя в Испании слово «rumbo» означает «путь» (в русском морской аналог — «румбы», то есть направление). Замечание - российская морская терминология аккуратно заимствована у Нидерландов, поэтому 'направление' очевидно не в русском, а в голландском не так. </text> </article> <article id='cha-cha-cha'> <h2>Румба и Ча-ча-ча</h2> <text> <p>Изначально не существовало четкого разделения танцев румба дансона и ча-ча-ча, из-за чего вся музыка, характерным образом обыгрывавшая первую долю (несколько ударов из затакта, приводящих к первой доле), подпадала под категорию румбы. Со временем танцы четко разделились. Музыка румбы дансона приобрела более медленный темп, стала сочиняться, как правило, в минорном ладу, и приобрела свое обыгрывание первой доли (ударные: восьмая, восьмая, восьмая, четверть — первая доля). Музыка ча-ча-ча стала быстрее, сочиняется как в мажорном, так и в минорном ладу и имеет собственное, очень выраженное и подчеркнутое обыгрывание первой доли (восьмая, восьмая, четверть — первая доля, так называемое — «ча-ча-ча» или «ча-ча-раз»).</p> <p>В связи с этим многие знаменитые в прошлом румбы с современной точки зрения следует считать скорее ча-ча-ча или даже вообще невозможно четко классифицировать как один из этих танцев. Так, например, знаменитая мелодия «Кукарача», считавшаяся румбой, не является ни ею, ни ча-ча-ча с современной точки зрения. «Guantanamera» более известна в варианте ча-ча-ча, а не румбы.</p> <p>Таким образом, румба обязана своим рождением религиозным ритуалам, развивалась она на базе ярко выраженных ритмов и хоровых голосов. Также можно сказать, что румбой в какой-то степени являются все те танцы, которые были созданы кубинцами. В настоящее время этот танец известен на всех континентах. Сначала он пришел в кабаре, а затем на телевидение. Существует бальная румба, но она существенно отличается от аутентичного кубинского варианта.</p> </text> </article> <article id='types'> <h2>Виды румбы</h2> <text> <p>В начале XIX века на Кубе существовало три варианта румбы, но широкую известность получила румба Гуагуанко (Guaguanco), танец, во время которого кавалер следует за дамой в поисках соприкосновения бедрами, а дама старается этого избежать. В этом танце дама как бы является объектом дерзкого ухаживания и старается сдержать страсть своего партнера. Возможно из-за этого за румбой и закрепилось название - «танец любви».</p> <p>Так-же на Кубе существовали различные виды румбы, которые танцевались на праздниках и просто сборищах людей на улице. Ярким представителем является Румба Миметика, в которой изображаются различные сцены из жизни простых людей (Papilote, Mama'buela, Gavilan)</p> <p>Коренную эволюцию румба претерпела, будучи вывезенной в США. Наравне с экспансивной, эротичной кубинской появилась Румба американская – с более сдержанными движениями и стилем. Именно этот вариант румбы и распространился по всему миру, завоевав сердца нескольких поколений танцоров и просто ценителей латиноамериканской культуры. Гуагуанко в основном состоит из ритмов африканских барабанов, которые накладываются на ритм клавэ (clave), представляющий смещенный акцент, известный как 3-2. Пение без музыкального сопровождение напоминает старинные испанские мелодии, которые накладываются на ритмы африканских барабанов. Исполняется гуагуанко одним или несколькими солистами, тему и слова придумывают по ходу исполнения песни. Структура ритма гуагуанко основывается чаще всего на ритме румбы сон (Rumba Son).</p> </text> </article> <article id='emotion'> <h2>Эмоциональное содержание танца</h2> <text> Среди всех бальных танцев румба характеризуется наиболее глубоким эмоциональным содержанием. В ходе своей эволюции румба приобрела многие черты, характерные для блюза. Существует расхожий штамп, что «румба — танец любви». Контраст ярко выраженного эротического характера танца и драматического содержания музыки создаёт неповторимый эстетический эффект. Вопреки всеобщему мнению о том, что движения в румбе — это танцевальное воплощение эротических чувств, румба изначально была свадебным танцем, а ее движения обозначали не что иное как семейные обязанности супругов. Немногочисленные современные румбы, написанные в мажоре, имеют свою изюминку, но не оставляют такого глубокого впечатления. </text> </article> <article id='hits'> <h2>Хиты написанные в ритме румбы</h2> <text> <ul> <li>La Media Vuelta — Эйди Горме (Eydie Gorme)</li> <li>Manana</li> <li>Cantinero de Cuba</li> <li>Reflection — Кристина Агилера</li> <li>Fairy tale — Тони Брэкстон</li> <li>Don't Know Why — Нора Джонс</li> <li>Falling Into You — Celine Dion</li> <li>When the blue bird sings</li> <li>Gipsy Kings — La Rumba-De Nicolas</li> <li>Gipsy Kings — Una Rumba Por Aqui</li> <li>Gipsy Kings — Rumba Del Stud</li> </ul> </text> </article> </articles>" --> <!--#if expr="$QUERY_STRING = /^query=([a-zA-Z0-9-]+)/" --> <!--#set var="rumba_query" value="$1" --> <!--#if expr="${rumba_db} = /<article id='${rumba_query}'>[\\s\\S]*?<h2>(.*)<\/h2>[\\s\\S]*?<text>([\\s\\S]*?)<\/text>[\\s\\S]*?<\/article>/" --> <!--#set var="rumba_title" value="$1" --> <!--#set var="rumba_r1" value="$1" --> <!--#set var="rumba_r2" value="$2" --> <!--#set var="rumba_content" value="${rumba_content}<h2>${rumba_r1}</h2>${rumba_r2}" --> <!--#else --> <!--#set var="rumba_title" value="${rumba_error_title}" --> <!--#set var="rumba_content" value="${rumba_error_text}" --> <!--#endif --> <!--#else --> <!--#set var="rumba_title" value="${rumba_error_title}" --> <!--#set var="rumba_content" value="${rumba_error_text}2" --> <!--#endif --> <html> <head> <title><!--#echo encoding="none" var="rumba_title" --></title> <meta http-equiv="content-type" content="text/html; charset=utf-8"/> <link rel="stylesheet" href="twocolumn.css"> </head> <body> <br/> <div id="header"><h1>Латино-американский танец Румба</h1></div> <div id="sidebar"><!--#echo encoding="none" var="rumba_menu" --></div> <div id="content"><!--#echo encoding="none" var="rumba_content" --></div> </body> </html>
body { margin: 0 auto; width: 640px; font:17px/20px Arial,Helvetica,sans-serif; overflow-y: scroll; } a { color: #777; } #header { padding: 10px; text-align: center; } #content { margin-left: 230px; } #content h2{ color: #E6B03E; } #sidebar { padding: 10px; background: #B44E29; float: left; width: 180px; } #sidebar ul { padding: 0px; } #sidebar li { padding: 5px; list-style-type: none; list-style-position: inside; } #sidebar a { color: #fff; text-decoration: none; } #sidebar a:hover { color: #ccc; text-decoration: none; }
SSI и БД в XML
Вещи нездешней формы, люстры, шкатулки, бра.
Медные пра-телефоны, чайники — тоже «пра»…
Минимализм языка SSI конечно не даст сильно развернуться. Но как же выкрутиться? Если немного прищуриться, глядя на html, он становится похож на xhtml, а если вообще закрыть глаза… Ну, вы уже поняли, что попробуем скрестить SSI с XML. Этот формат одним людям нравится, другие его люто ненавидят, но он «имеет место быть». Почему бы не попробовать?
Сделать из html-базы предыдущего примера xml файл — дело двух минут. Мы можем скормить его поисковой системе: Гуглу, Яндексу, Рамблеру, но не Мэйлу (предлагаю mail.ru начать индексировать xml файлы, кто за?). Поисковик воспримет файл как одну страничку и будет её учитывать именно так. С точки зрения предыдущего варианта с множеством страниц это скорее минус, но раз существует понятие Single-Page Application (SPA или Одностраничное приложение), значит эта xml страница может иметь право на жизнь*.
Однако xml файл как-то не очень похож на сайт, и показывать его в таком виде посетителю не резон. Вот тут и появляется необходимость подключения XSLT преобразования. Это обычный xsl файл, который также, как и предыдущий вариант движка, получает посредством QUERY_STRING с помощью SSI запрос и трансформирует xml файл. Результатом становится оформленная страничка, привычная посетителю. Хочу подчеркнуть, что XSLT-трансформация происходит на клиенте, т.е. её делает браузер, а не сервер.
Важно, что «одним движением руки» боковое меню со списком страниц генерируется автоматически. Кроме того, очень легко добавить в этот прототип движка разделы (категории) статей и теги (метки). Эта задача прямо-таки просится в xsl, и при желании можно нафантазировать много чего.
Поскольку сайт на XSLT версии SSI движка мы называем SPA, то с точки зрения SEO это важно. Это значит, что поисковая система видит одну страничку (ПС могут больше, так что я утрирую), и продвигать её необходимо как сайт-одностраничник. Это скорее минус, но с оговоркой. Xsl файл может при трансформации изменять контент. Это интересно. Допустим, с позиции SEO мы вынуждены добавить на сайт текст именно для ПС. Его можно задвинуть далеко в футер, а можно… просто не показывать посетителю. Насколько далеко в этом стоит заходить и стоит ли это делать вообще — это тема отдельного разговора, здесь же разговор только о технической возможности.
Теперь о трансформации на клиенте: аргумент переноса нагрузки с сервера на клиент я особо не рассматривал, кто-то это посчитает плюсом, кто-то скажет, что это экономия на спичках. Моё мнение — если возможно, лучше всё делать на сервере, но если нет, то тут выбор не велик. У браузеров к сожалению есть некоторые особенности в реализации XSLT (фичи или баги), которые надо знать и учитывать, разрабатывая xsl. Также, мне видится перспективным попробовать использовать не Апач, а Nginx, в этом случае есть вариант с использованием модуля ngx_http_xslt_module При этом сайт из SPA можно превратить в многостраничник, проводящий XSLT трансформацию на стороне сервера.
Эти файлы нужно создать на сайте, чтобы увидеть пример в действии:
AddDefaultCharset utf-8 AddType text/xml .xml AddHandler server-parsed .xml AddType text/xsl .xsl AddHandler server-parsed .xsl DirectoryIndex rumba.xml?query=start RewriteEngine on RewriteRule ^([a-zA-Z0-9-]+)\.html$ rumba.xml?query=$1 [L]
<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="rumba.xsl?<!--#echo encoding="none" var="QUERY_STRING" -->"?> <html> <head> <title>Латино-американский танец Румба</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <meta name="Description" content="Описание сайта"/> </head> <body> <h1>Латино-американский танец Румба</h1> <article id='start'> <h2>Румба — парный кубинский танец африканского происхождения</h2> <text> <a title='Оригинал статьи на Википедии' rel='canonical' href='https://ru.wikipedia.org/wiki/Румба'>Ру́мба</a> (исп. rumba) — у этого слова есть два различных значения: <ol> <li>Одно из них относится к направлению танцев и музыке, родившихся на Кубе. Наиболее известным из них является rumba Guaguanco. Так же популярными являются rumba Yambu и rumba Columbia. Каждый из этих видов румбы имеет свою стилистику музыки и танцевания, но в целом они очень близки.</li> <li>Другое значение появилось сравнительно недавно и относится к танцу из программы бальных танцев, который входит в программу соревнований. В этом значении румба является самым медленным из пяти танцев соревновательной латино-американской программы (остальные четыре — пасодобль, самба, ча-ча-ча и джайв). Танец и музыка румбы из соревновательной программы латино-американских танцев происходят от кубинских музыкальных стилей и танцев болеро и сон.</li> </ol> </text> </article> <article id='history'> <h2>История румбы</h2> <text> Румба появилась в Гаване в 19-м веке в комбинации с европейским контрдансом. Название «Rumba», возможно, происходит от названия танцевальных групп в 1807 году — «rumboso orquestra», хотя в Испании слово «rumbo» означает «путь» (в русском морской аналог — «румбы», то есть направление). Замечание - российская морская терминология аккуратно заимствована у Нидерландов, поэтому 'направление' очевидно не в русском, а в голландском не так. </text> </article> <article id='cha-cha-cha'> <h2>Румба и Ча-ча-ча</h2> <text> <p>Изначально не существовало четкого разделения танцев румба дансона и ча-ча-ча, из-за чего вся музыка, характерным образом обыгрывавшая первую долю (несколько ударов из затакта, приводящих к первой доле), подпадала под категорию румбы. Со временем танцы четко разделились. Музыка румбы дансона приобрела более медленный темп, стала сочиняться, как правило, в минорном ладу, и приобрела свое обыгрывание первой доли (ударные: восьмая, восьмая, восьмая, четверть — первая доля). Музыка ча-ча-ча стала быстрее, сочиняется как в мажорном, так и в минорном ладу и имеет собственное, очень выраженное и подчеркнутое обыгрывание первой доли (восьмая, восьмая, четверть — первая доля, так называемое — «ча-ча-ча» или «ча-ча-раз»).</p> <p>В связи с этим многие знаменитые в прошлом румбы с современной точки зрения следует считать скорее ча-ча-ча или даже вообще невозможно четко классифицировать как один из этих танцев. Так, например, знаменитая мелодия «Кукарача», считавшаяся румбой, не является ни ею, ни ча-ча-ча с современной точки зрения. «Guantanamera» более известна в варианте ча-ча-ча, а не румбы.</p> <p>Таким образом, румба обязана своим рождением религиозным ритуалам, развивалась она на базе ярко выраженных ритмов и хоровых голосов. Также можно сказать, что румбой в какой-то степени являются все те танцы, которые были созданы кубинцами. В настоящее время этот танец известен на всех континентах. Сначала он пришел в кабаре, а затем на телевидение. Существует бальная румба, но она существенно отличается от аутентичного кубинского варианта.</p> </text> </article> <article id='types'> <h2>Виды румбы</h2> <text> <p>В начале XIX века на Кубе существовало три варианта румбы, но широкую известность получила румба Гуагуанко (Guaguanco), танец, во время которого кавалер следует за дамой в поисках соприкосновения бедрами, а дама старается этого избежать. В этом танце дама как бы является объектом дерзкого ухаживания и старается сдержать страсть своего партнера. Возможно из-за этого за румбой и закрепилось название - «танец любви».</p> <p>Так-же на Кубе существовали различные виды румбы, которые танцевались на праздниках и просто сборищах людей на улице. Ярким представителем является Румба Миметика, в которой изображаются различные сцены из жизни простых людей (Papilote, Mama'buela, Gavilan)</p> <p>Коренную эволюцию румба претерпела, будучи вывезенной в США. Наравне с экспансивной, эротичной кубинской появилась Румба американская – с более сдержанными движениями и стилем. Именно этот вариант румбы и распространился по всему миру, завоевав сердца нескольких поколений танцоров и просто ценителей латиноамериканской культуры. Гуагуанко в основном состоит из ритмов африканских барабанов, которые накладываются на ритм клавэ (clave), представляющий смещенный акцент, известный как 3-2. Пение без музыкального сопровождение напоминает старинные испанские мелодии, которые накладываются на ритмы африканских барабанов. Исполняется гуагуанко одним или несколькими солистами, тему и слова придумывают по ходу исполнения песни. Структура ритма гуагуанко основывается чаще всего на ритме румбы сон (Rumba Son).</p> </text> </article> <article id='emotion'> <h2>Эмоциональное содержание танца</h2> <text> Среди всех бальных танцев румба характеризуется наиболее глубоким эмоциональным содержанием. В ходе своей эволюции румба приобрела многие черты, характерные для блюза. Существует расхожий штамп, что «румба — танец любви». Контраст ярко выраженного эротического характера танца и драматического содержания музыки создаёт неповторимый эстетический эффект. Вопреки всеобщему мнению о том, что движения в румбе — это танцевальное воплощение эротических чувств, румба изначально была свадебным танцем, а ее движения обозначали не что иное как семейные обязанности супругов. Немногочисленные современные румбы, написанные в мажоре, имеют свою изюминку, но не оставляют такого глубокого впечатления. </text> </article> <article id='hits'> <h2>Хиты написанные в ритме румбы</h2> <text> <ul> <li>La Media Vuelta — Эйди Горме (Eydie Gorme)</li> <li>Manana</li> <li>Cantinero de Cuba</li> <li>Reflection — Кристина Агилера</li> <li>Fairy tale — Тони Брэкстон</li> <li>Don't Know Why — Нора Джонс</li> <li>Falling Into You — Celine Dion</li> <li>When the blue bird sings</li> <li>Gipsy Kings — La Rumba-De Nicolas</li> <li>Gipsy Kings — Una Rumba Por Aqui</li> <li>Gipsy Kings — Rumba Del Stud</li> </ul> </text> </article> </body> </html>
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!--#if expr="$QUERY_STRING = /^query=([a-zA-Z0-9-]+)/" --> <!--#set var="rumba_query" value="$1" --> <!--#else --> <!--#set var="rumba_query" value="error" --> <!--#endif --> <xsl:param name="query"><!--#echo encoding="none" var="rumba_query" --></xsl:param> <xsl:template match="/"> <html> <head> <xsl:apply-templates select="/html/head"/> <link rel="stylesheet" href="twocolumn.css"/> </head> <body> <div id="header"> <xsl:apply-templates select="/html/body" mode="header"/> </div> <div id="sidebar"> <ul> <xsl:apply-templates select="/html/body/article"/> </ul> </div> <div id="content"> <xsl:choose> <xsl:when test="count(/html/body/article[@id = $query]) = '0'"> <xsl:apply-templates select="/html/body" mode="error"/> </xsl:when> <xsl:otherwise> <xsl:apply-templates select="/html/body" mode="page"/> </xsl:otherwise> </xsl:choose> </div> </body> </html> </xsl:template> <xsl:template match="/html/head"> <title><xsl:value-of select="/html/body/article[@id = $query]/h2"/></title> <xsl:copy-of select="meta"/> </xsl:template> <xsl:template match="body" mode="header"> <xsl:copy-of select="h1"/> </xsl:template> <xsl:template match="/html/body/article"> <xsl:choose> <xsl:when test="@id = 'start'"> <li><a href="./">Главная</a></li> </xsl:when> <xsl:otherwise> <li><a href="{@id}.html" rel="nofollow"><xsl:value-of select="h2"/></a></li> </xsl:otherwise> </xsl:choose> </xsl:template> <xsl:template match="/html/body" mode="page"> <xsl:for-each select="/html/body/article[@id = $query]"> <xsl:copy-of select="h2"/> <div> <xsl:copy-of select="text"/> </div> </xsl:for-each> </xsl:template> <xsl:template match="/html/body" mode="error"> <h2>Ошибка 404</h2> Страница не найдена </xsl:template> </xsl:stylesheet>
body { margin: 0 auto; width: 640px; font:17px/20px Arial,Helvetica,sans-serif; overflow-y: scroll; } a { color: #777; } #header { padding: 10px; text-align: center; } #content { margin-left: 230px; } #content h2{ color: #E6B03E; } #sidebar { padding: 10px; background: #B44E29; float: left; width: 180px; } #sidebar ul { padding: 0px; } #sidebar li { padding: 5px; list-style-type: none; list-style-position: inside; } #sidebar a { color: #fff; text-decoration: none; } #sidebar a:hover { color: #ccc; text-decoration: none; }
Субъективный вывод
Кто-нибудь — между прочим — скажет о наших годах:
«Всё тогда было проще… Господи, нам бы так!..»
Применения описанных решений на SSI однозначно не подходят для широкого применения. Но сугубо с технической точки зрения они могут быть применены, и по сути это очень простые и весьма надёжные решения, о которых не лишним будет помнить. Альтернативой им служат современные CMS и SPA, использующие JavaScript, PHP и пр. которые скорей всего и будут решать поставленные по созданию сайта задачи.
Кстати говоря, вполне можно реализовать xslt трансформацию и в РНР и в JavaScript (не сомневаюсь, что и в других языках тоже), но я рассматривал решение с SSI с минимальным стеком технологий, этакий аскетический и минималистический вариант, когда есть сервер, или даже шаред хостинг и… всё. Я не рассмотрел версию с JS, хранящим данные без всякого Ajax: этот вариант не только может существовать, но и когда-то был использован мной в начале двухтысячных, но это по сути очень близко к современному SPA с каким-нибудь AngularJS на борту, и думаю, статей на эту тему и так хватает.
Если нет желания собирать сайты из приведённых примеров, вот ссылки на SSI HTML и SSI XML.
* Термины SPA и одностраничник мной в некоторой степени приравнены, хотя это конечно разные вещи.
ссылка на оригинал статьи https://habrahabr.ru/post/276491/
Добавить комментарий