forked from AmineB/ycombinator-keys
Compare commits
2 Commits
rewrite
...
901cbff919
Author | SHA1 | Date | |
---|---|---|---|
901cbff919
|
|||
6e662cf7ff
|
@ -2,14 +2,14 @@
|
|||||||
// @name ycombinator-keys
|
// @name ycombinator-keys
|
||||||
// @namespace https://gitea.amine-bouabdallaoui.fr/AmineB/ycombinator-keys
|
// @namespace https://gitea.amine-bouabdallaoui.fr/AmineB/ycombinator-keys
|
||||||
// @license gpl-3.0-only
|
// @license gpl-3.0-only
|
||||||
// @match *://news.ycombinator.com/*
|
// @match http*://news.ycombinator.com/*
|
||||||
// @icon https://gitea.amine-bouabdallaoui.fr/AmineB/ycombinator-keys/raw/branch/main/icons/48.png
|
// @icon https://gitea.amine-bouabdallaoui.fr/AmineB/ycombinator-keys/raw/branch/main/icons/48.png
|
||||||
// @grant none
|
// @grant none
|
||||||
// @version 4
|
// @version 4
|
||||||
// @author AmineB
|
// @author AmineB
|
||||||
// @description Ycombinator keyboard nav.
|
// @description Ycombinator keyboard nav.
|
||||||
// @downloadURL https://gitea.amine-bouabdallaoui.fr/AmineB/ycombinator-keys/raw/branch/main/keyboard-watcher.user.js
|
// @downloadURL https://gitea.amine-bouabdallaoui.fr/brian6932/ycombinator-keys/raw/branch/main/keyboard-watcher.user.js
|
||||||
// @updateURL https://gitea.amine-bouabdallaoui.fr/AmineB/ycombinator-keys/raw/branch/main/keyboard-watcher.user.js
|
// @updateURL https://gitea.amine-bouabdallaoui.fr/brian6932/ycombinator-keys/raw/branch/main/keyboard-watcher.user.js
|
||||||
// ==/UserScript==
|
// ==/UserScript==
|
||||||
// jshint esversion: 11
|
// jshint esversion: 11
|
||||||
|
|
||||||
@ -18,12 +18,8 @@ globalThis.document.styleSheets[0].insertRule('tbody tr.athing>td.title>span.tit
|
|||||||
const requery = () => globalThis.document.querySelectorAll('tbody tr.athing')
|
const requery = () => globalThis.document.querySelectorAll('tbody tr.athing')
|
||||||
let
|
let
|
||||||
query = requery(),
|
query = requery(),
|
||||||
selected = -1,
|
selected = -1
|
||||||
lastCollapsed
|
|
||||||
const
|
const
|
||||||
input = new Set()
|
|
||||||
.add('INPUT')
|
|
||||||
.add('TEXTAREA'),
|
|
||||||
// This is a Firefox only option. For some reason older versions of Firefox can't set outline: none.
|
// This is a Firefox only option. For some reason older versions of Firefox can't set outline: none.
|
||||||
focusInvisible = { __proto__: null, focusVisible: false },
|
focusInvisible = { __proto__: null, focusVisible: false },
|
||||||
isComment = () => query[selected].classList.contains('comtr'),
|
isComment = () => query[selected].classList.contains('comtr'),
|
||||||
@ -38,74 +34,49 @@ const
|
|||||||
query[selected].lastChild.firstChild.firstChild.focus(focusInvisible)
|
query[selected].lastChild.firstChild.firstChild.focus(focusInvisible)
|
||||||
},
|
},
|
||||||
keydown = event => {
|
keydown = event => {
|
||||||
if (!input.has(event.target.tagName))
|
switch (event.key) {
|
||||||
switch (event.key) {
|
case 'j':
|
||||||
case 'j':
|
if (selected + 1 === query.length)
|
||||||
const lastIndex = query.length - 1
|
|
||||||
if (selected === lastIndex)
|
|
||||||
return
|
|
||||||
|
|
||||||
if (selected !== -1)
|
|
||||||
query[selected].style.boxShadow = ''
|
|
||||||
|
|
||||||
let hiddenChain = 0
|
|
||||||
while (selected < lastIndex) {
|
|
||||||
const hidden = query[++selected].classList.contains('noshow')
|
|
||||||
hiddenChain = hiddenChain * hidden + hidden
|
|
||||||
|
|
||||||
if (!hidden) {
|
|
||||||
lastCollapsed = query[selected].classList.contains('coll') ? selected : undefined
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
selected -= hiddenChain * (selected - hiddenChain === lastCollapsed)
|
|
||||||
highlightSelected()
|
|
||||||
return
|
return
|
||||||
case 'k':
|
|
||||||
if (selected <= 0)
|
|
||||||
return
|
|
||||||
|
|
||||||
|
if (selected !== -1)
|
||||||
query[selected].style.boxShadow = ''
|
query[selected].style.boxShadow = ''
|
||||||
|
|
||||||
while (selected >= 0 && query[--selected].classList.contains('noshow'));
|
while (selected < query.length && query[++selected].classList.contains('noshow'));
|
||||||
highlightSelected()
|
highlightSelected()
|
||||||
|
return
|
||||||
|
case 'k':
|
||||||
|
if (selected <= 0)
|
||||||
return
|
return
|
||||||
case 'h':
|
|
||||||
if (globalThis.location.pathname === '/hidden')
|
|
||||||
for (const selector of query[selected].nextSibling.querySelectorAll('a'))
|
|
||||||
if (selector.innerText === 'un-hide') {
|
|
||||||
selector.click()
|
|
||||||
break
|
|
||||||
}
|
|
||||||
else
|
|
||||||
query[selected].nextSibling.querySelector('a.clicky.hider')?.click()
|
|
||||||
|
|
||||||
if (selected + 1 <= query.length)
|
query[selected].style.boxShadow = ''
|
||||||
highlightSelected()
|
while (selected >= 0 && query[--selected].classList.contains('noshow'));
|
||||||
return
|
highlightSelected()
|
||||||
case 'c':
|
return
|
||||||
globalThis.open('https://news.ycombinator.com/item?id=' + query[selected].id, '_self')
|
case 'h':
|
||||||
return
|
if (globalThis.location.pathname === '/hidden')
|
||||||
case 'C':
|
for (const selector of query[selected].nextSibling.querySelectorAll('a'))
|
||||||
globalThis.open('https://news.ycombinator.com/item?id=' + query[selected].id)
|
if (selector.innerText === 'un-hide') {
|
||||||
return
|
selector.click()
|
||||||
case 'r':
|
break
|
||||||
if (!isComment())
|
}
|
||||||
return
|
else
|
||||||
globalThis.open(query[selected].querySelector('div.reply a').href, '_self')
|
query[selected].nextSibling.querySelector('a.clicky.hider')?.click()
|
||||||
return
|
if (selected + 1 <= query.length)
|
||||||
case 'R':
|
highlightSelected()
|
||||||
if (!isComment())
|
return
|
||||||
return
|
case 'c':
|
||||||
globalThis.open(query[selected].querySelector('div.reply a').href)
|
globalThis.open('https://news.ycombinator.com/item?id=' + query[selected].id, '_self')
|
||||||
return
|
return
|
||||||
case 'u':
|
case 'C':
|
||||||
globalThis.open((isComment() ? query[selected] : query[selected].nextSibling).querySelector('a.hnuser').href, '_self')
|
globalThis.open('https://news.ycombinator.com/item?id=' + query[selected].id)
|
||||||
return
|
return
|
||||||
case 'U':
|
case 'u':
|
||||||
globalThis.open((isComment() ? query[selected] : query[selected].nextSibling).querySelector('a.hnuser').href)
|
globalThis.open((isComment() ? query[selected] : query[selected].nextSibling).querySelector('a.hnuser').href, '_self')
|
||||||
}
|
return
|
||||||
|
case 'U':
|
||||||
|
globalThis.open((isComment() ? query[selected] : query[selected].nextSibling).querySelector('a.hnuser').href)
|
||||||
|
}
|
||||||
},
|
},
|
||||||
listen = () => globalThis.document.addEventListener('keydown', keydown)
|
listen = () => globalThis.document.addEventListener('keydown', keydown)
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user