NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name Hacker news - hide visited links // @namespace https://github.com/mintyPT/userscripts // @version 0.1 // @description On click, hide link // @author mintyPT // @license MIT // @match *://news.ycombinator.com/* // @grant none // @require https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js // ==/UserScript== async function fetchJson(url) { const response = await fetch(url); return response.json(); } function assert(a, b = true, message) { if (a != b) { const msg = message || `Assertion failed ${a}!=${b}`; console.error(msg); } } const flow = (...fs) => { return input => { return fs.reduce((accu, f) => { const res = f(accu); return res; }, input); }; }; const defaultObject = a => { try { return a ? JSON.parse(a) : {}; } catch (e) { return {}; } }; const getItem = key => () => localStorage.getItem(key); const setItem = key => value => localStorage.setItem(key, value) || true; const getObj = k => flow(getItem(k), defaultObject); const saveObj = k => flow(JSON.stringify, setItem(k)); const showElement = $el => { $el.show(); $el.next().show(); $el.prev().show(); }; const hideElement = $el => { $el.hide(); $el.next().hide(); $el.prev().hide(); }; const $ = jQuery; (function() { 'use strict'; const getter = getObj("hnseen"); const setter = saveObj("hnseen"); const append = flow(url => ({ ...getter(), [url]: true }), setter); const wasSeen = href => getter()[href]; const $elements = $(".itemlist .athing"); $elements.map((i, el) => { const $el = $(el); const link = $el.find("td.title a.storylink").first(); const href = link.attr("href"); if (wasSeen(href)) { hideElement($el); } link.on("click", e => { e.preventDefault(); hideElement($el); append(href); window.open(href); }); }); const onHideLink = e => { e.preventDefault(); $elements.map((i, el) => { const $el = $(el); const link = $el.find("td.title a.storylink").first(); const href = link.attr("href"); if (!wasSeen(href)) { hideElement($el); } append(href); }); }; const onShowLink = e => $elements.map((i, el) => { const $el = $(el); showElement($el); }); const $hideLink = $('<a class="morelink" href="#">Hide</a>') .css({ marginLeft: "10px" }) .on("click", onHideLink); const $showLink = $('<a class="morelink" href="#">Show</a>') .css({ marginLeft: "10px" }) .on("click", onShowLink); $(".morelink") .after($hideLink) .after($showLink); })();