Download - Zen Coding

Transcript
Page 1: Zen Coding

Zen CodingНабор инструментов для скоростной

и удобной верстки

Сергей Чикуёнок

Page 2: Zen Coding

Что такое Zen Coding

• Набор инструментов для работы с кодом

• Написан на чистом JavaScript, портирванна Python

• Поддерживаемые редакторы: Eclipse/Aptana, Coda, TextMate, Espresso (включен в базовую сборку), Gedit, TopStyle

• http://code.google.com/p/zen-coding/

Page 3: Zen Coding

Разворачивание аббревиатур —

ключевой компонент Zen Coding

Page 4: Zen Coding

Expand Abbreviation

div#header>cc:ie6+ul.nav>li*3>a

Page 5: Zen Coding

Expand Abbreviation

<div id="header">

<!--[if lte IE 6]>

<![endif]-->

<ul class="nav">

<li><a href=""></a></li>

<li><a href=""></a></li>

<li><a href=""></a></li>

</ul>

</div>

Page 6: Zen Coding

Синтаксис

E#id.classdiv#header → <div id=”header”></div>

p.date → <p class=”date”></p>

div#head.one.two → <div id=”head” class=”one two”></div>

Page 7: Zen Coding

Синтаксис

E>Ehead>link →

table>tr>td →

ul#name>li.item →

<head><link/></head>

<table><tr><td></td></tr></table>

<ul id="name"><li class="item"></li></ul>

Page 8: Zen Coding

Синтаксис

E+Ep+p →

div#name>p.one+p.two →

<p></p><p></p>

<div id="name">    <p class="one"></p>    <p class="two"></p></div>

Page 9: Zen Coding

Синтаксис

E$*Np.name-$*3 →

select>option#item-$*3 →

<p class="name-1"></p><p class="name-2"></p><p class="name-3"></p>

<select>    <option id="item-1"></option>    <option id="item-2"></option>    <option id="item-3"></option></select>

Page 10: Zen Coding

Структурные элементы

• Тэги

• Сниппеты — произвольный код

Все структурные элементы находятся в файле zen_settings.js (или zen_settings.py)

Page 11: Zen Coding

Структура zen_settings

var zen_settings = {

// описания языков‘css’: {

...},

‘html’: {‘extends’: ‘css’,

‘snippets’: {...

},

‘abbreviations’: {...

}

}}

Page 12: Zen Coding

Описание языка: сниппеты

‘snippets’: {'cc:ie6': '<!--[if lte IE 6]>\n\t${child}|\n<![endif]-->'

}

Page 13: Zen Coding

Описание языка: аббревиатуры (тэги)

‘abbreviations’: {

'a:link': '<a href="http://|"></a>',

'img': '<img src="" alt="" />'

}

Page 14: Zen Coding

Новое в версии 0.5

• Упрощенный синтаксис настроек

• Профили форматирования вывода

• Новый ключевой компонент — контекстно-независимый поиск пар тэгов (html pair matcher).

• Обёртывание аббревиатурами

Page 15: Zen Coding

Сниппеты принимают

атрибуты ID и CLASS:

‘snippets’: {'djb': '{% block ${id} %}\n\t${child}|\n{% endblock %}'

}

djb#content>div.page → {% block content %} <div class="page"></div>{% endblock %}

Page 16: Zen Coding

Профили форматирования

Eclipse/Aptana: профиль определяется в

зависимости

от текущего редактора (HTML/XML) и доктайпа.

Page 17: Zen Coding

Профили форматирования

div>img+br

Page 18: Zen Coding

Профили форматирования

HTML

<div><img src="" alt=""><br></div>

Page 19: Zen Coding

Профили форматирования

XHTML

<div><img src="" alt="" /><br /></div>

Page 20: Zen Coding

Профили форматирования

XML

<div><img src="" alt=""/><br/>

</div>

Page 21: Zen Coding

Поиск пар тэгов

<p><em>Hello world</em></p>

