blok

Moikrug и hcard

Пару недель назад при помощи Сергея Белова удалось убедить команду «Моего круга» сделать в профиле пользователя hCard. Теперь у меня на сайте пользователи, авторизующиеся через «Мой круг», отображаются с юзерпиками и именем с фамилией.

К сожалению, пришлось отказаться от стороннего сервиса, который разбирает hCard (он не работает с кодировками отличными от UTF-8). Выкачал себе их библиотеку и чуть-чуть допилил (допилил не идеально и знаю где могут быть проблемы, но буду что-то трогать только если действительно с таким сочетанием столкнусь).

P.S. Хочу сказать очередное спасибо моему хостеру — фирме «Докер», когда библиотеке для парсинга hCard понадобился модуль tidy, они его очень быстро поставили.

35 комментариев

«Акын»: исходник

Кто там интересовался исходником шаблонизатора «Акын»? Я его выложил без всяких причёсываний. Это означает, что он частично завязан на мою архитектуру: вызов action, некоторые спецзначения. Так что если хочется просто посмотреть на код — welcome, а если использовать, то нужно сначала убрать оттуда специфические штуки.

4 комментария

Акын: блоки

Я тут, если помните, принялся описывать свой шаблонизатор «Акын», многие просили. Сейчас попробую продолжить. Итак, часть вторая: блоки.

Частые паттерны — скрыть целый блок разметки или повторить его несколько раз, решается в «Акыне» одной конструкцией: описанием блока. Что именно будет происходить с блоком, шаблон «не знает». Блок идентифицируется своим именем и описывается следующим образом:

<:имя>
Значение переменной: <b>{$var}</b><br />
</:имя>

В API шаблонизатора есть два метода-алиаса с именами iterate и show, которые в реальности полностью взаимозаменяемы и разделены только для наглядности (и, возможно, последующей оптимизации двух этих операций). На вход каждый метод принимает имя блока, с которым он будет работать. Важно помнить, что если к блоку не применить show или iterate, то его содержимое показано не будет.

Пусть блок, описанный выше, нужно повторить три раза, заменяя «var» каждый раз на определённый текст, вот как это выглядит в коде:

$t = rt::t('template');

for ($i = 0; $i<3; $i++) {
    $t->var = $i;
    $t->iterate('имя');
}
echo $t;

Чтобы просто показать содержимое этого блока можно вызвать $t->show(’имя’). Вложенные секции работают точно так же: нужно сначала проитерировать вложенную секцию, потом внешнюю. Уровень вложенности неограничен.

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

<$+шаблон>
<$+шаблон секция>

Конструкция предпроцессорная (обрабатывается первым проходом), т. е. все блоки, переменные и прочее будут включены в шаблон из которого она вызвана.

В следующий раз опишу actions, а так же дальнейшие планы. На этом описательная часть закончится, если по этой части не потребуются разъяснения.

27 комментариев

Blok и комментарии: часть IV

Взята последняя высота: теперь я беру юзерпики в том числе и из микроформата hCard, в итоге мой движок в комментариях понимает:

  • Gravatar — централизованный сервис юзерпиков
  • favatar — использование favicon сайта в качестве аватара
  • pavatar — формат для аватара сайта
  • аватары из «Ярушки»
  • аватары из «ЖЖ»
  • аватары, указанные в hCard
    Надо бы до конца «Акын» описать что ли…

21 комментарий

Akyn: синтаксис (переменные)

Как я уже писал, несколько дней назад я заменил шаблонизатор на своём сайте на новый. Вы просили, чтобы я рассказал как он устроен, я постараюсь. Сразу, едином наскоком у меня это сделать не получилось, поэтому я решил попробовать сделать это по частям. Начну с синтаксиса. Сразу скажу, что в будущем мне хотелось бы кое-что в нём изменить.

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

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

<!--имя секции-->
HTML-код секции
<!--/имя секции-->

Самое простое, что есть в шаблоне — переменные. Они записываются как {$name}. Переменная уникальна в своей секции или шаблоне (если шаблон без секций). Установить переменную можно присвоив шаблону свойство с её именем. У меня открытие шаблона сделано в глобальном toolkit и всё описанное выглядит вот так:

$t = rt::t('menu', 'меню сверху');
$t->link = '/';
echo $t;

