Transcript
Page 1: Emmet - инструмент для веб-разработчика

Emmet как платформа для инструментов

Сергей Чикуёнок | http://emmet.io

Page 2: Emmet - инструмент для веб-разработчика

Что такое Emmet?

• Инструмент для ускорения работы с HTML и CSS

• Плагин для множества популярных редакторов кода• Написан на чистом JavaScript, легко встраивается

Page 3: Emmet - инструмент для веб-разработчика

Что такое Emmet?

Page 4: Emmet - инструмент для веб-разработчика

Развитие инструментов для фронт-энд разработчиков

Page 5: Emmet - инструмент для веб-разработчика

1990-е: Microsoft FrontPage

Page 6: Emmet - инструмент для веб-разработчика

2000-е: Ъ-кодеры пишут в «Блокноте»

Page 7: Emmet - инструмент для веб-разработчика

2010-е: Sublime Text, WebIDE

Page 8: Emmet - инструмент для веб-разработчика

Sublime Text WebIDE

• быстрый• красивый• классный API

• удобный автокомплит• кроссплатформенный

• богатый функционал• много хорошо интегрированных инструментов

• удобная отладка

Page 9: Emmet - инструмент для веб-разработчика

С точки зрения фронт-энд разработчика:

Sublime Text WebIDE

• только раскрашивает HTML и CSS

• API работает с обычным текстом• Java

• медленная• API позволяет работать с AST, но это очень сложно

• разработчики акцентируют внимание на других вещах

Page 10: Emmet - инструмент для веб-разработчика

Код по-прежнему долго писать и тяжело редактировать

Page 11: Emmet - инструмент для веб-разработчика

Выход?

Page 12: Emmet - инструмент для веб-разработчика

Препроцессоры!

Page 13: Emmet - инструмент для веб-разработчика

Преимущества:

• Короткая нотация, быстрее писать• Читабельность• Синтаксический сахар• Шаблонизация, связь с внешними данными

Page 14: Emmet - инструмент для веб-разработчика

Недостатки:

• Сложная отладка кода• Не решают проблему редактирования существующего кода

• Не всегда можно использовать на клиенте

Page 15: Emmet - инструмент для веб-разработчика

Чего хочется:

• писать меньше кода• работать в любимом редакторе

• разрабатывать инструменты на JavaScript

• работать с HTML и CSS как с DOM

Page 16: Emmet - инструмент для веб-разработчика

Emmet – платформа для инструментов веб-разработчика

Page 17: Emmet - инструмент для веб-разработчика

Emmet как платформа

• модульная архитектура• написан на JavaScript

• поддержка большого количества редакторов• поддержка расширений

Page 18: Emmet - инструмент для веб-разработчика

Расширения Emmet

• Обычные .js и .json-файлы в специальной папке

• Загружаются автоматически• Могут дополнять или переопределять основной функционал

• Одинаково работают в разных редакторах

Page 19: Emmet - инструмент для веб-разработчика

Основные модули

• разбор и преобразование аббревиатур• поиск пар тэгов в коде• работа с HTML-тэгами и CSS-правилами через DOM-подобный интерфейс

Page 20: Emmet - инструмент для веб-разработчика

Как из аббревиатур получается HTML-код

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

Нормализация дерева

Формирование текстового результата

Готовый код

Page 21: Emmet - инструмент для веб-разработчика

Как из аббревиатур получается HTML-код

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

Нормализация дерева

Формирование текстового результата

Готовый код

препроцессоры

постпроцессоры

фильтры

Page 22: Emmet - инструмент для веб-разработчика

emmet.exec(function(require, _) { require('filters').add('my_filter', function process(tree, profile) { _.each(tree.children, function(item) { // пример для HTML item.start = '<' + item.name() + '>'; item.end = '</' + item.name() + '>';

// пример для Jade item.start = item.name() + '\n'; item.padding = '\t';

// преобразуем уже существующий результат item.start = item.start.replace(/</g, '&lt;').replace(/>/g, '&gt;');

// рекурсивное преобразование всего дерева process(item, profile); }); });});

Пример фильтраdiv>em|my_filter

Page 23: Emmet - инструмент для веб-разработчика

var tag = emmet.require('htmlMatcher').tag( 'hello <em>world</em>', // текст, где искать тэг 12 // позиция, с которой начать поиск);

tag.open = { // открывающий тэг name: 'em', selfClose: false, // является ли тэг самозакрывающимся range: new Range() // {start: 6, end: 10}};

tag.close = {...}; // закрывающий тэг

tag.innerRange = new Range(); // {start: 10, end: 15}tag.innerContent = function(){}; // worldtag.outerRange = new Range(); // {start: 6, end: 20}tag.outerContent = function(){}; // <em>world</em>tag.range = innerRange || outerRange;tag.content = innerContent || outerContent;

Получение HTML-тэга

Page 24: Emmet - инструмент для веб-разработчика

emmet.exec(function(require, _) { require('actions').add('rename_tag', function(editor) { var tag = require('htmlMatcher').tag(editor.getContent(), editor.getCaretPos()); if (tag) { var newName = editor.prompt('Введите новое имя тэга'); if (tag.close) { editor.replaceContent( '</' + newName + '>', tag.close.range.start, tag.close.range.end); }

editor.replaceContent( '<' + newName, tag.open.range.start, tag.open.range.start + tag.open.name.length + 1); } });});

Пример: переименование тэга

Page 25: Emmet - инструмент для веб-разработчика

Интерфейс для редактирования HTML и CSS

(EditTree)

• Интерфейс для высокоуровнего редактирования HTML-тэгов и CSS-правил

• Похож на DOM

• Предоставляет доступ ко всем атрибутам/свойствам контейнера, а также их диапазонам

•Учитывает форматирование кода

Page 26: Emmet - инструмент для веб-разработчика

var tree = emmet.require('xmlEditTree') .parse('<tag attr1="val1" attr2="val2">');

tree.value('attr1'); // val1tree.get('attr1').range(); // {start: 5, end: 17}tree.value('attr1', 'Hello world');

tree.remove('attr2');tree.add('a', 'b', 0);

tree.source; // <tag a="b" attr1="Hello world">

Редактирование HTML (xmlEditTree)

Page 27: Emmet - инструмент для веб-разработчика

var tree = emmet.require('cssEditTree').parse('div {color: red}');// можно использовать метод parseFromPosition(content, pos)// для получения правила из документа tree.value('color', 'black');tree.value('position', 'relative');

tree.source; // div {color: black;position: relative;}

Редактирование CSS (cssEditTree)

Page 28: Emmet - инструмент для веб-разработчика

Только вы сами можете создавать лучшие инструменты