Вместо предисловия
Значит, товарищи, собрался я на выходных с силами и сообразил сабж. Всякие-разные блоги веду года с двадцатого, движков перепробовал уйму, — «Вордпресс», «Эгею», «Гост», — ничто не прижилось! Уж думал вообще плюнуть и блог закрыть, однако желание собирать из букв интересные слова и предложения оказалось сильнее. Причём настолько сильнее, что его хватило на разработку собственного движка!
Я всегда был и остаюсь приверженцем минимализма во всех сферах жизни. Сайт мне тоже свой хотелось облагородить и упростить — оставить на нём только всё самое необходимое, и чтобы красиво ещё было. И вот, обнаружив себя с пару дней назад за чтением RFC мне подумалось: «Чёрт возьми, как же хорошо эти документы оформлены!», после чего свету явилась Та Самая Гениальная Идея™.
За два дня очень и очень продуктивной работы мне удалось склепать MVP, благодаря чему теперь у нас есть, вероятно, один из самых минималистичных движков для блога. Он вышел настолько минималистичным, что вместо HTML предлагает всем читателям text/plain (и только его), благодаря чему посты читать можно не отходя от терминала. Нет, вы только вдумайтесь: никакого HTML, никакого CSS, никакого JavaScript! Пир духа!
Зачем
Что оно умеет
Прежде всего оно довольно умело справляется со своей основной задачей: рендерить посты из обычного плейнтекста в красиво оформленный плейнтекст. Посты благодаря этому можно читать плюс-минус везде, где есть интернет. Например, в терминале:
Или с экрана смартфона:
Поскольку движок возвращает честный плейнтекст без хоть какого-либо намёка на HTML, на экранах мобильных телефонов вёрстка текста бы поплыла, поэтому пришлось извращаться: сейчас я по юзерагенту отлавливаю таких пользователей и показываю им версию с правильной шириной абзаца.
Всякие-разные нюансы
Создание нового поста
Достаточно просто положить текстовый файл с расширением .txt
в папку /weblog/
, после чего движок самостоятельно добавит его в общую ленту постов. За неимением у движка базы данных все данные о посте подтягиваются из этой папки: название поста — название файла без расширения, дата публикации поста — дата создания или внесения изменений в файл.
Движок поддерживает категоризацию: чтобы поместить пост в какую-нибудь категорю, нужно просто создать для неё папку и положить туда файл с текстом поста. Например, если положить пост в папку /weblog/tech/
, посту будет присвоена категория «Tech».
Если добавить к названию файла тильду, то его название в ленте постов будет заменено на астеризм (три звёздочки):
Ссылки к постам
Первые версии блога не отображали ссылки к постам, хотя такие наличествовали. Их нужно было угадывать исходя из названия поста. Это было так себе, поэтому в итоге добавил конфигурируемую опцию show_urls
с возможными вариантами Full
(полный URL), Short
(укороченный вариант) и Off
(не показывать вовсе).
Выглядит это дело следующим образом:
Отображается на главной, в постах по категориям и по датам. Если перейти по ссылке на конкретный пост, то его URL не будет включён в рендер, потому как он уже присутствует в адресной строке браузера.
Движок умеет отображать посты /по-ссылке-с-названием-поста/
, по году, месяцу и дню (например, /2023/
или /2024/04/14/
) и по категории (например, /tech/
). Выглядит это вот так:
RSS
Здесь всё просто: по пути /rss/
движок генерирует валидный RSS. Если перейти по /rss/название-категории/
, то движок сгенерирует ленту постов для выбранной категории. Удобно, если хочется не читать у автора все посты подряд, а подписаться только на то, что интересно.
sitemap.xml
Штука для всяких поисковых движков а-ля гугль. Генерирует XML, содержащий в себе полный перечень постов вкупе с датами их обновления. Таким образом поисковой движок сможет узнать, если автор опубликовал новый пост или изменил содержание уже ранее опубликованного.
Бонусные фичи
Поиск постов
Кажется, что если нет обёртки в виде HTML и JavaScript, то поиск никак не реализовать. Однако всё гениальное — просто, и в этом нам поможет сам браузер: поскольку на главной странице блога отображаются все посты, любой из них можно найти при помощи встроенного в браузер поиска.
Страница ошибки 404
Туда иногда приходит котик :-)
Название заметки.txt
Вместо слэша после названия заметки в её урле можно использовать .txt
. Пример: https://renecoignard.com/weblog.txt
вместо https://renecoignard.com/weblog/
. С отображением постов по категориям тоже работает: https://renecoignard.com/meditations/
.
Тёмная тема
Если, например, в «Хроме» включить тёмную тему, она волшебным образом автоматически применится и в блоге.
Вот такие пироги (с котятами). Пользуйтесь на здоровье!
Утащить себе исходники можно туть:
Минимализм это очень хорошо, но вот необходимость кучи костылей, тогда когда это не то чтобы необходимо. Особенно в том вопросе что отсутствие поддержки ссылок для перехода куда то это очень, очень больно.
Почему было не сделать возможность рендерить посты в минимальном HTML, это решит костыли с рендерингом на телефонах, позволит использовать нормальные кликабельные ссылки, а для совместимости с curl'ом просто сделать поддержку Accept: text/plain и отдавать в этом случае как раз таки текстовый рендеринг поста. Ну либо банально в зависимости от расширения отдавать пост
/blabla/ - пост в минималистичном html
/blabla/.txt - пост в текстовом виде
/blabla/.json - пост в json'ке.
Пока я читал, мне пришло в голову несколько похожих форматов.
Во-первых, RSS. Правильно написанный RSS может транслировать весь блог, а клиент сам разберется с какими стилями его показывать пользователю.
Во-вторых, Gopher или Gemini. Это протоколы для ребят, уставших от современного жирного веба. Почитай, может, тебе понравится!
В-третьих, да нет никаких третьих. Рене, ты сделал прикольную штуку!
Мне нравится! Можно было может еще шрифт более газетным сделать для антуража?)
Идея охренительная! Но вот без поддержки хотя бы активных ссылок - сложновато использовать, и в тех же RFC они есть.