Skip to content

Instantly share code, notes, and snippets.

Forked from kristopolous/hn_seach.js
Last active May 4, 2022 13:23
Show Gist options
  • Save meiamsome/94c1aa5f0b431a21b5aa to your computer and use it in GitHub Desktop.
Save meiamsome/94c1aa5f0b431a21b5aa to your computer and use it in GitHub Desktop.
hn job query search
/* Hacker News Search Script
* Original Script by Kristopolous:
* Usage:
* First, copy the script into your browser's console whilst on the Hacker News
* jobs page. Then, you can use the query function to filter the results.
* For example,
* query(AND('python', 'remote')) // Finds remote python jobs
* query(OR('python', javascript')) // Finds jobs using python or js.
* You can also stack logical operators. For example:
* query(AND('remote', OR('python', 'javascript'))) // Remote python or js.
* Supported logical operators:
* NOT, not The logical NOT / inverse operator:
* True if the sole operand is false.
* AND, and The logical AND / conjunction operator:
* All operands must be true.
* OR, IOR, or, ior The logical (inclusive) OR / disjunction:
* Any operand is true.
* XOR, EXOR, xor, exor The logial exclusive OR / disjunction:
* Precisely one of the two inputs is true.
* In addition, most of these operators have a negated version. (Usually by
* prepending N or n to the name.)
// Takes arguments and produces an array of functions that accept context
function handle_arg(arg) {
// Presumably already a contex-accepting function.
if(arg instanceof Function) return arg;
// Make arrays behave as a logical AND.
if(arg instanceof Array) return and.apply(this, arg);
// Presuming a string, build a function to check.
var my_regex = new RegExp(arg.toString(), 'i');
return context => > -1;
// Perform a logical AND on any number of arguments.
AND = and = (...args) => c => => a(c));
NAND = NOT = nand = not = (...args) => c => !and(...args)(c);
// Performs a logic OR
IOR = OR = ior = or = (...args) => c => => a(c));
NIOR = INOR = NOR = nior = inor = nor = (...args) => not(or(...args));
// Performs an XOR. This implementation actually allows N arguments and is
// truthy as long as at least one is truthy and one is falsy. This is a
// non-standard extension as extending XOR is ambiguous.
EXOR = XOR = exor = xor = (...args) => and(or(...args), nand(...args));
nexor = exnor = nxor = xnor = (...args) => not(xor(...args));
// This traverses up the dom stack trying to find a match of a specific class
function up_to(node, klass) {
while(!node.classList.contains(klass)) node = node.parentNode;
return node;
// Set display on a particular thread.
function display(node, what) {
up_to(node, 'athing').style.display = what;
function query(...args) {
var job_list =
var the_query = or(...args);
// Check each job for a match, and show it if it matches.
job_list.forEach(n => display(n, 'none'));
var shown = job_list.filter(n => the_query(n.innerHTML));
shown.forEach(n => display(n, 'block'));
return {shown: shown.length, total: job_list.length}
Copy link

I love your take on this script. The ability to say "not('x')" is very helpful.

Copy link

Also just wanted to say thanks for the added functionality as well! 💯

Copy link

Add usage instructions in the comments please!

Copy link

colobas commented May 2, 2017

Hey @meiamsome , thanks for the helpful work!
Had to change the display function to make it work:

  function display(node, what) {
    up_to(node, 'athing comtr ').style.display = what;

Copy link

Hey all,

Just updated the script to use arrow functions, added some usage help as requested by @adomasven and fixed the issue reported by @colobas. If your browser doesn't support the arrow functions, the old version is available in the revisions page.

Copy link

cmanny commented Jul 5, 2017

If this is the quality of a gist then what REPOs have you got man?

Copy link

you are so cool

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment