• Smarty против XSLT

      Очень распространено заблуждение о том, что xslt — это сплошные тормоза, а smarty — наше всё. Отставим в сторону лаконичность синтаксиса смарти и удобство поддержки xslt, а устремим наш пристальный взор именно на скорость их работы.

      Рисовать мы будем нечто чуть более сложное чем «привет мир» — дерево. Это не даст нам использовать копипасту и заставит повторно использовать код для вывода узлов. Количество их пусть будет небольшим — 100 штук.

      Поехали!
    • Внедрение SVG изображений на страницу

        В простейшем случае svg-картинка внедряется следующим способом:
        <object type="image/svg+xml" data="pucture.svg">
        </object>

        Это работает везде, кроме ИЕ, который SVG изначально не поддерживает. Для него надо установить следующий плагин:
        download.adobe.com/pub/adobe/magic/svgviewer/win/3.x/3.03/en/SVGView.exe

        Его следует прописать в аттрибуте codebase. Тогда при заходе на страницу пользователю будет предложено установить его. Пара кликов, перезагрузка страницы, одобрение использования плагина на сайте, и можно наслаждаться поддержкой SVG графики.
        вырезанные откровенные сцены! спешите видеть!
      • Притча о шаблонах

           — Здравствуй *с широко развевающейся по лицу улыбкой* дружок.
           — Ваа! *с ярким блеском в широко распахнутых глазах* Тётя Ася приехала!
           — Да, и у меня есть для тебя новая сказка *присела и взяла малыша за руки* хочешь послушать?
           — Конечно! *слегка смутился и отвёл взгляд* Мне тут дядя такие страшные истории рассказывал…
           — Ну, надеюсь моя история тебя не испугает *потрепала его по волосам* Она должна научить тебя мыслить шаблонно.
           — Эээ? *лицо перекосилось от недопонимания* Это как?
           — М… сейчас узнаешь *подмигнула и взяла на ручки* Вот когда тебе нужно вставить переменные в строку — ты как поступишь?
           — Ну… *взял карандаш и чирканул на лежащей рядом бумажке* примерно так:
          var query= 'xxx'
          var resultCount= 512
          var message= 'По запросу <kbd>' + query + '</kbd> найдено страниц: ' + resultCount

           — Ты ничего не забыл? *победоносно подняла голову*
           — Да вроде нет… *уткнулся носом в код, ещё раз внимательно его проверяя*
           — Что, если пользователь введёт… *выдержала многозначительную паузу и добавила*
          какого же порева она там добавила?
        • Организация пакетов с помощью css-suki

            Стили и соответствующие им картинки группируются в однин модуль. Для каждого модуля — отдельная директория. Ссылки к картинкам задаются относительно родительской директории. Например, для модуля «pager» создаётся одноимённая директория, в которую кладётся один или несколько css с произвольным названием (например, с тем же — «pager.css»), рядом с ним картинка «pager-current_bg.png», ссылка к которой выглядит так "../page/pager-current_bg.png". Картинка из примера задаёт фон для элемента содержащего номер текущей страницы в пэйджере. Имена картинок складываются из имени элемента (pager-current, pager-next, pager-prev..), расположения картинки (bg, top, left, top-left, icon..) и модификаторов (hover, active, selected..), разделённых между собой подчёркиванием. Сложный пример: pager-next_icon_hover.png

            Группировка в модуль происходит по родству. Например, в модуле «text» могут содержаться стили для стандартных элементов гипертекста (em, strong, q..), в «form» — стили для элементов форм, в «table» — всё, что касается таблиц. Разметка выполняется как описано в статье про независимые элементы.

            Бонусом от этих шаманств является высокая степень независимости визуальных модулей друг от друга, что позволяет легко переносить их между проектами и пакетами не заботясь о порядке их подключения. Некоторые модули требуют подключения вначале (например, css-reset) — их можно именовать добавляя в начале цифру (например, «0_reset»).

            Как было упомянуто выше, модули собираются в пакеты — простой группировкой по директориям. Пакет конечному пользователю приходит одним файлом. Разработчик же может переключиться в режим загрузки всех css файлов по отдельности.
            Читать дальше →
          • Разметка независимыми элементами

              Развивая идею вёрстки независимыми блоками мы постепенно придём к вёрстке независимыми модулями, а пока остановимся подробней на сабже…

              Но сперва небольшое терминологическое отступление.

              Вёрстка страницы — процесс расположения элементов на странице в соответствии с дизайном.

              Вёрстка бывает:
              • Табличная. Страница представляет из себя одну большую таблицу с мелкими ячейками. Каждый элемент занимает несколько смежных ячеек образующих прямоугольную, не пересекающуюся с остальными, область.
              • Блочная. Страница делится на крупные блоки, те на более мелкие, и так далее до нужной степени детализации.
              • Слоёная. Элементы позиционируются абсолютно, независимо от расположения остальных элементов.
              Разметка текста — обогащение текста специальными машиночитаемыми условными обозначениями.
              Читать дальше →
            • Независимо перегружаемые свойства

                Стандартный механизм перегрузки свойств через методы __get и __set весьма не удобен для практического использования, однако с помощью него можно создать удобный dsl для работы со свойствами. Сразу же пример использования (тут и далее используется паттерн адаптивной типизации, с которым рекомендуется предваритильно ознакомиться):

                class Title extends ProtoObject {<br>    protected $_text= '';<br>    function set_text( $val ){<br>        return $this->aTitleString( $val );<br>    }<br>    function get_text( $val ){<br>        if( empty( $val ) ) return '[untitled]';<br>        return $val;<br>    }<br><br>    function aTitleString( $val ){<br>        aString( &$val );<br>        if( strlen( $val ) > 255 ) $val= substr( $val, 0, 252 ) . '...';<br>        return $val;<br>    }<br>}<br><br>$title= new Title;<br>$title->text= 123;<br>var_dump( $title->text ); // string(3) "123"<br>var_dump( $title->text( '' )->text() ); // string(10) "[untitled]"<br>echo $title;<br>// Title Object<br>// (<br>//     [_text:protected] =><br>// )

                Читать дальше →
              • Адаптивная типизация

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

                  Для чего вообще нужна типизация? Чтобы отлавливать появление ошибки как можно раньше, то есть как можно ближе к тому месту, где программист совершил оплошность, а не к тому, где она вызвала непоправимый сбой. Но вручную приводить типы — это слишком накладно, поэтому необходимо автоматическое приведение для совместимых друг с другом типов. Например, «строка не длиннее Х, содержащая только цифры» может быть однозначно преобразована «целое положительное число», и наоборот.

                  Многие языки не позволяют определять собственные типы. Некоторые языки это позволяют, но выразительных средств зачастую не хватает. Однако, можно опредлить набор функций, каждая из которых на вход принимает значение и на выходе гарантирует, что возвращённое ею значение удовлетворяет всем ограничениям. При этом она может попытаться преобразовать значение так, чтобы оно соответствовало ограничениям, а если ей это не удаётся — должна бросить исключение.

                  примеры, примеры, примеры
                • Аккорды с применением высоких технологий

                    Задача заверстать аппликатуру весьма не тривиальна и от того довольно интересна. Я тоже не устоял перед искушением решить её так как считаю правильным.

                    Помимо стандартных требований типа кроссбраузерности, масштабираемости, печатаемости и компактности, хотелось бы добиться также и возможности просто тупо скопировать аппликатуру и вставить её, например, в текстовый документ. То есть в текстовом виде аккорд должен иметь примерно следующий вид:

                    Am
                    O - - -
                    O F - -
                    O - R -
                    O - M -
                    O - - -
                    X - - -


                    O — открытая струна, X — приглушённая, остальные буквы обозначают пальцы.

                    ну и порево там дальше..
                  • Препроцессинг CSS на клиенте

                      Представьте, что вы пишете блогохостинг и хотите позволить авторам блогов менять свой дизайн. Картиночки там вставлять, цвета менять, пропорции регулировать… Представили? Если хорошо представили, то уже поняли, что без констант и формул в CSS тут не обойтись.

                      При блуждании по блогам не хотелось бы грузить все стили заново, что неизбежно при серверном вычислении значений, а хотелось бы грузить лишь минимальную разницу — так называемый скин.

                      Итого, нам нужно грузить в дополнение к данным страницы: скин с константами и стили с формулами. Только две клиентские технологии позволяют сделать это: JS и XSLT. Однако первую очень любят отключать, а вторую отключать просто нет смысла. Поэтому вынесем CSS в XSLT контейнер, а заодно и не забудем про технологию XHTML-инклудов.

                      а теперь о том как снималось это порно
                    • XML + CSS = счастье

                        Возрадуйтесь, дети мои, ибо пришёл я к вам с миром и богатыми дарами. Нет, я не принёс вам того, чего вы не видели. И даже не принёс того, чего вы не имели. От чистого сердца вручаю вам то, что всегда лежало у вас под ногами, но вы не замечали того, брезгливо перешагивая, пробегая мимо по своим, несомненно самым важным, делам.

                        Константы! Да, ваши чаяния достигли моих ушей, пробрались в глубины души и вырвали наружу эти прекрасные создания, позволяющие синхронно менять связанные значения в разных частях файла.

                        Примеси! Я же знаю, вы так устали без наследования. Приходится внедрять лишние классы в элементы или даже, переходить на тёмную сторону силы — копипастить по чёрному.

                        Отныне! Ваша душа будет чиста как у младенца. Руки в золоте как у царевичей. Дети послушными и приветливыми.

                        а теперь приступим к съёмкам порева