每段评论系统

时间:2013-10-20 12:48:51

标签: content-management-system commenting

我对每段评论系统(也称为“注释系统”)的新兴趋势非常感兴趣,例如由medium.comqz.com实现的那些,我正在寻找我想为自己开发一个。

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

感谢您的见解......

6 个答案:

答案 0 :(得分:13)

我无法与中间人交谈,但作为Quartz的开发人员之一,我可以深入了解qz.com注释的工作原理。

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

我们没有为每个段落存储在wordpress一侧的唯一ID,而是我们在段落中存储段落相对位置(nodeIndex“3”和nodeSelector“p”==内容正文中的第三个p-tag对于给定的文章)和javascript确定放置注释块的确切位置。我们采用这条路线以避免在wordpress方面进行更重的自定义,但根据您的CMS,可能更容易直接在CMS代码中解决此问题并添加唯一在发送给客户端之前,在HTML中输入ID。

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

另外值得关注的另外一些含义是Gawker的Kinja文本注释(目前在Jalopnik上使用)和rapgenius.com的逐字注释。

答案 1 :(得分:5)

(免责声明:我是factlink dev。)

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

  1. 记住页面的结构(例如从根到段落的某个路径),并在下次将注释放在同一位置。
  2. 确定段落的内容,并在下次将评论放在相同或相似的内容附近。
  3. 两个系统都有它们的缺点,但如果你想要一个强大的系统,你几乎需要选择2。面对不断变化的结构,结构识别是脆弱的。特别是不相关的更改,例如主题或使用的精确html标签可能会显着影响"路径"。当发生这种情况时,你真的无法修复它 - 除非你检查内容,即选项(2)。

    Sam介绍了his answer中基于服务器端内容的内容。纯粹基于客户端内容的匹配是factlink和(IIRC)hypothesis使用的。大多数浏览器使用window.findTextRange.findText支持页面内容中的非标准但快速的子字符串搜索。或者,你可以走DOM,这个速度较慢,但​​你可以灵活地实现(例如)模糊匹配。

    似乎客户端匹配过度或过于复杂,但实际上,它更简单:它是一种非常强大的方式,可以将您的内容管理与评论分开。两者都不是很简单,因此将这些问题脱钩可能是一种胜利。

答案 2 :(得分:4)

我在同一行创建了一个小提琴,以展示训练期间JQuery的强大功能。

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

可以提供帮助作为Sam的详细和有用的见解的起点。您可以在Jquery函数中获取textfield的值,您可以使用ajax / API将其发送到CMS。

PS:该功能尚未准备就绪。它只是一个起点。稍加调整就可以使用它。

答案 3 :(得分:3)

我最近published a post介绍了如何在现有插件的基础上构建WordPress。

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

起初我认为这是一个问题,但考虑一下,如果读者评论一段然后编辑该文本后来似乎有点偷偷摸摸。

如果您想要分享并加强代码,可以在GitHub上免费获取代码。

答案 4 :(得分:2)

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

你可以选择每行或每段注释,人体工程学真的在想!

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

在快速查看代码后,似乎他们使用了@Eamon Nerbonne在his answer上解释的第二个approch。 他们解析每个段落,根据每个单词的第一个字符进行签名。 Here就是这样做的功能。

答案 5 :(得分:2)

如果有人来这里查看,我已经实现了像Django应用程序这样的媒体功能。 它是开源的,可以在Pypi和package上找到github

我使用了其他一个应用blogging为每个内容对象分配了唯一的段落ID(目前我们只查看<p>个标签)并且使用了一些额外的内部元数据在将其存储在DB中的后端(MySQL当前,但我们已经完成的是JSON编辑Blob,这种方法更适用于面向文档的DB)。前端主要是jQuery驱动,REST API将后端插入前端。

我从这篇文章中获取了提示,但后来拒绝了段落中某种摘要值的创建,因为内容可以更改。我想要的是保留注释,只要段落没有被完全覆盖。在完整的重写案例中,我提供了在孤立桶中收集注释的内容。

这些tutorials

中的更多内容

这些教程页面上的旧版本正在运行,这是第一次修订。 (但是你没有登录就无法发帖,但你总是可以使用社交账户登录来查看:-))