diff --git a/src/disqus.js b/src/disqus.js index 43b53f1..cc9c477 100644 --- a/src/disqus.js +++ b/src/disqus.js @@ -2,22 +2,22 @@ * The variable used in DisqusJS * * DisqusJS Mode - * disqusjs.mode = dsqjs | disqus - Set which mode to use, should store and get in localStorage + * @param {string} disqusjs.mode = dsqjs | disqus - Set which mode to use, should store and get in localStorage * * DisqusJS Config - * disqusjs.config.shortname - The disqus shortname - * disqusjs.config.identifier - The identifier of the page - * disqusjs.config.url - The url of the page - * disqusjs.config.api - Where to get data - * disqusjs.config.apikey - The apikey used to request Disqus API - * disqusjs.config.admin - The disqus forum admin username - * disqusjs.config.adminLabel - The disqus moderator badge text + * @param {string} disqusjs.config.shortname - The disqus shortname + * @param {string} disqusjs.config.identifier - The identifier of the page + * @param {string} disqusjs.config.url - The url of the page + * @param {string} disqusjs.config.api - Where to get data + * @param {string} disqusjs.config.apikey - The apikey used to request Disqus API + * @param {string} disqusjs.config.admin - The disqus forum admin username + * @param {string} disqusjs.config.adminLabel - The disqus moderator badge text * * DisqusJS Info - * disqusjs.page.id = The thread id, used at next API call - * disqusjs.page.title - The thread title - * disqusjs.page.isClosed - Whether the comment is closed - * disqusjs.page.lenfth - How many comment in this thread + * @param {string} disqusjs.page.id = The thread id, used at next API call + * @param {string} disqusjs.page.title - The thread title + * @param {boolean} disqusjs.page.isClosed - Whether the comment is closed + * @param {number} disqusjs.page.lenfth - How many comment in this thread */ function DisqusJS(config) { @@ -178,42 +178,130 @@ function DisqusJS(config) { (() => { let url = `${disqusjs.config.api}3.0/threads/list.json?forum=${disqusjs.config.shortname}&thread=ident:${disqusjs.config.identifier}&api_key=${disqusjs.config.apikey}`; /* - * Description: Disqus API only support get thread list by ID, not identifter. So get Thread ID before get thread list. + * Disqus API 只支持通过 Thread ID 获取评论列表,所以必须先通过 identifier 获取当前页面 Thread ID + * * API Docs: https://disqus.com/api/docs/threads/list/ * API URI: /3.0/threads/list.json?forum=[disqus_shortname]&thread=ident:[identifier]&api_key=[apikey] */ get(url, (res) => { - if (res.response.length === 1) { + console.log(res); + // 如果只返回一条则找到了对应 thread,否则是当前 identifier 不能找到唯一的 thread + // 如果 thread 不唯一则需要进行初始化 + if (res.code === 0 && res.response.length === 1) { var resp = res.response[0]; disqusjs.page = { - id: resp.id, - title: resp.title, - isClosed: resp.isClosed, - length: resp.posts + id: resp.id, // Thread ID + title: resp.title, // Thread Title (默认是页面标题) + isClosed: resp.isClosed, // 评论是否关闭 + length: resp.posts // 评论数目 }; // 获取评论列表 - } else { + getComment() + } else if (res.code === 0 && res.response.length !== 1) { // 当前页面可能还未初始化(创建 thread) + } else { + // 评论列表加载错误 } }, (e) => { + // 评论列表加载错误 console.log(e); }) })() - function getComment(cursor) { + /* + * getComment(cursor) - 获取评论列表 + * + * @param {string} cursor - 传入 cursor 用于加载更多评论 + */ + let getComment = (cursor) => { + // 处理传入的 cursor if (!cursor) { cursor = ''; } else { cursor = `&cursor=${cursor}`; } /* - * Description: get the comment content + * 获取评论列表 + * + * API Docs: https://disqus.com/api/docs/posts/list/ * API URI: /3.0/posts/list.json?forum=[shortname]&thread=[thread id]&api_key=[apikey] */ let url = `${disqusjs.config.api}3.0/posts/list.json?forum=${disqusjs.config.shortname}&thread=${disqusjs.page.id}${cursor}&api_key=${disqusjs.config.apikey}`; - console.log(url) + get(url, (res) => { + if (res.code === 0 && res.response.length > 0) { + // 已获得评论列表 + renderComment(res.response) + } else if (res.code === 0 && res.response.length === 0) { + // 当前没有评论 + } else { + // 评论列表加载错误 + } + }, (e) => { + // 评论列表加载错误 + console.log(e); + }) + } + + /* + * parseCommentData(data) - 解析评论列表 + * + * @param {Object} data - 评论列表 JSON + * @return {Object} - 解析后的评论列表数据 + */ + let parseCommentData = (data) => { + var topLevelComments = [], + childComments = []; + + let getChildren = (id) => { + if (childComments.length === 0) { + return null; + } + + var list = []; + for (let comment of childComments) { + if (comment.parent === id) { + list.unshift({ + comment, + author: comment.author.name, + isPrimary: comment.author.username === disqusjs.config.admin.toLowerCase(), + children: getChildren(+comment.id) + }); + } + } + + if (list.length) { + return list; + } else { + return null; + } + } + + data.forEach((comment) => { + (comment.parent ? childComments : topLevelComments)['push'](comment); + }); + + var commentLists = topLevelComments.map((comment) => { + return { + comment, + author: comment.author.name, + isPrimary: comment.author.username === disqusjs.config.admin.toLowerCase(), + children: getChildren(+comment.id) + }; + }); + + return commentLists; + } + + /* + * parseCommentData(data) - 渲染评论列表 + * + * @param {Object} data - 从 getComment() 获取到的 JSON + */ + let renderComment = (data) => { + data = parseCommentData(data); + console.log(data) } } - loadDsqjs() + }