Hatena::Let spam filter
@@ -7,6 +7,9 @@
* @javascript_url
*/
+// UserScript
+// https://gist.github.com/noromanba/e2fcfb01b2be8a12be79
+
// feedback to Hatena c.f.
// http://www.hatena.ne.jp/faq/q/let
// http://let.hatelabo.jp/noromanba/let/hLHW16C50Zpx
@@ -18,23 +21,25 @@
// http://ptech.g.hatena.ne.jp/noromanba/20141126/1417027101
// http://ptech.g.hatena.ne.jp/noromanba/20150105/1420463835
+'http://www.hatena.ne.jp/faq/q/let';
+
(() => {
// valid js url patterns; String, url(), RegExp c.f.
// https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/RegExp
// https://en.wikipedia.org/wiki/Regular_expression
// http://yut.hatenablog.com/entry/20110305/1299318337
- // TBD \cX \xhh \uhhhh
+ // TBD \cX \xhh \uhhhh, template literal
const invalidURL = /(?:^|[^"'\s\/^.\\dwstrnvfb0\[\]^|$()?:*{},=!])(?:https?:)+/i;
const wipeout = (ctx) => {
- Array.from(ctx.querySelectorAll('.codelist'), (list) => {
+ Array.from(ctx.querySelectorAll('.codelist'), list => {
const packed = list.querySelector('.packed-source');
const title = (list.querySelector('.title .code-path') || {});
if (!packed || // XXX violate @require only src
- title.textContent === 'no title' ||
- invalidURL.test(packed.textContent)) {
- //*
+ invalidURL.test(packed.textContent) ||
+ title.textContent === 'no title') {
+ /*
list.style.display = 'none';
/*/
list.style.backgroundColor = 'red';
@@ -45,8 +50,8 @@
wipeout(document.body);
// for Pager Extensions
- new MutationObserver((records) => {
- records.forEach((record) => {
+ new MutationObserver(records => {
+ records.forEach(record => {
wipeout(record.target);
});
}).observe(document.body, { childList: true, subtree: true });
/*
* @title Hatena::Let spam filter
* @description hidden spam on Hatena::Let w/ Pager Extension (as UserScript)
* @include http://let.hatelabo.jp/*
* @contributor a-kuma3 http://let.hatelabo.jp/a-kuma3/let/hJme3Kz9g6Zc (Fork of)
* @license MIT License http://opensource.org/licenses/MIT
* @javascript_url
*/
// UserScript
// https://gist.github.com/noromanba/e2fcfb01b2be8a12be79
// feedback to Hatena c.f.
// http://www.hatena.ne.jp/faq/q/let
// http://let.hatelabo.jp/noromanba/let/hLHW16C50Zpx
// Hatena Question spam-filter
// http://let.hatelabo.jp/noromanba/let/hLHWrvnr8Mlx
// spammer report c.f.
// http://ptech.g.hatena.ne.jp/noromanba/20141126/1417027101
// http://ptech.g.hatena.ne.jp/noromanba/20150105/1420463835
'http://www.hatena.ne.jp/faq/q/let';
(() => {
// valid js url patterns; String, url(), RegExp c.f.
// https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/RegExp
// https://en.wikipedia.org/wiki/Regular_expression
// http://yut.hatenablog.com/entry/20110305/1299318337
// TBD \cX \xhh \uhhhh, template literal
const invalidURL = /(?:^|[^"'\s\/^.\\dwstrnvfb0\[\]^|$()?:*{},=!])(?:https?:)+/i;
const wipeout = (ctx) => {
Array.from(ctx.querySelectorAll('.codelist'), list => {
const packed = list.querySelector('.packed-source');
const title = (list.querySelector('.title .code-path') || {});
if (!packed || // XXX violate @require only src
invalidURL.test(packed.textContent) ||
title.textContent === 'no title') {
/*
list.style.display = 'none';
/*/
list.style.backgroundColor = 'red';
//*/
}
});
};
wipeout(document.body);
// for Pager Extensions
new MutationObserver(records => {
records.forEach(record => {
wipeout(record.target);
});
}).observe(document.body, { childList: true, subtree: true });
})();
- Permalink
- このページへの個別リンクです。
- RAW
- 書かれたコードへの直接のリンクです。
- Packed
- 文字列が圧縮された書かれたコードへのリンクです。
- Userscript
- Greasemonkey 等で利用する場合の .user.js へのリンクです。
- Loader
- @require やソースコードが長い場合に多段ロードする Loader コミのコードへのリンクです。
- Metadata
- コード中にコメントで @xxx と書かれたメタデータの JSON です。