Как стать автором
Обновить

Комментарии 164

Крутая статья. В закладки.
Статья интересная, а подача требует «внезапно» сломать голову.
подача клоунская, портит годную статью.
кажется ты слишком напряжён :-о *массирует плечи* расслабься!
кажется, вы слишком любите говорить от третьего лица, что и превращает годную статью в кукольный театр.

А вообще, очень интересный подход к шаблонам. Фактически как у Резига в результате получаются скомпилированные шаблоны, но в гибче с точки зрения выходных данных
я люблю экспериментировать %-)

и гораздо быстрее, кстати. особенно в хроме, с его прекомпиляцией.
Мне было реально трудно ее читать из-за этих *напрягающих* вставок
Диалоги персонажей в стиле Web 2.0 прямо.
настоящие джедаи делают так:
javascript: document.documentElement.innerHTML= document.documentElement.innerHTML.replace( /\*[а-я].*?[а-я]\*/g, ' ' )
НЛО прилетело и опубликовало эту надпись здесь
не, всего-лишь Зелёнка ^^'
НЛО прилетело и опубликовало эту надпись здесь
Силы мало в тебе чувствую я. Качаться нужно тебе ещё.
НЛО прилетело и опубликовало эту надпись здесь
никаким, но если очень хочется, то:

TT.template( '{[}{xxx}{]}' )({ '[': '{', ']': '}', xxx: 777 })
Выглядит как жесткое порно.
экранирование — всегда порно…
НЛО прилетело и опубликовало эту надпись здесь
а почему не сделать экранирование двойными скобками, например {{{variable}}} выведет {значение}
парсить это дело сложно ._.
Парсер пишется один раз, а использается постоянно.
Должно быть легко в использовании, а не написании парсера.
сложный парсер медленнее работает… впрочем, я согласен.
сделал такое экранирование
теперь для экранирования достаточно удвоить фигурную скобку
Вычитав еще пару раз драматургический опус статью, мне понравился подход :), спасибо.
НЛО прилетело и опубликовало эту надпись здесь
а как будет понятнее, проще или красивее?
Очень удобно, красиво и уже сравнительно давно изобретено. И оттестировано многими разработчиками.
значит тебе не составит труда переписать мой пример на каждый из них?
На embeddedjs.com/ есть отличная интерактивная демка.
я в курсе
Почему нету точек с запятой в конце строк?
Они, конечно, не обязательны, но крайне желательны, и без них невозможно "упаковать" скрипт
м… а зачем его упаковывать в одну строку? х) это же не букмарклет какой-нибудь…
Если поставить галочку возле Shrink variables размер уменьшиться в 1.8 раза.
а семиколоны тут при чём?
При том, что всё сворачивается в одну строчку для уменьшения размера почти на 30%
ты предлагаешь добавить 30% семиколонов, чтобы можно было вырезать 30% переводов строк? х) шило на мыло…
Во-первых, есть еще пробелы для форматирования.
Во-вторых, не в каждой строчке надо ставить семиколон.
В-третьих, перевод строк частенько состоит из 2х байт.
1. пробелы можно вырезать независимо от наличия семиколонов
2. как и перенос строки
3. какие проблемы редуцировать перенос строки до 1 символа?
Зачем изобретать велосипед?
я и не предлагаю
тогда смысл экономить на семиколонах?
потому что перевод строки необходим и достаточен.
Замкнутый круг. Перейдите в начало ветки.
Когда-то прочёл, что если точек с запятыми нет, то некоторые (многие?) движки сначала их предварительно расставляют (выглядит странно), что негативно сказывается на производительности. Или сильнее напрягаются в парсинге (что вполне объяснимо). С теми же последствиями. Зуб за эту информацию не даю, продаю за что купил, но с некоторых пор сменил бесточекасзапяточный :) стиль обратно на классический. Мне не жалко, а шансов нарваться на ошибку парсинга чуть меньше, ну и со скоростью — вдруг не соврали…
разница в скорости незначительна.
никто их при парсинге не расставляет, ибо они являются лишь разделителями операторов
>разница в скорости незначительна.
Я не проверял.
>никто их при парсинге не расставляет, ибо они являются лишь разделителями операторов
Расставляет. Об этом даже есть специальный раздел в стандарте. Automatic Semicolon Insertion называется. Ну, то есть, физически можно не вставлять, но поведение должно соответствовать варианту, как будто вставляется.
это всего-лишь игра слов для простоты понимания.
Это описание поведения интерпретатора. И парсер именно так и работает. Фиг с ней со скоростью, главное тут побочные эффекты.
парсер создаёт дерево инструкций. в этом дереве нет ни семиколонов, ни переводов строк.
??? При чём здесь дерево инструкций? Описано поведение парсера во время парсинга исходного текста.
ECMAscript Language Specification, пункт Automatic Semicolon Insertion.
Там описано как должен вести себя парсер языка ECMAscript. Как ведёт себя парсер из википедии меня совершенно не волнует. Вы полагаете, яваскриптовые движки пишут по википедии, а не по спецификации? Ну-ну.
парсеры пишут по уму. а спецификация описывает лишь эталонную реализацию.
ни один программист не будет писать парсер автоматически вставляющий семиколоны, банально потому, что это медленно и бессмысленно.
Угу, я про это тоже писал. Но анализировать ситуацию всё-равно надо — раз, и спецэффекты всё-равно остаются — два.
не говорите глупостей, я лично собираю все скрипты в один пак, сжимаю. На выброс идет пакованый скрипт + gzip + кэшируется. В итоге клиент получает 57.9 KB вместо 220кб ;)
эм… ну я рад за тебя. а теперь удали все семиколоны и удивись разнице.
чему удивлятся? ошибкам после того как скрипты пройдут через Closure Compiler?
СС настолько тупой, что ломает скрипты?
Семиколоны в некоторых случаях должны быть по стандарту. Если их нет — движок пытается «угадать». Логично предположить, что не всегда он угадает правильно.

