H::Q spam-filter
@@ -3,9 +3,13 @@
* @description hidden spam on Hatena Question w/ AutoPaging for UserScript
* @include http://q.hatena.ne.jp/*
* @contributor a-kuma3 http://let.hatelabo.jp/a-kuma3/let/hLHWrsqN2qde (Fork of)
+ * @contributor noromanba http://let.hatelabo.jp/noromanba/let/hLHWrvnr8Mlx (Fork of)
* @license MIT http://opensource.org/licenses/MIT
* @javascript_url
*/
+/*
+ handle conjuring (half baked)
+*/
// c.f.
// http://q.hatena.ne.jp/1415022461
@@ -19,11 +23,15 @@
(function () {
if (!/q\.hatena\.ne\.jp\/(?:touch\/)?/.test(location.hostname + location.pathname)) return;
+ var NGID = [
+ 'conjuring',
+ ];
+
// unsupported except ASCII
// c.f. http://en.wikipedia.org/wiki/Regular_expression#Character_classes
// http://d.hatena.ne.jp/seuzo/20090309/1236525090
// char class: '\' and POSIX; [:word:] [:space:] [:punct:]
- var spamfilter = /^[\\\w\s\]\[!"#$%&'()*+,./:;<=>?@\^_`{|}~-]+…?$/,
+ var spamfilter = /^[\\\w\s\]\[!"#$%&'()*+,./:;<=>?@\^_`{|}~はてなポイント購入質問本文-]+…?$/,
forEach = Array.prototype.forEach;
var wipeout = function (context) {
// TBD choose parent node by children; using XPath or CSS4 ?selector
@@ -32,6 +40,11 @@
link.parentNode.style.display = 'none';
});
+ forEach.call(context.querySelectorAll('.list-question .user-name'), function (uname) {
+ if (! NGID.includes(uname.textContent)) return;
+
+ uname.parentNode.style.display = 'none';
+ });
};
wipeout(document.body);
/*
* @title H::Q spam-filter
* @description hidden spam on Hatena Question w/ AutoPaging for UserScript
* @include http://q.hatena.ne.jp/*
* @contributor a-kuma3 http://let.hatelabo.jp/a-kuma3/let/hLHWrsqN2qde (Fork of)
* @contributor noromanba http://let.hatelabo.jp/noromanba/let/hLHWrvnr8Mlx (Fork of)
* @license MIT http://opensource.org/licenses/MIT
* @javascript_url
*/
/*
handle conjuring (half baked)
*/
// c.f.
// http://q.hatena.ne.jp/1415022461
// before after e.g. http://q.hatena.ne.jp/list
// http://f.hatena.ne.jp/noromanba/20141105042740
// http://f.hatena.ne.jp/noromanba/20141105042745
// TBD hidden by CSS for keep paging state
// TODO unify other Hatena spam filter
(function () {
if (!/q\.hatena\.ne\.jp\/(?:touch\/)?/.test(location.hostname + location.pathname)) return;
var NGID = [
'conjuring',
];
// unsupported except ASCII
// c.f. http://en.wikipedia.org/wiki/Regular_expression#Character_classes
// http://d.hatena.ne.jp/seuzo/20090309/1236525090
// char class: '\' and POSIX; [:word:] [:space:] [:punct:]
var spamfilter = /^[\\\w\s\]\[!"#$%&'()*+,./:;<=>?@\^_`{|}~はてなポイント購入質問本文-]+…?$/,
forEach = Array.prototype.forEach;
var wipeout = function (context) {
// TBD choose parent node by children; using XPath or CSS4 ?selector
forEach.call(context.querySelectorAll('.question-content-container'), function (link) {
if (!spamfilter.test(link.textContent)) return;
link.parentNode.style.display = 'none';
});
forEach.call(context.querySelectorAll('.list-question .user-name'), function (uname) {
if (! NGID.includes(uname.textContent)) return;
uname.parentNode.style.display = 'none';
});
};
wipeout(document.body);
// https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver
// http://caniuse.com/#feat=mutationobserver
var MutationObserver = window.MutationObserver || window.WebkitMutationObserver;
new MutationObserver(function (records) {
records.forEach(function (record) {
wipeout(record.target);
});
}).observe(document.body, { childList: true, subtree: true });
})();
- Permalink
- このページへの個別リンクです。
- RAW
- 書かれたコードへの直接のリンクです。
- Packed
- 文字列が圧縮された書かれたコードへのリンクです。
- Userscript
- Greasemonkey 等で利用する場合の .user.js へのリンクです。
- Loader
- @require やソースコードが長い場合に多段ロードする Loader コミのコードへのリンクです。
- Metadata
- コード中にコメントで @xxx と書かれたメタデータの JSON です。