Открыть относительный путь Pelican в организационном режиме emacs

Я использую Pelican, генератор статических сайтов, чтобы создать персональную вики или базу знаний в формате html, используя .org файлы в качестве база. Ссылки на внутреннее содержимое в Pelican используют синтаксис {filename}/path/to/file. Однако, поскольку я использую emacs в организационном режиме, я также хотел бы иметь возможность переходить по таким ссылкам на соответствующие файлы в организационном режиме. Я надеюсь, что я мог бы написать простую функцию, которая позволила бы org-mode перейти по такой ссылке и открыть соответствующий файл, не ставя под угрозу использование Pelican внутреннего синтаксиса ссылки. Я подозреваю, что это можно сделать с помощью org-add-link-type и функции, которая анализирует правильный абсолютный путь к файлу. Но мой элисп-фу слаб, и я не уверен, что делать дальше. Помощь приветствуется!

Изменить: в качестве примера у меня может быть ссылка типа [[file:{filename}/path/to/file.org]] в файле org. Есть ли способ заставить org открыть файл, заменив (возможно, через регулярное выражение?) абсолютный путь к файлу на {filename}, но при этом не изменив исходную ссылку, чтобы Pelican мог ее правильно обработать?


person mclear    schedule 01.05.2016    source источник
comment
Является ли {filename} буквальной строкой, которая всегда одинакова?   -  person John Kitchin    schedule 02.05.2016
comment
{filename} всегда одно и то же, да. Вы можете посмотреть информацию о внутренних ссылках здесь если вам интересно.   -  person mclear    schedule 02.05.2016


Ответы (2)


Я думаю, вы хотите что-то вроде:

#+BEGIN_SRC emacs-lisp
(org-add-link-type
 "pelican"
 (lambda (path) (org-open-file path))
 ;; ; export
 (lambda (path desc backend)
   (cond
    ((eq backend 'html)
     (format "{filename}/%s" (file-relative-name path))))))
#+END_SRC

Ссылка на внутренний контент pelican:/Users/jkitchin/blogofile-jkitchin.github.com/_blog/blog.org

#+BEGIN_SRC sh
pwd
#+END_SRC

#+RESULTS:
: /Users/jkitchin/blogofile-jkitchin.github.com/_blog

экспортирует в:

<p>
Link to internal content {filename}/blog.org
</p>
person John Kitchin    schedule 02.05.2016
comment
Хм. Спасибо, Джон. Проблема в том, что ссылка без {filename} должна быть абсолютной, а ссылка с {filename} — нет. Например, у меня может быть в файле org ссылка вида (я на OS X) [[pelican:/Users/Username/bin/pelican/content/path/to/file.org][click me]]`, которая должен быть изменен на относительный путь, такой как [[pelican:{filename}/path/to/file.org][click me]].Обратите внимание, что /Users/Username/bin/pelican/content/ был заменен на {filename}. - person mclear; 02.05.2016
comment
Я отредактировал ответ, чтобы использовать относительный путь. Это то, что вам нужно? - person John Kitchin; 03.05.2016
comment
Ссылки пеликана открываются в организационном режиме правильно, но не указывают правильный путь в html-документе. Я прав, что это предложение предполагает, что я использую org для преобразования файлов в html? Если это так, это может быть проблемой, поскольку я позволяю pelican (с org_pandoc в качестве плагина) выполнять преобразование. - person mclear; 03.05.2016
comment
Вы правы, я предполагал, что вы используете orgmode для генерации html. Я не знаю, как работает org-pandoc и можно ли его настроить. - person John Kitchin; 03.05.2016
comment
Я решил, что если я когда-нибудь смогу заставить org-publish работать должным образом, я выберу что-то вроде приведенного выше решения. Тогда спасибо! - person mclear; 04.05.2016
comment
Я делаю что-то среднее с blogofile. См. github.com/jkitchin/jmax/blob/master/user/blogofile. .el за идею. Я экспортирую заголовок организации в файл html с заголовком yaml, который может отображать файл блога. - person John Kitchin; 04.05.2016

Используя исходный ответ Джона Китчена в качестве основы для построения (вместе с этим ответом), лучшая функция, которую я придумал следующее:

   (org-add-link-type
   "pelican"
   (lambda (path) (org-open-file path))
   ;; ; export
   (lambda (path desc backend)
     (cond
      ((eq backend 'org)
       (format "[[file:{filename}/%s][%s]]" path (or desc "")))
      ((eq backend 'html)
       (format "<a href=\"%s\">%s</a>" path (or desc "")))
      ((eq backend 'md)
       (format "[{filename}/%s](%s)" path (or desc ""))))))

В зависимости от бэкенда, используемого для org-publish, функция будет предоставлять относительные ссылки для org, html или markdown.

person mclear    schedule 10.05.2016