<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" version="2.0">
	<channel>
		
		<title>Блог Павла Радькова</title>
		<link>http://paulradzkov.com</link>
		<description>Заметки о веб-разработке Павла Радькова.</description>
		<lastBuildDate>Tue, 04 Jul 2017 00:00:00 GMT</lastBuildDate>
		<language>ru</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
		
			<item>
				<title>Как правильно использовать переменные в препроцессорах Less и Sass</title>
				<link>http://paulradzkov.com/2017/local_variables/</link>
				<description></description>
				<content:encoded>
					<![CDATA[<p>История архитектурной ошибки, её последствия, и три правила, благодаря которым вы сможете держать исходный код в порядке и снизить стоимость внесения изменений.</p>
<!-- cut -->
<p><a name="prehistory" id="prehistory"></a></p>
<aside class="article-grid--incut article-grid--incut-row-3 space-out-top-mega-xl">
    <ol class="local-nav">
        <li><a href="#prehistory">Предыстория</a></li>
        <li><a href="#problems">Проблемы</a></li>
        <li><a href="#solutions">Как решать</a></li>
        <li><a href="#onLess">Реализация на Less</a></li>
        <li><a href="#onSass">Реализация в Sass</a></li>
        <li><a href="#conclusion">Выводы</a></li>
        <li><a href="#examples">Реальные примеры</a></li>
        <li><a href="#bonus">Бонус-трек</a></li>
        <li><a href="#disqus_thread" data-disqus-identifier="local_variables">Комментарии</a></li>
    </ol>
</aside>

<h2 id="-">Предыстория</h2>
<p>В 2014 году в компании начали редизайн проекта и в основу вёрстки мы положили свежий на тот момент Bootstrap 3.0.1. Использовали мы его не как отдельную стороннюю библиотеку, а тесно заинтегрировали с нашим собственным кодом: отредактировали переменные под наш дизайн и компилировали кастомизированный Бутстрап из Less исходников самостоятельно. Проект оброс собственными модулями, которые использовали бутстраповские переменные и добавляли в файл с настройками свои новые переменные.</p>
<p>В тот момент я думал, что это правильный подход. Ведь код сразу компилируется с нужными значениями без переопределения стилей. CSS чистый, компактный и без повторений. Компоненты стилизованы с помощью глобальных настроек.</p>
<p>Через год с небольшим редизайн закончился, проект вышел в продакшн, и мы взялись за технический долг. При попытке обновить Бутстрап до версии 3.6.x выяснилось, что смержить новый variables.less с нашим файлом настроек будет нелегко. В Бутстрапе переименовали или убрали часть переменных, добавили новые. Собственные компоненты Бутстрапа обновились без проблем, а вот наши компоненты падали при компиляции из-за этих изменений.</p>
<p><a name="problems" id="problems"></a></p>
<h2 id="-">Проблемы</h2>
<p>Мы проанализировали ситуацию и сформулировали проблемы.</p>
<ol>
<li><p><strong>Слишком связанный код.</strong></p>
<p>Сами компоненты лежали в отдельных файлах. Это создавало иллюзию, что компоненты независимые. Но компоненты использовали переменные, объявленные в отдельном файле variables.less, и без этого файла не работали. Нельзя было просто так взять и переместить компонент в другой проект. Приходилось тянуть за собой файл с настройками, который со временем превратился в помойку.</p>
</li>
<li><p><strong>Слишком много глобальных переменных</strong>.</p>
<p>У Бутстрапа было ≈400 переменных. Мы отключили неиспользуемые компоненты Бутстрапа, но переменные оставили в конфиге на случай, если снова понадобятся. Еще мы добавили сотню или полторы своих переменных. Все названия не запомнить, трудно быстро находить нужные. Даже с правилами именования и комментариями ориентироваться в конфиге из 500+ переменных тяжело.</p>
</li>
<li><p><strong>Имена глобальных переменных вышли из-под контроля</strong>.</p>
<p>Одна и та же переменная могла использоваться в разных файлах и отслеживать все её появления в коде было долго и трудно. Когда меняли значение переменной в одном компоненте, был риск поломать другие компоненты. Разработчики хардкодили, создавали новые переменные с похожими названиями и значениями и уже не следили за логикой именования.</p>
</li>
</ol>
<p><a name="solutions" id="solutions"></a></p>
<h2 id="-">Как решать</h2>
<p>Я придумал три правила, которые помогли побороть наши проблемы:</p>
<ol class="ol-important space-in-h-zero-xs space-in-h-base-sm">
    <li>
        <p class="text-custom-number text-important text-center space-in-wide-base-xs space-in-wide-kilo-md space-out-v-base-xs space-minus-h-base-sm " data-number="1"><strong>Переменная используется только в том файле, в котором объявлена.</strong></p>
        <p>Правильно создавать все нужные переменные в файле самого компонента и не использовать переменные из других файлов. Тогда компоненты станут независимыми, их можно будет подключать и перемещать между проектами без поломок при компиляции. У каждого компонента собственный набор переменных, которые запрещено использовать в других компонентах и вызывать в других файлах. Когда переменные не выходят за пределы одного файла, легко увидеть, как они используются и на что влияют.</p>
    </li>
    <li>
        <p class="text-custom-number text-important text-center space-in-wide-base-xs space-in-wide-kilo-md space-out-v-base-xs space-minus-h-base-sm " data-number="2"><strong>Все переменные внутри компонента — локальные.</strong></p>
        <p>Раз у каждого компонента свои переменные, пусть они будут локальными. Это избавит от проблем с именованием: в компонентах можно использовать переменные с одинаковыми именами и разными значениями — они не будут конфликтовать друг с другом.</p>
    </li>
    <li>
        <p class="text-custom-number text-important text-center space-in-wide-base-xs space-in-wide-kilo-md space-out-v-base-xs space-minus-h-base-sm " data-number="3"><strong>Глобальные переменные используются только внутри файла настроек.</strong></p>
        <p>Благодаря первым двум правилам мы сильно сократим количество глобальных переменных, но они всё равно нужны. Глобальные переменные объявляются в главном файле проекта или в файле типа config.less. К ним тоже применяется правило №1 — переменные не используются за пределами своего файла. Это значит, что нельзя использовать глобальные переменные внутри файлов компонентов. Но существует способ не нарушая первого правила прокинуть значение глобальной переменной внутрь компонента. Как это сделать мы рассмотрим на примерах далее.</p>
    </li>
</ol>

<p>Третье правило избыточное. Соблюдая первые два, вы автоматически соблюдаете третье. Но в реальной жизни есть очень большой соблазн пойти по простейшему пути, не создавать локальную переменную, а по-быстрому использовать глобальную. Третье правило напоминает, что так делать вредно, что это создаёт ненужные зависимости и приводит к связыванию кода.</p>
<p>Применим правила на практике.</p>
<p><a name="onLess" id="onLess"></a></p>
<h2 id="-less">Реализация на Less</h2>
<p>Представим простейший компонент для стилизации страницы. Согласно правилу №1 создадим переменные внутри файла компонента.</p>
<aside class="article-grid--aside txt-aside">
    <dl>
        <dt>Правило 1</dt>
        <dd>Переменная используется только в том файле, в котором объявлена.</dd>
    </dl>
</aside>

<figure class="space-out-h-kilo-xl">
    <div class="row row-middle-xs">
        <section class="col-xs-12 col-md space-minus-right-giga-md">
            <div class="browserframe" data-title="page.css">
                <pre class="highlight"><code class="hljs css"><span class="hljs-comment">/* page.css */</span>

<span class="hljs-selector-class">.page</span> {
    <span class="hljs-attribute">padding</span>: <span class="hljs-number">40px</span>;
    <span class="hljs-attribute">color</span>: <span class="hljs-number">#000</span>;
    <span class="hljs-attribute">background-color</span>: <span class="hljs-number">#fff</span>;
}
</code></pre>

            </div>
            <figcaption class="space-in-h-mili-md"><strong>Было.</strong> Пример кода компонента.</figcaption>
        </section>
        <section class="col-xs-12 col-md-1">
            <p>↓</p>
        </section>
        <section class="col-xs-12 col-md">
            <div class="browserframe" data-title="page.less">
                <pre class="highlight"><code class="hljs less"><span class="hljs-comment">// page.less v0.1</span>

<span class="hljs-variable">@padding:</span> <span class="hljs-number">40px</span>;
<span class="hljs-variable">@txt-color:</span> <span class="hljs-number">#000</span>;
<span class="hljs-variable">@bg-color:</span> <span class="hljs-number">#fff</span>;

<span class="hljs-selector-class">.page</span> {
    <span class="hljs-attribute">padding</span>: <span class="hljs-variable">@padding</span>;
    <span class="hljs-attribute">color</span>: <span class="hljs-variable">@txt-color</span>;
    <span class="hljs-attribute">background-color</span>: <span class="hljs-variable">@bg-color</span>;
}
</code></pre>

            </div>
            <figcaption class="space-in-h-mili-md"><strong>Стало.</strong> Переменные объявлены в глобальной области видимости и у них слишком общие имена. Это плохо.</figcaption>
        </section>
    </div>
</figure>

<p>В примере выше мы объявили переменные в глобальной области видимости и из-за этого они подвержены конфликту имён. Если в соседнем компоненте появится переменная с таким же именем, то компоненты поломают друг друга.</p>
<h3 id="-">Локальные переменные</h3>
<p><strong>Область видимости</strong> — это «пространство» между фигурными скобками селектора: { и } . Объявленные внутри фигурных скобок переменные работают только внутри этих скобок и внутри дочерних скобок, но их нельзя использовать снаружи.</p>
<p>Если скобок вокруг нет, то это самый верхний уровень — <strong>глобальная область видимости</strong>.</p>
<p>У переменной из дочерней области видимости приоритет выше, чем у одноименной переменной из родительской области видимости. У глобальных переменных самый низкий приоритет при совпадении имён.</p>
<p>По правилу №2 сделаем переменные локальными — переместим их внутрь селектора.</p>
<aside class="article-grid--aside txt-aside">
    <dl>
        <dt>Правило 2</dt>
        <dd>Все переменные внутри компонента — локальные.</dd>
    </dl>
</aside>

<figure class="space-out-h-kilo-xl">
    <div class="row row-middle-xs">
        <section class="col-xs-12 col-md space-minus-right-giga-md space-auto-top-md">
            <div class="browserframe" data-title="page.less">
                <pre class="highlight"><code class="hljs less"><span class="hljs-comment">// page.less v0.1</span>

<span class="hljs-variable">@padding:</span> <span class="hljs-number">40px</span>;
<span class="hljs-variable">@txt-color:</span> <span class="hljs-number">#000</span>;
<span class="hljs-variable">@bg-color:</span> <span class="hljs-number">#fff</span>;

<span class="hljs-selector-class">.page</span> {
    <span class="hljs-attribute">padding</span>: <span class="hljs-variable">@padding</span>;
    <span class="hljs-attribute">color</span>: <span class="hljs-variable">@txt-color</span>;
    <span class="hljs-attribute">background-color</span>: <span class="hljs-variable">@bg-color</span>;
}
</code></pre>

            </div>
            <figcaption class="space-in-h-mili-md"><strong>Было.</strong> Глобальные переменные.</figcaption>
        </section>
        <section class="col-xs-12 col-md-1">
            <p>↓</p>
        </section>
        <section class="col-xs-12 col-md">
            <div class="browserframe" data-title="page.less">
                <pre class="highlight"><code class="hljs less"><span class="hljs-comment">// page.less v0.2</span>

<span class="hljs-selector-class">.page</span> {
    <span class="hljs-variable">@padding:</span> <span class="hljs-number">40px</span>;
    <span class="hljs-variable">@txt-color:</span> <span class="hljs-number">#000</span>;
    <span class="hljs-variable">@bg-color:</span> <span class="hljs-number">#fff</span>;

    <span class="hljs-attribute">padding</span>: <span class="hljs-variable">@padding</span>;
    <span class="hljs-attribute">color</span>: <span class="hljs-variable">@txt-color</span>;
    <span class="hljs-attribute">background-color</span>: <span class="hljs-variable">@bg-color</span>;
}
</code></pre>

            </div>
            <figcaption class="space-in-h-mili-md"><strong>Стало.</strong> Переменные объявлены внутри селектора и не создают конфликта имён, потому что теперь они локальные.</figcaption>
        </section>
    </div>
</figure>

<p>Теперь конфликта имен с другими компонентами не будет. Мы решили первую и вторую проблемы: получился изолированный сниппет без внешних зависимостей. Но я не знаю способа переопределить локальные переменные компонента в таком виде извне. Поэтому, чтобы кастомизировать компоненты глобальными переменными проекта, придумал другую форму записи.</p>
<h3 id="-">Миксины как функции</h3>
<p>В Less можно использовать миксины как функции. Если внутри миксина создать переменные, а потом вызвать миксин внутри селектора, то переменные будут доступны в области видимости этого селектора.</p>
<aside class="article-grid--aside txt-aside">
    <p>Читайте про <a href="http://lesscss.org/features/#mixins-as-functions-feature" target='_blank'>миксины как функции</a> в документации Less.</p>
</aside>

<p>Вынесем объявление переменных внутрь миксина <code>.page-settings()</code>, а потом вызовем его внутри селектора <code>.page</code>:</p>
<figure class="space-out-h-kilo-xl">
    <div class="row row-middle-xs">
        <section class="col-xs-12 col-md space-minus-right-giga-md">
            <div class="browserframe" data-title="page.less">
                <pre class="highlight"><code class="hljs less"><span class="hljs-comment">// page.less v0.2</span>

<span class="hljs-selector-class">.page</span> {
    <span class="hljs-variable">@padding:</span> <span class="hljs-number">40px</span>;
    <span class="hljs-variable">@txt-color:</span> <span class="hljs-number">#000</span>;
    <span class="hljs-variable">@bg-color:</span> <span class="hljs-number">#fff</span>;

    <span class="hljs-attribute">padding</span>: <span class="hljs-variable">@padding</span>;
    <span class="hljs-attribute">color</span>: <span class="hljs-variable">@txt-color</span>;
    <span class="hljs-attribute">background-color</span>: <span class="hljs-variable">@bg-color</span>;
}
</code></pre>

            </div>
            <figcaption class="space-in-h-mili-md"><strong>Было.</strong> Локальные переменные внутри селектора.</figcaption>
        </section>
        <section class="col-xs-12 col-md-1">
            <p>↓</p>
        </section>
        <section class="col-xs-12 col-md">
            <div class="browserframe" data-title="page.less">
                <pre class="highlight"><code class="hljs less"><span class="hljs-comment">// page.less v0.3</span>

<span class="hljs-selector-class">.page-settings</span>() {
    <span class="hljs-variable">@padding:</span> <span class="hljs-number">40px</span>;
    <span class="hljs-variable">@txt-color:</span> <span class="hljs-number">#000</span>;
    <span class="hljs-variable">@bg-color:</span> <span class="hljs-number">#fff</span>;
}

<span class="hljs-selector-class">.page</span> {
    <span class="hljs-selector-class">.page-settings</span>();

    <span class="hljs-attribute">padding</span>: <span class="hljs-variable">@padding</span>;
    <span class="hljs-attribute">color</span>: <span class="hljs-variable">@txt-color</span>;
    <span class="hljs-attribute">background-color</span>: <span class="hljs-variable">@bg-color</span>;
}
</code></pre>

            </div>
            <figcaption class="space-in-h-mili-md"><strong>Стало.</strong> Миксин доставляет переменные в зону видимости селектора.</figcaption>
        </section>
    </div>
</figure>

<p>Переменные локализованы внутри глобального миксина. Когда мы вызвали миксин в коде, переменные стали доступны в области видимости селектора <code>.page</code>, но по прежнему остались локальными.</p>
<p>Такой миксин не генерирует CSS код, его единственная задача — доставить переменные в нужную область видимости. Например, если вызвать этот миксин в глобальной области видимости, то и переменные станут глобальными. Но это то же самое, что сразу объявить переменные глобально.</p>
<p>Вместо нескольких глобальных переменных с распространёнными именами мы создали один глобальный миксин. В проекте не должно быть двух одноименных компонентов, значит имя миксина будет уникальным.</p>
<h3 id="-">Слияние миксинов</h3>
<p>В Less существует «ленивое вычисление» переменных: не обязательно объявлять Less-переменную перед её использованием, можно объявить после. В момент компиляции парсер Less найдет определение переменной и отрендерит значение этой переменной в CSS.</p>
<aside class="article-grid--aside article-grid--aside-row-2 txt-aside">
    <p>Смотрите <a href="http://lesscss.org/features/#variables-feature-lazy-evaluation" target='_blank'>примеры «Lazy Evaluation»</a> и <a href="http://lesscss.org/features/#variables-feature-default-variables" target='_blank'>переопределения дефолтных переменных</a> в документации Less.</p>
</aside>

<p>Если переопределить переменную, то во всех местах её использования в силу вступит значение из самого последнего определения, так как оно приоритетнее по порядку следования в исходном коде. В этом смысле переменные ведут себя как константы.</p>
<p>Итак, переменные можно объявлять и до, и после использования, а миксины — это разновидность переменных. Если создать два миксина с одним и тем же именем и разным содержанием, то они объединяют свои внутренности. А если внутри миксинов есть переменные с одинаковыми именами, то происходит переопределение. Приоритет выше у последнего миксина.</p>
<p>Рассмотрим три файла:</p>
<figure class="space-out-h-kilo-xl">
    <div class="row row-bottom-xs row-center-xs row-middle-lg">
        <section class="col-xs-12 col-md-6 col-lg-shrink col-xl space-minus-right-base-md space-minus-right-kilo-lg">
            <div class="browserframe" data-title="projectname.less">
                <pre class="highlight"><code class="hljs less"><span class="hljs-comment">// projectname.less</span>

<span class="hljs-keyword">@import</span> <span class="hljs-string">'normalize.css'</span>;
<span class="hljs-keyword">@import</span> <span class="hljs-string">'typography.less'</span>;
<span class="hljs-keyword">@import</span> <span class="hljs-string">'page.less'</span>;
<span class="hljs-comment">// и много других компонентов...</span>

<span class="hljs-keyword">@import</span> <span class="hljs-string">'config.less'</span>;
</code></pre>

            </div>
            <figcaption class="space-in-h-mili-md space-in-h-base-lg"><strong>Главный файл.</strong><br> Импортируем компоненты и конфиг. Конфиг — последним.</figcaption>
        </section>
        <section class="col-xs-12 col-md-6 col-lg-shrink col-xl space-minus-right-kilo-lg">
            <div class="browserframe" data-title="page.less">
                <pre class="highlight"><code class="hljs less"><span class="hljs-comment">// page.less v0.3</span>

<span class="hljs-selector-class">.page-settings</span>() {
    <span class="hljs-variable">@padding:</span> <span class="hljs-number">40px</span>;
    <span class="hljs-variable">@txt-color:</span> <span class="hljs-number">#000</span>;
    <span class="hljs-variable">@bg-color:</span> <span class="hljs-number">#fff</span>;
}

<span class="hljs-selector-class">.page</span> {
    <span class="hljs-selector-class">.page-settings</span>();

    <span class="hljs-attribute">padding</span>: <span class="hljs-variable">@padding</span>;
    <span class="hljs-attribute">color</span>: <span class="hljs-variable">@txt-color</span>;
    <span class="hljs-attribute">background-color</span>: <span class="hljs-variable">@bg-color</span>;
}
</code></pre>

            </div>
            <figcaption class="space-in-h-mili-md space-in-h-base-lg"><strong>Компонент.</strong><br> Все переменные локальные и хранятся в миксине.</figcaption>
        </section>
        <section class="col-xs-12 col-md-shrink col-lg-shrink col-xl">
            <div class="browserframe" data-title="config.less">
                <pre class="highlight"><code class="hljs less"><span class="hljs-comment">// config.less</span>

<span class="hljs-variable">@glob-text-color:</span> white;
<span class="hljs-variable">@glob-bg-color:</span> darkblue;

<span class="hljs-comment">// кастомизация компонентов</span>
<span class="hljs-selector-class">.page-settings</span>() {
    <span class="hljs-variable">@txt-color:</span> <span class="hljs-variable">@glob-text-color</span>;
    <span class="hljs-variable">@bg-color:</span> <span class="hljs-variable">@glob-bg-color</span>;
}
</code></pre>

            </div>
            <figcaption class="space-in-h-mili-md space-in-h-base-lg"><strong>Конфиг проекта.</strong><br> Переопределяем параметры компонента с помощью миксина настроек.</figcaption>
        </section>
    </div>
</figure>

<p>Всё самое интересное происходит в конфиге. Мы создали глобальные переменные и использовали их в этом же файле для кастомизации компонента.</p>
<p>Миксин <code>.page-settings()</code> объявлен два раза. Первый раз внутри файла <code>page.less</code> с дефолтными значениями, второй раз в файле <code>config.less</code> с новыми значениями. На этапе компиляции миксины склеиваются, новые переменные переопределяют дефолтные и CSS рендерится с новыми значениями из файла конфигурации.</p>
<aside class="article-grid--aside txt-aside">
    <dl>
        <dt>Правило 3</dt>
        <dd>Глобальные переменные используются только внутри файла настроек.</dd>
    </dl>
</aside>

<p>Обратите внимание, что <code>config.less</code> инклюдится последним в списке. Это нужно, чтобы объявление миксина в конфиге имело больший приоритет, чем исходное объявление в файле самого компонента. Настройки не применятся, если поставить <code>config.less</code> до компонента, потому что на миксины тоже действуют правило «последнее определение — самое сильное».</p>
<p>Таким способом мы прокинули значения глобальных переменных внутрь файла компонента, не меняя исходный код компонента. При этом были соблюдены все три правила:</p>
<ol>
<li>переменные использовались только в своём файле, даже глобальные переменные не вызывались за пределами файла <code>config.less</code>;</li>
<li>переменные компонента остались локальными и не засорили глобальную область видимости;</li>
<li>глобальные переменные не использовались внутри компонента напрямую, но значения глобальных переменных хитрым способом попали внутрь компонента.</li>
</ol>
<h3 id="-">Ограничения</h3>
<p>Нельзя, чтобы имя глобальной переменной совпадало с именем локальной — получим рекурсию и CSS не скомпилируется.
Чтобы не ошибиться, лучше все глобальные переменные записывать с префиксом.</p>
<figure class="space-out-h-kilo-xl">
    <div class="row row-middle-xs">
        <section class="col-xs-12 col-md space-minus-right-mega-md">
            <div class="browserframe" data-title="config.less" style="background-color: #fff4f4;">
                <pre class="highlight"><code class="hljs less"><span class="hljs-comment">// так нельзя</span>

<span class="hljs-variable">@txt-color:</span> white;

<span class="hljs-selector-class">.page-settings</span>() {
    <span class="hljs-comment">// тут рекурсия и ошибка компиляции</span>
    <span class="hljs-variable">@txt-color:</span> <span class="hljs-variable">@txt-color</span>;
}
</code></pre>

            </div>
            <figcaption class="space-in-h-mili-md"><strong>Неправильно.</strong> Рекурсивное определение переменной вызывает ошибку компиляции.</figcaption>
        </section>
        <section class="col-xs-12 col-md-1">
            <p>↓</p>
        </section>
        <section class="col-xs-12 col-md">
            <div class="browserframe" data-title="config.less">
                <pre class="highlight"><code class="hljs less"><span class="hljs-comment">// правильно — с префиксом</span>

<span class="hljs-variable">@glob-txt-color:</span> white;

<span class="hljs-selector-class">.page-settings</span>() {
    <span class="hljs-comment">// всё в порядке</span>
    <span class="hljs-variable">@txt-color:</span> <span class="hljs-variable">@glob-txt-color</span>;
}
</code></pre>

            </div>
            <figcaption class="space-in-h-mili-md"><strong>Правильно.</strong> У глобальных переменных свой префикс <code>glob-</code>, что исключает совпадение имён.</figcaption>
        </section>
    </div>
</figure>

<p><a name="onSass" id="onSass"></a></p>
<h2 id="-sass">Реализация в Sass</h2>
<p>Sass отличается от Less и больше похож на скриптовый язык программирования: нет «ленивых вычислений» и переменная должна быть обязательно объявлена до её использования в коде. Если определить переменную и использовать её в коде, а потом переопределить и использовать ещё раз, то в первый вызов получим исходное значение в CSS, а во второй вызов новое значение. Трюк с миксинами, как в Less, не пройдет. Но есть другие пути решения.</p>
<p>Наборы переменных для настройки компонента удобно хранить в <dfn>map-объектах</dfn>. Это массив из пар «ключ: значение». Метод <dfn>map-get</dfn> извлекает конкретное значение из массива, метод <dfn>map-merge</dfn> объединяет два массива в один, дополняя или переписывая исходный массив.</p>
<aside class="article-grid--aside txt-aside">
 <p>Читайте <a href="http://sass-lang.com/documentation/file.SASS_REFERENCE.html#maps" target="_blank" rel="noopener">про Maps</a> в документации Sass.</p>
</aside>

<p>Простейший компонент без возможности переопределения извне будет выглядеть так:</p>
<figure class="space-auto-h-xs" style="max-width: 50em;">
    <div class="row row-middle-xs">
        <section class="col-xs-12">
            <div class="browserframe" data-title="page.scss">
                <pre class="highlight"><code class="hljs scss"><span class="hljs-comment">// page.scss v0.1</span>

<span class="hljs-variable">$page-settings</span>: (
    padding: <span class="hljs-number">40px</span>,
    bg-color: <span class="hljs-number">#fff</span>,
    text-color: <span class="hljs-number">#000</span>,
);

<span class="hljs-selector-class">.page</span> {
    <span class="hljs-attribute">padding</span>:          map-get(<span class="hljs-variable">$page-settings</span>, padding);
    <span class="hljs-attribute">background-color</span>: map-get(<span class="hljs-variable">$page-settings</span>, bg-color);
    <span class="hljs-attribute">color</span>:            map-get(<span class="hljs-variable">$page-settings</span>, text-color);
}
</code></pre>

            </div>
            <figcaption>Настройки хранятся в <strong>map</strong>-объекте и вызываются в коде с помощью <strong>map-get</strong></figcaption>
        </section>
    </div>
</figure>

<p>Чтобы настраивать компонент из другого файла, нужно предусмотреть возможность смержить внешний конфиг с исходными настройками. Рассмотрим три файла:</p>
<figure class="space-out-h-kilo-xl">
    <div class="row row-bottom-xs row-center-xs">
        <section class="col-xs-12 col-md-6 space-minus-right-kilo-md">
            <div class="browserframe" data-title="projectname.scss">
                <pre class="highlight"><code class="hljs scss"><span class="hljs-comment">// projectname.scss</span>

@<span class="hljs-keyword">import</span>: <span class="hljs-string">'config'</span>;

@<span class="hljs-keyword">import</span>: <span class="hljs-string">'normalize'</span>;
@<span class="hljs-keyword">import</span>: <span class="hljs-string">'typography'</span>;
@<span class="hljs-keyword">import</span>: <span class="hljs-string">'page'</span>;
<span class="hljs-comment">// и много других компонентов...</span>
</code></pre>

            </div>
            <figcaption class="space-in-h-mili-md space-in-h-base-lg"><strong>Главный файл.</strong><br> Сначала импортируем конфиг, потом компоненты.</figcaption>
        </section>
        <section class="col-xs-12 col-md col-lg-6">
            <div class="browserframe" data-title="config.scss">
                <pre class="highlight"><code class="hljs scss"><span class="hljs-comment">// config.scss</span>

<span class="hljs-variable">$glob-text-color</span>: white;
<span class="hljs-variable">$glob-bg-color</span>: darkblue;

<span class="hljs-comment">// кастомизируем</span>
<span class="hljs-variable">$page-settings</span>: (
    bg-color: <span class="hljs-variable">$glob-bg-color</span>,
    text-color: <span class="hljs-variable">$glob-text-color</span>,
);
</code></pre>

            </div>
            <figcaption class="space-in-h-mili-md space-in-h-base-lg"><strong>Настройки.</strong><br> Создаём глобальные переменные и переопределяем параметры компонента.</figcaption>
        </section>
        <section class="col-xs-12 col-md-shrink">
            <div class="browserframe" data-title="page.scss">
                <pre class="highlight"><code class="hljs scss"><span class="hljs-comment">// page.scss v0.2</span>

<span class="hljs-variable">$page-override</span>: ( ); <span class="hljs-comment">// [1]</span>

@<span class="hljs-keyword">if</span> variable-exists(<span class="hljs-keyword">page</span>-settings) {
    <span class="hljs-variable">$page-override</span>: <span class="hljs-variable">$page-settings</span>; <span class="hljs-comment">// [2]</span>
}

<span class="hljs-variable">$page-settings</span>:  map-merge((
    padding: <span class="hljs-number">40px</span>,
    bg-color: <span class="hljs-number">#fff</span>,
    text-color: <span class="hljs-number">#000</span>,
), <span class="hljs-variable">$page-override</span>); <span class="hljs-comment">// [3]</span>

<span class="hljs-selector-class">.page</span> {
    <span class="hljs-attribute">padding</span>:          map-get(<span class="hljs-variable">$page-settings</span>, padding);
    <span class="hljs-attribute">background-color</span>: map-get(<span class="hljs-variable">$page-settings</span>, bg-color);
    <span class="hljs-attribute">color</span>:            map-get(<span class="hljs-variable">$page-settings</span>, text-color);
}
</code></pre>

            </div>
            <figcaption class="space-in-h-mili-md space-in-h-base-lg"><strong>Компонент.</strong><br> Добавили проверку: а не существуют ли уже настройки, чтобы переопределить компонент?</figcaption>
        </section>
    </div>
</figure>

<p><code>[1]</code> — В компоненте мы сначала объявили переменную с пустым массивом  <code>$page-override</code>.</p>
<p><code>[2]</code> — Потом проверили, а не существует ли уже переменная <code>$page-settings</code>. И если она уже была объявлена в конфиге, то присвоили её значение переменной <code>$page-override</code>.</p>
<p><code>[3]</code> — И потом смержили исходный конфиг и <code>$page-override</code> в переменную <code>$page-settings</code>.</p>
<p>Если массив <code>$page-settings</code> был объявлен ранее в глобальном конфиге, то <code>$page-override</code> перепишет настройки при слиянии. Иначе в переменной <code>$page-override</code> будет пустой массив, и в настройках останутся исходные значения.</p>
<aside class="article-grid--aside article-grid--aside-row-2 txt-aside">
    <p>Я не знаю всех тонкостей Sass, может есть способ реализовать эту методику более красивым способом.</p>
</aside>

<p>В результате, мы получаем всё те же преимущества, только в отличие от Less нам приходится переопределять все настройки заранее, перед их использованием в коде.</p>
<p><a name="conclusion" id="conclusion"></a></p>
<h2 id="-">Выводы</h2>
<p>Не важно на чем вы пишете — на Less, Sass, CSS c кастомными свойствами или Javascript — глобальных переменных должно быть как можно меньше.</p>
<p>С CSS препроцессорами используйте три правила, которые помогут избежать хаоса:</p>
<ol>
<li><strong>Переменная используется только в том файле, в котором объявлена.</strong></li>
<li><strong>Все переменные внутри компонента — локальные.</strong></li>
<li><strong>Глобальные переменные используются только внутри файла настроек.</strong></li>
</ol>
<p>Чтобы прокинуть глобальные настройки внутрь компонента, собирайте переменные в миксин (Less) или map-объект (Sass).</p>
<p>Переопределяйте настройки в правильном месте: в Less — после инклюда, в Sass — перед инклюдом.</p>
<figure class="article-grid--fullscreen">
    <img src="/2017/local_variables/local_variables_less@1x.png" width="1440" height="720"
        srcset="/2017/local_variables/local_variables_less@05x.png 0.5x,
        /2017/local_variables/local_variables_less@1x.png 1x,
        /2017/local_variables/local_variables_less@2x.png 2x"
        alt="Правила управления переменными в препроцессорах и методика переопределения настроек в одной картинке">
    <figcaption>
        <p>Правила управления переменными в препроцессорах и методика переопределения настроек</p>
    </figcaption>
</figure>


<p><a name="examples" id="examples"></a></p>
<h2 id="-">Реальные примеры</h2>
<p>Я сформулировал эту методику в декабре 2015 года для Less и с тех пор применяю её на рабочих и личных проектах.</p>
<p>За полтора года появилось несколько публичных npm-пакетов. Посмотрите исходный код для лучшего понимания, как работает эта методика в реальных ситуациях.</p>
<p><a href="https://github.com/paulradzkov/bettertext.css/blob/master/bettertext.less">bettertext.css</a> — типографика для сайтов. Настраивается при помощи 11 переменных, остальные 40 вычисляются по формулам. Вычисления идут отдельными миксином, чтобы была возможность переопределять формулы. У компонента нет ни одного класса, все стили применяются к тегам. Чтобы создать локальную область видимости, я поместил все селекторы по тегам в переменную — в Less это называется «detached ruleset».</p>
<aside class="article-grid--aside txt-aside space-auto-top-xl space-in-bottom-nano-xl">
    <p>Читайте про <a href="http://lesscss.org/features/#detached-rulesets-feature" target='_blank'>detached ruleset</a> в документации Less.</p>
</aside>

<p><a href="https://github.com/paulradzkov/links.less/blob/master/links.less">links.less</a> — стили для ссылок с фокусом, анимацией и бледным подчеркиванием. У компонента кроме миксина с настройками есть дополнительные глобальные миксины для раскрашивания ссылок внутри ваших собственных селекторов.</p>
<p><a href="https://github.com/paulradzkov/flxgrid.css/blob/master/flxgrid.less">flxgrid.css</a> — генератор HTML-сеток на флексах. Настраивается при помощи 5 переменных, генерирует классы для адаптивной сетки с любыми брейкпоинтами и любым количеством колонок. В компоненте вычисления и служебные миксины спрятаны внутрь локальной области видимости. Глобально виден только миксин с настройками.</p>
<p><a href="https://github.com/paulradzkov/space.less/blob/master/space.less">space.less</a> — инструмент для управления отступами в вёрстке. Создан, чтобы работать в паре с сеткой flxgrid.css. Адаптивность у них настраивается одинаково, но space.less использует собственный миксин настройки и собственные локальные переменные — в коде space.less никак не связан с flxgrid.css.</p>
<p><a name="bonus" id="bonus"></a></p>
<h2 id="-">«Бонус-трек»</h2>
<p>Если бы мне сейчас понадобилось использовать на новом проекте Bootstrap 3.x.x — тот, который на Less, — я бы все импортируемые модули Бутстрапа завернул в переменную (в «detached ruleset»), а все настройки из файла <code>variables.less</code> в миксин <code>bootsrtap-settings</code>. Глобальные переменные Бутстрапа перестали бы быть глобальными и их невозможно было бы использовать внутри собственного кода. Настройки Бутстрапа я бы кастомизировал по мере необходимости, вызывая миксин <code>bootsrtap-settings</code> в конфиге проекта, так же как в примерах выше. Тогда при обновлениях Бутстрапа пришлось бы поправить только миксин с кастомизированными настройкам.</p>
]]>
				</content:encoded>
				<pubDate>Tue, 04 Jul 2017 00:00:00 GMT</pubDate>
				<guid>http://paulradzkov.com/2017/local_variables/</guid>
				<comments>http://paulradzkov.com/2017/local_variables/#comments</comments>
			</item>
		
			<item>
				<title>Как верстальщику получить код ревью</title>
				<link>http://paulradzkov.com/2016/code_review/</link>
				<description></description>
				<content:encoded>
					<![CDATA[<p><strong>По мотивам вопроса на тостере «<a href="https://toster.ru/q/289819">Где найти того, кто оценит твой код?</a>»</strong></p>
<p>Упростите жизнь ревьюверам. Постарайтесь, чтобы оценка кода занимала у них как можно меньше времени, а отправлять комментарии и исправления было легко. Чем меньше усилий потребуется со стороны ревьювера, тем выше шанс получить код ревью.</p>
<!-- cut -->
<h2 id="-">Код — на Гитхабе</h2>
<p>Отправлять почтой zip-архив и просить посмотреть — неудобно для ревьювера. Некоторые откажутся сразу. Кто-то согласится, но не сделает. У оставшихся возникнет проблема, в каком виде отправить вам комментарии и замечания назад.</p>
<p>Для маленьких и простых вещей делайте демку на <a href="http://codepen.io">http://codepen.io</a> и похожих  сервисах. Открыть ссылку, посмотреть код и результат, форкнуть, исправить или оставить пару комментариев там не займет много времени. И даже не придется открывать текстовый редактор или IDE.</p>
<p>Сайты, одностраничники, свёрстанные макеты заливайте на <a href="https://pages.github.com/">GitHub Pages</a>. Для этого вам придется разобраться с git, но git вам точно понадобится. Код на GitHub удобно просматривать и оставлять комментарии к конкретным строкам, ссылаться на другие файлы и строки внутри них. Ревьювер может исправить ваш код, отправить исправления через pull request и прокомментировать, почему он так сделал. А вы увидите на одном экране старую версию кода, исправленную и комментарии к исправлениям.</p>
<p>К тому же, не покупая домен и хостинг, вы соберете себе портфолио на GitHub.</p>
<h2 id="-">Только готовые работы</h2>
<p>Выставляйте на ревью готовые работы: когда вы сами уже исправили всё, что заметили, и улучшили всё, что могли. Иначе ревьювер найдёт несколько самых очевидных косяков и перестанет искать дальше. Решит, что «для начала достаточно», или выдаст резюме, что «тут совсем всё плохо» и «надо полностью переверстать». Вы потратите время другого человека и не получите пользы.</p>
<p>Если вас интересует мнение по поводу части какой-либо незаконченной работы, просите посмотреть конкретный файл с указанием номеров строк. А лучше сделайте изолированный пример на codepen.io, чтобы «сырой» код не отвлекал ревьювера. Чем меньше кода покажешь ревьюверу, тем внимательнее он его посмотрит.</p>
<h2 id="-">На ревью — по одному</h2>
<p>Если у вас готово несколько работ, то на ревью их выставляйте по одной. Не просите посмотреть всё сразу. Вероятно, вы совершаете систематические ошибки, которые присутствуют во всех работах. Когда вам указали на ошибки в первой работе, исправляйте эти ошибки в остальных и только потом показывайте следующую работу ревьюверам. Так вы научитесь большему, написав меньше кода <del>и задолбав меньше ревьюверов</del>.</p>
<p>А ещё уговорить кого-то посмотреть маленький кусочек кода проще, чем просить оценить сразу все ваши проекты.</p>
<h2 id="-">Сопроводительная информация</h2>
<p>Ревьювер захочет узнать, как выглядит исходник дизайна, который вы сверстали, какие требования к вёрстке поставлены в техническом задании, поддержка браузеров и размеров экранов. Но ревьювер не захочет качать 100Мб исходников и рыться в длинном документе в поисках технических требований.</p>
<p>Кратко опишите требования, что и зачем вы делали, оставьте ссылку на скриншот дизайна.</p>
<h2 id="-">Задавайте конкретные вопросы</h2>
<p>Помогите ревьюверу помочь вам. Укажите, в каких местах у вас возникли проблемы. Спрашивайте, если сомневаетесь в своих решениях. Отвечать на конкретные вопросы проще, чем на общие типа «всё ли в порядке с моей вёрсткой». Поверните обсуждение в нужное вам русло.</p>
<h2 id="-">Запаситесь скриншотами</h2>
<p>Ревьювер посмотрит вёрстку в своём любимом браузере и вряд ли посмотрит в другом. Если у вас проблемы в каком-либо конкретном браузере, прикрепите скриншот проблемы или <a href="http://paulradzkov.com/2014/capture_screen_to_gif/">сделайте гифку</a>. Лучше один раз увидеть, чем пять раз перечитать описание.</p>
<h2 id="-">Где искать ревьюверов</h2>
<p>Когда вам будет что показать, отправляйте ссылки на код знакомым и незнакомым профессионалам, оставляйте сообщения в профильных сообществах и на форумах. Например, на <a href="http://htmlforum.ru/">http://htmlforum.ru</a> или <a href="https://toster.ru">https://toster.ru</a>.</p>
<h2 id="-">Итоги</h2>
<p>Следование этим рекомендациям избавит ревьювера от лишней работы, упростит и ускорит процесс оценки кода. А вы получите конструктивные советы и замечания.</p>
<p>Покажите человеку, что вы цените его время, и тогда он захочет помочь вам.</p>
]]>
				</content:encoded>
				<pubDate>Sat, 13 Feb 2016 00:00:00 GMT</pubDate>
				<guid>http://paulradzkov.com/2016/code_review/</guid>
				<comments>http://paulradzkov.com/2016/code_review/#comments</comments>
			</item>
		
			<item>
				<title>Веб-лицензии для платных шрифтов могут стоить вам дорого</title>
				<link>http://paulradzkov.com/2014/web-fonts_license/</link>
				<description></description>
				<content:encoded>
					<![CDATA[<p>Использовать платные шрифты в вебе бывает неоправдано дорого. Веб-лицензия, в отличие от настольной лицензии, подразумевает не покупку файлов шрифта, а аренду @font-face версии этого шрифта, причем стоимость аренды зависит от посещаемости вашего сайта. Самая главная опасность платных шрифтов в том, что это не разовые, а <em>постоянные</em> затраты.</p>
<!-- cut -->
<h2 id="-">Отличия в лицензиях</h2>
<p><strong>Настольная лицензия</strong> (desktop license):
Вы один раз покупаете ttf-файлы шрифта, устанавливаете их себе на компьютер и можете неограниченно использовать в графических редакторах или на печати.</p>
<p>Если вы сконвертируете купленный шрифт для использования в вебе, то это будет нарушением настольной лицензии, т.к. файлы шрифта не остаются <em>только</em> на вашем компьютере, а загружаются на компьютер посетителя вашего сайта. Поэтому популярные конвертеры, типа fontsquirrel, блокируют преобразование платных шрифтов.</p>
<p><strong>Веб-лицензия</strong> (webfont license):
Вы не покупаете шрифт, вы берете его в аренду. При аренде вам дают ссылку на подключение шрифта к вашей странице (как в Google Fonts) и вы оплачиваете количество обращений по этой ссылке. Существует несколько моделей оплаты:</p>
<ul>
<li><p>Можно оплатить заранее определённое количество просмотров (pageviews) без ограничений по времени. При такой оплате нужно приобретать каждое начертание шрифта отдельно: например, Normal, Italic, Bold, Bold Italic. Каждая загрузка страницы будет крутить счётчик числа обращений к шрифту. Когда количество оплаченных просмотров будет заканчиваться, вам придет сообщение с просьбой докупить ещё. Если вы не продлили аренду, то шрифт перестанет загружаться — позаботьтесь об адекватной замене системным шрифтом! Но можно настроить автопродление подписки, деньги будут списываться автоматически а посетители вашего сайта всегда будут видеть правильные шрифты.</p>
<p>Для сайта с небольшой посещаемостью такой способ подписки вполне приемлем, предоплаченного количества посещений хватит надолго. Но если у вас нагруженный ресурс, то деньги будут улетать с большой скоростью.</p>
</li>
<li><p>Можно оплатить ежемесячную подписку на шрифт. Стоимость подписки будет зависеть от максимального количества просмотров вашего сайта в месяц. Например, вы берёте подписку на план c ограничением, например, в 1&thinsp;500&thinsp;000 просмотров в месяц. Если в какой-то месяц количество посещений вашего сайта превысит ограничение, вам будет предложено перейти на более дорогой тарифный план. Для особо нагруженных сайтов существуют планы подписок с возможностью размещения файлов шрифта на своих серверах.</p>
</li>
<li><p>Некоторые сервисы предлагают ежемесячные подписки с неограниченным количеством шрифтов и их начертаний для сайта, но с единственным ограничением на количество просмотров в месяц.</p>
</li>
</ul>
<p>Стоит отметить, что если платный шрифт у вас не используется на странице, но объявлен в css, то каждая загрузка такой страницы будет крутить счетчик показов шрифта.</p>
<h2 id="-">Цены</h2>
<p>Предположим нам нужно купить Helvetica Neue в четырех начертаниях: Normal, Italic, Bold, Bold Italic для сайта с 1,5 млн. просмотров в месяц.</p>
<p>Для сравнения настольной и веб-лицензии: на cайте издательства <a href="http://www.linotype.com/1266/NeueHelvetica-family.html">Linotype</a> по настольной лицензии этот набор обойдется в 116€. Веб-шрифт на 1 500 000 просмотров у Линотайпа обойдется в 309€. В год уже получается 3708€. Это 5133$ в год — невероятно много.</p>
<p>На <a href="http://www.myfonts.com/fonts/linotype/neue-helvetica/buy.html">MyFonts.com</a> уже дешевле — 279$ за 1 500 000, что есть 3348$ в год.</p>
<p>В случае ежемесячной оплаты с ограничением по максимальному количеству <a href="http://www.fonts.com/web-fonts/plans-and-pricing">Fonts.com</a> просит 78€ (100$) в месяц за 2,5 млн. просмотров.
Уже лучше: мы не ограничены количеством начертаний, у нас есть запас на рост посещаемости и всё это стоит 1200$ в год.</p>
<p>Самым выгодным вариантом является <a href="https://typekit.com/plans/business">Adobe Typekit</a> c его предложением 40$ в месяц за 2 млн. просмотров. Это 480$ в год. Цена уже более менее адекватная, но на неё всё равно согласится не каждый, учитывая, что можно найти <a href="/2014/free_substitution_for_helvetica_neue/">бесплатный аналог</a> и избежать этих затрат.</p>
<p>Как видим, цены на одно и то же могут отличаться в 10 раз.</p>
<div class="fotorama">
    <img src="/2014/web-fonts_license/linotype-helvetica-desktop.png" alt="Настольная лицензия на сайте Linotype стоит 116€">
    <img src="/2014/web-fonts_license/linotype-helvetica-web.png" alt="Веб-шрифт на Linotype стоит 309€ за 1,5 млн. просмотров">
    <img src="/2014/web-fonts_license/myfonts-helvetica-1500000.png" alt="Цены на Helvetica на MyFonts.com">
    <img src="/2014/web-fonts_license/font-com-pricing.png" alt="Тарифные планы на Fonts.com">
    <img src="/2014/web-fonts_license/typekit-annual-pricing.png" alt="У Adobe Typekit можно взять недорогой план для сайтов с малым посещением">
    <img src="/2014/web-fonts_license/typekit-business-pricing.png" alt="Самым выгодным вариантом является Adobe Typekit c его предложением 40$ в месяц за 2 млн. просмотров">
</div>

<h2 id="-">Выводы</h2>
<p>Стоимость использования платных шрифтов на нагруженных проектах за несколько лет (а то и месяцев) может превысить стоимость создания дизайна самого сайта.</p>
<p>Так как выбор шрифтов — ответственность дизайнеров, им следует знать, что:</p>
<ul>
<li><p>Использование бесплатных шрифтов упрощает жизнь верстальщикам и владельцам сайта.</p>
</li>
<li><p>Настольной лицензии недостаточно. Если вы передаёте заказчику шрифты, купленные по настольной лицензии, то это только для того, чтобы заказчик смог пользоваться вашими исходниками. Заказчик не имеет права конвертировать их в веб-шрифты.</p>
</li>
<li><p>Если дизайнер хочет использовать платный шрифт, ему следует поинтересоваться у заказчика о посещаемости сайта и предупредить о вероятных затратах на использование платных шрифтов, чтобы потом не было сюрпризов.</p>
</li>
<li><p>Веб-версии шрифтов дешевле арендовать у крупных шрифтовых порталов, чем напрямую у издательств.</p>
</li>
</ul>
]]>
				</content:encoded>
				<pubDate>Fri, 02 May 2014 00:00:00 GMT</pubDate>
				<guid>http://paulradzkov.com/2014/web-fonts_license/</guid>
				<comments>http://paulradzkov.com/2014/web-fonts_license/#comments</comments>
			</item>
		
			<item>
				<title>Бесплатная замена платному Helvetica Neue</title>
				<link>http://paulradzkov.com/2014/free_substitution_for_helvetica_neue/</link>
				<description></description>
				<content:encoded>
					<![CDATA[<p>Подбирал бесплатную замену платному Helvetica Neue. До финала дошли:</p>
<ul>
<li><a href="http://www.fontsquirrel.com/fonts/TeX-Gyre-Heros">TeX Gyre Heros</a></li>
<li><a href="http://www.fontsquirrel.com/fonts/Arimo">Arimo</a></li>
<li><a href="http://www.fontsquirrel.com/fonts/Liberation-Sans">Liberation Sans</a></li>
<li><a href="https://www.google.com/fonts/specimen/Lato">Lato</a></li>
<li><a href="https://www.google.com/fonts/specimen/Roboto">Roboto</a></li>
</ul>
<p>Победителем вышел <strong>TeX Gyre Heros</strong>, т.к. он очень похож на Helvetica Neue, поддерживает кириллицу и дополнительно у него есть 4 condenced начертания.</p>
<!-- cut -->
<figure>
    <a href="/demo/free_substitutes_for_helvetica_neue/">
    <img src="/2014/free_substitution_for_helvetica_neue/helvetica-neue-vs-tex-gyre-heros.png" alt="TeX Gyre Heros — бесплатная альтернатива Helvetica Neue">
    </a>
    <figcaption>Слева Helvetica Neue, справа TeX Gyre Heros</figcaption>
</figure>

<p style="text-align: center;"><a href="/demo/free_substitutes_for_helvetica_neue/" class="link-to-demo">Сравнение шрифтов</a></p>

<p>Если всё же нужно купить Helvetica Neue для веба, обратите внимание на <a href="https://typekit.com/plans">Adobe Typekit</a>. У них дешевле.</p>
]]>
				</content:encoded>
				<pubDate>Thu, 01 May 2014 00:00:00 GMT</pubDate>
				<guid>http://paulradzkov.com/2014/free_substitution_for_helvetica_neue/</guid>
				<comments>http://paulradzkov.com/2014/free_substitution_for_helvetica_neue/#comments</comments>
			</item>
		
			<item>
				<title>Деплой Docpad-сайта на GitHub Pages</title>
				<link>http://paulradzkov.com/2014/deploy_docpad_site_to_github_pages/</link>
				<description></description>
				<content:encoded>
					<![CDATA[<p>При деплое <a href="http://docpad.org/">Docpad</a>-сайта на <a href="https://pages.github.com/">GitHub Pages</a> столкнулся с некоторыми проблемами.</p>
<ol>
<li>Проблема с абсолютными путями: докпад по-умолчанию использует пути к ресурсам от корня домена, а на GH Pages url проекта будет выглядеть так <code>http://username.github.io/repository/</code>. Т.е. сайт находится в папке, а не в корне, и все пути к ресурсам недействительны. Конечно, можно купить собственное доменное имя, но это не мой случай. Нужно, чтобы на локалхосте url оставались абсолютными, а при деплое заменялись с учетом папки, в которую сайт деплоится.</li>
<li><a href="https://github.com/docpad/docpad-plugin-ghpages">Плагин для деплоя</a> не заработал сразу и без настроек, как обещает разработчик.</li>
<li><strong>Добавлено 6 мая 2018</strong>: деплой из командной строки сломался после включения двухфакторной аутентификации на Гитхабе.</li>
</ol>
<p>Так как у меня не всё прошло гладко и очевидно, решил написать эту инструкцию.</p>
<!-- cut -->
<h2 id="-">Проблема с абсолютными путями</h2>
<p>Сначала разберёмся с абсолютными путями в докпаде.</p>
<p>Установим плагин <a href="https://github.com/Hypercubed/docpad-plugin-geturl/">Get Url Plugin for DocPad</a>.</p>
<p>Если ещё не создана, сделаем в конфиге докпада переменную <code>@site.url</code>:</p>
<pre class="highlight"><code class="hljs coffeescript">    templateData:
        site:
            <span class="hljs-comment"># The production url of our website. Used in sitemap and rss feed</span>
            url: <span class="hljs-string">"http://paulradzkov.github.io/docpad-simpleblog"</span>
</code></pre>
<p>И добавим отдельную конфигурацию для «development» окружения:</p>
<pre class="highlight"><code class="hljs coffeescript">    <span class="hljs-comment"># =================================</span>
    <span class="hljs-comment"># Environments</span>

    environments:
        development:
            templateData:
                site:
                    url: <span class="hljs-string">'http://localhost:9778'</span>
</code></pre>
<p>Эта переменная — <code>@site.url</code> — будет подставляться префиксом ко всем путям и ссылкам в зависимости от того, работаем мы на локалхосте или выкатываем сайт на хостинг.</p>
<p>Теперь нужно добавить хелпер «<code>@getUrl()</code>» ко всем «<code>href</code>» и «<code>src</code>» в шаблоне, в документах — везде, где встречаются абсолютные пути.</p>
<p>Например, было:</p>
<pre class="highlight"><code class="hljs xml"><span class="hljs-comment">&lt;!-- DocPad Styles + Our Own --&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">%-</span> @<span class="hljs-attr">getBlock</span>("<span class="hljs-attr">styles</span>")<span class="hljs-attr">.add</span>(@<span class="hljs-attr">site.styles</span>)<span class="hljs-attr">.toHTML</span>() %&gt;</span>

<span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"/vendor/modernizr.js"</span>&gt;</span><span class="undefined"></span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
</code></pre>
<p>Стало:</p>
<pre class="highlight"><code class="hljs xml"><span class="hljs-comment">&lt;!-- DocPad Styles + Our Own --&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">%-</span> @<span class="hljs-attr">getBlock</span>("<span class="hljs-attr">styles</span>")<span class="hljs-attr">.add</span>(@<span class="hljs-attr">getUrl</span>(@<span class="hljs-attr">site.styles</span>))<span class="hljs-attr">.toHTML</span>() %&gt;</span>

<span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"&lt;%= @getUrl('/vendor/modernizr.js') %&gt;"</span>&gt;</span><span class="undefined"></span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
</code></pre>
<p>Было:</p>
<pre class="highlight"><code class="hljs xml"><span class="hljs-tag">&lt;<span class="hljs-name">ul</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"nav-list"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"/"</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">span</span>&gt;</span>Blog<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"/docs"</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">span</span>&gt;</span>Documentation<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"https://github.com/paulradzkov/docpad-simpleblog/issues"</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">span</span>&gt;</span>Issues<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"https://github.com/paulradzkov/docpad-simpleblog"</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">span</span>&gt;</span>Source Code<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">ul</span>&gt;</span>
</code></pre>
<p>Стало:</p>
<pre class="highlight"><code class="hljs xml"><span class="hljs-tag">&lt;<span class="hljs-name">ul</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"nav-list"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"&lt;%= @getUrl('/') %&gt;"</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">span</span>&gt;</span>Blog<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"&lt;%= @getUrl('/docs') %&gt;"</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">span</span>&gt;</span>Documentation<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"https://github.com/paulradzkov/docpad-simpleblog/issues"</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">span</span>&gt;</span>Issues<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"https://github.com/paulradzkov/docpad-simpleblog"</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">span</span>&gt;</span>Source Code<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">ul</span>&gt;</span>
</code></pre>
<p>Было:</p>
<pre class="highlight"><code class="hljs xml"><span class="hljs-tag">&lt;<span class="hljs-name">ul</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"meta-data"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">li</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"comments"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"&lt;%= @document.path %&gt;#disqus_thread"</span> <span class="hljs-attr">data-disqus-identifier</span>=<span class="hljs-string">"&lt;%= @document.disqusid %&gt;"</span> &gt;</span>Комментарии<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">li</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"tags-list"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">%</span> <span class="hljs-attr">for</span> <span class="hljs-attr">tag</span> <span class="hljs-attr">in</span> @<span class="hljs-attr">document.tags</span> <span class="hljs-attr">:</span> %&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"label-tag"</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"&lt;%= @getTagUrl(tag) %&gt;"</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">%=</span> <span class="hljs-attr">tag</span> %&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">%</span> <span class="hljs-attr">end</span> %&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">ul</span>&gt;</span>
</code></pre>
<p>Стало:</p>
<pre class="highlight"><code class="hljs xml"><span class="hljs-tag">&lt;<span class="hljs-name">ul</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"meta-data"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">li</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"comments"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"&lt;%= @getUrl(@document.path) %&gt;#disqus_thread"</span> <span class="hljs-attr">data-disqus-identifier</span>=<span class="hljs-string">"&lt;%= @document.disqusid %&gt;"</span> &gt;</span>Комментарии<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">li</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"tags-list"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">%</span> <span class="hljs-attr">for</span> <span class="hljs-attr">tag</span> <span class="hljs-attr">in</span> @<span class="hljs-attr">document.tags</span> <span class="hljs-attr">:</span> %&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"label-tag"</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"&lt;%= @getUrl(@getTagUrl(tag)) %&gt;"</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">%=</span> <span class="hljs-attr">tag</span> %&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">%</span> <span class="hljs-attr">end</span> %&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">ul</span>&gt;</span>
</code></pre>
<p>И так далее.</p>
<p>Теперь, когда мы запускаем <kbd class="cli" contenteditable="true" >&zwj;<span contenteditable="false">docpad run</span>&zwj;</kbd>, ко всем путям подставляется <code>@site.url</code> из девелоперского окружения — <code>http://localhost:9778</code>. А когда <kbd class="cli" contenteditable="true" >&zwj;<span contenteditable="false">docpad run --env static</span>&zwj;</kbd>, переменная <code>@site.url</code> равна нашему продакшен пути.</p>
<h2 id="-github-pages">Деплой на GitHub Pages</h2>
<p>В репозитории создадим ветку «<code>gh-pages</code>». По инструкции это должна быть пустая ветка без истории, но об этом в дальнейшем позаботится плагин для деплоя.</p>
<figure>
    <img src="/2014/deploy_docpad_site_to_github_pages/new_branch_gh-pages.png" alt="В репозитории проекта создадим ветку с именем «gh-pages»">
    <figcaption>В репозитории проекта создадим ветку с именем «<code>gh-pages</code>»</figcaption>
</figure>

<p>Установим <a href="https://github.com/docpad/docpad-plugin-ghpages">GitHub Pages Deployer Plugin for DocPad</a>.</p>
<p>При попытке выполнить <kbd class="cli" contenteditable="true">&zwj;<span contenteditable="false">docpad deploy-ghpages --env static</span>&zwj;</kbd> у меня появляется ошибка:</p>
<figure>
    <img src="/2014/deploy_docpad_site_to_github_pages/gh-pages_deploy_error.png" alt="could not read Username for ’http://github.com’: No such file or directory">
    <figcaption><code>could not read Username for ’http://github.com’: No such file or directory</code></figcaption>
</figure>

<p>Плагин не смог соединиться с моим аккаунтом на гитхабе. Чтобы показать плагину правильный путь с логином и паролем, добавим новый «remote» для репозитория. Для этого в консоли git выполним:</p>
<p><kbd class="cli" contenteditable="true" >&zwj;<span contenteditable="false">git remote add deploy <span>https://</span>login:password@github.com/repo_owner/repo_name.git</span>&zwj;</kbd></p>

<p>Где «<code>deploy</code>» — это название удаленного репозитория. Можно выбрать любое, но переопределять «origin» я бы не советовал: у меня от этого локальная копия репозитория потеряла связь с Гитхабом.</p>
<p>«<code>login</code>» и «<code>password</code>» — данные вашего аккаунта на Гитхабе.</p>
<p>«<code>github.com/repo_owner/repo_name.git</code>» — путь к репозиторию проекта, в котором у вас есть права на запись. Это не обязательно должен быть ваш репозиторий, если вы коллаборатор, и у вас есть доступ на запись — вы можете деплоить туда проект.</p>
<figure>
    <img src="/2014/deploy_docpad_site_to_github_pages/adding_another_remote.png" alt="Добавление нового «remote» c логином и паролем">
    <figcaption>Добавление нового «remote» c логином и паролем. Эту процедуру нужно выполнить один раз для каждого локального репозитория</figcaption>
</figure>

<p>А в конфиге докпада пропишем настройки для плагина:</p>
<pre class="highlight"><code class="hljs coffeescript">    <span class="hljs-comment"># Plugins configurations</span>
    plugins:
        ghpages:
            deployRemote: <span class="hljs-string">'deploy'</span>
            deployBranch: <span class="hljs-string">'gh-pages'</span>
</code></pre>
<p>Теперь можно выкатывать сайт:</p>
<p><kbd class="cli" contenteditable="true" >&zwj;<span contenteditable="false">docpad deploy-ghpages --env static</span>&zwj;</kbd></p>
<h2 id="-">Двухфакторная аутентификация</h2>
<p><strong>Добавлено 6 мая 2018</strong></p>
<p>Когда я включил двухфакторную аутентификацию на Гитхабе, деплой из командной строки перестал работать. Чтобы починить, вместо вашего пароля в настройках remote нужно подставить сгенерированный токен. Сгенерируйте его по этой <a href="https://help.github.com/articles/creating-a-personal-access-token-for-the-command-line/">инструкции</a>. Если кратко:</p>
<ol>
<li>На Гитхабе кликните по вашему аватару, потом <strong>Settings</strong> → <strong>Developer settings</strong> → <strong>Personal access tokens</strong> → <strong>Generate new token</strong>.</li>
<li>Дайте токену любое имя, например, «Mac terminal» или «Windows cmd».</li>
<li>Поставьте уровень доступа <strong>repo</strong>.</li>
<li>Нажмите <strong>Generate token</strong>.</li>
<li>Скопируйте полученный токен. Когда вы уйдете с этой страницы, токен уже нельзя будет посмотреть.</li>
</ol>
<p>Вам нужно добавить новый «remote» (или заменить существующий) с токеном вместо пароля:</p>
<p><kbd class="cli" contenteditable="true" >&zwj;<span contenteditable="false">git remote add deploy <span>https://</span>login:<mark>token</mark>@github.com/repo_owner/repo_name.git</span>&zwj;</kbd></p>

<p>И всё снова заработает.</p>
]]>
				</content:encoded>
				<pubDate>Fri, 25 Apr 2014 00:00:00 GMT</pubDate>
				<guid>http://paulradzkov.com/2014/deploy_docpad_site_to_github_pages/</guid>
				<comments>http://paulradzkov.com/2014/deploy_docpad_site_to_github_pages/#comments</comments>
			</item>
		
			<item>
				<title>Краткое руководство по Маркдауну</title>
				<link>http://paulradzkov.com/2014/markdown_cheatsheet/</link>
				<description></description>
				<content:encoded>
					<![CDATA[<p><strong>12 июля 2015: Обновил руководство до Github Flavoured Markdown. Предыдущее <a href="http://codepen.io/paulradzkov/pen/ZGoLgr" target="_blank" rel="noopener">руководство с традиционным Маркдауном</a>.</strong>
</p>

<p><a href="http://daringfireball.net/projects/markdown/syntax" target="_blank" rel="noopener">Официальное руководство</a> по синтаксису Markdown мне кажется слишком длинным и не слишком наглядным, поэтому я составил краткое руководство, которое поможет выучить или повторить синтаксис Маркдауна за час.</p>

<!-- cut -->

<p>Кроме традиционного Маркдауна у разработчиков получил распространение дополненный и улучшеный вариант языка — Github Flavoured Markdown, сокращенно GFM.</p>

<p>Основные отличия GFM и чистого Маркдауна:</p>
<ul>
    <li>добавили таблицы, которых не было в оригинальном Маркдауне;</li>
    <li>добавили альтернативный синтаксис для вставки блоков кода: теперь можно не ставить 4 пробела перед каждой строкой кода, также можно явно указать язык кода;</li>
    <li>добавили зачеркнутый текст.</li>
</ul>

<p><a href="https://help.github.com/articles/github-flavored-markdown/" target="_blank" rel="noopener">Полный список отличий</a> на Гитхабе.</p>

<div class="raw-output">
<pre class="highlight"><code class="hljs markdown">
<span class="hljs-section"># GitHub-Flavored Markdown</span>

<span class="hljs-section">## Краткое руководство</span>

Абзацы создаются при помощи пустой строки. Если вокруг текста сверху и снизу есть пустые строки, то текст превращается в абзац.

Чтобы сделать перенос строки вместо абзаца,  
нужно поставить два пробела в конце предыдущей строки.

Заголовки отмечаются диезом <span class="hljs-code">`#`</span> в начале строки, от одного до шести. Например:

<span class="hljs-section"># Заголовок первого уровня #</span>
<span class="hljs-section">## Заголовок h2</span>
<span class="hljs-section">### Заголовок h3</span>
<span class="hljs-section">#### Заголовок h4</span>
<span class="hljs-section">##### Заголовок h5</span>
<span class="hljs-section">###### Заголовок h6</span>

В декоративных целях заголовки можно «закрывать» с обратной стороны.

<span class="hljs-section">### Списки</span>

Для разметки неупорядоченных списков можно использовать или <span class="hljs-code">`*`</span>, или <span class="hljs-code">`-`</span>, или <span class="hljs-code">`+`</span>:

<span class="hljs-bullet">- </span>элемент 1
<span class="hljs-bullet">- </span>элемент 2
<span class="hljs-bullet">- </span>элемент ...

Вложенные пункты создаются четырьмя пробелами перед маркером пункта:

<span class="hljs-bullet">* </span>элемент 1
<span class="hljs-bullet">* </span>элемент 2
<span class="hljs-code">    * вложенный элемент 2.1</span>
<span class="hljs-code">    * вложенный элемент 2.2</span>
<span class="hljs-bullet">* </span>элемент ...

Упорядоченный список:

<span class="hljs-bullet">1. </span>элемент 1
<span class="hljs-bullet">2. </span>элемент 2
<span class="hljs-code">    1. вложенный</span>
<span class="hljs-code">    2. вложенный</span>
<span class="hljs-bullet">3. </span>элемент 3
<span class="hljs-bullet">4. </span>Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse id sem consectetuer libero luctus adipiscing.

На самом деле не важно как в коде пронумерованы пункты, главное, чтобы перед элементом списка стояла цифра (любая) с точкой. Можно сделать и так:

<span class="hljs-bullet">0. </span>элемент 1
<span class="hljs-bullet">0. </span>элемент 2
<span class="hljs-bullet">0. </span>элемент 3
<span class="hljs-bullet">0. </span>элемент 4

Список с абзацами:

<span class="hljs-bullet">* </span>Раз абзац. Lorem ipsum dolor sit amet, consectetur adipisicing elit.

<span class="hljs-bullet">* </span>Два абзац. Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse id sem consectetuer libero luctus adipiscing.

<span class="hljs-bullet">* </span>Три абзац. Ea, quis, alias nobis porro quos laborum minus sed fuga odio dolore natus quas cum enim necessitatibus magni provident non saepe sequi?

<span class="hljs-code">    Четыре абзац (Четыре пробела в начале или один tab).</span>

<span class="hljs-section">### Цитаты</span>

Цитаты оформляются как в емейлах, с помощью символа <span class="hljs-code">`&gt;`</span>.

<span class="hljs-quote">&gt; This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet,</span>
<span class="hljs-quote">&gt; consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus.</span>
<span class="hljs-quote">&gt; Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus.</span>
<span class="hljs-quote">&gt;
&gt; Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse</span>
<span class="hljs-quote">&gt; id sem consectetuer libero luctus adipiscing.</span>

Или более ленивым способом, когда знак <span class="hljs-code">`&gt;`</span> ставится перед каждым элементом цитаты, будь то абзац, заголовок или пустая строка:

<span class="hljs-quote">&gt; This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet,</span>
consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus.
Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus.
<span class="hljs-quote">&gt;
&gt; Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse</span>
id sem consectetuer libero luctus adipiscing.

В цитаты можно помещать всё что угодно, в том числе вложенные цитаты:

<span class="hljs-quote">&gt; ## This is a header.</span>
<span class="hljs-quote">&gt;
&gt; 1.   This is the first list item.</span>
<span class="hljs-quote">&gt; 2.   This is the second list item.</span>
<span class="hljs-quote">&gt;
&gt; &gt; Вложенная цитата.</span>
<span class="hljs-quote">&gt;
&gt; Here's some example code:</span>
<span class="hljs-quote">&gt;
&gt;     return shell_exec("echo $input | $markdown_script");</span>

<span class="hljs-section">### Исходный код</span>

В чистом Маркдауне блоки кода отбиваются 4 пробелами в начале каждой строки.

Но в GitHub-Flavored Markdown (сокращенно GFM) есть более удобный способ: ставим по три апострофа (на букве Ё) до и после кода. Также можно указать язык исходного кода.

<span class="hljs-code">` `</span> `html
<span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">nav</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"nav nav-primary"</span>&gt;</span></span>
  <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">ul</span>&gt;</span></span>
<span class="hljs-code">    &lt;li class="tab-conversation active"&gt;</span>
<span class="hljs-code">      &lt;a href="#" data-role="post-count" class="publisher-nav-color" data-nav="conversation"&gt;</span>
<span class="hljs-code">        &lt;span class="comment-count"&gt;0 комментариев&lt;/span&gt;</span>
<span class="hljs-code">        &lt;span class="comment-count-placeholder"&gt;Комментарии&lt;/span&gt;</span>
<span class="hljs-code">      &lt;/a&gt;</span>
<span class="hljs-code">    &lt;/li&gt;</span>
<span class="hljs-code">    &lt;li class="dropdown user-menu" data-role="logout"&gt;</span>
<span class="hljs-code">      &lt;a href="#" class="dropdown-toggle" data-toggle="dropdown"&gt;</span>
<span class="hljs-code">        &lt;span class="dropdown-toggle-wrapper"&gt;</span>
<span class="hljs-code">          &lt;span&gt;</span>
<span class="hljs-code">            Войти</span>
<span class="hljs-code">          &lt;/span&gt;</span>
<span class="hljs-code">        &lt;/span&gt;</span>
<span class="hljs-code">        &lt;span class="caret"&gt;&lt;/span&gt;</span>
<span class="hljs-code">      &lt;/a&gt;</span>
<span class="hljs-code">    &lt;/li&gt;</span>
  <span class="xml"><span class="hljs-tag">&lt;/<span class="hljs-name">ul</span>&gt;</span></span>
<span class="xml"><span class="hljs-tag">&lt;/<span class="hljs-name">nav</span>&gt;</span></span>
<span class="hljs-code">` `</span> `

Самое приятное, что в коде не нужно заменять угловые скобки <span class="hljs-code">`&lt; &gt;`</span> и амперсанд <span class="hljs-code">`&amp;`</span> на их html-сущности.

<span class="hljs-section">### Инлайн код</span>

Для вставки кода внутри предложений нужно заключать этот код в апострофы (на букве Ё). Пример: <span class="hljs-code">`&lt;html class="ie no-js"&gt;`</span>.

Если внутри кода есть апостроф, то код надо обрамить двойными апострофами: <span class="hljs-code">``There is a literal backtick (`</span>) here.``

<span class="hljs-section">### Горизонтальная черта</span>

<span class="hljs-code">`hr`</span> создается тремя звездочками или тремя дефисами.

<span class="hljs-emphasis">***</span>

<span class="hljs-section">### Ссылки</span>

Это встроенная [<span class="hljs-string">ссылка с title элементом</span>](<span class="hljs-link">http://example.com/link "Я ссылка"</span>). Это — [<span class="hljs-string">без title</span>](<span class="hljs-link">http://example.com/link</span>).

А вот [<span class="hljs-string">пример</span>][<span class="hljs-symbol">1</span>] [<span class="hljs-string">нескольких</span>][<span class="hljs-symbol">2</span>] [<span class="hljs-string">ссылок</span>][<span class="hljs-symbol">id</span>] с разметкой как у сносок. Прокатит и [<span class="hljs-string">короткая запись</span>][<span class="hljs-symbol"></span>] без указания id.

[<span class="hljs-symbol">1</span>]: <span class="hljs-link">http://example.com/ "Optional Title Here"</span>
[<span class="hljs-symbol">2</span>]: <span class="hljs-link">http://example.com/some</span>
[<span class="hljs-symbol">id</span>]: <span class="hljs-link">http://example.com/links (Optional Title Here)</span>
[<span class="hljs-symbol">короткая запись</span>]: <span class="hljs-link">http://example.com/short</span>

Вынос длинных урлов из предложения способствует сохранению читабельности исходника. Сноски можно располагать в любом месте документа.

<span class="hljs-section">### Emphasis</span>

Выделять слова можно при помощи <span class="hljs-code">`*`</span> и <span class="hljs-code">`_`</span>. Одним символ для наклонного текста, два символа для жирного текста, три — для наклонного и жирного одновременно.

Например, это <span class="hljs-emphasis">_italic_</span> и это тоже <span class="hljs-emphasis">*italic*</span>. А вот так уже <span class="hljs-strong">__strong__</span>, и так тоже <span class="hljs-strong">**strong**</span>. А так <span class="hljs-strong">***жирный и наклонный**</span>* одновременно.

<span class="hljs-section">### Зачеркивание</span>

В GFM добавлено зачеркивание текста: две тильды <span class="hljs-code">`~`</span> до и после текста.

~~Зачеркнуто~~

<span class="hljs-section">## Картинки</span>

Картинка без <span class="hljs-code">`alt`</span> текста

![](http://placehold.it/150x100)

Картинка с альтом и тайтлом:

![<span class="hljs-string">Alt text</span>](<span class="hljs-link">http://placehold.it/150x100 "Можно задать title"</span>)

Запомнить просто: синтаксис как у ссылок, только перед открывающей квадратной скобкой ставится восклицательный знак.

Картинки «сноски»:

![<span class="hljs-string">Картинка</span>][<span class="hljs-symbol">image1</span>]
![<span class="hljs-string">Картинка</span>][<span class="hljs-symbol">image2</span>]
![<span class="hljs-string">Картинка</span>][<span class="hljs-symbol">image3</span>]

[<span class="hljs-symbol">image1</span>]: <span class="hljs-link">http://placehold.it/250x100</span>
[<span class="hljs-symbol">image2</span>]: <span class="hljs-link">http://placehold.it/200x100</span>
[<span class="hljs-symbol">image3</span>]: <span class="hljs-link">http://placehold.it/150x100</span>

Картинки-ссылки:

[<span class="hljs-string">![Alt text</span>](<span class="hljs-link">http://placehold.it/150x100</span>)](<span class="hljs-link">http://example.com/</span>)


<span class="hljs-section">## Использование HTML внутри Markdown</span>

Mожно смешивать Markdown и HTML. Если на какие-то элементы нужно поставить классы или атрибуты, смело используем HTML:

<span class="hljs-quote">&gt; Выделять слова можно при помощи * и _ . Например, это &lt;em class="a1"&gt;italic&lt;/em&gt; и это тоже &lt;i class="a1"&gt;italic&lt;/i&gt;. А вот так уже &lt;b&gt;strong&lt;/b&gt;, и так тоже &lt;strong&gt;strong&lt;/strong&gt;.</span>

Можно и наоборот, внутри HTML-тегов использовать Маркдаун.

<span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">section</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"someclass"</span>&gt;</span></span>

<span class="hljs-section">### Пример Маркдауна внутри HTML</span>

Выделять слова можно при помощи <span class="hljs-code">`*`</span> и <span class="hljs-code">`_`</span> . Например, это <span class="hljs-emphasis">_italic_</span> и это тоже <span class="hljs-emphasis">*italic*</span>. А вот так уже <span class="hljs-strong">__strong__</span>, и так тоже <span class="hljs-strong">**strong**</span>.

<span class="xml"><span class="hljs-tag">&lt;/<span class="hljs-name">section</span>&gt;</span></span>

<span class="hljs-section">### Таблицы</span>

В чистом Маркдауне нет синтаксиса для таблиц, а в GFM есть.

First Header  | Second Header
------------- | -------------
Content Cell  | Content Cell
Content Cell  | Content Cell

Для красоты можно и по бокам линии нарисовать:

| First Header  | Second Header |
| ------------- | ------------- |
| Content Cell  | Content Cell  |
| Content Cell  | Content Cell  |

Можно управлять выравниванием столбцов при помощи двоеточия.

| Left-Aligned  | Center Aligned  | Right Aligned |
|:------------- |:---------------:| -------------:|
| col 3 is      | some wordy text |     <span class="hljs-strong">**$1600**</span> |
| col 2 is      | centered        |         $12   |
| zebra stripes | are neat        |        ~~$1~~ |

Внутри таблиц можно использовать ссылки, наклонный, жирный или зачеркнутый текст.

Для всего остального есть обычный HTML.
</code></pre>

</div>

<div class="markdown-cheatsheet">
  <div class="markdown-cheatsheet-inner">
    <div id="in">
      <form>
        <textarea id="code" contentEditable="true">
# GitHub-Flavored Markdown

## Краткое руководство

Абзацы создаются при помощи пустой строки. Если вокруг текста сверху и снизу есть пустые строки, то текст превращается в абзац.

Чтобы сделать перенос строки вместо абзаца,  
нужно поставить два пробела в конце предыдущей строки.

Заголовки отмечаются диезом `#` в начале строки, от одного до шести. Например:

# Заголовок первого уровня #
## Заголовок h2
### Заголовок h3
#### Заголовок h4
##### Заголовок h5
###### Заголовок h6

В декоративных целях заголовки можно «закрывать» с обратной стороны.

### Списки

Для разметки неупорядоченных списков можно использовать или `*`, или `-`, или `+`:

- элемент 1
- элемент 2
- элемент ...

Вложенные пункты создаются четырьмя пробелами перед маркером пункта:

* элемент 1
* элемент 2
    * вложенный элемент 2.1
    * вложенный элемент 2.2
* элемент ...

Упорядоченный список:

1. элемент 1
2. элемент 2
    1. вложенный
    2. вложенный
3. элемент 3
4. Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse id sem consectetuer libero luctus adipiscing.

На самом деле не важно как в коде пронумерованы пункты, главное, чтобы перед элементом списка стояла цифра (любая) с точкой. Можно сделать и так:

0. элемент 1
0. элемент 2
0. элемент 3
0. элемент 4

Список с абзацами:

* Раз абзац. Lorem ipsum dolor sit amet, consectetur adipisicing elit.

* Два абзац. Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse id sem consectetuer libero luctus adipiscing.

* Три абзац. Ea, quis, alias nobis porro quos laborum minus sed fuga odio dolore natus quas cum enim necessitatibus magni provident non saepe sequi?

    Четыре абзац (Четыре пробела в начале или один tab).

### Цитаты

Цитаты оформляются как в емейлах, с помощью символа `>`.

> This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet,
> consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus.
> Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus.
>
> Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse
> id sem consectetuer libero luctus adipiscing.

Или более ленивым способом, когда знак `>` ставится перед каждым элементом цитаты, будь то абзац, заголовок или пустая строка:

> This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet,
consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus.
Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus.
>
> Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse
id sem consectetuer libero luctus adipiscing.

В цитаты можно помещать всё что угодно, в том числе вложенные цитаты:

> ## This is a header.
>
> 1.   This is the first list item.
> 2.   This is the second list item.
>
> > Вложенная цитата.
>
> Here's some example code:
>
>     return shell_exec("echo $input | $markdown_script");

### Исходный код

В чистом Маркдауне блоки кода отбиваются 4 пробелами в начале каждой строки.

Но в GitHub-Flavored Markdown (сокращенно GFM) есть более удобный способ: ставим по три апострофа (на букве Ё) до и после кода. Также можно указать язык исходного кода.

```html
<nav class="nav nav-primary">
  <ul>
    <li class="tab-conversation active">
      <a href="#" data-role="post-count" class="publisher-nav-color" data-nav="conversation">
        <span class="comment-count">0 комментариев</span>
        <span class="comment-count-placeholder">Комментарии</span>
      </a>
    </li>
    <li class="dropdown user-menu" data-role="logout">
      <a href="#" class="dropdown-toggle" data-toggle="dropdown">
        <span class="dropdown-toggle-wrapper">
          <span>
            Войти
          </span>
        </span>
        <span class="caret"></span>
      </a>
    </li>
  </ul>
</nav>
```

Самое приятное, что в коде не нужно заменять угловые скобки `< >` и амперсанд `&` на их html-сущности.

### Инлайн код

Для вставки кода внутри предложений нужно заключать этот код в апострофы (на букве Ё). Пример: `<html class="ie no-js">`.

Если внутри кода есть апостроф, то код надо обрамить двойными апострофами: ``There is a literal backtick (`) here.``

### Горизонтальная черта

`hr` создается тремя звездочками или тремя дефисами.

***

### Ссылки

Это встроенная [ссылка с title элементом](http://example.com/link "Я ссылка"). Это — [без title](http://example.com/link).

А вот [пример][1] [нескольких][2] [ссылок][id] с разметкой как у сносок. Прокатит и [короткая запись][] без указания id.

[1]: http://example.com/ "Optional Title Here"
[2]: http://example.com/some
[id]: http://example.com/links (Optional Title Here)
[короткая запись]: http://example.com/short

Вынос длинных урлов из предложения способствует сохранению читабельности исходника. Сноски можно располагать в любом месте документа.

### Emphasis

Выделять слова можно при помощи `*` и `_`. Одним символ для наклонного текста, два символа для жирного текста, три — для наклонного и жирного одновременно.

Например, это _italic_ и это тоже *italic*. А вот так уже __strong__, и так тоже **strong**. А так ***жирный и наклонный*** одновременно.

### Зачеркивание

В GFM добавлено зачеркивание текста: две тильды `~` до и после текста.

~~Зачеркнуто~~

## Картинки

Картинка без `alt` текста

![](//placehold.it/150x100)

Картинка с альтом и тайтлом:

![Alt text](//placehold.it/150x100 "Можно задать title")

Запомнить просто: синтаксис как у ссылок, только перед открывающей квадратной скобкой ставится восклицательный знак.

Картинки «сноски»:

![Картинка][image1]
![Картинка][image2]
![Картинка][image3]

[image1]: //placehold.it/250x100
[image2]: //placehold.it/200x100
[image3]: //placehold.it/150x100

Картинки-ссылки:

[![Alt text](//placehold.it/150x100)](http://example.com/)


## Использование HTML внутри Markdown

Mожно смешивать Markdown и HTML. Если на какие-то элементы нужно поставить классы или атрибуты, смело используем HTML:

> Выделять слова можно при помощи * и _ . Например, это <em class="a1">italic</em> и это тоже <i class="a1">italic</i>. А вот так уже <b>strong</b>, и так тоже <strong>strong</strong>.

Можно и наоборот, внутри HTML-тегов использовать Маркдаун.

<section class="someclass">

### Пример Маркдауна внутри HTML

Выделять слова можно при помощи `*` и `_` . Например, это _italic_ и это тоже *italic*. А вот так уже __strong__, и так тоже **strong**.

</section>

### Таблицы

В чистом Маркдауне нет синтаксиса для таблиц, а в GFM есть.

First Header  | Second Header
------------- | -------------
Content Cell  | Content Cell
Content Cell  | Content Cell

Для красоты можно и по бокам линии нарисовать:

| First Header  | Second Header |
| ------------- | ------------- |
| Content Cell  | Content Cell  |
| Content Cell  | Content Cell  |

Можно управлять выравниванием столбцов при помощи двоеточия.

| Left-Aligned  | Center Aligned  | Right Aligned |
|:------------- |:---------------:| -------------:|
| col 3 is      | some wordy text |     **$1600** |
| col 2 is      | centered        |         $12   |
| zebra stripes | are neat        |        ~~$1~~ |

Внутри таблиц можно использовать ссылки, наклонный, жирный или зачеркнутый текст.

Для всего остального есть обычный HTML.

        </textarea>
      </form>
    </div>
    <div id="out"></div>
    <div id="menu">
      <span>Save As</span>
      <div id="saveas-markdown">
        <svg height="64" width="64" xmlns="http://www.w3.org/2000/svg">
          <g transform="scale(0.0625)">
            <path d="M950.154 192H73.846C33.127 192 0 225.12699999999995 0 265.846v492.308C0 798.875 33.127 832 73.846 832h876.308c40.721 0 73.846-33.125 73.846-73.846V265.846C1024 225.12699999999995 990.875 192 950.154 192zM576 703.875L448 704V512l-96 123.077L256 512v192H128V320h128l96 128 96-128 128-0.125V703.875zM767.091 735.875L608 512h96V320h128v192h96L767.091 735.875z" />
          </g>
        </svg>

        <span>Markdown</span>
      </div>
      <div id="saveas-html">
        <svg height="64" width="64" xmlns="http://www.w3.org/2000/svg">
          <g transform="scale(0.0625) translate(64,0)">
            <path d="M608 192l-96 96 224 224L512 736l96 96 288-320L608 192zM288 192L0 512l288 320 96-96L160 512l224-224L288 192z" />
          </g>
        </svg>

        <span>HTML</span>
      </div>
      <a id="close-menu">&times;</a>
    </div>
  </div>
</div>

<p>Для создания демки использован <a href="https://github.com/jbt/markdown-editor">Live Markdown Editor</a>. </p>

<p>Дополнительные функции:</p>
<ul>
  <li><kbd>Ctrl/Cmd + S</kbd> — сохранить маркдаун-код как файл;</li>
  <li><kbd>Ctrl/Cmd + Shift + S</kbd> — выбрать, как сохранить: макрдаун или html;</li>
  <li>Перетянуть файл в панель кода, чтобы загрузить его;</li>
  <li>Контент файла сохраняется в URL, чтобы можно было поделиться ссылкой.</li>
</ul>]]>
				</content:encoded>
				<pubDate>Mon, 07 Apr 2014 00:00:00 GMT</pubDate>
				<guid>http://paulradzkov.com/2014/markdown_cheatsheet/</guid>
				<comments>http://paulradzkov.com/2014/markdown_cheatsheet/#comments</comments>
			</item>
		
			<item>
				<title>О каких дизайнерах мечтают верстальщики</title>
				<link>http://paulradzkov.com/2014/designer-superstar/</link>
				<description></description>
				<content:encoded>
					<![CDATA[<p>В <a href="http://artgorbunov.ru/bb/soviet/20140206/">совете</a> Николай Товеровский классифицировал верстальщиков на три категории: «Неандертальцы», «Планктон» и «Суперзвёзды».</p>
<p>На мой взгляд, между «Планктоном» и «Суперзвёздами» должны быть «Мастера», которые замечают все проблемы, советуются с дизайнерами, предлагают варианты, но не требуют «нарисовать макетик» и, пока ещё, не берут на себя ответственность дорабатывать макет самостоятельно. Таким специалистам достаточно на словах объяснить, что будет в крайних ситуациях и как должны вести себя элементы сайта в непрорисованных состояниях. Они всё поймут и сделают как надо.</p>
<p>А вот о каких дизайнерах мечтают верстальщики…</p>
<!-- cut -->
<hr>
<p>Бывает дизайнер-Суперзвезда, который отдаёт 15 страниц макета и страницу, на которой прорисованы все базовые элементы: заголовки, списки, цитаты, таблички, формы с полями ввода, чекбоксами и кнопочками.</p>
<p>Сверстаешь такую страницу, а дальше все остальные пятнадцать страниц автоматически «собираются» пиксель-в-пиксель как на макете, только теги добавляй и новые стили дописывай. И в стилях при этом ничего не приходится обнулять, переписывать, идти на компромисcы.</p>
<p>И каждая страница макета согласуется с сеткой, которую выбрал для сайта дизайнер, и тебе не приходится подгонять размеры элементов от страницы к странице. А на полях макетов прорисованы разные состояния элементов.</p>
<p>И ты знаешь, что если в исходнике растровый слой, его надо нарезать картинкой, а если векторный — верстать, используя CSS. И каждый растровый элемент сайта или склеен в один слой, или является смарт-объектом. И нет в макете скрытых слоёв, которые не пригодились дизайнеру, а все растровые фоны даны с запасом на резину. И все шейпы попадают в пиксели. И тени на элементах в нормальном режиме наложения, а не каком-нибудь «Multiply». И вообще в слоях порядок.</p>
<p>Плюс ко всему этому прилагаются нестандартные шрифты из макета, чтобы верстальщик не искал их двадцать минут в интернете, и сторонние иконки, чтобы не нарезать их снова.</p>
<p>И оказывается, что 15 страниц — не так уж много. И верстаются они легко и быстро, что даже кажется, будто тебя обманули, что этот проект уже когда-то был свёрстан, а потом дизайнер его заскриншотил и заново отрисовал.</p>
<p>Такой дизайнер способен подтянуть верстальщика на новый уровень всего за несколько проектов.</p>
]]>
				</content:encoded>
				<pubDate>Mon, 10 Feb 2014 00:00:00 GMT</pubDate>
				<guid>http://paulradzkov.com/2014/designer-superstar/</guid>
				<comments>http://paulradzkov.com/2014/designer-superstar/#comments</comments>
			</item>
		
			<item>
				<title>Захват экрана в GIF</title>
				<link>http://paulradzkov.com/2014/capture_screen_to_gif/</link>
				<description></description>
				<content:encoded>
					<![CDATA[<p>Рекомендую замечательную маленькую программку для записи области экрана в GIF — <a href="http://www.cockos.com/licecap/" target="_blank" rel="noopener"><strong>LICEcap</strong></a>. Она должна быть полезна тестерам и разработчикам — лучше показать / увидеть баг в динамике, чем расписывать последовательность шагов для воспроизведения бага.</p>

<p>А ещё можно сохранять в гифки смешные моменты из фильмов.</p>

<!-- cut -->

<p>Пользоваться легко, смотрите сами:</p>

<figure>
    <img src="/2014/capture_screen_to_gif/licecap-demo.gif" alt="LICEcap — захват экрана в GIF">
    <figcaption><p>Захват экрана в GIF в программе LICEcap</p></figcaption>
</figure>

<p>Настроек минимум, но есть всё самое необходимое: можно настроить область захвата с точностью до пикселя, выбрать количество кадров в секунду, количество повторений GIF-анимации, показывать при записи клики или нет, показывать секундомер на гифке.</p>

<p>Если 256 цветов на кадр не хватает, можно сделать захват в собственный формат программы .LCF и потом воспроизвести и отрендерить в видео формат при помощи другой, уже платной, программы этого же разработчика.</p>

<p>LICEcap бесплатна. Есть версия для Windows и OS X.</p>

<p>
    <a href="http://www.cockos.com/licecap/" target="_blank" rel="noopener" class="link-to-demo">Скачать с сайта разработчика</a>
</p>]]>
				</content:encoded>
				<pubDate>Sun, 09 Feb 2014 00:00:00 GMT</pubDate>
				<guid>http://paulradzkov.com/2014/capture_screen_to_gif/</guid>
				<comments>http://paulradzkov.com/2014/capture_screen_to_gif/#comments</comments>
			</item>
		
			<item>
				<title>Font-weight: bolder для шрифтов со множеством начертаний</title>
				<link>http://paulradzkov.com/2014/font-weight_bolder/</link>
				<description></description>
				<content:encoded>
					<![CDATA[<p>Если вы используете шрифт со множеством начертаний, то вам, вероятно, захочется, чтобы теги <code class="hljs-tag">strong</code> и <code class="hljs-tag">b</code> не увеличивали жирность шрифта до фиксированного значения <code class="hljs-rule"><span class="hljs-attribute">font-weight</span>:<span class="hljs-number">700</span></code>, как это происходит по-умолчанию, а использовали промежуточные значения, рассчитанные исходя из жирности шрифта родительского элемента.</p>
<p>Ведь не очень красиво, когда в ультратонком шрифте появляются жирные кляксы тегов <code class="hljs-tag">strong</code>.</p>

<!-- cut -->

<p>Возьмём для примера Open Sans.</p>

<figure>
  <img src="/2014/font-weight_bolder/open-sans.png" width="847" height="345" alt="Open Sans и все его начертания">
  <figcaption>
  	<p>Open Sans имеет пять начертаний: Light 300, Normal 400, Semi-Bold 600, Bold 700 и Extra-Bold 800. <br> Цифры соответствуют значению <code class="hljs-attribute">font-weight</code>.</p>
  </figcaption>
</figure>

<p>Основной текст имеет начертание Light 300, заголовки и цитаты — Normal 400, а промо-блок — Semi-Bold 600:</p>

<pre class="highlight"><code class="hljs css"><span class="hljs-selector-tag">body</span> {
  <span class="hljs-attribute">font-family</span>: <span class="hljs-string">'Open Sans'</span>, sans-serif;
  <span class="hljs-attribute">font-weight</span>: <span class="hljs-number">300</span>;
}
<span class="hljs-selector-tag">h1</span>, <span class="hljs-selector-tag">h2</span>, <span class="hljs-selector-tag">h3</span>, <span class="hljs-selector-tag">h4</span>, <span class="hljs-selector-tag">h5</span>, <span class="hljs-selector-tag">h6</span>,
<span class="hljs-selector-tag">blockquote</span> {
  <span class="hljs-attribute">font-weight</span>: <span class="hljs-number">400</span>;
}
<span class="hljs-selector-class">.promo</span> {
  <span class="hljs-attribute">font-weight</span>: <span class="hljs-number">600</span>;
}
</code></pre>

<p>Тег <code class="hljs-tag">strong</code> может встечаться и в основном тексте, и в цитатах, и промо-блоке. Надо это учесть.</p>

<p>По-умолчанию:</p>

<pre class="highlight"><code class="hljs css"><span class="hljs-selector-tag">strong</span>, <span class="hljs-selector-tag">b</span> {
    <span class="hljs-attribute">font-weight</span>: bold; <span class="hljs-comment">/* bold = 700 */</span>
}
</code></pre>

<p>А нам хочется, чтобы у <code class="hljs-tag">strong</code> и <code class="hljs-tag">b</code> для основного текста было Normal 400, для цитат и заголовков — Bold 700, а для промо блока — Extra-Bold 800. Это сохранит контраст между жирным и нежирным текстом примерно равным во всех случаях.</p>

<p>Уверен, многие пробовали использовать <code class="css"><span class="hljs-tag">strong</span> <span class="hljs-rules">{<span class="hljs-rule"><span class="hljs-attribute">font-weight</span>:<span class="hljs-value"> bolder</span></span>;<span class="hljs-rule">}</span></span></code>, но это не принесло ожидаемого результата — текст стал ещё жирнее, чем ожидалось.</p>

<p>А всё потому, что согласно <a href="http://www.w3.org/TR/CSS2/fonts.html#font-boldness" target="_blank" rel="noopener">спецификации</a>, значение <code class="hljs-rule"><span class="hljs-value">bolder</span></code>  (<code class="hljs-rule"><span class="hljs-value">lighter</span></code>) увеличивает (уменьшает) <em>унаследованное</em> значение <code class="hljs-attribute">font-weight</code> до следующего возможного для данного шрифта значения, согласно следующей таблице.</p>

<figure>
<table style="margin: auto;">
    <tr>
        <th>Наследуемое значение</th><th>bolder</th><th>lighter</th>
    </tr>
    <tr>
        <td>100</td><td>400</td><td>100</td>
    </tr>
    <tr>
        <td>200</td><td>400</td><td>100</td>
    </tr>
    <tr>
        <td>300</td><td>400</td><td>100</td>
    </tr>
    <tr>
        <td>400</td><td>700</td><td>100</td>
    </tr>
    <tr>
        <td>500</td><td>700</td><td>100</td>
    </tr>
    <tr>
        <td>600</td><td>900</td><td>400</td>
    </tr>
    <tr>
        <td>700</td><td>900</td><td>400</td>
    </tr>
    <tr>
        <td>800</td><td>900</td><td>700</td>
    </tr>
    <tr>
        <td>900</td><td>900</td><td>700</td>
    </tr>
</table>
<figcaption><p>Значения «bolder» и «lighter» в зависимости от наследуемого значения.</p></figcaption>
</figure>

<p><del>Но в браузерной CSS прописано <code class="css"><span class="hljs-tag">strong</span>, <span class="hljs-tag">b</span> <span class="hljs-rules">{<span class="hljs-rule"><span class="hljs-attribute">font-weight</span>:<span class="hljs-value">bold</span></span>;<span class="hljs-rule">}</span></span></code>, т.е. <em>унаследуется</em> значение «700», а потом оно ещё и увеличивается до «900». Поэтому кажется, что <code class="hljs-rule"><span class="hljs-value">bolder</span></code> работает неправильно.</del></p>

<blockquote>
    <p><strong>Добавлено 22 января 2016</strong></p>
    <p>На самом деле это был баг и он присутствовал во всех браузерах на момент написания статьи. Позже баги в браузерах были исправлены.
        А <a href="https://github.com/necolas/normalize.css/pull/342">мой пулл-реквест</a> был принят в <a href="https://github.com/necolas/normalize.css">normalize.css</a>.</p>
</blockquote>

<p>Исправить это можно так:</p>

<pre class="highlight"><code class="hljs css"><span class="hljs-comment">/* сбрасываем стандартное «bold»,
шрифт становится таким же как его родительский элемент */</span>
<span class="hljs-selector-tag">strong</span>, <span class="hljs-selector-tag">b</span> {
  <span class="hljs-attribute">font-weight</span>: inherit;
}

<span class="hljs-comment">/* теперь bolder будет вычисляться исходя из веса шрифта родительского элемента */</span>
<span class="hljs-selector-tag">strong</span>, <span class="hljs-selector-tag">b</span> {
  <span class="hljs-attribute">font-weight</span>: bolder;
}
</code></pre>

<p>Именно так, как два отдельных правила. Первое обнуляет значение <code class="hljs-attribute">font-weight</code> из браузерной таблицы стилей, второе задаёт жирность уже в относительных, а не абсолютных единицах.</p>

<p>Теперь нам не придётся заботиться о вложенности элементов — каскад всё сделает автоматически. Мы можем вкладывать теги <code class="hljs-tag">strong</code> друг в друга.</p>

<figure>
    <a href="http://cssdeck.com/labs/x20utix0" target="_blank" rel="noopener"><img src="/2014/font-weight_bolder/nested-tags-with-font-weight-bolder.png" alt=""></a>
    <figcaption>
        <p>Вложенные теги «strong». Толщина шрифта определяется исходя из значения родительского элемента.</p>
        <p style="text-align: center;"><a href="http://cssdeck.com/labs/x20utix0" target="_blank" rel="noopener" class="link-to-demo">Демка</a></p>
    </figcaption>
</figure>


<h2>Ограничения</h2>

<p>Используя относительные значения <code class="hljs-attribute">font-weight</code> мы получаем только по три градации жирности шрифта для <code class="hljs-rule"><span class="hljs-value">bolder</span></code> и <code class="hljs-rule"><span class="hljs-value">lighter</span></code> соответственно. Спецификация не гарантирует, что браузеры правильно сопоставят названия начертаний и числовые значения. Не гарантирует, что для шрифта найдётся более жирное или более тонкое начертание. У некоторых шрифтов всего два начертания, у некоторых может быть восемь.</p>

<p>Единственной гарантией при использовании <code class="hljs-rule"><span class="hljs-value">bolder</span></code> / <code class="hljs-rule"><span class="hljs-value">lighter</span></code> является то, что шрифт при значении «bolder» не будет тоньше, чем более легкие начертания этого шрифта, а при значении «lighter» будет не толще, чем более жирные начертания этого шрифта.</p>

<p>Чтобы более тонко настроить вес шрифта, надо использовать абсолютные значения.</p>

<h2>Баги</h2>

<p>Если у вас шрифт установлен в системе, но не подключен через <code class="hljs-at_rule">@<span class="hljs-keyword">font-face</span></code>, то Google Chrome определяет только Normal и Bold начертания шрифта. Чтобы локальный шрифт заработал, нужно дополнительно указать его <code class="hljs-attribute">font-family</code>.</p>

<pre class="highlight"><code class="hljs css"><span class="hljs-selector-class">.fw300</span> {
  <span class="hljs-attribute">font-family</span>: <span class="hljs-string">"Open Sans Light"</span>, <span class="hljs-string">"Open Sans"</span>;
  <span class="hljs-attribute">font-weight</span>: <span class="hljs-number">300</span>;
}
<span class="hljs-selector-class">.fw600</span> {
  <span class="hljs-attribute">font-family</span>: <span class="hljs-string">"Open Sans SemiBold"</span>, <span class="hljs-string">"Open Sans"</span>;
  <span class="hljs-attribute">font-weight</span>: <span class="hljs-number">600</span>;
}
</code></pre>]]>
				</content:encoded>
				<pubDate>Thu, 06 Feb 2014 00:00:00 GMT</pubDate>
				<guid>http://paulradzkov.com/2014/font-weight_bolder/</guid>
				<comments>http://paulradzkov.com/2014/font-weight_bolder/#comments</comments>
			</item>
		
			<item>
				<title>Параметры subject и body в mailto ссылках</title>
				<link>http://paulradzkov.com/2014/mailto_parameters/</link>
				<description></description>
				<content:encoded>
					<![CDATA[<p>В письмах от сервисов и электронных магазинов, приходящих в ответ на заказ услуги или покупку товара, часто есть подобная фраза:</p>
<blockquote>
<p>«Если у Вас возникли любые вопросы касательно вашего заказа, пожалуйста, свяжитесь со Службой поддержки по телефону <a href="tel:XXXX XXX XXXX">XXXX XXX XXXX</a> или напишите по адресу <a href="mailto:customerservices@sitename.com?subject=Заказ XXXXX&amp;body=Мой номер заказа XXXXX" class="breakall">customerservices@sitename.com</a>. Не забудьте сообщить ваш номер заказа.</p>
</blockquote>
<p>Создавая шаблоны для таких писем, не поленитесь прописать этот самый номер заказа (и любую другую нужную службе поддержки информацию) в параметры mailto ссылки:</p>
<pre class="highlight"><code class="hljs xml"><span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"mailto:customerservices@sitename.com?subject=Заказ XXXXX&amp;amp;body=Мой номер заказа XXXXX"</span>&gt;</span>customerservices@sitename.com<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span>
</code></pre><p>Теперь при клике на адрес электронной почты в новом сообщении номер заказа подставится и в тему письма, и в текст сообщения.</p>
<p>Мелочь, но она сэкономит вашим покупателям пару лишних действий. Особенно актуально это для тех, кто пишет письмо с мобильника.</p>
]]>
				</content:encoded>
				<pubDate>Tue, 04 Feb 2014 00:00:00 GMT</pubDate>
				<guid>http://paulradzkov.com/2014/mailto_parameters/</guid>
				<comments>http://paulradzkov.com/2014/mailto_parameters/#comments</comments>
			</item>
		
			<item>
				<title>Посещённая ссылка при наведении</title>
				<link>http://paulradzkov.com/2014/visited_link_on_hover/</link>
				<description></description>
				<content:encoded>
					<![CDATA[<p>Век живи — век учись. Недавно узнал, что можно задавать посещённой ссылке отдельный цвет при наведении комбинируя два псевдокласса: <code class="css"><span class="hljs-tag">a</span><span class="hljs-pseudo">:visited</span><span class="hljs-pseudo">:hover</span> <span class="hljs-rules">{<span class="hljs-rule"><span class="hljs-attribute">color</span>:<span class="hljs-value"><span class="hljs-hexcolor">#9501B3</span></span></span></span>}</code>.</p>

<p>То есть, что комбинировать псевдоклассы можно, я знал, но не догадывался попробовать провернуть это со ссылками и не ожидал, что это сработает.</p>

<!-- cut -->

<figure>
  <a href="http://cssdeck.com/labs/visited_link_on_hover" target="_blank" rel="noopener"><img src="/2014/visited_link_on_hover/sample.gif" width="600" height="150" alt="Посещенная ссылка и не посещенная при наведении имеют разные цвета"></a>
  <figcaption>
    <p style="text-align: center;">Посещённая ссылка и не посещённая при наведении и фокусе имеют разные цвета</p>
  </figcaption>
</figure>


<pre class="highlight"><code class="hljs css"><span class="hljs-selector-tag">a</span><span class="hljs-selector-pseudo">:link</span>          {<span class="hljs-attribute">color</span>:<span class="hljs-number">#0267FF</span>}
<span class="hljs-selector-tag">a</span><span class="hljs-selector-pseudo">:visited</span>       {<span class="hljs-attribute">color</span>:<span class="hljs-number">#B413D3</span>}
<span class="hljs-selector-tag">a</span><span class="hljs-selector-pseudo">:hover</span>         {<span class="hljs-attribute">color</span>:<span class="hljs-number">#004DC0</span>}
<span class="hljs-selector-tag">a</span><span class="hljs-selector-pseudo">:visited</span><span class="hljs-selector-pseudo">:hover</span> {<span class="hljs-attribute">color</span>:<span class="hljs-number">#9501B3</span>}
<span class="hljs-selector-tag">a</span><span class="hljs-selector-pseudo">:focus</span>         {<span class="hljs-attribute">color</span>:<span class="hljs-number">#004DC0</span>}
<span class="hljs-selector-tag">a</span><span class="hljs-selector-pseudo">:visited</span><span class="hljs-selector-pseudo">:focus</span> {<span class="hljs-attribute">color</span>:<span class="hljs-number">#770081</span>}
<span class="hljs-selector-tag">a</span><span class="hljs-selector-pseudo">:active</span>        {<span class="hljs-attribute">color</span>:<span class="hljs-number">#000000</span>}
</code></pre>

<p><a href="http://cssdeck.com/labs/visited_link_on_hover" target="_blank" rel="noopener" class="link-to-demo">Пример</a></p>]]>
				</content:encoded>
				<pubDate>Sun, 26 Jan 2014 00:00:00 GMT</pubDate>
				<guid>http://paulradzkov.com/2014/visited_link_on_hover/</guid>
				<comments>http://paulradzkov.com/2014/visited_link_on_hover/#comments</comments>
			</item>
		
			<item>
				<title>CSS-селектор :not. Полезные примеры</title>
				<link>http://paulradzkov.com/2014/negation_css_selector/</link>
				<description></description>
				<content:encoded>
					<![CDATA[<p>В спецификации и блогах про селектор <code class="hljs-pseudo">:not</code> обычно приводят какие-то искусственные примеры, которые хоть и объясняют синтаксис и принцип действия, но не несут никакой идеи о том, как получить пользу от нового селектора.</p>

<!-- cut -->

<p>Например:</p>

<pre class="highlight"><code class="hljs css"><span class="hljs-selector-tag">p</span><span class="hljs-selector-pseudo">:not(.classy)</span> { <span class="hljs-attribute">color</span>: red; }
</code></pre>

<p>Ну окей, думаю я, в моей практике не встречались такие ситуации. Обходились мы ведь как-то раньше без <code class="hljs-pseudo">:not</code>. Приходилось немного переписать структуру селекторов или обнулить пару значений.</p>

<h2>Пример 1. Элемент без класса</h2>

<p>Селектор  <code class="hljs-pseudo">:not</code> может быть крайне полезен, когда нам нужно застилить контент сгенерированный пользователем (нет возможности расставить в нем классы), или когда у нас контента очень много и расставлять в нем классы слишком трудоёмко.</p>

<p>Например, мы хотим на сайте сделать красивые буллиты для ненумерованных списков <code class="css"><span class="hljs-tag">ul li</span></code>. Мы пишем код:</p>

<pre class="highlight"><code class="hljs css"><span class="hljs-selector-tag">ul</span> <span class="hljs-selector-tag">li</span> { <span class="hljs-comment">/* наши красивые стили */</span> }
</code></pre>

<p>В результате, наши красивые буллиты появляются не только в контенте, но и, например, в навигации, где тоже используются <code class="css"><span class="hljs-tag">ul li</span></code>.</p>

<p>Мы ограничиваем область действия селектора:</p>

<pre class="highlight"><code class="hljs css"><span class="hljs-selector-class">.content</span> <span class="hljs-selector-tag">ul</span> <span class="hljs-selector-tag">li</span> { <span class="hljs-comment">/* красота */</span> }
</code></pre>

<p>Навигацию мы спасли, но ненужные буллиты всё еще вылазят на слайдерах, списках новостей и других конструкциях внутри <code class="hljs-class">.content</code>, где тоже используются <code class="css"><span class="hljs-tag">ul li</span></code>.</p>

<p>Далее у нас варианты:</p>

<p>1) обнулить мешающие стили в слайдерах и других местах. Но это противоречит «<abbr title="Don't Repeat Yourself">DRY</abbr>» и является одним из <a href="http://csswizardry.com/2012/11/code-smells-in-css/" target="_blank" rel="noopener">признаков «вонючего» кода</a>. К тому же не решает проблему раз и навсегда: добавите, например, аккордеон и списки в нем снова придется обнулять.</p>

<p>2) пойти от обратного и ставить класс всем спискам, которые нужно стилизовать:</p>

<pre class="highlight"><code class="hljs css"><span class="hljs-selector-class">.textlist</span> <span class="hljs-selector-tag">li</span> { <span class="hljs-comment">/* красота */</span> }
</code></pre>

<p>Это добавляет лишней работы по расстановке классов в контенте. Иногда имеет смысл, но лишнюю работу никто не любит.</p>

<p>3) стилизовать только те <code class="css"><span class="hljs-tag">ul li</span></code>, у которых нет никаких классов вообще:</p>

<pre class="highlight"><code class="hljs css"><span class="hljs-selector-tag">ul</span><span class="hljs-selector-pseudo">:not(</span><span class="hljs-selector-attr">[class]</span>) <span class="hljs-selector-tag">li</span> { <span class="hljs-comment">/* красота */</span> }
</code></pre>

<p>Победа! Нам не нужно делать дополнительную работу по расстановке классов в контенте. А на слайдерах, аккордеонах и прочих конструкциях, которые не должны выглядеть как списки, но используют их в своей разметке, в 99% случаев уже будут свои классы, и наши стили их не затронут.</p>

<p>Этот прием — «выбирать только элементы без класса» — очень полезен для оформления пользовательского контента и его можно применять не только к спискам, но и для других случаев.</p>

<h2>Пример 2. Изменение внешнего вида всех элементов, кроме наведенного</h2>

<figure>
  <a href="http://cssdeck.com/labs/dlg62kjv" target="_blank" rel="noopener"><img src="/2014/negation_css_selector/sample2.gif" width="600" height="150" alt="Изменение внешнего вида всех элементов, кроме наведенного"/></a>
  <figcaption>
    <p style="text-align: center;"><a href="http://cssdeck.com/labs/dlg62kjv" class="link-to-demo" target="_blank" rel="noopener">Пример</a></p>
  </figcaption>
</figure>

<p>Такой эффект можно реализовать без <code class="hljs-pseudo">:not</code> путем перезаписи значений. И это будет работать в бо́льшем количестве браузеров.</p>

<pre class="highlight"><code class="hljs css"><span class="hljs-comment">/* с перезаписью свойств */</span>
<span class="hljs-selector-tag">ul</span><span class="hljs-selector-pseudo">:hover</span> <span class="hljs-selector-tag">li</span> {
  <span class="hljs-attribute">opacity</span>:<span class="hljs-number">0.5</span>;
}
<span class="hljs-selector-tag">ul</span><span class="hljs-selector-pseudo">:hover</span> <span class="hljs-selector-tag">li</span><span class="hljs-selector-pseudo">:hover</span> {
  <span class="hljs-attribute">opacity</span>:<span class="hljs-number">1</span>;
}
</code></pre>

<p>Но если придется обнулять слишком много свойств, то есть смысл использовать <code class="hljs-pseudo">:not</code>.</p>

<pre class="highlight"><code class="hljs css"><span class="hljs-comment">/* используя :not() */</span>
<span class="hljs-selector-tag">ul</span><span class="hljs-selector-pseudo">:hover</span> <span class="hljs-selector-tag">li</span><span class="hljs-selector-pseudo">:not(</span><span class="hljs-selector-pseudo">:hover)</span> {
  <span class="hljs-attribute">opacity</span>:<span class="hljs-number">0.5</span>;
}
</code></pre>

<h2>Пример 3. Меню с разделителями между элементами</h2>
<figure>
    <a href="http://cssdeck.com/labs/dlg62kjv" target="_blank" rel="noopener"><img src="/2014/negation_css_selector/sample3.png" width="600" height="200" alt="Меню с разделителями между элементами"/></a>
  <figcaption>
    <p style="text-align: center;"><a href="http://cssdeck.com/labs/dlg62kjv" class="link-to-demo" target="_blank" rel="noopener">Пример</a></p>
  </figcaption>
</figure>

<p>Как и в предыдущем примере, желаемого можно добиться несколькими способами.</p>

<p>Через перезапись свойств. Но тут два правила вместо одного, что не есть «<abbr title="Don't Repeat Yourself">DRY</abbr>».</p>

<pre class="highlight"><code class="hljs css"><span class="hljs-selector-class">.menu-item</span><span class="hljs-selector-pseudo">:after</span> {
  <span class="hljs-attribute">content</span>: <span class="hljs-string">' | '</span>;
}
<span class="hljs-selector-class">.menu-item</span><span class="hljs-selector-pseudo">:last-child</span><span class="hljs-selector-pseudo">:after</span> {
  <span class="hljs-attribute">content</span>: none;
}
</code></pre>

<p>Через <code class="hljs-pseudo">:nth-last-child()</code>. Одно правило, но тяжело читается.</p>

<pre class="highlight"><code class="hljs css"><span class="hljs-selector-class">.menu-item</span><span class="hljs-selector-pseudo">:nth-last-child(n+2)</span><span class="hljs-selector-pseudo">:after</span> {
  <span class="hljs-attribute">content</span>: <span class="hljs-string">' | '</span>;
}
</code></pre>

<p>Через <code class="hljs-pseudo">:not()</code> — самая короткая и понятная запись.</p>

<pre class="highlight"><code class="hljs css"><span class="hljs-selector-class">.menu-item</span><span class="hljs-selector-pseudo">:not(</span><span class="hljs-selector-pseudo">:last-child)</span><span class="hljs-selector-pseudo">:after</span> {
  <span class="hljs-attribute">content</span>: <span class="hljs-string">' | '</span>;
}
</code></pre>

<h2>Пример 4. Debug css</h2>

<p>Удобно для отладки и самоконтроля искать/подсвечивать картинки без alt, label без for и другие ошибки.</p>

<pre class="highlight"><code class="hljs css"><span class="hljs-comment">/* подсвечиваем теги без необходимых атрибутов */</span>
<span class="hljs-selector-tag">img</span><span class="hljs-selector-pseudo">:not(</span><span class="hljs-selector-attr">[alt]</span>),
<span class="hljs-selector-tag">label</span><span class="hljs-selector-pseudo">:not(</span><span class="hljs-selector-attr">[for]</span>),
<span class="hljs-selector-tag">input</span><span class="hljs-selector-attr">[type=submit]</span><span class="hljs-selector-pseudo">:not(</span><span class="hljs-selector-attr">[value]</span>) {
  <span class="hljs-attribute">outline</span>:<span class="hljs-number">2px</span> solid red;
}

<span class="hljs-comment">/* тревога, если первый child внутри списка не li и прочие похожие примеры */</span>
<span class="hljs-selector-tag">ul</span> &gt; *<span class="hljs-selector-pseudo">:not(li)</span>,
<span class="hljs-selector-tag">ol</span> &gt; *<span class="hljs-selector-pseudo">:not(li)</span>,
<span class="hljs-selector-tag">dl</span> &gt; *<span class="hljs-selector-pseudo">:not(dt)</span><span class="hljs-selector-pseudo">:not(dd)</span> {
  <span class="hljs-attribute">outline</span>:<span class="hljs-number">2px</span> solid red;
}
</code></pre>

<h2>Пример 5. Поля форм</h2>

<p>Раньше текстовых полей форм было не много. Достаточно было написать:</p>

<pre class="highlight"><code class="hljs css"><span class="hljs-selector-tag">select</span>,
<span class="hljs-selector-tag">textarea</span>,
<span class="hljs-selector-attr">[type="text"]</span>,
<span class="hljs-selector-attr">[type="password"]</span> {
    <span class="hljs-comment">/* стили для текстовых полей ввода */</span>
}
</code></pre>

<p>С появлением новых типов полей в HTML5 этот список увеличился:</p>

<pre class="highlight"><code class="hljs css"><span class="hljs-selector-tag">select</span>,
<span class="hljs-selector-tag">textarea</span>,
<span class="hljs-selector-attr">[type="text"]</span>,
<span class="hljs-selector-attr">[type="password"]</span>,
<span class="hljs-selector-attr">[type="color"]</span>,
<span class="hljs-selector-attr">[type="date"]</span>,
<span class="hljs-selector-attr">[type="datetime"]</span>,
<span class="hljs-selector-attr">[type="datetime-local"]</span>,
<span class="hljs-selector-attr">[type="email"]</span>,
<span class="hljs-selector-attr">[type="number"]</span>,
<span class="hljs-selector-attr">[type="search"]</span>,
<span class="hljs-selector-attr">[type="tel"]</span>,
<span class="hljs-selector-attr">[type="time"]</span>,
<span class="hljs-selector-attr">[type="url"]</span>,
<span class="hljs-selector-attr">[type="month"]</span>,
<span class="hljs-selector-attr">[type="week"]</span> {
  <span class="hljs-comment">/* стили для текстовых полей ввода */</span>
}
</code></pre>

<p>Вместо перечисления 14 типов инпутов можно исключить 8 из них:</p>

<pre class="highlight"><code class="hljs css"><span class="hljs-selector-tag">select</span>,
<span class="hljs-selector-tag">textarea</span>,
<span class="hljs-selector-attr">[type]</span><span class="hljs-selector-pseudo">:not(</span><span class="hljs-selector-attr">[type="checkbox"]</span>)<span class="hljs-selector-pseudo">:not(</span><span class="hljs-selector-attr">[type="radio"]</span>)<span class="hljs-selector-pseudo">:not(</span><span class="hljs-selector-attr">[type="button"]</span>)<span class="hljs-selector-pseudo">:not(</span><span class="hljs-selector-attr">[type="submit"]</span>)<span class="hljs-selector-pseudo">:not(</span><span class="hljs-selector-attr">[type="reset"]</span>)<span class="hljs-selector-pseudo">:not(</span><span class="hljs-selector-attr">[type="range"]</span>)<span class="hljs-selector-pseudo">:not(</span><span class="hljs-selector-attr">[type="file"]</span>)<span class="hljs-selector-pseudo">:not(</span><span class="hljs-selector-attr">[type="image"]</span>) {
  <span class="hljs-comment">/* стили для текстовых полей ввода */</span>
}
</code></pre>

<p>Ладно, этот пример не очень красив, и я рекомендую всё же первый вариант с перечислением, он работает с IE8+, а второй вариант с IE9+.</p>

<h2>Поддержка</h2>

<p>Следует заметить, что согласно <a href="http://www.w3.org/TR/css3-selectors/#negation" target="_blank" rel="noopener">спецификации</a> в скобках селектора <code class="hljs-pseudo">:not()</code> может стоять только <a href="http://www.w3.org/TR/css3-selectors/#simple-selectors-dfn" target="_blank" rel="noopener">простой селектор</a> и в скобках нельзя использовать сам селектор <code class="hljs-pseudo">:not()</code>. Если нужно исключить несколько элементов, <code class="hljs-pseudo">:not()</code> можно повторить несолько раз, как в примере 5.</p>

<div class="caniuse" data-feature="css-sel3"><a href="http://caniuse.com/#search=%3Anot" target="_blank" rel="noopener">Поддержка браузерами</a></div>

<p>Если очень нужны CSS3-селекторы в браузерах, которые их не поддерживают, можно использовать полифил <a href="http://selectivizr.com/" target="_blank" rel="noopener">selectivizr</a>.</p>]]>
				</content:encoded>
				<pubDate>Sun, 19 Jan 2014 00:00:00 GMT</pubDate>
				<guid>http://paulradzkov.com/2014/negation_css_selector/</guid>
				<comments>http://paulradzkov.com/2014/negation_css_selector/#comments</comments>
			</item>
		
			<item>
				<title>Списки и картинки с флоатами</title>
				<link>http://paulradzkov.com/2013/lists_and_floats/</link>
				<description></description>
				<content:encoded>
					<![CDATA[<p><strong>Обновлено 12 декабря 2015. Спустя три года после написания этого поста в голову пришло более простое и стабильное решение.</strong></p>

<p>Для дефолтных браузерных стилей характерно такое поведение: если картинка обтекает список слева, маркеры списка налазят на картинку. От этого можно избавиться незначительно переписав стили. </p>

<!-- cut -->

<p><a href="https://codepen.io/paulradzkov/full/PmQMby/" class="link-to-demo" target="_blank" rel="noopener">демка</a></p>
<figure>
    <img src="/2013/lists_and_floats/floated_images_and_lists_problem.png" width="800" height="560" alt="Если картинка обтекает список, маркеры списка налазят на картинку"/>
    <figcaption>Проблема: если картинка обтекает список, то маркеры списка налазят на картинку</figcaption>
</figure>

<p><a data-toggle="collapse" data-target="#oldSolution" aria-expanded="false" aria-controls="oldSolution">Старое решение</a></p>

<div id="oldSolution" class="collapse">

<p>Эту проблему можно решить, но придется переписать все отступы для тегов <code class="hljs-tag">ul</code>, <code class="hljs-tag">ol</code> и <code class="hljs-tag">li</code>. Так как <code class="hljs-tag nobr">ul > li</code> могут использоваться не только для текста с маркерами, но и для менюшек, слайдеров, списков новостей и других семантических конструкций, задавать стили напрямую тегам <code class="hljs-tag">ol</code>, <code class="hljs-tag">ul</code> и <code class="hljs-tag">li</code> опасно. Иначе в дальнейшем придется слишком часто эти стили обнулять. Поэтому создадим отдельный класс <code class="hljs-class">.textlist</code>, чтобы ставить его на наши <code class="hljs-tag">ul</code> и <code class="hljs-tag">ol</code>.</p>

<pre class="highlight"><code class="hljs css"><span class="hljs-selector-class">.textlist</span> {
    <span class="hljs-attribute">margin</span>: <span class="hljs-number">0</span>;
    <span class="hljs-attribute">padding</span>: <span class="hljs-number">0</span>;
}
<span class="hljs-selector-class">.textlist</span> &gt; <span class="hljs-selector-tag">li</span> {
    <span class="hljs-attribute">margin</span>: <span class="hljs-number">0</span>;
    <span class="hljs-attribute">padding-left</span>: <span class="hljs-number">2em</span>;
    <span class="hljs-attribute">list-style-position</span>: inside;
    <span class="hljs-attribute">text-indent</span>:-<span class="hljs-number">1em</span>;
    <span class="hljs-attribute">overflow</span>: hidden;
}
</code></pre>

<p><code class="hljs-rule"><span class="hljs-attribute">overflow</span>: <span class="hljs-value">hidden</span></code>  тут нам нужен для того, чтобы запретить тексту обтекание картинки по строкам внутри <code class="hljs-tag">li</code>. Теперь каждая <code class="hljs-tag">li</code> обтекает картинку как прямоугольный блок.</p>

<p><code class="hljs-rule"><span class="hljs-attribute">list-style-position</span>: <span class="hljs-value">inside</span></code>  чтобы втянуть маркер списка внутрь блока.</p>

<p>А всё остальное, чтобы отступы выглядели как раньше.</p>

<figure>
    <img src="/2013/lists_and_floats/floated_images_and_lists_solution.png" width="800" height="580" alt="Маркеры списка не налазят на картинку"/>
    <figcaption>Маркеры списка больше не налазят на картинку</figcaption>
</figure>

<hr>

</div>

<h2>Новое решение</h2>

<p><strong>Обновлено 11 июня 2017. Пофикшен баг с наплывом маркеров на картинку при первой загрузке или когда выключен кэш.</strong></p>

<p>Для списков, у которых нет классов, перенесём дефолтный отступ 2.5em с левого края на правый, а сами <code class="hljs-tag nowrap">li</code> сдвинем на те же 2.5em вправо при помощи <code class="hljs-rule"><span class="hljs-attribute">transform</span>: <span class="hljs-value">translateX(2.5em)</span></code>.</p>

<pre class="highlight"><code class="hljs css"><span class="hljs-selector-tag">ul</span><span class="hljs-selector-pseudo">:not(</span><span class="hljs-selector-attr">[class]</span>),
<span class="hljs-selector-tag">ol</span><span class="hljs-selector-pseudo">:not(</span><span class="hljs-selector-attr">[class]</span>) {
    <span class="hljs-attribute">padding-left</span>: <span class="hljs-number">0</span>;
    <span class="hljs-attribute">padding-right</span>: <span class="hljs-number">2.5em</span>;
}
<span class="hljs-selector-tag">ul</span><span class="hljs-selector-pseudo">:not(</span><span class="hljs-selector-attr">[class]</span>) <span class="hljs-selector-tag">li</span>,
<span class="hljs-selector-tag">ol</span><span class="hljs-selector-pseudo">:not(</span><span class="hljs-selector-attr">[class]</span>) <span class="hljs-selector-tag">li</span> {
    <span class="hljs-attribute">transform</span>: <span class="hljs-built_in">translateX</span>(2.5em);
    <span class="hljs-attribute">animation</span>: fixlists <span class="hljs-number">1s</span>;
}

@<span class="hljs-keyword">keyframes</span> fixlists {
    0% {
        <span class="hljs-attribute">text-indent</span>: -<span class="hljs-number">0.001em</span>;
    }
    100% {
        <span class="hljs-attribute">text-indent</span>: <span class="hljs-number">0</span>;
    }
}
</code></pre>

<p>Списки, не имеющие класса, мы выбираем, чтобы не повредить меню, слайдеры и прочие конструкции, которые используют <code class="hljs-tag nowrap">ul li</code> в своей структуре. Подробнее про это в посте <a href="/2014/negation_css_selector/">про селектор :not()</a>.</p>

<p>В отличие от старого решения, элементы списка обтекают картинку естественным образом, не оставляя зазоров под картинкой.</p>

<p>Чтобы починить <a href="https://github.com/paulradzkov/bettertext.css/issues/4" target="_blank" rel="noopener">баг</a> в Хроме, Опере и других браузерах на движке Blink, пришлось добавить невидимую анимацию. Она заставляет браузер пересчитать размеры элементов списка и поставить маркеры на место.</p>

<p>Живой пример:</p>

<figure>
    <p data-height="600" data-theme-id="16915" data-slug-hash="PmQMby" data-default-tab="result" data-user="paulradzkov" data-embed-version="2" data-pen-title="2013-lists-and-floats" class="codepen">See the Pen <a href="https://codepen.io/paulradzkov/pen/PmQMby/">2013-lists-and-floats</a> by Paul Radzkov (<a href="http://codepen.io/paulradzkov">@paulradzkov</a>) on <a href="http://codepen.io">CodePen</a>.</p>
    <script async src="https://production-assets.codepen.io/assets/embed/ei.js"></script>
</figure>]]>
				</content:encoded>
				<pubDate>Thu, 24 Jan 2013 00:00:00 GMT</pubDate>
				<guid>http://paulradzkov.com/2013/lists_and_floats/</guid>
				<comments>http://paulradzkov.com/2013/lists_and_floats/#comments</comments>
			</item>
		
			<item>
				<title>Pointer-events</title>
				<link>http://paulradzkov.com/2012/pointer-events/</link>
				<description></description>
				<content:encoded>
					<![CDATA[<p>Представим ситуацию, когда у нас один html-элемент расположен поверх другого. Но нам нужно, чтобы нижний элемент был кликабельным или реагировал на hover.</p>

<p>В модуле «CSS4-UI» есть такое свойство — <code><a href="http://wiki.csswg.org/spec/css4-ui#pointer-events">pointer-events</a></code>.</p>

<!-- cut -->

<p><code class="hljs-rule"><span class="hljs-attribute">pointer-events</span>: <span class="hljs-value">none</span></code> — элемент перестанет реагировать на hover, click и другие события мыши. Он станет «прозрачным» для взаимодействия, а hover и click будут передаваться элементу, лежащему под ним.</p>

<p><code class="hljs-rule"><span class="hljs-attribute">pointer-events</span>: <span class="hljs-value">auto</span></code> — (значение по-умолчанию) включает стандартное поведение элемента.</p>

<p>Изначально свойство «pointer-events» было введено для SVG и должно было стать частью CSS3, но было перенесено в спецификацию CSS4. Кроме «none» и «auto» есть <a href="https://developer.mozilla.org/ru/docs/CSS/pointer-events">еще несколько значений</a>, но они применимы только к SVG, и мы не будем их рассматривать.</p>

<p>Несмотря на то, что свойство относится к  CSS4, <a href="http://caniuse.com/pointer-events" title="Где работает pointer-events?">pointer-events поддерживается</a> уже большим количеством браузеров и довольно давно. Не работает в IE ниже 11 версии и в Opera Presto. А значит, его можно осторожно использовать для улучшения юзабилити в рамках прогрессивного улучшения.</p>

<div class="caniuse" data-feature="pointer-events"></div>

<p>Проверить, поддерживается ли это свойство браузером, можно с помощью <a href="https://github.com/ausi/Feature-detection-technique-for-pointer-events" title="Modernizr plugin feature detection for css property 'pointer-events'">специального теста для Modernizer</a>.</p>

<h2>Пример 1</h2>

<p>Рассмотрим на практике.</p>

<figure>
    <p data-height="600" data-theme-id="16915" data-slug-hash="bWLPYM" data-default-tab="result" data-user="paulradzkov" data-embed-version="2" data-pen-title="2012-pointer-events-1" class="codepen">See the Pen <a href="https://codepen.io/paulradzkov/pen/bWLPYM/">2012-pointer-events-1</a> by Paul Radzkov (<a href="http://codepen.io/paulradzkov">@paulradzkov</a>) on <a href="http://codepen.io">CodePen</a>.</p>
    <script async src="https://production-assets.codepen.io/assets/embed/ei.js"></script>
</figure>


<p>В первом примере для белого градиента, накрывающего текст, <code class="hljs-rule"><span class="hljs-attribute">pointer-events</span></code> установлен в none. Текст легко выделяется мышью сквозь градиент. Даже курсор меняет свою форму со стрелки на выделение текста.</p>

<p>Во втором примере <code class="hljs-rule"><span class="hljs-attribute">pointer-events</span></code> не задан, маска градиента не даёт выделить текст, курсор имеет форму стрелки, как для нетекстовых элементов.</p>

<h2>Пример 2</h2>

<p>Задача: сделать так, чтобы ссылка в меню становилась некликабельной, если она ведет на эту же страницу.</p>

<figure>
    <p data-height="300" data-theme-id="16915" data-slug-hash="oWErMY" data-default-tab="result" data-user="paulradzkov" data-embed-version="2" data-pen-title="2012-pointer-events-demo-2" class="codepen ">See the Pen <a href="https://codepen.io/paulradzkov/pen/oWErMY/">2012-pointer-events-demo-2</a> by Paul Radzkov (<a href="http://codepen.io/paulradzkov">@paulradzkov</a>) on <a href="http://codepen.io">CodePen</a>.</p>
<script async src="https://production-assets.codepen.io/assets/embed/ei.js"></script>
</figure>

<p>Обычно в CMS уже есть какой-либо класс для индикации текущей страницы в меню. Допишем ему pointer-events:</p>

<pre class="highlight"><code class="hljs css"><span class="hljs-selector-class">.demo-menu</span> <span class="hljs-selector-tag">a</span><span class="hljs-selector-class">.current</span> {
    <span class="hljs-attribute">background</span>: <span class="hljs-number">#AAA</span>;
    <span class="hljs-attribute">color</span>: <span class="hljs-number">#333</span>;
    <span class="hljs-attribute">pointer-events</span>: none; <span class="hljs-comment">/* disables click event */</span>
}
</code></pre>

]]>
				</content:encoded>
				<pubDate>Sun, 09 Dec 2012 00:00:00 GMT</pubDate>
				<guid>http://paulradzkov.com/2012/pointer-events/</guid>
				<comments>http://paulradzkov.com/2012/pointer-events/#comments</comments>
			</item>
		
			<item>
				<title>Как отключить javascript в Google Chrome</title>
				<link>http://paulradzkov.com/2012/chrome_dev_tools/</link>
				<description></description>
				<content:encoded>
					<![CDATA[<p><em>Статья обновлена 6 февраля 2014.</em></p>
<p>В настройках Chrome Developer Tools запрятано много полезных, не сразу заметных, опций. Самые часто используемые — это отключение яваскрипта и отключение кэша.</p>

<!-- cut -->

<p>Чтобы попасть в настройки, откроем Developer Tools (<kbd>F12</kbd>) и нажмем иконку шестеренки в заголовке справа (<kbd>F1</kbd>).</p>

<figure>
	<img src="/2012/chrome_dev_tools/disable_javascript_in_chome.gif" width="830" height="870" alt="Как отлючить кэш и яваскрипт в Гугл Хроме"/>
	<figcaption>
        <p>Developer Tools (<kbd>F12</kbd>) → General Settings (<kbd>F1</kbd>). Настройки инспектора кода: отключение кэша и яваскрипта.</p>
	</figcaption>
</figure>
<p>Обратите внимание группу опций «Rendering». «Show paint rectangles» — позволяет увидеть, какие области перерисовывает браузер в ответ на какие-либо события или в результате работы скриптов. Полезно для профилирования и оптимизации.</p>

<figure>
	<img src="/2012/chrome_dev_tools/chome_devtools_shortkeys.png" width="830" height="1010" alt="Горячие клавиши в инспекторе Гугл Хрома"/>
	<figcaption>
		<p>Горячие клавиши Developers Tools.</p>
	</figcaption>
</figure>
<p>Из горячих клавиш для меня оказались самыми полезными:</p>
<ul>
	<li><kbd>Ctrl + Shift + C</kbd> — инспектировать элемент страницы,</li>
	<li><kbd>Ctrl + Shift + F</kbd> — поиск по всем ресурсам страницы,</li>
	<li><kbd>F2</kbd> — редактировать как html.</li>
</ul>]]>
				</content:encoded>
				<pubDate>Tue, 27 Nov 2012 00:00:00 GMT</pubDate>
				<guid>http://paulradzkov.com/2012/chrome_dev_tools/</guid>
				<comments>http://paulradzkov.com/2012/chrome_dev_tools/#comments</comments>
			</item>
		
			<item>
				<title>Перечёркивание крест-накрест</title>
				<link>http://paulradzkov.com/2012/crosswise/</link>
				<description></description>
				<content:encoded>
					<![CDATA[<p>Итак, задача: перечеркнуть слово или блок текста или картинку диагональными линиями крест-накрест. Нам поможет SVG.</p>

<!-- cut -->
<p>
    <a href="/demo/crosswise/" class="link-to-demo">Демка</a>
</p>

<p>Напишем стили для строчного тега <code class="hljs-tag">del</code> и подготовим класс для перечёркивания блочных элементов <code class="hljs-class">.del-cross</code>.</p>
<pre class="highlight"><code class="hljs css"><span class="hljs-selector-tag">del</span><span class="hljs-selector-class">.cross</span> {
    <span class="hljs-attribute">display</span>:inline-block; <span class="hljs-comment">/* запрещает перенос текста на следующую строку */</span>
    <span class="hljs-attribute">text-decoration</span>:none;
    <span class="hljs-attribute">position</span>:relative;
}

<span class="hljs-selector-class">.del-cross</span> {
    <span class="hljs-attribute">display</span>:block;
    <span class="hljs-attribute">position</span>:relative;
    <span class="hljs-attribute">overflow</span>:hidden; <span class="hljs-comment">/* запрещает обтекать другие блоки */</span>
}

<span class="hljs-selector-tag">del</span><span class="hljs-selector-class">.cross</span><span class="hljs-selector-pseudo">:before</span>,
<span class="hljs-selector-class">.del-cross</span><span class="hljs-selector-pseudo">:before</span> {
    <span class="hljs-attribute">content</span>:<span class="hljs-string">''</span>;
    <span class="hljs-attribute">position</span>:absolute;
    <span class="hljs-attribute">display</span>:block;
    <span class="hljs-attribute">width</span>:auto;
    <span class="hljs-attribute">height</span>:auto;
    <span class="hljs-attribute">left</span>:<span class="hljs-number">0</span>;
    <span class="hljs-attribute">top</span>:<span class="hljs-number">0</span>;
    <span class="hljs-attribute">right</span>:<span class="hljs-number">0</span>;
    <span class="hljs-attribute">bottom</span>:<span class="hljs-number">0</span>;
    <span class="hljs-attribute">background</span>: <span class="hljs-built_in">rgba</span>(0,0,0,0) <span class="hljs-built_in">url</span>(cross.svg) no-repeat;
    <span class="hljs-attribute">background-size</span>:<span class="hljs-number">100%</span> <span class="hljs-number">100%</span>; <span class="hljs-comment">/* растягивает фон на всю ширину и высоту блока */</span>
}
</code></pre>
<aside>
    <p>Примечание: лучше использовать <code class="hljs-pseudo">:before</code>, так как на <code class="hljs-pseudo">:after</code> может быть clearfix.</p>
</aside>

<p>Пример:</p>

<figure>
    <p data-height="600" data-theme-id="16915" data-slug-hash="GmERJb" data-default-tab="result" data-user="paulradzkov" data-embed-version="2" data-pen-title="2012-crosswise-demo" data-preview="false" class="codepen">See the Pen <a href="https://codepen.io/paulradzkov/pen/GmERJb/">2012-crosswise-demo</a> by Paul Radzkov (<a href="http://codepen.io/paulradzkov">@paulradzkov</a>) on <a href="http://codepen.io">CodePen</a>.</p>
<script async src="https://production-assets.codepen.io/assets/embed/ei.js"></script>
</figure>


<p>Для картинок класс <code class="hljs-class">.del-cross</code> нужно ставить на их обёртку. Тег <code class="hljs-tag">img</code> не имеет псевдокласса <code class="hljs-pseudo">:before</code>.</p>
<p>А теперь посмотрим, что внутри SVG-файла, и как настроить цвет и толщину линий.</p>
<p><a href="/demo/crosswise/cross_old.svg">cross_old.svg</a>:</p>

<pre class="highlight"><code class="hljs xml"><span class="hljs-tag">&lt;<span class="hljs-name">svg</span> <span class="hljs-attr">xmlns</span>=<span class="hljs-string">"http://www.w3.org/2000/svg"</span> <span class="hljs-attr">viewBox</span>=<span class="hljs-string">"0 0 100 100"</span> <span class="hljs-attr">preserveAspectRatio</span>=<span class="hljs-string">"none"</span> <span class="hljs-attr">style</span>=<span class="hljs-string">"stroke: rgba(255,0,0,0.9); stroke-width: 1.5"</span> &gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">line</span> <span class="hljs-attr">x1</span>=<span class="hljs-string">"0"</span> <span class="hljs-attr">y1</span>=<span class="hljs-string">"0"</span>   <span class="hljs-attr">x2</span>=<span class="hljs-string">"100"</span> <span class="hljs-attr">y2</span>=<span class="hljs-string">"100"</span> <span class="hljs-attr">vector-effect</span>=<span class="hljs-string">"non-scaling-stroke"</span> /&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">line</span> <span class="hljs-attr">x1</span>=<span class="hljs-string">"0"</span> <span class="hljs-attr">y1</span>=<span class="hljs-string">"100"</span> <span class="hljs-attr">x2</span>=<span class="hljs-string">"100"</span> <span class="hljs-attr">y2</span>=<span class="hljs-string">"0"</span>   <span class="hljs-attr">vector-effect</span>=<span class="hljs-string">"non-scaling-stroke"</span> /&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">svg</span>&gt;</span>
</code></pre>
<p><code class="hljs-tag"><span class="hljs-attribute">viewBox</span>=<span class="hljs-value">&quot;0 0 100 100&quot;</span></code> — задает виртуальный размер картинки 100×100 безразмерных единиц. Формат записи: <code>x1 y1 x2 y2</code>.</p>
<p><code class="hljs-tag"><span class="hljs-attribute">preserveAspectRatio</span>=<span class="hljs-value">&quot;none&quot;</span></code> — отключает сохранение пропорций при масштабировании.</p>

<p><code class="hljs-tag"><span class="hljs-attribute">vector-effect</span>=<span class="hljs-value">&quot;non-scaling-stroke&quot;</span></code> — чтобы толщина линий не зависела от размеров картинки. К сожалению, не работает в IE9 и IE10.</p>
<p><code class="hljs-tag"><span class="hljs-attribute">style</span>=<span class="hljs-value">&quot;stroke: rgba(255,0,0,0.9); stroke-width: 1.5&quot;</span></code> — цвет линий можно задавать как в hex, так и в rgba с прозрачностью, а толщину линий делать дробной.</p>

<h2>Поддержка браузерами</h2>

<p>SVG не поддерживается IE8 и ниже. <del>Да и в IE9-IE10 толщина линий изменяется пропорционально размерам перечёркиваемого блока, что есть баг.</del> Есть решение.</p>
<p>Для браузеров, не поддерживающих SVG, можно сделать деградацию с помощью условных комментариев или наоборот, используя <a href="http://modernizr.com/">Modernizer</a>, сделать прогрессивное улучшение только для тех, кто умеет отображать SVG.</p>

<p><strong>Обновлено 9 апреля 2013</strong></p>

<p>В комментариях GreLI подсказал, что SVG-файл можно сократить до такого вида (<a href="/2012/crosswise//cross.svg">cross.svg</a>):</p>

<pre class="highlight"><code class="hljs xml"><span class="hljs-tag">&lt;<span class="hljs-name">svg</span> <span class="hljs-attr">xmlns</span>=<span class="hljs-string">"http://www.w3.org/2000/svg"</span> <span class="hljs-attr">style</span>=<span class="hljs-string">"stroke: rgba(255,0,0,0.9); stroke-width: 1.5"</span> &gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">line</span> <span class="hljs-attr">x1</span>=<span class="hljs-string">"0"</span> <span class="hljs-attr">y1</span>=<span class="hljs-string">"0"</span>    <span class="hljs-attr">x2</span>=<span class="hljs-string">"100%"</span> <span class="hljs-attr">y2</span>=<span class="hljs-string">"100%"</span> /&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">line</span> <span class="hljs-attr">x1</span>=<span class="hljs-string">"0"</span> <span class="hljs-attr">y1</span>=<span class="hljs-string">"100%"</span> <span class="hljs-attr">x2</span>=<span class="hljs-string">"100%"</span> <span class="hljs-attr">y2</span>=<span class="hljs-string">"0"</span>    /&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">svg</span>&gt;</span>
</code></pre>

<p>Задавая координаты линий в процентах, мы избавляемся от необходимости применять <code class="hljs-tag"><span class="hljs-attribute">vector-effect</span>=<span class="hljs-value">&quot;non-scaling-stroke&quot;</span></code>, который не работает в IE9 и IE10.</p>]]>
				</content:encoded>
				<pubDate>Sun, 28 Oct 2012 00:00:00 GMT</pubDate>
				<guid>http://paulradzkov.com/2012/crosswise/</guid>
				<comments>http://paulradzkov.com/2012/crosswise/#comments</comments>
			</item>
		
			<item>
				<title>Отладка мобильных сайтов в Webkit. Инспектор кода на мобильных устройствах</title>
				<link>http://paulradzkov.com/2012/mobile_developing/</link>
				<description></description>
				<content:encoded>
					<![CDATA[<p>7 марта Abobe <a href="http://tv.adobe.com/watch/adobe-technology-sneaks-2012/adobe-shadow" title="Смотрим презентацию" target="_blank" rel="noopener">представила</a> замечательный комплекс программ, позволяющий синхронно просматривать и проводить отладку сайтов в браузерах Webkit на компе и нескольких планшетах и смартфонах одновременно. Количество подключаемых устройств не ограничено. Поддерживаются как iOS, так и Android.</p>

<!-- cut -->

<p>Как это работает?</p>
<p>Для начала устанавливаем <a href="http://labs.adobe.com/downloads/shadow.html" target="_blank" rel="noopener">приложение Adobe Shadow</a> для Windows или Mac. Оно должно быть включено во время отладки, без него работать не будет.</p>
<p><strong>Добавлено.</strong> Теперь продукт называется <a href="http://html.adobe.com/edge/inspect/">Adobe Edge Inspect</a>.</p>
<p>Ставим <a href="https://chrome.google.com/webstore/detail/ijoeapleklopieoejahbpdnhkjjgddem" target="_blank" rel="noopener">плагин Adobe Shadow</a> в Google Chrome.</p>
<p>На мобильные устройства ставим соответствующие приложения из <a href="https://play.google.com/store/apps/details?id=com.adobe.shadow.android" target="_blank" rel="noopener">Плей Маркета</a> или <a href="http://itunes.apple.com/app/adobe-shadow/id498621426" target="_blank" rel="noopener">АппСтора</a>.</p>
<p>Все устройства должны находиться в одной wifi сети. Запускаем мобильные приложения, вводим коды для синхронизации. Всё готово к работе.</p>
<p>Теперь можно серфить по сайтам с основного компа, а на подключенных устройствах будут открываться те же страницы. При этом используется движок родного браузера iOS или Android, но внутри приложения Shadow.</p>
<p>Чтобы вызвать инспектор кода, нужно в выпадающем меню плагина Adobe Shadow кликнуть иконку <strong>&lt;&gt;</strong> напротив интересующего устройства.</p>
<figure>
	<img src="/2012/mobile_developing/adobe-shadow-plugin_small.jpg" width="890" height="619" alt="Как открыть удаленный инспектор кода в Adobe Shadow"/>
</figure>
<p>Можно проводить отладку сайтов на локалхосте. Только в браузере на компе нужно вводить не <code>http://localhost</code>, а IP-адрес компьютера, например, <code>http://192.168.0.101:3000</code>.</p>
<p>А вот просто локальные файлы типа <code>file://website/index.html</code> мобильное приложение не открывает. Нужно использовать или локальный веб-сервер, или поместить такие файлы, например, в паблик-папку dropbox и открывать их из интернета.</p>
<p>В общем, рекомендую Adobe Shadow всем разработчикам, кто верстает под различные устройства. Успехов в создании сайтов с отзывчивой вёрсткой!</p>]]>
				</content:encoded>
				<pubDate>Sun, 08 Apr 2012 00:00:00 GMT</pubDate>
				<guid>http://paulradzkov.com/2012/mobile_developing/</guid>
				<comments>http://paulradzkov.com/2012/mobile_developing/#comments</comments>
			</item>
		
			<item>
				<title>Горячие клавиши для выбора предыдущего и следующего слоя в Photoshop</title>
				<link>http://paulradzkov.com/2012/photoshop_next_and_previous_layer/</link>
				<description></description>
				<content:encoded>
					<![CDATA[<p>При написании макросов в Фотошопе бывает нужно выбрать слой выше или ниже активного. Кликать в слой курсором плохой вариант, так как макрос запишет команду «Выбрать слой "имя_слоя"», т.е. будет выбираться конкретный слой, где бы он не находился, а не слой относительно текущего.</p>
<p>Нам помогут горячие клавиши: </p>
<ul>
	<li><kbd>Alt + [</kbd> — перейти на слой ниже.</li>
	<li><kbd>Alt + ]</kbd> — перейти на слой выше.</li>
	<li><kbd>Alt + Shift + [</kbd> — добавить к выбранным слой ниже.</li>
	<li><kbd>Alt + Shift + ]</kbd> — добавить к выбранным слой выше.</li>
</ul>

<!-- cut -->

<p>Эти команды оперируют только с видимыми слоями и пропускают выключенные.</p>
<figure>
	<img src="/2012/photoshop_next_and_previous_layer/photoshop_next_and_previous_layer.png" width="531" height="606" alt="Горячие клавиши для выделения предыдущего и следующего слоя в Photoshop"/>
	<figcaption>
		<p><kbd>Alt + Shift + ]</kbd> выберет слои «selihanov» и «glebov».</p>
		<p><kbd>Alt + Shift + [</kbd> выберет слои «selihanov» и «Layer&nbsp;13», пропустив все невидимые слои.</p>
	</figcaption>
</figure>
<p>Ну и заодно вспомним другие не менее полезные сочетания:</p>
<ul>
	<li><kbd>Ctrl + [</kbd> — переместить слой ниже.</li>
	<li><kbd>Ctrl + ]</kbd> — переместить слой выше.</li>
	<li><kbd>Ctrl + Shift + [</kbd> — переместить слой на самый низ.</li>
	<li><kbd>Ctrl + Shift + ]</kbd> — переместить слой на самый верх.</li>
</ul>]]>
				</content:encoded>
				<pubDate>Sun, 18 Mar 2012 00:00:00 GMT</pubDate>
				<guid>http://paulradzkov.com/2012/photoshop_next_and_previous_layer/</guid>
				<comments>http://paulradzkov.com/2012/photoshop_next_and_previous_layer/#comments</comments>
			</item>
		
			<item>
				<title>HTML-сущности и их UTF-коды</title>
				<link>http://paulradzkov.com/2012/html-entities_and_utf_codes/</link>
				<description></description>
				<content:encoded>
					<![CDATA[<p>Генерируемое содержимое псевдоклассов <code class="hljs-pseudo">:before</code> и <code class="hljs-pseudo">:after</code> очень удобно использовать для создания иконок, буллитов, кавычек и в прочих декоративных целях.</p>

<p>Но свойство <code class="hljs-rule"><span class="hljs-attribute">content</span>:<span class="hljs-value"> <span class="hljs-string">'\203A'</span>;</span></code> отображает HTML-сущности так, как они записаны в CSS, не заменяет их на специальные символы. Например, напишем в CSS <code class="hljs-rule"><span class="hljs-attribute">content</span>:<span class="hljs-value"> <span class="hljs-string">'&amp;rarr;'</span>;</span></code>, получим в браузере «&amp;rarr;» вместо «&rarr;». Поэтому писать спецальные символы в <code class="hljs-attribute">content</code> нужно 4-значными UTF-кодами (UTF-16 hex), экранированными обратным слэшем.</p>

<!-- cut -->

<p>Пример CSS-кода:</p>

<pre class="highlight"><code class="hljs css"><span class="hljs-selector-tag">p</span><span class="hljs-selector-class">.readmore</span> <span class="hljs-selector-tag">a</span><span class="hljs-selector-pseudo">:after</span> {
    <span class="hljs-attribute">content</span>: <span class="hljs-string">'\203A'</span>; <span class="hljs-comment">/* выведет › */</span>
    <span class="hljs-attribute">position</span>: absolute;
    <span class="hljs-attribute">right</span>: <span class="hljs-number">0.8em</span>;
    <span class="hljs-attribute">top</span>: <span class="hljs-number">4px</span>;
    <span class="hljs-attribute">display</span>: block;
}</code></pre>


<h2>Таблица символов</h2>

<div class="demo-css-editable"><style type="text/css" contenteditable scoped>/* Предпросмотр символов */
/* Чтобы изменить шрифт, размер, начертание, отредактируйте эти стили. */

.chars .char-demo {
   font-family: serif;
   font-size: 48px;
   font-style: normal;
   font-weight: normal;
}
</style>
<nav class="left-aside" data-spy="affix" data-offset-top="810">
    <ul class="toc">
        <li><a href="#quotes">Кавычки</a></li>
        <li><a href="#punctuation">Тире и другие знаки препинания</a></li>
        <li><a href="#arrows">Стрелки</a></li>
        <li><a href="#bullits">Буллиты</a></li>
        <li><a href="#spaces">Пробельные символы</a></li>
        <li><a href="#math">Математические символы</a></li>
        <li><a href="#currency">Знаки валют</a></li>
        <li><a href="#other">Прочие символы</a></li>
        <li><a href="#greek">Греческий алфавит</a></li>
        <li><a href="#diacritics">Диакритические знаки</a></li>
        <li><a href="#latin">Латиница с диакритическими знаками</a></li>
    </ul>
</nav>

<div class="table-switcher">
    <form name="chars-options" class="btn-group" data-toggle="buttons">
        <label class="btn btn-primary active" data-toggle="tooltip" data-placement="bottom" title="Плитка">
            <input type="radio" name="chars-view" id="tile-view" checked>
            <img src="/i/th-large.svg" class="btn-icon" width="14" height="14" alt="Плитка">
        </label>
        <label class="btn btn-primary" data-toggle="tooltip" data-placement="bottom" title="Таблица">
            <input type="radio" name="chars-view" id="table-view">
            <img src="/i/list.svg" class="btn-icon" width="14" height="14" alt="Таблица">
        </label>
    </form>
</div>

    <table class="chars layout-flow">
        <thead>
            <tr>
                <th>Символ</th>
                <th>HTML-entity</th>
                <th>UTF-код</th>
                <th>Название</th>
            </tr>
        </thead>
        <tbody>

            <tr class="ch-section" id="quotes">
                <th colspan="4">
                    Кавычки
                </th>
            </tr>

            <tr>
                <td class="char-demo">&lsaquo;</td>
                <td class="char-entity"><code>&amp;lsaquo;</code></td>
                <td class="char-code"><code>\2039</code></td>
                <td class="char-descr">single left-pointing angle quotation mark</td>
            </tr>
            <tr>
                <td class="char-demo">&rsaquo;</td>
                <td class="char-entity"><code>&amp;rsaquo;</code></td>
                <td class="char-code"><code>\203A</code></td>
                <td class="char-descr">single right-pointing angle quotation mark</td>
            </tr>
            <tr>
                <td class="char-demo">&laquo;</td>
                <td class="char-entity"><code>&amp;laquo;</code></td>
                <td class="char-code"><code>\00AB</code></td>
                <td class="char-descr">left-pointing double angle quotation mark = left pointing guillemet</td>
            </tr>
            <tr>
                <td class="char-demo">&raquo;</td>
                <td class="char-entity"><code>&amp;raquo;</code></td>
                <td class="char-code"><code>\00BB</code></td>
                <td class="char-descr">right-pointing double angle quotation mark = right pointing guillemet</td>
            </tr>
            <tr>
                <td class="char-demo">&sbquo;</td>
                <td class="char-entity"><code>&amp;sbquo;</code></td>
                <td class="char-code"><code>\201A</code></td>
                <td class="char-descr">single bottom quotation mark</td>
            </tr>
            <tr>
                <td class="char-demo">&lsquo;</td>
                <td class="char-entity"><code>&amp;lsquo;</code></td>
                <td class="char-code"><code>\2018</code></td>
                <td class="char-descr">left single quotation mark</td>
            </tr>
            <tr>
                <td class="char-demo">&rsquo;</td>
                <td class="char-entity"><code>&amp;rsquo;</code></td>
                <td class="char-code"><code>\2019</code></td>
                <td class="char-descr">right single quotation mark</td>
            </tr>
            <tr>
                <td class="char-demo">&bdquo;</td>
                <td class="char-entity"><code>&amp;bdquo;</code></td>
                <td class="char-code"><code>\201E</code></td>
                <td class="char-descr">bottom double quotation mark</td>
            </tr>
            <tr>
                <td class="char-demo">&ldquo;</td>
                <td class="char-entity"><code>&amp;ldquo;</code></td>
                <td class="char-code"><code>\201C</code></td>
                <td class="char-descr">left double quotation mark</td>
            </tr>
            <tr>
                <td class="char-demo">&rdquo;</td>
                <td class="char-entity"><code>&amp;rdquo;</code></td>
                <td class="char-code"><code>\201D</code></td>
                <td class="char-descr">right double quotation mark</td>
            </tr>
            <tr>
                <td class="char-demo">&quot;</td>
                <td class="char-entity"><code>&amp;quot;</code></td>
                <td class="char-code"><code>\0022</code></td>
                <td class="char-descr">APL quote (прямая программистская кавычка с клавиатуры)</td>
            </tr>
            <tr>
                <td class="char-demo">&prime;</td>
                <td class="char-entity"><code>&amp;prime;</code></td>
                <td class="char-code"><code>\2032</code></td>
                <td class="char-descr">prime = minutes = feet</td>
            </tr>
            <tr>
                <td class="char-demo">&Prime;</td>
                <td class="char-entity"><code>&amp;Prime;</code></td>
                <td class="char-code"><code>\2033</code></td>
                <td class="char-descr">double prime = seconds = inches</td>
            </tr>

            <tr class="ch-section" id="punctuation">
                <th colspan="4">
                    Тире и другие знаки препинания
                </th>
            </tr>

            <tr>
                <td class="char-demo">&mdash;</td>
                <td class="char-entity"><code>&amp;mdash;</code></td>
                <td class="char-code"><code>\2014</code></td>
                <td class="char-descr">em dash</td>
            </tr>
            <tr>
                <td class="char-demo">&ndash;</td>
                <td class="char-entity"><code>&amp;ndash;</code></td>
                <td class="char-code"><code>\2013</code></td>
                <td class="char-descr">en dash</td>
            </tr>
            <tr>
                <td class="char-demo">&hellip;</td>
                <td class="char-entity"><code>&amp;hellip;</code></td>
                <td class="char-code"><code>\2026</code></td>
                <td class="char-descr">horizontal ellipsis = three dot leader</td>
            </tr>
            <tr>
                <td class="char-demo">&iexcl;</td>
                <td class="char-entity"><code>&amp;iexcl;</code></td>
                <td class="char-code"><code>\00A1</code></td>
                <td class="char-descr">inverted exclamation mark</td>
            </tr>
            <tr>
                <td class="char-demo">&iquest;</td>
                <td class="char-entity"><code>&amp;iquest;</code></td>
                <td class="char-code"><code>\00BF</code></td>
                <td class="char-descr">inverted question mark = turned question mark</td>
            </tr>

            <tr class="ch-section" id="arrows">
                <th colspan="4">
                    Стрелки
                </th>
            </tr>

            <tr>
                <td class="char-demo">&larr;</td>
                <td class="char-entity"><code>&amp;larr;</code></td>
                <td class="char-code"><code>\2190</code></td>
                <td class="char-descr">leftwards arrow</td>
            </tr>
            <tr>
                <td class="char-demo">&rarr;</td>
                <td class="char-entity"><code>&amp;rarr;</code></td>
                <td class="char-code"><code>\2192</code></td>
                <td class="char-descr">rightwards arrow</td>
            </tr>
            <tr>
                <td class="char-demo">&uarr;</td>
                <td class="char-entity"><code>&amp;uarr;</code></td>
                <td class="char-code"><code>\2191</code></td>
                <td class="char-descr">upwards arrow</td>
            </tr>
            <tr>
                <td class="char-demo">&darr;</td>
                <td class="char-entity"><code>&amp;darr;</code></td>
                <td class="char-code"><code>\2193</code></td>
                <td class="char-descr">downwards arrow</td>
            </tr>
            <tr>
                <td class="char-demo">&lArr;</td>
                <td class="char-entity"><code>&amp;lArr;</code></td>
                <td class="char-code"><code>\21D0</code></td>
                <td class="char-descr">leftwards double arrow</td>
            </tr>
            <tr>
                <td class="char-demo">&rArr;</td>
                <td class="char-entity"><code>&amp;rArr;</code></td>
                <td class="char-code"><code>\21D2</code></td>
                <td class="char-descr">rightwards double arrow</td>
            </tr>
            <tr>
                <td class="char-demo">&uArr;</td>
                <td class="char-entity"><code>&amp;uArr;</code></td>
                <td class="char-code"><code>\21D1</code></td>
                <td class="char-descr">upwards double arrow</td>
            </tr>
            <tr>
                <td class="char-demo">&dArr;</td>
                <td class="char-entity"><code>&amp;dArr;</code></td>
                <td class="char-code"><code>\21D3</code></td>
                <td class="char-descr">downwards double arrow</td>
            </tr>
            <tr>
                <td class="char-demo">&harr;</td>
                <td class="char-entity"><code>&amp;harr;</code></td>
                <td class="char-code"><code>\2194</code></td>
                <td class="char-descr">left right arrow</td>
            </tr>
            <tr>
                <td class="char-demo">&hArr;</td>
                <td class="char-entity"><code>&amp;hArr;</code></td>
                <td class="char-code"><code>\21D4</code></td>
                <td class="char-descr">left right double arrow</td>
            </tr>
            <tr>
                <td class="char-demo">&crarr;</td>
                <td class="char-entity"><code>&amp;crarr;</code></td>
                <td class="char-code"><code>\21B5</code></td>
                <td class="char-descr">downwards arrow with corner leftwards = carriage return</td>
            </tr>

            <tr class="ch-section" id="bullits">
                <th colspan="4">
                    Буллиты
                </th>
            </tr>

            <tr>
                <td class="char-demo">&bull;</td>
                <td class="char-entity"><code>&amp;bull;</code></td>
                <td class="char-code"><code>\2022</code></td>
                <td class="char-descr">bullet</td>
            </tr>
            <tr>
                <td class="char-demo">&middot;</td>
                <td class="char-entity"><code>&amp;middot;</code></td>
                <td class="char-code"><code>\00B7</code></td>
                <td class="char-descr">middle dot</td>
            </tr>
            <tr>
                <td class="char-demo">&sdot;</td>
                <td class="char-entity"><code>&amp;sdot;</code></td>
                <td class="char-code"><code>\22C5</code></td>
                <td class="char-descr">dot operator</td>
            </tr>
            <tr>
                <td class="char-demo">&lowast;</td>
                <td class="char-entity"><code>&amp;lowast;</code></td>
                <td class="char-code"><code>\2217</code></td>
                <td class="char-descr">low asterisk</td>
            </tr>
            <tr>
                <td class="char-demo">&clubs;</td>
                <td class="char-entity"><code>&amp;clubs;</code></td>
                <td class="char-code"><code>\2663</code></td>
                <td class="char-descr">black club suit</td>
            </tr>
            <tr>
                <td class="char-demo">&diams;</td>
                <td class="char-entity"><code>&amp;diams;</code></td>
                <td class="char-code"><code>\2666</code></td>
                <td class="char-descr">black diamond suit</td>
            </tr>
            <tr>
                <td class="char-demo">&hearts;</td>
                <td class="char-entity"><code>&amp;hearts;</code></td>
                <td class="char-code"><code>\2665</code></td>
                <td class="char-descr">black heart suit</td>
            </tr>
            <tr>
                <td class="char-demo">&spades;</td>
                <td class="char-entity"><code>&amp;spades;</code></td>
                <td class="char-code"><code>\2660</code></td>
                <td class="char-descr">black spade suit</td>
            </tr>
            <tr>
                <td class="char-demo">&loz;</td>
                <td class="char-entity"><code>&amp;loz;</code></td>
                <td class="char-code"><code>\25CA</code></td>
                <td class="char-descr">lozenge</td>
            </tr>

            <tr class="ch-section" id="spaces">
                <th colspan="4">
                    Пробельные символы
                </th>
            </tr>

            <tr>
                <td class="char-demo char-spaces">m m</td>
                <td class="char-entity"><code> </code></td>
                <td class="char-code"><code>\0020</code></td>
                <td class="char-descr">обыкновенный пробел</td>
            </tr>
            <tr>
                <td class="char-demo char-spaces">m&nbsp;m</td>
                <td class="char-entity"><code>&amp;nbsp;</code></td>
                <td class="char-code"><code>\00A0</code></td>
                <td class="char-descr">no-break space = non-breaking space</td>
            </tr>
            <tr>
                <td class="char-demo char-spaces">n&ensp;n</td>
                <td class="char-entity"><code>&amp;ensp;</code></td>
                <td class="char-code"><code>\2002</code></td>
                <td class="char-descr">en space</td>
            </tr>
            <tr>
                <td class="char-demo char-spaces">m&emsp;m</td>
                <td class="char-entity"><code>&amp;emsp;</code></td>
                <td class="char-code"><code>\2003</code></td>
                <td class="char-descr">em space</td>
            </tr>
            <tr>
                <td class="char-demo char-spaces">_&thinsp;_</td>
                <td class="char-entity"><code>&amp;thinsp;</code></td>
                <td class="char-code"><code>\2009</code></td>
                <td class="char-descr">thin space</td>
            </tr>
            <tr>
                <td class="char-demo char-spaces">_&zwj;_</td>
                <td class="char-entity"><code>&amp;zwj;</code></td>
                <td class="char-code"><code>\200D</code></td>
                <td class="char-descr">zero width joiner</td>
            </tr>
            <tr>
                <td class="char-demo char-spaces">_&zwnj;_</td>
                <td class="char-entity"><code>&amp;zwnj;</code></td>
                <td class="char-code"><code>\200C</code></td>
                <td class="char-descr">zero width non-joiner</td>
            </tr>

            <tr class="ch-section" id="math">
                <th colspan="4">
                    Математические символы
                </th>
            </tr>

            <tr>
                <td class="char-demo">&times;</td>
                <td class="char-entity"><code>&amp;times;</code></td>
                <td class="char-code"><code>\00D7</code></td>
                <td class="char-descr">multiplication sign</td>
            </tr>
            <tr>
                <td class="char-demo">&divide;</td>
                <td class="char-entity"><code>&amp;divide;</code></td>
                <td class="char-code"><code>\00F7</code></td>
                <td class="char-descr">division sign</td>
            </tr>
            <tr>
                <td class="char-demo">&frasl;</td>
                <td class="char-entity"><code>&amp;frasl;</code></td>
                <td class="char-code"><code>\2044</code></td>
                <td class="char-descr">fraction slash</td>
            </tr>
            <tr>
                <td class="char-demo">&minus;</td>
                <td class="char-entity"><code>&amp;minus;</code></td>
                <td class="char-code"><code>\2212</code></td>
                <td class="char-descr">minus sign</td>
            </tr>
            <tr>
                <td class="char-demo">&plusmn;</td>
                <td class="char-entity"><code>&amp;plusmn;</code></td>
                <td class="char-code"><code>\00B1</code></td>
                <td class="char-descr">plus-minus sign = plus-or-minus sign</td>
            </tr>
            <tr>
                <td class="char-demo">&lt;</td>
                <td class="char-entity"><code>&amp;lt;</code></td>
                <td class="char-code"><code>\003C</code></td>
                <td class="char-descr">less-than sign</td>
            </tr>
            <tr>
                <td class="char-demo">&gt;</td>
                <td class="char-entity"><code>&amp;gt;</code></td>
                <td class="char-code"><code>\003E</code></td>
                <td class="char-descr">greater-than sign</td>
            </tr>
            <tr>
                <td class="char-demo">&le;</td>
                <td class="char-entity"><code>&amp;le;</code></td>
                <td class="char-code"><code>\2264</code></td>
                <td class="char-descr">less-than or equal to</td>
            </tr>
            <tr>
                <td class="char-demo">&ge;</td>
                <td class="char-entity"><code>&amp;ge;</code></td>
                <td class="char-code"><code>\2265</code></td>
                <td class="char-descr">greater-than or equal to</td>
            </tr>
            <tr>
                <td class="char-demo">&asymp;</td>
                <td class="char-entity"><code>&amp;asymp;</code></td>
                <td class="char-code"><code>\2248</code></td>
                <td class="char-descr">almost equal to = asymptotic to</td>
            </tr>
            <tr>
                <td class="char-demo">&cong;</td>
                <td class="char-entity"><code>&amp;cong;</code></td>
                <td class="char-code"><code>\2245</code></td>
                <td class="char-descr">approximately equal to</td>
            </tr>
            <tr>
                <td class="char-demo">&equiv;</td>
                <td class="char-entity"><code>&amp;equiv;</code></td>
                <td class="char-code"><code>\2261</code></td>
                <td class="char-descr">identical to</td>
            </tr>
            <tr>
                <td class="char-demo">&ne;</td>
                <td class="char-entity"><code>&amp;ne;</code></td>
                <td class="char-code"><code>\2260</code></td>
                <td class="char-descr">not equal to</td>
            </tr>
            <tr>
                <td class="char-demo">&deg;</td>
                <td class="char-entity"><code>&amp;deg;</code></td>
                <td class="char-code"><code>\00B0</code></td>
                <td class="char-descr">degree sign</td>
            </tr>
            <tr>
                <td class="char-demo">&frac12;</td>
                <td class="char-entity"><code>&amp;frac12;</code></td>
                <td class="char-code"><code>\00BD</code></td>
                <td class="char-descr">vulgar fraction one half = fraction one half</td>
            </tr>
            <tr>
                <td class="char-demo">&frac14;</td>
                <td class="char-entity"><code>&amp;frac14;</code></td>
                <td class="char-code"><code>\00BC</code></td>
                <td class="char-descr">vulgar fraction one quarter = fraction one quarter</td>
            </tr>
            <tr>
                <td class="char-demo">&frac34;</td>
                <td class="char-entity"><code>&amp;frac34;</code></td>
                <td class="char-code"><code>\00BE</code></td>
                <td class="char-descr">vulgar fraction three quarters = fraction three quarters</td>
            </tr>
            <tr>
                <td class="char-demo">&sup1;</td>
                <td class="char-entity"><code>&amp;sup1;</code></td>
                <td class="char-code"><code>\00B9</code></td>
                <td class="char-descr">superscript one = superscript digit one</td>
            </tr>
            <tr>
                <td class="char-demo">&sup2;</td>
                <td class="char-entity"><code>&amp;sup2;</code></td>
                <td class="char-code"><code>\00B2</code></td>
                <td class="char-descr">superscript two = superscript digit two = squared</td>
            </tr>
            <tr>
                <td class="char-demo">&sup3;</td>
                <td class="char-entity"><code>&amp;sup3;</code></td>
                <td class="char-code"><code>\00B3</code></td>
                <td class="char-descr">superscript three = superscript digit three = cubed</td>
            </tr>
            <tr>
                <td class="char-demo">&amp;</td>
                <td class="char-entity"><code>&amp;amp;</code></td>
                <td class="char-code"><code>\0026</code></td>
                <td class="char-descr">ampersand</td>
            </tr>
            <tr>
                <td class="char-demo">&sim;</td>
                <td class="char-entity"><code>&amp;sim;</code></td>
                <td class="char-code"><code>\223C</code></td>
                <td class="char-descr">tilde operator = varies with = similar to</td>
            </tr>
            <tr>
                <td class="char-demo">&and;</td>
                <td class="char-entity"><code>&amp;and;</code></td>
                <td class="char-code"><code>\2227</code></td>
                <td class="char-descr">logical and = wedge</td>
            </tr>
            <tr>
                <td class="char-demo">&or;</td>
                <td class="char-entity"><code>&amp;or;</code></td>
                <td class="char-code"><code>\2228</code></td>
                <td class="char-descr">logical or = vee</td>
            </tr>
            <tr>
                <td class="char-demo">&not;</td>
                <td class="char-entity"><code>&amp;not;</code></td>
                <td class="char-code"><code>\00AC</code></td>
                <td class="char-descr">not sign</td>
            </tr>
            <tr>
                <td class="char-demo">&alefsym;</td>
                <td class="char-entity"><code>&amp;alefsym;</code></td>
                <td class="char-code"><code>\2135</code></td>
                <td class="char-descr">alef symbol = first transfinite cardinal</td>
            </tr>
            <tr>
                <td class="char-demo">&ang;</td>
                <td class="char-entity"><code>&amp;ang;</code></td>
                <td class="char-code"><code>\2220</code></td>
                <td class="char-descr">angle</td>
            </tr>
            <tr>
                <td class="char-demo">&cap;</td>
                <td class="char-entity"><code>&amp;cap;</code></td>
                <td class="char-code"><code>\2229</code></td>
                <td class="char-descr">intersection = cap</td>
            </tr>
            <tr>
                <td class="char-demo">&cup;</td>
                <td class="char-entity"><code>&amp;cup;</code></td>
                <td class="char-code"><code>\222A</code></td>
                <td class="char-descr">union = cup</td>
            </tr>
            <tr>
                <td class="char-demo">&sub;</td>
                <td class="char-entity"><code>&amp;sub;</code></td>
                <td class="char-code"><code>\2282</code></td>
                <td class="char-descr">subset of</td>
            </tr>
            <tr>
                <td class="char-demo">&sube;</td>
                <td class="char-entity"><code>&amp;sube;</code></td>
                <td class="char-code"><code>\2286</code></td>
                <td class="char-descr">subset of or equal to</td>
            </tr>
            <tr>
                <td class="char-demo">&sup;</td>
                <td class="char-entity"><code>&amp;sup;</code></td>
                <td class="char-code"><code>\2283</code></td>
                <td class="char-descr">superset of</td>
            </tr>
            <tr>
                <td class="char-demo">&supe;</td>
                <td class="char-entity"><code>&amp;supe;</code></td>
                <td class="char-code"><code>\2287</code></td>
                <td class="char-descr">superset of or equal to</td>
            </tr>
            <tr>
                <td class="char-demo">&ni;</td>
                <td class="char-entity"><code>&amp;ni;</code></td>
                <td class="char-code"><code>\220B</code></td>
                <td class="char-descr">contains as member</td>
            </tr>
            <tr>
                <td class="char-demo">&isin;</td>
                <td class="char-entity"><code>&amp;isin;</code></td>
                <td class="char-code"><code>\2208</code></td>
                <td class="char-descr">element of</td>
            </tr>
            <tr>
                <td class="char-demo">&notin;</td>
                <td class="char-entity"><code>&amp;notin;</code></td>
                <td class="char-code"><code>\2209</code></td>
                <td class="char-descr">not an element of</td>
            </tr>
            <tr>
                <td class="char-demo">&nsub;</td>
                <td class="char-entity"><code>&amp;nsub;</code></td>
                <td class="char-code"><code>\2284</code></td>
                <td class="char-descr">not a subset of</td>
            </tr>
            <tr>
                <td class="char-demo">&exist;</td>
                <td class="char-entity"><code>&amp;exist;</code></td>
                <td class="char-code"><code>\2203</code></td>
                <td class="char-descr">there exists</td>
            </tr>
            <tr>
                <td class="char-demo">&fnof;</td>
                <td class="char-entity"><code>&amp;fnof;</code></td>
                <td class="char-code"><code>\0192</code></td>
                <td class="char-descr">latin small f with hook = function = florin</td>
            </tr>
            <tr>
                <td class="char-demo">&forall;</td>
                <td class="char-entity"><code>&amp;forall;</code></td>
                <td class="char-code"><code>\2200</code></td>
                <td class="char-descr">for all</td>
            </tr>
            <tr>
                <td class="char-demo">&infin;</td>
                <td class="char-entity"><code>&amp;infin;</code></td>
                <td class="char-code"><code>\221E</code></td>
                <td class="char-descr">infinity</td>
            </tr>
            <tr>
                <td class="char-demo">&int;</td>
                <td class="char-entity"><code>&amp;int;</code></td>
                <td class="char-code"><code>\222B</code></td>
                <td class="char-descr">integral</td>
            </tr>
            <tr>
                <td class="char-demo">&lowast;</td>
                <td class="char-entity"><code>&amp;lowast;</code></td>
                <td class="char-code"><code>\2217</code></td>
                <td class="char-descr">asterisk operator</td>
            </tr>
            <tr>
                <td class="char-demo">&micro;</td>
                <td class="char-entity"><code>&amp;micro;</code></td>
                <td class="char-code"><code>\00B5</code></td>
                <td class="char-descr">micro sign</td>
            </tr>
            <tr>
                <td class="char-demo">&nabla;</td>
                <td class="char-entity"><code>&amp;nabla;</code></td>
                <td class="char-code"><code>\2207</code></td>
                <td class="char-descr">nabla = backward difference</td>
            </tr>
            <tr>
                <td class="char-demo">&part;</td>
                <td class="char-entity"><code>&amp;part;</code></td>
                <td class="char-code"><code>\2202</code></td>
                <td class="char-descr">partial differential</td>
            </tr>
            <tr>
                <td class="char-demo">&perp;</td>
                <td class="char-entity"><code>&amp;perp;</code></td>
                <td class="char-code"><code>\22A5</code></td>
                <td class="char-descr">up tack = orthogonal to = perpendicular</td>
            </tr>
            <tr>
                <td class="char-demo">&prod;</td>
                <td class="char-entity"><code>&amp;prod;</code></td>
                <td class="char-code"><code>\220F</code></td>
                <td class="char-descr">n-ary product = product sign</td>
            </tr>
            <tr>
                <td class="char-demo">&prop;</td>
                <td class="char-entity"><code>&amp;prop;</code></td>
                <td class="char-code"><code>\221D</code></td>
                <td class="char-descr">proportional to</td>
            </tr>
            <tr>
                <td class="char-demo">&radic;</td>
                <td class="char-entity"><code>&amp;radic;</code></td>
                <td class="char-code"><code>\221A</code></td>
                <td class="char-descr">square root = radical sign</td>
            </tr>
            <tr>
                <td class="char-demo">&sdot;</td>
                <td class="char-entity"><code>&amp;sdot;</code></td>
                <td class="char-code"><code>\22C5</code></td>
                <td class="char-descr">dot operator</td>
            </tr>
            <tr>
                <td class="char-demo">&sum;</td>
                <td class="char-entity"><code>&amp;sum;</code></td>
                <td class="char-code"><code>\2211</code></td>
                <td class="char-descr">n-ary sumation</td>
            </tr>
            <tr>
                <td class="char-demo">&empty;</td>
                <td class="char-entity"><code>&amp;empty;</code></td>
                <td class="char-code"><code>\2205</code></td>
                <td class="char-descr">empty set = null set = diameter</td>
            </tr>
            <tr>
                <td class="char-demo">&oplus;</td>
                <td class="char-entity"><code>&amp;oplus;</code></td>
                <td class="char-code"><code>\2295</code></td>
                <td class="char-descr">circled plus = direct sum</td>
            </tr>
            <tr>
                <td class="char-demo">&otimes;</td>
                <td class="char-entity"><code>&amp;otimes;</code></td>
                <td class="char-code"><code>\2297</code></td>
                <td class="char-descr">circled times = vector product</td>
            </tr>
            <tr>
                <td class="char-demo">&there4;</td>
                <td class="char-entity"><code>&amp;there4;</code></td>
                <td class="char-code"><code>\2234</code></td>
                <td class="char-descr">therefore</td>
            </tr>
            <tr>
                <td class="char-demo">&lang;</td>
                <td class="char-entity"><code>&amp;lang;</code></td>
                <td class="char-code"><code>\2329</code></td>
                <td class="char-descr">left-pointing angle bracket = bra</td>
            </tr>
            <tr>
                <td class="char-demo">&rang;</td>
                <td class="char-entity"><code>&amp;rang;</code></td>
                <td class="char-code"><code>\232A</code></td>
                <td class="char-descr">right-pointing angle bracket = ket</td>
            </tr>
            <tr>
                <td class="char-demo">&lceil;</td>
                <td class="char-entity"><code>&amp;lceil;</code></td>
                <td class="char-code"><code>\2308</code></td>
                <td class="char-descr">left ceiling = apl upstile</td>
            </tr>
            <tr>
                <td class="char-demo">&lfloor;</td>
                <td class="char-entity"><code>&amp;lfloor;</code></td>
                <td class="char-code"><code>\230A</code></td>
                <td class="char-descr">left floor = apl downstile</td>
            </tr>
            <tr>
                <td class="char-demo">&rceil;</td>
                <td class="char-entity"><code>&amp;rceil;</code></td>
                <td class="char-code"><code>\2309</code></td>
                <td class="char-descr">right ceiling</td>
            </tr>
            <tr>
                <td class="char-demo">&rfloor;</td>
                <td class="char-entity"><code>&amp;rfloor;</code></td>
                <td class="char-code"><code>\230B</code></td>
                <td class="char-descr">right floor</td>
            </tr>

            <tr class="ch-section" id="currency">
                <th colspan="4">
                    Знаки валют
                </th>
            </tr>

            <tr>
                <td class="char-demo">&curren;</td>
                <td class="char-entity"><code>&amp;curren;</code></td>
                <td class="char-code"><code>\00A4</code></td>
                <td class="char-descr">currency sign</td>
            </tr>
            <tr>
                <td class="char-demo">&cent;</td>
                <td class="char-entity"><code>&amp;cent;</code></td>
                <td class="char-code"><code>\00A2</code></td>
                <td class="char-descr">cent sign</td>
            </tr>
            <tr>
                <td class="char-demo">&euro;</td>
                <td class="char-entity"><code>&amp;euro;</code></td>
                <td class="char-code"><code>\20AC</code></td>
                <td class="char-descr">euro sign</td>
            </tr>
            <tr>
                <td class="char-demo">&pound;</td>
                <td class="char-entity"><code>&amp;pound;</code></td>
                <td class="char-code"><code>\00A3</code></td>
                <td class="char-descr">pound sign</td>
            </tr>
            <tr>
                <td class="char-demo">&yen;</td>
                <td class="char-entity"><code>&amp;yen;</code></td>
                <td class="char-code"><code>\00A5</code></td>
                <td class="char-descr">yen sign = yuan sign</td>
            </tr>

            <tr class="ch-section" id="other">
                <th colspan="4">
                    Прочие символы
                </th>
            </tr>

            <tr>
                <td class="char-demo">&copy;</td>
                <td class="char-entity"><code>&amp;copy;</code></td>
                <td class="char-code"><code>\00A9</code></td>
                <td class="char-descr">copyright sign</td>
            </tr>
            <tr>
                <td class="char-demo">&trade;</td>
                <td class="char-entity"><code>&amp;trade;</code></td>
                <td class="char-code"><code>\2122</code></td>
                <td class="char-descr">trade mark sign</td>
            </tr>
            <tr>
                <td class="char-demo">&reg;</td>
                <td class="char-entity"><code>&amp;reg;</code></td>
                <td class="char-code"><code>\00AE</code></td>
                <td class="char-descr">registered sign = registered trade mark sign</td>
            </tr>
            <tr>
                <td class="char-demo">&sect;</td>
                <td class="char-entity"><code>&amp;sect;</code></td>
                <td class="char-code"><code>\00A7</code></td>
                <td class="char-descr">section sign</td>
            </tr>
            <tr>
                <td class="char-demo">&brvbar;</td>
                <td class="char-entity"><code>&amp;brvbar;</code></td>
                <td class="char-code"><code>\00A6</code></td>
                <td class="char-descr">broken bar = broken vertical bar</td>
            </tr>
            <tr>
                <td class="char-demo">&dagger;</td>
                <td class="char-entity"><code>&amp;dagger;</code></td>
                <td class="char-code"><code>\2020</code></td>
                <td class="char-descr">dagger</td>
            </tr>
            <tr>
                <td class="char-demo">&Dagger;</td>
                <td class="char-entity"><code>&amp;Dagger;</code></td>
                <td class="char-code"><code>\2021</code></td>
                <td class="char-descr">double dagger</td>
            </tr>
            <tr>
                <td class="char-demo">&image;</td>
                <td class="char-entity"><code>&amp;image;</code></td>
                <td class="char-code"><code>\2111</code></td>
                <td class="char-descr">blackletter capital I = imaginary part</td>
            </tr>
            <tr>
                <td class="char-demo">&real;</td>
                <td class="char-entity"><code>&amp;real;</code></td>
                <td class="char-code"><code>\211C</code></td>
                <td class="char-descr">blackletter capital R = real part symbol</td>
            </tr>
            <tr>
                <td class="char-demo">&weierp;</td>
                <td class="char-entity"><code>&amp;weierp;</code></td>
                <td class="char-code"><code>\2118</code></td>
                <td class="char-descr">script capital P = power set = Weierstrass p</td>
            </tr>
            <tr>
                <td class="char-demo">&oline;</td>
                <td class="char-entity"><code>&amp;oline;</code></td>
                <td class="char-code"><code>\203E</code></td>
                <td class="char-descr">overline = spacing overscore</td>
            </tr>
            <tr>
                <td class="char-demo">&ordf;</td>
                <td class="char-entity"><code>&amp;ordf;</code></td>
                <td class="char-code"><code>\00AA</code></td>
                <td class="char-descr">feminine ordinal indicator</td>
            </tr>
            <tr>
                <td class="char-demo">&ordm;</td>
                <td class="char-entity"><code>&amp;ordm;</code></td>
                <td class="char-code"><code>\00BA</code></td>
                <td class="char-descr">masculine ordinal indicator</td>
            </tr>
            <tr>
                <td class="char-demo">&para;</td>
                <td class="char-entity"><code>&amp;para;</code></td>
                <td class="char-code"><code>\00B6</code></td>
                <td class="char-descr">pilcrow sign = paragraph sign</td>
            </tr>
            <tr>
                <td class="char-demo">&permil;</td>
                <td class="char-entity"><code>&amp;permil;</code></td>
                <td class="char-code"><code>\2030</code></td>
                <td class="char-descr">per mille sign</td>
            </tr>
            <tr>
                <td class="char-demo">&shy;</td>
                <td class="char-entity"><code>&amp;shy;</code></td>
                <td class="char-code"><code>\00AD</code></td>
                <td class="char-descr">soft hyphen = discretionary hyphen</td>
            </tr>
            <tr>
                <td class="char-demo">&lrm;‎</td>
                <td class="char-entity"><code>&amp;lrm;‎</code></td>
                <td class="char-code"><code>\200E</code></td>
                <td class="char-descr">left-to-right mark (for formatting only)</td>
            </tr>
            <tr>
                <td class="char-demo">&rlm;‏</td>
                <td class="char-entity"><code>&amp;rlm;‏</code></td>
                <td class="char-code"><code>\200F</code></td>
                <td class="char-descr">right-to-left mark (for formatting only)</td>
            </tr>

            <tr class="ch-section" id="greek">
                <th colspan="4">
                    Греческий алфавит
                </th>
            </tr>

            <tr>
                <td class="char-demo">&Alpha;</td>
                <td class="char-entity"><code>&amp;Alpha;</code></td>
                <td class="char-code"><code>\0391</code></td>
                <td class="char-descr">greek capital letter alpha</td>
            </tr>
            <tr>
                <td class="char-demo">&alpha;</td>
                <td class="char-entity"><code>&amp;alpha;</code></td>
                <td class="char-code"><code>\03B1</code></td>
                <td class="char-descr">greek small letter alpha</td>
            </tr>
            <tr>
                <td class="char-demo">&Beta;</td>
                <td class="char-entity"><code>&amp;Beta;</code></td>
                <td class="char-code"><code>\0392</code></td>
                <td class="char-descr">greek capital letter beta</td>
            </tr>
            <tr>
                <td class="char-demo">&beta;</td>
                <td class="char-entity"><code>&amp;beta;</code></td>
                <td class="char-code"><code>\03B2</code></td>
                <td class="char-descr">greek small letter beta</td>
            </tr>
            <tr>
                <td class="char-demo">&Gamma;</td>
                <td class="char-entity"><code>&amp;Gamma;</code></td>
                <td class="char-code"><code>\0393</code></td>
                <td class="char-descr">greek capital letter gamma</td>
            </tr>
            <tr>
                <td class="char-demo">&gamma;</td>
                <td class="char-entity"><code>&amp;gamma;</code></td>
                <td class="char-code"><code>\03B3</code></td>
                <td class="char-descr">greek small letter gamma</td>
            </tr>
            <tr>
                <td class="char-demo">&Delta;</td>
                <td class="char-entity"><code>&amp;Delta;</code></td>
                <td class="char-code"><code>\0394</code></td>
                <td class="char-descr">greek capital letter delta</td>
            </tr>
            <tr>
                <td class="char-demo">&delta;</td>
                <td class="char-entity"><code>&amp;delta;</code></td>
                <td class="char-code"><code>\03B4</code></td>
                <td class="char-descr">greek small letter delta</td>
            </tr>
            <tr>
                <td class="char-demo">&Epsilon;</td>
                <td class="char-entity"><code>&amp;Epsilon;</code></td>
                <td class="char-code"><code>\0395</code></td>
                <td class="char-descr">greek capital letter epsilon</td>
            </tr>
            <tr>
                <td class="char-demo">&epsilon;</td>
                <td class="char-entity"><code>&amp;epsilon;</code></td>
                <td class="char-code"><code>\03B5</code></td>
                <td class="char-descr">greek small letter epsilon</td>
            </tr>
            <tr>
                <td class="char-demo">&Zeta;</td>
                <td class="char-entity"><code>&amp;Zeta;</code></td>
                <td class="char-code"><code>\0396</code></td>
                <td class="char-descr">greek capital letter zeta</td>
            </tr>
            <tr>
                <td class="char-demo">&zeta;</td>
                <td class="char-entity"><code>&amp;zeta;</code></td>
                <td class="char-code"><code>\03B6</code></td>
                <td class="char-descr">greek small letter zeta</td>
            </tr>
            <tr>
                <td class="char-demo">&Eta;</td>
                <td class="char-entity"><code>&amp;Eta;</code></td>
                <td class="char-code"><code>\0397</code></td>
                <td class="char-descr">greek capital letter eta</td>
            </tr>
            <tr>
                <td class="char-demo">&eta;</td>
                <td class="char-entity"><code>&amp;eta;</code></td>
                <td class="char-code"><code>\03B7</code></td>
                <td class="char-descr">greek small letter eta</td>
            </tr>
            <tr>
                <td class="char-demo">&Theta;</td>
                <td class="char-entity"><code>&amp;Theta;</code></td>
                <td class="char-code"><code>\0398</code></td>
                <td class="char-descr">greek capital letter theta</td>
            </tr>
            <tr>
                <td class="char-demo">&theta;</td>
                <td class="char-entity"><code>&amp;theta;</code></td>
                <td class="char-code"><code>\03B8</code></td>
                <td class="char-descr">greek small letter theta</td>
            </tr>
            <tr>
                <td class="char-demo">&thetasym;</td>
                <td class="char-entity"><code>&amp;thetasym;</code></td>
                <td class="char-code"><code>\03D1</code></td>
                <td class="char-descr">greek small letter theta symbol</td>
            </tr>
            <tr>
                <td class="char-demo">&Iota;</td>
                <td class="char-entity"><code>&amp;Iota;</code></td>
                <td class="char-code"><code>\0399</code></td>
                <td class="char-descr">greek capital letter iota</td>
            </tr>
            <tr>
                <td class="char-demo">&iota;</td>
                <td class="char-entity"><code>&amp;iota;</code></td>
                <td class="char-code"><code>\03B9</code></td>
                <td class="char-descr">greek small letter iota</td>
            </tr>
            <tr>
                <td class="char-demo">&Kappa;</td>
                <td class="char-entity"><code>&amp;Kappa;</code></td>
                <td class="char-code"><code>\039A</code></td>
                <td class="char-descr">greek capital letter kappa</td>
            </tr>
            <tr>
                <td class="char-demo">&kappa;</td>
                <td class="char-entity"><code>&amp;kappa;</code></td>
                <td class="char-code"><code>\03BA</code></td>
                <td class="char-descr">greek small letter kappa</td>
            </tr>
            <tr>
                <td class="char-demo">&Lambda;</td>
                <td class="char-entity"><code>&amp;Lambda;</code></td>
                <td class="char-code"><code>\039B</code></td>
                <td class="char-descr">greek capital letter lambda</td>
            </tr>
            <tr>
                <td class="char-demo">&lambda;</td>
                <td class="char-entity"><code>&amp;lambda;</code></td>
                <td class="char-code"><code>\03BB</code></td>
                <td class="char-descr">greek small letter lambda</td>
            </tr>
            <tr>
                <td class="char-demo">&Mu;</td>
                <td class="char-entity"><code>&amp;Mu;</code></td>
                <td class="char-code"><code>\039C</code></td>
                <td class="char-descr">greek capital letter mu</td>
            </tr>
            <tr>
                <td class="char-demo">&mu;</td>
                <td class="char-entity"><code>&amp;mu;</code></td>
                <td class="char-code"><code>\03BC</code></td>
                <td class="char-descr">greek small letter mu</td>
            </tr>
            <tr>
                <td class="char-demo">&Nu;</td>
                <td class="char-entity"><code>&amp;Nu;</code></td>
                <td class="char-code"><code>\039D</code></td>
                <td class="char-descr">greek capital letter nu</td>
            </tr>
            <tr>
                <td class="char-demo">&nu;</td>
                <td class="char-entity"><code>&amp;nu;</code></td>
                <td class="char-code"><code>\03BD</code></td>
                <td class="char-descr">greek small letter nu</td>
            </tr>
            <tr>
                <td class="char-demo">&Xi;</td>
                <td class="char-entity"><code>&amp;Xi;</code></td>
                <td class="char-code"><code>\039E</code></td>
                <td class="char-descr">greek capital letter xi</td>
            </tr>
            <tr>
                <td class="char-demo">&xi;</td>
                <td class="char-entity"><code>&amp;xi;</code></td>
                <td class="char-code"><code>\03BE</code></td>
                <td class="char-descr">greek small letter xi</td>
            </tr>
            <tr>
                <td class="char-demo">&Omicron;</td>
                <td class="char-entity"><code>&amp;Omicron;</code></td>
                <td class="char-code"><code>\039F</code></td>
                <td class="char-descr">greek capital letter omicron</td>
            </tr>
            <tr>
                <td class="char-demo">&omicron;</td>
                <td class="char-entity"><code>&amp;omicron;</code></td>
                <td class="char-code"><code>\03BF</code></td>
                <td class="char-descr">greek small letter omicron</td>
            </tr>
            <tr>
                <td class="char-demo">&Pi;</td>
                <td class="char-entity"><code>&amp;Pi;</code></td>
                <td class="char-code"><code>\03A0</code></td>
                <td class="char-descr">greek capital letter pi</td>
            </tr>
            <tr>
                <td class="char-demo">&pi;</td>
                <td class="char-entity"><code>&amp;pi;</code></td>
                <td class="char-code"><code>\03C0</code></td>
                <td class="char-descr">greek small letter pi</td>
            </tr>
            <tr>
                <td class="char-demo">&piv;</td>
                <td class="char-entity"><code>&amp;piv;</code></td>
                <td class="char-code"><code>\03D6</code></td>
                <td class="char-descr">greek pi symbol</td>
            </tr>
            <tr>
                <td class="char-demo">&Rho;</td>
                <td class="char-entity"><code>&amp;Rho;</code></td>
                <td class="char-code"><code>\03A1</code></td>
                <td class="char-descr">greek capital letter rho</td>
            </tr>
            <tr>
                <td class="char-demo">&rho;</td>
                <td class="char-entity"><code>&amp;rho;</code></td>
                <td class="char-code"><code>\03C1</code></td>
                <td class="char-descr">greek small letter rho</td>
            </tr>
            <tr>
                <td class="char-demo">&Sigma;</td>
                <td class="char-entity"><code>&amp;Sigma;</code></td>
                <td class="char-code"><code>\03A3</code></td>
                <td class="char-descr">greek capital letter sigma</td>
            </tr>
            <tr>
                <td class="char-demo">&sigma;</td>
                <td class="char-entity"><code>&amp;sigma;</code></td>
                <td class="char-code"><code>\03C3</code></td>
                <td class="char-descr">greek small letter sigma</td>
            </tr>
            <tr>
                <td class="char-demo">&sigmaf;</td>
                <td class="char-entity"><code>&amp;sigmaf;</code></td>
                <td class="char-code"><code>\03C2</code></td>
                <td class="char-descr">greek small letter final sigma (note)</td>
            </tr>
            <tr>
                <td class="char-demo">&Tau;</td>
                <td class="char-entity"><code>&amp;Tau;</code></td>
                <td class="char-code"><code>\03A4</code></td>
                <td class="char-descr">greek capital letter tau</td>
            </tr>
            <tr>
                <td class="char-demo">&tau;</td>
                <td class="char-entity"><code>&amp;tau;</code></td>
                <td class="char-code"><code>\03C4</code></td>
                <td class="char-descr">greek small letter tau</td>
            </tr>
            <tr>
                <td class="char-demo">&Upsilon;</td>
                <td class="char-entity"><code>&amp;Upsilon;</code></td>
                <td class="char-code"><code>\03A5</code></td>
                <td class="char-descr">greek capital letter upsilon</td>
            </tr>
            <tr>
                <td class="char-demo">&upsilon;</td>
                <td class="char-entity"><code>&amp;upsilon;</code></td>
                <td class="char-code"><code>\03C5</code></td>
                <td class="char-descr">greek small letter upsilon</td>
            </tr>
            <tr>
                <td class="char-demo">&upsih;</td>
                <td class="char-entity"><code>&amp;upsih;</code></td>
                <td class="char-code"><code>\03D2</code></td>
                <td class="char-descr">greek upsilon with hook symbol</td>
            </tr>
            <tr>
                <td class="char-demo">&Phi;</td>
                <td class="char-entity"><code>&amp;Phi;</code></td>
                <td class="char-code"><code>\03A6</code></td>
                <td class="char-descr">greek capital letter phi</td>
            </tr>
            <tr>
                <td class="char-demo">&phi;</td>
                <td class="char-entity"><code>&amp;phi;</code></td>
                <td class="char-code"><code>\03C6</code></td>
                <td class="char-descr">greek small letter phi</td>
            </tr>
            <tr>
                <td class="char-demo">&Chi;</td>
                <td class="char-entity"><code>&amp;Chi;</code></td>
                <td class="char-code"><code>\03A7</code></td>
                <td class="char-descr">greek capital letter chi</td>
            </tr>
            <tr>
                <td class="char-demo">&chi;</td>
                <td class="char-entity"><code>&amp;chi;</code></td>
                <td class="char-code"><code>\03C7</code></td>
                <td class="char-descr">greek small letter chi</td>
            </tr>
            <tr>
                <td class="char-demo">&Psi;</td>
                <td class="char-entity"><code>&amp;Psi;</code></td>
                <td class="char-code"><code>\03A8</code></td>
                <td class="char-descr">greek capital letter psi</td>
            </tr>
            <tr>
                <td class="char-demo">&psi;</td>
                <td class="char-entity"><code>&amp;psi;</code></td>
                <td class="char-code"><code>\03C8</code></td>
                <td class="char-descr">greek small letter psi</td>
            </tr>
            <tr>
                <td class="char-demo">&Omega;</td>
                <td class="char-entity"><code>&amp;Omega;</code></td>
                <td class="char-code"><code>\03A9</code></td>
                <td class="char-descr">greek capital letter omega</td>
            </tr>
            <tr>
                <td class="char-demo">&omega;</td>
                <td class="char-entity"><code>&amp;omega;</code></td>
                <td class="char-code"><code>\03C9</code></td>
                <td class="char-descr">greek small letter omega</td>
            </tr>

            <tr class="ch-section" id="diacritics">
                <th colspan="4">
                    Диакритические знаки
                </th>
            </tr>

            <tr>
                <td class="char-demo">&acute;</td>
                <td class="char-entity"><code>&amp;acute;</code></td>
                <td class="char-code"><code>\00B4</code></td>
                <td class="char-descr">acute accent = spacing acute</td>
            </tr>
            <tr>
                <td class="char-demo">&cedil;</td>
                <td class="char-entity"><code>&amp;cedil;</code></td>
                <td class="char-code"><code>\00B8</code></td>
                <td class="char-descr">cedilla = spacing cedilla</td>
            </tr>
            <tr>
                <td class="char-demo">&circ;</td>
                <td class="char-entity"><code>&amp;circ;</code></td>
                <td class="char-code"><code>\02C6</code></td>
                <td class="char-descr">modifier letter circumflex accent</td>
            </tr>
            <tr>
                <td class="char-demo">&macr;</td>
                <td class="char-entity"><code>&amp;macr;</code></td>
                <td class="char-code"><code>\00AF</code></td>
                <td class="char-descr">macron = spacing macron = overline = APL overbar</td>
            </tr>
            <tr>
                <td class="char-demo">&middot;</td>
                <td class="char-entity"><code>&amp;middot;</code></td>
                <td class="char-code"><code>\00B7</code></td>
                <td class="char-descr">middle dot = Georgian comma = Greek middle dot</td>
            </tr>
            <tr>
                <td class="char-demo">&tilde;</td>
                <td class="char-entity"><code>&amp;tilde;</code></td>
                <td class="char-code"><code>\02DC</code></td>
                <td class="char-descr">small tilde</td>
            </tr>
            <tr>
                <td class="char-demo">&uml;</td>
                <td class="char-entity"><code>&amp;uml;</code></td>
                <td class="char-code"><code>\00A8</code></td>
                <td class="char-descr">diaeresis = spacing diaeresis</td>
            </tr>

            <tr class="ch-section" id="latin">
                <th colspan="4">
                    Латиница с диакритическими знаками
                </th>
            </tr>

            <tr>
                <td class="char-demo">&Aacute;</td>
                <td class="char-entity"><code>&amp;Aacute;</code></td>
                <td class="char-code"><code>\00C1</code></td>
                <td class="char-descr">latin capital letter A with acute</td>
            </tr>
            <tr>
                <td class="char-demo">&aacute;</td>
                <td class="char-entity"><code>&amp;aacute;</code></td>
                <td class="char-code"><code>\00E1</code></td>
                <td class="char-descr">latin small letter a with acute</td>
            </tr>
            <tr>
                <td class="char-demo">&Acirc;</td>
                <td class="char-entity"><code>&amp;Acirc;</code></td>
                <td class="char-code"><code>\00C2</code></td>
                <td class="char-descr">latin capital letter A with circumflex</td>
            </tr>
            <tr>
                <td class="char-demo">&acirc;</td>
                <td class="char-entity"><code>&amp;acirc;</code></td>
                <td class="char-code"><code>\00E2</code></td>
                <td class="char-descr">latin small letter a with circumflex</td>
            </tr>
            <tr>
                <td class="char-demo">&AElig;</td>
                <td class="char-entity"><code>&amp;AElig;</code></td>
                <td class="char-code"><code>\00C6</code></td>
                <td class="char-descr">latin capital letter AE = latin capital ligature AE</td>
            </tr>
            <tr>
                <td class="char-demo">&aelig;</td>
                <td class="char-entity"><code>&amp;aelig;</code></td>
                <td class="char-code"><code>\00E6</code></td>
                <td class="char-descr">latin small letter ae = latin small ligature ae</td>
            </tr>
            <tr>
                <td class="char-demo">&Agrave;</td>
                <td class="char-entity"><code>&amp;Agrave;</code></td>
                <td class="char-code"><code>\00C0</code></td>
                <td class="char-descr">latin capital letter A with grave = latin capital letter A grave</td>
            </tr>
            <tr>
                <td class="char-demo">&agrave;</td>
                <td class="char-entity"><code>&amp;agrave;</code></td>
                <td class="char-code"><code>\00E0</code></td>
                <td class="char-descr">latin small letter a with grave = latin small letter a grave</td>
            </tr>
            <tr>
                <td class="char-demo">&Aring;</td>
                <td class="char-entity"><code>&amp;Aring;</code></td>
                <td class="char-code"><code>\00C5</code></td>
                <td class="char-descr">latin capital letter A with ring above = latin capital letter A ring</td>
            </tr>
            <tr>
                <td class="char-demo">&aring;</td>
                <td class="char-entity"><code>&amp;aring;</code></td>
                <td class="char-code"><code>\00E5</code></td>
                <td class="char-descr">latin small letter a with ring above = latin small letter a ring</td>
            </tr>
            <tr>
                <td class="char-demo">&Atilde;</td>
                <td class="char-entity"><code>&amp;Atilde;</code></td>
                <td class="char-code"><code>\00C3</code></td>
                <td class="char-descr">latin capital letter A with tilde</td>
            </tr>
            <tr>
                <td class="char-demo">&atilde;</td>
                <td class="char-entity"><code>&amp;atilde;</code></td>
                <td class="char-code"><code>\00E3</code></td>
                <td class="char-descr">latin small letter a with tilde</td>
            </tr>
            <tr>
                <td class="char-demo">&Auml;</td>
                <td class="char-entity"><code>&amp;Auml;</code></td>
                <td class="char-code"><code>\00C4</code></td>
                <td class="char-descr">latin capital letter A with diaeresis</td>
            </tr>
            <tr>
                <td class="char-demo">&auml;</td>
                <td class="char-entity"><code>&amp;auml;</code></td>
                <td class="char-code"><code>\00E4</code></td>
                <td class="char-descr">latin small letter a with diaeresis</td>
            </tr>
            <tr>
                <td class="char-demo">&Ccedil;</td>
                <td class="char-entity"><code>&amp;Ccedil;</code></td>
                <td class="char-code"><code>\00C7</code></td>
                <td class="char-descr">latin capital letter C with cedilla</td>
            </tr>
            <tr>
                <td class="char-demo">&ccedil;</td>
                <td class="char-entity"><code>&amp;ccedil;</code></td>
                <td class="char-code"><code>\00E7</code></td>
                <td class="char-descr">latin small letter c with cedilla</td>
            </tr>
            <tr>
                <td class="char-demo">&Eacute;</td>
                <td class="char-entity"><code>&amp;Eacute;</code></td>
                <td class="char-code"><code>\00C9</code></td>
                <td class="char-descr">latin capital letter E with acute</td>
            </tr>
            <tr>
                <td class="char-demo">&eacute;</td>
                <td class="char-entity"><code>&amp;eacute;</code></td>
                <td class="char-code"><code>\00E9</code></td>
                <td class="char-descr">latin small letter e with acute</td>
            </tr>
            <tr>
                <td class="char-demo">&Ecirc;</td>
                <td class="char-entity"><code>&amp;Ecirc;</code></td>
                <td class="char-code"><code>\00CA</code></td>
                <td class="char-descr">latin capital letter E with circumflex</td>
            </tr>
            <tr>
                <td class="char-demo">&ecirc;</td>
                <td class="char-entity"><code>&amp;ecirc;</code></td>
                <td class="char-code"><code>\00EA</code></td>
                <td class="char-descr">latin small letter e with circumflex</td>
            </tr>
            <tr>
                <td class="char-demo">&Egrave;</td>
                <td class="char-entity"><code>&amp;Egrave;</code></td>
                <td class="char-code"><code>\00C8</code></td>
                <td class="char-descr">latin capital letter E with grave</td>
            </tr>
            <tr>
                <td class="char-demo">&egrave;</td>
                <td class="char-entity"><code>&amp;egrave;</code></td>
                <td class="char-code"><code>\00E8</code></td>
                <td class="char-descr">latin small letter e with grave</td>
            </tr>
            <tr>
                <td class="char-demo">&ETH;</td>
                <td class="char-entity"><code>&amp;ETH;</code></td>
                <td class="char-code"><code>\00D0</code></td>
                <td class="char-descr">latin capital letter ETH</td>
            </tr>
            <tr>
                <td class="char-demo">&eth;</td>
                <td class="char-entity"><code>&amp;eth;</code></td>
                <td class="char-code"><code>\00F0</code></td>
                <td class="char-descr">latin small letter eth</td>
            </tr>
            <tr>
                <td class="char-demo">&Euml;</td>
                <td class="char-entity"><code>&amp;Euml;</code></td>
                <td class="char-code"><code>\00CB</code></td>
                <td class="char-descr">latin capital letter E with diaeresis</td>
            </tr>
            <tr>
                <td class="char-demo">&euml;</td>
                <td class="char-entity"><code>&amp;euml;</code></td>
                <td class="char-code"><code>\00EB</code></td>
                <td class="char-descr">latin small letter e with diaeresis</td>
            </tr>
            <tr>
                <td class="char-demo">&Iacute;</td>
                <td class="char-entity"><code>&amp;Iacute;</code></td>
                <td class="char-code"><code>\00CD</code></td>
                <td class="char-descr">latin capital letter I with acute</td>
            </tr>
            <tr>
                <td class="char-demo">&iacute;</td>
                <td class="char-entity"><code>&amp;iacute;</code></td>
                <td class="char-code"><code>\00ED</code></td>
                <td class="char-descr">latin small letter i with acute</td>
            </tr>
            <tr>
                <td class="char-demo">&Icirc;</td>
                <td class="char-entity"><code>&amp;Icirc;</code></td>
                <td class="char-code"><code>\00CE</code></td>
                <td class="char-descr">latin capital letter I with circumflex</td>
            </tr>
            <tr>
                <td class="char-demo">&icirc;</td>
                <td class="char-entity"><code>&amp;icirc;</code></td>
                <td class="char-code"><code>\00EE</code></td>
                <td class="char-descr">latin small letter i with circumflex</td>
            </tr>
            <tr>
                <td class="char-demo">&Igrave;</td>
                <td class="char-entity"><code>&amp;Igrave;</code></td>
                <td class="char-code"><code>\00CC</code></td>
                <td class="char-descr">latin capital letter I with grave</td>
            </tr>
            <tr>
                <td class="char-demo">&igrave;</td>
                <td class="char-entity"><code>&amp;igrave;</code></td>
                <td class="char-code"><code>\00EC</code></td>
                <td class="char-descr">latin small letter i with grave</td>
            </tr>
            <tr>
                <td class="char-demo">&Iuml;</td>
                <td class="char-entity"><code>&amp;Iuml;</code></td>
                <td class="char-code"><code>\00CF</code></td>
                <td class="char-descr">latin capital letter I with diaeresis</td>
            </tr>
            <tr>
                <td class="char-demo">&iuml;</td>
                <td class="char-entity"><code>&amp;iuml;</code></td>
                <td class="char-code"><code>\00EF</code></td>
                <td class="char-descr">latin small letter i with diaeresis</td>
            </tr>
            <tr>
                <td class="char-demo">&Ntilde;</td>
                <td class="char-entity"><code>&amp;Ntilde;</code></td>
                <td class="char-code"><code>\00D1</code></td>
                <td class="char-descr">latin capital letter N with tilde</td>
            </tr>
            <tr>
                <td class="char-demo">&ntilde;</td>
                <td class="char-entity"><code>&amp;ntilde;</code></td>
                <td class="char-code"><code>\00F1</code></td>
                <td class="char-descr">latin small letter n with tilde</td>
            </tr>
            <tr>
                <td class="char-demo">&Oacute;</td>
                <td class="char-entity"><code>&amp;Oacute;</code></td>
                <td class="char-code"><code>\00D3</code></td>
                <td class="char-descr">latin capital letter O with acute</td>
            </tr>
            <tr>
                <td class="char-demo">&oacute;</td>
                <td class="char-entity"><code>&amp;oacute;</code></td>
                <td class="char-code"><code>\00F3</code></td>
                <td class="char-descr">latin small letter o with acute</td>
            </tr>
            <tr>
                <td class="char-demo">&Ocirc;</td>
                <td class="char-entity"><code>&amp;Ocirc;</code></td>
                <td class="char-code"><code>\00D4</code></td>
                <td class="char-descr">latin capital letter O with circumflex</td>
            </tr>
            <tr>
                <td class="char-demo">&ocirc;</td>
                <td class="char-entity"><code>&amp;ocirc;</code></td>
                <td class="char-code"><code>\00F4</code></td>
                <td class="char-descr">latin small letter o with circumflex</td>
            </tr>
            <tr>
                <td class="char-demo">&OElig;</td>
                <td class="char-entity"><code>&amp;OElig;</code></td>
                <td class="char-code"><code>\0152</code></td>
                <td class="char-descr">latin capital ligature OE</td>
            </tr>
            <tr>
                <td class="char-demo">&oelig;</td>
                <td class="char-entity"><code>&amp;oelig;</code></td>
                <td class="char-code"><code>\0153</code></td>
                <td class="char-descr">latin small ligature oe</td>
            </tr>
            <tr>
                <td class="char-demo">&Ograve;</td>
                <td class="char-entity"><code>&amp;Ograve;</code></td>
                <td class="char-code"><code>\00D2</code></td>
                <td class="char-descr">latin capital letter O with grave</td>
            </tr>
            <tr>
                <td class="char-demo">&ograve;</td>
                <td class="char-entity"><code>&amp;ograve;</code></td>
                <td class="char-code"><code>\00F2</code></td>
                <td class="char-descr">latin small letter o with grave</td>
            </tr>
            <tr>
                <td class="char-demo">&Oslash;</td>
                <td class="char-entity"><code>&amp;Oslash;</code></td>
                <td class="char-code"><code>\00D8</code></td>
                <td class="char-descr">latin capital letter O with stroke = latin capital letter O slash</td>
            </tr>
            <tr>
                <td class="char-demo">&oslash;</td>
                <td class="char-entity"><code>&amp;oslash;</code></td>
                <td class="char-code"><code>\00F8</code></td>
                <td class="char-descr">latin small letter o with stroke, = latin small letter o slash</td>
            </tr>
            <tr>
                <td class="char-demo">&Otilde;</td>
                <td class="char-entity"><code>&amp;Otilde;</code></td>
                <td class="char-code"><code>\00D5</code></td>
                <td class="char-descr">latin capital letter O with tilde</td>
            </tr>
            <tr>
                <td class="char-demo">&otilde;</td>
                <td class="char-entity"><code>&amp;otilde;</code></td>
                <td class="char-code"><code>\00F5</code></td>
                <td class="char-descr">latin small letter o with tilde</td>
            </tr>
            <tr>
                <td class="char-demo">&Ouml;</td>
                <td class="char-entity"><code>&amp;Ouml;</code></td>
                <td class="char-code"><code>\00D6</code></td>
                <td class="char-descr">latin capital letter O with diaeresis</td>
            </tr>
            <tr>
                <td class="char-demo">&ouml;</td>
                <td class="char-entity"><code>&amp;ouml;</code></td>
                <td class="char-code"><code>\00F6</code></td>
                <td class="char-descr">latin small letter o with diaeresis</td>
            </tr>
            <tr>
                <td class="char-demo">&Scaron;</td>
                <td class="char-entity"><code>&amp;Scaron;</code></td>
                <td class="char-code"><code>\0160</code></td>
                <td class="char-descr">latin capital letter S with caron</td>
            </tr>
            <tr>
                <td class="char-demo">&scaron;</td>
                <td class="char-entity"><code>&amp;scaron;</code></td>
                <td class="char-code"><code>\0161</code></td>
                <td class="char-descr">latin small letter s with caron</td>
            </tr>
            <tr>
                <td class="char-demo">&szlig;</td>
                <td class="char-entity"><code>&amp;szlig;</code></td>
                <td class="char-code"><code>\00DF</code></td>
                <td class="char-descr">latin small letter sharp s = ess-zed</td>
            </tr>
            <tr>
                <td class="char-demo">&THORN;</td>
                <td class="char-entity"><code>&amp;THORN;</code></td>
                <td class="char-code"><code>\00DE</code></td>
                <td class="char-descr">latin capital letter THORN</td>
            </tr>
            <tr>
                <td class="char-demo">&thorn;</td>
                <td class="char-entity"><code>&amp;thorn;</code></td>
                <td class="char-code"><code>\00FE</code></td>
                <td class="char-descr">latin small letter thorn</td>
            </tr>
            <tr>
                <td class="char-demo">&Uacute;</td>
                <td class="char-entity"><code>&amp;Uacute;</code></td>
                <td class="char-code"><code>\00DA</code></td>
                <td class="char-descr">latin capital letter U with acute</td>
            </tr>
            <tr>
                <td class="char-demo">&uacute;</td>
                <td class="char-entity"><code>&amp;uacute;</code></td>
                <td class="char-code"><code>\00FA</code></td>
                <td class="char-descr">latin small letter u with acute</td>
            </tr>
            <tr>
                <td class="char-demo">&Ucirc;</td>
                <td class="char-entity"><code>&amp;Ucirc;</code></td>
                <td class="char-code"><code>\00DB</code></td>
                <td class="char-descr">latin capital letter U with circumflex</td>
            </tr>
            <tr>
                <td class="char-demo">&ucirc;</td>
                <td class="char-entity"><code>&amp;ucirc;</code></td>
                <td class="char-code"><code>\00FB</code></td>
                <td class="char-descr">latin small letter u with circumflex</td>
            </tr>
            <tr>
                <td class="char-demo">&Ugrave;</td>
                <td class="char-entity"><code>&amp;Ugrave;</code></td>
                <td class="char-code"><code>\00D9</code></td>
                <td class="char-descr">latin capital letter U with grave</td>
            </tr>
            <tr>
                <td class="char-demo">&ugrave;</td>
                <td class="char-entity"><code>&amp;ugrave;</code></td>
                <td class="char-code"><code>\00F9</code></td>
                <td class="char-descr">latin small letter u with grave</td>
            </tr>
            <tr>
                <td class="char-demo">&Uuml;</td>
                <td class="char-entity"><code>&amp;Uuml;</code></td>
                <td class="char-code"><code>\00DC</code></td>
                <td class="char-descr">latin capital letter U with diaeresis</td>
            </tr>
            <tr>
                <td class="char-demo">&uuml;</td>
                <td class="char-entity"><code>&amp;uuml;</code></td>
                <td class="char-code"><code>\00FC</code></td>
                <td class="char-descr">latin small letter u with diaeresis</td>
            </tr>
            <tr>
                <td class="char-demo">&Yacute;</td>
                <td class="char-entity"><code>&amp;Yacute;</code></td>
                <td class="char-code"><code>\00DD</code></td>
                <td class="char-descr">latin capital letter Y with acute</td>
            </tr>
            <tr>
                <td class="char-demo">&yacute;</td>
                <td class="char-entity"><code>&amp;yacute;</code></td>
                <td class="char-code"><code>\00FD</code></td>
                <td class="char-descr">latin small letter y with acute</td>
            </tr>
            <tr>
                <td class="char-demo">&Yuml;</td>
                <td class="char-entity"><code>&amp;Yuml;</code></td>
                <td class="char-code"><code>\0178</code></td>
                <td class="char-descr">latin capital letter Y with diaeresis</td>
            </tr>
            <tr>
                <td class="char-demo">&yuml;</td>
                <td class="char-entity"><code>&amp;yuml;</code></td>
                <td class="char-code"><code>\00FF</code></td>
                <td class="char-descr">latin small letter y with diaeresis</td>
            </tr>
        </tbody>
    </table>
</div>]]>
				</content:encoded>
				<pubDate>Sun, 11 Mar 2012 00:00:00 GMT</pubDate>
				<guid>http://paulradzkov.com/2012/html-entities_and_utf_codes/</guid>
				<comments>http://paulradzkov.com/2012/html-entities_and_utf_codes/#comments</comments>
			</item>
		
			<item>
				<title>Нарезка в Photoshop — New Layer Based Slice</title>
				<link>http://paulradzkov.com/2012/photoshop_new_layer_based_slice/</link>
				<description></description>
				<content:encoded>
					<![CDATA[<p>Открыл для себя недавно полезную команду в фотошопе — меню «Layer» &rarr; «New Layer Based Slice», — которая создаёт слайс по границам выделенного слоя. В случае выделения нескольких слоёв, создает слайс по границам каждого слоя. Это в несколько раз ускоряется нарезку графики с тенями, свечением и контурами.</p>
<!-- cut -->
<figure>
    <img src="/2012/photoshop_new_layer_based_slice/Photoshop-New-Layer-Based-Slice.png" width="875" height="735" alt="New Layer Based Slice"/>
    <figcaption>Layer &rarr; New Layer Based Slice (Alt+L)+(Alt+B)</figcaption>
</figure>

<p>Раньше вырезать объекты с эффектами слоя, выступающими за его границы — тень (Drop Shadow), свечение (Outer Glow) или контур (Stroke), — было долго и неудобно. Инструмент Slice прилипает к границам самого слоя, а не к границам эффектов. Приходилось лезть в настройки эффекта и смотреть, на сколько пикселей распространяется свечение, или пипеткой искать место, где заканчивается тень. А потом устанавливать гайды, чтобы нарезать всё аккуратно. Жутко неудобно.</p>
<p>New Layer Based Slice захватывает и границы эффектов тоже. То, на что раньше требовалось до нескольких минут, можно сделать двумя нажатиями клавиш.</p>
<p>Для ускорения процесса нарезки на это действие можно повесить своё сочетание горячих клавиш, но лучше привыкнуть к двум стандартными сочетаниями: <kbd>(Alt+L)+(Alt+B)</kbd>.</p>
<figure>
    <img src="/2012/photoshop_new_layer_based_slice/Photoshop-Layer-with-Shadow.png" width="570" height="565" alt="Layer with Shadow"/>
    <figcaption>Слой со смещенной тенью шириной в 30px. Рамкой трансформации выделены границы самого слоя. Слайс создан по границам тени.</figcaption>
</figure>]]>
				</content:encoded>
				<pubDate>Wed, 22 Feb 2012 00:00:00 GMT</pubDate>
				<guid>http://paulradzkov.com/2012/photoshop_new_layer_based_slice/</guid>
				<comments>http://paulradzkov.com/2012/photoshop_new_layer_based_slice/#comments</comments>
			</item>
		
			<item>
				<title>Как перекрасить поля с автозаполнением в Google Chrome</title>
				<link>http://paulradzkov.com/2012/autocomplete/</link>
				<description></description>
				<content:encoded>
					<![CDATA[<p>В Google Chrome в user agent stylesheet для полей с автозаполнением прописан желтый фон (#FAFFBD) и черный цвет текста, причем оба правила усилены с помощью <code class="hljs-important">!important</code> и переопределить их в своей CSS нельзя. Но есть способы решить эту проблему обходными путями.</p>
<!-- cut -->
<p>В трекере описан этот <a href="http://code.google.com/p/chromium/issues/detail?id=46543">баг</a>, но <time datetime="2012-10-30">пока</time> решения нет.</p>
<p>Автозаполнение можно выключить с помощью <code class="hljs-tag"><span class="hljs-attribute">autocomplete</span>=<span class="hljs-value">&quot;off&quot;</span></code>:</p>
<pre class="highlight"><code class="hljs xml"><span class="hljs-tag">&lt;<span class="hljs-name">form</span> <span class="hljs-attr">action</span>=<span class="hljs-string">"…"</span> <span class="hljs-attr">method</span>=<span class="hljs-string">"post"</span> <span class="hljs-attr">autocomplete</span>=<span class="hljs-string">"off"</span>&gt;</span>
</code></pre>
<p><strong>Обновлено 30 октября 2012.</strong></p>
<figure>
    <img src="/2012/autocomplete/chrome-autocomplete-recolor.gif" width="998" height="659" alt="Жёлтые поля ввода можно перекрасить с помощью box-shadow"/>
    <figcaption>Жёлтые поля ввода можно перекрасить при помощи <code class="hljs-attribute">box-shadow</code></figcaption>
</figure>

<p>Поля c автокомплитом можно перекрасить при помощи трюка с <code class="hljs-attribute">box-shadow</code>:</p>
<pre class="highlight"><code class="hljs css"><span class="hljs-selector-tag">input</span><span class="hljs-selector-pseudo">:-webkit-autofill</span> {
    <span class="hljs-attribute">-webkit-box-shadow</span>: inset <span class="hljs-number">0</span> <span class="hljs-number">0</span> <span class="hljs-number">0</span> <span class="hljs-number">50px</span> white; <span class="hljs-comment">/* цвет вашего фона */</span>
    <span class="hljs-attribute">-webkit-text-fill-color</span>: black; <span class="hljs-comment">/* цвет текста */</span>
}
</code></pre>
<p>Если вы для <code class="hljs-pseudo">:focus</code> состояния задавали стили с использованием <code class="hljs-attribute">box-shadow</code>, то вам придется заново их переопределить:</p>
<pre class="highlight"><code class="hljs css"><span class="hljs-selector-tag">input</span><span class="hljs-selector-pseudo">:-webkit-autofill</span><span class="hljs-selector-pseudo">:focus</span> {
    <span class="hljs-attribute">-webkit-box-shadow</span>: <span class="hljs-number">0</span> <span class="hljs-number">0</span> <span class="hljs-number">5px</span> <span class="hljs-number">0</span>    blue,   <span class="hljs-comment">/* ваш box-shadow для :focus */</span>
                  inset <span class="hljs-number">0</span> <span class="hljs-number">0</span> <span class="hljs-number">0</span>   <span class="hljs-number">50px</span> white;  <span class="hljs-comment">/* цвет вашего фона */</span>
    <span class="hljs-attribute">-webkit-text-fill-color</span>: black;          <span class="hljs-comment">/* цвет текста */</span>
}
</code></pre>
<p>При помощи нескольких теней можно <a href="/demo/box-shadow_instead_gradient/">имитировать градиент</a>.</p>
]]>
				</content:encoded>
				<pubDate>Sun, 12 Feb 2012 00:00:00 GMT</pubDate>
				<guid>http://paulradzkov.com/2012/autocomplete/</guid>
				<comments>http://paulradzkov.com/2012/autocomplete/#comments</comments>
			</item>
		
	</channel>
</rss>
