b2bon.ru

Шаблоны (cybervela.templates.js)

Система шаблонизации позволяет динамически вставлять данные в HTML-шаблоны с поддержкой условий, циклов и вложенных шаблонов.

Пример использования

// HTML шаблон
<template id="user-card">
  {#if user.isAdmin}
    <div class="admin-tag">Админ</div>
  {/if}

  <h3>{user.name}</h3>
  <p>Email: {user.email}</p>

  {#each user.roles}
    <span class="role">{item}</span>
  {/each}
</template>

// Инициализация
const templateEngine = new TemplateEngine();
const html = templateEngine.render('#user-card', {
  user: {
    name: 'Иван Иванов',
    email: 'ivan@example.com',
    isAdmin: true,
    roles: ['Пользователь', 'Модератор']
  }
});

Основные возможности

  • • Условия: {#if condition}...{/if}
  • • Циклы: {#each array}...{/each}
  • • Включения: {#include templateName}
  • • Выражения: {expression}

Условные блоки

Пример:

{#if user.status === 'active'}
  <span>Активный пользователь</span>
{/if}

Циклы

Пример:

{#each products}
  <div class="product">
    <h4>{item.name}</h4>
    <p>{item.price} руб.</p>
  </div>
{/each}

Включения шаблонов

Пример:

// Основной шаблон
<template id="main">
  <header>{#include header}</header>
  <main>{content}</main>
</template>

// Вложенный шаблон
<template id="header">
  <nav>Меню</nav>
</template>

Выражения

Поддерживаются:

  • • Переменные: {user.name}
  • • Методы: {formatDate(user.birthdate)}
  • • Операции: {price * 0.9}
  • • Условия: {stock > 0 ? 'В наличии' : 'Нет'}

Безопасный контекст

Доступны встроенные функции:

Работа с массивами

{join(roles, ', ')} // Объединяет элементы массива
{slice(products, 0, 3)} // Возвращает подмассив
{filter(users, u => u.active)} // Фильтрация
{map(items, i => i.toUpperCase())} // Преобразование
{sort(names, (a,b) => a.localeCompare(b))} // Сортировка
{reverse(list)} // Инвертирует порядок
{length(arr)} // Получает длину массива

Работа со строками

{toUpperCase(name)} // Заглавные буквы
{toLowerCase(email)} // Строчные буквы
{trim(description)} // Убирает пробелы
{replace(text, /old/g, 'new')} // Замена текста
{split(tags, ', ')} // Разбивает строку
{substring(text, 0, 100)} // Обрезает строку
{trimEnd(address)} // Убирает пробелы справа

Работа с числами

{parseInt('123')} // Преобразует в число
{parseFloat('3.14')} // Число с плавающей точкой
{isNaN(value)} // Проверка на NaN
{isFinite(num)} // Проверка на конечность
{Math.round(price)} // Округление
{Math.max(...numbers)} // Максимальное значение

Работа с датами

{now()} // Текущее время в миллисекундах
{formatDate(order.date, 'DD.MM.YYYY')} // Форматирование
{new Date(timestamp)} // Создание объекта Date

Работа с объектами

{keys(user)} // Получает ключи
{values(profile)} // Получает значения
{entries(settings)} // Ключ-значение
{hasOwn(user, 'id')} // Проверка наличия свойства

Реализация через класс templates

Для работы с шаблонами из DOM:

// HTML
  <template class="user-card">
    <div class="card">
      <h3>{name}</h3>
      <p>{bio}</p>
    </div>
</template>

// JS
const templates = new templates(core);
templates.set('.user-card');
const userCard = templates.get('user-card')[0];
const html = templateEngine.render(userCard.templateHTML, userData);

Обработка ошибок

Система автоматически логирует ошибки:

// При неправильном выражении:
{undefinedVariable + 5} // Будет выведено как есть
console.warn: Error evaluating expression...