Зарегистрируйтесь, чтобы продолжить обучение

Теги и контент HTML: Препроцессор Pug

Первое, с чем стоит ознакомиться при изучении Pug — синтаксис HTML разметки. Он не очень сложный, но имеет несколько ключевых моментов, которые влияют на компиляцию разметки.

В Pug нет понятий открытия и закрытия тегов, все теги указываются один раз без необходимости их закрывать. Например,

p
div
span
form

выведет

<p></p>
<div></div><span></span>
<form></form>

Это одна из причин, по которой разработчики любят html-препроцессоры. Как часто вы допускали ошибку в отсутствии закрывающего тега? Здесь этого не будет. Обратите внимание, что Pug, при компиляции в HTML, блочные элементы располагает на новых строках, а строчные на той же. Это может немного запутать вначале, но не бойтесь — вам редко понадобится смотреть в итоговый HTML.

Чтобы вложить контент внутрь тегов, возможны три варианта:

  1. Инлайн-стиль. Весь контент располагается сразу после обозначения тега.
  2. Pipe-стиль. Контент можно расположить в несколько строк. Каждая строка начинается с символа |
  3. Блочный стиль. Контент можно располагать в несколько строк. Для этого сразу после тега указывается точка.
p Это текст в «инлайн-стиле». Внутри тега будет весь контент, который вы укажете в строке.

p
  | Контент в Pipe-стиле
  | Каждая строка начинается с вертикальной черты

p.
  Блочный стиль. Здесь можно указывать любое количество строк.
  И для этого не нужно использовать специальные символы.
<p>Это текст в «инлайн-стиле». Внутри тега будет весь контент, который вы укажете в строке.</p>

<p>
  Контент в Pipe-стиле
  Каждая строка начинается с вертикальной черты
</p>

<p>
  Блочный стиль. Здесь можно указывать любое количество строк.
  И для этого не нужно использовать специальные символы.
</p>

Самая сложная часть при работе с текстом в Pug — пробельные символы. Попробуйте различные варианты текстов и тегов внутри. В конце урока мы разберём этот вопрос подробнее.

Вложенность тегов

Для создания вложенности в Pug используются отступы. Их количество может быть любым. Зачастую ориентируются на стандарт отступов в HTML, то есть в два пробела. Например,

section
  p Я — вложенный параграф в секцию
section
  h2 Лучшие товары в нашем магазине
  div
    h3 Товар 1
    p Цена: 55 рублей
<section>
  <p>Я — вложенный параграф в секцию</p>
</section>

<section>
  <h2>Лучшие товары в нашем магазине</h2>
  <div>
    <h3>Товар 1</h3>
    <p>Цена: 55 рублей</p>
  </div>
</section>

Важно: сохраняйте одинаковое количество отступов во всех вложенных элементах. В большинстве случаев Pug правильно поймёт разметку и с разным количеством отступов, но, потенциально, это может привести к ошибкам.


Атрибуты

Добавление атрибутов поначалу может немного запутать. Pug предоставляет несколько возможностей по добавлению атрибутов.

  1. Используя круглые скобки. В таком варианте возможно добавлять все аргументы, в том числе и пользовательские.
  2. Специальный синтаксис для классов и идентификаторов. Они просто обозначаются внутри разметки и похожи на селекторы CSS
section(id='news-container' class='container')
section#news-container.container
<section class="container" id="news-container"></section>
<section class="container" id="news-container"></section>

В разработке для классов используют второй синтаксис, а все другие атрибуты записываются в скобках. Здесь нет выработанных стандартов, но такое использование позволяет сократить код следующим образом: если не указать тег, а сразу написать класс, то Pug автоматически создаст <div> с нужным классом.

.container(data-container='news')
  .row
    .col
      p А вот и текст
<div class="container" data-container="news">
  <div class="row">
    <div class="col">
      <p>А вот и текст</p>
    </div>
  </div>
</div>

Важно: не смешивайте подходы. Если в проекте не указывается div вместе с классом, то стоит придерживаться такого подхода. Всегда важно сохранять общую стилистику. Если же в проекте до вас использовали указание div, то делайте так же.


Интерполяция тегов

Эта техника работы с тегами достаточно редкая, но всегда стоит иметь в виду её наличие. Внутри текста Pug позволяет использовать специальную конструкцию, чтобы добавить тег. Это помогает не дробить текст на несколько разных частей. Например, как вставить тег внутрь такого параграфа?

p.
  Хекслет — практические курсы по программированию.
  Мы помогаем новичкам стать профессиональными программистами, а опытным разработчикам получать новые знания и расти профессионально.

Pug позволяет просто обернуть нужную часть в тег, но в этом случае теряется смысловая семантика использования препроцессора. Ведь мы смешиваем обычный HTML с синтаксисом Pug

p.
  Хекслет — <strong>практические</strong> курсы по программированию.
  Мы помогаем новичкам стать профессиональными программистами, а опытным разработчикам получать новые знания и расти профессионально.

Избежать этого помогает конструкция #[тег контент].

p.
  Хекслет — #[strong практические] курсы по программированию.
  Мы помогаем новичкам стать профессиональными программистами, а опытным разработчикам получать новые знания и расти профессионально.
