настройка `org-publish-project-alist` - PullRequest
7 голосов
/ 07 марта 2011

Я пытаюсь опубликовать веб-страницу в режиме org.Два вопроса:

  1. Есть ли способ "синхронизировать" файлы режима org в base-directory и файлы html в publishing-directory?В частности, если я удаляю файл org в base-directory, могу ли я получить org-publish-html для удаления соответствующего файла в каталоге html?
  2. Если у меня есть страницы в подкаталогах, как я могу это сделать?указать один .css файл в корневом каталоге, который будет использоваться для таблицы стилей?Например, моя структура каталогов выглядит следующим образом:

    public_html /

    • css /
      • mystyle.css
    • index.html
    • subdir /
      • index.html

Со следующими характеристиками в org-publish-project-alist (это просто подмножество) -

:publishing-directory "public_html"
:style "<link rel=\"stylesheet\" href=\"css/mystyle.css\" type=\"text/css\"/>"

mystyle.css используется public_html/index.html, но не public_html/subdir/index.html.Есть ли простое решение этой проблемы (я хочу, чтобы таблица стилей использовалась обоими / всеми файлами в подкаталогах)?

Большое спасибо ~

1 Ответ

3 голосов
/ 26 февраля 2012
  1. Нет прямого способа сделать это. Org-mode не знает (или не заботится) о местоположении, в которое он публикует - он просто отправляет туда вещи и проверяет, существует ли правильная структура каталогов В процессе публикации есть ловушка, которая вызывается после того, как файлы помещены в опубликованное место. Это контролируется установкой свойства :completion-function в вашем org-publish-project-alist. Вы можете использовать этот хук, чтобы написать функцию, которая сравнивает файлы * .org в ваших base-dir и подкаталогах с сопровождающими опубликованными файлами * .html и удаляет эти * .html файлы, которые не имеют сопровождающего * .org файла.

    Я подозреваю, что это будет проще всего сделать, заставив ваш Lisp completion-function вызвать скрипт оболочки, который удалит необходимые файлы. Если вы делаете что-то необычное со свойствами :include, :exclude или :base-extension, вы, вероятно, захотите, чтобы ваш completion-function взял соответствующую информацию из plist и затем передал ее в свой сценарий оболочки. На этой странице режима org есть пример completion-function, который показывает, как получить значения свойств для org-publish-project-alist. Затем вам нужно будет передать их сценарию оболочки.

  2. Есть несколько способов сделать это. Возможно, самым простым является переопределение таблицы стилей по умолчанию в каждом файле строкой, такой как:

    # + STYLE:

    для вашего первого уровня файлов подкаталогов, и продолжайте добавлять ../, поскольку вы углубляетесь в структуру каталогов.

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

    Наконец, другой вариант - использовать свойство :preparation-function org-publish-project-alist, чтобы определить функцию, которая будет автоматически изменять файл стиля для каждого файла. Опять же, это, вероятно, лучше всего сделать, когда Lisp preparation-function вызывает скрипт оболочки для анализа файлов. Я мог бы представить, что это делается с помощью программы Unix sed, чтобы найти регулярное выражение, обозначаемое как href="@MYLOC@/stylesheet.css" />, и заменить содержимое между @ на соответствующий уровень в дереве каталогов. Это кажется излишним, учитывая другие варианты.

...