DocPad文档元数据中所有这些路径之间有什么区别?

时间:2014-05-19 21:03:44

标签: path metadata docpad

DocPad文档元数据中所有这些路径之间有什么区别?

每个文档都有一组元数据,其中包含许多不同类型的路径和文件名,下面是一个示例列表:

fullPath: '/Users/kizu/Projects/docpad-test/src/documents/pages/page2_en/index.html.md',
relativePath: 'pages/page2_en/index.html.md',
basename: 'index',
outBasename: 'index',
filename: 'index.html.md',
fullDirPath: '/Users/kizu/Projects/docpad-test/src/documents/pages/page2_en',
outPath: '/Users/kizu/Projects/docpad-test/out/en/pages/page2/index.html',
outDirPath: '/Users/kizu/Projects/docpad-test/out/pages/page2_en',
outFilename: 'index.html',
relativeOutPath: 'en/pages/page2/index.html',
relativeDirPath: 'pages/page2_en',
relativeOutDirPath: 'en/pages/page2_en',
relativeBase: 'pages/page2_en/index',
relativeOutBase: 'pages/page2_en/index',
name: 'index.html',
slug: 'pages-page2-en-index',
url: '/en/pages/page2/index.html',
urls: [ '/en/pages/page2/index.html' ],

我只知道其中两个元素的目的:

  1. outPath设置文件系统中的输出路径,因此在renderBefore事件上更改它会改变输出路径和文件名。

  2. url是来自网站根目录的绝对网址,主要用于链接到其他文档。

  3. 但所有其他路径和名称的目的是什么?是否有使用它们的插件,或者依赖于这些插件的DocPad的代码功能?

    问题的上下文类似于this one的答案:我想重写文档的输出路径和文件名,所以我需要知道需要更改哪些元数据。现在我只更改了outPathurl,但它是否适用?或者也许有一种方法只使用一种魔术方法来改变输出路径,因此它会自动将所有这些路径更改为正确的新路径,所以我根本不需要为此烦恼?

1 个答案:

答案 0 :(得分:1)

我认为其中大部分都是相对于rootPath(docpad.coffee文件所在的)的Docpad.coffee文件配置的路径,outPath(生成的网站所在的位置),{{1 (网站源文件所在的位置),srcPath(要呈现的文件所在的位置)和documentsPath(不需要呈现的网站资源等)。见http://docpad.org/docs/config

Docpad使用存储各种路径,因此每次需要对文件执行某些操作时都不需要重新计算这些路径 - 从此处渲染并将其输出到那里...

好消息是,这个元数据的计算取决于Docpad将文件加载到数据库中时保存文件的位置(然后重新生成网站)。

另一个好消息是filesPath是一个数组 - 因此您可以有多个位置来保存要呈现和输出的文档。

但我认为您的问题的答案是您不需要更改元数据 - 这取决于您保存文件的位置。这有意义吗?

修改

想到了一种测试方法。在文档文件夹下创建两个文件夹,名为" loc1"和" loc2"。在" loc1"放置" index.html.eco"文件包含以下内容。

documentsPath

这将打印出当前文档的所有属性 - 即index.html.eco。 启动docpad并查看页面。 --- layout: 'default' title: 'Home' --- <h3><%-@document.title%></h3> <ul> <% for key, val of @document: %> <li> <span><%-key%> = <%-val%></span> </li> <% end %> </ul> 属性应该类似于relativePath

现在,虽然docpad仍在运行,但请将此文件复制到loc1\index.html.eco文件夹。您应该看到docpad重新生成网站。

现在网页浏览到&#34; loc2&#34;位置,您应该会看到类似的输出,但在输出元数据中使用loc2而不是loc2

修改

我在类似的想法上做的是挂钩serverExtend事件,如下所示:

loc1

这里的想法是根据帖子的URL将文件写入不同的位置。因此,保存的文件将具有相应的元数据。如果我们以保存不同语言文件为例,我们可以根据每种语言在逻辑上保存不同位置的多个文件或文件名。

现在,如果您想根据某些条件提供不同的文档,可以这样做:

   # Server Extend
    serverExtend: (opts) ->  
        safefs = require('safefs')
        server.post '/listentry', (req,res,next) ->
            safefs.writeFile outFile, content, (err) ->
                return next(err)  if err

要采用语言示例,您可能有一些逻辑来确定要提供的语言 - 也许是用户代理 - 并提供相应的文档以供匹配。

另一种可能性是,您可以在保存文档时向文档中添加元数据,以帮助您在server.get处理程序中选择适当的文档。这可能与您在markdown文件中包含元数据的方式相同:

                server.get 'someurllogic', (req,res,next) ->
                    #do something with the url logic                    
                    document = docpad.getCollection('documents')
                        .findOne({relativeOutPath: resultOfUrlLogic+'index.html'});
                        docpad.serveDocument({
                            document: document,
                            req: req,
                            res: res,
                            next: next,
                            statusCode: 200
                    });

您可以添加的元数据确实没有限制