EJS
CMintS использует EJS в качестве шаблона двигатель для создания макетов, EJS также может использоваться для страница . EJS - простой шаблонный язык который позволяет генерировать HTML-разметку при написании простого JavaScript. Детальный EJS синтаксическая документация может быть найдена , также есть онлайн-площадка, до попробуйте Синтаксис .
Внешний вид
Как упоминалось в обзоре тем в чтобы решить, какой макет использовать для страницы, Front Matter " layout " необходимо использовать свойство, которое возвращается к макету по умолчанию. Kak
Принимая во внимание фрагмент ниже theme/layouts/default.ejs
:
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" type="text/css" href="/css/main.css">
</head>
<body>
<main>
<%- page.body %>
</main>
</body>
</html>
И фрагмент ниже pages/about.md
# about
This is the about page
Запрос на страницу /about
будет генерировать HTML-код ниже:
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" type="text/css" href="/css/main.css">
</head>
<body>
<main>
<h1>about</h1>
<p>This is the about page</p>
</main>
</body>
</html>
Но если у вас есть другой макет, который находится в
theme/layouts/home.ejs
, вы можете задать его в Front Matter, чтобы использовать его напр .:
---
layout: home
---
# Homepage
This page is using home.ejs layout
body
Как вы могли заметить из предыдущего примера, заполнитель <%- page.body %>
в макете ejs заменяется фактическим содержимым страницы, независимо от того,
какая страница используется (markdown, html или ejs) фактическое содержание
страницы отображается и заменяет <%- page.body %>
заполнитель.
partials
Partials - это файлы макета EJS, которые можно загружать в макеты EJS:
<% include partialPath %>
<%- include('partialPath', {key: value}) %>
Это может пригодиться для разделения частей макета и повторное использование:
<!DOCTYPE html>
<html lang="en-US">
<head>
<% include partials/head %>
<% include partials/meta %>
</head>
<body>
<% include partials/header %>
<main>
<%- page.body %>
</main>
<% include partials/footer %>
</body>
</html>
Учитывая вышеприведенный пример, мы могли бы, например, создать частичное, которое будет
повторно использовать различные макеты, например, считать partials/head.ejs
с помощью
ниже:
<link rel="stylesheet" type="text/css" href="/css/main.css">
<script src="/js/main.js" defer></script>
этот фрагмент теперь можно использовать и загружать в макет, просто добавив <% include partials/head %>
в макет.
Front Matter
Как уже упоминалось, Front Matter используется не только для выбора макета, но также можно определить свойства страницы, к которым можно получить доступ из макеты.
Допустим Front Matter:
---
title: About page
showSidebar: true
---
Данные, определенные в Front Matter, доступны из файлов макета с использованием объекта страницы:
<title><%= page.title %></title>
<meta property="og:title" content="EJS">
...
</head>
<body>
...
<%if (page.showSidebar) { %>
<% include partials/sidebar %>
<% } %>
Помощники
В CMintS также есть некоторые встроенные помощники:
Помощник | Тип | Описание |
---|---|---|
page.pathname | Переменная | Путь к текущей странице |
page.locale | Переменная | Языковой стандарт текущей страницы |
page.locales | Массив | Другие локали, в которых доступна текущая страница |
page.urlLocale | Переменная | Локаль, как это указано в URL. |
page.markdown.toc | Объект | Таблица содержимого страницы |
i18n.getPageLocales | Функция | Получить доступные локали для определенной страницы |
i18n.href | Функция | Сгенерировать href и hreflang для пути. Проверяет, переведён ли путь на язык странницы, если нет то используется язык по умолчанию. |
site.queryPages | Функция | Запрос массива метаданных объектов страниц. |
page.pathname
Путь к текущей странице:
<a <%-i18n.href(item.url)%> <% if (item.url == page.pathname) { %>class="active"<% } %>>
page.locale
Языковой стандарт текущей страницы:
<!DOCTYPE html>
<html lang="<%= page.locale %>">
<head>
<title>...</title>
</head>
<body>
...
page.locales
Другие локали, в которых доступна текущая страница:
<!DOCTYPE html>
<html lang="<%= page.locale %>">
<head>
...
<!-- og:locale, og:locale:alternate, rel="canonical" rel="alternate" -->
<% for (const locale of page.locales) { %>
<% const localeRegion = site.localeMap[locale] ? site.localeMap[locale].region : locale; %>
<% if (locale == page.locale) { %>
<meta property="og:locale" content="<%= localeRegion %>" />
<link rel="canonical" href="https://<%= site.domain %>/<%= page.pathname %>">
<% } else { %>
<meta property="og:locale:alternate" content="<%= localeRegion %>" />
<link rel="alternate" href="https://<%= site.domain %>/<%= locale %>/<%= page.pathname %>" hreflang="<%= locale %>" />
<% } %>
<% } %>
</head>
<body>
...
page.urlLocale
Локаль, как это указано в URL.
- https://example.com/about
- https://example.com/en/about
- https://example.com/de/about
- https://example.com/es/about
С учетом структуры URL выше, иногда вам может понадобится скрипт перенаправления
на страницах которые не имеют локали в URL, что в этом случает
является https://example.com/about
, в таких случаях текущий помощник может пригодиться, на например:
<% if (!page.urlLocale) { %>
<% include redirectionScript %>
<% } %>
page.markdown.toc
Объект page.markdown.toc
может быть использован в ".ejs" для создания таблицы контента.
Объект является деревом, в котором каждый узел соответствует заголовку markdown, каждый узел состоит из идентификатора и заголовка. Если узел содержит потомков, то все дочерние узлы могут быть доступны через свойство page.markdown.toc
:
{
"children": [
{
"id": "ejs",
"title": "EJS",
"children": [
{
"id": "layout",
"title": "Layout"
},
{
"id": "body",
"title": "Body"
}
...
Итак, чтобы построить таблицу содержимого из этой переменной, фрагмент EJS может использоваться как ниже:
<%/* partials/navigations/toc.ejs */%>
<% if (items) { %>
<ul>
<% items.forEach(function(item){ %>
<li>
<% if (item.id) { %>
<a href="#<%= item.id %>"><%= item.text %></a>
<% } %>
<% if (item.children) { %>
<%- include('toc', {items: item.children}) %>
<% } %>
</li>
<% }) %>
</ul>
<% } %>
Учитывая приведенный выше пример, таблица контента может быть сгенерировано просто запросив
.ejs
файл используя переменную .ejs
, пример:
<%if (page.
<aside id="toc">
<h2>Table of content</h2>
<%- include('partials/navigations/toc', {items: page.markdown.toc.children}) %>
</aside>
<% } %>
i18n.getPageLocales
Получить доступные локали для определенной страницы
<% const configPageLocales = i18n.getPageLocales("documentation/getting-started/configuration"); %>
<% const homepageLocales = i18n.getPageLocales("index"); %>
<% if (homepageLocales.includes("de")) { %>
Homepage is available in German
<% } %>
<% if (configPageLocales.includes("es")) { %>
Config page is available in Spanish
<% } %>
i18n.href
Сгенерировать href и hreflang для пути. Проверяет, переведён ли путь на язык странницы, если нет то используется язык по умолчанию.
<a <%-i18n.href("documentation")%> class="button">{get-started[Main button text] Get started}</a>
site.queryPages
Запрос массива метаданных объектов страниц.
Помимо метаданных Front Matter, страницы содержат pathname
, который
является фактическим именем страницы и originalPathname
, который содержит
имя пути игнорируя permalink
.
<% let docPages = site.queryPages((data) => data.categories &&
data.categories.includes("documentation")) %>
<% docPages.forEach(function(item) { %>
<a <%- i18n.href(item.pathname) %>> <%= item.title %> </a>
<% }); %>