Система комментариев для каждого абзаца
Меня очень интересует возникающая тенденция систем комментариев с комментариями (также называемых "системами аннотаций" ), таких как те, которые реализованы medium.com и qz.com, и я смотрю на идею разработки одного для себя.
Вопрос: похоже, они в основном реализованы через javascript, который проходит через текстовые html-абзацы, однозначно идентифицированные атрибутом id (или, в случае Medium, атрибутом name). Означает ли это, что их CMS фактически хранит каждый абзац в качестве отдельной записи в базе данных? Слишком сложно для меня, но в остальном, как они справляются с тем, что абзац можно удалить, отредактировать или переместить в общем тексте? Как сохранить уникальный идентификатор, если автор изменит этот абзац?
Как этот уникальный идентификатор логически структурирован? (post_id + position_in_post)?
Спасибо за ваши идеи...
Ответы
Ответ 1
Я не могу говорить со средней стороной, но, как один из разработчиков для Quartz, я могу дать представление о том, как работают аннотации qz.com.
Код аннотации - это настраиваемый PHP-код и не зависит от CMS для публикации статей (wordpress VIP). Мы действительно храним ссылку на каждый абзац в виде строки в базе данных, чтобы отслеживать любые обновления содержимого статьи. Мы называем это потоком аннотаций, и когда пользователь сохраняет аннотацию, файл threadId сохраняется вместе с аннотацией.
У нас нет уникального идентификатора, хранящегося на стороне wordpress для каждого абзаца, вместо этого мы сохраняем относительное положение абзацев в этой статье (nodeIndex "3" и nodeSelector "p" == третий p-тег в теле контента для данной статьи), а javascript определяет, где именно разместить блок аннотации. Мы пошли по этому пути, чтобы избежать более тяжелых настроек на стороне wordpress, хотя в зависимости от вашей CMS может быть проще обратиться к этому непосредственно в коде CMS и добавить уникальные идентификаторы в html перед отправкой клиенту.
Каждый раз, когда публикуется обновление статьи, каждый абзац обновленной статьи сравнивается с тем, что было ранее сохранено в потоках аннотаций для этой статьи. Если текст позиции и абзаца не совпадают, он пытается найти абзац, который является самым близким совпадением, и обновлять строку для этого потока, а новые потоки создаются и, при необходимости, удаляются. Все это обрабатывается на стороне сервера, когда изменения публикуются в статье.
Несколько альтернативных последствий, на которые стоит обратить внимание, - это текстовые аннотации Gawker Kinja (в настоящее время используются на Jalopnik) и дословные аннотации rapgenius.com.
Ответ 2
(отказ от ответственности: я factlink dev.)
Я работаю в компании, пытающейся разрешить компиляцию по абзацу (или по фразе) на произвольных сайтах. По сути, у вас есть два варианта определения якоря комментария.
- Вспомните структуру страницы (например, некоторый путь от корня до абзаца) и поместите комментарии в ту же позицию в следующий раз.
- Определите содержание абзаца и разместите комментарии рядом с идентичным или похожим контентом в следующий раз.
Обе системы имеют свои недостатки, но вам очень нужно пойти с вариантом 2, если вам нужна надежная система. Структурная идентификация является хрупкой перед лицом меняющейся структуры. Особенно неулокальные изменения, такие как тезинг или точные html-теги, могут существенно повлиять на "путь". Когда это произойдет, вы действительно не сможете это исправить - если вы не проверите содержимое, то есть вариант (2).
Сэм описывает, что сводится к серверному контенту, основанному на его ответе. Чистое совпадение на основе контента на стороне клиента - это factlink и (IIRC) гипотеза. Большинство браузеров поддерживают нестандартный, но быстрый поиск подстроки в содержимом страницы, используя window.find
или TextRange.findText
. В качестве альтернативы вы можете пройти DOM, который медленнее, но дает вам гибкость в реализации (например,) нечеткого соответствия.
Может показаться, что совпадение на стороне клиента является чрезмерным или сложным, но на самом деле это проще: это очень надежный способ отделить ваше управление контентом от комментариев. Ни один из них не является простым, поэтому развязка этих проблем может быть победой.
Ответ 3
Я создал скрипку на тех же строках, чтобы продемонстрировать мощь JQuery во время тренировки.
http://fiddle.jshell.net/fotuzlab/Lwhu5/
Может помочь в качестве отправной точки вместе с подробными и полезными сведениями Сэма. Вы получаете значение текстового поля в функции JQuery, где вы можете отправить его на свою CMS с помощью ajax/API.
PS: функция не готова к производству. Это означало только отправную точку. Небольшая настройка сделает ее пригодной для использования.
Ответ 4
Недавно я опубликовал сообщение о том, как это сделать с созданием WordPress на существующем плагине.
Как и qz.com, я назначаю идентификаторы абзаца на клиенте, а затем предоставляю эту информацию в WordPress для хранения в качестве метаданных комментариев при создании нового комментария. Я использовал хэширование текста абзаца для создания идентификатора, что означает, что порядок абзацев неважен, но означает, что если отредактирован абзац, любые связанные комментарии становятся сиротами.
Сначала я подумал, что это проблема, но подумайте об этом, если читатель комментирует абзац, а затем редактирование этого текста кажется немного подлым.
Код свободно доступен на GitHub, если вы чувствуете, что его разворачиваете и улучшаете.
Ответ 5
Существует еще один плагин wordpress, называемый "commentpress", который существует с давних времен.
Я использую старую версию этого плагина для своего блога, и он работает очень хорошо.
Вы можете прокомментировать строки или абзацы, и эргономика действительно думает!
Демонстрация здесь:
http://futureofthebook.org/
и весь код находится на github:
https://github.com/IFBook/commentpress-core
После быстрого просмотра кода кажется, что они используют второй подход, например, @Eamon Nerbonne объясняет его ответ.
Они анализируют каждый абзац, чтобы сделать подпись на основе первого char каждого слова. Здесь - это функция для этого.
Ответ 6
В случае, если кто-то заглянет сюда, я применил среду, такую как функциональность, как приложение Django.
Он является открытым исходным кодом и может быть найден как пакет на Pypi и github.
Я использовал одно из моих других приложений blogging, чтобы выделять уникальные идентификаторы абзацев для каждого объекта контента (в настоящее время мы смотрим только на <p>
), и puts использует некоторые дополнительные внутренние метаданные в бэкэнд, сохраняя его в БД (в настоящее время MySQL, но мы сделали это JSON
ed Blob, этот метод более подходит для ориентированных на документ DB). Интерфейс в основном jQuery управляется с помощью REST
API, подключающего бэкэнд с интерфейсом.
Я взял ответы на этот пост, но затем отклонил создание какого-либо значения дайджеста из абзаца, потому что контент может измениться. Я хотел сохранить аннотации до тех пор, пока абзац не был полностью переписан. В случае с полной записью я предоставил коллекцию аннотаций в сиротском ковше.
Подробнее в этих учебниках
Унаследованная версия того же самого запущена на этих страницах учебных пособий, это была первая ревизия. (Но вы не сможете публиковать сообщения без входа в систему, но вы всегда можете войти с помощью социальных учетных записей, чтобы проверить это:-))