<p>Хекслет — <strong>практические</strong> курсы по программированию.
  Мы помогаем новичкам стать профессиональными программистами, а опытным разработчикам получать новые знания и расти профессионально.
</p>

Пробельные символы

Самая распространённая проблема при изучении Pug — понимание работы с отступами. На первый взгляд может показаться, что в этом не должно быть проблемы — ставь отступы и они появятся в HTML. И правда, в большинстве случаев Pug перенесёт все пробельные символы так, как они были установлены, но есть особенности. Рассмотрим их на примере текстового содержимого в Pipe-стиле.

Pipe-стиль удобен, если внутри текстового содержимого нужно использовать теги. Например,

div
  | Хотите получить товар?
  | Воспользуйтесь кнопкой
  button Оформить заказ
  | и оставьте свои контакты

Скорее всего, при переводе в HTML, вы ожидаете следующий результат:

<div>Хотите получить товар? Воспользуйтесь кнопкой <button>Оформить заказ</button> и оставьте свои контакты</div>

На самом деле получится такая разметка:

<div>Хотите получить товар? Воспользуйтесь кнопкой<button>Оформить заказ</button>и оставьте свои контакты</div>

Обратите внимание на пробелы вокруг тега <button>, а точнее на их отсутствие — Pug удаляет все пробелы между элементами. В этом примере есть текст и кнопка. Поскольку это два элемента, интерпретатор удаляет пробелы между ними, так как они не несут смысловой нагрузки. Такое поведение допустимо для удаления лишних символов между тегами, но приводит к проблемам при добавлении элемента внутрь текста.

Есть несколько вариантов решения этой проблемы:

  1. Добавить пустую Pipe-строку, которая преобразуется в пробельный символ.
  2. Использовать HTML-мнемонику.
  3. Добавить дополнительные пробелы. Этот вариант возможен, но использовать его не стоит по причинам, о которых мы ещё поговорим.

Пустая Pipe-строка — это разновидность официального «хака» — трюка, позволяющего решить проблему. Любая Pipe-строка должна вернуть некий символ, что играет на руку разработчикам. Если сама строка пустая, то интерпретатор подставит пробельный символ. Это немного загрязняет итоговый код, но выглядит достаточно прилично, чтобы использовать такой способ. Всё, что надо сделать — добавить по пустой строке до и после элемента.

div
  | Хотите получить товар?
  | Воспользуйтесь кнопкой
  |
  button Оформить заказ
  |
  | и оставьте свои контакты
<div>Хотите получить товар? Воспользуйтесь кнопкой <button>Оформить заказ</button> и оставьте свои контакты</div>

Вторым способом решения проблемы считается использование HTML-мнемоник — специальных конструкций, которые преобразуются браузером в нужные символы. Для неразрывного пробела есть символ &nbsp;. Добавив его до и после кнопки можно решить проблему отсутствующих символов.

div
  | Хотите получить товар?
  | Воспользуйтесь кнопкой&nbsp;
  button Оформить заказ
  | &nbsp;и оставьте свои контакты
<div>Хотите получить товар? Воспользуйтесь кнопкой&nbsp;<button>Оформить заказ</button>&nbsp;и оставьте свои контакты</div>

Попробуйте добавить этот HTML-код в ваш файл и посмотрите, как браузер преобразует мнемоники в нужные символы.

Последний способ, который может помочь в примере выше — добавление отдельных пробелов в разметку Pug. Этот способ похож на использование мнемоник, только вместо них добавляется именно символ. Pug не удаляет пробельные символы внутри элемента. Если добавить тысячу пробелов между двумя словами, то интерпретатор бережно перенесёт их в разметку. Поэтому достаточно добавить пробел после фразы «Воспользуйтесь кнопкой» и перед фразой «и оставьте свои контакты». При всей работоспособности этот способ несёт несколько проблем:

  1. Такую разметку тяжело читать. Не всегда возможно сходу разобраться, сколько пробелов стоит перед строкой, а количество пробелов после строки и вовсе не видно.
  2. Большинство редакторов кода автоматически удаляют символы в конце строки, так как в них нет необходимости. В этом случае нет возможности добавить пробел после фразы «Воспользуйтесь кнопкой».

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

Дополнительное задание

Используя синтаксис Pug, воспроизведите следующую разметку:

<section class="container">
  <div class="col-2">
    <div class="content">
      <h1>О Хекслете</h1>
      <p>Хекслет — практические курсы по программированию. Мы помогаем новичкам стать профессиональными программистами, а опытным разработчикам получать новые знания и расти профессионально.</p>
    </div>
    <div class="side">
      <ul>
        <li><strong>Теория.</strong> Короткая лекция в виде текста или видео. Она основана на задаче, так что в отличие от традиционной академической теории, мы делаем упор на специфическую задачу, которая уже решена умными инженерами и программистами, а затем следуем по их шагам, чтобы понять решение.</li>
        <li><strong>Тест.</strong> Проверка вашего понимания. Нам не важно запоминание фактов, поэтому вопросы теста нацелены на понимание концепции, а не на тренировку памяти.</li>
        <li><strong>Практика.</strong> Упражнения по программированию в реальной среде разработки, доступны через браузер. Не в виде симуляции, не в виде игрушки, а на настоящей машине с базами данных, фреймворками, серверами и другими инструментами.</li>
      </ul>
    </div>
  </div>
</section>

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»