Files
code-box/contents/segmentfault.tsx
2025-04-25 15:37:56 +08:00

119 lines
3.3 KiB
TypeScript

import type {
PlasmoCSConfig,
PlasmoCSUIProps,
PlasmoGetOverlayAnchor,
PlasmoGetShadowHostId,
PlasmoGetStyle
} from "plasmo"
import React, { type FC } from "react"
import { useMessage } from "@plasmohq/messaging/hook"
import { useStorage } from "@plasmohq/storage/dist/hook"
import TagBtnStyle from "~component/tagBtn/style"
import Tags from "~component/ui/tags"
import ToolBox from "~component/ui/toolBox"
import { i18n, saveHtml, saveMarkdown } from "~tools"
import useCssCodeHook from "~utils/cssCodeHook"
import { useEditMarkdown } from "~utils/editMarkdownHook"
import { useParseMarkdown } from "~utils/parseMarkdownHook"
import { Print } from "~utils/print"
import Turndown from "~utils/turndown"
export const config: PlasmoCSConfig = {
matches: ["https://*.segmentfault.com/**"]
}
const turndownService = Turndown()
const articleTitle = document
.querySelector<HTMLElement>("head title")
.innerText.trim()
const HOST_ID = "codebox-segmentfault"
export const getShadowHostId: PlasmoGetShadowHostId = () => HOST_ID
export const getOverlayAnchor: PlasmoGetOverlayAnchor = async () =>
document.querySelector(".article-wrap.container")
export const getStyle: PlasmoGetStyle = () => TagBtnStyle()
const PlasmoOverlay: FC<PlasmoCSUIProps> = ({ anchor }) => {
const [parseContent, setParseContent] = useParseMarkdown()
const [allShowTag, setAllShowTag] = useStorage("config-allShowTag", true)
const [showTag, setShowTag] = useStorage<boolean>(
"segmentfault-showTag",
true
)
const [cssCode, runCss] = useCssCodeHook("segmentfault")
const [content, setContent] = useEditMarkdown()
useMessage(async (req, res) => {
if (req.name == "segmentfault-isShow") {
res.send({ isShow: true })
}
if (req.name == "segmentfault-editMarkdown") {
editMarkdown()
}
if (req.name == "segmentfault-downloadMarkdown") {
downloadMarkdown()
}
if (req.name == "segmentfault-downloadHtml") {
downloadHtml()
}
if (req.name == "segmentfault-downloadPdf") {
downloadPdf()
}
})
function getDescription() {
const summary = document.querySelector<HTMLMetaElement>(
'meta[name="description"]'
).content
summary && prompt("文章摘要:", summary)
}
function downloadPdf() {
const article = document.querySelector<HTMLElement>(".container")
if (article) {
Print.print(article, { title: articleTitle })
.then(() => console.log("Printing complete"))
.catch((error) => console.error("Printing failed:", error))
}
}
function editMarkdown() {
const dom = document.querySelector(".container")
setContent(dom, articleTitle)
}
function downloadMarkdown() {
const html = document.querySelector(".container")
const markdown = turndownService.turndown(html)
saveMarkdown(markdown, articleTitle)
}
function downloadHtml() {
const dom = document.querySelector(".container")
saveHtml(dom, articleTitle)
}
function parseMarkdown() {
const dom = document.querySelector(".container")
setParseContent(dom)
}
return showTag && allShowTag ? (
<ToolBox
onGetDescription={getDescription}
onEditMarkdown={editMarkdown}
onDownloadMarkdown={downloadMarkdown}
onPrint={downloadPdf}
onParseMarkdown={parseMarkdown}
/>
) : (
<></>
)
}
export default PlasmoOverlay