我想调整我的多语言DocPad博客,以便以* .ru.md结尾的页面进入/ ru /目录,以* .en.md结尾的页面进入/ en /目录。
让我们说这是最初的结构
src/
pages/
page1.ru.md
page1.en.md
page2.ru.md
这就是我想要的:
./
en/
page1.html
ru/
page1.html
page2.html
./
因为我要主持gh-pages
。
同样的帖子。我想将它们存储在
中src/
posts/
post-about-docpad.ru.md
post-about-docpad.en.md
得到
./
en/
posts/
post-about-docpad.html
ru/
posts/
post-about-docpad.html
我应该如何配置docpad?
答案 0 :(得分:4)
可以这样做,但文件结构有三处变化:
由于DocPad的路径中的点是用于划分不同的渲染器,我不知道如何在渲染器中做出建议,因此它赢得了“#”。 t抛出Rendering the extension … didn't do anything.
错误,我建议使用_en
/ _ru
代替.en
/ .ru
,这样你就可以根据文件名做事了任何额外的麻烦。
最好使用Docpad的初始路径,即将pages
和blog
文件夹放在documents
文件夹中。
有一种方法可以使用没有.html.md
部分的文件,但是因为它是DocPad方式,所以你应该使用它。
如果没有这些改变,也许有办法做你想要的事情,但这样做不会那么简单:)
因此,docpadConfig
中docpad.coffee
放置的代码(此处为example project at GitHub):
docpadConfig = {
collections:
# Declare `ru` and `en` collections
ruDocuments: ->
@getCollection("documents").findAllLive({
basename: /_ru$/
})
enDocuments: ->
@getCollection("documents").findAllLive({
basename: /_en$/
})
events:
renderBefore: () ->
# Rewrite `pages/` to the root and `posts/` to the `blog/`.
this.docpad.getCollection('documents').forEach (page) ->
newOutPath = page.get('outPath')
.replace('/out/pages/', '/out/')
.replace('/out/posts/', '/out/blog/')
newUrl = page.get('url')
.replace('pages/', '')
.replace('posts/', 'blog/')
page.set('outPath', newOutPath)
page.setUrl(newUrl)
# Rewrite `_ru` to the `/ru/`
this.docpad.getCollection('ruDocuments').forEach (page) ->
newOutPath = page.get('outPath')
.replace('/out/', '/out/ru/')
.replace('_ru.', '.')
newUrl = '/ru' + page.get('url')
page.set('outPath', newOutPath)
page.setUrl(newUrl)
# Rewrite `_en` to the `/en/`
this.docpad.getCollection('enDocuments').forEach (page) ->
newOutPath = page.get('outPath')
.replace('/out/', '/out/en/')
.replace('_en.', '.')
page.set('outPath', newOutPath)
newUrl = '/en' + page.get('url').replace('_en.', '.')
page.setUrl(newUrl)
}
module.exports = docpadConfig
首先我们声明两个集合:一个用于所有ru文档,另一个用于所有en文档。
然后我们首先将pages/
重写为根,然后将_en
/ _ru
个文件重写为/en/
和/ru/
。
请注意,更改只是源文件的存储方式,结果输出与您在问题中的输出相同。
所以,而不是
src/
pages/
page1.ru.md
page1.en.md
page2.ru.md
posts/
post-about-docpad.ru.md
post-about-docpad.en.md
你应该这样写:
src/
documents/
pages/
page1_ru.html.md
page1_en.html.md
page2_ru.html.md
posts/
post-about-docpad_ru.html.md
post-about-docpad_en.html.md
但是你可以根据需要获得所需的输出。唯一的问题是我没有理解关于gh-pages
的部分:你是否要将结果和源存储在同一个分支中?我建议使用master
作为来源,gh-pages
作为结果。
但是,如果您只需要一个分支,那么,您可以通过将.replace('/out/', '/out/ru/')
替换为.replace('/out/', '/ru/')
等方式轻松重写您想要的所有内容。这会将渲染的文件放在out
之上的一个级别。
答案 1 :(得分:2)
第一步是重命名您的文档,使用短划线表示语言:page1-en.html
和page1-ru.html
,而不是page1.en.html
和page1.ru.tml
- 否则@kizu正确地指出,当DocPad从扩展名扩展到扩展名时,它会引起问题。
完成后,您可以将以下内容添加到docpad配置文件中:
collections:
# Fetch documents in different languages
translate: (database) ->
languageRegex = /^(.+?)-(en|ru)$/
#docpadOutPath = @getConfig().outPath
@getCollection('documents').findAllLive({basename: languageRegex}).on 'add', (document) ->
# Prepare
a = document.attributes
parts = a.basename.match(languageRegex)
basename = parts[1]
language = parts[2]
relativeOutPath = "#{language}/#{a.relativeOutDirPath}/#{basename}.#{a.outExtension}"
#outPath = "#{docpadOutPath}/#{relativeOutPath}"
urls = ["/#{relativeOutPath}"]
# Apply
document
.setMetaDefaults({
#outPath
url: urls[0]
})
.addUrl(urls)
这将使URL以您希望的方式工作。
然后在安装了cleanurls插件的静态环境中运行DocPad,将文档写入所需的位置。
docpad install cleanurls
docpad generate --env static