定制`org-publish-project-alist`

时间:2011-03-07 00:27:03

标签: html emacs org-mode

我正在尝试使用org-mode发布网页。两个问题:

  1. 有没有办法“同步”base-directory中的组织模式文件和publishing-directory中的html文件?具体来说,如果我删除base-directory中的组织文件,我是否可以让org-publish-html删除html目录中的相应文件?
  2. 如果我在子目录中有页面,如何在根目录中指定单个.css文件以用于样式表?例如,我的目录结构如下:

    的public_html /

    • CSS /
      • mystyle.css
    • 的index.html
    • 子目录/
      • 的index.html
  3. org-publish-project-alist中的以下规范(这只是一个子集) -

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

    mystyle.csspublic_html/index.html使用,但未由public_html/subdir/index.html使用。有没有一个简单的补救措施(我希望样式表由子目录中的两个/所有文件使用)?

    非常感谢〜

1 个答案:

答案 0 :(得分:3)

  1. 没有直截了当的方法。 Org-mode不知道(或关心)它发布的位置 - 它只是在那里发送内容并确保存在正确的目录结构。发布过程中有一个钩子,在将文件推送到其发布位置后调用它。通过在:completion-function中设置org-publish-project-alist属性来控制此操作。您可以使用此挂钩编写一个函数,将base-dir和子目录中的* .org 文件与随附的* .html 发布的文件进行比较,然后删除那些* .html 文件没有随附的* .org 文件。

    我怀疑通过让你的Lisp completion-function调用一个删除必要文件的shell脚本,这将是最容易实现的。如果您使用:include:exclude:base-extension属性做了些什么,您可能希望completion-functionplist中获取相关信息然后将它们传递给您的shell脚本。 This org-mode page有一个示例completion-function,其中显示了如何获取org-publish-project-alist的属性值。然后,您需要将它们传递给shell脚本。

  2. 有几种方法可以做到这一点。也许最简单的方法是使用以下行覆盖每个文件中的默认样式表:

      

    #+ STYLE:&lt; link rel =“stylesheet”type =“text / css”href =“../ stylesheet.css”/&gt;

    用于您的第一级子目录文件,并在您深入了解目录结构时继续添加../

    另一种可能性是为目录树中的每个级别生成通用模板文件。 This org-mode page给出了如何设置它的一个很好的例子。

    最后,另一个选项是使用:preparation-function的{​​{1}}属性来定义一个将自动更改每个文件的样式文件的函数。同样,最好通过让Lisp org-publish-project-alist调用shell脚本来解析文件来完成。我可以想象使用Unix preparation-function程序执行此操作以查找表示类似sed的正则表达式,并将href="@MYLOC@/stylesheet.css" />之间的内容替换为目录树中的适当级别。考虑到其他选择,这看起来有点矫枉过正。