SlideShare a Scribd company logo
Zen Coding Набор инструментов для скоростной  и удобной верстки Сергей Чикуёнок
Что такое Zen Coding Набор инструментов для работы с кодом Написан на чистом JavaScript, портирван на Python Поддерживаемые редакторы:  Eclipse/Aptana , Coda, TextMate,  Espresso  (включен в базовую сборку),  Gedit ,  TopStyle http://code.google.com/p/zen-coding/
Разворачивание аббревиатур  — ключевой компонент  Zen Coding Zen Coding
Expand Abbreviation div#header>cc:ie6+ul.nav>li*3>a
Expand Abbreviation <div id=&quot;header&quot;> <!--[if lte IE 6]> <![endif]--> <ul class=&quot;nav&quot;> <li><a href=&quot;&quot;></a></li> <li><a href=&quot;&quot;></a></li> <li><a href=&quot;&quot;></a></li> </ul> </div>
Синтаксис E#id.class div#header  ->  <div id=”header”></div> p.date  ->  <p class=”date”></p> div#head.one.two  ->  <div id=”head” class=”one two”></div>
Синтаксис E>E head>link  -> table>tr>td  -> ul#name>li.item  -> <head> <link/></head> <link/></head> <table><tr><td></td></tr></table> <table><tr><td></td></tr></table> <table><tr><td></td></tr></table> <table><tr><td></td></tr></table> <table><tr><td></td></tr></table> <ul id=&quot;name&quot;><li class=&quot;item&quot;></li></ul> <ul id=&quot;name&quot;><li class=&quot;item&quot;></li></ul> <ul id=&quot;name&quot;><li class=&quot;item&quot;></li></ul>
Синтаксис E+E p+p  -> div#name>p.one+p.two  -> <p></p><p></p> <div id=&quot;name&quot;>    <p class=&quot;one&quot;></p>    <p class=&quot;two&quot;></p></div>
Синтаксис E$*N p.name-$*3  -> select>option#item-$*3  -> <p class=&quot;name-1&quot;></p><p class=&quot;name-2&quot;></p><p class=&quot;name-3&quot;></p> <select>    <option id=&quot;item-1&quot;></option>    <option id=&quot;item-2&quot;></option>    <option id=&quot;item-3&quot;></option></select>
Структурные элементы Тэги Сниппеты  — произвольный код Все структурные элементы находятся в файле  zen_settings.js  (или  zen_settings.py )
Структура zen_settings var  zen_settings  = { // описания языков ‘ css ’: { ... }, ‘ html ’: { ‘ extends ’: ‘css’, ‘ snippets ’: { ... }, ‘ abbreviations ’: { ... } } }
Описание языка: сниппеты ‘ snippets ’: { 'cc:ie6': '<!--[if lte IE 6]>\n\t ${child} | \n<![endif]-->' }
Описание языка: аббревиатуры (тэги) ‘ abbreviations ’: { 'a:link': '<a href=&quot;http:// | &quot;></a>', 'img': '<img src=&quot;&quot; alt=&quot;&quot; />' }
Новое в версии 0.5 Упрощенный синтаксис настроек Профили форматирования вывода Новый ключевой компонент —  контекстно-независимый поиск пар тэгов  (html pair matcher). Обёртывание аббревиатурами
Сниппеты принимают атрибуты ID и CLASS: ‘ snippets ’: { 'djb': '{% block  ${id}  %}\n\t ${child} | \n{% endblock %}' } djb#content>div.page  ->   {% block content %} <div class=&quot;page&quot;></div>{% endblock %}
Профили форматирования Eclipse/Aptana: профиль определяется в зависимости  от текущего редактора (HTML/XML) и доктайпа.
Профили форматирования div>img+br
Профили форматирования HTML <div><img src=&quot;&quot; alt=&quot;&quot;><br></div>
Профили форматирования XHTML <div><img src=&quot;&quot; alt=&quot;&quot; /><br /></div>
Профили форматирования XML <div> <img src=&quot;&quot; alt=&quot;&quot;/> <br/> </div>
Поиск пар тэгов <p><em>Hello world</em></p> <p><em>Hello world</em></p>
Поиск пар тэгов Работает везде, где есть тэги: <?php $str = '<table>'; $str .= '<tr>'; for ($i = 0; $i < 4; $i++) { $str .= '<td>'.$i.'</td>'; } $str .= '</tr>'; $str .= '</table>'; ?>
Wrap with abbreviation <ul id=&quot;nav&quot;> <li></li> </ul> + div#header>h1+div.wrap
Wrap with abbreviation <div id=&quot;header&quot;> <h1></h1> <div class=&quot;wrap&quot;> <ul id=&quot;nav&quot;> <li></li> </ul> </div> </div>
Wrap with abbreviation item 1 item 2 item 3 + div#header>ul#nav>li.item-$ *
Wrap with abbreviation <div id=&quot;header&quot;> <ul id=&quot;nav&quot;> <li class=&quot;item-1&quot;> item 1 </li> <li class=&quot;item-2&quot;> item 2 </li> <li class=&quot;item-3&quot;> item 3 </li> </ul> </div>
Онлайн демонстрация http://www.zen-coding.ru/demo/ плагин к editArea
Как работает  Zen Coding Zen Coding
Архитектура Редактор Прослойка Zen Coding HTML Pair Matcher API текст текст текст
Парсинг аббревиатур Поиск аббревиатуры в текстовом потоке Валидация аббревиатуры Разбор аббревиатуры в дерево Форматирование и вывод кода
Поиск аббревиатуры Hello world! div#header+ul>li Посимвольный перебор влево: function   isAllowedChar ( ch )   { var   char_code   =   ch . charCodeAt ( 0 ),   special_chars   =   '#.>+*:$-_!@' ; return   ( char_code   >   64   &&   char_code   <   91 )   // uppercase letter ||   ( char_code   >   96   &&   char_code   <   123 )   // lowercase letter ||   ( char_code   >   47   &&   char_code   <   58 )   // number ||   special_chars . indexOf ( ch )   !=   -1 ;   // special character } перебор символов
Поиск аббревиатуры Проблема:  <div>ul#nav>li</div> < div>ul#nav>li </div>  или  <div> ul#nav>li </div> ? При нахождении символа  >  проверяем его принадлежность тэгу — поиск влево до символа  < , проверка по регулярному выражению, сравнение индексов.
Валидация аббревиатуры Валидация совмещена с разбором в дерево: function   parseIntoTree ( abbr )   { ... var   re   =   /([\+>])?([a-z@\!][a-z0-9:\-]*)(#[\w\-\$]+)?((?:\.[\w\-\$]+)*)(?:\*(\d+))?/ig abbr   =   abbr . replace ( re ,   function ( str ,   operator ,   tag_name ,   id ,   class_name ,   multiplier ) { ... return   '' ; });   return   (! abbr )   ?   tree   :   null ; }
Разбор в дерево div+ul#nav>li*3>a Все узлы дерева являются объектами классов  Tag()  и  Snippet() . root div ul  (id=”nav”) li  (×3) a  ( href=”” )
Форматирование  и вывод и вывод root.toString(profile_name); Все узлы форматируются и выводятся согласно настройкам профиля и типам тэгов (блочный, инлайн, пустой).
Поиск HTML-пар Поиск первого незакрытого тэга слева Поиск первого неоткрытого тэга справа Сохранение найденного результата в свойство  last_match Выбор диапазона в зависимости от позиции картетки (включаем только содержимое тэга или весь тэг) <p> Lorem  <span> ipsum </span>  dolor  <span> sit </span>  amet. </p>
Поиск HTML-пар HTMLPairMatcher . last_match   =   { opening_tag :   { name :   'ul' , full_tag :   '<ul id=&quot;nav&quot;>' , start :   5 , end :   19 , unary :   false , type :   'tag' , close_self :   false }, closing_tag :   { ... } }
Поддержка редакторов У всех редакторов разный API У некоторых редакторов (TextMate, Coda) односторонняя связь Разворачивание аббревиатур по клавише Tab требует низкоуровневой поддержки редактора
EclipseMonkey Позволяет писать плагины для Eclipse на JavaScript Использует движок Mozilla Rhino можно использовать Java-классы внутри JavaScript позволяет обратиться к любому компоненту IDE немного отличается от того, что используется в браузерах нужно следить за типом объектов:  String   и  java.lang.String  — разные классы  с разными характеристиками
Вопросы? [email_address] http://chikuyonok.ru http://chikuyonok.ru http://chikuyonok.ru

More Related Content

PPT
Django шахрай. версия 4
PDF
рабочая тетрадь Html
PPT
языка Html
PPT
Crossbrowser Css layout
PDF
Михаил Трошев — CSS: Систематизация базовых знаний
PPT
PPT
основы Html
Django шахрай. версия 4
рабочая тетрадь Html
языка Html
Crossbrowser Css layout
Михаил Трошев — CSS: Систематизация базовых знаний
основы Html

What's hot (7)

ODP
DrupalCamp Kyiv 2011. Views - стандарт вывода списка данных. Расширение Views...
PPT
ZFConf 2010: History of e-Shtab.ru
PDF
J query tutorial-for-beginners-1.0.1
PDF
J query tutorial-for-beginners-1.0.0
PDF
Подбор ключевых фраз
PPT
Правила хорошего SEO тона в Frontend разработке
PPT
Html V.1.1
DrupalCamp Kyiv 2011. Views - стандарт вывода списка данных. Расширение Views...
ZFConf 2010: History of e-Shtab.ru
J query tutorial-for-beginners-1.0.1
J query tutorial-for-beginners-1.0.0
Подбор ключевых фраз
Правила хорошего SEO тона в Frontend разработке
Html V.1.1
Ad

Viewers also liked (19)

PDF
Stackato v5
PPT
AMA Digital Marketing Day
PPTX
“I love my bones!” Online violence involving children: Self-harm and danger...
PPTX
Perspetivas sobre o stress e desordens emocionais resultantes de contactos in...
PDF
"I Heart Oregon (& Washington): 25 of the Portland Area's Best Hikes" book pr...
PDF
Stackato v2
PDF
PDF
Milletvekillerine Gönderilen Sorunların Çözümüne Yönelik Bilgier
PDF
Istant report ost 25 11 2011 def
KEY
Concept presentatie.
PPTX
Smart421 mobile421 mob devcon 3 july
PPT
It Communications Planning And Control
PPTX
Het Nieuwe Werken in de praktijk
PPTX
MTech13: "Mobile Direct Marketing" - Ted McNulty
PDF
Ripcord Public Relations: Parachute Optional
PDF
NEDMAInno14: Innovations in Tracking Your Mail- Kerry Hannify
PDF
Print Technology: Functional Printed Electronics - RFID & NFC versus QR Codes...
PDF
Workflow Yapceu2010
PDF
Report Mi.Mo. - I cittadini Migliorano la Mobilità - 2012
Stackato v5
AMA Digital Marketing Day
“I love my bones!” Online violence involving children: Self-harm and danger...
Perspetivas sobre o stress e desordens emocionais resultantes de contactos in...
"I Heart Oregon (& Washington): 25 of the Portland Area's Best Hikes" book pr...
Stackato v2
Milletvekillerine Gönderilen Sorunların Çözümüne Yönelik Bilgier
Istant report ost 25 11 2011 def
Concept presentatie.
Smart421 mobile421 mob devcon 3 july
It Communications Planning And Control
Het Nieuwe Werken in de praktijk
MTech13: "Mobile Direct Marketing" - Ted McNulty
Ripcord Public Relations: Parachute Optional
NEDMAInno14: Innovations in Tracking Your Mail- Kerry Hannify
Print Technology: Functional Printed Electronics - RFID & NFC versus QR Codes...
Workflow Yapceu2010
Report Mi.Mo. - I cittadini Migliorano la Mobilità - 2012
Ad

Similar to Zen Coding (20)

PPT
167 web-__П1
PPT
Основные теги HTML
ODP
XML Schema
PPT
Js Http Request дмитрий котеров
PPT
советы по коду Html
PPTX
2. HTML – язык разметки гипертекста
ODP
Семинар-практикум по Drupal
ODP
Igor Khotin - Domain Specific Languages
PPT
презентация111
PPT
презентация
PPT
ZFConf 2010: Zend Framework and Multilingual
PPT
ZFConf 2010: jQuery and Dojo Toolkit JavaScript-frameworks Integration with Z...
PPTX
Основы языка HTML для интернет-журналистов
ODP
PPTX
нтмл код
PPT
Введение в Django
PPTX
SP2010 for ASP.NET dev Ru
PPT
Ubercart -nemnogo_primerov_iz_zhizni
167 web-__П1
Основные теги HTML
XML Schema
Js Http Request дмитрий котеров
советы по коду Html
2. HTML – язык разметки гипертекста
Семинар-практикум по Drupal
Igor Khotin - Domain Specific Languages
презентация111
презентация
ZFConf 2010: Zend Framework and Multilingual
ZFConf 2010: jQuery and Dojo Toolkit JavaScript-frameworks Integration with Z...
Основы языка HTML для интернет-журналистов
нтмл код
Введение в Django
SP2010 for ASP.NET dev Ru
Ubercart -nemnogo_primerov_iz_zhizni

More from 404fest (20)

PDF
Руслан Фазлыев – Как управлять собой, чтобы поручили управлять другими
PDF
Константин Назаров – Распараллеливание сборки Parallels Desktop для Mac
PDF
Софья Чебанова – Шоу-бизнес, компьютерные игры и UX
PDF
Андрей Рыжкин и Никита Степаненко – Инструменты, которые мы любим
PPTX
Александр Сербул – Разработка и эксплуатация облачных сервисов Битрикс изнутри
PPTX
Дмитрий Козлов – Все грани патриотизма. Обзор российских проектов про национа...
PPTX
Дмитрий Калаев – Три реальных провала при создании ИТ-бизнеса
PDF
Андрей Григорьев – Как завалить старт продаж стартапа еще до их начала
PDF
Семён Молотков и Андрей Федоренко – Как бодрая морковь сервис-дизайна побежда...
PDF
Илья Бирман – Ангстрем
PPT
Дмитрий Басалкин – 3 кейса повышения метрик приложения
PPTX
Аркадий Золотовицкий – Много кода для никого
PPTX
Евгений Кобзев и Иван Медведев – Быстро сделай все что я хочу!
PDF
Дмитрий Зимин – Эй, гарсон!
PDF
Денис Царев – Как не разбить лоб об HTML5
PDF
Олег Макаров – Как адаптировать интерфейс iOS приложения под Android за полчаса
PDF
Михаил Фролов – Чёрные паттерны и продажа эмоций
PDF
Дамир Кирамов – Десятистопный интерфейс
PDF
Innopolis ux course
PDF
Сергей Котырев – Мои новые ошибки и что я узнал про менеджмент за прошедший год
Руслан Фазлыев – Как управлять собой, чтобы поручили управлять другими
Константин Назаров – Распараллеливание сборки Parallels Desktop для Mac
Софья Чебанова – Шоу-бизнес, компьютерные игры и UX
Андрей Рыжкин и Никита Степаненко – Инструменты, которые мы любим
Александр Сербул – Разработка и эксплуатация облачных сервисов Битрикс изнутри
Дмитрий Козлов – Все грани патриотизма. Обзор российских проектов про национа...
Дмитрий Калаев – Три реальных провала при создании ИТ-бизнеса
Андрей Григорьев – Как завалить старт продаж стартапа еще до их начала
Семён Молотков и Андрей Федоренко – Как бодрая морковь сервис-дизайна побежда...
Илья Бирман – Ангстрем
Дмитрий Басалкин – 3 кейса повышения метрик приложения
Аркадий Золотовицкий – Много кода для никого
Евгений Кобзев и Иван Медведев – Быстро сделай все что я хочу!
Дмитрий Зимин – Эй, гарсон!
Денис Царев – Как не разбить лоб об HTML5
Олег Макаров – Как адаптировать интерфейс iOS приложения под Android за полчаса
Михаил Фролов – Чёрные паттерны и продажа эмоций
Дамир Кирамов – Десятистопный интерфейс
Innopolis ux course
Сергей Котырев – Мои новые ошибки и что я узнал про менеджмент за прошедший год

Zen Coding

  • 1. Zen Coding Набор инструментов для скоростной и удобной верстки Сергей Чикуёнок
  • 2. Что такое Zen Coding Набор инструментов для работы с кодом Написан на чистом JavaScript, портирван на Python Поддерживаемые редакторы: Eclipse/Aptana , Coda, TextMate, Espresso (включен в базовую сборку), Gedit , TopStyle http://code.google.com/p/zen-coding/
  • 3. Разворачивание аббревиатур — ключевой компонент Zen Coding Zen Coding
  • 5. Expand Abbreviation <div id=&quot;header&quot;> <!--[if lte IE 6]> <![endif]--> <ul class=&quot;nav&quot;> <li><a href=&quot;&quot;></a></li> <li><a href=&quot;&quot;></a></li> <li><a href=&quot;&quot;></a></li> </ul> </div>
  • 6. Синтаксис E#id.class div#header -> <div id=”header”></div> p.date -> <p class=”date”></p> div#head.one.two -> <div id=”head” class=”one two”></div>
  • 7. Синтаксис E>E head>link -> table>tr>td -> ul#name>li.item -> <head> <link/></head> <link/></head> <table><tr><td></td></tr></table> <table><tr><td></td></tr></table> <table><tr><td></td></tr></table> <table><tr><td></td></tr></table> <table><tr><td></td></tr></table> <ul id=&quot;name&quot;><li class=&quot;item&quot;></li></ul> <ul id=&quot;name&quot;><li class=&quot;item&quot;></li></ul> <ul id=&quot;name&quot;><li class=&quot;item&quot;></li></ul>
  • 8. Синтаксис E+E p+p -> div#name>p.one+p.two -> <p></p><p></p> <div id=&quot;name&quot;>    <p class=&quot;one&quot;></p>    <p class=&quot;two&quot;></p></div>
  • 9. Синтаксис E$*N p.name-$*3 -> select>option#item-$*3 -> <p class=&quot;name-1&quot;></p><p class=&quot;name-2&quot;></p><p class=&quot;name-3&quot;></p> <select>    <option id=&quot;item-1&quot;></option>    <option id=&quot;item-2&quot;></option>    <option id=&quot;item-3&quot;></option></select>
  • 10. Структурные элементы Тэги Сниппеты — произвольный код Все структурные элементы находятся в файле zen_settings.js (или zen_settings.py )
  • 11. Структура zen_settings var zen_settings = { // описания языков ‘ css ’: { ... }, ‘ html ’: { ‘ extends ’: ‘css’, ‘ snippets ’: { ... }, ‘ abbreviations ’: { ... } } }
  • 12. Описание языка: сниппеты ‘ snippets ’: { 'cc:ie6': '<!--[if lte IE 6]>\n\t ${child} | \n<![endif]-->' }
  • 13. Описание языка: аббревиатуры (тэги) ‘ abbreviations ’: { 'a:link': '<a href=&quot;http:// | &quot;></a>', 'img': '<img src=&quot;&quot; alt=&quot;&quot; />' }
  • 14. Новое в версии 0.5 Упрощенный синтаксис настроек Профили форматирования вывода Новый ключевой компонент — контекстно-независимый поиск пар тэгов (html pair matcher). Обёртывание аббревиатурами
  • 15. Сниппеты принимают атрибуты ID и CLASS: ‘ snippets ’: { 'djb': '{% block ${id} %}\n\t ${child} | \n{% endblock %}' } djb#content>div.page -> {% block content %} <div class=&quot;page&quot;></div>{% endblock %}
  • 16. Профили форматирования Eclipse/Aptana: профиль определяется в зависимости от текущего редактора (HTML/XML) и доктайпа.
  • 18. Профили форматирования HTML <div><img src=&quot;&quot; alt=&quot;&quot;><br></div>
  • 19. Профили форматирования XHTML <div><img src=&quot;&quot; alt=&quot;&quot; /><br /></div>
  • 20. Профили форматирования XML <div> <img src=&quot;&quot; alt=&quot;&quot;/> <br/> </div>
  • 21. Поиск пар тэгов <p><em>Hello world</em></p> <p><em>Hello world</em></p>
  • 22. Поиск пар тэгов Работает везде, где есть тэги: <?php $str = '<table>'; $str .= '<tr>'; for ($i = 0; $i < 4; $i++) { $str .= '<td>'.$i.'</td>'; } $str .= '</tr>'; $str .= '</table>'; ?>
  • 23. Wrap with abbreviation <ul id=&quot;nav&quot;> <li></li> </ul> + div#header>h1+div.wrap
  • 24. Wrap with abbreviation <div id=&quot;header&quot;> <h1></h1> <div class=&quot;wrap&quot;> <ul id=&quot;nav&quot;> <li></li> </ul> </div> </div>
  • 25. Wrap with abbreviation item 1 item 2 item 3 + div#header>ul#nav>li.item-$ *
  • 26. Wrap with abbreviation <div id=&quot;header&quot;> <ul id=&quot;nav&quot;> <li class=&quot;item-1&quot;> item 1 </li> <li class=&quot;item-2&quot;> item 2 </li> <li class=&quot;item-3&quot;> item 3 </li> </ul> </div>
  • 28. Как работает Zen Coding Zen Coding
  • 29. Архитектура Редактор Прослойка Zen Coding HTML Pair Matcher API текст текст текст
  • 30. Парсинг аббревиатур Поиск аббревиатуры в текстовом потоке Валидация аббревиатуры Разбор аббревиатуры в дерево Форматирование и вывод кода
  • 31. Поиск аббревиатуры Hello world! div#header+ul>li Посимвольный перебор влево: function isAllowedChar ( ch ) { var char_code = ch . charCodeAt ( 0 ), special_chars = '#.>+*:$-_!@' ; return ( char_code > 64 && char_code < 91 ) // uppercase letter || ( char_code > 96 && char_code < 123 ) // lowercase letter || ( char_code > 47 && char_code < 58 ) // number || special_chars . indexOf ( ch ) != -1 ; // special character } перебор символов
  • 32. Поиск аббревиатуры Проблема: <div>ul#nav>li</div> < div>ul#nav>li </div> или <div> ul#nav>li </div> ? При нахождении символа > проверяем его принадлежность тэгу — поиск влево до символа < , проверка по регулярному выражению, сравнение индексов.
  • 33. Валидация аббревиатуры Валидация совмещена с разбором в дерево: function parseIntoTree ( abbr ) { ... var re = /([\+>])?([a-z@\!][a-z0-9:\-]*)(#[\w\-\$]+)?((?:\.[\w\-\$]+)*)(?:\*(\d+))?/ig abbr = abbr . replace ( re , function ( str , operator , tag_name , id , class_name , multiplier ) { ... return '' ; }); return (! abbr ) ? tree : null ; }
  • 34. Разбор в дерево div+ul#nav>li*3>a Все узлы дерева являются объектами классов Tag() и Snippet() . root div ul (id=”nav”) li (×3) a ( href=”” )
  • 35. Форматирование и вывод и вывод root.toString(profile_name); Все узлы форматируются и выводятся согласно настройкам профиля и типам тэгов (блочный, инлайн, пустой).
  • 36. Поиск HTML-пар Поиск первого незакрытого тэга слева Поиск первого неоткрытого тэга справа Сохранение найденного результата в свойство last_match Выбор диапазона в зависимости от позиции картетки (включаем только содержимое тэга или весь тэг) <p> Lorem <span> ipsum </span> dolor <span> sit </span> amet. </p>
  • 37. Поиск HTML-пар HTMLPairMatcher . last_match = { opening_tag : { name : 'ul' , full_tag : '<ul id=&quot;nav&quot;>' , start : 5 , end : 19 , unary : false , type : 'tag' , close_self : false }, closing_tag : { ... } }
  • 38. Поддержка редакторов У всех редакторов разный API У некоторых редакторов (TextMate, Coda) односторонняя связь Разворачивание аббревиатур по клавише Tab требует низкоуровневой поддержки редактора
  • 39. EclipseMonkey Позволяет писать плагины для Eclipse на JavaScript Использует движок Mozilla Rhino можно использовать Java-классы внутри JavaScript позволяет обратиться к любому компоненту IDE немного отличается от того, что используется в браузерах нужно следить за типом объектов: String и java.lang.String — разные классы с разными характеристиками
  • 40. Вопросы? [email_address] http://chikuyonok.ru http://chikuyonok.ru http://chikuyonok.ru