function query() { | |
var | |
// HN is done with very unsemantic classes. | |
job_list = Array.prototype.slice.call(document.querySelectorAll('.c5a,.cae,.c00,.c9c,.cdd,.c73,.c88')), | |
query_list = Array.prototype.slice.call(arguments), | |
shown = 0, total = job_list.length; | |
// Traverses up the dom stack trying to find a match of a specific class | |
function up_to(node, klass) { | |
if (node.classList.contains(klass)) { | |
return node; | |
} | |
if(node === document.body) { | |
throw new Exception(); | |
} | |
return up_to(node.parentNode, klass); | |
} | |
function display(node, what) { | |
up_to(node, 'athing').style.display = what; | |
} | |
// If we have a RegEx, return it | |
// Otherwise make it a case insensitive regex. | |
function destring(what) { | |
return what.test ? what : new RegExp(what.toString(), 'i'); | |
} | |
// Hide all the postings | |
job_list.forEach(function(node) { | |
display(node, 'none'); | |
}); | |
query_list.forEach(function(query) { | |
if (query.forEach) { | |
var and_query_list = query.map(destring); | |
job_list.forEach(function(node) { | |
var | |
doesMatch = true, | |
toTest = node.innerHTML; | |
and_query_list.forEach(function(query) { | |
doesMatch &= toTest.search(query) > -1; | |
}) | |
if(doesMatch) { | |
display(node, 'block'); | |
shown ++; | |
} | |
}); | |
} else { | |
query = destring(query); | |
job_list.forEach(function(node) { | |
if(node.innerHTML.search(query) > -1) { | |
display(node, 'block'); | |
shown ++; | |
} | |
}); | |
} | |
}); | |
return {shown: shown, total: total} | |
} |
This comment has been minimized.
This comment has been minimized.
You are the man |
This comment has been minimized.
This comment has been minimized.
Entry point? how does this know which url to search? |
This comment has been minimized.
This comment has been minimized.
On the hacker news comment thread site you need to run this script through your browser's debug console. Go to the comment thread. Now Open up the "web console" for your browser ... usually by pressing "F12" or right clicking and going to "inspect element". Make sure you are on the "console" tab with the input field at the bottom. Copy and paste the script into there, press enter. Then type in your query, like "query('javascript')" and press enter. A number of posts should hide themselves, those that don't contain, in this case, the word 'javascript'. |
This comment has been minimized.
This comment has been minimized.
Sweet thanks! |
This comment has been minimized.
This comment has been minimized.
Version With More Powerful Syntax(title added by original author - not a self-promotion by meiamsome) Hello! I added some more functions, that make it so you can do more complex querys. I also added And, as an added bonus, Arrays still work like they used to and the query function defaults to You can find them at my gist here: (If you want to copy that gist into this one that'd be great, I would do a pull request but they aren't yet available on gists, sadly) |
This comment has been minimized.
This comment has been minimized.
hey thanks - simply beautiful! Think about using some markdown and give your comment an attractive title like "Updated version" or "Version with more powerful syntax"! oh hey wait looks like I can do that As far as replacing it with your implementation, I like the simplicity of my implementation for these purposes. If anything, I'd advocate for a far simpler, more basic and powerful system, not a more complex one. You've simplified some of it ... so a merging would be appropriate |
This comment has been minimized.
This comment has been minimized.
I feel filter to match exact word will be nice. e.g. Searching for "intern" also match "international" which I don't want |
This comment has been minimized.
This comment has been minimized.
@VarunAgw I agree. There's two things: Case insensitivity is great except when it isn't. Perhaps I want "CA" and not "ca" and second is your thing. Probably the best way to do this would be to support RegExp along with string matching. So you could do edit: ok, done. Classic string matching is of course, still supported. easy things easy, hard things possible. So a los angeles search now could look like
If I could get the matches stylized (say, in bold) in under 2 lines of complexity I'll do it. Otherwise I'm drifting away from KISS. Let me think... edit on that: it's not styling it that's the challenge, it's unstyling it for a subsequent search. That sounds like a kind of cleverness that comes with bugs. |
This comment has been minimized.
This comment has been minimized.
Just a simple tweak, but calling with zero args could reset the view (i.e. remove filters). Add this just before
|
This comment has been minimized.
This comment has been minimized.
oh hey thanks ... I'll fix that soon! |
This comment has been minimized.
This comment has been minimized.
I am seeing this with Jul 2016 - Who is hiring on FF and Chrome. Never happened earlier:- |
This comment has been minimized.
This comment has been minimized.
the class of TRs is now "athing comtr" so This works in chrome:
|
This comment has been minimized.
This comment has been minimized.
SamHasler's answer works now. Can you update kristopolus? Thanks! :) |
This comment has been minimized.
This comment has been minimized.
OK just saw this I'm on mobile. I'll get to it today |
This comment has been minimized.
This comment has been minimized.
there you go. It's insanity that there's a specialized function for string tokenization and matching that is specific to the contents of the classname attribute on dom nodes. of course you could just use regular string functions ... great, so why the hell does this thing exist? there's not a special function for strings that contain the letter 'q' or are exactly 11 characters long ... bah, nonsense. anyway, it's fixed. |
This comment has been minimized.
This comment has been minimized.
@kristopolous thanks for fixing this... use this script every few months... great work :) |
This comment has been minimized.
This comment has been minimized.
It seems like it might be nice to have an option to only search the first line for certain terms (ex: REMOTE), since usually occurrences in other lines or subsequent paragraphs aren't actually what you're after. Does anyone else agree? If so, I could try to take a crack at that. |
This comment has been minimized.
This comment has been minimized.
@jeff303 "line" is an amorphous term. I'm not trying to be a jerk, but the computer is and always is - that jerk. Anyway, without a more solid definition (as "line" depends on font size, monitor size etc), I've got no hope here and I want to make it useful for you. I could do something like "Of the first 50 space-separated tokens (aka, words)" or "the first paragraph that contains more than 40 characters" or something. The nuances here is that there's essentially the following formats: 1:
2:
3:
etc. So there has to be a flexible "do what I mean, not what I say" style definition that can accommodate these various degrees of freedom. It's far too easy to have a solution that is very complex, fragile, and useless (which I know is very trendy these days, but I'm not a trendy guy like that). What would be most useful to you? |
This comment has been minimized.
This comment has been minimized.
A slight divergence, but I saw this and was inspired to squeeze it into a single (ish) console command. Relies on
EDIT: To filter, pipe the output somewhere then do something like this |
This comment has been minimized.
This comment has been minimized.
@kristopolous, I'm absolutely aware of the complexity in what seems like a simple thing on the surface. It was more of just a brainstorming idea (mostly driven by my own desire to brush up on Javascript), and not an urgent request for that particular functionality. Attempting to parse the different sections based on commonly seen formats is pretty interesting, but would be fragile as you point out. I think, at a minimum, attempting to look in only the first "paragraph" (the breaks between which actually do correspond to new |
This comment has been minimized.
This comment has been minimized.
place, job, terms, description... here is a crazy idea, why not have a form field, with required fields for remote/onsite. just a thought. if they want, the right people to apply, and not get flooded, with mismatched applicants, btw, @kristopolous, thanks for script, its a way better than seeing the page raw. |
This comment has been minimized.
This comment has been minimized.
Thanks @kristopolous and @meiamsome, browser search functionality is definitely not enough to search hundreds of job positions! Because I wanted a mix of both scripts (i.e. nested criterias AND regular expressions being first-class objects), and because it was fun to write, I ended up creating just another version which looks like this: // Non-Angular Javascript contract positions in London or remote
hn.filter(
hn.or(/(javascript|typescript)/i, /ES\d/, 'JS'),
hn.not(/angular/i),
/contract/i,
hn.or(hn.and('ONSITE', /london/i), 'REMOTE')
); Details at https://gist.github.com/frosas/4cadd8392a3c4af82ef640cbedea3027 |
This comment has been minimized.
This comment has been minimized.
This script loads all pages via AJAX; you may execute it before this one so you search on all pages instead of just first one ;(function ajaxLoadNextPage () {
var more = document.querySelector('.comment-tree > tbody > tr:last-child a');
if (more && more.innerHTML === "More") {
var httpRequest = new XMLHttpRequest();
httpRequest.onreadystatechange = function () {
if (httpRequest.readyState === XMLHttpRequest.DONE) {
if (httpRequest.status === 200) {
more.remove();
var div = document.createElement('div');
div.innerHTML = httpRequest.responseText;
var nextHTML = div.querySelector('.comment-tree > tbody').innerHTML;
document.querySelector('.comment-tree > tbody').innerHTML += nextHTML;
ajaxLoadNextPage();
} else {
alert('There was a problem with the request to ' + more.href);
}
}
};
httpRequest.open('GET', more.href);
httpRequest.send();
}
})(); |
This comment has been minimized.
This comment has been minimized.
Any plans to package this as an extension? |
This comment has been minimized.
This comment has been minimized.
I was revisiting this this month ... I think what I really want these days is exclusion more than inclusion. For instance, I don't care about healthcare, remote e-learning or fintech (I find them to be huxsters trying to arbitrage broken markets with snake oil tech) but anyway ... a blacklist seems really useful ... I should do that instead. |
This comment has been minimized.
Nice👍