Настало время, официально запускаю свой блог 🎉
В открывающей статье расскажу как блог был написан. Если коротко, то я написал простенькую утилитку - milky
, это просто генератор HTML страниц из markdown формата. Ради ознакомления исходный код открыт и лежит в соответствующем репозитории
О чём будет блог?
В основном о программировании, преимущественно на языке Rust 🦀
Пока в задумке есть несколько идей, но тем не менее, буду рад если кто-то предложит какую-то тему про что я бы мог написать, если вам будет интересно
На каком языке будет блог?
Я долго думал на каком языке вести свой блог. С одной стороны, ради большего охвата аудитории разумнее всего писать на английском. Однако, так уж вышло, я очень хочу развивать местное русскоязычное сообщество. Да и всё равно много текста так или иначе пришлось бы переводить. Так почему бы сразу не сделать доступными два языка? В перспективе, можно и больше, если вдруг кто поможет перевести какие-нибудь статьи на ещё какой-нибудь язык. Генератор изначально устроен так, что поддерживает произвольное количество переводов одной и той же статьи 🥰
Спасибо, часть анонса окончена! Чтобы не публиковать блог пустым, я также написал одну полноценную статью про трейты. Продолжение напишу для тех кому интересны технические подробности реализации
Внутреннее устройство
Немного остановлюсь подробнее на реализации. Весь генератор написан, само собой, на Rust. Генератор создает простые статические HTML страницы без каких-то дополнительных приколов. Также весь визуальный дизайн разработан и сверстан с нуля (местами криво 😗)
Генератор намеренно минималистичен и имеет только самые необходимые зависимости:
maud
- шаблонизатор HTMLpulldown-cmark
- парсер markdown-аserde
- сериализацияsyn
- простой парсер Rust кодаtime
- задавать дату публикации статьиtoml
- формат для конфигурации и хранения метаданных
Интересно, что Rust часто представляется как "системный" язык программирования для написания каких-то сложных и требовательных к производительности штук. Но так ли Rust хорош для чего-то просто и высокоуровневого, вроде генератора страниц для блога? Что же, исходный код открыт, поэтому вы запросто можете сами убедиться насколько данный вопрос справедлив
Да, в проекте довольно много лайфтаймов, чего только стоит структура с данными для генерации страницы:
pub struct Make<'art> {
pub l: Localizer<'art>,
pub blog: &'art str,
pub title: &'art str,
pub translations: &'art mut dyn Iterator<Item = Translation>,
pub social: &'art [Social],
pub target: Target<'art>,
}
pub enum Target<'art> {
List(&'art [Post<'art>]),
Article {
md: &'art str,
date: Date,
index_href: String,
deps: &'art mut HashSet<Box<str>>,
},
}
pub fn make(make: Make<'_>) -> maud::Markup {/**/}
Но на самом деле, если приглядется то тут всего один общий лайфтайм 'art
- это всего лишь время жизни заимствования ссылок на данные для генерации, которые нужно только чтобы временно передать их в функцию make
и не более того. Остальные лайфтаймы также довольно очевидны и как правило представляют из себя временное заимствование для какого-то этапа генерации. В остальном код довольно прост и прямолинеен
Конфигурация
Конфигурация задаётся в файле Milky.toml
в подобном формате:
[blog]
title = "Nano Memories"
[article.hello_blog]
ru = { title = "Открытие Блога!" }
en = { title = "Blog Opening!" }
[[social]]
href = "https://github.com/nanoqsh"
icon = "gh"
Также в toml файлах описываются языковые локализации и сохраняются метаданные
Дальнейшее развитие
В целом, могу сказать что разработка доставила довольного много фана. Тот самый процесс, когда планируешь написать немного кода, а потом выясняешь что нужно что-то ещё, а потом ещё. Ну и конечно, первый опыт написания хоть каких-то более-менее полноценных статей ❤️
На данный момент в задумке ещё много улучшений, но этим я займусь позже. Какой же может быть блог без тегов? А пока прошу подписаться на мои соц-сети которые я предусмотрительно добавил в футер 🐾