H::Q spam-filter
@@ -1,29 +1,36 @@
/*
- * @title 質問一覧からスパム投稿を削除(その場しのぎ)
- * @description その場しのぎだけど、うっとおしすぎるので
- * @include http://*
- * @license MIT License
- * @require
+ * @title H::Q spam-filter
+ * @description delete spam on Hatena Question w/ Auto Paging for UserScript
+ * @inclide http://q.hatena.ne.jp*
+ * @contributor a-kuma3 http://let.hatelabo.jp/a-kuma3/let/hLHWrsqN2qde (Frok of)
+ * @license MIT http://opensource.org/licenses/MIT
* @javascript_url
*/
-(function(){
- if (/http:\/\/q\.hatena\.ne\.jp\/(touch\/)?list/.test(location.href)) {
- var RE_SPAM = /^[- a-zA-Z0-9\\\[\](){}<>:;"'`?=/_.,@!~\n]+…?$/;
- var selector;
- if (/\/touch\//.test(location.href)) {
- selector = "LI.list-question SPAN.question-content";
- } else {
- selector = "UL.list-question LI SPAN.question-content";
- }
- $(selector).each(function() {
- if (RE_SPAM.test(this.textContent)) {
- this.parentNode.parentNode.style.display = "none";
- } else {
- console.log(this.parentNode.parentNode.tagName);
- console.log(this.textContent);
- }
- });
- }
-})();
+// TBD delete by CSS for still paging
+// TODO unify other Hatena spam filter
+(function () {
+ if (!/q\.hatena\.ne\.jp\/(:?touch\/)?/.test(location.hostname + location.pathname)) return;
+ // prob url matching; unsupported except ASCII e.g.
+ // http://q.hatena.ne.jp/1414927875
+ var spamfilter = /^[- a-zA-Z0-9\\\[\](){}<>:;"'`?=/_.,@!~\n]+…?$/,
+ forEach = Array.prototype.forEach;
+ var wipeout = function (context) {
+ // TBD choose parent context by children; using XPath or :scope and CSS4 ?selector
+ forEach.call(context.querySelectorAll('.question-content-container'), function (link) {
+ if (!spamfilter.test(link.textContent)) return;
+
+ link.parentNode.style.display = 'none';
+ });
+ };
+ wipeout(document.body);
+
+ // https://developer.mozilla.org/en-US/docs/Web/API/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 });
+})();
/*
* @title H::Q spam-filter
* @description delete spam on Hatena Question w/ Auto Paging for UserScript
* @inclide http://q.hatena.ne.jp*
* @contributor a-kuma3 http://let.hatelabo.jp/a-kuma3/let/hLHWrsqN2qde (Frok of)
* @license MIT http://opensource.org/licenses/MIT
* @javascript_url
*/
// TBD delete by CSS for still paging
// TODO unify other Hatena spam filter
(function () {
if (!/q\.hatena\.ne\.jp\/(:?touch\/)?/.test(location.hostname + location.pathname)) return;
// prob url matching; unsupported except ASCII e.g.
// http://q.hatena.ne.jp/1414927875
var spamfilter = /^[- a-zA-Z0-9\\\[\](){}<>:;"'`?=/_.,@!~\n]+…?$/,
forEach = Array.prototype.forEach;
var wipeout = function (context) {
// TBD choose parent context by children; using XPath or :scope and CSS4 ?selector
forEach.call(context.querySelectorAll('.question-content-container'), function (link) {
if (!spamfilter.test(link.textContent)) return;
link.parentNode.style.display = 'none';
});
};
wipeout(document.body);
// https://developer.mozilla.org/en-US/docs/Web/API/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 です。