С тех пор, как я неделю назад починил здесь на блоге 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

  1. Александр Артёменко

    Угу. А у меня в блоге, на каждой странице есть фото с именем фамилией, которые обернуты в vcard.

    Эту информацию тоже можно было бы использовать.

  2. kossak.blogspot.com

    А если внутри address есть ссылка, то это ссылка на страницу автора с микроформатом vCard :-)

    Ограничение на количество символов/слов в родительском контейнере для ссылки тоже надо какое-то ввести. А то абзацы, они разные бывают.

  3. Sergey Shepelev

    Открыли глаза на <address>, спасибо. Я думал это для записи адреса почтового.

  4. Александр Соловьёв

    В Byteflow, если я не ошибаюсь, такое реализовано.

    Таки да, но всё равно обстригается до какого-то размера (по умолчанию - 200 символов, подумываю увеличить ;), потому что можно вполне на километровый абзац налететь.

    Уважаемые авторы шаблонов блогов! Заверните, пожалуйста, имена авторов постов и комментариев в <address>.

    Возникает вопрос: а где ж у тебя имя автора поста? :)

    Уважаемые авторы блог-движков! Реализуйте, пожалуйста, pingback-серверы с семантикой поиска авторов.

    Да, хорошая идея. :) Я себе записал.

  5. Иван Сагалаев

    Возникает вопрос: а где ж у тебя имя автора поста? :)

    Вот я как раз размышляю, куда именно его (меня :-) ) лучше приткнуть. Сегодня будет.

  6. Ferroman

    Отличная идея, примите комплименты :)

  7. kossak.blogspot.com

    Вот я как раз размышляю, куда именно его (меня :-) ) лучше приткнуть. Сегодня будет.

    [дата] [автор] в [время] написал про [категория]

    :-)

  8. Иван Сагалаев

    Добавил. Почти так :-). Только refresh нужен для стилей.

  9. Artemy Tregubenko

    а мне кажется, что одного address недостаточно, что тогда уж лучше использовать и hCard — а то мало ли что написано внутри <address>. Достаточно в пример в самой спеке глянуть : )

    как автор пингбек-сервера, я халявлю — оформляю пинги просто как ссылки на страницы с их title в качестве текста

  10. kossak.blogspot.com

    а мне кажется, что одного address недостаточно, что тогда уж лучше использовать и hCard

    Ага, мне тоже эта идея пришла в голову. А потом я подумал — а зачем? Если кому-то интересен автор, который оставил ссылку, то этот кто-то вполне может сходить на сайт этого самого автора. А то можно потом еще много до чего договориться: аватары, аккаунты в соцсетях и т.д. А сам комментарий из трех слов.

  11. SaD

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

  12. Del'ka

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

    Лучше из hСard брать)

    http://microformats.org/wiki/hcard-faq#Should_I_use_ADDRESS_for_hCards

    The poorly named address element really means contact-info-for-this-web-page. The HTML4 definition of the ADDRESS element says it is used "to supply contact information for a document or a major part of a document such as a form." Therefore, address should be used for an hCard ONLY IF that hCard represents the contact information for the page or major part thereof.

  13. Иван Сагалаев

    Мне вот неочевидно, что "major part of a document" означает, что такая part должна быть только одна...

Добавить комментарий