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:[{width=560px}](http://www.youtube.com/watch?v=$1)@@ #+macro: rutube @@hugo:{{< rutube $1 >}}@@@@markdown:[{width=560px}](https://rutube.ru/video/$1/)@@ #+macro: plvideo @@hugo:{{< plvideo $1 >}}@@@@markdown:[{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:[{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:[{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:[{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:[{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}}}
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:[{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:[{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:[{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:[{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 >}}@@")))