После многолетнего перерыва я решил возобновить ведение блога. Cтарый блог я забросил в один прекрасный момент, когда решил написать свой генератор статических сайтов на основе Org mode взамен используемому мной форку генератора org-page. Писать новые статьи планировалось параллельно с запилом своего генератора, но в итоге дальше самой идеи и нескольких коммитов в форк org-page дело так и не пошло.

Недавно возросшее с новой силой желание чего-нибудь написать заставило меня вернуться к теме блога. Трезво оценив свои шансы создать за приемлемое время с нуля генератор статических сайтов, удовлетворяющий мои потребности, я отказался от этой затеи. Так как я большой фанат Emacs и Org mode, я решил разузнать, как поменялись в среде Org mode за это время дела на фронте блогинга.

Проглядев список генераторов для файлов .org, я не нашёл подходящего решения, которое работало бы нативно в Emacs (а оригинальный org-page вообще за это время прекратил и без того не особо активное развитие). К моему удивлению, довольно-таки продвинутый и активно развиваемый сообществом генератор статических сайтов Hugo, написанный на Go, недавно обзавёлся вполне сносной встроенной поддержка формата Org-mode с внедрением библиотеки парсинга и рендеринга Org mode-файлов go-org. Так как список поддерживаемых им фич, из-за которых я и задумал изначально переписать org-page (быстрая публикация, развитая система управления коллекциями, live reloading), меня полностью удовлетворял, я решил остановиться на этом проекте.

Установка

Так как я использую пакетный менеджер Nix, то для установки зависимостей для ведения блога я воспользовался nix-shell. Pinned-версия nixpkgs (на <2019-07-02 Tue>):

  import (builtins.fetchGit {
    name = "nixos-unstable-2019-07-02";
    url = "https://github.com/nixos/nixpkgs";
    rev = "1556781737d75688f240485ed448b4b4184ca882";
  })
Файл pkgs.nix

Так как версия Hugo с новой библиотекой go-org ещё не вышла, мне пришлось опакетить текущую development-версию. Для этого я взял за основу официальный пакет и изменил атрибут src:

  { stdenv, buildGoModule, fetchFromGitHub }:

  buildGoModule rec {
    name = "hugo-${version}";
    version = "b2a3d4644bb5a505db662b2927af6f80856a3076";

    src = fetchFromGitHub {
      owner  = "gohugoio";
      repo   = "hugo";
      rev    = version;
      sha256 = "19m296vsq5f1fmrl9mizjvqbvfxgd7pis3mdpss2wp199hryqwi7";
    };

    modSha256 = "15f50wsc0vkp9wf1mz5q98xc4a4yx7yracgmy5yr1czdg04d2laa";

    subPackages = ["."];

    buildFlags = "-tags extended";

    meta = with stdenv.lib; {
      description = "A fast and modern static website engine.";
      homepage = https://gohugo.io;
      license = licenses.asl20;
      maintainers = with maintainers; [ schneefux ];
    };
  }
Файл hugo/default.nix

И, наконец, конфигурация nix-shell:

  { pkgs ? import ./pkgs.nix {}
  }:

  let
    inherit (pkgs) mkShell callPackage;

    hugo = callPackage ./hugo {};
  in mkShell {
    buildInputs = [hugo];
  }
Файл shell.nix

Настройка

Создав новый блог с помощью команды hugo new site, я первым же делом установил тему Terminal (green):

  $ git submodule add \
      https://github.com/panr/hugo-theme-terminal.git themes/terminal

Начав писать эту запись, я между делом менял конфигурацию Hugo и темы:

  baseURL = "https://maximov.space"
  languageCode = "ru"
  defaultContentLanguage = "ru"
  title = "Untitled"
  subtitle = "Emacs, Programming, and Anything"
  theme = "terminal"
  paginate = 5
  copyright = """
  <span>© 2019 Powered by <a href="http://gohugo.io">Hugo</a></span>
  <span>Theme made by <a href="https://twitter.com/panr">panr</a></span>
  <span><a href="http://creativecommons.org/licenses/by-sa/4.0/">CC-BY-SA 4.0</a></span>
  """

  [permalinks]
    posts = "/:section/:year/:month/:day/:filename"

  [params]
    contentTypeName = "posts"
    themeColor = "green"
    showMenuItems = 2
    fullWidthTheme = false
    centerTheme = true

    [params.logo]
      logoText= "Untitled"

  [taxonomies]
    tag = "tags"

  [languages]
    [languages.ru]
      readMore = "Читать дальше"
      menuMore = "Ещё"
      subtitle = "Emacs, Programming, and Anything"
Файл config.toml

Так как тема некорректно отображала подписи к коду и сноски (footnotes), я создал файл static/style.css, в котором переопределил некоторые стили. Также я скачал кастомную сборку Prism (библиотеки подсветки синтаксиса), изменив список поддерживаемых языков и плагинов, и сохранил её в static/assets/prism.js.

Результат

Исходники нового блога можно посмотреть здесь. В следующих постах я опишу процесс миграции старых записей и деплой блога.