gitment
gitment copied to clipboard
初始化评论框方案讨论
我不太建议使用插件或cli工具之类的. 插件的话, 博客不止hexo, Jekyll. 这样照顾不了那么多博客工具.
cli的话. 有些博客还得抓取所有连接才行. 所有我写了个简单的方案, 大家一起讨论一下.
加载部分
- 加载评论框[不管有没有初始化都加载][可自定义在评论上边还是下边]
GET /repos/:owner/:repo/issues利用 [标签] 列出当前文章标题的issues- 判断每个issue的[body|body_html]中是否存在当前页面连接[可自定义连接]
例
<a href="http://demo.com/post/1" data-url="/post/1">http://demo.com/post/1</a>可增加功能, 判断href和当前页面域名不一致时更新issue , 当更换域名时所有用 - 找到了就使用
GET /repos/:owner/:repo/issues/:number/comments加载评论内容, 并记录当前评论为初始化成功 - 没找到就不加载评论, 也不提示没初始化什么的. 并记录当前评论为未初始化[未创建issue]
评论部分
- 用户评论, 判断 [初始化状态] 已初始化的直接提交评论
- 如果未初始化, 则先调用
POST /repos/:owner/:repo/issues创建issue[初始化], 创建成功后提交评论
其实评论中的issue谁来创建都没什么关系的吧?
如果是其他人创建的 issue,那他可以任意修改 issue 的内容,其他用户就无法知道页面对应的是哪个 issue。而且还能 lock conversation。
搜索接口的第二个建议:
利用 GET /search/issues 的(高阶搜索接口中的)project=repo&q=in:title 应该可以做到只搜索标题, 这样就不会创建太多标签.
@imsun 确实是个问题, 并不是所有人都那么的尊守规则.
标题也都是可以改的。而且搜索 API 是有限制的。
那创建issue的接口里, 标签是可以填的吧? 把这些元数据都扔标签里? 创建后是不是标签只能由所有者才能改?
普通用户没有创建新标签的权限。
反正owner的key什么的都有,初始化时应该可以直接让owner创建吧?
@dontpanic92 不一样的, 那个key只是属于应用的身份, 并不是所有者的登陆凭证, 无法用来操作的
要登陆后才可以, 但别人评论时登陆的并不是所有者的帐号
- 由仓库所有者创建一个标题为博客域名的issue,以下称索引页
- 内容[body]为文章列表连接评论issue的#id号,以下称(评论)索引,第一楼的内容可以自行写些提示语,比如禁止在本issue回复任何内容
- 一篇博客可以有多个issue评论,多个时在文章索引列表下新建的子级列表 示例
## [文章标题](文章链接)//这里用顶级列表也行, 这里还是建议加个上唯一文章标记, 因为换域名时真的好麻烦..
- [博客第一楼回复内容](对应issue的链接)
- [博客第二楼回复内容](对应issue的链接)
-
新的issue评论相当于贴吧中的一楼,回复相当于楼中楼,close评论也加载到页面, 新建的issue还是按以前的方法(在一楼添加对应文章的标记)
-
所有者查看评论列表每个主楼层(issue)有个按钮同步楼层数据到索引页。
-
索引的issue页每篇文章的索引可以直接占用一个回复,并在同步索引时删除创建者不是所有者的回复
-
评论加载查询顺序变为:
- 用当前博客域名查询索引页的issue地址, 并在索引页评论中查询到当前url的评论连接(只查所有者创建的回复).
- 同时也查询没有同步在索引页的新issue, 建议优先显示未同步索引的数据
-
所有者查看时, 在主楼层添加删除按钮, 以便在索引页删除索引, 并close掉issue, 删除索引用另一种列表表示. 然后7.2时不加载删除列表中的评论
这样应该就可以做到控制了, #id号的链接并不能修改. 做过索引之后原issue想怎么改都没关系了. 回复者解决问题后的乱改了的话, 可以把该回复删除掉, 毕竟回复者这么做的原因也可能是不希望再显示吧.
@imsun 这个方案怎么样? 应该可以实现吧
能否自动初始化呢,手工显得麻烦。
现在有自动初始化的方案么?我看隔壁的Gitalk貌似是自动的。
同问,有自动初始化方案吗?
自己写了个脚本,加到那个 script 标签中就可以了 :)
// Auto Initialize Comments
let cmtBtns = document.getElementsByClassName('gitment-comments-init-btn');
let isClicked = false;
let timer = setInterval(() => {
Array.prototype.forEach.call(cmtBtns, item => {
item.click();
isClicked = true;
if(isClicked) {
clearInterval(timer);
console.log('Clear timer.')
}
})
}, 1000)