Ghost - теги и категории
Практически все мои посты за последнее время посвящены одной теме - платформе для ведения блогов Ghost. И это не удивительно, так как я развернул ее у себя и пытаюсь вести с ее помощью собственный блог. Попутно, происходит знакомство с самим продуктом, его особенностями и философией. А так как в процессе этого познания случаются открытия - вот и появляются все новые посты. А сейчас, для затравки и в качестве отдушины, немного размышлений.
Есть такая классная штука, как теги. Она позволяет привязать к некоторой информации специальные метки, которую будут эту информацию как-то характеризовать (или описывать). Альтернативной технологией является технология категоризации, когда информация относится к той или иной категории.
Отличием категоризации от технологии тегирования, на мой субъективный взгляд (я так ощущаю), является строгая скруктуризация категорий. То есть, категоризация позволяет выстроить дерево, и интересующая нас информация будет представлена на нем уникальным листом - она будет присутствовать только в единственном месте этого дерева. Теги не предполагают структуризации, и, хотя, логическую иерархию можно и создать, но явного дерева зависимостей вы не строите. Это дает возможность характеризовать интересующую нас (или вас) информацию с разных сторон, не продумывая сложную систему категорий. Количество тегов, которые могут быть назначены информации - не ограничено.
У обоих подходов есть свои слабые и сильные стороны, которые и определяют сценарии их использования. На мой взгляд, категории и структуры на их основе, должны продумываться очень тщательно, иногда - вместе с самим программным обеспечением, так как они, довольно часто, оказываются сильно связанными со многими решениями, принимаемыми в процессе написания программы, (причем, зависимость эта - взаимная). Происходит это потому, что категории, зачастую, являются характеристиками той области деятельности, в которой и предполагается использование создаваемого программного обеспечения. Создание категорий, в принципе, можно отдать на откуп пользователей, но существует довольно большая (иногда, стремящаяся к 100%) вероятность того, что пользователи накатегоризируют такого, что ПО может и не переварить. А вот теги - это то, что можно спокойно поручить пользователям, так как никакие программные решения не строятся на базе тегов. По сути, теги - эта такая же информация, как и любая другая, создаваемая в процессе эксплуатации программы. Но, подчеркну, это лишь мое личное восприятие этих понятий, и я не претендую на то, что оно (абсолютно) верно.
В блоге теги очень к месту. Благодаря им, можно любой пост снабдить какой угодно меткой (или, ярлыком), которая только может прийти на ум. Если так же поступать с категориями, то, очень быстро, навигация по категориям станет просто невозможной. Ну, или, очень неудобной. А вот с тегами такого не происходит, потому, что они не взаимосвязаны и не имеют ограничений на взаимное использование. Но и категории в блоге могут быть весьма востребованными, потому что именно способность структурировать информацию, при правильном подходе, позволяет получить очень логичную и удобную навигацию. В общем, "за единство и борьбу противоположностей", так сказать.
Теперь вернемся к Ghost. На этой платформе (однозначно) есть возможность назначать постам теги - сколько и какие угодно. Сами авторы (ну, или не авторы, но лица весьма приближенные) считают, что реализованные ими теги и есть замена категориям (да, практически так и пишут). Но, как мне кажется, тут они слегка (или слишком?) перегибают палку. Все-таки, единственность назначенной категории, в некоторых сценариях использования, трудно переоценить. Видимо, осознание этого стало доходить и до авторов Ghost (а, может, они знали это с самого начала). Поэтому, начиная с версии 1.2.0, среди тегов появился "равный среди равных" - первый тег. То есть, теперь имеет значение, какой тег вы указали первым. Сделан даже специальный пользовательский интерфейс, позволяющий вам легко пересортировывать теги. Меня не оставляет ощущение, что "первый тег" - просто замечательный кандидат для переименования в "категорию". Пока нет возможности строить иерархии "первых" тегов, но слово "пока" может оказаться ключевым.
Работа с тегами в Ghost лично у меня не вызывает никаких нареканий. Назначаются они в настройках поста, достаточно просто набирать текст в соответствующем элементе ввода:
Если набираемый текст входит в какой-то из существующих тегов, то предлагается отфильтрованный список, из которого можно осуществить выбор, сократив время тегирования. Если же такого тега нет, его можно создать тут же, как говориться, "не отходя от кассы".
Кроме того, на картинке выше, можно видеть эффект перетаскивания тега с целью упорядочивания и выбора "первого" тега.
Помимо интерфейса назначения тегов постам, есть еще отдельный интерфейс, позволяющий уточнять и детализировать теги:
Как видно, можно давать описание, поясняющее суть тега, назначать картинку, указывать URL для страницы, отображающей посты, к которым прикреплен данный тег. Есть также цифра, показывающая, какому количеству постов назначен данный тег. В общем, все довольно хорошо. Ниже приведена картинка, отображающая список постов с тегом Ghost
:
Если внимательно присмотреться, то можно увидеть, что в карточке поста отдельно указан "первый" тег (я пользуюсь темой Casper, которая является темой
В общем, выгрузил я свою модифицированную тему Casper и стал рыться в документации на предмет того, что можно подправить, чтобы отображать список тегов, назначенных посту - и на карточке, и на странице. Надо сказать, что Ghost не так прост. Очень многое в нем реализовано при помощи интересного языка с названием Handlebars. Язык этот предназначен для облегчения создания шаблонов, а в Ghost на основании шаблонов и строятся все темы.
Первым делом я взялся за документацию Ghost. Оттуда я почерпнул много полезной информации про наполнение и структуру тем. Так, выяснилось, что файл post.hbs
, который я правил, добавляя комментарии от Google+, есть не что иное, как шаблон страницы поста. И если я хочу вывести в посте список тегов, то править мне опять этот файл.
Далее, еще немного штудирования документации и становится понятно, как можно достучаться до тегов, назначенных посту. Немного подумав, я решил, что на странице поста будет неплохо вывести теги над рисунком, сразу под заголовком. И вот, что получилось:
Все четыре тега перечислены чуть ниже заголовка и над картинкой поста. К такому результату привел вот такой вот фрагмент кода:
...
<header class="post-full-header">
<section class="post-full-meta">
<time class="post-full-meta-date" datetime="{{date format="YYYY-MM-DD"}}">{{date format="D MMMM YYYY"}}</time>
{{#primary_tag}}
<span class="date-divider">/</span> <a href="{{url}}">{{name}}</a>
{{/primary_tag}}
</section>
<h1 class="post-full-title">{{title}}</h1>
</header>
{{!-- Эту строку внизу добавил я, чтобы отобразить список тегов поста --}}
{{tags separator=" • "}}
{{#if feature_image}}
...
Далее дело было за карточкой поста, которая отображается в списке постов. Наделенный уже некоторыми знаниями, я довольно быстро сообразил, что за отображения карточки поста отвечает файл post-card.hbs
из каталога partials
. В карточке, однако, место между картинкой и заголовком поста оказалось занятым - там красовался "первый" тег. Поэтому я решил отобразить список тегов под выдержкой из текста. Собственно, к чему это привело - видно на картинке с карточкой поста (список тегов расположен внизу, над указанием автора поста). А вот и фрагмент текста файла post-card.hbs
:
...
</section>
</a>
<footer class="post-card-meta">
{{!-- Эту строку внизу добавил я, чтобы отобразить список тегов поста --}}
<p>{{tags separator=" • "}}</p>
{{#if author.profile_image}}
<img class="author-profile-image" src="{{author.profile_image}}" alt="{{author.name}}" />
{{/if}}
<span class="post-card-author">{{author}}</span>
</footer>
</div>
...
Все, что потребовалось - добавить одну строку.
Но, на самом деле, есть еще кое-что, чего я еще не сделал, но очень хочется. Речь идет о том, чтобы сделать что-то похожее на облако тегов. Но тут, явно, одной строчкой не обойтись. Надо будет еще немножко (или "множко"?) подучиться и пробовать, пробовать, пробовать...