docpad - 为不同语言生成不同的 docpad 集合

标签 docpad

我想调整我的多语言 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?

最佳答案

这是可以做到的,但需要对文件结构进行三处更改:

  1. 由于 DocPad 路径中的点用于分隔不同的渲染器,并且我不确定如何在渲染器中执行我建议的操作,因此它不会抛出渲染扩展...没有不做任何事情。错误,我建议使用_en/_ru而不是.en/.ru ,这样您就可以根据文件名执行操作,而无需任何额外的麻烦。

  2. 最好使用 Docpad 的初始路径,即将您的 pagesblog 文件夹放入 documents 文件夹中。

  3. 可能有一种方法可以在没有 .html.md 部分的情况下使用文件,但由于它是 DocPad 方式,因此您应该使用它。

也许有一些方法可以在不进行这些更改的情况下完成您想要的操作,但这不会那么简单:)

因此,将代码放置在 docpad.coffee 中的 docpadConfig 中(这里是 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 之上一级>.

关于docpad - 为不同语言生成不同的 docpad 集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23700995/

相关文章:

javascript - 整数被添加到数组中

node.js - 如何强制 NPM 在不同文件夹中查找已安装的软件包?

docpad - 从静态页面发送简单的电子邮件

docpad - 将搜索表单添加到 Docpad 站点

javascript - 如何通过实时重新加载获得 docpad grunt skeleton min vendor js 文件

markdown - 如何在 docpad/markdown 中突出显示一段代码

windows - 无法让 Docpad 在 Windows 上运行

node.js - 更新npm并安装docpad后出现权限错误

json - Azure 网站实例未运行 Package.json 中定义的 Node 版本