С тех пор, как я неделю назад починил здесь на блоге pingback (глупая ошибка в конфигурации lighttpd), они (пинги) стали сюда снова приходить. Тут-то я и вспомнил штуку, которая давно меня анноит по поводу реализации приема пингов в WordPress.
Речь о том, что для именования авторов используется наивный (хоть и оправданный) подход: берется <title>
той страницы, от имени которой пинг пришел. Результат местами выглядит коряво. Мне кажется, я придумал хорошее решение, которое использует старую забытую семантику HTML.
Pingback со стороны сервера
Для неиницированных краткий ввод о том, как работает pingback-сервер, который эти пинги принимает.
У сервера (например у этого блога) есть отдельный интерфейс, куда другие серверы (например developers.org.ua) может постучаться и сказать: "мой URL http://developers.org.ua/.../ сослался на твой URL http://softwaremaniacs.org/.../". И это все, что он передает. Дальше дело моего WordPress'а — пойти по указанному URL'у источника, убедиться, что ссылка на меня там действительно есть (то есть, это не спам), а дальше... А дальше все остается на волю реализации сервера: у него есть страница со ссылкой, и он может вытащить из нее любую информацию о том, как бы ее отобразить.
WordPress поступает так. В качестве текста комментария он вырезает небольшой фрагмент текста, отстрипанного от HTML-тегов вокруг того места, где нашел ссылку. В качестве автора комментария — <title>
страницы. С текстом, кстати, можно поступать поинтересней: брать не произвольный кусок, а парсить HTML и выбирать целиком блочный (в понимании HTML) элемент, в котором лежит ссылка: <p>
, <li>
, <blockquote>
и т.д. В Byteflow, если я не ошибаюсь, такое реализовано.
Это вот как раз то использование семантики, о котором я и говорю.
Имя автора
Есть в HTML малоиспользуемый элемент — <address>
, который, цитируя спецификацию:
may be used by authors to supply contact information for a document or a major part of a document such as a form
... или, добавлю, "such as a post in a topic".
Точно так же, как текст комментария можно брать из блока, содержащего найденную ссылку, можно доставать и автора, просматривая все содержащие блоки от текущего и выше в поисках элемента <address>
. Первый найденный — наиболее релевантный. Если никакой не нашелся, тогда да, можно использовать <title>
в качестве fallback'а.
В псевдокоде это выглядит примерно так:
tree = parse_htm()
link = find_link('http://.../')
container = link.parent
while container != 'body':
address = container.find('<address>')
if address:
break
container = container.parent
Собственно и все. Единственное, это выглядит слегка нагружено из-за повторящихся поисков <address>
вниз, но во-первых, пинг — не массовая операция, а во-вторых для документов нормального размера это будет в любом случае довольно быстро.
А знаете, что интересно! У меня в Cicero разметка статьи выглядит примерно вот так:
<li class="article" id="10522">
<div class="meta">
<address>
<a href="/forum/users/1061/" title="http://.../">Автор</a>
</address>
...
</div>
<div class="usertext">
...
</div>
Когда я это делал, ни про какой pingback не думал. Просто подумалось, что на всякий случай лучше завернуть имя автора в <address>
, вдруг пригодится семантика. Вот и пригодилась :-)
Воззвания
Уважаемые авторы шаблонов блогов! Заверните, пожалуйста, имена авторов постов и комментариев в <address>
.
Уважаемые авторы блог-движков! Реализуйте, пожалуйста, pingback-серверы с семантикой поиска авторов.
Это все так несложно... Давайте сделаем мир интересней :-)
Комментарии: 13
Угу. А у меня в блоге, на каждой странице есть фото с именем фамилией, которые обернуты в vcard.
Эту информацию тоже можно было бы использовать.
А если внутри address есть ссылка, то это ссылка на страницу автора с микроформатом vCard :-)
Ограничение на количество символов/слов в родительском контейнере для ссылки тоже надо какое-то ввести. А то абзацы, они разные бывают.
Открыли глаза на
<address>
, спасибо. Я думал это для записи адреса почтового.Таки да, но всё равно обстригается до какого-то размера (по умолчанию - 200 символов, подумываю увеличить ;), потому что можно вполне на километровый абзац налететь.
Возникает вопрос: а где ж у тебя имя автора поста? :)
Да, хорошая идея. :) Я себе записал.
Вот я как раз размышляю, куда именно его (меня :-) ) лучше приткнуть. Сегодня будет.
Отличная идея, примите комплименты :)
[дата] [автор] в [время] написал про [категория]
:-)
Добавил. Почти так :-). Только refresh нужен для стилей.
а мне кажется, что одного address недостаточно, что тогда уж лучше использовать и hCard — а то мало ли что написано внутри
<address>
. Достаточно в пример в самой спеке глянуть : )как автор пингбек-сервера, я халявлю — оформляю пинги просто как ссылки на страницы с их
title
в качестве текстаАга, мне тоже эта идея пришла в голову. А потом я подумал — а зачем? Если кому-то интересен автор, который оставил ссылку, то этот кто-то вполне может сходить на сайт этого самого автора. А то можно потом еще много до чего договориться: аватары, аккаунты в соцсетях и т.д. А сам комментарий из трех слов.
Спасибо за идею, она действительно интересная. Я попытался реализовать у себя в блоге, который использует платформу Blogger, но оказалось что там всё не так уж и красиво делается. Я попытался рассказать о том как реализовать идею для новых шаблонов Blogger в своей заметке.
Про address - прикольно, но тут как раз семантика нарушается, т.к. address - должен быть один на странице и указывать на контакты автора страницы.
Лучше из hСard брать)
Мне вот неочевидно, что "major part of a document" означает, что такая part должна быть только одна...