Skip to content

Commit

Permalink
feat: update new version of espejo (#76)
Browse files Browse the repository at this point in the history
* feat: update new version of espejo

* chore: update version

* build userscript
  • Loading branch information
piquark6046 authored May 2, 2024
1 parent 29eb4ab commit 864cf93
Show file tree
Hide file tree
Showing 4 changed files with 74 additions and 7 deletions.
4 changes: 2 additions & 2 deletions NamuLink.user.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "namulink",
"version": "3.8.0",
"version": "3.9.0",
"description": "",
"type": "module",
"scripts": {
Expand Down
2 changes: 1 addition & 1 deletion sources/banner.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
// @downloadURL https://cdn.jsdelivr.net/gh/List-KR/NamuLink@latest/NamuLink.user.js
// @license MIT
//
// @version 3.8.0
// @version 3.9.0
// @author PiQuark6046 and contributors
//
// @match https://namu.wiki/*
Expand Down
73 changes: 70 additions & 3 deletions sources/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@ declare const unsafeWindow: unsafeWindow
// eslint-disable-next-line no-negated-condition
const Win = typeof unsafeWindow !== 'undefined' ? unsafeWindow : window

const NagivationAdvertEvent = new Event('namuwikinavigationwithadvert')
const NamuWikiUnloadedAdEvent = new Event('namuwikiunloadedadvert')
const NamuWikiLoadedAdEvent = new Event('namuwikiloadedadvert')
const NagivationEvent = new Event('namuwikinavigation')

Win.fetch = new Proxy(Win.fetch, {
Expand All @@ -17,13 +18,24 @@ Win.fetch = new Proxy(Win.fetch, {
if (typeof Args[0] === 'string' && /^\/i\/[a-zA-Z0-9_-]{200,}/.test(Args[0]) && (Args[1] as RequestInit).method === 'GET') {
const ResultCloned = await (Result as Promise<Response>).then(Response => Response.clone())
if ((await ResultCloned.arrayBuffer()).byteLength > 1000) {
Win.dispatchEvent(NagivationAdvertEvent)
Win.dispatchEvent(NamuWikiUnloadedAdEvent)
}
}
return Result
}
})

Win.EventTarget.prototype.addEventListener = new Proxy(Win.EventTarget.prototype.addEventListener, {
apply(Target, ThisArg, Args) {
// eslint-disable-next-line @typescript-eslint/ban-types
if (Args[0] === 'click' && typeof Args[1] === 'function' && (Args[1] as Function).toString().includes('timeStamp')
&& ThisArg instanceof HTMLElement && /.+\..+/.test(ThisArg.innerText) && ThisArg.querySelectorAll('*').length === 0) {
Win.dispatchEvent(NamuWikiLoadedAdEvent)
}
return Reflect.apply(Target, ThisArg, Args)
}
})

Win.Array.prototype.join = new Proxy(Win.Array.prototype.join, {
apply(Target, ThisArg, Args) {
const Result = Reflect.apply(Target, ThisArg, Args)
Expand Down Expand Up @@ -92,6 +104,44 @@ const HideLeftoverElementNano = (ElementsInArticle: Element[]) => {
return TargetedElements
}

const HideAdElementNano = (ElementsInArticle: Element[]) => {
var FilteredElements = ElementsInArticle.filter(ElementInArticle => ElementInArticle instanceof HTMLElement) as HTMLElement[]
const TargetedElements: HTMLElement[] = []
FilteredElements = FilteredElements.filter(HTMLElementInArticle => HTMLElementInArticle.innerText.length > 45)
FilteredElements = FilteredElements.filter(HTMLElementInArticle => {
const ChildElements = Array.from(HTMLElementInArticle.querySelectorAll('*'))
const ChildHTMLElements = ChildElements.filter(ChildElement => ChildElement instanceof HTMLElement) as HTMLElement[]
return ChildHTMLElements.some(ChildElement => Number(getComputedStyle(ChildElement).getPropertyValue('margin-bottom').replace(/px$/, '')) >= 4)
})
FilteredElements = FilteredElements.filter(HTMLElementInArticle => {
const ChildElements = Array.from(HTMLElementInArticle.querySelectorAll('*'))
return ChildElements.filter(ChildElement => ChildElement instanceof HTMLIFrameElement).length === 0
})
FilteredElements = FilteredElements.filter(HTMLElementInArticle => {
return HTMLElementInArticle.querySelectorAll('span[id^="fn-"] + a[href^="#rfn-"]').length === 0
})
FilteredElements = FilteredElements.filter(HTMLElementInArticle => {
return !Array.from(HTMLElementInArticle.querySelectorAll('a[rel="noopener"][target="_blank"][class] > span ~ span')).some(HTMLElement => (HTMLElement as HTMLElement).innerHTML.includes('나무뉴스'))
})
FilteredElements = FilteredElements.filter(HTMLElementInArticle => {
const ChildElements = Array.from(HTMLElementInArticle.querySelectorAll('*'))
const ChildHTMLElements = ChildElements.filter(ChildElement => ChildElement instanceof HTMLElement) as HTMLElement[]
return ChildHTMLElements.some(ChildElement => Number(getComputedStyle(ChildElement).getPropertyValue('margin-bottom').replace(/px$/, '')) >= 10) &&
ChildHTMLElements.every(ChildElement => Number(getComputedStyle(ChildElement).getPropertyValue('margin-left').replace(/px$/, '')) <= 10)
})
FilteredElements = FilteredElements.filter(HTMLElementInArticle => {
return HTMLElementInArticle.querySelectorAll('div:has(a) ~ div:has(a) ~ div:has(a)').length > 0
})
TargetedElements.push(...FilteredElements.filter(HTMLElementInArticle => {
const ChildElements = Array.from(HTMLElementInArticle.querySelectorAll('*'))
const ChildHTMLElements = ChildElements.filter(ChildElement => ChildElement instanceof HTMLElement) as HTMLElement[]
const PeerElements = Array.from(HTMLElementInArticle.parentElement?.querySelectorAll('*') ?? [])
const PeerHTMLElements = PeerElements.filter(PeerElement => PeerElement instanceof HTMLElement) as HTMLElement[]
return ChildHTMLElements.every(ChildHTMLElement => !ChildHTMLElement.innerText.includes('alt=\'external/')) && PeerHTMLElements.filter(PeerHTMLElement => PeerHTMLElement.nextElementSibling === HTMLElementInArticle && !(PeerHTMLElement instanceof HTMLHeadingElement)).length > 0
}))
return TargetedElements
}

const HideLeftoverElement = async () => {
const ElementsInArticle = []
ElementsInArticle.push(...Array.from(Win.document.querySelectorAll('div[class] div[class*=" "]:has(span ~ ul li) ~ div div[class] > div[class] div[class] ~ div[class]')))
Expand All @@ -107,6 +157,23 @@ const HideLeftoverElement = async () => {
HideElements(TargetedElements)
}

Win.addEventListener('namuwikinavigationwithadvert', HideLeftoverElement)
const HideAdElement = async () => {
const ElementsInArticle = []
ElementsInArticle.push(...Array.from(Win.document.querySelectorAll('div[class] div[class*=" "]:has(span ~ ul li) ~ div div[class] > div[class] div[class] ~ div[class]')))
ElementsInArticle.push(...Array.from(Win.document.querySelectorAll('div:not([class*=" "]) div[class] div[class*=" "]')))
let TargetedElements: HTMLElement[] = []
const PLimitInstance = PLimit((navigator.hardwareConcurrency ?? 4) < 4 ? 4 : navigator.hardwareConcurrency)
const PLimitJobs: Promise<HTMLElement[]>[] = []
for (const ElementsInArticleChunk of SplitElementsIntoSubArrayLength(ElementsInArticle, {Count: 2})) {
PLimitJobs.push(PLimitInstance(() => HideAdElementNano(ElementsInArticleChunk)))
}
TargetedElements = await Promise.all(PLimitJobs).then(PLimitResults => PLimitResults.flat())
console.debug('[NamuLink:index]: HideLeftoverElement:', TargetedElements)
HideElements(TargetedElements)
}


Win.addEventListener('namuwikiloadedadvert', HideAdElement)
Win.addEventListener('namuwikiunloadedadvert', HideLeftoverElement)
Win.addEventListener('namuwikifristvisit', HideLeftoverElement)
Win.addEventListener('namuwikinavigation', ShowElements)

0 comments on commit 864cf93

Please sign in to comment.