Как развернуть сайт, который не находится в корне сервера с помощью DocPad?

Я использую 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>

person Dharma    schedule 09.01.2013    source источник
comment
Добро пожаловать в Stack Overflow! Можем ли мы увидеть ваш код?   -  person Corey Adler    schedule 10.01.2013


Ответы (3)


Я написал небольшой плагин, который выполняет свою работу, возможно, есть лучшее решение, но оно работает нормально:

# 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>
      """
person Dharma    schedule 11.01.2013
comment
Сладкий. Если вы ответили на свой собственный вопрос, обязательно нажмите на галочку рядом с вашим ответом, чтобы люди знали, что все решено и хорошо :) См. принятый ответ здесь для получения дополнительной информации: stackoverflow.com/faq#howtoask :) - person balupton; 17.01.2013
comment
Кстати, отличное решение. - person balupton; 17.01.2013
comment
Это решение подходит для меня, но я не был уверен, что это лучший способ сделать это. - person Dharma; 18.01.2013

Другой вариант — преобразовать все абсолютные URL-адреса в относительные, чтобы сайт работал с любым префиксом пути (/, /path/ или /some/other/path/) без перестроения. Подумайте о gh-страницах с собственным доменом.

Вот несложная задача по преобразованию HTML и CSS после создания статического документа. В настоящее время он построен на замене регулярных выражений, вдохновленных плагином docpad @Dharma.

person hurrymaplelad    schedule 18.06.2013
comment
Это то, что я искал, не уверен, что другой джаз происходит выше. К сожалению, это плагин для grunt, а это значит, что мне нужно запустить Grunt прямо сейчас (этот сайт постоянно расширяется). Почему в DocPad нет @document.pathToRoot или чего-то подобного? - person Chris; 18.09.2013

Это одна из областей, в которой DocPad может проявить себя.

До сих пор самый популярный способ обойти это — использовать <%- @[email protected] %> везде, однако это, конечно, не идеально из-за его привередливой природы. Более подробно об этом рассказывается здесь: https://gist.github.com/3939146

Возможно, DocPad нужно добавить атрибут absoluteUrl для файлов/документов, который автоматически генерируется из site.url. Тогда мы могли бы сделать <%- @document.absoluteUrl %> вместо этого. Создал для этого задачу здесь: https://github.com/bevry/docpad/issues/402< /а>

person balupton    schedule 17.01.2013