Именно поэтому надо их ставить везде. А убирать, для компенсации, переносы строк ;-)
должны быть они лишь в цикле for. в остальных случаях перевод строки делает их использование бессмысленным.
Вот пример. Падает с ошибкой из-за пропущенной ;.

<script>
var a = 5
(true)
</script>

Интерпретатор трактует это как вызов функции 5(true). Так что ставьте везде семиколоны ;-)
это синтетический пример.
<script>
var a = 5
(condition? obj1: obj2).callSomeFunc()
</script>

Тоже самое. Пример, более близкий к жизни, коли вам так угодно.

Если следующая строка с точки зрения синтаксиса может быть продолжением предыдущей — она станет продолжением предыдущей. Если не может — будет автоматически вставлен семиколон.
а это говнокод :-Р надо писать так:
var a= 5
var obj= condition? obj1: obj2
obj.callSomeFunc()
Ну говнокод это или нет — вопрос отдельный, другое дело что это конкретный, реальный пример когда точки с запятыми нужны. Сколько таких примеров можно при желании найти еще и где они всплывут — науке не известно. Именно по этому я считаю, что точки с запятыми надо ставить всегда.
науке всё прекрасно известно :-Р именно поэтому у меня никогда из-за этого проблем не возникало.
НЛО прилетело и опубликовало эту надпись здесь
каждый думает в меру своей испорченности ;-)
олдфаги помнят зачин «здравствуй дружочек» и одобряют топик
У меня при чтении возникло ощущение, что статью пишет анимешник. Я укрепился в этом мнении, когда дочитал до ника автора =)
все анимешники немного того х)
НЛО прилетело и опубликовало эту надпись здесь
нет, конечно :-о
НЛО прилетело и опубликовало эту надпись здесь
ага, и сколько хостинга…
Нужно отобрать у автора как можно больше ЛСД.
не получится — я уже всё скурил %-)
ЛСД даже не курят :)
так вот почему так плохо торкает! :-о
как же
курят даже орех
клоунада, а не статья
И Смешно и поучительно одновременно
НЛО прилетело и опубликовало эту надпись здесь
Жаль, а ведь, наверное, что–то интересное написано. Ведь правда? *обнимаю в охапку и плачу*
правда *взаимообнимаю* (Y_Y)
А чем отличается объявление:

