Статьи

Создание Spress Svbtle Theme — Отзывчивые Статические Блоги!

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

Несмотря на простоту в использовании и быструю настройку, разработка Sculpin немного затормозилась, и документация оставляет желать лучшего. В каком-то смысле Spress является его духовным преемником. Гораздо лучшая документация, гораздо более гибкая конфигурация, гораздо более простое расширение и такое же простое использование практически с теми же API и командами.

Spress заголовок изображения

В этом уроке мы будем создавать настройку Spress для создания статического блога с пользовательской темой.

Бутстрапирование

В этом руководстве предполагается, что у вас есть рабочая среда PHP, например Homestead Improved . Для удобства, следующие несколько строк помогут вам сразу начать:

git clone https://github.com/swader/homestead_improved hi_spress cd hi_spress bin/folderfix.sh vagrant up; vagrant ssh 

После того, как мы в VM, мы можем установить Spress с:

 wget https://github.com/spress/Spress/releases/download/v2.0.0/spress.phar sudo mv spress.phar /usr/local/bin/spress sudo chmod +x /usr/local/bin/spress 

Spress теперь доступен для всей системы (или для всей ВМ, если вы используете ВМ), что можно проверить, запустив spress :

Скриншот вывода Spress

Для создания примера сайта мы можем использовать инструкции из документов:

 cd ~/Code spress site:new myblog spresso cd myblog spress site:build --server 

Теперь сайт должен быть доступен через http://localhost:4000 или, если вы находитесь на виртуальной машине, подобной Homestead Improved , вам следует сначала перенаправить порт 4000 в Homestead.yaml , запустить vagrant provision вне виртуальной машины, а затем получить доступ к сайту. через http://homestead.app:4000 :

Снимок экрана рабочего демонстрационного приложения

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

Пользовательская тема

Мы перестроим тему Svbtle для работы со Spress.

Для более общей информации о темах в Spress, смотрите здесь .

Как работают темы в Spress

Каждое сообщение или страница, которые вы публикуете в Spress, имеет «метаданные переднего плана» — иными словами, немного специально отформатированного текста перед содержанием сообщения или страницы. Этот frontmatter определяет переменные, настройки и, как вы уже догадались, макет (тему) для использования. Это идентично тому, как работает Sculpin. Например, см. Образец поста «Добро пожаловать в Spress»:

 --- layout: "post" title: "Welcome to Spress" categories: [] tags: ["sample post", "posts"] --- To create a new post, simply runs `spress new:post` command or adds a file in the `./src/content/posts` folder that follows the convention `YYYY-MM-DD-name-of-post.md` .... 

Часть между разделителями ( --- ) в верхней части является frontmatter. В нем вы можете видеть (среди прочего) значение layout: "post" . Это буквально означает «найдите блок контента в файле макета post.twig и поместите содержимое под ним после того, как вы превратите его в HTML». Если мы сейчас посмотрим на post.twig в /src/layouts , мы увидим следующее:

 --- layout: default --- {% set isPostLayout = true %} {% block content %} {% include 'post.html' with { 'post': page } %} {% endblock %} ... 

Блок контента прямо здесь, готов к приему конвертированного контента MD. Помимо основного синтаксиса Twig, мы можем видеть, что у этого макета также есть некоторый frontmatter. Это вложенные макеты в действии: в то время как наш пост «Добро пожаловать в Spress» расширяет post.twig , сам post.twig расширяет default.twig — макет по умолчанию, который определяет CSS, JS и другие элементы, общие для всех страниц / постов. Таким образом, мы можем видеть, что система компоновки Spress практически идентична обычному использованию Twig, с той лишь разницей, что Spress использует frontmatter для определения наследования.

Создание темы

Таким образом, создание темы сводится к тому, чтобы просто поместить нужные CSS / JS в нужные места и слегка изменить шаблоны Twig.

Во-первых, давайте добавим немного нового CSS. Загрузите этот файл в /src/assets/css . Затем возьмите изображение профиля или логотип (если у вас его нет, используйте Adorable Avatars ) и сохраните его как src/assets/img/profile.png .

Все, что вы помещаете в src/assets копируется в /assets во время сборки.

Далее, давайте добавим этот CSS в наш раздел <head> . В /src/includes/head.html закомментируйте или удалите строки, которые добавляют к документу bootstrap.min.css и style.css , и добавьте лист svbtle.css , чтобы раздел выглядел примерно так:

 <link href="//maxcdn.bootstrapcdn.com/font-awesome/4.2.0/css/font-awesome.min.css" rel="stylesheet"> <link href="{{ site.url }}/assets/css/svbtle.css" rel="stylesheet" type="text/css" /> 

