7 Commits
dev ... main

Author SHA1 Message Date
fzk
8478eecefc 增加关闭所有标签 2025-04-25 15:37:56 +08:00
fzk
1826319d5a 修改文档 2025-03-18 09:10:10 +08:00
fzk
1af9a6d1f7 新增洛谷和pianshen 2025-03-12 13:54:24 +08:00
fzk
a3b1f23c05 优化代码 2025-03-12 11:49:14 +08:00
fzk
36183ed9e4 增加360doc 2025-03-10 16:43:47 +08:00
fzk
f23298113c 增加paywallbuster网站 2025-03-10 10:20:22 +08:00
fzk
182994a0df 百度闪烁bug 2025-03-10 09:10:37 +08:00
40 changed files with 708 additions and 176 deletions

View File

@@ -2,9 +2,11 @@
[中文](README.md) | [English](README_EN.md)
##
## 网
1. 官网
https://www.code-box.fun/
2. 文档
https://code-box.fun/docs
## 介绍
@@ -38,7 +40,7 @@ https://www.code-box.fun/
### 安装方式三:公众号下载
1. 关注公众号
![img](https://raw.githubusercontent.com/027xiguapi/code-box/main/public/wx/qrcode_wx.jpg)
![img](https://github.com/027xiguapi/code-box/blob/main/public/wx/gzh.jpg)
2. 点击 `软件下载`
@@ -181,6 +183,6 @@ https://www.code-box.fun/
## 联系
![img](https://raw.githubusercontent.com/027xiguapi/code-box/main/public/wx/qrcode_wx.jpg)
![img](https://github.com/027xiguapi/code-box/blob/main/public/wx/gzh.jpg)
![u_wx](https://github.com/027xiguapi/code-box/blob/main/public/wx/u_wx.jpg)

View File

@@ -0,0 +1,23 @@
import CssCode from "~component/items/cssCode"
import DownloadHtml from "~component/items/downloadHtml"
import DownloadMarkdown from "~component/items/downloadMarkdown"
import DownloadPdf from "~component/items/downloadPdf"
import EditMarkdown from "~component/items/editMarkdown"
import ShowTag from "~component/items/showTag"
import { i18n } from "~tools"
export default function Options(props) {
let { name } = props
return (
<fieldset>
<legend>{i18n(name + "Config")}</legend>
<CssCode name={name}></CssCode>
<ShowTag name={name}></ShowTag>
<EditMarkdown name={name}></EditMarkdown>
<DownloadMarkdown name={name}></DownloadMarkdown>
<DownloadHtml name={name}></DownloadHtml>
<DownloadPdf name={name}></DownloadPdf>
</fieldset>
)
}

View File

@@ -0,0 +1,5 @@
import Options from "~component/items/options"
export default function Doc360() {
return <Options name="360doc" />
}

View File

@@ -15,6 +15,9 @@ export default function Config({ forwardRef }) {
const [closeLog, setCloseLog] = useStorage("config-closeLog", (v) =>
v === undefined ? true : v
)
const [allShowTag, setAllShowTag] = useStorage("config-allShowTag", (v) =>
v === undefined ? true : v
)
function downloadFullImg() {
sendToContentScript({
@@ -59,6 +62,18 @@ export default function Config({ forwardRef }) {
/>
<label className="codebox-switch" htmlFor="config-copyCode"></label>
</div>
<div className="item">
<span>{i18n("allShowTag")}</span>
<input
type="checkbox"
id="allShowTag"
name="allShowTag"
className="codebox-offscreen"
checked={allShowTag}
onChange={(e) => setAllShowTag(e.target.checked)}
/>
<label htmlFor="allShowTag" className="codebox-switch"></label>
</div>
<div className="item">
<span>{i18n("configCloseLog")}</span>
<input

View File

@@ -1,6 +1,7 @@
import React, { useEffect, useRef, useState } from "react"
import Cto51 from "~component/options/51cto"
import Doc360 from "~component/options/360doc"
import Baidu from "~component/options/baidu"
import Cnblogs from "~component/options/cnblogs"
import Config from "~component/options/config"
@@ -9,30 +10,69 @@ import Custom from "~component/options/custom"
import Jb51 from "~component/options/jb51"
import Jianshu from "~component/options/jianshu"
import Juejin from "~component/options/juejin"
import Lougu from "~component/options/lougu"
import Medium from "~component/options/medium"
import Mp from "~component/options/mp"
import Oschina from "~component/options/oschina"
import Paywallbuster from "~component/options/paywallbuster"
import Php from "~component/options/php"
import Pianshen from "~component/options/pianshen"
import Segmentfault from "~component/options/segmentfault"
import Weixin from "~component/options/weixin"
import Zhihu from "~component/options/zhihu"
export default function Content() {
const [csdnIsShow, setCsdnIsShow] = useState<boolean>(false)
const [zhihuIsShow, setZhihuIsShow] = useState<boolean>(false)
const [baiduIsShow, setBaiduIsShow] = useState<boolean>(false)
const [jianshuIsShow, setJianshuIsShow] = useState<boolean>(false)
const [jb51IsShow, setJb51IsShow] = useState<boolean>(false)
const [cnblogsIsShow, setCnblogsShow] = useState<boolean>(false)
const [ctoIsShow, set51ctoIsShow] = useState<boolean>(false)
const [juejinIsShow, setJuejinIsShow] = useState<boolean>(false)
const [phpIsShow, setPhpIsShow] = useState<boolean>(false)
const [oschinaIsShow, setOschinaIsShow] = useState<boolean>(false)
const [segmentfaultIsShow, setSegmentfaultIsShow] = useState<boolean>(false)
const [weixinIsShow, setWeixinIsShow] = useState<boolean>(false)
const [mediumIsShow, setMediumIsShow] = useState<boolean>(false)
const [mpIsShow, setMpIsShow] = useState<boolean>(false)
let csdnIsShow = false
let zhihuIsShow = false
let baiduIsShow = false
let jianshuIsShow = false
let jb51IsShow = false
let cnblogsIsShow = false
let ctoIsShow = false
let juejinIsShow = false
let phpIsShow = false
let oschinaIsShow = false
let segmentfaultIsShow = false
let mediumIsShow = false
let paywallbusterIsShow = false
let doc360IsShow = false
let mpIsShow = false
let weixinIsShow = false
let pianshenIsShow = false
let louguIsShow = false
chrome.tabs.query({ active: true, currentWindow: true }, (tabs) => {
const currentTab = tabs[0]
if (currentTab) {
const url = new URL(currentTab.url)
const { hostname, pathname } = url
csdnIsShow = hostname.includes("csdn")
zhihuIsShow = hostname.includes("zhihu")
baiduIsShow = hostname.includes("baidu")
jianshuIsShow = hostname.includes("jianshu")
jb51IsShow = hostname.includes("jb51")
cnblogsIsShow = hostname.includes("cnblogs")
ctoIsShow = hostname.includes("51cto")
juejinIsShow = hostname.includes("juejin")
phpIsShow = hostname.includes("php")
oschinaIsShow = hostname.includes("oschina")
segmentfaultIsShow = hostname.includes("segmentfault")
mediumIsShow = hostname.includes("medium")
paywallbusterIsShow = hostname.includes("paywallbuster")
doc360IsShow = hostname.includes("360doc")
pianshenIsShow = hostname.includes("pianshen")
louguIsShow = hostname.includes("lougu")
if (hostname.includes("weixin")) {
if (pathname.includes("cgi-bin")) {
mpIsShow = true
} else {
weixinIsShow = true
}
}
}
})
export default function Content() {
const csdnRef = useRef<any>()
const zhihuRef = useRef<any>()
const baiduRef = useRef<any>()
@@ -48,42 +88,12 @@ export default function Content() {
const customRef = useRef<any>()
const appRef = useRef<any>()
useEffect(() => {
chrome.tabs.query({ active: true, currentWindow: true }, (tabs) => {
const currentTab = tabs[0]
if (currentTab) {
const url = new URL(currentTab.url)
const { hostname, pathname } = url
hostname.includes("csdn") && setCsdnIsShow(true)
hostname.includes("zhihu") && setZhihuIsShow(true)
hostname.includes("baidu") && setBaiduIsShow(true)
hostname.includes("jianshu") && setJianshuIsShow(true)
hostname.includes("jb51") && setJb51IsShow(true)
hostname.includes("cnblogs") && setCnblogsShow(true)
hostname.includes("51cto") && set51ctoIsShow(true)
hostname.includes("juejin") && setJuejinIsShow(true)
hostname.includes("php") && setPhpIsShow(true)
hostname.includes("oschina") && setOschinaIsShow(true)
hostname.includes("segmentfault") && setSegmentfaultIsShow(true)
hostname.includes("medium") && setMediumIsShow(true)
if (hostname.includes("weixin")) {
if (pathname.includes("cgi-bin")) {
setMpIsShow(true)
} else {
setWeixinIsShow(true)
}
}
}
})
}, [])
return (
<div className="content">
{csdnIsShow ? <Csdn forwardRef={csdnRef} /> : <></>}
{zhihuIsShow ? <Zhihu forwardRef={zhihuRef} /> : <></>}
{baiduIsShow ? <Baidu forwardRef={baiduRef} /> : <></>}
{jianshuIsShow ? <Jianshu forwardRef={juejinRef} /> : <></>}
{jianshuIsShow ? <Jianshu forwardRef={jianshuRef} /> : <></>}
{jb51IsShow ? <Jb51 forwardRef={jb51Ref} /> : <></>}
{cnblogsIsShow ? <Cnblogs forwardRef={cnblogsRef} /> : <></>}
{ctoIsShow ? <Cto51 forwardRef={cto51Ref} /> : <></>}
@@ -94,6 +104,10 @@ export default function Content() {
{weixinIsShow ? <Weixin /> : <></>}
{mediumIsShow ? <Medium /> : <></>}
{mpIsShow ? <Mp /> : <></>}
{paywallbusterIsShow ? <Paywallbuster /> : <></>}
{doc360IsShow ? <Doc360 /> : <></>}
{pianshenIsShow ? <Pianshen /> : <></>}
{louguIsShow ? <Lougu /> : <></>}
<Custom />
<Config forwardRef={customRef} />
</div>

View File

@@ -16,6 +16,11 @@ export default function Custom() {
name: "app-makerQRPost"
})
}
function getArticle() {
sendToContentScript({
name: "app-getArticle"
})
}
return (
<fieldset>
<legend>{i18n("customConfig")}</legend>
@@ -32,6 +37,13 @@ export default function Custom() {
</span>
<DownloadOutlined style={{ color: "#52c41a", fontSize: "16px" }} />
</div>
<div className="item download" onClick={getArticle}>
<span>
<StarTwoTone twoToneColor="#eb2f96" style={{ marginRight: "5px" }} />
{i18n("getArticle")}
</span>
<DownloadOutlined style={{ color: "#52c41a", fontSize: "16px" }} />
</div>
</fieldset>
)
}

View File

@@ -1,21 +1,5 @@
import CssCode from "~component/items/cssCode"
import DownloadHtml from "~component/items/downloadHtml"
import DownloadMarkdown from "~component/items/downloadMarkdown"
import DownloadPdf from "~component/items/downloadPdf"
import EditMarkdown from "~component/items/editMarkdown"
import ShowTag from "~component/items/showTag"
import { i18n } from "~tools"
import Options from "~component/items/options"
export default function Juejin() {
return (
<fieldset>
<legend>{i18n("juejinConfig")}</legend>
<CssCode name="juejin"></CssCode>
<ShowTag name="juejin"></ShowTag>
<EditMarkdown name="juejin"></EditMarkdown>
<DownloadMarkdown name="juejin"></DownloadMarkdown>
<DownloadHtml name="juejin"></DownloadHtml>
<DownloadPdf name="juejin"></DownloadPdf>
</fieldset>
)
return <Options name="juejin" />
}

View File

@@ -0,0 +1,5 @@
import Options from "~component/items/options"
export default function Lougu() {
return <Options name="lougu" />
}

View File

@@ -1,21 +1,5 @@
import CssCode from "~component/items/cssCode"
import DownloadHtml from "~component/items/downloadHtml"
import DownloadMarkdown from "~component/items/downloadMarkdown"
import DownloadPdf from "~component/items/downloadPdf"
import EditMarkdown from "~component/items/editMarkdown"
import ShowTag from "~component/items/showTag"
import { i18n } from "~tools"
import Options from "~component/items/options"
export default function Medium() {
return (
<fieldset>
<legend>{i18n("mediumConfig")}</legend>
<CssCode name="medium"></CssCode>
<ShowTag name="medium"></ShowTag>
<EditMarkdown name="medium"></EditMarkdown>
<DownloadMarkdown name="medium"></DownloadMarkdown>
<DownloadHtml name="medium"></DownloadHtml>
<DownloadPdf name="medium"></DownloadPdf>
</fieldset>
)
return <Options name="medium" />
}

View File

@@ -1,21 +1,5 @@
import CssCode from "~component/items/cssCode"
import DownloadHtml from "~component/items/downloadHtml"
import DownloadMarkdown from "~component/items/downloadMarkdown"
import DownloadPdf from "~component/items/downloadPdf"
import EditMarkdown from "~component/items/editMarkdown"
import ShowTag from "~component/items/showTag"
import { i18n } from "~tools"
import Options from "~component/items/options"
export default function Oschina() {
return (
<fieldset>
<legend>{i18n("oschinaConfig")}</legend>
<CssCode name="oschina"></CssCode>
<ShowTag name="oschina"></ShowTag>
<EditMarkdown name="oschina"></EditMarkdown>
<DownloadMarkdown name="oschina"></DownloadMarkdown>
<DownloadHtml name="oschina"></DownloadHtml>
<DownloadPdf name="oschina"></DownloadPdf>
</fieldset>
)
return <Options name="oschina" />
}

View File

@@ -0,0 +1,5 @@
import Options from "~component/items/options"
export default function Paywallbuster() {
return <Options name="paywallbuster" />
}

View File

@@ -0,0 +1,5 @@
import Options from "~component/items/options"
export default function Pianshen() {
return <Options name="pianshen" />
}

View File

@@ -1,21 +1,5 @@
import CssCode from "~component/items/cssCode"
import DownloadHtml from "~component/items/downloadHtml"
import DownloadMarkdown from "~component/items/downloadMarkdown"
import DownloadPdf from "~component/items/downloadPdf"
import EditMarkdown from "~component/items/editMarkdown"
import ShowTag from "~component/items/showTag"
import { i18n } from "~tools"
import Options from "~component/items/options"
export default function Segmentfault() {
return (
<fieldset>
<legend>{i18n("segmentfaultConfig")}</legend>
<CssCode name="segmentfault" />
<ShowTag name="segmentfault" />
<EditMarkdown name="segmentfault" />
<DownloadMarkdown name="segmentfault" />
<DownloadHtml name="segmentfault" />
<DownloadPdf name="segmentfault" />
</fieldset>
)
return <Options name="segmentfault" />
}

View File

@@ -35,7 +35,7 @@ const styles = {
right: "10px",
background: "none",
border: "none",
fontSize: "1.5rem",
fontSize: "18px",
cursor: "pointer",
padding: "0.5rem"
},
@@ -65,7 +65,7 @@ const styles = {
marginBottom: "1rem"
},
captchaText: {
fontSize: "1.2rem",
fontSize: "16px",
letterSpacing: "2px",
color: "#333"
},
@@ -78,7 +78,7 @@ const styles = {
padding: "0.8rem",
border: "1px solid #ddd",
borderRadius: "4px",
fontSize: "1rem",
fontSize: "14px",
outline: "none",
"&:focus": {
borderColor: "#007bff"
@@ -97,8 +97,8 @@ const styles = {
},
errorText: {
color: "#ff4444",
fontSize: "0.9rem",
marginTop: "0.5rem"
fontSize: "14px",
marginTop: "6px"
}
}

View File

@@ -100,7 +100,12 @@ export default function CustomDomSelector() {
useMessage(async (req: any, res: any) => {
const name = req.name
setCustom(name.split("-")[1])
const isApp = name.split("-")[0] == "app"
console.log(isApp)
if (name && !isApp) {
const type = name.split("-")[1]
setCustom(type)
}
})
const setCustom = (type: string) => {

View File

@@ -20,16 +20,16 @@ const boxStyles = {
right: "0px",
background: "none",
border: "none",
fontSize: "1.5rem",
fontSize: "20px",
cursor: "pointer",
padding: "0.5rem"
padding: "10px"
},
img: {
width: "100%"
},
item: {
color: "#000000",
fontSize: "1.2rem",
fontSize: "16px",
marginBottom: "3px"
}
}
@@ -56,12 +56,20 @@ export default function ToolBox(props: any) {
props.onPrint()
}
const getArticle = () => {
const href = encodeURIComponent(location.href)
window.open(`https://paywallbuster.com/articles/?article=${href}`)
}
const handleClose = () => {
setIsShowTag(false)
}
return isShowTag ? (
<div id="ws_cmbm" className="ws_cmbmc" style={boxStyles.box}>
<div
id="ws_cmbm"
className="ws_cmbmc"
style={{ ...boxStyles.box, ...props.style }}>
<button style={boxStyles.close} onClick={handleClose} aria-label="Close">
×
</button>
@@ -84,6 +92,9 @@ export default function ToolBox(props: any) {
<div style={boxStyles.item}>
<a onClick={() => editQRCodeImg()}>{i18n("makerQRPost")}</a>
</div>
<div style={boxStyles.item}>
<a onClick={() => getArticle()}>{i18n("getArticle")}</a>
</div>
<a style={boxStyles.item} href="https://www.code-box.fun" target="_blank">
</a>

View File

@@ -36,7 +36,7 @@ const styles = {
right: "10px",
background: "none",
border: "none",
fontSize: "1.5rem",
fontSize: "18px",
cursor: "pointer",
padding: "0.5rem"
},
@@ -76,7 +76,7 @@ const styles = {
marginBottom: "1rem"
},
captchaText: {
fontSize: "1.2rem",
fontSize: "16px",
letterSpacing: "2px",
color: "#333"
},
@@ -89,7 +89,7 @@ const styles = {
padding: "0.8rem",
border: "1px solid #ddd",
borderRadius: "4px",
fontSize: "1rem",
fontSize: "16px",
outline: "none",
"&:focus": {
borderColor: "#007bff"
@@ -108,7 +108,7 @@ const styles = {
},
errorText: {
color: "#ff4444",
fontSize: "0.9rem",
fontSize: "16px",
marginTop: "0.5rem"
}
}

105
contents/360doc.tsx Normal file
View File

@@ -0,0 +1,105 @@
import type {
PlasmoCSConfig,
PlasmoCSUIProps,
PlasmoGetShadowHostId
} from "plasmo"
import React, { type FC } from "react"
import { useMessage } from "@plasmohq/messaging/hook"
import { useStorage } from "@plasmohq/storage/dist/hook"
import ToolBox from "~component/ui/toolBox"
import { 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://*.360doc.com/content/*", "http://*.360doc.com/content/*"]
}
const turndownService = Turndown()
const articleTitle = document
.querySelector<HTMLElement>("head title")
.innerText.trim()
export const getShadowHostId: PlasmoGetShadowHostId = () => "codebox-360doc"
const PlasmoOverlay: FC<PlasmoCSUIProps> = () => {
const [parseContent, setParseContent] = useParseMarkdown()
const [allShowTag, setAllShowTag] = useStorage("config-allShowTag", true)
const [showTag, setShowTag] = useStorage<boolean>("360doc-showTag", true)
const [cssCode, runCss] = useCssCodeHook("360doc")
const [content, setContent] = useEditMarkdown()
useMessage(async (req, res) => {
if (req.name == "360doc-isShow") {
res.send({ isShow: true })
}
if (req.name == "360doc-editMarkdown") {
editMarkdown()
}
if (req.name == "360doc-downloadMarkdown") {
downloadMarkdown()
}
if (req.name == "360doc-downloadHtml") {
downloadHtml()
}
if (req.name == "360doc-downloadPdf") {
downloadPdf()
}
})
function getDescription() {
const summary = document.querySelector<HTMLMetaElement>(
'meta[name="description"]'
).content
summary && prompt("文章摘要:", summary)
}
function downloadPdf() {
const article = document.querySelector<HTMLElement>("#bgchange")
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("#bgchange")
setContent(dom, articleTitle)
}
function downloadMarkdown() {
const html = document.querySelector("#bgchange")
const markdown = turndownService.turndown(html)
saveMarkdown(markdown, articleTitle)
}
function downloadHtml() {
const dom = document.querySelector("#bgchange")
saveHtml(dom, articleTitle)
}
function parseMarkdown() {
const dom = document.querySelector("#bgchange")
setParseContent(dom)
}
return showTag && allShowTag ? (
<ToolBox
onGetDescription={getDescription}
onEditMarkdown={editMarkdown}
onDownloadMarkdown={downloadMarkdown}
onPrint={downloadPdf}
onParseMarkdown={parseMarkdown}
/>
) : (
<></>
)
}
export default PlasmoOverlay

View File

@@ -40,6 +40,7 @@ export const getStyle: PlasmoGetStyle = () => TagBtnStyle()
const PlasmoOverlay: FC<PlasmoCSUIProps> = ({ anchor }) => {
const [parseContent, setParseContent] = useParseMarkdown()
const [showTag, setShowTag] = useStorage<boolean>("51cto-showTag", true)
const [allShowTag, setAllShowTag] = useStorage("config-allShowTag", true)
const [cssCode, runCss] = useCssCodeHook("51cto")
const [copyCode] = useStorage<boolean>("51cto-copyCode")
const [closeLoginModal] = useStorage<boolean>("51cto-closeLoginModal")
@@ -250,7 +251,7 @@ const PlasmoOverlay: FC<PlasmoCSUIProps> = ({ anchor }) => {
setParseContent(dom)
}
return showTag ? (
return showTag && allShowTag ? (
<Tags
onEdit={editMarkdown}
onDownload={downloadMarkdown}

View File

@@ -26,11 +26,11 @@ const articleTitle = document
.innerText.trim()
export const getShadowHostId: PlasmoGetShadowHostId = () => "codebox-baidu"
const isBaijiahao = location.hostname.includes("baijiahao")
const PlasmoOverlay: FC<PlasmoCSUIProps> = () => {
const [parseContent, setParseContent] = useParseMarkdown()
const [allShowTag, setAllShowTag] = useStorage("config-allShowTag", true)
const [showTag, setShowTag] = useStorage<boolean>("baidu-showTag", true)
const [isBaijiahao, setIsBaijiahao] = useState<boolean>(true)
const [cssCode, runCss] = useCssCodeHook("baidu")
const [closeAIBox] = useStorage<boolean>("baidu-closeAIBox")
const [closeLog] = useStorage("config-closeLog", true)
@@ -39,9 +39,6 @@ const PlasmoOverlay: FC<PlasmoCSUIProps> = () => {
useEffect(() => {
closeLog || console.log("baidu", { closeAIBox })
closeAIBox && closeAIBoxFunc()
if (location.hostname.includes("www")) {
setIsBaijiahao(false)
}
}, [closeAIBox])
useMessage(async (req, res) => {
@@ -113,7 +110,7 @@ const PlasmoOverlay: FC<PlasmoCSUIProps> = () => {
setParseContent(dom)
}
return showTag && isBaijiahao ? (
return showTag && allShowTag && isBaijiahao ? (
<ToolBox
onGetDescription={getDescription}
onEditMarkdown={editMarkdown}

View File

@@ -12,7 +12,6 @@ import { useMessage } from "@plasmohq/messaging/hook"
import { useStorage } from "@plasmohq/storage/hook"
import TagBtnStyle from "~component/tagBtn/style"
import Tags from "~component/ui/tags"
import ToolBox from "~component/ui/toolBox"
import { saveHtml, saveMarkdown } from "~tools"
import useCssCodeHook from "~utils/cssCodeHook"
@@ -41,6 +40,7 @@ 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>("cnblogs-showTag", true)
const [cssCode, runCss] = useCssCodeHook("cnblogs")
const [copyCode] = useStorage<boolean>("cnblogs-copyCode")
@@ -182,7 +182,7 @@ const PlasmoOverlay: FC<PlasmoCSUIProps> = ({ anchor }) => {
setParseContent(dom)
}
return showTag ? (
return showTag && allShowTag ? (
<ToolBox
onGetDescription={getDescription}
onEditMarkdown={editMarkdown}

View File

@@ -38,6 +38,7 @@ 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>("csdn-showTag", true)
const [cssCode, runCss] = useCssCodeHook("csdn")
const [closeAds] = useStorage<boolean>("csdn-closeAds")
@@ -299,7 +300,7 @@ const PlasmoOverlay: FC<PlasmoCSUIProps> = ({ anchor }) => {
setParseContent(dom)
}
return showTag ? (
return showTag && allShowTag ? (
<Tags
onEdit={editMarkdown}
onDownload={downloadMarkdown}

View File

@@ -45,6 +45,10 @@ export default function CustomOverlay() {
if (req.name == "app-makerQRPost") {
makerQRPost()
}
if (req.name == "app-getArticle") {
const href = encodeURIComponent(location.href)
window.open(`https://paywallbuster.com/articles/?article=${href}`)
}
if (req.name == "app-full-page-screenshot") {
if (confirm("确认截图?")) {
const { scrollHeight, clientHeight } = document.documentElement

View File

@@ -36,6 +36,7 @@ export const getOverlayAnchor: PlasmoGetOverlayAnchor = async () =>
const PlasmoOverlay: FC<PlasmoCSUIProps> = ({ anchor }) => {
const [parseContent, setParseContent] = useParseMarkdown()
const [allShowTag, setAllShowTag] = useStorage("config-allShowTag", true)
const [showTag, setShowTag] = useStorage<boolean>("jb51-showTag", true)
const [cssCode, runCss] = useCssCodeHook("jb51")
const [closeAds] = useStorage<boolean>("jb51-closeAds")
@@ -258,7 +259,7 @@ const PlasmoOverlay: FC<PlasmoCSUIProps> = ({ anchor }) => {
setParseContent(dom)
}
return showTag ? (
return showTag && allShowTag ? (
<ToolBox
onGetDescription={getDescription}
onEditMarkdown={editMarkdown}

View File

@@ -40,6 +40,7 @@ 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>("jianshu-showTag", true)
const [cssCode, runCss] = useCssCodeHook("jianshu")
const [closeLoginModal] = useStorage<boolean>("jianshu-closeLoginModal")
@@ -212,7 +213,7 @@ const PlasmoOverlay: FC<PlasmoCSUIProps> = ({ anchor }) => {
setParseContent(dom)
}
return showTag ? (
return showTag && allShowTag ? (
<ToolBox
onGetDescription={getDescription}
onEditMarkdown={editMarkdown}

View File

@@ -64,6 +64,7 @@ export const getOverlayAnchor: PlasmoGetOverlayAnchor = async () =>
const PlasmoOverlay: FC<PlasmoCSUIProps> = ({ anchor }) => {
const [parseContent, setParseContent] = useParseMarkdown()
const [allShowTag, setAllShowTag] = useStorage("config-allShowTag", true)
const [showTag, setShowTag] = useStorage<boolean>("juejin-showTag", true)
const [cssCode, runCss] = useCssCodeHook("juejin")
const [content, setContent] = useEditMarkdown()
@@ -123,7 +124,7 @@ const PlasmoOverlay: FC<PlasmoCSUIProps> = ({ anchor }) => {
setParseContent(dom)
}
return showTag ? (
return showTag && allShowTag ? (
<ToolBox
onGetDescription={getDescription}
onEditMarkdown={editMarkdown}

108
contents/luogu.tsx Normal file
View File

@@ -0,0 +1,108 @@
import type {
PlasmoCSConfig,
PlasmoCSUIProps,
PlasmoGetShadowHostId
} from "plasmo"
import React, { type FC } from "react"
import { useMessage } from "@plasmohq/messaging/hook"
import { useStorage } from "@plasmohq/storage/dist/hook"
import ToolBox from "~component/ui/toolBox"
import { 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://*.luogu.com.cn/article/*"]
}
const turndownService = Turndown()
const articleTitle = document
.querySelector<HTMLElement>("head title")
.innerText.trim()
export const getShadowHostId: PlasmoGetShadowHostId = () => "codebox-luogu"
const PlasmoOverlay: FC<PlasmoCSUIProps> = () => {
const [parseContent, setParseContent] = useParseMarkdown()
const [allShowTag, setAllShowTag] = useStorage("config-allShowTag", true)
const [showTag, setShowTag] = useStorage<boolean>("luogu-showTag", true)
const [cssCode, runCss] = useCssCodeHook("luogu")
const [content, setContent] = useEditMarkdown()
useMessage(async (req, res) => {
if (req.name == "luogu-isShow") {
res.send({ isShow: true })
}
if (req.name == "luogu-editMarkdown") {
editMarkdown()
}
if (req.name == "luogu-downloadMarkdown") {
downloadMarkdown()
}
if (req.name == "luogu-downloadHtml") {
downloadHtml()
}
if (req.name == "luogu-downloadPdf") {
downloadPdf()
}
})
function getDescription() {
const summary = document.querySelector<HTMLMetaElement>(
'meta[name="description"]'
).content
summary && prompt("文章摘要:", summary)
}
function downloadPdf() {
const article = document.querySelector<HTMLElement>(".article-content")
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(".article-content")
setContent(dom, articleTitle)
}
function downloadMarkdown() {
const html = document.querySelector(".article-content")
const markdown = turndownService.turndown(html)
saveMarkdown(markdown, articleTitle)
}
function downloadHtml() {
const dom = document.querySelector(".article-content")
saveHtml(dom, articleTitle)
}
function parseMarkdown() {
const dom = document.querySelector(".article-content")
setParseContent(dom)
}
return showTag && allShowTag ? (
<ToolBox
style={{
left: "75px"
}}
onGetDescription={getDescription}
onEditMarkdown={editMarkdown}
onDownloadMarkdown={downloadMarkdown}
onPrint={downloadPdf}
onParseMarkdown={parseMarkdown}
/>
) : (
<></>
)
}
export default PlasmoOverlay

View File

@@ -1,16 +1,13 @@
import type {
PlasmoCSConfig,
PlasmoCSUIProps,
PlasmoGetOverlayAnchor,
PlasmoGetShadowHostId,
PlasmoGetStyle
PlasmoGetShadowHostId
} from "plasmo"
import { useEffect, useRef, type FC } from "react"
import { useMessage } from "@plasmohq/messaging/hook"
import { useStorage } from "@plasmohq/storage/dist/hook"
import TagBtnStyle from "~component/tagBtn/style"
import ToolBox from "~component/ui/toolBox"
import { i18n, saveHtml, saveMarkdown } from "~tools"
import useCssCodeHook from "~utils/cssCodeHook"
@@ -98,16 +95,11 @@ const articleTitle = document
.querySelector<HTMLElement>("head title")
.innerText.trim()
const HOST_ID = "codebox-medium1"
export const getShadowHostId: PlasmoGetShadowHostId = () => HOST_ID
export const getShadowHostId: PlasmoGetShadowHostId = () => "codebox-medium"
export const getOverlayAnchor: PlasmoGetOverlayAnchor = async () =>
document.querySelector("article .pw-post-title")
export const getStyle: PlasmoGetStyle = () => TagBtnStyle()
const PlasmoOverlay: FC<PlasmoCSUIProps> = ({ anchor }) => {
const PlasmoOverlay: FC<PlasmoCSUIProps> = () => {
const [parseContent, setParseContent] = useParseMarkdown()
const [allShowTag, setAllShowTag] = useStorage("config-allShowTag", true)
const [showTag, setShowTag] = useStorage<boolean>("medium-showTag", true)
const [cssCode, runCss] = useCssCodeHook("medium")
const [content, setContent] = useEditMarkdown(turndownOption)
@@ -169,7 +161,7 @@ const PlasmoOverlay: FC<PlasmoCSUIProps> = ({ anchor }) => {
setParseContent(dom)
}
return showTag ? (
return showTag && allShowTag ? (
<ToolBox
onGetDescription={getDescription}
onEditMarkdown={editMarkdown}

View File

@@ -39,6 +39,7 @@ 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>("oschina-showTag", true)
const [cssCode, runCss] = useCssCodeHook("oschina")
const [content, setContent] = useEditMarkdown()
@@ -98,7 +99,7 @@ const PlasmoOverlay: FC<PlasmoCSUIProps> = ({ anchor }) => {
setParseContent(dom)
}
return showTag ? (
return showTag && allShowTag ? (
<ToolBox
onGetDescription={getDescription}
onEditMarkdown={editMarkdown}

138
contents/paywallbuster.tsx Normal file
View File

@@ -0,0 +1,138 @@
import type {
PlasmoCSConfig,
PlasmoCSUIProps,
PlasmoGetOverlayAnchorList,
PlasmoGetShadowHostId
} from "plasmo"
import React, { type FC } from "react"
import { useMessage } from "@plasmohq/messaging/dist/hook"
import { useStorage } from "@plasmohq/storage/dist/hook"
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://paywallbuster.com/articles/*",
"https://archive.is/*",
"https://archive.ph/*"
]
}
const turndownService = Turndown()
const articleTitle = document
.querySelector<HTMLElement>("head title")
.innerText.trim()
export const getShadowHostId: PlasmoGetShadowHostId = () =>
"codebox-paywallbuster"
const boxStyles = {
box: {
position: "fixed" as const,
border: "1px solid #D9DADC",
left: "25px",
top: "30px",
textAlign: "center" as const,
width: "140px",
padding: "5px",
cursor: "pointer"
}
}
const isPaywallbuster = location.hostname.includes("paywallbuster")
const PlasmoOverlay: FC<PlasmoCSUIProps> = () => {
const [parseContent, setParseContent] = useParseMarkdown()
const [allShowTag, setAllShowTag] = useStorage("config-allShowTag", true)
const [showTag, setShowTag] = useStorage<boolean>(
"paywallbuster-showTag",
true
)
const [cssCode, runCss] = useCssCodeHook("paywallbuster")
const [content, setContent] = useEditMarkdown()
useMessage(async (req, res) => {
if (req.name == "paywallbuster-isShow") {
res.send({ isShow: true })
}
if (req.name == "paywallbuster-editMarkdown") {
editMarkdown()
}
if (req.name == "paywallbuster-downloadMarkdown") {
downloadMarkdown()
}
if (req.name == "paywallbuster-downloadHtml") {
downloadHtml()
}
if (req.name == "paywallbuster-downloadPdf") {
downloadPdf()
}
})
function getDescription() {
const summary = document.querySelector<HTMLMetaElement>(
'meta[name="description"]'
).content
summary && prompt("文章摘要:", summary)
}
function downloadPdf() {
const article = document.querySelector<HTMLElement>("article")
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("article")
setContent(dom, articleTitle)
}
function downloadMarkdown() {
const html = document.querySelector("article")
const markdown = turndownService.turndown(html)
saveMarkdown(markdown, articleTitle)
}
function downloadHtml() {
const dom = document.querySelector("article")
saveHtml(dom, articleTitle)
}
function parseMarkdown() {
const dom = document.querySelector("article")
setParseContent(dom)
}
function handleOpenSource() {
const iframe = document.querySelector<any>("#content-frame")
iframe && window.open(iframe.src, "_blank")
}
return showTag ? (
isPaywallbuster ? (
<div style={boxStyles.box}>
<a onClick={handleOpenSource}></a>
</div>
) : (
<ToolBox
onGetDescription={getDescription}
onEditMarkdown={editMarkdown}
onDownloadMarkdown={downloadMarkdown}
onPrint={downloadPdf}
onParseMarkdown={parseMarkdown}
/>
)
) : (
<></>
)
}
export default PlasmoOverlay

View File

@@ -39,6 +39,7 @@ 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>("php-showTag", true)
const [cssCode, runCss] = useCssCodeHook("php")
const [copyCode] = useStorage("php-copyCode", true)
@@ -149,7 +150,7 @@ const PlasmoOverlay: FC<PlasmoCSUIProps> = ({ anchor }) => {
setParseContent(dom)
}
return showTag ? (
return showTag && allShowTag ? (
<ToolBox
onGetDescription={getDescription}
onEditMarkdown={editMarkdown}

108
contents/pianshen.tsx Normal file
View File

@@ -0,0 +1,108 @@
import type {
PlasmoCSConfig,
PlasmoCSUIProps,
PlasmoGetShadowHostId
} from "plasmo"
import React, { type FC } from "react"
import { useMessage } from "@plasmohq/messaging/hook"
import { useStorage } from "@plasmohq/storage/dist/hook"
import ToolBox from "~component/ui/toolBox"
import { 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://*.pianshen.com/question/*",
"http://*.pianshen.com/article/*"
]
}
const turndownService = Turndown()
const articleTitle = document
.querySelector<HTMLElement>("head title")
.innerText.trim()
export const getShadowHostId: PlasmoGetShadowHostId = () => "codebox-pianshen"
const PlasmoOverlay: FC<PlasmoCSUIProps> = () => {
const [parseContent, setParseContent] = useParseMarkdown()
const [allShowTag, setAllShowTag] = useStorage("config-allShowTag", true)
const [showTag, setShowTag] = useStorage<boolean>("pianshen-showTag", true)
const [cssCode, runCss] = useCssCodeHook("pianshen")
const [content, setContent] = useEditMarkdown()
useMessage(async (req, res) => {
if (req.name == "pianshen-isShow") {
res.send({ isShow: true })
}
if (req.name == "pianshen-editMarkdown") {
editMarkdown()
}
if (req.name == "pianshen-downloadMarkdown") {
downloadMarkdown()
}
if (req.name == "pianshen-downloadHtml") {
downloadHtml()
}
if (req.name == "pianshen-downloadPdf") {
downloadPdf()
}
})
function getDescription() {
const summary = document.querySelector<HTMLMetaElement>(
'meta[name="description"]'
).content
summary && prompt("文章摘要:", summary)
}
function downloadPdf() {
const article = document.querySelector<HTMLElement>("#article_content")
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("#article_content")
setContent(dom, articleTitle)
}
function downloadMarkdown() {
const html = document.querySelector("#article_content")
const markdown = turndownService.turndown(html)
saveMarkdown(markdown, articleTitle)
}
function downloadHtml() {
const dom = document.querySelector("#article_content")
saveHtml(dom, articleTitle)
}
function parseMarkdown() {
const dom = document.querySelector("#article_content")
setParseContent(dom)
}
return showTag && allShowTag ? (
<ToolBox
onGetDescription={getDescription}
onEditMarkdown={editMarkdown}
onDownloadMarkdown={downloadMarkdown}
onPrint={downloadPdf}
onParseMarkdown={parseMarkdown}
/>
) : (
<></>
)
}
export default PlasmoOverlay

View File

@@ -39,6 +39,7 @@ 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
@@ -101,7 +102,7 @@ const PlasmoOverlay: FC<PlasmoCSUIProps> = ({ anchor }) => {
setParseContent(dom)
}
return showTag ? (
return showTag && allShowTag ? (
<ToolBox
onGetDescription={getDescription}
onEditMarkdown={editMarkdown}

View File

@@ -142,6 +142,7 @@ const style = {
const PlasmoOverlay: FC<PlasmoCSUIProps> = ({ anchor }) => {
const [parseContent, setParseContent] = useParseMarkdown()
const [allShowTag, setAllShowTag] = useStorage("config-allShowTag", true)
const [showTag, setShowTag] = useStorage<boolean>("weixin-showTag", true)
const [cssCode, runCss] = useCssCodeHook("weixin")
const [history, setHistory] = useStorage<any[]>("codebox-history")
@@ -278,7 +279,7 @@ const PlasmoOverlay: FC<PlasmoCSUIProps> = ({ anchor }) => {
setIsShow(false)
}
return showTag && isShow ? (
return showTag && isShow && allShowTag ? (
<div id="ws_cmbm" className="ws_cmbmc" style={style.box}>
<button style={style.close} onClick={onClose} aria-label="Close">
×

View File

@@ -20,7 +20,7 @@ import { Print } from "~utils/print"
import Turndown from "~utils/turndown"
export const config: PlasmoCSConfig = {
matches: ["https://*.zhihu.com/p/*"]
matches: ["https://*.zhihu.com/*"]
}
const turndownService = Turndown()
@@ -66,6 +66,7 @@ const style = {
const PlasmoOverlay: FC<PlasmoCSUIProps> = ({ anchor }) => {
const [parseContent, setParseContent] = useParseMarkdown()
const [allShowTag, setAllShowTag] = useStorage("config-allShowTag", true)
const [showTag, setShowTag] = useStorage<boolean>("zhihu-showTag", true)
const [cssCode, runCss] = useCssCodeHook("zhihu")
const [closeLoginModal] = useStorage<boolean>("zhihu-closeLoginModal")
@@ -263,7 +264,7 @@ const PlasmoOverlay: FC<PlasmoCSUIProps> = ({ anchor }) => {
setIsShow(false)
}
return showTag && isShow ? (
return showTag && isShow && allShowTag ? (
<ToolBox
onGetDescription={getDescription}
onEditMarkdown={editMarkdown}

View File

@@ -161,6 +161,9 @@
"downloadAllImg": {
"message": "Download All Image"
},
"getArticle": {
"message": "Get All Article"
},
"downloading": {
"message": "Downloading"
},
@@ -179,6 +182,9 @@
"showTag": {
"message": "Show Tag"
},
"allShowTag": {
"message": "All Tag"
},
"code": {
"message": "Code"
},
@@ -194,6 +200,18 @@
"weixinConfig": {
"message": "Wechat Config"
},
"paywallbusterConfig": {
"message": "Paywallbuster Config"
},
"360docConfig": {
"message": "360doc Config"
},
"pianshenConfig": {
"message": "PianShen Config"
},
"luoguConfig": {
"message": "LuoGu Config"
},
"fullPageScreenshot": {
"message": "Full Page Screenshot"
},

View File

@@ -167,6 +167,9 @@
"downloadAllImg": {
"message": "下载所有图片"
},
"getArticle": {
"message": "获取全文"
},
"downloading": {
"message": "正在下载"
},
@@ -182,6 +185,9 @@
"showTag": {
"message": "显示标签"
},
"allShowTag": {
"message": "所有标签"
},
"code": {
"message": "代码"
},
@@ -197,6 +203,18 @@
"weixinConfig": {
"message": "微信设置"
},
"paywallbusterConfig": {
"message": "paywallbuster设置"
},
"360docConfig": {
"message": "360doc设置"
},
"pianshenConfig": {
"message": "pianshen设置"
},
"luoguConfig": {
"message": "洛谷设置"
},
"fullPageScreenshot": {
"message": "全页面截图"
},

View File

@@ -1,7 +1,7 @@
{
"name": "code-box",
"displayName": "__MSG_extensionName__",
"version": "1.3.0",
"version": "1.3.5",
"description": "__MSG_extensionDescription__",
"author": "027xiguapi. <458813868@qq.com>",
"scripts": {
@@ -22,9 +22,6 @@
"dependencies": {
"@ant-design/cssinjs": "^1.21.1",
"@ant-design/icons": "^5.5.1",
"@dnd-kit/core": "^6.1.0",
"@dnd-kit/sortable": "^8.0.0",
"@dnd-kit/utilities": "^3.2.2",
"@joplin/turndown": "^4.0.74",
"@joplin/turndown-plugin-gfm": "^1.0.56",
"@plasmohq/messaging": "^0.6.2",
@@ -36,7 +33,7 @@
"html2canvas": "^1.4.1",
"jssha": "^3.3.1",
"jszip": "^3.10.1",
"plasmo": "0.89.4",
"plasmo": "0.90.3",
"qrcode": "^1.5.4",
"react": "18.2.0",
"react-dom": "18.2.0",
@@ -52,7 +49,7 @@
"postcss-modules": "^4.3.0",
"prettier": "3.2.4",
"sass": "^1.77.8",
"sharp": "^0.33.4",
"sharp": "^0.33.5",
"typescript": "5.3.3"
},
"manifest": {

BIN
public/config.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

View File

@@ -45,8 +45,7 @@ export function editQRCodeImg() {
(encodedBook = encodeURIComponent("《medium》"))
// 基础链接地址,这里假设为 example.com
// const baseUrl = "https://code-box.fun/editor-quote?"
const baseUrl = "http://localhost:3000/edit-quote?"
const baseUrl = "https://code-box.fun/editor-quote?"
const finalUrl = `${baseUrl}content=${encodedContent}&author=${encodedAuthor}&book=${encodedBook}&url=${encodedUrl}`
window.open(finalUrl)
}