Org-mode. Экспорт ссылок на видео в Hugo

2025-07-03 · 3 мин. для прочтения

Org-mode. Экспорт ссылок на видео в Hugo

Содержание

1 Прагматика

  • Нужно экспортировать ссылки на видео не только в Hugo, но и в Markdown.
    • Неудобно прописывать это дважды.
  • Синтаксис видео во вкладках (см. Hugo. Видео во вкладках) не зафиксирован.
    • Пришлось переписывать все низкоуровневые вызовы при смене синтаксиса.
    • Хотелось бы зафиксировать форму записи.
  • Решение: использование макросов org-mode (см. Org-mode. Макросы).
  • Будем использовать синтаксис от вкладок jQuery (см. Hugo. Вкладки jquery).

2 Экспорт видео. Решение 1

  • Нужно экспортировать видео и в hugo, и в markdown.
  • Сделал следующие макросы:
    #+macro: youtube @@hugo:{{< youtube $1 >}}@@@@md:[![Youtube](http://img.youtube.com/vi/$1/0.jpg){width=560px}](http://www.youtube.com/watch?v=$1)@@
    #+macro: rutube @@hugo:{{< rutube $1 >}}@@@@markdown:[![RuTube]($2){width=560px}](https://rutube.ru/video/$1/)@@
    #+macro: plvideo @@hugo:{{< plvideo $1 >}}@@@@markdown:[![Платформа]($2){width=560px}](https://plvideo.ru/watch?v=$1)@@
    
  • Проблема: в hugo экспортируется и markdown.
  • Получаем излишнюю информацию при экспорте в hugo.

3 Экспорт видео. Решение 2

  • Используем подход с вычислением выражения на elisp:
    #+macro: youtube (eval (cond ((org-export-derived-backend-p org-export-current-backend 'hugo) (concat "@@hugo:{{< youtube " $1 " >}}@@")) ((org-export-derived-backend-p org-export-current-backend (or 'md 'markdown 'gfm)) (concat "@@html:[![Youtube](http://img.youtube.com/vi/" $1 "/0.jpg){width=560px}](http://www.youtube.com/watch?v=" $1 ")@@"))))
    #+macro: rutube (eval (cond ((org-export-derived-backend-p org-export-current-backend 'hugo) (concat "@@hugo:{{< rutube " $1 " >}}@@")) ((org-export-derived-backend-p org-export-current-backend (or 'md 'markdown 'gfm)) (concat "@@html:[![RuTube](" $2 "){width=560px}](https://rutube.ru/video/" $1 "/)@@"))))
    #+macro: plvideo (eval (cond ((org-export-derived-backend-p org-export-current-backend 'hugo) (concat "@@hugo:{{< plvideo " $1 " >}}@@")) ((org-export-derived-backend-p org-export-current-backend (or 'md 'markdown 'gfm)) (concat "@@html:[![Платформа](" $2 "){width=560px}](https://plvideo.ru/watch?v=" $1 ")@@"))))
    #+macro: vkvideo (eval (cond ((org-export-derived-backend-p org-export-current-backend 'hugo) (concat "@@hugo:{{< vkvideo oid=" $1 " id=" $2 " hd=2 >}}@@")) ((org-export-derived-backend-p org-export-current-backend (or 'md 'markdown 'gfm)) (concat "@@html:[![VKvideo](" $3 "){width=560px}](https://vkvideo.ru/video" $1 "_" $2 ")@@"))))
    
  • Здесь используются сокращения для видео:

4 Поддержка вкладок

  • Добавим макросы для поддержки вкладок:
    #+macro: begin_tabs @@hugo:{{< tabs $1 >}}@@
    #+macro: end_tabs @@hugo:{{< /tabs >}}@@
    #+macro: youtube-tab @@hugo:{{< tab "Youtube" >}}@@{{{youtube($1)}}}@@hugo:{{< /tab >}}@@
    #+macro: rutube-tab @@hugo:{{< tab "RuTube" >}}@@{{{rutube($1,$2)}}}@@hugo:{{< /tab >}}@@
    #+macro: plvideo-tab @@hugo:{{< tab "Платформа" >}}@@{{{plvideo($1,$2)}}}@@hugo:{{< /tab >}}@@
    #+macro: vkvideo-tab @@hugo:{{< tab "VKvideo" >}}@@{{{vkvideo($1,$2,$3)}}}@@hugo:{{< /tab >}}@@
    