Давайте теперь изменим содержимое layout/default.html на:

 <!DOCTYPE HTML> <html lang="en"> <head> {% include 'head.html' %} </head> <body> <div class="sidebar"> <!-- Logo --> <div class="logo"> <a href="/" title="{{ site.title }}"> <span class="img"></span> </a> <a href="/" title="{{ site.title }}"> <h1>{{ site.title }}</h1> </a> </div> <!-- Description --> <div class="description"> Some blog posts by <a href="/about">me</a>. </div> <!-- Navigation --> <div class="navigation"> <a href="{{ site.url }}/blog">Archive</a> {#<a href="{{ site.url }}/blog/categories">#} {#<nobr>Categories & tags</nobr>#} {#</a>#} <a href="{{ site.url }}/about">About</a> </div> </div> <div id="main" class="container spresso-wrap"> {% block content %} {{ page.content }} {% endblock %} </div> <script src="//ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script> {% if site.code_highlight %} <script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/8.4/highlight.min.js"></script> <script>hljs.initHighlightingOnLoad();</script> {% endif %} {% block javascript %}{% endblock %} </body> </html> 

Содержимое layout/post.html должно стать:

 --- layout: default --- {% set isPostLayout = true %} {% block content %} <article class="post"> <header> <div class="title"><a href="{{ site.url }}{{ page.url }}">{{ page.title }}</a></div> </header> <div class="text"> {{ page.content | raw }} </div> </article> {% endblock %} {% block javascript %} {% if (page.comments is defined and page.comments) or (page.comments is not defined and site.comments.enabled) %} <script type="text/javascript"> var disqus_shortname = '{{ site.comments.disqus_shortname }}'; (function() { var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true; dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js'; (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq); })(); </script> {% endif %} {% endblock %} 

И содержимое src/content/index.html теперь должно быть:

 --- layout: "page" title: "Welcome Svbtle theme" generator: "pagination" provider: "site.posts" max_page: 5 sort_by: "date" --- {% for post in page.pagination.items %} <div class="date"> <a href="{{ post.url }}"> {{ post.date|date("d. F, Y") }} </a> </div> <article class="post"> <header> <div class="title"><a href="{{ site.url }}{{ post.url }}">{{ post.title }}</a></div> </header> <div class="text"> {% if '<!--more-->' in post.content %} {{ post.content | split('<!--more-->') | first | raw }} <footer><a href='{{ site.url }}{{ post.url }}' class='continue'> Read more </a> </footer> {% else %} {{ post.content | raw }} {% endif %} </div> </article> {% endfor %} {% if page.pagination.previous_page or page.pagination.next_page %} <nav id="pagination"> <div class="next"> {% if page.pagination.previous_page %}<a href="{{ site.url }}{{ page.pagination.previous_page.url }}">Newer Posts</a>{% endif %} </div> <div class="prev">{% if page.pagination.next_page %}<a href="{{ site.url }}{{ page.pagination.next_page.url }}">Older Posts</a>{% endif %} </div> </nav> {% endif %} 

В дополнение к смене темы, мы добавили небольшой микс в микс — во время рендеринга контента Spress будет искать HTML-комментарий <!--more--> в постах. Если он встретит его, он будет отображать содержимое только на главной странице и вызовет кнопку «Читать далее» внизу. Нажав на нее, читатель переходит на полную страницу поста и продолжает чтение. Большое спасибо @coderabbi за этот взлом .

Перестройте сайт сейчас с помощью CTRL+C чтобы остановить сервер и spress site:build --server чтобы обслуживать его, и мы должны увидеть, что наша вновь созданная тема применяется — это так просто!

Примечание: хотя создание тем относительно просто, их установка немного нелогична. Чтобы установить тему, необходимо эффективно клонировать новый сайт Spress, а затем вставить в него источники MD. Это обычно неудобно из-за разной структуры файлов, используемых в разных темах, но, как вы можете видеть выше, обычно это не требует большой работы.

Если мы посмотрим на наш сайт сейчас и отобразим его для разных размеров экрана, то увидим, что он работает нормально:

Рабочий Spress блог

Вывод

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

Вы используете статический или динамический блог? Почему? Вы пробовали Spress или вы все еще пользуетесь Jekyll, Sculpin или подобным инструментом? Дайте нам знать!