В данном примере в секции «меню сверху» шаблона «menu» переменной link я присвоил значение ’/’. Шаблон выполнится при любом преобразовании объекта в string (например, когда я сделаю echo). Если переменной присвоить null, то атрибут тега, в котором она находится пропадёт. А если переменная входит в тег, то удалится сам тег. В следующем шаблоне, если я присвою переменной «hide» null, пропадёт тег «b» и атрибут title тега «a»:

<a href="/" title="{$hide}"><{$hide}b>текст<{$hide}/b>

Минимальная логика, которая есть в шаблоне на данный момент — возможность подстановки значения переменных из списка и отрицание переменной. Выглядит это вот так: {$var?value1?value2?value3}, значений valueN может быть сколько угодно, нумерация начинается с нуля, значения выбираются по номеру (для тех кто в теме — и по модулю длины выбираемой последовательности). Пустое значение считается null-значением, со всеми его свойствами, которые я рассмотрел выше.

Частный случай такой конструкции — конструкция {$!var}, которая на значение эквивалентное false вернёт пусто (не null), а на значение эквивалентное true — null.

Эта условная конструкция полезна шаблону тем, что позволяет сосредоточить максимум данных о шаблоне в самом шаблоне, например, в циклических конструкциях туда можно поместить имена стилей, которые должны применяться. Отрицание полезно в случаях подобных этому:

