Pug

Использование шаблонизатора pug в сборке.

Оглавление страницы:

Gulp таск 

Файлы шаблонизатора pug собираются таском ./gulp/tasks/pug.js.

Иерархия файлов 

Файловая структура pug выглядит следующим образом:

./src/pug/
├── components
├── data
├── layouts
├── markdown
├── pages
├── parts
└── README.md

  • components - содержит миксины часто встречаемых элементов на сайте;
  • data - содержит переменные и различные данные для вывода на сайте;
  • layouts - содержит шаблоны из которых собираются страницы сайта;
  • markdown - содержит документы в формате .md для последующего подключения их содержимого на страницах;
  • pages - содержит отдельные страницы проекта;
  • parts - содержит общие, повторяющиеся для всех страниц элементы, такие как шапка, подвал сайта и т.п.

Каталог components 

Как создаются миксины в pug можно узнать на официальном сайте шаблонизатора.

Пример создание миксина:

PUG
// Файл title.pug
mixin h2(title, link)
  h2(id=link)  
    a(href="#" + link, aria-label="Ссылка на раздел: " + title)

Пример вызова миксина:

PUG
include ../components/title.pug
+h2("Заголовок", "http://link...")

Каталог data 

Как создаются переменные в pug можно узнать на официальном сайте шаблонизатора.

Пример создание переменных:

PUG
// Файл config.pug
- const siteVersion = "1.0";
- let siteVersion = "1.0";
- var siteVersion = "1.0";

Пример вызова переменных:

PUG
p #{siteVersion}
p Некий текст #{siteVersion}
p(class=siteVersion)

Для того чтобы pug мог работать с json данными необходимо его настроить. Реализация настройки содержится в файле ./gulp/tasks/pug.js:

JS
const getData = () => {
  const dir = config.src.pug.data
  const files = fs.readdirSync(dir)
  const data = {}

  files.forEach(file => {
    if (!file.endsWith('.json')) return

    const fileName = file.replace('.json', '')

    data[fileName] = JSON.parse(fs.readFileSync(`${dir}/${file}`, 'utf8'))
  })

  return data
}

Предположим имеется файл ./src/pug/data/mainNav.json с содержимым:

JSON
{
    "title": "Вводная информация",
    "icon": "icon-book",
    "links": [
      {
        "name": "Справочник терминов",
        "link": "intro/index.html"
      },
      {
        "name": "Иерархия файлов",
        "link": "intro/hierarchy.html"
      }
    ]
}

Логика работы следующая:

  1. В каталоге data выбираются все файлы с расширением json;

  2. Cодержимое файлов помещается в переменную jsonData с ключом название файла, например:
    имя файла mainNav.json
    переменная jsonData["mainNav"] = содержимое файла mainNav.json

  3. Чтобы получить значение обращаемся к переменной jsonData:
    p #{jsonData.mainNav.title}
    p #{jsonData.mainNav.icon}
    each link in jsonData.mainNav.links
        p #{link.name}

Каталог layouts 

Как создаются шаблоны в pug можно узнать на официальном сайте шаблонизатора.

Пример создание шаблона:

PUG
include ../data/*.pug
include ../components/*.pug

block variables
  - var pageTitle = "Укажите заголовок";

doctype html
html.no-js(lang="ru")
  head
    include ../parts/head.pug

  body
    div(hidden)
    include ../../assets/icons/sprite-mono.svg
    include ../../assets/icons/sprite-multi.svg

    .container
      block header
        include ../parts/header.pug

    main.main-content
      .main-content__intro
        block intro

    .main-content__toc
      .main-content__toc-wrapp
        block toc
          strong Оглавление страницы:

    .main-content__content
      block content

    block scripts
      script(src="js/main.js?v=" + siteVersion, type="module")


Каталог markdown 

Как использовать markdown разметку в pug можно узнать на официальном сайте шаблонизатора здесь и здесь.

Пример создание markdown разметки:

MARKDOWN
# Заголовок H1

### Заголовок H3

**Жирный текст**

- Элемент списка 1
- Элемент списка 2

[[Ctrl]] + [[K]]

Вывести markdown разметку в шаблоне pug можно двумя способами:

  1. Прописать непосредственно в самом файле:
PUG
:markdown-it
  НИЖЕ ИДЕТ MARKDOWN РАЗМЕТКА с оборачивание в тег <p>

:markdown-it(inline)
  НИЖЕ ИДЕТ MARKDOWN РАЗМЕТКА без оборачивание в тег <p>
  1. Подключить отдельный файл:
PUG
include:markdown-it ../markdown/docs.md

Каталог pages 

Как создаются страницы в pug можно узнать на официальном сайте шаблонизатора.

Пример создание страницы:

PUG
extends ../layouts/default.pug

block variables
  - var pageTitle = "Документация";
  - var pageDesc = "Описание по разворачиванию сборки проекта и дальнейшей его поддержки.";

block intro
  h1 #{ pageTitle }
  p #{ pageDesc }

block append toc
  :markdown-it
    - [Начало работы](#start)

block content
  +h2("Начало работы", "start")
  :markdown-it
    Данный раздел содержит информацию по установке необходимых программ для работы над проектом, на различных операционных системах.

Каталог parts 

Как используются повторяющиеся части страницы в pug можно узнать на официальном сайте шаблонизатора.

Пример создание страницы:

PUG
// Файл head.pug
- var siteTitle = pageTitle ? `${pageTitle} — ${siteTitle}` : siteTitle;
- var siteDescription = pageDesc ? pageDesc : siteDescription;

meta(charset="UTF-8")
meta(http-equiv="X-UA-Compatible", content="IE=edge")
meta(name="viewport", content="width=device-width, initial-scale=1")

title #{ siteTitle }
meta(name="description", content=siteDescription)
meta(name="theme-color", content=siteColor)

link(rel="mask-icon", href="favicons/favicon.svg", color=siteColor)
link(rel="manifest", href="manifest.json")
link(rel="apple-touch-icon", href="favicons/apple-touch-icon.png")
link(rel="shortcut icon", href="favicons/favicon.ico", type="image/x-icon")

link(rel="stylesheet", href="css/style.css?v=" + siteVersion)

link(rel="preload", href="fonts/roboto/roboto-light.woff2", type="font/woff2", as="font", crossorigin="anonymous")
link(rel="preload", href="fonts/roboto/roboto-regular.woff2", type="font/woff2", as="font", crossorigin="anonymous")
link(rel="preload", href="fonts/roboto/roboto-medium.woff2", type="font/woff2", as="font", crossorigin="anonymous")

Пример подключение страницы:

PUG
html.no-js(lang="ru")
  head
    include ../parts/head.pug

Дополнительный функционал 

Pug позволяет создавать свои пользовательские фильтры наподобии фильтра markdown-it, инструкцую по фильтрам можно почитать на официальном сайте.

В данной сборке используется js плагин highlight.js для подсветки кода, но он не позволяет размещать разметку html без экранирования тегов. Средствами pug экранировать не удалось, поэтому в gulp таске pug.js была созданна пользовательская функция special-chars.

Пример ее работы, здесь мы вставляем html разметку так как она есть, без экранирования:

PUG
+code("pug")
  :special-chars
    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <meta http-equiv="X-UA-Compatible" content="IE=edge">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Document</title>
    </head>
    <body>
      
    </body>
    </html>

На выходе получаем экранируемый код, который корректно отображается в highlight.js:

HTML
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  
</body>
</html>