Hatena::Haiku::Filter
by
a-kuma3
2018-04-18 [2018/04/18 23:22:03]
はてなハイクのタイムラインを自分の投稿だけにする(Proxy を使ってみたかっただけ
-
/*
* @title Hatena::Haiku::Filter
* @description はてなハイクのタイムラインを自分の投稿だけにする(Proxy を使ってみたかっただけ
* @include http://h.hatena.ne.jp/*
* @license MIT License
* @javascript_url
*/
/*
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect
*/
(() => {
const d_ = document;
/* make height 0 of .blank-entry */
d_.head.appendChild(Object.assign(d_.createElement("style"), {
innerHTML: `
div.stream div.entries div.entry.tl-entry.blank-entry {
padding: 0;
border-bottom: none;
}
`,
}));
const def = {
user: Hatena.Visitor.name,
};
function is_match(entry) {
return [
entry => {
let e = entry.querySelector(".info > .username > a");
return e.title == `id:${def.user}`;
},
].find(f => ! f.call(null, entry)) == null;
}
TL.Entry = new Proxy(TL.Entry, {
construct: (target, args) => {
let obj = Reflect.construct(target, args);
if (! is_match(obj.element)) {
obj.element.innerHTML = "";
obj.element.classList.add("blank-entry");
obj.eid = -1;
}
return obj;
},
});
function auto_pagerize() {
let pager = d_.querySelector("div.pager a.pager-older");
const y1 = pager.getBoundingClientRect().top;
const y2 = window.innerHeight;
if (y1 < y2) {
pager.click();
}
}
TL.View.prototype.stopNextIndicator = new Proxy(TL.View.prototype.stopNextIndicator, {
apply: (target, thisArg, args) => {
auto_pagerize();
return Reflect.apply(target, thisArg, args);
},
});
d_.querySelectorAll(".tl-entry-list > .tl-entry").forEach(entry => {
if (! is_match(entry)) {
entry.style.display = "none";
}
});
auto_pagerize();
})();
-
- Permalink
- このページへの個別リンクです。
- RAW
- 書かれたコードへの直接のリンクです。
- Packed
- 文字列が圧縮された書かれたコードへのリンクです。
- Userscript
- Greasemonkey 等で利用する場合の .user.js へのリンクです。
- Loader
- @require やソースコードが長い場合に多段ロードする Loader コミのコードへのリンクです。
- Metadata
- コード中にコメントで @xxx と書かれたメタデータの JSON です。