npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

jst_compiler

v3.0.1

Published

The client and server template engine in JavaScript

Downloads

3

Readme

jst

NPM version Build Status Coverage Status Dependency Status

Клиентский и серверный шаблонизатор на JavaScript.

Возможности:

  • быстрый — шаблоны компилируются в чистый JavaScript;
  • компактный — ядро шаблонизатора занимает менее 6 КБ;
  • безопасный — экранирование HTML по умолчанию;
  • монолитный — ядро и скомпилированные шаблоны помещаются в один файл;
  • расширяемый — можно добавлять свои фильтры, наследовать шаблоны;
  • простой — 10 минут на изучение.

Установка

npm install jst_compiler -g

Использование в командной строке

jst_compiler ./example.jst.html - компиляция одного шаблона в файл ./example.jst.js

jst_compiler ./example.jst.html ./file.jst.js - компиляция одного шаблона в файл ./file.jst.js

jst_compiler ./examples - компиляция папки с шаблонами в файл ./all.jst.js

jst_compiler ./examples ./examples.jst.js - компиляция папки с шаблонами в файл ./examples.jst.js

jst_compiler -w ./examples ./examples.jst.js - компиляция папки с шаблонами в файл ./examples.jst.js без jst-ядра

jst_compiler -h - вызов справки

jst_compiler -V - версия компилятора

Плагин для сборки с Gulp

gulp-jst_compiler

Быстрый старт

  • npm install jst_compiler -g
  • Создаём файл с расширением .jst.html - example.jst.html:
<template name="example">
    Hello world!
</template>
  • jst_compiler ./example.jst.html

Подключение в браузере

<!-- Скомпилированные шаблоны и ядро -->
<script src="./all.jst.js"></script>
...
<div id="container"></div>
...
<script>
    // Обычный способ
    document.getElementById('container').innerHTML = jst('example');

    // для jQuery
    $('#container').jst('example');
</script>

Использование в Node.js

require('./all.jst.js'); // Скомпилированные шаблоны и ядро
...
var content = jst('example');

Передача и вставка параметров

Для вывода данных в шаблоне используется запись<%= data %>. Значения null или undefined заменяются на пустую строку, HTML при вставки экранируется.

Для вставки без HTML-экранирования используется запись <%! data %>.

<template name="example" params="word">
    Hello <%= word %>! <!-- С экранированием HTML -->
</template>

<template name="example" params="word">
    Hello <%! word %>! <!-- Без экранирования HTML -->
</template>

Параметры по умолчанию

<template name="example" params="title, str = 'world'">
    <h2><%= title %></h2>
    Hello <%= str %>!
</template>

Условия

<template name="example" params="x">
    <% if (x) { %>
        Yes
    <% } else { %>
        No
    <% } %>
</template>

Предпочтительное использование условий (тернарная версия):

<template name="example" params="x">
    <%= x ? 'Yes' : 'No' %>
</template>

Вызов шаблона из шаблона

<template name="example" params="x">
    <%! template('myAnotherTemplate', x) %>
</template>

<template name="myAnotherTemplate" params="x">
    ...
</template>

Блоки (подшаблоны) и вызов блока

<template name="example" params="x">
    <block name="block1" params="y">
        ...
        <%= y %>
        ...
    </block>
    <block name="block2">
        ...
    </block>

    <%= block('block1', x) %> <!-- HTML экранируется -->
    <%! block('block2') %> <!-- HTML не экранируется -->

</template>

Циклы в шаблонах

<template name="myTemplate" params="items">
    ...
    <%= each('myAnotherTemplate', items) %>
    ...
</template>

<template name="myAnotherTemplate" params="element, index">
    ...
    <%= element %>
    ...
</template>

Итерироваться можно как по массивам, так и по объектам.

Вызов шаблона в цикле

// Обычный способ
var content = jst.each('item', [1, 2, 3]);

// Для jQuery
$('#content').jstEach('item', [1, 2, 3]);

Циклы в блоках

<template name="myTemplate" params="items">
    <block name="myBlock" params="element, index">
        <%= element %>
    </block>

    <%= eachBlock('myBlock', items) %>

</template>

Вызов блока в цикле

<script>
    // Обычный способ
    var content = jst.eachBlock('myTemplate', 'myBlock', [1, 2, 3]);

    // Для jQuery
    $('#content').jstEachBlock('myTemplate', 'myBlock', [1, 2, 3]);
</script>

Наследование

Между шаблонами наследуются блоки. Механизм наследования в шаблонах основан на прототипах в JavaScript.

