19

我对每段评论系统(也称为“注释系统”)的新兴趋势非常感兴趣,例如由 medium.com 和 qz.com 实施的系统正在考虑开发一个用于我自己的。

问题:似乎它们主要是通过 javascript 实现的,它贯穿文本的 html 段落,该段落由一个 id 属性(或者,在 Medium 的情况下,一个 name 属性)唯一标识。这是否意味着他们的 CMS 实际上将每个段落作为单独的条目存储在数据库中?对我来说似乎过于复杂,但除此之外,他们如何处理可以在整个文本中删除、编辑或移动段落的事实?如果作者更改段落,将如何保留唯一 ID?这个独特的 id 在逻辑上是如何构成的?(post_id + position_in_post)?

谢谢你的见解...

4

6 回答 6

14

我不能说媒体,但作为 Quartz 的开发人员之一,我可以深入了解 qz.com 注释的工作原理。

注释代码是自定义 php 代码,独立于 CMS 用于发布文章(wordpress VIP)。我们确实将每个段落的引用存储为数据库中的一行,以便跟踪文章内容的任何更新。我们称之为注释线程,当用户保存注释时,threadId 与注释一起存储。

我们没有为每个段落在 wordpress 端存储唯一的 id,而是将段落的相对位置存储在该文章中(nodeIndex “3” 和 nodeSelector “p” == 对于给定的内容正文中的第三个 p-tag文章)和 javascript 确定确切放置注释块的位置。我们走这条路线是为了避免在 wordpress 端进行更重的自定义,尽管根据您的 CMS,直接在 CMS 代码中解决这个问题并在发送给客户端之前的html。

每次发布一篇文章的更新时,都会将更新后的文章中的每个段落与之前使用该文章的注释线程存储的内容进行比较。如果位置和段落文本不匹配,它会尝试找到最接近匹配的段落并更新该线程的行,并在适当的地方创建和删除新线程。每当将更改发布到文章时,所有这些都在服务器端处理。

Gawker 的 Kinja 文本注释(目前在 Jalopnik 上使用)和 rapgenius.com 的逐字注释也值得关注。

于 2013-11-04T01:26:45.863 回答
5

(免责声明:我是factlink开发人员。)

我为一家试图允许在任意网站上按段落(或按短语)评论的公司工作。本质上,您有两种选择来识别评论的锚点。

  1. 记住页面的结构(例如从根到段落的一些路径),下次将注释放在相同的位置。
  2. 识别段落的内容,下次将评论放在相同或相似的内容附近。

两种系统都有其缺点,但如果您想要一个强大的系统,您几乎需要使用选项 2。面对不断变化的结构,结构识别是脆弱的。尤其是不相关的更改,例如主题或使用的精确 html 标签会显着影响“路径”。当这种情况发生时,你真的无法修复它——除非你检查内容,即选项 (2)。

Sam 在他的回答中描述了归结为基于服务器端内容的内容。纯客户端基于内容的匹配是factlink和 (IIRC)假设使用的。window.find大多数浏览器使用或支持在页面内容中进行非标准但快速的子字符串搜索TextRange.findText。或者,您可以遍历 DOM,虽然速度较慢,但​​可以灵活地实现(例如)模糊匹配。

看起来客户端匹配是多余的或复杂的,但实际上,它更简单:这是一种将内容管理与评论分离的非常可靠的方法。两者都不是很简单,因此消除这些担忧可能是一种胜利。

于 2014-03-27T08:41:48.207 回答
4

我在同一行上创建了一个小提琴,以在培训课程中展示 JQuery 的强大功能。

http://fiddle.jshell.net/fotuzlab/Lwhu5/

与 Sam 的详细而有用的见解一起作为起点可能会有所帮助。您在 Jquery 函数中获取文本字段的值,您可以使用 ajax/API 将其发送到您的 CMS。

PS:该功能尚未准备好生产。它只是作为一个起点。稍微调整一下就可以使用了。

于 2014-01-08T10:25:00.467 回答
3

我最近发表了一篇关于如何在现有插件上使用 WordPress 来做到这一点的文章。

像 qz.com 一样,我在客户端上分配段落 ID,然后将该信息提供给 WordPress,以便在创建新评论时存储为评论元数据。我使用段落文本的散列来创建 id,这意味着段落的顺序并不重要,但确实意味着如果一个段落被编辑,那么任何相关的评论都会变成孤立的。

起初我认为这是一个问题,但仔细想想,如果读者对某个段落发表评论,那么随后编辑该文本似乎有点偷偷摸摸。

如果您想分叉和增强它,该代码可在 GitHub 上免费获得。

于 2014-02-15T02:12:39.930 回答
2

还有一个名为“commentpress”的 wordpress 插件已经存在了很长时间。我在我的博客中使用了这个插件的旧版本,它工作得很好。

您可以选择逐行或逐段评论,人机工程学真的在思考!

这里有一个演示:http:
//futureofthebook.org/
所有代码都在 github 上:
https ://github.com/IFBook/commentpress-core

快速浏览一下代码后,他们似乎使用了第二个方法,就像@Eamon Nerbonne 在他的回答中解释的那样。他们解析每个段落以根据每个单词的第一个字符进行签名。是执行此操作的功能。

于 2014-05-24T01:53:43.280 回答
2

万一有人进来看看,我已经实现了一个类似于 Django 应用程序的功能。它是开源的,可以作为在 Pypi 和github上找到。

我使用了我的其他应用程序之一,通过博客为每个内容对象分配唯一的段落 ID(目前我们只查看<p>标签)并在后端使用一些额外的内部元数据,同时将其存储在数据库中(目前是 MySQL,但是什么我们已经完成JSON了 Blob,这种方法更适合面向文档的数据库)。前端主要是 jQuery 驱动,RESTAPI 将后端与前端插入。

我从这篇文章中得到了启发,但随后拒绝了从段落中创建某种摘要值,因为内容可以改变。我想要的是保留注释,只要该段落没有被完全覆盖。在完全覆盖的情况下,我提供了在孤立存储桶中收集注释的功能。

这些教程中的更多内容

相同的旧版本正在这些教程页面上运行,这是第一个修订版。(但您将无法在不登录的情况下发帖,但您可以随时使用社交帐户登录以查看 :-))

于 2015-04-24T09:52:17.600 回答