mirror of
https://github.com/d0zingcat/NotionNext.git
synced 2026-05-14 07:26:52 +00:00
67 lines
1.9 KiB
JavaScript
67 lines
1.9 KiB
JavaScript
function convertTextToSpoilerSpan(node, className, spoilerTag) {
|
|
const regex = new RegExp(`${spoilerTag}(.*?)${spoilerTag}`, 'g')
|
|
const wholeText = node.wholeText
|
|
const fragments = []
|
|
let lastIndex = 0
|
|
let match
|
|
while ((match = regex.exec(wholeText)) !== null) {
|
|
console.log('符合要求的文字' + wholeText)
|
|
// 添加前面未匹配的部分
|
|
if (match.index > lastIndex) {
|
|
fragments.push(
|
|
document.createTextNode(wholeText.slice(lastIndex, match.index))
|
|
)
|
|
}
|
|
|
|
// 创建 span 包裹的内容
|
|
const span = document.createElement('span')
|
|
span.textContent = match[1] // 提取匹配的内容
|
|
if (className) {
|
|
span.className = className
|
|
}
|
|
fragments.push(span)
|
|
// 设置lastIndex
|
|
lastIndex = regex.lastIndex
|
|
}
|
|
if (fragments.length) {
|
|
// 添加剩余未匹配的部分
|
|
if (lastIndex < wholeText.length) {
|
|
fragments.push(document.createTextNode(wholeText.slice(lastIndex)))
|
|
}
|
|
|
|
// 替换原节点
|
|
fragments.forEach(fragment => {
|
|
node.parentNode.appendChild(fragment)
|
|
})
|
|
node.remove()
|
|
}
|
|
}
|
|
|
|
function processTextNodes(root, className, spoilerTag) {
|
|
const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT, null)
|
|
const waitProcessNodes = []
|
|
while (walker.nextNode()) {
|
|
const node = walker.currentNode
|
|
waitProcessNodes.push(node)
|
|
}
|
|
for (const waitProcessNode of waitProcessNodes) {
|
|
convertTextToSpoilerSpan(waitProcessNode, className, spoilerTag)
|
|
}
|
|
}
|
|
|
|
function textToSpoiler(spoilerTag) {
|
|
const intervalID = setInterval(() => {
|
|
const articleElement = document.querySelector(
|
|
'#article-wrapper #notion-article main'
|
|
)
|
|
if (articleElement) {
|
|
setTimeout(() => {
|
|
processTextNodes(articleElement, 'spoiler-text', spoilerTag)
|
|
clearInterval(intervalID)
|
|
}, 300)
|
|
}
|
|
}, 1000)
|
|
}
|
|
|
|
window.textToSpoiler = textToSpoiler
|