Могу ли я выбрать макет для страницы Wyam? - PullRequest
0 голосов
/ 30 марта 2019

Я работаю над темой для Wyam , и мне интересно, есть ли способ установить макет, который следует использовать в файле уценки для конкретной страницы.Насколько я видел до сих пор, кажется, что каждая страница, созданная с уценкой, использует _Layout.cshtml

Чтобы быть более конкретным.Я создаю страницу «about.md», которая имеет другой макет, чем другие (по умолчанию) страницы.

Поэтому я хотел бы использовать метаданные для выбора макета.Например

Layout: _About.cshtml

или

Layout: _About

Возможно ли это с помощью Wyam?

1 Ответ

1 голос
/ 01 апреля 2019

В файле бритвы

Страницы в рецептах Wyam (я предполагаю, что вы используете рецепт блога или документации) обрабатываются Razor. Использование _Layout.cshtml является условным в рецепте, но альтернативные макеты могут быть указаны с использованием стандартного синтаксиса Razor. Вы можете сделать это, поместив следующую строку в верхнюю часть файла about page .cshtml ( под your frontате):

@{
    Layout = "_About.cshtml";
}

В файле уценки

Файлы Markdown также обрабатываются механизмом Razor, поэтому описанная выше методика будет работать , если бы процессор Markdown не экранировал символ @. На самом деле нет хорошего способа обойти это, и простой ответ на ваш вопрос заключается в том, что вы не можете указать альтернативный макет для файла Markdown.

Однако, одно из преимуществ использования генератора на основе кода, такого как Wyam, заключается в том, что у вас есть много контроля. В этом случае вы можете заменить конвейер RenderPages тем, который будет делать именно то, что вы хотите. Добавьте следующее в ваш wyam.config файл:

int index = Pipelines.IndexOf(Blog.RenderPages);
Pipelines.Remove(Blog.RenderPages);
Pipelines.Insert(index, Blog.RenderPages,
    (IPipeline)new Wyam.Web.Pipelines.RenderPages(
        Blog.RenderPages,
        new Wyam.Web.Pipelines.RenderPagesSettings
        {
            Pipelines = new string[] { "Pages" },
            Layout = (doc, ctx) => doc.String("Layout", "/_Layout.cshtml")
        }));

Тогда вы сможете добавить значение "Layout" в качестве начального элемента точно так же, как вы написали в своем вопросе.

В целом это была хорошая идея, поэтому я также открыл проблему, чтобы добавить это поведение в рецепт по умолчанию.

...