2. Что такое Emmet?
• Инструмент для ускорения работы с HTML и CSS
• Плагин для множества популярных редакторов кода
• Написан на чистом JavaScript, легко встраивается
8. Sublime Text WebIDE
• быстрый
• красивый
• классный API
• удобный автокомплит
• кроссплатформенный
• богатый функционал
• много хорошо интегрированных
инструментов
• удобная отладка
9. С точки зрения фронт-энд
разработчика:
Sublime Text WebIDE
• только раскрашивает HTML и CSS
• API работает с обычным текстом
• Java
• медленная
• API позволяет работать с AST, но
это очень сложно
• разработчики акцентируют
внимание на других вещах
17. Emmet как платформа
• модульная архитектура
• написан на JavaScript
• поддержка большого количества редакторов
•поддержка расширений
18. Расширения Emmet
• Обычные .js и .json-файлы в специальной папке
• Загружаются автоматически
• Могут дополнять или переопределять основной
функционал
• Одинаково работают в разных редакторах
19. Основные модули
• разбор и преобразование аббревиатур
• поиск пар тэгов в коде
• работа с HTML-тэгами и CSS-правилами через DOM-
подобный интерфейс
20. Как из аббревиатур
получается HTML-код
Разбор аббревиатуры в дерево
Нормализация дерева
Формирование текстового результата
Готовый код
21. Как из аббревиатур
получается HTML-код
Разбор аббревиатуры в дерево
Нормализация дерева
Формирование текстового результата
Готовый код
препроцессоры
постпроцессоры
фильтры
22. 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, '<').replace(/>/g, '>');
// рекурсивное преобразование всего дерева
process(item, profile);
});
});
});
Пример фильтра
div>em|my_filter
23. 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(){}; // world
tag.outerRange = new Range(); // {start: 6, end: 20}
tag.outerContent = function(){}; // <em>world</em>
tag.range = innerRange || outerRange;
tag.content = innerContent || outerContent;
Получение HTML-тэга
24. 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);
}
});
});
Пример: переименование тэга
25. Интерфейс для редактирования
HTML и CSS
(EditTree)
• Интерфейс для высокоуровнего редактирования HTML-
тэгов и CSS-правил
• Похож на DOM
• Предоставляет доступ ко всем атрибутам/свойствам
контейнера, а также их диапазонам
•Учитывает форматирование кода
27. 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)