<commit_before>Язык описания шаблонов Snakeskin
================================

Всем привет! В этом посте я хочу рассказать о своей разработке: ЯП для описания текстовых шаблонов - Snakeskin.
Проекту уже более 3.5 лет, и мне кажется, что все детские болезни он пережил, поэтому я могу поделиться результатом с сообществом.

[GitHub](https://github.com/SnakeskinTpl/Snakeskin)

[Документация](http://snakeskintpl.github.io/docs/index-ru.html) (английская версия пока не сделана)

[Смежные проекты](https://github.com/SnakeskinTpl)

## Немного истории

В 2012 году, когда я работал в Яндексе, вопрос шаблонизаторов часто поднимался на кофепоинтах и в столовых: мы
обсуждали достоинства и недостатки тех или иных решений, кто-то рассказывал про свои разработки и т.д. 
У нас в отделе в ту пору использовался TemplateToolkit2, популярный у Perl разработчиков шаблонизатор, а на клиенте
простейший MicroTemplate от Ресига. Также следует отметить, что в то время активно форсились XSLT-подобные решения, но 
по ряду причин мы отказались от них. Время от времени мы экспериментировали с другими движками: Handlebars, Dust, Closure Templates, 
и, конечно же свои велосипеды, что привело к наличию целого зоопарка шаблонов в проекте :)

Лично мне в ту пору понравился Google Closure Templates: он был близок программисту, т.к. там шаблон позиционировался как
функция, были неплохие по тем временам фичи, но очень огорчала необходимость править Java файл, чтобы добавить банальный фильтр,
да и скорость трансляции была не аховая, т.е. это реально чувствовалось. И мне захотелось сделать свой Closure Templates,
но с блэкджеком и шлюхами, который был бы написан на JS и был более открытый к модификациям. Также я захотел добавить
модель наследования шаблонов основанную на статических блоках, которую я подсмотрел в Django Templates 
(кстати, название Snakeskin - это была косвенная отсылка к Python шаблонизатору :)).

И вот я сел за разработку: прототип я написал дня за 2-3 и там был жуткий хардкод на регулярках и строк 600-700 кода.
С результатом я немного поигрался, поделился с коллегами и получил некоторый фидбэк. 
Далее я решил всё это дело стабилизировать, добавить рюшечек и уже начать использовать: после недели разработки я 
напилил версию 2 - это был по сути тот же хардкод на регулярках, но более стабильный и более фичастый.
Поигравшись некоторое время с веткой 2, и выпустив пяток другой обновлений, я сел потирая руки перед монитором с мыслью
"настало время всё сделать как надо" и где-то через месяц разработок я выпустил 3-ю версию Snakeskin: я выкинул хардкод,
переписал код на ES6 (в то время не было нормальных трансляторов, поэтому я написал на коленке свой транслятор с 
жутким хардкодом на регулярках :) https://github.com/kobezzza/NeJS ), 
добавил построение дерева при парсинге, добавил довольно много новых фич и т.д.. Новая ветка вышла довольно стабильная 
и представляла из себя Closure Templates на стероидах - я был доволен результатам и стал использовать Snakeskin в своих
личных проектах, время от времени выпуская новые обновления и патчи. Через несколько месяцев я познакомился с HAML, а 
затем с Jade - мне понравился их подход к синтаксису и я решил добавить возможность использования такого синтаксиса.
После нескольких месяцев плотной разработки я сделал Snakeskin 4, который стал новой веткой в развитии языка и 
определил дальнейшее развитие, а последующие версии 5 и 6 стали модификацией 4-й версии (т.к. паттерн версионирования у меня - 
это SemVer, то обновление главной цифры - это просто поломка совместимости, а не "глобальное" обновление).

В общем SS развился до 6-й версии: фич стало очень много и часто стали возникать конфликты между различными директивами - 
всё было очень неорганизованно, т.к. язык разрабатывался без начальной спецификации и обсуждений, а по мере нужд разработки и просто хотелок.
SS 6 я использовал довольно долго в самых различных проектах, также эту версию стали использовать мои знакомые и коллеги
и в итоге у меня скопился целый ряд претензий к языку и я решил, что настало время стандартизировать язык, ввести спецификацию,
удалить мусор и т.д. Разработка затянулась на 1.5 года (из них активная разработка была где-то 4-5 месяцев), но в итоге
получился самый стабильный и продуманный на данный момент релиз - Snakeskin 7, которым я пожалуй даже горжусь :)<commit_msg>:wrench:<commit_after>Язык описания шаблонов Snakeskin
================================

