Sankaku Previewer

try to take over the world!

Από την 29/07/2018. Δείτε την τελευταία έκδοση.

// ==UserScript==
// @name         Sankaku Previewer
// @namespace    https://greasyfork.org/ja/scripts/370717-sankaku-previewer
// @version      1.0
// @description  try to take over the world!
// @author       You
// @match        https://chan.sankakucomplex.com/*
// @grant        GM_xmlhttpRequest
// ==/UserScript==

(function() {
	const body = document.getElementsByTagName('body')[0]

	createPreview()
	addEvent()
	body.onmousemove = () => { addEvent() }

	function xpath(path, d){
		if(!d) d = document
		return document.evaluate(path, document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null)
	}

	let timer
	function addEvent() {
		const nodes = xpath("//div[@class='content']//img[not(contains(@preview, 'true'))]")
		for(let i = 0; i < nodes.snapshotLength; i++){
			const imgEle = nodes.snapshotItem(i)

			imgEle.setAttribute('flag', '0')
			imgEle.onmouseover = () => {
				imgEle.setAttribute('flag', '0')
					const parent = imgEle.parentNode
					const req = new GM_xmlhttpRequest({
						method: "GET",
						url: parent.href,
						responseType: 'text',
						onload: (res) => {
							const raw_xml = res.response
							const parser = new DOMParser()
							const html = parser.parseFromString(raw_xml, "text/html")
							const img = html.getElementById('lowres') || html.getElementById('highres')
							const blob_req = new GM_xmlhttpRequest({
								method: "GET",
								url: img.href,
								responseType: 'blob',
								onload: (res) => {
									if (imgEle.getAttribute('flag') != 0) return
									const img_src = window.URL.createObjectURL(res.response)
									openPreview(img_src)
								}
							})
						}
					})
			}

			imgEle.onmouseout = () => {
				imgEle.setAttribute('flag', '1')
				closePreview()
			}
			imgEle.setAttribute('preview', 'true')
		}
	}

	function createPreview() {
		const preview = document.createElement('img')
		const content = document.getElementById('content')

		preview.setAttribute('id', 'sankaku-preview')
		preview.height = document.documentElement.clientHeight
		preview.style.pointerEvents = 'none'
		preview.style.zIndex = '10001'
		preview.style.opacity = '0.9'
		preview.style.left = '0px'
		preview.style.top = '0px'
		preview.style.position = 'fixed'
		preview.style.display = 'none'
		content.appendChild(preview)
	}

	function openPreview(src) {
		const preview = document.getElementById('sankaku-preview')

		preview.setAttribute('src', src)
		preview.style.display = 'inline'
	}

	function closePreview() {
		const preview = document.getElementById('sankaku-preview')

		preview.style.display = 'none'
	}
})();