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' ],
我只知道其中两个元素的目的:
outPath
设置文件系统中的输出路径,因此在renderBefore
事件上更改它会改变输出路径和文件名。
url
是来自网站根目录的绝对网址,主要用于链接到其他文档。
但所有其他路径和名称的目的是什么?是否有使用它们的插件,或者依赖于这些插件的DocPad的代码功能?
问题的上下文类似于this one的答案:我想重写文档的输出路径和文件名,所以我需要知道需要更改哪些元数据。现在我只更改了outPath
和url
,但它是否适用?或者也许有一种方法只使用一种魔术方法来改变输出路径,因此它会自动将所有这些路径更改为正确的新路径,所以我根本不需要为此烦恼?
答案 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
});
您可以添加的元数据确实没有限制