/*
* @title Yet Another 勝手にスター
* @description クリックしたところに、勝手に はてなスターを置きます(一回だけ)
* @include http://*
* @include https://*
* @license MIT License
* @javascript_url
*/
// inspired by
// http://let.hatelabo.jp/noromanba/let/hLHWyeejvP4c
// http://let.hatelabo.jp/pacochi/let/hLHWyNLcvcJD
(() => {
const d_ = document;
function put_star_container(e) {
if (! d_.querySelector('script[src*="s.hatena.ne.jp"]')) {
d_.head.appendChild(Object.assign(d_.createElement("script"), {
type: "text/javascript",
src: "//s.hatena.ne.jp/js/HatenaStar.js",
onload: () => put_star_container(e),
}));
return;
}
function insert_entry_node_next(e) {
return e.parentNode.insertBefore(d_.createElement("span"), e.nextSibling);
}
let p = {
node: e,
uri: d_.location.href,
title: d_.title,
}
let link = e.tagName == "A" && e.href ? e : e.querySelector("a[href]");
if (link) {
p.uri = link.href;
p.title = link.textContent.trim();
p.node = insert_entry_node_next(link);
/*
TODO: invisible a
e.g.
visible
click !
*/
}
// img にも appendChild できちゃうんだねえ
if (e.tagName == "IMG") {
p.node = insert_entry_node_next(e);
}
// hr にも appendChild できちゃうけど、childNode は見える
// 他にも駄目なタグありそう
console.log(p);
let c = Hatena.Star.EntryLoader;
c.loadEntries = function(p) {
return [ new Hatena.Star.Entry({
entryNode: p.node,
uri: p.uri,
title: p.title,
comment_container: p.node.appendChild(c.createCommentContainer()),
star_container: p.node.appendChild(c.createStarContainer()),
}) ];
};
c.loadNewEntries(p);
delete c.loadEntries;
}
function once_handler(e) {
e.stopPropagation();
e.preventDefault();
put_star_container(e.target);
d_.removeEventListener('click', once_handler);
d_.removeEventListener('touchstart', once_handler);
/*
http://h.hatena.ne.jp/unarist/228182015329663515
https://developer.mozilla.org/ja/docs/Web/API/EventTarget/addEventListener#Parameters
addEventListener(..., ..., { once: true })
click と touchstart が一回ずつ使えちゃうか
*/
}
d_.addEventListener('click', once_handler);
d_.addEventListener('touchstart', once_handler);
})();