From ffe0b2f424c1a01aa565807020ae13933b1c0d4c Mon Sep 17 00:00:00 2001 From: Jacob Casper Date: Sun, 20 Oct 2019 18:00:25 -0500 Subject: [PATCH 1/1] Initial commit --- README.md | 3 +++ hnim.js | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++ hnim.xpi | Bin 0 -> 8380 bytes manifest.json | 14 +++++++++++ 4 files changed, 83 insertions(+) create mode 100644 README.md create mode 100644 hnim.js create mode 100644 hnim.xpi create mode 100644 manifest.json diff --git a/README.md b/README.md new file mode 100644 index 0000000..ff7ffdb --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +Adds some VIM keybindings to HackerNews comments. + +Download [hnim.xpi](hnim.xpi) diff --git a/hnim.js b/hnim.js new file mode 100644 index 0000000..2ec6a73 --- /dev/null +++ b/hnim.js @@ -0,0 +1,66 @@ +(() => { + const comments = document.querySelector(".comment-tree > tbody"); + + let selectedComment = comments.firstElementChild + selectedComment.style.outline = '1px dashed black'; + + const visible = (element) => { + let bounds = element.getBoundingClientRect(); + return bounds.top >= 0 && bounds.bottom <= window.innerHeight; + } + + const changeWithVisibleCallback = (comment, callback) => { + if (comment == null) { + return; + } + selectedComment.style.outline = ''; + selectedComment = comment; + selectedComment.style.outline = '1px dashed black'; + if (!visible(comment)) { + callback(); + } + } + + const change = (comment) => { + changeWithVisibleCallback(comment, () => {}); + } + + // Curry callback for moving downpage + const changeDownpage = (comment) => { + changeWithVisibleCallback(comment, () => {window.scrollTo(0, window.scrollY + comment.offsetHeight)}); + } + + // Curry callback for moving up page + const changeUppage = (comment) => { + changeWithVisibleCallback(comment, () => {window.scrollTo(0, window.scrollY - comment.offsetHeight)}); + } + + document.addEventListener("click", (e) => { + change(e.target.closest("tr.athing")); + }) + document.addEventListener("keydown", (e) => { + if (e.isComposing) { + return; + } + if (e.key == "j") { + do { + changeDownpage(selectedComment.nextElementSibling); + } while (selectedComment.classList.contains("noshow")); + } + if (e.key == "k") { + do { + changeUppage(selectedComment.previousElementSibling); + } while (selectedComment.classList.contains("noshow")); + } + if (e.key == "Enter") { + let togg = selectedComment.querySelector(".togg"); + let more = selectedComment.querySelector(".morelink"); + if (togg) { + togg.click(); + } + else if (more) { + more.click(); + } + } + }) +})(); diff --git a/hnim.xpi b/hnim.xpi new file mode 100644 index 0000000000000000000000000000000000000000..aff0e738fe78c3779e22f1265ef4083cb6f6f8f4 GIT binary patch literal 8380 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 literal 0 HcmV?d00001 diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..f95615d --- /dev/null +++ b/manifest.json @@ -0,0 +1,14 @@ +{ + "manifest_version": 2, + "name": "HNim", + "version": "0.1", + + "description": "Adds some VIM keybindings to HackerNews comments", + + "content_scripts": [ + { + "matches": ["*://news.ycombinator.com/*"], + "js": ["hnim.js"] + } + ] +} -- 2.20.1