Накостылил Gemican - это как Pelican, только для Gemini

Оказывается, рекреационное программирование (это когда код пишется не для коммерческой выгоды и не от отсутствия приемлемых альтернатив, а чисто для удовольствия от самого процесса) доступно даже презренным гуманитариям.

Опубликовано: 2024-12-29

Категория: Gemini

Теги: gemican pelican gemini sh neovim nvim

В силу исторических причин, свой веблог я вел с использованием генератора статических сайтов Pelican - в своё время он первым попался мне на глаза, а потом просто привык... Я пару раз смотрел в сторону альтернативных решений, вроде Hugo или Hexo, но функционально они все похожи настолько, что смысла что-то менять я не увидел.

А тут, вот, обзавелся я гемлогом в этом вашем геминиспейсе. И возник у меня естественный вопрос: есть ли тут подобные Pelican решения? Разумеется, есть! Прежде всего, есть плагин непосредственно для Pelican, позволяющий генерировать одновременно сайт для веба и капсулу для Gemini - правда, он только с исходниками в формате .rst дружить умеет, а Markdown в пролете.

=> Вот тут он, этот плагин для Pelican.

Далее: есть что-то подобное и для Hugo, а также есть нативные решения - я их описания нескольких почитал и всё мне что-то не нравилось в них. Одно предлагают держать, например, метаинформацию статей в отдельных yaml-файлах, другое выставляет жесткие требования к именованию файлов, третье не поддерживает концепции тегов... В общем, всё не то, что мне нужно.

=> Кому любопытно, сами посмотрите на awesome-gemini

А что мне, собственно, нужно-то? Требования таковы:

Ну и поскольку ничего удовлетворяющего всем вышеописанным требованиям сразу я с наскока не нашел, я решил написать собственный аналог Pelican для Gemini - назвав его Gemican. А поскольку программированию меня сколько-нибудь систематически обучали только на Microsoft Quick Basic в школьные годы, ну плюс в те же седые годы я самостоятельно осваивал Turbo Pascal под DOS - вариантов на чём писать у меня оказалось немного. На shell-скрипте, с применением консольных вкусняшек и всяких там sed/awk (тоже ведь языки, чо). Потому что ничего другого я не умею...

Собственно, встречайте: скрипт-портянка, реализующая все вышеописанные требования:

=> gemican.sh

Скрипт деплоя поставляется отдельно и тут я его не привожу по причине примитивности (скинуть архив по ssh/scp на удаленный хост, а там его по cron уже соответствующий скрипт самостоятельно положит куда надо).

ДИСКЛЕЙМЕР: да, я знаю, что за такой код в приличном программистском сообществе принято бить по пальцам ребром клавиатуры и всячески высмеивать. Но гуманитарии сраму не имут - работает же, чего тебе ещё, собака, надо? Зато без AI написано, стопроцентная органическая продукция кожаного мешка. Впрочем, я не думаю, что кого-то это поделие вообще заинтересует. И еще, если вдруг: работа скрипта протестирована в OpenBSD 7.6 со штатной оболочкой ksh - я стремился избегать всяческих "башизмов" и "кейшизмов" и быть ближе к духу POSIX shell, но все же не могу гарантировать, что оно будет работать везде. Например, по ходу написания скрипта я нашел пару-тройку различий в поведении BSD-версий awk и sed от их GNU-аналогов.

В двух словах, работает оно так: в корне локального "проекта" вашего гемлога предполагается наличие одного каталога с исходниками статей в формате gmi и прочим сопутствующим контентом. Название по умолчанию - "content", можно поменять в настройках (они в начале самого файла скрипта). Название файлов статей - любое, расширение .gmi обязательно. Сгенерированный для публикации контент размещается в каталоге "output" (название тоже можно поменять в настройках).

Статьи обязаны содержать заголовок - он будет использован как название статьи (первый заголовок любого уровня принимается за таковое). Также предполагается наличие строки с датой публикации в формате "Опубликовано: YYYY-MM-DD", хотя если она не указана, датой публикации будет считаться текущая системная дата на момент генерации контента (это, кстати, позволяет иметь "запиненную" в верху хронологического списка статью/статьи). Время публикации намеренно делать не стал - я редко пишу больше одной статьи за день (на всякий случай: о этой причине внутри дня порядок хронологии не гарантирован).

Опционально может быть указана "Категория: " (если отсутствует, то будет применена дефолтная категория "Blog" - тоже можно поменять в настройках). "Теги: " - указываются опционально, в любом количестве (через пробел). И, наконец, "Статус: " - имеет значение только указание там "черновик", любой другой статус (а равно его отсутствие) трактуется как готовность материала к публикации.

Ключи командной строки:

P.S. Ну и чтоб два раза не вставать, заодно в любимом редакторе neovim я настроил подсветку синтаксиса для gemtext используя плагин gemini-vim-syntax:

=> плагин gemini-vim-syntax

а также я включил автоперенос строк и проверку орфографии для gemtext-файлов, добавив в ~/.config/.nvim/after/ftplugin/gemtext.lua следующие строки:

vim.opt.spell = true
vim.opt.spelllang = "en,ru"
vim.opt.linebreak = true

P.P.S. Теперь у меня в планах написать конвертер для всех моих ранних статей из веблога (они в Markdown и с метаданными для Pelican) в формат, пригодный для Gemican - для последующей миграции в гемлог.

Proxy Information
Original URL
gemini://muu-online.ru/2024/12/gemican.gmi
Status Code
Success (20)
Meta
text/gemini;
Capsule Response Time
294.271026 milliseconds
Gemini-to-HTML Time
1.085909 milliseconds

This content has been proxied by September (ba2dc).