auto fetch more entries
// ==UserScript==// @name Qiita timeline auto more// @namespace https://htsign.hateblo.jp// @version 0.3.2// @description auto fetch more entries// @author htsign// @match https://qiita.com/*// @grant none// ==/UserScript==const queryNodes = function* (path, root = document) {const r###lt = document.evaluate(path, root, null, XPathR###lt.ORDERED_NODE_ITERATOR_TYPE);let node;while ((node = r###lt.iterateNext()) != null) {yield node;}};const listElement = document.querySelector('main');if (listElement) {const READMORE_XPATH = './/button[text()="もっと読む"]';const io = new IntersectionObserver((entries, observer) => {entries.filter(entry => entry.isIntersecting).forEach(({ target }) => {observer.unobserve(target);target.click();});}, { rootMargin: '100%' });const mo = new MutationObserver(records => {const buttons = records.flatMap(r => [...r.addedNodes]).flatMap(node => [...queryNodes(READMORE_XPATH, node)]);buttons.forEach(io.observe.bind(io));});mo.observe(listElement, { childList: true, subtree: true });const button = document.evaluate(READMORE_XPATH, listElement, null, XPathR###lt.FIRST_ORDERED_NODE_TYPE)?.singleNodeValue;if (button) {io.observe(button);}}