<p><em>Hello world</em></p>

Page 22: Zen Coding

Поиск пар тэгов

Работает везде, где есть тэги:

<?php$str = '<table>';$str .= '<tr>';for ($i = 0; $i < 4; $i++) {

$str .= '<td>'.$i.'</td>';}$str .= '</tr>';$str .= '</table>';?>

Page 23: Zen Coding

Wrap with abbreviation

<ul id="nav">

<li></li>

</ul>

+div#header>h1+div.wrap

Page 24: Zen Coding

Wrap with abbreviation

<div id="header">

<h1></h1>

<div class="wrap">

<ul id="nav">

<li></li>

</ul>

</div>

</div>

Page 25: Zen Coding

Wrap with abbreviation

item 1

item 2

item 3

+div#header>ul#nav>li.item-$*

Page 26: Zen Coding

Wrap with abbreviation

<div id="header">

<ul id="nav">

<li class="item-1">item 1</li>

<li class="item-2">item 2</li>

<li class="item-3">item 3</li>

</ul>

</div>

Page 27: Zen Coding

Онлайн демонстрация

http://www.zen-coding.ru/demo/плагин к editArea

Page 28: Zen Coding

Как работает Zen Coding

Page 29: Zen Coding

Архитектура

Редактор Прослойка

Zen Coding

HTML PairMatcher

API

текст

текст

текст

Page 30: Zen Coding

Парсинг аббревиатур

1. Поиск аббревиатуры в текстовом потоке

2. Валидация аббревиатуры

3. Разбор аббревиатуры в дерево

4. Форматирование и вывод кода

Page 31: Zen Coding

Поиск аббревиатуры

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}

перебор символов

Page 32: Zen Coding

Поиск аббревиатуры

Проблема: <div>ul#nav>li</div>

<div>ul#nav>li</div> или <div>ul#nav>li</div>?

При нахождении символа > проверяем его принадлежность тэгу — поиск влево до символа <, проверка по регулярному выражению, сравнение индексов.

Page 33: Zen Coding

Валидация аббревиатуры

Валидация совмещена с разбором в дерево:

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;

}

Page 34: Zen Coding

Разбор в дерево

div+ul#nav>li*3>a

Все узлы дерева являются объектами классов Tag() и Snippet().

root div

ul (id=”nav”) li (×3) a (href=””)

Page 35: Zen Coding

Форматирование и вывод

root.toString(profile_name);

Все узлы форматируются и выводятся согласно настройкам профиля и типам тэгов (блочный, инлайн, пустой).

Page 36: Zen Coding

Поиск HTML-пар

1. Поиск первого незакрытого тэга слева

2. Поиск первого неоткрытого тэга справа

3. Сохранение найденного результата в свойство last_match

4. Выбор диапазона в зависимости от позиции картетки (включаем только содержимое тэга или весь тэг)

<p>Lorem <span>ipsum</span> dolor <span>sit</span> amet.</p>

Page 37: Zen Coding

Поиск HTML-парHTMLPairMatcher.last_match = {

opening_tag: {

name: 'ul',

full_tag: '<ul id="nav">',

start: 5,

end: 19,

unary: false,

type: 'tag',

close_self: false

},

closing_tag: {

...

}

}

Page 38: Zen Coding

Поддержка редакторов

• У всех редакторов разный API

• У некоторых редакторов (TextMate, Coda) односторонняя связь

• Разворачивание аббревиатур по клавише Tab требует низкоуровневой поддержки редактора

Page 39: Zen Coding

EclipseMonkey• Позволяет писать плагины для Eclipse на

JavaScript

• Использует движок Mozilla Rhino

• можно использовать Java-классы внутри JavaScript

• позволяет обратиться к любому компоненту IDE

• немного отличается от того, что используется в браузерах

• нужно следить за типом объектов: String и java.lang.String — разные классы с разными характеристиками

Page 40: Zen Coding

Вопросы[email protected]://chikuyonok.ru


Top Related