<{$hide}b><{$!hide}i>Текст<{$!hide>/i><{$hide}/b>

тут, в зависимости от состояния переменной hide, появится либо тег «b», либо «i».

Переменные подставляются в момент выполнения шаблона, так что иметь значение будет последнее выставленное значение.

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

44 комментария

Blok: akyn

Как-то проснулся в 4 ночи от того, что придумал неплохой шаблонизатор. Я его запрограммировал, он полежал две недели, а сегодня решил его прикрутить к своему блогу. Движок получился в два раза быстрее предыдущего (что, правда, всё равно не спасает от «провалов» у моего хостера, когда время генерации страницы поднимается с нормальных сотых или десятых до целых секунд) и обходится без разбора HTML. Что ещё хорошо — понятно куда его оптимизировать, есть запас.

Шаблонизатор называется (у Бирмана каждая строчка кода носит какое-то красивое название, чем я хуже?) «Акын», ибо, натурально, «что видит, то поёт». Плохо, что API пришлось серьёзно поменять, так что если что-то отвалится — пишите.

25 комментариев

Юзерпики на моём сайте

У меня на сайте, в комментариях широко используются юзерпики. Я уже неоднократно писал как я их показываю. Естественно, каждый сервис выдаёт юзерпики своего размера, у меня на сайте принят размер 41×41 пикселей. Ранее я ставил ширину и высоту картинки в 41 пиксель, многие неквадратные картинки искажались. Теперь этого не происходит, благодаря небольшому изменению CSS-файла:

.avatar { max-width: 41px; max-heigth; 41px }
.avatar, x\:* { max-width: auto; max-height: auto; zoom: expression(41 / Math.max(this.width, this.height)) }

Для всех браузеров, кроме IE выставлены максимальная ширина и высота картинки, в IE используется нестандартное свойство zoom, позволяющее масштабировать элемент.

13 комментариев

Аватары на сайте, OpenID, Pavatar.

Многие знают, что у меня на сайте поддерживается OpenID — удобная система, позволяющая использовать логин одного сайта на других сайтах без дополнительно регистрации. Система не новая, были и более ранние аналоги, мы с другими разработчиками популярного некогда движка блогов «Регистр» задумывались о такой, но так и не сделали.

Вкратце, предположим вы зарегистрировались на любой сайте, поддерживающем OpenID, к примеру, в той же «Яруше». Чтобы оставить комментарий у меня, вам достаточно написать адреса вашей страницы на ya.ru. Т. е. ваш адрес в каком-то сервисе, где вы зарегистрированы выступает логином у меня.

Просто адреса для идентификации — это скучно, на помощь приходят аватары, маленькие картинки, идентифицирующие пользователя. В комментариях у меня теперь поддерживаются: аватары ЖЖ, аватары Яруши, Gravatar и Pavatar.

Т. е. если вы используете адрес из ЖЖ или «Яруши», то мой сайт возьмёт аватару оттуда. Gravatar и Pavatar — это два решения проблемы единых аватаров на всех сайтах. Первый — централизованный, для идентификации используется ваш адрес e-mail (если ваш сервер OpenID его показывает), второй — децентрализованный и подходит, в основом, тем, кто имеет собственный блог.

Завести свой pavatar («Personal Avatar»), если у вас есть блог, очень просто. Самый простой способ — положить в корень сайта картинку pavatar.png. Картинка должна быть размером 80x80 пикселей, не более 4Кб. Есть два способа указать альтернативное расположение — HTTP-заголовок X-Pavatar с указанием полного пути до pavatar (включая http и имя домена) и задать его в HTML тегами

<link rel="pavatar" href="URL">

или

<link rel="pavatar" href="URL" />

Pavatar должен быть изображением в форматах JPEG, GIF или PNG.

57 комментариев

Внимание: сменилась навигация на сайте!

Итак, на сайте сменилась навигация (я постепенно двигаюсь по плану модификации сайта, времени только не хватает).

  • я выкинул календарь, до тех пор, пока не доделаю навигацию по месяцам
  • стрелки вернулись к прежней схеме: влево — в прошлое, вправо — в будущее (это самое важное)
  • поиск занял место в меню, лишившись отдельной страницы
  • на странице коментариев к заметке убрал стрелочку, назначение которой мало кто понимал
    Кроме того, ко мне вернулся Google Page Rank, ура. Яндекс, где мой тИЦ?

13 комментариев

Ссылки на английском-2

Многим по разным причинам не понравилась реализация выделения ссылок на английском. Попробуем другой вариант. Пока он работает под Internet Explorer, FireFox и Safari (и не работает под «Оперой», где нет поддержки custom cursor). Тестовый образец лежит у меня в «файлах», можно попробовать.

Так лучше?

21 комментарий

Линк на английские тексты

Линк на английские текст (7.19КиБ)

Сделал у себя на блоге хорошую, на мой взгляд, функцию — подсветку ссылок на тексты на английском языке. Сам я не люблю читать английские тексты, так как знаю язык недостаточно, и, кликнув на ссылку, которая ведёт на английский текст, раздражаюсь. Думаю, я не одинок. Для таких как я, сделал специальный флажок на ссылке (появляется при наведении на ссылку), на скриншоте его видно. Для таких как я он означает «по ссылке можно не ходить».

19 комментариев

Логотип Blok

Александр Блок (3.20КиБ)

Как многие наверное знают, движок моего блога называется «Blok». Основные особенности — всё на файлах (никаких баз данных, так интереснее) , никакого интерфейса администрирования через веб, максимальное использование чужих сервисов и RSS как средство оповещения о чём угодно.

У такого замечательного движка до сих пор не было логотипа. Я как-то не озаботился, а сегодня случайно наткнулся на жизнеописание небезызвестного Александра Блока (помните, «ночь, улица, фонарь, аптека…»). Подумал — неплохое лого.

Сейчас придёт Смирнов и скажет, что логотип полная лажа.

10 комментариев

Загрузка изображений в Blok

Проблема с загрузкой изображений через «Semagic» решилась куда проще (напомню, что у меня на сайте нет веб-интерфейса админки, используется API Metaweblog и LJ Flat), чем я расчитывал. Я просто попросил авторов «Семажика» сделать поддержку вставки изображений через data URL.

Мой движок анализирует нет ли во введённых данных тега IMG с data URL, выдёргивает из него данные, кладёт на диск в виде изображения, а обратно отдаёт тег уже с HTTP-ссылкой. Проще некуда.

17 комментариев

BLOK: MetaWeblog API, FotoBuilder API

Я, когда писал движок для своего сайта (до сих пор недописанный, кстати), сразу расчитывал на то, что веб-интерфейса к админке у меня не будет. Более здравой мне показалась идея приделать какой-то уже существующий клиент. Я остановился на протоколе livejournal flat и клиентах, его поддерживающих, благо их навалом для любой платформы. В частности, я могу с лёгкостью постить даже с сотового телефона.

Протокол достаточно простой, но описан очень плохо. Как бы то ни было, я его реализовал. Один недостаток — загрузка изображений. В протоколе flat такой возможности нет. Почесав репку, я посмотрел на обилие описанный протоколов и выбрал очень простой MetaWeblog. Протокол излишне многословен (даже по меркам XML, как мне кажется), но зато реализуется за час.

Наконец-то удалось погонять платный клиент BlogJet, я думал, что он очень удобен, оказалось, это совсем не так. Недружелюбный к пользователю Semagic куда удобнее и падает крайне редко. Кстати, нашёл глюк в BlogJet — ошибки на русском он показывает только в кодировке CP-1251, сколько не меняй encoding в XML и заголовке.

Теперь ещё хочу посмотреть Windows Live Writer, но через штатный инсталлятор мне поставить его не удаётся, грешу на прокси. В общем, остаюсь пока на Semagic, но с загрузкой изображений надо что-то делать. Вообще говоря, в LiveJournal для этого используется протокол FotoBuilder, придётся реализовывать его.

Попытался сделать это наскоком, не удалось. Видимо (это обычно для документации LiveJournal) пропустили что-то важное, без чего всё не работает. Или я это важное никак не могу найти. После подключения клиентская программа утверждает, что challenge не найден. Буду бороться.

21 комментарий

[LJ2ME] Подписка на комментарии

Долго думал как лучше сделать подписку на комментарии на сайте. Очевидный способ — подписка через электронную почту мне не нравится. У меня на сайте нет собственной системы авторизации, а умеющих отдавать адрес почты OpenID пока ещё очень мало.

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

У кого-нибудь есть предложения по этому вопросу?

15 комментариев

[LJ2ME] Blоk и сотовые телефоны

Самое приятное в том, что я отказался от веб-интерфейса и сделал управление сайтом через протокол Живого Журнала то, что я могу писать хоть из-под сотового телефона.

Оставить комментарий

Blok и комментарии, часть III.

Пользователи ЖЖ теперь тоже могут воспользоваться сервисом «Граватар», чтобы завести себе аватары, которые будут отображаться у меня на сайте. Напоминаю, что «Граватар» — централизованный сервис, позволяющих использовать одну и ту же аватару на разных сайтах, аватара идентифицируется по адресу e-mail. Кстати, оказалось, что «Граватар» не сразу масштабирует картинку, видимо для снижения нагрузки, так что какое-то время аватару видно не будет.

Пользователи ЖЖ идентифицируются по e-mail имяпользователя@livejournal.com. Насколько я знаю, этим ящиком могут воспользоваться только пользователи платных и расширенных аккаунтов, но соображение тут очень простое — этот почтовый ящик однозначно идентифицирует пользователя, даже если доступа у пользователя к нему нет. Я подумываю о том, чтобы сделать то же самое для пользователей Яндекс, но, кажется, у них ситуация иная — ник и ящик могут не совпадать или я ошибаюсь?

Что интересно, в будущем «Граватар» будет поддерживать идентификацию по URL, вместе (или вместо) e-mail. Это позволит привязывать аватару к OpenID.

8 комментариев

Blok и комментарии, часть II

Учусь использовать чужие сервисы дальше. Сделал в комментариях аватары через Gravatar. Сервис очень простой — регистрируетесь, указываете свой e-mail, подтверждаете его, закачиваете аватарку. Далее этот e-mail будет идентификатором для вашего аватара. Причём, сделано безопасно — выудить из HTML-кода ваш e-mail не получится, так как там указан md5-хеш от него. E-mail я получаю из данных, которые присылает (если присылает) ваш OpenID.

Оказывается, OpenID+Gravatar сочетание частое. Например, Апача в комментариях так и сделано. Но есть разница — там нужно указать адрес e-mail для gravatar. Я так делать не хочу, так как дальше тот же e-mail будет использоваться для подписки на комментарии.

Для визуальной идентификации тех, чей OpenID не отдаёт e-mail, придумал другой метод. У нас есть могучий Яндекс. А у Яндекса есть сервис, который отдаёт favicon сайта, причём уже в формате PNG и заведомо верный (т. е. не просто тот favicon.ico, что лежит в корне, а прописанный в тегах). Вот его я и использую.

21 комментарий

Комментарии на Blok

Сделал комментарии на блок, через OpenID (поддерживается так же Simple Registration Extension) как и собирался. Пока, можно сказать, в стадии бета-тестрирования — я не слишком ещё хорошо разбираюсь в тонкостях OpenID. Кстати, если у кого-то ещё нет OpenID, то очень рекомендую завести его на сервисе myOpenID, исключительно удобно.

P.S. Дима, можешь написать прямо на сайте какую глупость я написал.

29 комментариев

7 лет в блогосфере

Оказывается, 11-го ноября моему сайту исполняется 7 лет, сделал плакат на семилетие сайта. Нервных и впечатлительных прошу не смотреть.

Остальные — смотрите

Мозги в собственном соку (49.93КиБ)

По мотивам плаката на пятилетие студии Лебедева, конечно же. Если кто-то, вдруг, не видел.

Оставить комментарий

← 1 2 3 →