<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Пепелсбей.net</title>
	<atom:link href="http://pepelsbey.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://pepelsbey.net</link>
	<description></description>
	<lastBuildDate>Sat, 27 Jun 2009 08:33:29 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.1-beta2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>TextMate Zen Coding 1.3</title>
		<link>http://pepelsbey.net/2009/06/textmate-zen-coding/</link>
		<comments>http://pepelsbey.net/2009/06/textmate-zen-coding/#comments</comments>
		<pubDate>Sat, 27 Jun 2009 08:33:29 +0000</pubDate>
		<dc:creator>pepelsbey</dc:creator>
				<category><![CDATA[Заметки]]></category>

		<guid isPermaLink="false">http://pepelsbey.net/?p=451</guid>
		<description><![CDATA[<p>Логичным этапом после всех <a href="http://pepelsbey.net/2009/04/zen-coding-concept/">мечтаний про Zen&#160;Coding 2.0</a> стало написание документации по элементам, селекторам, свойствам и сокращениям.</p>

<ul>
<li><a href="http://code.google.com/p/zen-coding/wiki/ZenHTMLElementsRu">Элементы Zen&#160;HTML</a></li>
<li><a href="http://code.google.com/p/zen-coding/wiki/ZenHTMLSelectorsRu">Селекторы Zen&#160;HTML</a></li>
<li><a href="http://code.google.com/p/zen-coding/wiki/ZenCSSPropertiesRu">Свойства Zen&#160;CSS</a></li>
</ul>

<p>На основе этой документации, пакеты Zen&#160;HTML и Zen&#160;CSS для редактора <a href="http://macromates.com/">TextMate</a> были обновлены до версии 1.3. Это обновление стало не столько исправлением ошибок в версиях 1.2, сколько подготовкой для перехода к версии 2.0. Тут вам и HTML&#160;5, и CSS&#160;3 и много других исправлений. А именно:</p>]]></description>
			<content:encoded><![CDATA[<p>Логичным этапом после всех <a href="http://pepelsbey.net/2009/04/zen-coding-concept/">мечтаний про Zen&nbsp;Coding 2.0</a> стало написание документации по элементам, селекторам, свойствам и сокращениям.</p>

<ul>
<li><a href="http://code.google.com/p/zen-coding/wiki/ZenHTMLElementsRu">Элементы Zen&nbsp;HTML</a></li>
<li><a href="http://code.google.com/p/zen-coding/wiki/ZenHTMLSelectorsRu">Селекторы Zen&nbsp;HTML</a></li>
<li><a href="http://code.google.com/p/zen-coding/wiki/ZenCSSPropertiesRu">Свойства Zen&nbsp;CSS</a></li>
</ul>

<p>На основе этой документации, пакеты Zen&nbsp;HTML и Zen&nbsp;CSS для редактора <a href="http://macromates.com/">TextMate</a> были обновлены до версии 1.3. Это обновление стало не столько исправлением ошибок в версиях 1.2, сколько подготовкой для перехода к версии 2.0. Тут вам и HTML&nbsp;5, и CSS&nbsp;3 и много других исправлений. А именно:</p>

<h2>Zen&nbsp;HTML</h2>

<p>Набор элементов новой версии пакета создан на основе черновика HTML&nbsp;5, плюс элемент <code>&lt;acronym&gt;</code>, который был исключён из HTML&nbsp;5. Немного был изменён принцип именования шаблонов — сначала идёт версия языка, а потом уже тип:</p>

<ol class="code">
<li><code>html:4t  = HTML 4.01 Transitional</code></li>
<li><code>html:4s  = HTML 4.01 Strict</code></li>
<li><code>html:5   = HTML&nbsp;5</code></li>
<li><code>html:xt  = XHTML 1.0 Transitional</code></li>
<li><code>html:xs  = XHTML 1.0 Strict</code></li>
<li><code>html:xxs = XHTML 1.1 Strict</code></li>
</ol>

<p>Также добавлен новый шаблон страницы <code>html:5</code>:</p>

<ol class="code">
<li><code>&lt;!DOCTYPE HTML&gt;</code></li>
<li><code>&lt;html lang="ru-RU"&gt;</code></li>
<li><code>&lt;head&gt;</code></li>
<li><code>    &lt;title&gt;&lt;/title&gt;</code></li>
<li><code>    &lt;meta charset="UTF-8"&gt;</code></li>
<li><code>&lt;/head&gt;</code></li>
<li><code>&lt;body&gt;</code></li>
<li><code>    </code></li>
<li><code>&lt;/body&gt;</code></li>
<li><code>&lt;/html&gt;</code></li>
</ol>

<p>Ещё один шаг к большей доступности пакета состоит в том, что теперь все элементы можно набирать как по псевдонимам, так и по полному имени:</p>

<ol class="code">
<li><code>bq &rarr; &lt;blockquote&gt;&lt;/blockquote&gt;</code></li>
<li><code>blockquote &rarr; &lt;blockquote&gt;&lt;/blockquote&gt;</code></li>
</ol>

<p>То есть, не зная псевдонима, можно всё равно получить то, что нужно. Помимо этого, в пакет было добавлено много приятных мелочей:</p>

<p>Все элементы, которые имеют особенность много раз повторяться строка за строкой, теперь имеют механизм, который позволяет после написания первой строки сразу же приступать к написанию второй — достаточно нажать <kbd>Tab</kbd> после одного из следующих закрывающих тегов: <code>&lt;/p&gt;</code>, <code>&lt;/li&gt;</code>, <code>&lt;/tr&gt;</code>, <code>&lt;/th&gt;</code>, <code>&lt;/td&gt;</code> или <code>&lt;/option&gt;</code>.</p>

<p> Элемент <code>&lt;div&gt;</code> теперь разворачивается с атрибутами <code>class</code> и <code>id</code> более логично, раньше вместо точки использовалась собачка:</p>

<ol class="code">
<li><code>div. &rarr; &lt;div class=""&gt;&lt;/div&gt;</code></li>
<li><code>div# &rarr; &lt;div id=""&gt;&lt;/div&gt;</code></li>
</ol>

<p>В список автоматических парных подстановок были добавлены русские кавычки: <code>«„“»</code>. Теперь при наборе первой из них, автоматически будет подставляться и вторая.</p>

<p>HTML-элементы теперь сгруппированы на основе спецификации, поэтому <a href="http://pepelsbey.net/img/2009/06/textmate-zen-coding/menu.navigation.png" rel="darkbox">навигация через меню «Bundles»</a> теперь организована не по алфавиту, а по группам.</p>

<h2>Zen&nbsp;CSS</h2>

<p>Набор свойств в этом пакете основан на черновике спецификации CSS&nbsp;3 и в дальнейшем будет обновляться, в зависимости от реализации в браузерах и решений, что принимает <a href="http://www.w3.org/blog/CSS/">CSS WG</a>. Этот пакет оптимизация коснулась в большей степени.</p>

<p>Основной файл настроек языка был взят из самой последней версии оригинального пакета CSS и модифицирован для полного соответствия CSS&nbsp;3:</p>

<ul>
<li>HTML-селекторы: 99, вместо прежних 76-ти</li>
<li>Псевдо-классы: 24, вместо прежних 5-ти</li>
<li>Свойства: 169, вместо прежних 125-ти</li>
<li>Значения: 160, вместо прежник 138-ми</li>
</ul>

<p>Это значит, что все новые свойства и значения из черновика CSS&nbsp;3 будут правильно подсвечиваться. Исключением станут вендорные свойства и значения, в частности, с префиксами. Их полезно отличать от остального массива кода. Также было модифицировано регулярное выражение, которое отвечает за HTML-селекторы, теперь подсвечиваться будут как строчные, так и прописные имена.</p>

<p>Всем свойствам, отвечающим за позиционирование (<code>top</code>, <code>right</code>, <code>bottom</code>, <code>left</code>) были присвоены однобуквенные сокращения: <code>t</code>, <code>r</code>, <code>b</code>, <code>l</code>. Соответственно, для свойства <code>border</code> теперь используется сочетание <code>bd</code>, по аналогии с <code>bg</code> для <code>background</code>. Да, стало длиннее, да, придётся привыкать, но общая логичность решения повысилась.</p>

<p>Короткое сочетание <code>z</code> вернулось и свойству <code>z-index</code>, которое близко к тем обнобуквенным, что отвечают за позиционирование. Поэтому свойство <code>zoom</code>, о котором мы когда-нибудь забудем, отправлено в <code>zoo</code> и открывается сразу со значением, равным единице.</p>

<p>Помимо этого в пакет была внесена некоторая <em>вендорная специфика</em>: вроде <code>-ms-filter</code>, <code>display:-moz-inline-box</code>, <code>-webkit-box-shadow</code> и некоторых других. Эти свойства также будут обновляться, в зависимости от поддержки новых экспериментальных свойств в различных браузерах.</p>

<p>Ну, и немного приятных мелочей. Свойство <code>quotes</code> теперь может быть развёрнуто с уже готовыми значениями для двух уровней русских или английских кавычек:</p>

<ol class="code">
<li><code>q:ru &rarr; quotes:'\00AB' '\00BB' '\201E' '\201C';</code></li>
<li><code>q:en &rarr; quotes:'\201C' '\201D' '\2018' '\2019';</code></li>
</ol>

<p>…а нажатая после символа <code>;</code> клавиша <kbd>Tab</kbd> создаст строку для нового правила.</p>

<h2>Кто здесь?</h2>

<p>Сейчас пакеты проекта Zen&nbsp;Coding существуют в двух основных ветках:</p>

<ul>
<li><strong>Первая ветка</strong> использует для работы с сокращениями внутренние возможности редактора и существует в виде отдельных пакетов для каждого языка:
<ul>
<li>Zen&nbsp;HTML и Zen&nbsp;CSS для редактора <a href="http://macromates.com/">TextMate</a>, автор — ваш покорный слуга.</li>
<li>Zen&nbsp;HTML для редактора <a href="http://www.netbeans.org/">NetBeans</a>, автор — <a href="http://rmcreative.ru/">Александр Макаров</a>.</li>
</ul>
</li>
<li><strong>Вторая ветка</strong> является единым пакетом и использует для работы с сокращениями скрипт, написанный <a href="http://chikuyonok.ru/">Сергеем Чикуёнком</a> на JavaScript, а затем портированный для Python:
<ul>
<li>Zen&nbsp;Coding для редактора <a href="http://macromates.com/">TextMate</a></li>
<li>Zen&nbsp;Coding для редактора <a href="http://www.aptana.com/">Aptana</a></li>
<li>Zen&nbsp;Coding для редактора <a href="http://panic.com/coda/">Coda</a></li>
</ul>
</li>
</ul>

<p>Обе ветки используют документацию, упомянутую в начале заметки, поэтому совместимы между собой. Особенностью второй ветки является то, что в XML-подобных языках поддерживается разворачивание шаблонов на основе CSS-синтаксиса, о чём <a href="http://pepelsbey.net/2009/04/zen-coding-concept/">мечталось в одной заметке</a>.</p>

<p>Несмотря на некоторую запутанность с ветками, пакеты продолжают развиваться, более того — планируется написание Zen&nbsp;HTML для <a href="http://www.ultraedit.com/products/ultraedit/">UltraEdit</a> и Zen&nbsp;CSS для возрождённого <a href="http://www.topstyle4.com/">TopStyle 4</a>.</p>

<h2>Установка пакетов</h2>

<p>Последние версии всех пакетов по-прежему можно скачать со <a href="http://code.google.com/p/zen-coding/">страницы проекта на Google Code</a>. Речь же пойдёт о специфике установки пакетов для редактора TextMate.</p>

<p>Если вы устанавливаете пакеты в первый раз, то достаточно просто кликнуть два раза по разархивированному файлу. Но если вы не уверены, то лучше читайте дальше.</p>

<p>Если вы уже использовали предыдущие версии пакетов для TextMate, включая бета-версии пакетов 1.3 с <a href="http://code.google.com/p/zen-coding/">Google Code</a>, то пакеты нужно будет обновить прямой заменой файлов. Иначе, попытки смёржить две разные версии приведут к непредсказуемым последствиям. Итак, нужно сделать следующее:</p>

<ol>
<li>Закрыть TextMate</li>
<li>Зайти в папку: <code>~/Library/Application Support/TextMate/Bundles/</code></li>
<li>Удалить старые пакеты Zen-CSS и Zen-HTML</li>
<li>Скопировать в эту папку новые пакеты</li>
</ol>

<p>Такая тактика уменьшит вероятность возникновения проблем.</p>]]></content:encoded>
			<wfw:commentRss>http://pepelsbey.net/2009/06/textmate-zen-coding/feed/</wfw:commentRss>
		<slash:comments>23</slash:comments>
		</item>
		<item>
		<title>В чём мать родила</title>
		<link>http://pepelsbey.net/2009/04/as-my-mother-bore-me/</link>
		<comments>http://pepelsbey.net/2009/04/as-my-mother-bore-me/#comments</comments>
		<pubDate>Wed, 08 Apr 2009 13:02:37 +0000</pubDate>
		<dc:creator>pepelsbey</dc:creator>
				<category><![CDATA[Заметки]]></category>

		<guid isPermaLink="false">http://pepelsbey.net/?p=450</guid>
		<description><![CDATA[

Традиционно раздеваемся, подставляя бледные тела страниц под весеннее солнце. CSS Naked Day покажет, кто чего стоит.]]></description>
			<content:encoded><![CDATA[<p><a href="http://naked.dustindiaz.com/"><img src="http://pepelsbey.net/img/2009/04/as-my-mother-bore-me/naked.png" alt="CSS Naked Day"/></a></p>

<p>Традиционно раздеваемся, подставляя бледные тела страниц под весеннее солнце. <a href="http://naked.dustindiaz.com/">CSS Naked Day</a> покажет, кто чего стоит.</p>]]></content:encoded>
			<wfw:commentRss>http://pepelsbey.net/2009/04/as-my-mother-bore-me/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Zen Coding 2.0. Концепт</title>
		<link>http://pepelsbey.net/2009/04/zen-coding-concept/</link>
		<comments>http://pepelsbey.net/2009/04/zen-coding-concept/#comments</comments>
		<pubDate>Thu, 02 Apr 2009 15:19:15 +0000</pubDate>
		<dc:creator>pepelsbey</dc:creator>
				<category><![CDATA[Заметки]]></category>

		<guid isPermaLink="false">http://pepelsbey.net/?p=447</guid>
		<description><![CDATA[<p>На текущем этапе развития пакеты расширений <a href="http://pepelsbey.net/2008/10/zen-coding/">Zen Coding</a> для редактора <a href="http://macromates.com/">TextMate</a> зашли в тупик.</p>

<p>Можно конечно развить поддержку HTML 5, предусмотреть все свойства из CSS 3, реализовать ещё большее количество ежедневно необходимых шаблонов. И это будет сделано, но во вторую очередь. В первую очередь я планирую серьёзно изменить способ набора HTML-кода и методику хранения библиотеки шаблонов в пакетах. Ну, и конечно улучшить логичность и интуитивность всех сокращений и сочетаний клавиш. Но обо всём попорядку.</p>

<p>Главная проблема текущей реализации Zen Coding состоит в ограничениях, которые накладывает внутренний механизм работы бандлов в TextMate:</p>

<ul>
<li>Все шаблоны нужно хранить в отдельных сущностях, что приводит к чрезвычайно трудоёмкому процессу изменения каких-то концептуальных механизмов. Самый яркий пример — переменная <code>TM_CSS_SPACE</code>, для её внедрения пришлось вручную перелопатить порядка 250 шаблонов.</li>
<li>Работа с выборкой из выделения или текущей строки нужных переменных далека от совершенства и просто не позволяет получить каки-то элементы без дополнительных скриптов.</li>
</ul>

<p>Самым логичным выходом из данной ситуации, на мой взгляд, является написание какой-то отдельной обёртки, которая будет содержать в себе библиотеку всех элементов, вызываться по клавише <kbd>Tab</kbd>, анализировать контекст применения и уже делать всё, что нужно, невзирая на ограничения встроенных в TextMate механизмов.</p>

<p>Что же планируется сделать:</p>]]></description>
			<content:encoded><![CDATA[<p>На текущем этапе развития пакеты расширений <a href="http://pepelsbey.net/2008/10/zen-coding/">Zen Coding</a> для редактора <a href="http://macromates.com/">TextMate</a> зашли в тупик.</p>

<p>Можно конечно развить поддержку HTML 5, предусмотреть все свойства из CSS 3, реализовать ещё большее количество ежедневно необходимых шаблонов. И это будет сделано, но во вторую очередь. В первую очередь, я планирую серьёзно изменить способ набора HTML-кода и методику хранения библиотеки шаблонов в пакетах. Ну, и конечно улучшить логичность и интуитивность всех сокращений и сочетаний клавиш. Но обо всём попорядку.</p>

<p>Главная проблема текущей реализации Zen Coding состоит в ограничениях, которые накладывает внутренний механизм работы бандлов в TextMate:</p>

<ul>
<li>Все шаблоны нужно хранить в отдельных сущностях, что приводит к чрезвычайно трудоёмкому процессу изменения каких-то концептуальных механизмов. Самый яркий пример — переменная <code>TM_CSS_SPACE</code>, для её внедрения пришлось вручную перелопатить порядка 250 шаблонов.</li>
<li>Работа с выборкой из выделения или текущей строки нужных переменных далека от совершенства и просто не позволяет получить каки-то элементы без дополнительных скриптов.</li>
</ul>

<p>Самым логичным выходом из данной ситуации, на мой взгляд, является написание какой-то отдельной обёртки, которая будет содержать в себе библиотеку всех элементов, вызываться по клавише <kbd>Tab</kbd>, анализировать контекст применения и уже делать всё, что нужно, невзирая на ограничения встроенных в TextMate механизмов.</p>

<p>Что же планируется сделать:</p>

<h2>Zen HTML</h2>

<p>Очевидно, что самым удобным синтаксисом для работы HTML-деревом является CSS-синтаксис. Самым ярким примером его использования является механизм <a href="http://en.wikipedia.org/wiki/CssQuery">CSS Query</a> широко распространённый в современных JS-фреймворках. В них на всю катушку использются не только все селекторы выборки из CSS 3, но и другие кастомные штуки  вроде <code>:even</code>, <code>:not</code>, <code>:enabled</code> и другие. И хорошо было бы использовать этот механизм выборки не только в CSS и JS, но и при написании HTML-кода.</p>

<p>Проанализировав типичные ситуации, возникающие при написании HTML, я пришёл к следующей группе базовых селекторов и их псевдонимов:</p>

<ul>
<li>ID: <code>E#name</code></li>
<li>Класс: <code>E.name</code></li>
<li>Вложенность: <code>E&gt;E</code></li>
<li>Братство: <code>E+E</code></li>
<li>Повторение: <code>E*N</code>, простой псевдоним братского <code>E*3 = E+E+E</code></li>
<li>Разворачивание: <code>E+</code>, сложный псевдоним группы селекторов <code>E+ = E&gt;E+…</code></li>
</ul>

<p>Базовые селекторы атрибутов <code>id</code> и <code>class</code>:</p>

<ol class="code">
<li><code>div#name &rarr; &lt;div id="name"&gt;&lt;/div&gt;</code></li>
<li><code>div.name &rarr; &lt;div class="name"&gt;&lt;/div&gt; </code></li>
<li><code>div.one.two &rarr; &lt;div class="one two"&gt;&lt;/div&gt; </code></li>
<li><code>div#name.name &rarr; &lt;div id="name" class="name"&gt;&lt;/div&gt; </code></li>
</ol>

<p>Базовые селекторы <code>E&gt;E</code> и <code>E+E</code> и их сочетания:</p>

<ol class="code">
<li><code>bq&gt;p →</code></li>
<li><code>&lt;blockquote&gt;</code></li>
<li><code>   &lt;p&gt;&lt;/p&gt;</code></li>
<li><code>&lt;/blockquote&gt;</code></li>
<li><code></code></li>
<li><code>p+p →</code></li>
<li><code>&lt;p&gt;&lt;/p&gt;</code></li>
<li><code>&lt;p&gt;&lt;/p&gt;</code></li>
<li><code></code></li>
<li><code>ul&gt;li+li →</code></li>
<li><code>&lt;ul&gt;</code></li>
<li><code>   &lt;li&gt;&lt;/li&gt;</code></li>
<li><code>   &lt;li&gt;&lt;/li&gt;</code></li>
<li><code>&lt;/ul&gt;</code></li>
</ol>

<p>Псевдонимы базовых — <code>E*N</code> и <code>E+</code>:</p>

<ol class="code">
<li><code>p*2 &rarr;</code></li>
<li><code>&lt;p&gt;&lt;/p&gt;</code></li>
<li><code>&lt;p&gt;&lt;/p&gt;</code></li>
<li><code></code></li>
<li><code>ul&gt;li*2 &rarr;</code></li>
<li><code>&lt;ul&gt;</code></li>
<li><code>   &lt;li&gt;&lt;/li&gt;</code></li>
<li><code>   &lt;li&gt;&lt;/li&gt;</code></li>
<li><code>&lt;/ul&gt;</code></li>
<li><code></code></li>
<li><code>dl+ &rarr;</code></li>
<li><code>&lt;dl&gt;</code></li>
<li><code>   &lt;dt&gt;&lt;/dt&gt;</code></li>
<li><code>   &lt;dd&gt;&lt;/dd&gt;</code></li>
<li><code>&lt;/dl&gt;</code></li>
</ol>

<p>По сути, селектор <code>E+</code> не является точным указанием на структуру желаемого дерева, скорее это псевдоним к шаблону, то есть псевдоним <code>dl+</code> равносилен <code>dl&gt;dt+dd</code>, а <code>table+</code> равносилен <code>table&gt;tr&gt;td</code>. Помимо этого, стоит понимать разницу между базовым селектором <code>E+E</code> и псевдонимом <code>E+</code> — в первом случае это обозначение следования друг за другом, а во втором это признак разворачиваемого шаблона.</p>

<p>Кажется, что подобным способом можно развернуть всё дерево документа, но это не так. Подобный синтаксис не предусматривает ветвление — углублять дерево можно только в одном направлении, т.е. вложить в одного родителя двух и более детей можно, но развить вложенность можно только для последнего из них. По идее, можно было бы придумать какую-то группировку, но это, во-первых, будет сильно противоречить CSS-синтаксису, а во-вторых, не настолько востребованно.</p>

<p>Чуть более сложный пример:</p>

<ol class="code">
<li><code>div#page&gt;h3.title+ul&gt;li.item*3&gt;a &rarr;</code></li>
<li><code>&lt;div id="page"&gt;</code></li>
<li><code>   &lt;h3 class="title"&gt;&lt;/h3&gt;</code></li>
<li><code>   &lt;ul class="menu"&gt;</code></li>
<li><code>      &lt;li class="item"&gt;&lt;a href="#"&gt;&lt;/a&gt;&lt;/li&gt;</code></li>
<li><code>      &lt;li class="item"&gt;&lt;a href="#"&gt;&lt;/a&gt;&lt;/li&gt;</code></li>
<li><code>      &lt;li class="item"&gt;&lt;a href="#"&gt;&lt;/a&gt;&lt;/li&gt;</code></li>
<li><code>   &lt;/ul&gt;</code></li>
<li><code>&lt;/div&gt;</code></li>
</ol>

<p>Вряд ли подобные конструкции будут использоваться слишком часто, но сам принцип формирования отдельных элементов при помощи CSS-синтаксиса видится мне наиболее удачным решением.</p>

<h2>Zen CSS</h2>

<p>Этот пакет ожидают менее серьёзные изменения. Основные усилия будут направлены на следующее:</p>

<ul>
<li>Более логичную и удобную систему псевдонимов и предустановленных шаблонов.</li>
<li>Поддержку всех актуальных CSS-свойств, присутствующих в черновике CSS 3 и уже реализованных в браузерах, в частности, с вендорными префиксами.</li>
<li>Организация автоматической сортировки свойств в специфическом порядке.</li>
</ul>

<p>Список актуальных свойств был составлен при помощи фильтрации <a href="http://meiert.com/en/indices/css-properties/">полного списка существующих</a> в CSS 3 свойств. В итоге из 255 наименований осталось только 131 свойство, для каждого из которых был придуман короткий псевдоним <code>mt &rarr; margin-top</code>, а также набор шаблонов <code>f+ &rarr; font:1em Arial,sans-serif</code>.</p>

<p>Помимо этого, актуальные свойства были разделены на группы и отсортированы в два этапа: порядок следования групп и порядок следования свойств в группе. Всего получилось восемь групп:</p>

<ol>
<li>Позиционирование</li>
<li>Поведение и свойства блока</li>
<li>Размерность блока</li>
<li>Цветовое оформление</li>
<li>Специальные типы содержимого</li>
<li>Текст</li>
<li>Визуальные свойства</li>
<li>Печать</li>
</ol>

<p>Логика группировки основывается на двух главных принципах:</p>

<ul>
<li>Движение снаружи внутрь: от позиционирования к свойствам блока и через текст к слову и шрифту.</li>
<li>Движение от глобальных свойств к более частным и менее употребимым: от позиционирования к прозрачности, свойствам курсора и стилям для печати.</li>
</ul>

<p>Внутри блоков логика «от глобального к частному» сохраняется, но начинает работать ещё один механизм, сортирующий подобные свойства в таком порядке, в котором их принято упоминать в сокращённой записи:</p>

<ol class="code">
<li><code>font:bold italic small-caps 1em sans-serif;</code></li>
<li><code>font-weight:bold;</code></li>
<li><code>font-style:italic;</code></li>
<li><code>font-variant:small-caps;</code></li>
<li><code>font-size:1em;</code></li>
<li><code>font-family:sans-serif;</code></li>
</ol>

<p>Тоже самое и со свойствами, относящимися к четырём сторонам объекта: за основу взят принцип <strong>TR</strong>ou<strong>BL</strong>e или <strong>T</strong>op <strong>R</strong>ight <strong>B</strong>ottom <strong>L</strong>eft, который используется в сокращённой записи:</p>

<ol class="code">
<li><code>#box {</code></li>
<li><code>   position:absolute;</code></li>
<li><code>   top:1px;</code></li>
<li><code>   right:2px;</code></li>
<li><code>   bottom:3px;</code></li>
<li><code>   left:4px;</code></li>
<li><code>   padding:1px 2px 3px 4px;</code></li>
<li><code>   padding-top:1px;</code></li>
<li><code>   padding-right:2px;</code></li>
<li><code>   padding-bottom:3px;</code></li>
<li><code>   padding-left:4px;</code></li>
<li><code>   }</code></li>
</ol>

<p>В состав пакета Zen Coding планируется включить скрипт, который будет автоматически сортировать выделенные группы свойств согласно упомянутому алгоритму. Это позволит не только легко научиться новому порядку сортировки, но и привести в порядок существующий или чужой код.</p>

<p>Также планируется отдельная публикация с теоритическими выкладками по поводу группировки и сортировки CSS-свойств. Возможно, в составе обновлённой версии статьи «CSS-менеджмент».</p>

<h2>Алло, таланты!</h2>

<p>Сейчас я продемонстрировал вам концепцию будущих пакетов Zen Coding. Для дальнейших шагов по её реализации осталось только найти соавтора или соавторов, которые согласны не только помочь мне реализовать эту функциональность, но и, возможно, заняться поддержкой, развитием и портированием пакетов для других редакторов. Большая часть алгоритмов написана, остальная дописывается и ждёт своего часа, чтобы быть реализованной в пакетах Zen Coding не только для TextMate, но и для всех редкторов, что поддерживают плагины: <a href="http://panic.com/coda/">Coda</a>, <a href="http://macrabbit.com/espresso/">Espresso</a>, <a href="http://www.jetbrains.com/idea/">IntelliJ IDEA</a> и многих других.</p>

<p>Если вы используете TextMate, знаете на хорошем уровне какой-нибудь скриптовый язык вроде Python, Ruby, Perl или даже PHP, и хотите написать что-нибудь такое или портировать Zen Coding для своего любимого редактора — смелее, пишите мне: <a href="mailto:pepelsbey@gmail.com">pepelsbey@gmail.com</a>.</p>

<p>Проект по-прежнему планируется держать на <a href="http://code.google.com/p/zen-coding/">Google Code</a>, но помимо этого будет открыт отдельный сайт с документацией и примерами — <a href="http://zen-coding.ru/">zen-coding.ru</a></p>

<p>Как обычно, с интересом жду ваших мнений по поводу озвученной концепции развития пакетов Zen Coding.</p>]]></content:encoded>
			<wfw:commentRss>http://pepelsbey.net/2009/04/zen-coding-concept/feed/</wfw:commentRss>
		<slash:comments>44</slash:comments>
		</item>
		<item>
		<title>Яндекс.Субботник в Киеве</title>
		<link>http://pepelsbey.net/2009/03/yandex-sabbath-kiev/</link>
		<comments>http://pepelsbey.net/2009/03/yandex-sabbath-kiev/#comments</comments>
		<pubDate>Tue, 31 Mar 2009 15:56:53 +0000</pubDate>
		<dc:creator>pepelsbey</dc:creator>
				<category><![CDATA[Заметки]]></category>

		<guid isPermaLink="false">http://pepelsbey.net/?p=448</guid>
		<description><![CDATA[Что ж, праздник приходит и к нашим украинским коллегам — 25 апреля Яндекс.Субботник приедет в Киев с гастролями. Программа, в основном, повторяет первое московское мероприятие, однако, насколько мне известно, точной копией не является — как минимум, докладчики учтут все вопросы и пожелания, что прозвучали после первого выступления.

Итак, участники: симферопольцы Вадим Макишвили с моноспектаклем «Вёрстка в [...]]]></description>
			<content:encoded><![CDATA[<p>Что ж, праздник приходит и к нашим украинским коллегам — 25 апреля Яндекс.Субботник <a href="http://clubs.ya.ru/company/replies.xml?item_no=15607">приедет в Киев</a> с гастролями. Программа, в основном, повторяет первое московское мероприятие, однако, насколько мне известно, точной копией не является — как минимум, докладчики учтут все вопросы и пожелания, что прозвучали после первого выступления.</p>

<p>Итак, участники: симферопольцы <a href="http://makishvili.com/">Вадим Макишвили</a> с моноспектаклем «Вёрстка в IntelliJIDEA» и <a href="http://vitaly.harisov.name/">Виталий Харисов</a> с развитем темы универсальной вёрстки, ваш покорный слуга со второй версией доклада «<a href="http://pepelsbey.net/2009/02/with-knife-against-train/">С ножом против паровоза</a>» и целых два доклада про <a href="http://api.yandex.ru/maps/">API Яндекс.Карт</a> от Александра Тармолова: один обзорный, второй — в виде мастер-класса.</p>

<p>До встречи в Киеве!</p>]]></content:encoded>
			<wfw:commentRss>http://pepelsbey.net/2009/03/yandex-sabbath-kiev/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Даркбокс 2</title>
		<link>http://pepelsbey.net/2009/02/darkbox-2/</link>
		<comments>http://pepelsbey.net/2009/02/darkbox-2/#comments</comments>
		<pubDate>Thu, 19 Feb 2009 01:26:14 +0000</pubDate>
		<dc:creator>pepelsbey</dc:creator>
				<category><![CDATA[Заметки]]></category>

		<guid isPermaLink="false">http://pepelsbey.net/?p=446</guid>
		<description><![CDATA[<ul class="picture-set">
<li><img src="http://pepelsbey.net/img/2009/02/darkbox-2/spinner.png" alt="Загрузчик"/></li>
<li><img src="http://pepelsbey.net/img/2009/02/darkbox-2/button-left.png" alt="Кнопка слева"/></li>
<li><img src="http://pepelsbey.net/img/2009/02/darkbox-2/button-right.png" alt="Кнопка справа"/></li>
</ul>

<p>Жизнь выдвигает новые требования, поэтому некоторые решения получают продолжение. Итак, перед вами продолжение экспериментов над одним простым, но очень полезным способом красиво открывать одиночные картинки. Более подробно об изначальной проблеме и первом варианте решения читайте в заметке «<a href="http://pepelsbey.net/2008/11/darkbox/">Даркбокс</a>», а сейчас поговорим о даркбоксе номер два.</p>

<p>Для начала пример — <a href="http://pepelsbey.net/pro/2009/02/darkbox-2/">Даркбокс 2</a>, всё в одном файле.</p>]]></description>
			<content:encoded><![CDATA[<ul class="picture-set">
<li><img src="http://pepelsbey.net/img/2009/02/darkbox-2/spinner.png" alt="Загрузчик"/></li>
<li><img src="http://pepelsbey.net/img/2009/02/darkbox-2/button-left.png" alt="Кнопка слева"/></li>
<li><img src="http://pepelsbey.net/img/2009/02/darkbox-2/button-right.png" alt="Кнопка справа"/></li>
</ul>

<p>Жизнь выдвигает новые требования, поэтому некоторые решения получают продолжение. Итак, перед вами продолжение экспериментов над одним простым, но очень полезным способом красиво открывать одиночные картинки. Более подробно об изначальной проблеме и первом варианте решения читайте в заметке «<a href="http://pepelsbey.net/2008/11/darkbox/">Даркбокс</a>», а сейчас поговорим о даркбоксе номер два.</p>

<p>Для начала пример — <a href="http://pepelsbey.net/pro/2009/02/darkbox-2/">Даркбокс 2</a>, всё в одном файле.</p>

<h2>Что нового, с виду</h2>
<ul>
<li>Картинка большей ширины или высоты чем окно, будет автоматически подогнана под его размеры, чтобы пользователь не испугался и смог нажать заветный крестик. Попробуйте сильно уменьшить размер окна и снова открыть картинку.</li>
<li>Датчик загрузки во всех нормальных браузерах, кроме Opera, обзавёлся скруглёнными уголками благодаря свойству <code>border-radius</code>.</li>
<li>Крестики закрытия картинки теперь располагаются в наиболее удобных местах, в зависимости от платформы: на Маке — слева, на PC — справа.</li>
<li>Теперь любой этап жизни даркбокса можно прервать при помощи клавиши <kbd>Esc</kbd>, на случай если вы передумали или кликнули случайно.</li>
</ul>

<h2>Что нового, технически</h2>

<p>Ну а чисто технически изменений не слишком много. В целом, код подрос примерно на сорок строк, большую часть из которых занимает мудрёное вписывание картинки в размеры окна. Помимо этого, сделана попытка сохранять создаваемый для дарбокса объект, чтобы клонировать и использовать его повторно для всех картинок. Не уверен, что это сильно повысило производительность, но попытка сделана:</p>

<ol class="code">
<li><code>if(!$('div.darkbox-frame').length) {</code></li>
<li><code>    darkbox = $('&lt;div class="darkbox-frame"&gt;…').appendTo('body');</code></li>
<li><code>}</code></li>
<li><code>var frame = darkbox.clone().appendTo('body');</code></li>
</ol>

<p>Совместимость у скрипта прежняя, разве что тестирование в IE5 привело к JS-ошибке, но дело, скорее всего, в текущей  версии jQuery. Думаю, что отряд не заметит потери бойца. Ну а Opera традиционно заставила прямо-таки создать картинку, а не просто приделать атрибут <code>src</code> к уже имеющемуся коду.</p>

<p>Другая проблема в IE, что тянется ещё с прошлой версии, случается во время анимации прозрачности блока с чёрным фоном от 0 до 50%. Суть её такова, что если описывать прозрачность в CSS при помощи <code>filter:alpha(opacity=N)</code>, то блок при появлении становится чёрным, потом абсолютно прозрачным и только потом начинается анимация. Видно это всего долю секунды, но осадочек остаётся. Трюк в стиле <em>добавим немного абсурда</em>, когда прозрачность добавляется к блоку при помощи JS, сработал, но снизил производительность всего решения. Поэтому вопрос открыт.</p>

<p>С интересом жду ваших мнений, замечаний и предложений. Разработка даркбокса продолжается…</p>]]></content:encoded>
			<wfw:commentRss>http://pepelsbey.net/2009/02/darkbox-2/feed/</wfw:commentRss>
		<slash:comments>29</slash:comments>
		</item>
		<item>
		<title>С ножом против паровоза</title>
		<link>http://pepelsbey.net/2009/02/with-knife-against-train/</link>
		<comments>http://pepelsbey.net/2009/02/with-knife-against-train/#comments</comments>
		<pubDate>Sun, 15 Feb 2009 03:24:30 +0000</pubDate>
		<dc:creator>pepelsbey</dc:creator>
				<category><![CDATA[Заметки]]></category>

		<guid isPermaLink="false">http://pepelsbey.net/?p=444</guid>
		<description><![CDATA[Вашему вниманию предлагается видеозапись презентации «С ножом против паровоза», прозвучавшей на Яндекс.Субботнике 31&#160;января этого года. Речь в ней идёт о нарезке и оптимизации изображений для вёрстки. Длительность доклада вместе с вопросами — 1&#160;час 12&#160;минут, размер видео порядка 270&#160;МБ.








Не в пример другим конференциям, наши операторы постарались и сняли выступление с двух камер, дополнив видео при монтаже [...]]]></description>
			<content:encoded><![CDATA[<p>Вашему вниманию предлагается видеозапись презентации «С ножом против паровоза», прозвучавшей на <a href="http://clubs.ya.ru/company/replies.xml?item_no=14661">Яндекс.Субботнике</a> 31&nbsp;января этого года. Речь в ней идёт о нарезке и оптимизации изображений для вёрстки. Длительность доклада вместе с вопросами — 1&nbsp;час 12&nbsp;минут, размер видео порядка 270&nbsp;МБ.</p>

<object type="application/x-shockwave-flash" data="http://pepelsbey.net/wp-content/themes/pepelsbey/j/flowplayer.swf" width="550" height="414">
<param name="quality" value="high"/>
<param name="allowscriptaccess" value="always"/>
<param name="flashvars" value="config={'clip':{'url':'http://pepelsbey.net/img/2009/02/with-knife-against-train/with-knife-against-train.flv','autoPlay':false},'plugins':{'controls':{'height':30,'autoHide':'always','backgroundColor':'#241412','backgroundGradient':'none','buttonColor':'#CC0000','buttonOverColor':'#DD0000','timeColor':'#FFFFFF','durationColor':'#FFFFFF','progressColor':'#382724','progressGradient':'none','bufferColor':'#615351','sliderColor':'#948B8A','mute':false,'fullscreen':false}},'canvas':{'backgroundColor':'#000000','backgroundGradient':'none'}}"/>
<!--[if IE]><param name="movie" value="http://pepelsbey.net/wp-content/themes/pepelsbey/j/flowplayer.swf"/><![endif]-->
</object>

<p>Не в пример другим конференциям, наши операторы постарались и сняли выступление с двух камер, дополнив видео при монтаже страницами из презентации. Но от судьбы не уйдёшь — и микрофонная стойка настройчиво пытается заслонить меня всю вторую половину доклада…</p>

<p>Для лучшего понимания, доступен оригинал презентации: <a href="http://pepelsbey.net/img/2009/02/with-knife-against-train/with-knife-against-train.pdf">С ножом против паровоза</a> (PDF, 4.5&nbsp;МБ). Все видео-версии докладов, прозвучавших на встрече, находятся на <a href="http://video.yandex.ru/users/ya-events/collection/2/">Яндекс.Видео</a>, а в полном качестве — на <a href="http://company.yandex.ru/experience/">сайте Яндекса</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://pepelsbey.net/2009/02/with-knife-against-train/feed/</wfw:commentRss>
		<slash:comments>57</slash:comments>
		</item>
		<item>
		<title>Яндекс.Субботник</title>
		<link>http://pepelsbey.net/2008/12/sabbath-yandex-sabbath/</link>
		<comments>http://pepelsbey.net/2008/12/sabbath-yandex-sabbath/#comments</comments>
		<pubDate>Wed, 24 Dec 2008 10:48:53 +0000</pubDate>
		<dc:creator>pepelsbey</dc:creator>
				<category><![CDATA[Заметки]]></category>

		<guid isPermaLink="false">http://pepelsbey.net/?p=436</guid>
		<description><![CDATA[Похоже, что череда новогодних подарков стартовала раньше, чем ожидалось — теперь у нас есть новое бесплатное образовательное мероприятие под названием Яндекс.Субботник.

Основа программы — доклады суровых крымских специалистов по клиентской разработке: Виталия Харисова, Вадима и Наталии Макишвили. Далее следуют доклады из не менее суровой северной столицы: Евгения Фирсова с деплойментом вёрстки и ваш покорный слуга с… [...]]]></description>
			<content:encoded><![CDATA[<p>Похоже, что череда новогодних подарков стартовала раньше, чем ожидалось — теперь у нас есть новое бесплатное образовательное мероприятие под названием <a href="http://company.yandex.ru/blog/message.xml?msg=104945">Яндекс.Субботник</a>.</p>

<p>Основа программы — доклады суровых крымских специалистов по клиентской разработке: <a href="http://vitaly.harisov.name/">Виталия Харисова</a>, <a href="http://makishvili.com/">Вадима и Наталии Макишвили</a>. Далее следуют доклады из не менее суровой северной столицы: <a href="http://saigo.moikrug.ru/">Евгения Фирсова</a> с деплойментом вёрстки и ваш покорный слуга с… да, «с ножом против паровоза». Ну и конечно первое публичное выступление по <a href="http://api.yandex.ru/maps/">API Яндекс.Карт</a> от <a href="http://fgolubev.moikrug.ru/">Фёдора Голубева</a>.</p>

<p>Есть только одна грустная новость — интерес к мероприятию оказался настролько высок, что регистрация была закрыта уже на следующий день. Столовая Яндекса, как ни странно, оказалась не резиновой.</p>

<p>Однако это не повод отчаиваться — все материалы и видеозаписи выступлений будут опубликованы вскоре после завершения мероприятия. А всем, кто не успел зарегестрироваться — я уверен — повезёт <em>в следующий раз…</em></p>

<p>А для тех, кому всё-таки повезло, предлагаю свою версию программы выступления, которую можно удобно распечатать: <a href="http://pepelsbey.net/pro/2008/12/sabbath-yandex-sabbath/">Яндекс.Субботник — Программа</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://pepelsbey.net/2008/12/sabbath-yandex-sabbath/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Даркбокс</title>
		<link>http://pepelsbey.net/2008/11/darkbox/</link>
		<comments>http://pepelsbey.net/2008/11/darkbox/#comments</comments>
		<pubDate>Thu, 20 Nov 2008 12:49:32 +0000</pubDate>
		<dc:creator>pepelsbey</dc:creator>
				<category><![CDATA[Заметки]]></category>

		<guid isPermaLink="false">http://pepelsbey.net/?p=404</guid>
		<description><![CDATA[ <p>К счастью, прошли времена, когда для загрузки картинки разработчики открывали отдельное окно браузера. У нас нынче <em>вебдваноль</em>, поэтому открывать отдельные окна это <em>моветон</em>, а современные JS-фрейворки дают возможность показать картинку по-настоящему красиво без особых сложностей.</p>

<p>И вроде решений для этого написано уйма — бери, да используй. Но вот беда — все они сделаны по принципу «plug-n-play», мол подключай и не парься. В итоге эти решения снабжены всевозможными фичами, которые позволяют открывать окошки с любым содержимым, передвигаться по галерее при помощи клавиатурных сокращений и многое-многое другое. Классно, ведь! Нет? Ну, не совсем — в итоге код такого плагина распухает от всех этих возможностей, которыми никто не будет пользоваться, и непонятных HTML-шаблонов, содержащих сомнительный код — и тут же стили к нему. А вот это уже не слишком классно…</p>

<p>Если страдать <em>синдромом аккуратизма</em> определённой тяжести, то подход «<em>а всё равно это JS, какая нафиг разница</em>» становится совсем неприемлем. А переписывание чужих решений практически равноценно написанию собственного — чем, собственно, я и занялся при подготовке новой версии этого сайта.</p>

<p>Начиналось всё с простых, но очень правильных принципов:</p>

<ul>
<li>Данные, т.е. картинка, — в HTML</li>
<li>Оформление — в CSS</li>
<li>Динамика — в JS, с полной обратной совместимостью</li>
</ul>

<p>В итоге, благодаря применению <a href="http://jquery.com/">jQuery</a>, получилась не слишком сложная функция и набор стилей к ней, которые решают простую задачу — открытие одной картинки с затемнением всего окна.</p>

<p><a href="http://pepelsbey.net/pro/2008/11/darkbox/">Даркбокс</a> — пример работы, весь код в одном файле.</p>]]></description>
			<content:encoded><![CDATA[<p>К счастью, прошли времена, когда для загрузки картинки разработчики открывали отдельное окно браузера. У нас нынче <em>вебдваноль</em>, поэтому открывать отдельные окна это <em>моветон</em>, а современные JS-фрейворки дают возможность показать картинку по-настоящему красиво без особых сложностей.</p>

<p>И вроде решений для этого написано уйма — бери, да используй. Но вот беда — все они сделаны по принципу «plug-n-play», мол подключай и не парься. В итоге эти решения снабжены всевозможными фичами, которые позволяют открывать окошки с любым содержимым, передвигаться по галерее при помощи клавиатурных сокращений и многое-многое другое. Классно, ведь! Нет? Ну, не совсем — в итоге код такого плагина распухает от всех этих возможностей, которыми никто не будет пользоваться, и непонятных HTML-шаблонов, содержащих сомнительный код — и тут же стили к нему. А вот это уже не слишком классно…</p>

<p>Если страдать <em>синдромом аккуратизма</em> определённой тяжести, то подход «<em>а всё равно это JS, какая нафиг разница</em>» становится совсем неприемлем. А переписывание чужих решений практически равноценно написанию собственного — чем, собственно, я и занялся при подготовке новой версии этого сайта.</p>

<p>Начиналось всё с простых, но очень правильных принципов:</p>

<ul>
<li>Данные, т.е. картинка, — в HTML</li>
<li>Оформление — в CSS</li>
<li>Динамика — в JS, с полной обратной совместимостью</li>
</ul>

<p>В итоге, благодаря применению <a href="http://jquery.com/">jQuery</a>, получилась не слишком сложная функция и набор стилей к ней, которые решают простую задачу — открытие одной картинки с затемнением всего окна.</p>

<p><a href="http://pepelsbey.net/pro/2008/11/darkbox/">Даркбокс</a> — пример работы, весь код в одном файле.</p>

<h2>Принципы работы</h2>

<p>Очень полезно начинать описание задачи не с фраз вроде «<em>а там такая штука крутится полупрозрачная, а потом пфф! и блёстки…</em>». Поэтому я начал с простого: у меня есть <em>просто ссылка</em> на <em>просто картинку</em>, и только если у пользователя включён JS, ссылка не срабатывает, а открывается то самое <em>полупрозрачное с блёстками</em>.</p>

<p>Контейнер для открытия картинки представляет собой блок вырванный из потока и спозиционированный при помощи <code>position:fixed</code>. Внутри него расположено само полупрозрачное затемнение и блок загрузчика с крутящимся псевдо-датчиком загрузки. Все эти объекты создаются динамически и складываются в нужном порядке:</p>

<ol class="code">
<li><code>&lt;div class="popup-frame"&gt;</code></li>
<li><code>    &lt;div class="popup-shadow"&gt;&lt;/div&gt;</code></li>
<li><code>    &lt;div class="popup-loader"&gt;&lt;/div&gt;</code></li>
<li><code>&lt;/div&gt;</code></li>
</ol>

<p>Это дело красиво появляется и дальше в загрузчик вкладываются пока невидимые картинка и кнопка закрытия. Атрибут <code>src</code> берётся из <code>href</code> ссылки, <code>alt</code> из её <code>title</code>:</p>

<ol class="code">
<li><code>&lt;img src="…" alt="…"/&gt;</code></li>
<li><code>&lt;span title="Закрыть">&lt;/span&gt;</code></li>
</ol>

<p>Сразу после загрузки нашей картинки, загрузчику выдаётся класс <code>popup-loaded</code>, который отключает датчик загрузки. Дальше он плавно меняет свои размеры, смещение, прозрачность и, наконец, ещё раз сменив класс на <code>popup-canvas</code>, показывает нам картинку. А на тень, кнопку и <kbd>Esc</kbd> вешается обработчик закрытия всей этой красоты.</p>

<p>Таким образом, всё оформление, что не участвует в анимации, применяется при помощи CSS-классов, а не присутствует в JS явно, как очень любят делать все плагинописатели.</p>

<h2>Неизбежное исключение</h2>

<p>Да, чуть было не забыл про IE. Данному скрипту удалось угодить всем его актуальным версиям, начиная с 5.5 и заканчивая 8.0. Проблемы с <code>position:fixed</code> для IE6 и младше решаются при помощи <code>expression</code>:</p>

<ol class="code">
<li><code>* HTML BODY {</code></li>
<li><code>    background:url(about:blank) fixed;</code></li>
<li><code>    }</code></li>
<li><code>* HTML .popup-frame {</code></li>
<li><code>    position:absolute;</code></li>
<li><code>    top:expression(0+(</code></li>
<li><code>        (e=document.documentElement.scrollTop)</code></li>
<li><code>        ?e:document.body.scrollTop)+'px');</code></li>
<li><code>    }</code></li>
</ol>

<p>Правило <code>background:url(about:blank) fixed</code> задаёт пустое фиксированное изображение для того, чтобы позиционирование блока в IE6 работало плавно, без рывков. Прозрачность для всех версий IE решается при помощи <code>filter:alpha(opacity=N)</code>, а использование PNG-24 картинки для кнопки, столь же традиционно лечится для IE6 с помощью <code>AlphaImageLoader</code>.</p>

<p>В целом, написание скрипта прошло гладко, как по учебнику, за исключением выходки браузера Opera. Ему, видите ли, не получить размеры динамически созданной и уже загруженной картинки, пока она не будет вставлена в документ. Даже IE5 ничего подобного не вытворял, в прочем, мне не жалко.</p>

<p>Итак, перед вами не претендующее на красоту и универсальность, однако, простое и эффективное решение для открытия картинок в стиле <em>вебдваноль</em>. Если кому-то пригодится — буду только рад.</p>

<p><strong>19 декабря 2008:</strong> благодаря внимательности читателей, поправлены некоторые ошибки в IE6, в частности — методика борьбы с дрожащим фоном и <code>expression</code> теперь универсальны и работают как в Standard Mode, так и в Quirks Mode.</p>

<p><strong>19 февраля 2009:</strong> внимание, вышла <a href="http://pepelsbey.net/2009/02/darkbox-2/">вторая версия Даркбокса</a>, которая и рекомендуется к использованию.</p>]]></content:encoded>
			<wfw:commentRss>http://pepelsbey.net/2008/11/darkbox/feed/</wfw:commentRss>
		<slash:comments>47</slash:comments>
		</item>
		<item>
		<title>Zen Coding 1.2</title>
		<link>http://pepelsbey.net/2008/11/zen-coding-1-2/</link>
		<comments>http://pepelsbey.net/2008/11/zen-coding-1-2/#comments</comments>
		<pubDate>Sat, 15 Nov 2008 00:39:52 +0000</pubDate>
		<dc:creator>pepelsbey</dc:creator>
				<category><![CDATA[Заметки]]></category>

		<guid isPermaLink="false">http://pepelsbey.net/?p=406</guid>
		<description><![CDATA[<p>Очередная порция исправлений ошибок, новых возможностей и прочих приятных изменений пакетов <a href="http://pepelsbey.net/2008/10/zen-css/">Zen CSS</a> и <a href="http://pepelsbey.net/2008/08/zen-html/">Zen HTML</a>, а также новый способ их распространения.</p>

<p>Главное изменение связано с открытием филиала проекта на Google Code — <a href="http://code.google.com/p/zen-coding/">Zen&#160;Coding</a>. Теперь следить за появлением новых версий станет проще, а получить их можно будет двумя способами: по старинке — скачав и распаковав архив, либо при помощи <strong>svn</strong>, что позволит удобно следить за внесёнными изменениями.</p>]]></description>
			<content:encoded><![CDATA[<p>Очередная порция исправлений ошибок, новых возможностей и прочих приятных изменений пакетов <a href="http://pepelsbey.net/2008/10/zen-css/">Zen CSS</a> и <a href="http://pepelsbey.net/2008/08/zen-html/">Zen HTML</a>, а также новый способ их распространения.</p>

<p>Главное изменение связано с открытием филиала проекта на Google Code — <a href="http://code.google.com/p/zen-coding/">Zen&nbsp;Coding</a>. Теперь следить за появлением новых версий станет проще, а получить их можно будет двумя способами: по старинке — скачав и распаковав архив, либо при помощи <strong>svn</strong>, что позволит удобно следить за внесёнными изменениями.</p>

<p>С первым способом всё понятно — архиватором умеют пользоваться все, поэтому вы знаете, что делать с последними версиями пакетов на <a href="http://code.google.com/p/zen-coding/downloads/list">странице загрузки</a>. Второй способ чуть сложнее: если вы работаете под Mac OS X, то всё необходимое для работы с <strong>svn</strong> в вашей системе уже есть, однако можно пойти дальше и установить замечательное приложение <a href="http://www.versionsapp.com/">Versions</a> или воспользоваться встроенной поддержкой <strong>svn</strong> в редакторе <a href="http://www.panic.com/coda/">Coda</a>. Я же опишу простейший способ — при помощи <strong>Терминала</strong>, стандартной программы Mac OS X.</p>

<p>Для начала откройте <strong>Терминал</strong>, набрав его название в Spotlight — по-русски или по-английски, в зависимости от языка системы. Дальше всё удивительно просто: при помощи первой команды вы переходите на рабочий стол, при помощи второй — скачиваете на него свежую версию пакета:</p>

<ol class="code">
<li><code>cd ~/Desktop/</code></li>
<li><code>svn co http://zen-coding.googlecode.com/svn/trunk/ .</code></li>
</ol>

<p>Если же вы работаете под Windows, то могу предложить вам воспользоваться утилитой <a href="http://tortoisesvn.tigris.org/">TortoiseSVN</a> — тоже не менее простой в обращении. Так, с контролем версий разобрались, переходим к списку изменений:</p>

<h2>Zen HTML</h2>

<p>Система комбинаций <kbd>E+n</kbd>, которая разворачивала селекторы с необходимым количеством детей (от одного до пяти) была полностью заменена техникой, которая позволит быстрее набирать любые последовательности списков для элементов <code>&lt;li&gt;</code>, <code>&lt;th&gt;</code>, <code>&lt;td&gt;</code> и <code>&lt;option&gt;</code>. Суть техники заключается в том, что нажатие клавиши <kbd>Tab</kbd> после каждого закрывающего элемента будет создавать новую строку и следующую пару элементов. Таким образом, кобинация <kbd>li Tab Значение Tab Tab Значение</kbd> создаст нам такую конструкцию:</p>

<ol class="code">
<li><code>&lt;li&gt;Значение&lt;/li&gt;</code></li>
<li><code>&lt;li&gt;Значение&lt;/li&gt;</code></li>
</ol>

<p>Поясню: первый <code>Tab</code> создаст нам первый <code>&lt;li&gt;</code>, второй выведет курсор за его пределы, а нажатый тут же третий, создаст новую строку со вторым <code>&lt;li&gt;</code>. Так можно продолжать довольно долго, процесс завораживает своей простотой. Далее — небольшие изменения:</p>

<ul>
<li>Элемент <code>&lt;br&gt;</code> теперь можно вставить не только комбинацией <kbd>br+Tab</kbd>, но и более удобной и понятной <kbd>Shift+Enter</kbd>.</li>
<li>Для оборачивания выделенного фрагмента в нужный элемент, появились сочетания <kbd>Ctrl+W</kbd> — для однострочного заворачивания и <kbd>Ctrl+Shift+W</kbd> — для многострочного. По умолчанию, оборачивающим элементом становится <code>&lt;div&gt;</code>, но вы тут же можете изменить его, причём сразу в открывающем и закрывающем тегах.</li>
</ul>

<h2>Zen CSS</h2>

<p>Новая версия этого пакета также обзавелась механизмом быстрого набора длинного списка свойств, без необходимости вручную создавать новую строку. Теперь по сочетанию <kbd>;+Tab</kbd>, т.е. после каждого закрытого правила, автоматически вставляется перевод строки. Например, комбинация <kbd>fl:l Tab Tab b:n Tab Tab c Tab</kbd> создаст нам следующий код:</p>

<ol class="code">
<li><code>float:left;</code></li>
<li><code>border:none;</code></li>
<li><code>color:#FFF;</code></li>
</ol>

<p>То есть: первый <kbd>Tab</kbd> создаёт свойство, а следующий новую строку и всё по новой. Если же свойство разворачивается с предустановленными значениями, то вам сначала придётся пройтись по ним, а потом уже выйти за пределы правила и создать новую строку.</p>

<p>Также, по многочисленным заявкам, была введена специальная переменная, которая регламентирует появление пробела в правиле <em>после</em> двоеточия и <em>до</em> значения. Таким образом, вы можете продолжать использовать все удобства этого пакета, не меняя коренным образом свои правила форматирования кода. Устанавливается эта переменная настройках TextMate: Preferences → Advanced → Shell Variables → Variable: <code>TM_CSS_SPACE</code>, Value: <code>[пробел]</code>. Далее — небольшие изменения:</p>

<ul>
<li>Для свойств <code>top</code>, <code>right</code>, <code>bottom</code> и <code>left</code> всё-таки были введены сокращения: <kbd>t</kbd>, <kbd>r</kbd>, <kbd>bo</kbd> и <kbd>l</kbd>, соответственно. Символ <kbd>b</kbd> остался за свойством <code>border</code> по причине многочисленных сочетаний с ним связанных, а так же более частой употребимости.</li>
<li>Регулярное выражение, подсвечивающее HTML-селекторы в CSS-коде, стало регистронезависимым, поэтому теперь подсвечивается как строчное, так и прописное их написание. Что опять же добавляет пакету гибкости.</li>
<li>Для более точной и логичной работы всех предусмотренных подстановок, было удалено автоматическое дополнение двоеточия точкой с запятой — <code>:;</code>. В ситуации, когда пакет предлагает <strong>все</strong> необходимые своства и значения, данная потеря не кажется мне столь ощутимой.</li>
</ul>

<p>Итак, напоминаю — пакеты теперь можно скачать на <a href="http://code.google.com/p/zen-coding/">странице проекта</a> в Google Code или через <a href="http://code.google.com/p/zen-coding/source/checkout">svn-репозитарий</a>, а я с интересом жду ваших отзывов, замечаний и, самое главное, — предложений.</p>]]></content:encoded>
			<wfw:commentRss>http://pepelsbey.net/2008/11/zen-coding-1-2/feed/</wfw:commentRss>
		<slash:comments>26</slash:comments>
		</item>
		<item>
		<title>Коробка с cюрпризами</title>
		<link>http://pepelsbey.net/2008/11/surprise-box/</link>
		<comments>http://pepelsbey.net/2008/11/surprise-box/#comments</comments>
		<pubDate>Fri, 07 Nov 2008 02:29:07 +0000</pubDate>
		<dc:creator>pepelsbey</dc:creator>
				<category><![CDATA[Заметки]]></category>

		<guid isPermaLink="false">http://pepelsbey.net/?p=362</guid>
		<description><![CDATA[<p>Сначала мы <a href="/2008/08/im-not-coward-but-hell/">боялись</a>, потом вроде <a href="/2008/09/ie-street-magic/">взяли себя в руки</a>, приняв происходящее за простые и понятные фокусы. Сегодня пришло время удивляться снова — фокусы IE8 с переключением режимов рендеринга оказались хитрее, чем казалось поначалу. Что же мы знаем про магическую директиву <code>X-UA-Compatible</code>?</p>

<ul>
<li>Эта директива в виде элемента <code>&#60;meta&#62;</code> должна присутствовать в документе.</li>
<li>В ней должно быть указано одно из двух типов значений: <code>IE=x</code>, где <code>x</code> — это обозначение желаемой версии движка или специальное ключевое слово <code>EmulateIE7</code>.</li>
<li>…и, в общем-то, всё.</li>
</ul>

<p>Давайте проверим, скормив IE8 простой документ:</p>

<ol class="code">
<li><code>&#60;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"</code></li>
<li><code>"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&#62;</code></li>
<li><code>&#60;html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru"&#62;</code></li>
<li><code>&#60;head&#62;</code></li>
<li><code>    &#60;title&#62;IE=x&#60;/title&#62;</code></li>
<li><code>    &#60;meta http-equiv="Content-Type" content="text/html;charset=utf-8"/&#62;</code></li>
<li><code>    &#60;meta http-equiv="X-UA-Compatible" content="IE=x"/&#62;</code></li>
<li><code>    &#60;style type="text/css"&#62;</code></li>
<li><code>        BODY[class*='page'] {</code></li>
<li><code>            background:#090; /* IE8 и прочие современные */</code></li>
<li><code>            }</code></li>
<li><code>        *:first-child+HTML .page {</code></li>
<li><code>            background:#FC0; /* IE7, исключительно */</code></li>
<li><code>            }</code></li>
<li><code>        * HTML .page {</code></li>
<li><code>            background:#C00; /* IE6 и младше */</code></li>
<li><code>            }</code></li>
<li><code>    &#60;/style&#62;</code></li>
<li><code>&#60;/head&#62;</code></li>
<li><code>&#60;body class="page"&#62;&#60;/body&#62;</code></li>
<li><code>&#60;/html&#62;</code></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Сначала мы <a href="/2008/08/im-not-coward-but-hell/">боялись</a>, потом вроде <a href="/2008/09/ie-street-magic/">взяли себя в руки</a>, приняв происходящее за простые и понятные фокусы. Сегодня пришло время удивляться снова — фокусы IE8 с переключением режимов рендеринга оказались хитрее, чем казалось поначалу. Что же мы знаем про магическую директиву <code>X-UA-Compatible</code>?</p>

<ul>
<li>Эта директива в виде элемента <code>&lt;meta&gt;</code> должна присутствовать в документе.</li>
<li>В ней должно быть указано одно из двух типов значений: <code>IE=x</code>, где <code>x</code> — это обозначение желаемой версии движка или специальное ключевое слово <code>EmulateIE7</code>.</li>
<li>…и, в общем-то, всё.</li>
</ul>

<p>Давайте проверим, скормив IE8 простой документ:</p>

<ol class="code">
<li><code>&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"</code></li>
<li><code>"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&gt;</code></li>
<li><code>&lt;html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru"&gt;</code></li>
<li><code>&lt;head&gt;</code></li>
<li><code>    &lt;title&gt;IE=x&lt;/title&gt;</code></li>
<li><code>    &lt;meta http-equiv="Content-Type" content="text/html;charset=utf-8"/&gt;</code></li>
<li><code>    &lt;meta http-equiv="X-UA-Compatible" content="IE=x"/&gt;</code></li>
<li><code>    &lt;style type="text/css"&gt;</code></li>
<li><code>        BODY[class*='page'] {</code></li>
<li><code>            background:#090; /* IE8 и прочие современные */</code></li>
<li><code>            }</code></li>
<li><code>        *:first-child+HTML .page {</code></li>
<li><code>            background:#FC0; /* IE7, исключительно */</code></li>
<li><code>            }</code></li>
<li><code>        * HTML .page {</code></li>
<li><code>            background:#C00; /* IE6 и младше */</code></li>
<li><code>            }</code></li>
<li><code>    &lt;/style&gt;</code></li>
<li><code>&lt;/head&gt;</code></li>
<li><code>&lt;body class="page"&gt;&lt;/body&gt;</code></li>
<li><code>&lt;/html&gt;</code></li>
</ol>

<p>Меняя значение <code>IE=x</code> последовательно — 8, 7, 6 — мы переключаем режимы рендеринга IE и получаем такой светофор:</p>

<ul class="picture-set">
<li><a href="/img/2008/11/surprise-box/ie8.png" rel="darkbox"><img src="/img/2008/11/surprise-box/ie8-t.png" alt="IE8"/></a></li>
<li><a href="/img/2008/11/surprise-box/ie7.png" rel="darkbox"><img src="/img/2008/11/surprise-box/ie7-t.png" alt="IE7"/></a></li>
<li><a href="/img/2008/11/surprise-box/ie6.png" rel="darkbox"><img src="/img/2008/11/surprise-box/ie6-t.png" alt="IE6"/></a></li>
</ul>

<p>Красивую расцветку обеспечили нам специальные CSS-фильтры для каждой версии IE:</p>

<ul>
<li><code>E[att*='val']</code> — IE8 и прочие современные браузеры, селектор выборки подстрок атрибутов из <a href="http://www.w3.org/TR/css3-selectors/#attribute-substrings">черновика CSS 3</a>. Да-да, из <em>черновика</em>, который IE8 не собирался поддерживать…</li>
<li><code>*:first-child+HTML E</code> — IE7, исключительно. Просто милый хак, в очередной раз обыгрывающий странное понимание разработчиками IE понятия <em>корневой элемент</em>.</li>
<li><code>* HTML E</code> — IE6 и младше, знаменитый <em>Star HTML Hack</em>, что бы мы без него делали.</li>
</ul>

<p>Ну что — пока без сюрпризов, почти скучно. А давайте-ка подключим к документу фавиконку. Вставим её куда-нибудь в элемент <code>&lt;head&gt;</code>, произвольно:</p>

<ol class="code">
<li><code>&lt;head&gt;</code></li>
<li><code>    &lt;title&gt;IE=x&lt;/title&gt;</code></li>
<li><code>    &lt;meta http-equiv="Content-Type" content="text/html;charset=utf-8"/&gt;</code></li>
<li><code>    &lt;link rel="shortcut icon" type="image/x-icon" href="favicon.ico"/&gt;</code></li>
<li><code>    &lt;meta http-equiv="X-UA-Compatible" content="IE=x"/&gt;</code></li>
<li><code>&lt;/head&gt;</code></li>
</ol>

<p>…и вот здесь начинается самое интересное — все документы позеленели, при любых значениях <code>IE=x</code>. И это фактически означает то, что IE8 просто перестал воспринимать директиву <code>X-UA-Compatible</code>.</p>

<p>Нет, дело совсем не в фавиконке. Дело в новом расположении элемента <code>&lt;meta&gt;</code> с нашей чудо-директивой. Теперь мета-информация о режиме рендеринга документа становится известна <em>после</em> появления первых элементов самого документа и успешно игнорируется.</p>

<p>В ходе тестов выяснилось, что предшествовать директиве могут только мета-элементы и <code>&lt;title&gt;</code> — по сути тоже часть мета-описания документа. Все остальные варианты расположения директивы делают её абсолютно неработоспособной.</p>

<p>Эксперименты это конечно хорошо, но хочется знать наверняка, поэтому полчаса копания в <a href="http://msdn.microsoft.com/">MSDN</a> дали однозначный ответ в статье «<a href="http://msdn.microsoft.com/en-us/magazine/cc288325(VS.85).aspx">Defining Document Compatibility</a>» — все предположения оказались верны:</p>

<blockquote>Являясь регистронезависимым, заголовок X-UA-compatible, тем не менее, <strong>должен</strong> находиться в секции HEAD страницы <strong>перед всеми остальными элементами</strong>, за исключением <strong>title и других мета-элементов</strong>.</blockquote>

<p>Вывод из всей этой истории напрашивается следующий: для успешной борьбы, врага нужно знать в лицо. Пусть даже ценой чтения сомнительной документации по MSHTML.</p>]]></content:encoded>
			<wfw:commentRss>http://pepelsbey.net/2008/11/surprise-box/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
	</channel>
</rss>
