From 8ee19a98fa86a281eef276c884e2d9530b24d0b5 Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Tue, 29 Nov 2022 12:26:37 +0800 Subject: [PATCH] parse authors --- .../src/websites/stack-overflow-handler.ts | 57 +++++++++++++------ 1 file changed, 39 insertions(+), 18 deletions(-) diff --git a/packages/content-handler/src/websites/stack-overflow-handler.ts b/packages/content-handler/src/websites/stack-overflow-handler.ts index e4c5b9c15..de937dc33 100644 --- a/packages/content-handler/src/websites/stack-overflow-handler.ts +++ b/packages/content-handler/src/websites/stack-overflow-handler.ts @@ -10,7 +10,7 @@ export class StackOverflowHandler extends ContentHandler { const votes = element.querySelector(`div[itemprop='upvoteCount']`) if (votes) { const newVotes = dom.createElement('div') - newVotes.innerHTML = `

${title}: ${votes.innerHTML}votes

` + newVotes.innerHTML = `

${title}: ${votes.innerHTML}vote(s)

` element.prepend(newVotes) } } @@ -21,26 +21,24 @@ export class StackOverflowHandler extends ContentHandler { if (commentsDiv) { const comments = commentsDiv.querySelectorAll(`.comment`) if (comments.length > 0) { - const count = element.querySelector( - `span[itemprop='commentCount']` - )?.textContent + // const count = element.querySelector( + // `span[itemprop='commentCount']` + // )?.textContent const newComments = dom.createElement('div') - newComments.innerHTML = `

${ - count ? count + ' Comments' : 'Comment' - }

` + newComments.innerHTML = `

Comments

` + // newComments.innerHTML = `

${ + // count ? count + ' Comments' : 'Comment' + // }

` comments.forEach((comment) => { const author = comment.querySelector(`.comment-user`) const text = comment.querySelector(`.comment-copy`)?.textContent const authorHref = author?.getAttribute('href') const date = comment.querySelector(`.relativetime-clean`)?.textContent - const link = comment - .querySelector(`.comment-link`) - ?.getAttribute('href') - if (author && text && authorHref && date && link) { + if (author && text && authorHref && date) { const newComment = dom.createElement('p') - newComment.innerHTML = `${author.innerHTML}: ${text} - ${date}` + newComment.innerHTML = `${author.innerHTML}: ${text} - ${date}` newComments.appendChild(newComment) } }) @@ -52,6 +50,26 @@ export class StackOverflowHandler extends ContentHandler { element.querySelector(`span[itemprop='commentCount']`)?.remove() } + parseUser(element: Element, dom: Document) { + const users = element.querySelectorAll(`.post-signature`) + users.forEach((user) => { + const name = user.querySelector(`.user-details a`)?.textContent + const link = user.querySelector(`.user-details a`)?.getAttribute('href') + const reputation = user.querySelector(`.reputation-score`)?.textContent + const badges = Array.from(user.querySelectorAll(`span[title*='badges']`)) + .map((badge) => badge.getAttribute('title')) + .join(', ') + const date = user.querySelector(`.user-action-time`)?.textContent + if (name && link && reputation && date) { + const newUser = dom.createElement('p') + newUser.innerHTML = `By ${name} - ${reputation} reputation - ${ + badges || 'no badge' + } - ${date}` + element.replaceChild(newUser, user) + } + }) + } + shouldPreParse(url: string, dom: Document): boolean { return new URL(url).hostname.endsWith('stackoverflow.com') } @@ -63,17 +81,19 @@ export class StackOverflowHandler extends ContentHandler { if (question) { this.parseVotes(question, dom, 'Question') this.parseComments(question, dom) + this.parseUser(question, dom) } const answersDiv = mainEntity.querySelector('#answers') if (answersDiv) { - const count = mainEntity.querySelector( - `span[itemprop='answerCount']` - )?.textContent + // const count = mainEntity.querySelector( + // `span[itemprop='answerCount']` + // )?.textContent const newAnswers = dom.createElement('div') - newAnswers.innerHTML = `

${ - count ? count + ' Answers' : 'Answer' - }

` + newAnswers.innerHTML = `

Answers

` + // newAnswers.innerHTML = `

${ + // count ? count + ' Answers' : 'Answer' + // }

` const answers = answersDiv.querySelectorAll(`.answer`) answers.forEach((answer) => { @@ -82,6 +102,7 @@ export class StackOverflowHandler extends ContentHandler { : 'Answer' this.parseVotes(answer, dom, title) this.parseComments(answer, dom) + this.parseUser(answer, dom) newAnswers.appendChild(answer) }) answersDiv.replaceChildren(newAnswers)