Всем привет! В этом посте я хочу рассказать о своей разработке: ЯП для описания текстовых шаблонов - Snakeskin.
Проекту уже более 3.5 лет, и мне кажется, что все детские болезни он пережил, поэтому я могу поделиться результатом с сообществом.

[GitHub](https://github.com/SnakeskinTpl/Snakeskin)

[Документация](http://snakeskintpl.github.io/docs/index-ru.html) (английская версия пока не сделана)

[Смежные проекты](https://github.com/SnakeskinTpl)

## Немного истории

В 2012 году, когда я работал в Яндексе, вопрос шаблонизаторов часто поднимался на кофепоинтах и в столовых: мы
обсуждали достоинства и недостатки тех или иных решений, кто-то рассказывал про свои разработки и т.д. 
У нас в отделе в ту пору использовался TemplateToolkit2, популярный у Perl разработчиков шаблонизатор, а на клиенте
простейший MicroTemplate от Ресига. Также следует отметить, что в то время активно форсились XSLT-подобные решения, но 
по ряду причин мы отказались от них. Время от времени мы экспериментировали с другими движками: Handlebars, Dust, Closure Templates, 
и, конечно же свои велосипеды - что привело к наличию целого зоопарка шаблонов в проекте :)

Лично мне в ту пору нравился Google Closure Templates: он был близок программисту, т.к. там шаблон позиционировался как
функция, были неплохие по тем временам фичи, но очень огорчала необходимость править Java файл, чтобы добавить банальный фильтр,
да и скорость трансляции была не аховая, т.е. это реально чувствовалось. И мне захотелось сделать свой Closure Templates,
но с блэкджеком и шлюхами, который был бы написан на JS и был более открытый к модификациям. Также я захотел добавить
модель наследования шаблонов основанную на статических блоках, которую я подсмотрел в Django Templates 
(кстати, название Snakeskin - это была косвенная отсылка к Python шаблонизатору :)).

И вот я сел за разработку: прототип я написал дня за 2-3 и там был жуткий хардкод на регулярках и строк 600-700 кода.
С результатом я немного поигрался, поделился с коллегами и получил некоторый фидбэк. 
Далее я решил всё это дело стабилизировать, добавить рюшечек и уже начать использовать: после недели разработки я 
запилил версию 2 - это был по сути тот же хардкод на регулярках, но более стабильный и более фичастый.
Поигравшись некоторое время с веткой 2, и выпустив пяток другой обновлений, я сел потирая руки перед монитором с мыслью
"настало время всё сделать как надо" и где-то через месяц разработок я выпустил 3-ю версию Snakeskin: я выкинул хардкод,
переписал код на ES6 (в то время не было нормальных трансляторов, поэтому я написал на коленке свой транслятор с 
жутким хардкодом на регулярках :) https://github.com/kobezzza/NeJS), 
добавил построение дерева при парсинге, добавил много новых фич и т.д.. Новая ветка вышла довольно стабильная 
и представляла из себя Closure Templates на стероидах - я был доволен результатам и стал использовать Snakeskin в своих
личных проектах, время от времени выпуская новые обновления и патчи. Через несколько месяцев я познакомился с HAML, а 
затем с Jade - мне понравился их подход к синтаксису и я решил добавить возможность использования такого синтаксиса.
После нескольких месяцев плотной разработки я сделал Snakeskin 4, который стал новой веткой в развитии языка и 
определил дальнейшее развитие, а последующие версии 5 и 6 стали модификацией 4-й версии (т.к. паттерн версионирования у меня - 
это SemVer, то обновление главной цифры - это просто поломка совместимости, а не "глобальное" обновление).

В общем SS развился до 6-й версии: фич стало очень много и часто стали возникать конфликты между различными директивами - 
всё было очень неорганизованно, т.к. язык разрабатывался без начальной спецификации и обсуждений, а по мере нужд разработки и просто хотелок.
SS 6 я использовал довольно долго в самых различных проектах, также эту версию стали использовать мои знакомые и коллеги
и в итоге у меня скопился целый ряд претензий к языку и я решил, что настало время стандартизировать язык, ввести спецификацию,
удалить мусор и т.д. Разработка затянулась на 1.5 года (из них активная разработка была где-то 4-5 месяцев), но в итоге
получился самый стабильный и продуманный на данный момент релиз - Snakeskin 7, которым я пожалуй даже горжусь :)
{'fraction_non_alphanumeric': 0.04731133164089545, 'fraction_numerical': 0.006923609508423725, 'mean_word_length': 4.973121984838043, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 3, 'https://': 6, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '872674', 'n_tokens_mistral': 3495, 'n_tokens_neox': 4241, 'n_words': 1231}