From c9142336108110ac4cd0091d01da4632f34acf55 Mon Sep 17 00:00:00 2001 From: n4ze3m Date: Mon, 15 Apr 2024 11:32:30 +0530 Subject: [PATCH] Update dependencies and fix whitespace formatting in isTTSEnabled function in tts.ts --- bun.lockb | Bin 406530 -> 407578 bytes package.json | 2 + src/components/Sidepanel/Chat/header.tsx | 21 ++-- src/hooks/useMessage.tsx | 2 + src/libs/get-html.ts | 72 ++++++++--- src/loader/html.ts | 30 ++--- src/parser/default.ts | 10 ++ src/parser/google-docs.ts | 119 ++++++++++++++++++ src/parser/google-sheets.ts | 5 + src/parser/twitter.ts | 152 ++++++++++++----------- src/utils/clean.ts | 4 + 11 files changed, 302 insertions(+), 115 deletions(-) create mode 100644 src/parser/default.ts create mode 100644 src/parser/google-docs.ts create mode 100644 src/parser/google-sheets.ts create mode 100644 src/utils/clean.ts diff --git a/bun.lockb b/bun.lockb index 4c508469bec49fc248e62a0ff4c1486a756ee60f..ce5cb651cee3197ef914617326bc16ed0860e5d3 100644 GIT binary patch delta 77862 zcmeFadt6l2zyH7Y;3(TW848vu8Hwc$jb;>OM8z;KNk#%@I_fAW7r7~B3Ya98X1K%U zB{eb>H7hC-%Ty`~(=sXwH7hDUS$6qQQFi~mUVE)EJ{`~J_dUPg@0|1d!+A8k*892c zYrWUnYxbVT6=wrB|1;ph0ewS1>i5dNuh$-}ihsAFs&wT~k6%4*{nf9Hf5Sb&?_@~F zj%)98wAT1KUo^F+ZR1x(IlYW|KAP5E)AC*}D(Mz@Yb#Cb3?mZi2kn8#ZqQRjwLN1V zK;Dip3ZMqGZyQZ(3r$H%@${cFOY0816YQ^{Oy|yAk~(`qQdTz7v(T*UjMO=4i}6lL zN=?(W6K1I1t?w8V(E+i2pgo}PqG-0~V<>CM%1Fzem#Ar9nCW^qy}(?pJ9583g3Fl} z>JL2#4S<$H+1v&0EKd%)xdY8%8JocIU)~}ZY+)9f(-nHx;-swEC_4y!WecB&vYdTT zw#g2?68igPn$`LLT4LFBC*Fs;1lJA3Z5DKBe(363h)*V_2WqcxdFD+Ngn|_6+;lI51@P{KX4B8tS z1V!4sLX^Uc$x!xSveKbYHsorhb}0VK8;OELpw%dh4R4Lw$iG9k*}+06M<)DgjA$+b zb3C)M=V6FbGVuqm<%r-2T#Z(6$m>u53wp1YY`|eCD}Dsp6MFa>*#RfI$qHuAPRmZs z(zN{;G3J|$VPSdup&0DEYx~HN^oROmTJpSeTZROj(}&GkpPs{lu9L~`f^r7aQfGV6 zI&E==d*Q+*nl=xd6SVYtSxu@tmC;&<>&)v~-Kalix?6S2T|PkeAtNaz!#x+7lGA1} z(a?d?O$I^P$74`dJ#dh$GziMJC#5EOGLo_~lTzm=in|wPq|I_` z+7@tlWZsw?WrKG?+0ac&M>u48;jj((QC@1=Ld=Dxxo6GF@GR1_G-wK;vwgw_N4jzPX&z`dayhHpm7 z@;bui;;};w=u!PHN6OlN#(H33-$JoB<^98KXx%6GBrH~WW{m3d?6izjRONyj zvW+iB$uf6C>DQNob4>a}IVQH7WK++NmH7|B?g~BlW|gKCuef2(~7{E@#xKxFU&~FOqrjl`Hz`VXLNPNwW<-Ve9RW{sO7(|-<|4x!RY_>;O)S7#Is@8np3k=`e&wPWa$aAfCmskFUyCrz$>T8h9xTPi2~TruBxIh zb!lgMlIM6bJf4N_38@ zQ)F!uVABbwr^;O6D)(aKU~9tCWGP;oC2^x_zfg{l50rg6k915w0aIuBR5D#2Wv9#d zNwOEVydTZoXoh!x^IpPIQ9c{(PR-(i(i)dY`xulL@rUn{OFLtBf6lb#b>Wu~&+1FC z0knla3!B|Tx-2-3mU6dj?p$!LnNG{Bat7!1R~c6-ZAJv!zXk=-RaY#R{n&$e7QEeD z(!OWzuZU$T7Vn;w?8(WKsW+%nz%#Qv3p3X$I|s@+0MEdIOq&Lq`EOP6DQPJlUh<=0 zb1rX$a&)g&>AEQU$$P9}$YnuEDeifmFVGP7yS2)Ae5K6zo#G#=hQ6b;Mrqf3<+vV% z&4%rTa@>CfryJY_o8vSc+5*M2CJ1Ku8-1+82y zN8}ewC<_XJKXid+W-Uoh!o@J{KACP7ls$gk{Gvn8+*J?A>J~t+1f8VpFlZp`ZqTcs z->=oQYoPBydqFFp7f-1}Jy>ccC4)WiCw1%);W=iXW2A zx*y7E$Kfa~2_EUmoRyuFJV(1j$Zm~;vRh%$%b~p$@1*SCHpuudp&W+ypiFlJ+7=Hnc9-a(~^r>t2$PRYegYjpN zVi7?N*(-3Bht#Bn z?#xVY5C4AZzYpoS3x!t7A-)F69=16k`F}Pw-gxgJKi7N8SI7Sgr~JSd

-dx(gL@ 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 Z{jYx?>0-K%%Y-mmNZyw1mUt+n>7 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%0DpP$YAaN&P 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 { - const { clearChat, isEmbedding, messages } = useMessage() + const { clearChat, isEmbedding, messages, streaming } = useMessage() const { t } = useTranslation(["sidepanel", "common"]) return ( @@ -25,16 +25,15 @@ export const SidepanelHeader = () => { ) : null} - {messages.length > 0 && ( - - - + {messages.length > 0 && !streaming && ( + )} {/* diff --git a/src/hooks/useMessage.tsx b/src/hooks/useMessage.tsx index 89f5b27..07fe767 100644 --- a/src/hooks/useMessage.tsx +++ b/src/hooks/useMessage.tsx @@ -81,6 +81,7 @@ export const useMessage = () => { signal: AbortSignal, embeddingSignal: AbortSignal ) => { + setStreaming(true) const url = await getOllamaURL() const ollama = new ChatOllama({ @@ -320,6 +321,7 @@ export const useMessage = () => { history: ChatHistory, signal: AbortSignal ) => { + setStreaming(true) const url = await getOllamaURL() if (image.length > 0) { diff --git a/src/libs/get-html.ts b/src/libs/get-html.ts index bed1f43..40499d4 100644 --- a/src/libs/get-html.ts +++ b/src/libs/get-html.ts @@ -1,17 +1,25 @@ +import { defaultExtractContent } from "@/parser/default" import { getPdf } from "./pdf" +import { + isTweet, + isTwitterTimeline, + parseTweet, + parseTwitterTimeline, +} from "@/parser/twitter" +import { isGoogleDocs, parseGoogleDocs } from "@/parser/google-docs" +import { cleanUnwantedUnicode } from "@/utils/clean" -const _getHtml = async () => { +const _getHtml = () => { const url = window.location.href if (document.contentType === "application/pdf") { return { url, content: "", type: "pdf" } } - const html = Array.from(document.querySelectorAll("script")).reduce( - (acc, script) => { - return acc.replace(script.outerHTML, "") - }, - document.documentElement.outerHTML - ) - return { url, content: html, type: "html" } + + return { + content: document.documentElement.outerHTML, + url, + type: "html" + } } export const getDataFromCurrentTab = async () => { @@ -34,7 +42,6 @@ export const getDataFromCurrentTab = async () => { type: string }> - const { content, type, url } = await result if (type === "pdf") { @@ -47,31 +54,58 @@ export const getDataFromCurrentTab = async () => { const pdf = await getPdf(data) for (let i = 1; i <= pdf.numPages; i += 1) { - const page = await pdf.getPage(i); - const content = await page.getTextContent(); + const page = await pdf.getPage(i) + const content = await page.getTextContent() if (content?.items.length === 0) { - continue; + continue } - const text = content?.items.map((item: any) => item.str).join("\n") - .replace(/\x00/g, "").trim(); + const text = content?.items + .map((item: any) => item.str) + .join("\n") + .replace(/\x00/g, "") + .trim() pdfHtml.push({ content: text, page: i }) } - return { url, content: "", pdf: pdfHtml, type: "pdf" } - } - - return { url, content, type, pdf: [] } + if (isTwitterTimeline(url)) { + const data = parseTwitterTimeline(content) + return { + url, + content: data, + type: "html", + pdf: [] + } + } else if (isTweet(url)) { + const data = parseTweet(content) + return { + url, + content: data, + type: "html", + pdf: [] + } + } else if (isGoogleDocs(url)) { + const data = await parseGoogleDocs() + if (data) { + return { + url, + content: cleanUnwantedUnicode(data), + type: "html", + pdf: [] + } + } + } + const data = defaultExtractContent(content) + return { url, content: data, type, pdf: [] } } - diff --git a/src/loader/html.ts b/src/loader/html.ts index de567f0..94eaed0 100644 --- a/src/loader/html.ts +++ b/src/loader/html.ts @@ -59,24 +59,24 @@ export class PageAssistHtmlLoader ] } - let html = this.html + // let html = this.html - if (isWikipedia(this.url)) { - console.log("Wikipedia URL detected") - html = parseWikipedia(html) - } - - // else if (isTwitter(this.url)) { - // console.log("Twitter URL detected") - // html = parseTweet(html, this.url) + // if (isWikipedia(this.url)) { + // console.log("Wikipedia URL detected") + // html = parseWikipedia(html) // } - const htmlCompiler = compile({ - wordwrap: false - }) - const text = htmlCompiler(html) + // // else if (isTwitter(this.url)) { + // // console.log("Twitter URL detected") + // // html = parseTweet(html, this.url) + // // } + + // const htmlCompiler = compile({ + // wordwrap: false + // }) + // const text = htmlCompiler(html) const metadata = { source: this.url } - return [new Document({ pageContent: text, metadata })] + return [new Document({ pageContent: this.html, metadata })] } async loadByURL(): Promise>[]> { @@ -110,7 +110,7 @@ export class PageAssistHtmlLoader console.log("Wikipedia URL detected") html = parseWikipedia(await fetchHTML.text()) } - + // else if (isTwitter(this.url)) { // console.log("Twitter URL detected") // html = parseTweet(await fetchHTML.text(), this.url) diff --git a/src/parser/default.ts b/src/parser/default.ts new file mode 100644 index 0000000..e15c9ad --- /dev/null +++ b/src/parser/default.ts @@ -0,0 +1,10 @@ +import * as cheerio from "cheerio" +import TurndownService from "turndown" +let turndownService = new TurndownService() + +export const defaultExtractContent = (html: string) => { + const $ = cheerio.load(html) + const mainContent = $('[role="main"]').html() || $("main").html() || $.html() + const markdown = turndownService.turndown(mainContent) + return markdown +} diff --git a/src/parser/google-docs.ts b/src/parser/google-docs.ts new file mode 100644 index 0000000..23e7316 --- /dev/null +++ b/src/parser/google-docs.ts @@ -0,0 +1,119 @@ + +export const isGoogleDocs = (url: string) => { + const GOOGLE_DOCS_REGEX = /docs\.google\.com\/document/g + return GOOGLE_DOCS_REGEX.test(url) +} + +const getGoogleDocs = () => { + try { + function traverse( + obj: { [x: string]: any }, + predicate: { (_: any, value: any): boolean; (arg0: any, arg1: any): any }, + maxDepth: number, + propNames = Object.getOwnPropertyNames(obj) + ) { + const visited = new Set() + const results = [] + let iterations = 0 + + const traverseObj = ( + name: string, + value: unknown, + path: any[], + depth = 0 + ) => { + iterations++ + if (name === "prototype" || value instanceof Window || depth > maxDepth) + return + + const currentPath = [...path, name] + + try { + if (predicate(name, value)) { + results.push({ path: currentPath, value }) + return + } + } catch (error) {} + + if (value != null && !visited.has(value)) { + visited.add(value) + if (Array.isArray(value)) { + value.forEach((val, index) => { + try { + traverseObj(index.toString(), val, currentPath, depth + 1) + } catch (error) {} + }) + } else if (value instanceof Object) { + const propNamesForValue = + value && + // @ts-ignore + value.nodeType === 1 && + // @ts-ignore + typeof value.nodeName === "string" + ? Object.getOwnPropertyNames(obj) + : Object.getOwnPropertyNames(value) + + propNamesForValue.forEach((prop) => { + try { + traverseObj(prop, value[prop], currentPath, depth + 1) + } catch (error) {} + }) + } + } + } + + propNames.forEach((prop) => { + try { + traverseObj(prop, obj[prop], []) + } catch (error) {} + }) + + return { results, iterations } + } + + const result = traverse( + // @ts-ignore + window.KX_kixApp, + (_: any, value: { toString: () => string }) => + value && "\x03" === value.toString().charAt(0), + 5 + ) + if (result.results?.[0]?.value) { + return { + content: result.results[0].value + } + } + + return { + content: null + } + } catch (error) { + return { + content: null + } + } +} + +export const parseGoogleDocs = async () => { + const result = new Promise((resolve) => { + chrome.tabs.query({ active: true, currentWindow: true }, async (tabs) => { + const tab = tabs[0] + + const data = await chrome.scripting.executeScript({ + target: { tabId: tab.id }, + world: "MAIN", + func: getGoogleDocs + }) + + if (data.length > 0) { + resolve(data[0].result) + } + }) + }) as Promise<{ + content?: string + }> + + const { content } = await result + + return content +} diff --git a/src/parser/google-sheets.ts b/src/parser/google-sheets.ts new file mode 100644 index 0000000..21f3120 --- /dev/null +++ b/src/parser/google-sheets.ts @@ -0,0 +1,5 @@ +import * as cheerio from 'cheerio'; + +export const parseGoogleSheets = (html: string) => { + const $ = cheerio.load(html); +}; \ No newline at end of file diff --git a/src/parser/twitter.ts b/src/parser/twitter.ts index a998945..cfbbd3d 100644 --- a/src/parser/twitter.ts +++ b/src/parser/twitter.ts @@ -2,89 +2,101 @@ import * as cheerio from "cheerio" export const isTweet = (url: string) => { const TWEET_REGEX = /twitter\.com\/[a-zA-Z0-9_]+\/status\/[0-9]+/g - return TWEET_REGEX.test(url) + const X_REGEX = /x\.com\/[a-zA-Z0-9_]+\/status\/[0-9]+/g + return TWEET_REGEX.test(url) || X_REGEX.test(url) +} + +export const isTwitterTimeline = (url: string) => { + return url === "https://twitter.com/home" || url === "https://x.com/home" } export const isTwitterProfile = (url: string) => { const PROFILE_REGEX = /twitter\.com\/[a-zA-Z0-9_]+/g - return PROFILE_REGEX.test(url) + const X_REGEX = /x\.com\/[a-zA-Z0-9_]+/g + return PROFILE_REGEX.test(url) || X_REGEX.test(url) } -export const isTwitterTimeline = (url: string) => { - const TIMELINE_REGEX = /twitter\.com\/home/g - return TIMELINE_REGEX.test(url) +export const parseTwitterTimeline = (html: string) => { + const $ = cheerio.load(html) + const postElements = $("[data-testid=tweetText]") + const authorElements = $("[data-testid=User-Name]") + + const posts = postElements + .map((index, element) => { + const post = $(element).text() + const author = $(authorElements[index]).text() + return { + author, + post + } + }) + .get() + + return posts + .map((post) => { + return `## Author: ${post.author}\n\n${post.post}\n\n---\n\n` + }) + .filter((value, index, self) => self.indexOf(value) === index) + .join("\n") } -export const isTwitter = (url: string) => { - return isTweet(url) || isTwitterProfile(url) || isTwitterTimeline(url) +export const parseTweet = (html: string) => { + const $ = cheerio.load(html) + const postElements = $("[data-testid=tweetText]") + const authorElements = $("[data-testid=User-Name]") + + const posts = postElements + .map((index, element) => { + const post = $(element).text() + const author = $(authorElements[index]).text() + return { + author, + post, + isReply: index !== 0 + } + }) + .get() + + return posts + .map((post) => { + return `##Author: ${post.author}\n\n${post.isReply ? "Reply:" : "Post:"} ${post.post}\n\n---\n\n` + }) + .join("\n") } -export const isTwitterNotification = (url: string) => { - const NOTIFICATION_REGEX = /twitter\.com\/notifications/g - return NOTIFICATION_REGEX.test(url) -} - -export const parseTweet = (html: string, url: string) => { - if (!html) { - return "" - } - +export const parseTweetProfile = (html: string) => { const $ = cheerio.load(html) - if (isTweet(url)) { - console.log("tweet") - const tweet = $("div[data-testid='tweet']") - const tweetContent = tweet.find("div[lang]") - const tweetMedia = tweet.find("div[role='group']") - const author = tweet.find("a[role='link']").text() - const date = tweet.find("time").text() - return `

${author} ${tweetContent.text()} ${tweetMedia.html()} ${date}
` - } + const profileName = $("[data-testid=UserProfileHeader_Items]") + .find("h1") + .text() + const profileBio = $("[data-testid=UserProfileHeader_Items]").find("p").text() + const profileLocation = $("[data-testid=UserProfileHeader_Items]") + .find("span") + .text() + const profileJoinDate = $("[data-testid=UserProfileHeader_Items]") + .find("span") + .text() + const profileFollowers = $( + "[data-testid=UserProfileHeader_Items] span" + ).text() + const profileFollowing = $( + "[data-testid=UserProfileHeader_Items] span" + ).text() - if (isTwitterTimeline(url)) { - console.log("timeline") - const timeline = $("div[data-testid='primaryColumn']") - const timelineContent = timeline.find("div[data-testid='tweet']") - console.log(timelineContent.html()) - const tweet = timelineContent - .map((i, el) => { - const author = $(el).find("a[role='link']").text() - const content = $(el).find("div[lang]").text() - const media = $(el).find("div[role='group']").html() - const date = $(el).find("time").text() - return `
${author} ${content} ${media} ${date}
` - }) - .get() - .join("") - console.log(tweet) - return `
${tweet}
` - } + const postElements = $("[data-testid=tweetText]") + const authorElements = $("[data-testid=User-Name]") - if (isTwitterNotification(url)) { - console.log("notification") - const notification = $("div[data-testid='primaryColumn']") - const notificationContent = notification.find("div[data-testid='tweet']") - return `
${notificationContent.html()}
` - } - if (isTwitterProfile(url)) { - console.log("profile") - const profile = $("div[data-testid='primaryColumn']") - const profileContent = profile.find( - "div[data-testid='UserProfileHeader_Items']" - ) - const profileTweets = profile.find("div[data-testid='tweet']") - return `
${profileContent.html()}
${profileTweets.html()}
` - } - console.log("no match") - const timeline = $("div[data-testid='primaryColumn']") - const timelineContent = timeline.find("div[data-testid='tweet']") - const tweet = timelineContent.map((i, el) => { - const author = $(el).find("a[role='link']").text() - const content = $(el).find("div[lang]").text() - const media = $(el).find("div[role='group']").html() - const date = $(el).find("time").text() - return `
${author} ${content} ${media} ${date}
` - }) + const posts = postElements + .map((index, element) => { + const post = $(element).text() + const author = $(authorElements[index]).text() + return { + author, + post + } + }) + .get() - return `
${tweet}
` + return `## Profile: ${profileName}\n\nBio: ${profileBio}\n\nLocation: ${profileLocation}\n\nJoin Date: ${profileJoinDate}\n\nFollowers: ${profileFollowers}\n\nFollowing: ${profileFollowing}\n\nPosts: ${posts.map((post) => `Author: ${post.author}\n\nPost: ${post.post}\n\n---\n\n`).join("\n")}` } diff --git a/src/utils/clean.ts b/src/utils/clean.ts new file mode 100644 index 0000000..e49c44d --- /dev/null +++ b/src/utils/clean.ts @@ -0,0 +1,4 @@ +export const cleanUnwantedUnicode = (text: string) => { + const UNICODE_REGEX = /[\u200B-\u200D\uFEFF]/g + return text.replace(UNICODE_REGEX, "").trim() +}