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

时间:2014-05-16 17:13:54

标签: 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?

2 个答案:

答案 0 :(得分:4)

可以这样做,但文件结构有三处变化:

  1. 由于DocPad的路径中的点是用于划分不同的渲染器,我不知道如何在渲染器中做出建议,因此它赢得了“#”。 t抛出Rendering the extension … didn't do anything.错误,我建议使用_en / _ru代替.en / .ru,这样你就可以根据文件名做事了任何额外的麻烦。

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

  3. 有一种方法可以使用没有.html.md部分的文件,但是因为它是DocPad方式,所以你应该使用它。

  4. 如果没有这些改变,也许有办法做你想要的事情,但这样做不会那么简单:)

    因此,docpadConfigdocpad.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.htmlpage1-ru.html,而不是page1.en.htmlpage1.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