<template name="one" params="x">
    <block name="block1" params="y">
        ...
        <%= y %>
        ...
    </block>
    <block name="block2">
        ...
    </block>

    <%= block('block1', x) %> <!-- HTML экранируется -->
    <%! block('block2') %> <!-- HTML не экранируется -->

</template>

<template name="two" params="x" extend="one">
    <%= block('block1', x) %>
</template>

Фильтры

Фильтр позволяет преобразовать данные перед их вставкой в шаблон.

По умолчанию на весь вывод данных накладывается фильтр _undef (замена null и undefined на пустую строку). При использовании записи вида <%! a %> html не экранируется, а при <%= a %> накладывается фильтр html.

Короткая запись фильтра - <%= data | trim %> Длинная - <%= filter.trim(data) %>

Можно указывать несколько фильтров, порядок выполнения - слева направо. <%= data | stripTags | trim | truncate(8) %> <%= filter.truncate(filter.trim(filter.stripTags(data), 8))) %>

Поддерживаемые фильтры

trim

Удалить пробелы с начала и конца строки: <%= ' hello world! ' | trim %>hello world!

ltrim

Удалить пробелы с начала строки: <%= ' hello world! ' | ltrim %>hello world!

rtrim

Удалить пробелы с конца строки: <%= ' hello world! ' | rtrim %> hello world!

truncate

Обрезать строку до нужной длины: <%= '1234567' | truncate(3) %>123

upper

Перевести символы в верхний регистр: <%= 'john' | upper %>JOHN

lower

Перевести символы в нижний регистр: <%= 'HoUsE' | lower %>house

ucfirst

Первый символ в верхний регистр: <%= 'alice' | ucfirst %>Alice

lcfirst

Первый символ в нижний регистр: <%= 'Dog' | lcfirst %>dog

first

Вывести первый элемент массива или первый символ строки: <%= [2, 3, 4] | first %>2 <%= 'Cat' | first %>C

last

Вывести последний элемент массива или последний символ строки: <%= [2, 3, 4] | last %>4 <%= 'Cat' | last %>t

prepend

Добавить строку перед значением: <%= 'world!' | prepend('Hello ') %>Hello world!

append

Добавить строку после значения: <%= 'Hello ' | append('world!') %>Hello world!

repeat

Повторить строку нужное количество раз: <%= 'many ' | repeat(3) %>many many many

remove

Удалить текст по регулярному выражению: <%= 'hello world!' | remove('l') %>heo word!

replace

Заменить текст по регулярному выражению: <%= 'Hello boss!' | replace('boss', 'Duck') %>Hello Duck!

collapse

Удалить повторяющиеся пробелы: <%= 'Dog' | collapse %>dog

stripTags

Удалить HTML-теги: <%= '<p>123</p>' | stripTags %>123

join

Склеить массив в строку: <%= [1, 2, 3] | join(' ') %>1 2 3

html

Экранировать HTML: <%= '<p>123</p>' %>&lt;p&gt;123&lt;/p&gt; <%= '<p>123</p>' | html %>&amp;lt;p&amp;gt;123&amp;lt;/p&amp;gt; - двойное экранирование <%! '<p>123</p>' %><p>123</p> <%! '<p>123</p>' | html %>&lt;p&gt;123&lt;/p&gt;

unhtml

Разэкранировать HTML: <%= data | unhtml %>

uri

Экранировать урл: <%= myUrl | uri %>

void

Запретить вывод значения: <%= data | void %>

Как добавить свой фильтр?

jst.filter.myFilter = function (str, param) {
    //...
    return str;
};

Сохранение пробелов между jst-тегами

<template name="example" params="x, y">
    <%= 'x' %> hello world! <%= 'y' %> <!-- xhello world!y -->
    <%= 'x' +%> hello world!  <%= 'y' %> <!-- x hello world!y -->
    <%= 'x' +%> hello world!  <%=+ 'y' %> <!-- x hello world! y -->
</template>

Использование JavaScript в шаблонах

<template name="example" params="word">
    Hello<% var b = word || 'world'; %> <%= b %>!
</template>

Комментарии

<template name="example" params="word">
    Hello <%# мой комментарий %>!
</template>
<template name="example" params="word">
    Hello <%# мой
    многострочный
    комментарий %>!
</template>

Отладка

После компиляции каждый шаблон выполняется с помощью eval. В случае ошибки, шаблон в результирующий код не включается, вместо этого вставляется console.warn('...') с названием шаблона и описанием ошибки.

При вызове в коде неизвестного шаблона генерируется исключение.

Отладка в шаблонах:

<template name="example" params="data">
    <% console.log(data) %>
</template>

Лицензия

MIT License