Расширение блога Middleman: два варианта вывода одного и того же источника

Я хочу иметь единую исходную папку со статьями и генерировать два или более варианта вывода. (Например, печатная/архивная версия или специальная мобильная версия для A/B-тестов с канонической ссылкой на один вариант.)

При такой конфигурации

activate :blog do |blog|
  blog.name = "variant"
  blog.sources = "news/{year}-{month}-{day}-{title}.html"
  blog.layout = "news/variant-layout"
  blog.permalink = "variant/{year}/{title}.html"
  ...
end
...
activate :blog do |blog|
  blog.name = "news"
  blog.sources = "news/{year}-{month}-{day}-{title}.html"
  blog.layout = "news/layout"
  blog.permalink = "news/{year}/{title}.html"
  ...
end

Обратите внимание на разницу в конфигурации blog.permalink для создания URL-адресов.

Макет перепутан, ссылки неправильные (всегда указывающие на версии, появившиеся последними в файле конфигурации) и пропущенные страницы.

Я добавил пользовательское расширение для подключения к жизненному циклу посредника, добавив недостающие ресурсы в карту сайта. (Что я считаю хаком...) По крайней мере, после этого появляются отсутствующие страницы, но с неправильной версткой и ссылки всегда указывают на неправильную версию. Кажется, что попытка proxy с другим шаблоном невозможна, поскольку расширение блога само генерирует динамические прокси-страницы. В настоящее время я застрял с посредником 3.4, так как расширение asciidoc для посредника 4 еще не опубликовано. Является ли это общим ограничением посредника, что я не могу генерировать несколько вариантов?


person Thomas    schedule 01.05.2016    source источник


Ответы (1)


Я думаю, что ваш лучший курс действий следующий:

  • перейти на gem 'middleman', '~> 4.1.7'
  • использовать gem 'middleman-targets'

Затем вы можете настроить две цели сборки: default и variant, например:

# config.rb

set :target, :default

set :targets, {
  default: {
     layout: 'layout-one',
     build_dir: 'build/default',
     target_specific_config: 'foo',
     features : {
        feature_one: true 
     }  
  },
  variant: {
     layout: 'layout-two',
     build_dir: 'build/variant',
     target_specific_config: 'bar',
     features : {
        feature_one: false 
     }  
  }

Теперь вы должны иметь возможность переключать полные макеты следующим образом:

# layout.erb

<% wrap_layout(target_value(:layout)) do %>
  <%= yield %>
<% end %>

Или вы можете использовать флаги функций или определенные значения конфигурации на отдельных страницах, например:

# page.erb

<% if target_feature?(:feature_one) %>
  <p>Feature One Is ON</p>
  <p>Value is: <%= target_value(:target_specific_config) %>
<% else %>
  <p>Feature One Is OFF</p>
  <p>Value is: <%= target_value(:target_specific_config) %>
<% end %>

На данный момент документации немного мало, поэтому, вероятно, лучше всего прочитать вспомогательную часть исходного кода здесь: https://github.com/middlemac/middleman-targets/blob/master/lib/middleman-targets/extension.rb

person defsprite    schedule 09.05.2016