TT.html= function( tpl )…

от:

TT.html.encoder= new function( )…

С какой целью в одном имеется оператор new, а в другом нет?
new используется для создания дополнительного скопа, куда помещаются статические переменные, необходимые для определяемой функции
1) скоп — что это?
2) чем переменная в функции без new будет отличаться от функции с new?

Да и вообще, можешь рассказать об этом подробнее?
А то я даже вопросов пока сформулировать не могу толком =)
Не проще было написать что var x = new function(){}; равносильно var x = (function(){})();.
и тогда бы он спросил, что такое (function(){})()? х)
Такой вариант, по моим наблюдениям, встречается чаще.
То есть, в этом случае функция не только объявляется, но и выполняется, при этом её результат пишетя в x?
Или, другими словами, в x пишется не функция, а результат функции?
агась
а зачем кстати новый скоуп для TT.template, почему было searcher просто внутрь не положить?
чтобы не создавать его заново при каждом создании темплейта.
в первом случае просто определяется анонимная функция, а во втором случае, благодаря оператору new она еще и вызывается, что приводит к созданию нового объекта вызова, в который попадают все определяемые внутри переменные
м… надо будет выпустить аудиокнигу %-)
фильм. тогда не будет этих вставок, за которыми теряется весь смысл текста.
ага и обязательно тетю асю с 3м размером: Р
только чтобы третий размер не отвлекал куда больше, чем вставки в тексте..:)
Материал довольно интересен. То есть его можно кушать и нахваливать. Антураж весь вот этот лично для меня портит впечатление. То есть по итогам оценка — 0.
Но тут я вспоминаю слово «порева», меня передергивает еще разок и ставлю минус.
ви таки порноненавистник? х)
Таки нет, но есть вещи уместные и неуместные.
скучный ты .-.
Нет, просто я во всем люблю красоту. Можно сделать узбекский орнамент на ковровой рамке у портрета Путину или там украсить свой автомобиль лошадиным хвостом. Главное при этом остроумие, оригинальность изобретательность и пр.

Человек ведущий себя в разных ситуациях нестандартно может быть яркой личностью а может тупым неадекватом. Оба делают что-то «нескучное» на их субъективный взгляд, а получается по-разному. Андэстэнд?
ты посягаешь на мою индивидуальность! т-т
а кто тебе сказал что ты правильно отличишь яркую личность от тупого неадеквата?
Это субъективные оценки. И здесь никакого «правильно» или «неправильно» быть не может.

так и я о том
Если табуляцию выставить в два пробела — то уже не так страшно.
угу, подсвечиватель невменяемый какой-то >_<
НЛО прилетело и опубликовало эту надпись здесь
статья и особенно её подача впечатлили. ушло в избранное :)
НЛО прилетело и опубликовало эту надпись здесь
По стилю здорово =) Разбавит немного хабрашаблоны и хабразаискивания. Так держать!
Забавно все это конечно, только зачем что-либо экранировать на стороне JS?
а где ты предлагаешь экранировать?
Хм, ну такие вещи вроде-как на стороне сервера делаются, не? (-:
не всегда
Есть Javascript на стороне сервера ;)
Перед сном детям читать
Вам бы JS в яслях преподавать
Выглядит зловеще:
.split( '"' ).join( '"' )

