3

我正在使用 DocPad 制作一个演示站点,我想将它部署在例如: http ://www.example.com/demo/ 但是当我使用时docpad generate --env static,链接是相对于服务器的根目录而不是演示目录所以链接已损坏。我能做些什么 ?是否有要在某处声明的元数据?

编辑:在这种情况下,我使用 Twitter Bootsrap 框架,因此例如默认布局中主导航中的链接如下所示:

<div class="nav-collapse collapse">
  <ul class="nav">
    <% for document in @getCollection('pages').toJSON(): %>
      <li class="<%= 'active'  if @document.url is document.url %>">
        <a href="<%= document.url %>"><%= document.title %></a>
      </li>
    <% end %>
  </ul>
</div>
4

3 回答 3

1

我写了一个小插件来完成这项工作,可能有更好的解决方案,但它工作正常:

# Export Plugin
module.exports = (BasePlugin) ->
  # Define Plugin
  class absolutePathPlugin extends BasePlugin
    # Plugin Name
    name: 'absolutepath'
    config:
      url: "/"

    renderAfter: (opts,next) ->
      docpad = @docpad
      if 'static' in docpad.getEnvironments()
        docpad.log 'debug', 'Writing absolute urls'
        href = 'href="' + @config.url
        src = 'src="' + @config.url
        database = docpad.getCollection('html')
        database.forEach (document) ->
          content = document.get('contentRendered')
          if /href="\//.test(content)
            content = content.replace(/href="\//g, href)
          if /src="\//.test(content)
            content = content.replace(/src="\//g, src)
          document.set('contentRendered',content)
        next()?
      else
        next()?

      # Chain
      @

在我的docpad.coffee文件中,我只需要配置 url,如果您使用 cleanUrls 插件,则必须调整 getRedirectTemplate 函数以考虑绝对 url:

plugins:
  absolutepath:
    url: "http://www.example.com/demo/"
  cleanurls:
    getRedirectTemplate: (document) ->
      absolutepath = docpadConfig.plugins.absolutepath.url.slice(0, - 1) 
      """
      <!DOCTYPE html>
      <html>
        <head>
          <meta charset="utf-8">
          <title>#{document.get('title') or 'Redirect'}</title>
          <meta http-equiv="REFRESH" content="0;url=#{absolutepath + document.get('url')}">
        </head>
        <body>
          This page has moved. You will be automatically redirected to its new location. If you aren't forwarded to the new page, <a href="#{absolutepath + document.get('url')}">click here</a>.
        </body>
      </html>
      """
于 2013-01-11T06:25:16.597 回答
1

另一种选择是将所有绝对 URL 转换为相对 URL,以便站点从任何路径前缀 ( /,/path//some/other/path/) 工作而无需重建。想想具有自定义域的 gh-pages。

这是在静态文档生成后对 HTML 和 CSS 进行转换的繁重任务。它目前建立在受@Dharma 的 docpad 插件启发的正则表达式替换之上。

于 2013-06-18T17:42:36.037 回答
0

这是 DocPad 可以加强的一个领域。

到目前为止,人们解决这个问题的最流行的方式是在<%- @site.url+@document.url %>任何地方使用,但是由于它的挑剔性质,这当然不是理想的。有一个要点在这里更详细地展示了这一点:https ://gist.github.com/3939146

也许 DocPad 需要做的是absoluteUrl为文件/文档添加一个属性,该属性是从site.url自动生成的。然后我们可以这样做<%- @document.absoluteUrl %>。在这里为此创建了一个问题:https ://github.com/bevry/docpad/issues/402

于 2013-01-17T15:48:31.107 回答