5 Использование

  • Предполагается следующий сценарий использования (использовал видео, на которых отлаживал код):
    {{{begin_tabs("Создание виртуальной машины с Virtualbox")}}}
    
    {{{rutube-tab(0a52857a1fb8a79cbf58fcb58d2d8593,https://pic.rutubelist.ru/video/2025-07-02/63/b4/63b485f63c7a400611064eb35be3ffa1.jpg)}}}
    
    {{{plvideo-tab(Dncja2upfmNQ,https://s-dt-rt1.cloud.edgecore.ru/fp-2025-07-cover/Dncja2upfmNQ/f91849ab-8ad2-4795-9fce-3525054e4bce.jpg)}}}
    
    {{{vkvideo-tab(-230024722,456239038,https://sun1-18.userapi.com/QhNtwM8UkVfXj44arwC4cvAW9XTPzBQiboJaPA/ZvwM3lG9Da4.jpg)}}}
    
    {{{youtube-tab(WwYYYIQdUTk)}}}
    
    {{{end_tabs}}}
    
Создание виртуальной машины с Virtualbox

6 Загрузка при старте emacs

  • Будем загружать эти макросы при старте emacs:
    (setq org-export-global-macros
          '(
            ("youtube" . "(eval (cond ((org-export-derived-backend-p org-export-current-backend 'hugo) (concat \"@@hugo:{{< youtube \" $1 \" >}}@@\")) ((org-export-derived-backend-p org-export-current-backend (or 'md 'markdown 'gfm)) (concat \"@@html:[![Youtube](http://img.youtube.com/vi/\" $1 \"/0.jpg){width=560px}](http://www.youtube.com/watch?v=\" $1 \")@@\"))))")
            ("rutube" . "(eval (cond ((org-export-derived-backend-p org-export-current-backend 'hugo) (concat \"@@hugo:{{< rutube \" $1 \" >}}@@\")) ((org-export-derived-backend-p org-export-current-backend (or 'md 'markdown 'gfm)) (concat \"@@html:[![RuTube](\" $2 \"){width=560px}](https://rutube.ru/video/\" $1 \"/)@@\"))))")
            ("plvideo" . "(eval (cond ((org-export-derived-backend-p org-export-current-backend 'hugo) (concat \"@@hugo:{{< plvideo \" $1 \" >}}@@\")) ((org-export-derived-backend-p org-export-current-backend (or 'md 'markdown 'gfm)) (concat \"@@html:[![Платформа](\" $2 \"){width=560px}](https://plvideo.ru/watch?v=\" $1 \")@@\"))))")
            ("vkvideo" . "(eval (cond ((org-export-derived-backend-p org-export-current-backend 'hugo) (concat \"@@hugo:{{< vkvideo oid=\" $1 \" id=\" $2 \" hd=2 >}}@@\")) ((org-export-derived-backend-p org-export-current-backend (or 'md 'markdown 'gfm)) (concat \"@@html:[![VKvideo](\" $3 \"){width=560px}](https://vkvideo.ru/video\" $1 \"_\" $2 \")@@\"))))")
            ("begin_tabs" . "@@hugo:{{< tabs $1 >}}@@")
            ("end_tabs" . "@@hugo:{{< /tabs >}}@@")
            ("youtube-tab" . "@@hugo:{{< tab \"Youtube\" >}}@@{{{youtube($1)}}}@@hugo:{{< /tab >}}@@")
            ("rutube-tab" . "@@hugo:{{< tab \"RuTube\" >}}@@{{{rutube($1,$2)}}}@@hugo:{{< /tab >}}@@")
            ("plvideo-tab" . "@@hugo:{{< tab \"Платформа\" >}}@@{{{plvideo($1,$2)}}}@@hugo:{{< /tab >}}@@")
            ("vkvideo-tab" . "@@hugo:{{< tab \"VKvideo\" >}}@@{{{vkvideo($1,$2,$3)}}}@@hugo:{{< /tab >}}@@")))
    
Дмитрий Сергеевич Кулябов
Authors
Профессор кафедры теории вероятностей и кибербезопасности
Мои научные интересы включают физику, администрирование Unix и сетей.