Это действительно делает что-то полезное?
блоо, хабралох сломал — ща починю
материал неплохой, подача, соглашусь, чрез чур юморная. а так я сам нечто подобное использую для всего, что надо «отшаблонизировать»
«чрез чур» :))
а черт его знает как оно пишется :)
я в таких случаясь руководствуюсь правилом: как слышится, так и пишется
сколько людей — столько способов решить проблему :)
я, к примеру, когда не уверен — проверяю в словаре

а в данном случае — и слышится, видимо, всем по-разному
мне слышится как раз «чересчур»… ну, может быть, «чирисчур» (безударные «е» звучат как «и»)
что такое ТТ?
смайлик такой х)
TrueTemplates
Переводы строк уходят в аут после парсинга.
Замените
/(.*?)(\{|\}|$)/g
на
/([\s\S]*?)(\{|\}|$)/g
, чтоли ;)
м… интересное решение, спасибо :-о
А еще, возможно, стоит сделать так:
/([\s\S]*?)(\{|\}|$)(?!\2)/g

Тогда решится проблема с экранированием (две скобки == просто скобка):
var template= TT.html( 'По {{fake}} запросу <kbd>{query}</kbd> найдено страниц: {count}' )
var message= template({
    fake: 'этому',
    query: 'Ultimate Answer to the Ultimate Question of Life, The Universe, and Everything',
    count: 42 });
к сожалению, не всё так просто…
TT.template( 'a{{{b}}}c' )({ b: 'd' }) должно преобразовываться в 'a{d}c'
Да, действительно :(
короче, сделал экранирование %-)
Что-то теперь вообще странно. Выдает на пример
{}Ultimate Answer to the Ultimate Question of Life, The Universe, and Everything{}42{}
может ты что-то не так скопипастил? о0
Ну… скачал скрипт… searcher такой:
/((?:[^\{\}]|\{\{|\}\})*)(?:\{|$)|([^\{\}]*)(?:\})/g
опа… в лисице косячок ^^'
в общем, поправил
А я вот, а я, по первым 2 строчкам догадался кто автор! Подход очень интересный, хотя конечно надо еще посмотреть насоклько это грузит браузер, все эти замыкания и прочая ересь.
замыкания — это очень быстро
главное, чтобы где-то в родитетельском scope не попались ссылки на DOM-объекты ;) Ибо ололо.
ничего страшного не будет
То есть не будет? Убиваем элемент в дереве, ссылка на него в контексте, залоченном в замыкании остается, вуаля — leak detected. Или я что-то путаю?
а, ты про утечки… им тут не от куда взяться.
тут негде. Это был ответ на
замыкания — это очень быстро
Hi I'm the author of pure.js mentioned above (thanks SMiX for the link).
I read this post through Chrome Translate, so please be nice!

At the beginning of your post, it looks you escapeHTML for security reasons.
I don't think you have to do that. The HTML scripts are not parsed when injected into a node through innerHTML.
m… fixed ;-) (works in ie)
works in anywhere now
Кстати, а почему pipe получает массив? Лучше уж через arguments, тогда более походе на pipe ;)
это практичней, когда надо протягивать массивы через цепочку функций. arguments в массив конвертятся очень накладно.
Про цепочку я что-то не понял, поясните пожалуйста. А насчет конвертации — Array.prototype.slice.call(arguments) работает везде, насколько я помню.
this.createFilter= ТТ.pipe( TT.pipe, TT.binder( this ) )

var filter= this.createFilter([ this.trim, this.escape, this.validate ])

везде кроме ие =(
>>> везде кроме ие =(
Хм. В IE6-8 работает.
гм… что-то я напутал видимо, спасибо ._."
Пожалуйста :) Жаль только, что в IE arguments — это вроде как единственное, для чего это работает (в плане того, что с HTMLCollection так уже не поступить)
во, с ним и попутал видимо
Зарегистрируйтесь на Хабре , чтобы оставить комментарий

Публикации

Истории