-
Notifications
You must be signed in to change notification settings - Fork 0
/
flag_searcher.user.js
64 lines (57 loc) · 2.49 KB
/
flag_searcher.user.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
// ==UserScript==
// @name Flag searcher
// @namespace https://github.com/danthe1st/
// @version 1.0.1
// @description Search flags on Stack Exchange sites
// @author danthe1st
// @match *://*.stackexchange.com/users/flag-summary/*
// @match *://*.stackoverflow.com/users/flag-summary/*
// @match *://*.superuser.com/users/flag-summary/*
// @match *://*.serverfault.com/users/flag-summary/*
// @match *://*.askubuntu.com/users/flag-summary/*
// @match *://*.stackapps.com/users/flag-summary/*
// @match *://*.mathoverflow.net/users/flag-summary/*
// @icon https://www.google.com/s2/favicons?sz=64&domain=stackoverflow.com
// @grant none
// @updateURL https://raw.githubusercontent.com/danthe1st/SO-Userscripts/master/flag_searcher.user.js
// @downloadURL https://raw.githubusercontent.com/danthe1st/SO-Userscripts/master/flag_searcher.user.js
// ==/UserScript==
(function() {
'use strict';
const processPage = (parsed, expected) => {
const flaggedPosts = parsed.getElementsByClassName("flagged-post");
for(let elem of flaggedPosts){
content = elem.textContent.trim().toLowerCase().replaceAll(/\s+/g," ");
if(content.includes(expected)){
resultBox.appendChild(elem);
}
}
};
const findFlagsWithOutcome = expected => {
const params = new URLSearchParams(document.location.search);
const parser = new DOMParser();
resultBox.replaceChildren();
for(let i=1; i<= lastPage; i++){
params.set("page",i);
const site = document.location.origin + document.location.pathname+"?"+params.toString();
fetch(site)
.then(res => res.text())
.then(txt => parser.parseFromString(txt, "text/html"))
.then(doc => processPage(doc, expected));
}
};
const nextPageButton = document.querySelector('a.s-pagination--item[rel="next"]');
let lastPage = 1;
if(nextPageButton){
lastPage = parseInt(nextPageButton.previousElementSibling.text);
}
const sidebar = document.getElementById("sidebar");
const btn = document.createElement("button");
btn.innerText = "Search flags";
btn.onclick = evt => {
const text = prompt("Enter search string");
findFlagsWithOutcome(text.toLowerCase().replaceAll(/\s+/g," "));
};
sidebar.appendChild(btn);
const resultBox = document.getElementById("mainbar");
})();