Привет, мир!

Я наконец запустил свой блог. Здесь я буду писать про технологии и, если получится, общество. Выглядит так себе? Это собственный движок на Go со стандартной темой bootstrap. Так главная страница открывается в два раза быстрее голого WP, и мне приятнее работать с Markdown, чем со встроенным в WP редактором. Для простоты разработки в качестве СУБД был выбран Mongo. Стандартными средствами без необходимости использования сторонней ORM и миграций описывается модель статьи:

type Article struct {
	ID        uuid.UUID          `bson:"id"`
	Title     string             `bson:"title" json:"title"`
	Content   string             `bson:"content" json:"content"`
	CreatedAt primitive.DateTime `bson:"created_at"`
	UpdatedAt primitive.DateTime `bson:"updated_at"`
	Tags      []string           `bson:"tags" json:"tags"`
}

Этого достаточно для описания всей базы, с которой здесь ведётся работа.

Интерфейс редактора построен на базе showdown и состоит из текстового поля и триггера на изменение: Редактор В базе я храню Markdown для удобства редактирования, так что сервер рендерит контент при помощи gomarkdown. Для подсветки синтаксиса подключен highlight.js, автоматически реагирующий на разметку gomarkdown.

Из-за того что в блоге есть уже несколько интерактивных фреймов, парсер Markdown на Go модифицирован для распознавания собственных выражений вида @Rick Astley - Never Gonna Give You Up(https://www.youtube.com/embed/dQw4w9WgXcQ) для встраивания html-тега iframe c адаптивной шириной и высотой, ссылающегося на указанный в скобках адрес, с атрибутом title равным значению между символами '@' и '(' (title — рекомендуемый но необязательный атрибут: если символы @( идут подряд, тег будет добавлен без него). Это было практически необходимо, т.к. showdown (для превью на событии ввода при редактировании) визуализировал все inline-html-теги и перезагружал фрейм. До замены фрейма в превью текстом выражения, после добавления <iframe src="..."> к записи редактор статей подходил только для переноса текста из буфера обмена.

Для всех встраеваемых через ![]() изображений, если они находятся локально (путь начинается с /files/) и доступны для чтения относительно рабочей директории сервера, выполняется чтение метаданных для использования высоты и ширины изображения в атрибутах height и width чтобы отобразить правильный размер блока сразу после загрузки страницы, ещё до загрузки источника.

Теги задаются через файл конфигурации, так что возможно переиспользование движка под любую тематику без необходимости пересобирать исходники.

Кстати образ движка есть на Dockerhub. Если вам, как и мне, надоел Wordpress, смело берите на вооружение. Пример docker-compose.yaml:

version: '3'

services:
  mongo:
    image: mongo

  blog:
    image: heymoon/golang-blog:latest
    volumes:
      - ./files:/etc/blog/files
      - ./config.json:/etc/blog/config.json:ro
    ports:
      - "8080:80"
    environment:
      - MONGO_URI=mongodb://mongo
      - USER=${USERNAME:-admin}
      - PASS=${PASSWORD:-admin}
      - ADDR=:80

И раз уж это первая запись здесь, упомяну, что название “heymoon” это отсылка к любимому треку Джона Мауса: https://youtu.be/Av5Jb52yFBo