<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF xmlns="http://purl.org/rss/1.0/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel rdf:about="https://let.hatelabo.jp/a-kuma3/rss">
    <link>https://let.hatelabo.jp/a-kuma3/rss</link>
    <description></description>
    <title>Bookmarklets from a-kuma3</title>
    <items>
      <rdf:Seq>
        <rdf:li rdf:resource="https://let.hatelabo.jp/a-kuma3/let/hLHXhsahlctV"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/a-kuma3/let/hLHV2LKa-6p_"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/a-kuma3/let/hJmc_YyG8sE-"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/a-kuma3/let/hJmc7ZTR7vBO"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/a-kuma3/let/hJmc2r6j5rMx"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/a-kuma3/let/hJmfy_yqmbJ2"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/a-kuma3/let/hLHUyoDNoMc7"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/a-kuma3/let/hJmfoun265t1"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/a-kuma3/let/hLHXoviKjskP"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/a-kuma3/let/hJmfkuvY__MH"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/a-kuma3/let/hLHXhMP_wvgF"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/a-kuma3/let/hJmfg_-o-rxf"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/a-kuma3/let/hJme_f-UgJ5P"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/a-kuma3/let/hLHW7JSExeZ_"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/a-kuma3/let/hJme4N-s77x7"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/a-kuma3/let/hJmeypnCy9oJ"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/a-kuma3/let/hLHWyZTasr9n"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/a-kuma3/let/hLHWyKSui4Z7"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/a-kuma3/let/hLHWypmkorgp"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/a-kuma3/let/hLHWycCUqaF_"/>
      </rdf:Seq>
    </items>
  </channel>
  <item rdf:about="https://let.hatelabo.jp/a-kuma3/let/hLHXhsahlctV">
    <link>https://let.hatelabo.jp/a-kuma3/let/hLHXhsahlctV</link>
    <dc:date>2019-08-02T07:59:35Z</dc:date>
    <description>（仮）Wizball の詳細ページを保存用に、ちょっといじる</description>
    <dc:creator>a-kuma3</dc:creator>
    <title>[Let] （仮）Wizball の詳細ページを保存用に、ちょっといじる</title>
    <content:encoded>&lt;a href="javascript:%28async%20_%3D%3E%7Bif%28location.hostname%21%3D%22m.wizball.io%22%29%7Balert%28%22Please%20use%20at%20m.wizball.io%20%21%22%29%3Breturn%7Dconst%20d_%3Ddocument%3Bconst%20ts%3DDate.now%28%29%3Bconst%20msg%3Dd_.querySelector%28%22.question_logo%22%29%3Basync%20function%20display_comments%28%29%7Bconst%20list%3Dd_.querySelectorAll%28%22.comment_list%22%29%3Bfor%28let%20i%3D0%3Bi%3Clist.length%3B%2B%2Bi%29%7Bconst%20first_item%3Dlist%5Bi%5D.querySelector%28%22.comment_txt%22%29%3Bif%28%21first_item%29%7Bcontinue%7Dconst%20orig_url%3Dfirst_item.href%3Bconst%20url_base%3Dorig_url.replace%28%2Fquestions%2F%2C%22apis%2Fv1%2Fquestions%22%29%3Bconst%20comments%3D%5B%5D%3Blet%20page%3D1%3Bwhile%28true%29%7Bconst%20url%3Durl_base%2B%22%3Fpage%3D%22%2Bpage%2B%22%26size%3D50%26sort%3DLATEST%22%3Bconst%20resp%3Dawait%20fetch%28url%29%3Bconst%20json%3Dawait%20resp.json%28%29%3Bif%28json.length%3E0%29%7Bcomments.push%28...json%29%3Bpage%2B%3D1%7Delse%7Bbreak%7D%7Dlist%5Bi%5D.innerHTML%3D%22%22%3Bcomments.forEach%28%28c%3D%3E%7Blet%20img%3Bif%28c.status%3D%3D%22PENALTY%22%29%7Bconst%20item%3DObject.assign%28d_.createElement%28%22li%22%29%2C%7BclassName%3A%22comment_item%22%2CinnerHTML%3A%27%3Cdiv%20class%3D%22message_area%22%3E%3Cdiv%20class%3D%22message_area_inner%22%3E%3Cp%20class%3D%22message%22%3E%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%83%9D%E3%83%AA%E3%82%B7%E3%83%BC%E9%81%95%E5%8F%8D%E3%81%AB%E3%82%88%E3%82%8A%E9%9D%9E%E8%A1%A8%E7%A4%BA%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82%3C%2Fp%3E%3C%2Fdiv%3E%3C%2Fdiv%3E%27%7D%29%3Blist%5Bi%5D.appendChild%28item%29%3Breturn%7Dif%28c.author.image%29%7Bimg%3D%5B%27%3Cimg%20src%3D%22https%3A%2F%2Fobs.line-scdn.net%2F%27%2Cc.author.image.hash%2C%27%2Fs150%22%20class%3D%22user_20%22%20title%3D%22%27%2Cc.author.nickname%2C%27%22%3E%27%5D.join%28%22%22%29%7Delse%7Bimg%3D%27%3Cimg%20src%3D%22data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQYV2NgAAIAAAUAAarVyFEAAAAASUVORK5CYII%3D%22%20class%3D%22user_20%22%20title%3D%22%27%2Bc.author.nickname%2B%27%22%3E%27%7Dconst%20item%3DObject.assign%28d_.createElement%28%22li%22%29%2C%7BclassName%3A%22comment_item%22%2CinnerHTML%3A%5B%27%3Cdiv%20class%3D%22comment_item_inner%22%3E%3Cdiv%20class%3D%22profile_img%20comment_icon%22%3E%27%2Cimg%2C%27%3C%2Fdiv%3E%3Ca%20href%3D%22%2Fusers%2F%27%2Cc.author.id%2C%27%22%20class%3D%22user_id%22%3E%27%2Cc.author.nickname%2C%27%3C%2Fa%3E%20%3Cdiv%20class%3D%22comment_txt%20type_space%22%3E%27%2Cc.text%2C%27%3C%2Fa%3E%3C%2Fdiv%3E%27%5D.join%28%22%22%29%7D%29%3Blist%5Bi%5D.appendChild%28item%29%7D%29%29%3Bconst%20comment_value%3Dlist%5Bi%5D.parentNode.querySelector%28%22.comment_list%20~%20.comment_value%22%29%3Blist%5Bi%5D.parentNode.insertBefore%28comment_value%2Clist%5Bi%5D%29%7D%7Dasync%20function%20load_q%28qid%29%7Bconst%20resp%3Dawait%20fetch%28%22%2Fapis%2Fv1%2Fquestions%2F%22%2Bqid%29%3Bconst%20json%3Dawait%20resp.json%28%29%3Breturn%20json%7Dasync%20function%20load_a%28qid%29%7Bconst%20map%3D%7B%7D%3Bfor%28let%20p%3D1%3Bp%3C%3D300%3B%2B%2Bp%29%7Bconst%20resp%3Dawait%20fetch%28%22%2Fapis%2Fv1%2Fquestions%2F%22%2Bqid%2B%22%2Fanswers%3Fpage%3D%22%2Bp%2B%22%26size%3D50%26sort%3DPOPULAR%22%29%3Bconst%20json%3Dawait%20resp.json%28%29%3Bif%28json.length%3D%3D0%29%7Bbreak%7Djson.forEach%28%28a%3D%3E%7Bmap%5Ba.id%5D%3Da%7D%29%29%7Dreturn%20map%7Dasync%20function%20load_v%28a%29%7Blet%20ub%3Bif%28a.questionId%29%7Bub%3D%22%2Fapis%2Fv1%2Fquestions%2F%22%2Ba.questionId%2B%22%2Fanswers%2F%22%2Ba.id%2B%22%2Fvoters%3Fsize%3D50%26sort%3DLATEST%26%22%7Delse%7Bub%3D%22%2Fapis%2Fv1%2Fquestions%2F%22%2Ba.id%2B%22%2Fvotes%3Fsize%3D50%26sort%3DLATEST%26%22%7Dconst%20list%3D%5B%5D%3Bfor%28let%20p%3D1%3Bp%3C%3D300%3B%2B%2Bp%29%7Bconst%20resp%3Dawait%20fetch%28ub%2B%22page%3D%22%2Bp%29%3Bconst%20json%3Dawait%20resp.json%28%29%3Bif%28json.length%3D%3D0%29%7Bbreak%7Dlist.push%28...json%29%7Dreturn%20list%7Dfunction%20modify_time%28e%2Cq%29%7Bconst%20qt%3De.querySelector%28%22.user_info_detail.date%22%29%3Bqt.innerHTML%3Dnew%20Date%28q.createdAt%29.toLocaleString%28%29%7Dasync%20function%20display_voters%28e%2Ca%29%7Bconst%20eopt%3De.querySelector%28%22.qna_option_area%22%29%3Bconst%20ea%3Dd_.createElement%28%22div%22%29%3Bea.className%3D%22vote_area%22%3Beopt.parentNode.insertBefore%28ea%2Ceopt%29%3Bconst%20v%3Dawait%20load_v%28a%29%3Bea.innerHTML%3D%27%3Cdiv%20class%3D%22vote_value%22%3EVote%20%3A%20%27%2Bv.length%2B%27%3C%2Fdiv%3E%27%3Bconst%20eul%3Dd_.createElement%28%22ul%22%29%3Bea.appendChild%28eul%29%3Beul.className%3D%22voter_list%22%3Bv.forEach%28%28v%3D%3E%7Bconst%20li%3Deul.appendChild%28d_.createElement%28%22li%22%29%29%3Bli.className%3D%22voter_item%20profile_img%22%3Bif%28v.author.image%29%7Bli.innerHTML%3D%27%3Cimg%20src%3D%22https%3A%2F%2Fobs.line-scdn.net%2F%27%2Bv.author.image.hash%2B%27%2Fs150%22%20class%3D%22user_20%22%20title%3D%22%27%2Bv.author.nickname%2B%27%22%3E%27%7Delse%7Bli.innerHTML%3D%27%3Cimg%20src%3D%22data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQYV2NgAAIAAAUAAarVyFEAAAAASUVORK5CYII%3D%22%20class%3D%22user_20%22%20title%3D%22%27%2Bv.author.nickname%2B%27%22%3E%27%7D%7D%29%29%7Dasync%20function%20modify_data%28%29%7Bmsg.innerHTML%3D%22%E8%B3%AA%E5%95%8F%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E5%8F%96%E5%BE%97%E4%B8%AD...%22%3Bconst%20m%3D%2F%5C%2Fquestions%5C%2F%28%5Cd%2B%29%2F.exec%28location.href%29%3Bconst%20qid%3Dm%5B1%5D%3Bconst%20q%3Dawait%20load_q%28qid%29%3Bconst%20qe%3Dd_.querySelector%28%22.qna_area.question%22%29%3Bmodify_time%28qe%2Cq%29%3Bmsg.innerHTML%3D%22%E8%B3%AA%E5%95%8F%E3%81%AEVoter%E3%82%92%E5%8F%96%E5%BE%97%E4%B8%AD...%22%3Bawait%20display_voters%28qe%2Cq%29%3Bmsg.innerHTML%3D%22%E5%9B%9E%E7%AD%94%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E5%8F%96%E5%BE%97%E4%B8%AD...%22%3Bconst%20a%3Dawait%20load_a%28qid%29%3Bconst%20ae%3Dd_.querySelectorAll%28%22.qna_area.answer%20.answer_item%22%29%3Bmsg.innerHTML%3D%22%E5%9B%9E%E7%AD%94%E3%81%AEVoter%E3%82%92%E5%8F%96%E5%BE%97%E4%B8%AD...%22%3Bfor%28let%20i%3D0%3Bi%3Cae.length%3B%2B%2Bi%29%7Bconst%20bc%3Dae%5Bi%5D.querySelector%28%22.btn_comment%22%29%3Bif%28bc%29%7Bconst%20m%3D%2Fanswers%5C%2F%28%5Cd%2B%29%2F.exec%28bc.href%29%3Bconst%20aid%3Dm%5B1%5D%3Bmodify_time%28ae%5Bi%5D%2Ca%5Baid%5D%29%3Bawait%20display_voters%28ae%5Bi%5D%2Ca%5Baid%5D%29%7D%7D%7Dasync%20function%20modify_window%28%29%7Bmsg.innerHTML%3D%22%E3%82%B3%E3%83%A1%E3%83%B3%E3%83%88%E3%82%92%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BF%E4%B8%AD...%22%3Bawait%20display_comments%28%29%3Bawait%20modify_data%28%29%3Bmsg.innerHTML%3D%22%E2%98%85%E5%AE%8C%E4%BA%86%E2%98%85%22%3BsetTimeout%28%28function%28%29%7Bmsg.innerHTML%3D%22%22%7D%29%2C3e3%29%3Bconsole.log%28%22%21%21%21%20%22%2B%28Date.now%28%29-ts%29%2F1e3%2B%22%20sec%22%29%7Dconst%20more_btn%3Dd_.querySelector%28%22.qna_area.answer%20.btn_more_answer%22%29%3Bif%28more_btn%29%7Bd_.head.appendChild%28Object.assign%28d_.createElement%28%22style%22%29%2C%7BinnerHTML%3A%5B%27body%20%7B%27%2C%27%5Ctmax-width%3A%20640px%3B%27%2C%27%7D%27%2C%27.wrap.home_end%20.content%20.qna_area_inner%20.comment_area%20.comment_item_inner%20.comment_txt%20%7B%27%2C%27%5Ctmax-height%3A%20none%3B%27%2C%27%5Ctdisplay%3A%20block%3B%27%2C%27%7D%27%2C%27.comment_item_inner%20.comment_icon%2C%20.voter_list%20.voter_item%20%7B%27%2C%27%5Ctwidth%3A%2020px%3B%27%2C%27%5Ctheight%3A%2020px%3B%27%2C%27%5Ctmargin-right%3A%200.5ex%3B%27%2C%27%7D%27%2C%27.comment_item_inner%20.comment_icon%20%7B%27%2C%27%5Ctfloat%3A%20left%3B%27%2C%27%7D%27%2C%27.user_20%20%7B%27%2C%27%5Ctborder-radius%3A%2050%25%3B%27%2C%27%5Ctwidth%3A%20100%25%3B%27%2C%27%7D%27%2C%27.wrap.home_end%20.content%20.question_logo%20%7B%27%2C%27%5Ctfont-size%3A%20inherit%3B%27%2C%27%5Ctcolor%3A%20inherit%3B%27%2C%27%5Ctfont-size%3A%2015px%3B%27%2C%27%5Ctcolor%3A%20%23959aa5%3B%27%2C%27%7D%27%2C%27.wrap.home_end%20.content%20.qna_area_inner%20.comment_area%20.comment%20.comment_value%20%7B%27%2C%27%5Ctpadding-top%3A%200%3B%27%2C%27%5Ctpadding-bottom%3A%2010px%3B%27%2C%27%7D%27%2C%27.qna_area.question%20.vote_area%20%7B%27%2C%27%5Ctpadding-left%3A%2022px%3B%27%2C%27%7D%27%2C%27.vote_area%20%7B%27%2C%27%5Ctpadding-top%3A%2014px%3B%27%2C%27%7D%27%2C%27.vote_value%20%7B%27%2C%27%5Ctpadding-bottom%3A%2010px%3B%27%2C%27%7D%27%2C%27.vote_area%20%7B%27%2C%27%5Ctcolor%3A%20%23959aa5%3B%27%2C%27%5Ctfont-size%3A%2015px%3B%27%2C%27%7D%27%2C%27.voter_item%20%7B%27%2C%27%5Ctdisplay%3A%20inline-block%3B%27%2C%27%7D%27%2C%27.related_question_area%20%7B%27%2C%27%5Ctdisplay%3A%20none%3B%27%2C%27%7D%27%2C%27.wrap.home_end%20.content%20.qna_area.answer%20.message_area%20%7B%27%2C%27%5Ctheight%3A%20initial%3B%27%2C%27%5Ctbackground-color%3A%20silver%3B%27%2C%27%7D%27%2C%27.wrap.home_end%20.content%20.message_area%20.message%20%7B%27%2C%27%5Ctcolor%3A%20%23777%3B%27%2C%27%7D%27%5D.join%28%22%22%29%7D%29%29%3Blet%20n%3D0%3Bconst%20answer_list%3Dd_.querySelector%28%22.answer_list%22%29%3Bconst%20MutationObserver%3Dwindow.MutationObserver%7C%7Cwindow.WebkitMutationObserver%3Bconst%20observer%3Dnew%20MutationObserver%28%28async%20function%28records%29%7Bn%2B%3D1%3Bif%28more_btn.style.display%21%3D%22none%22%29%7Bmore_btn.click%28%29%3Bif%28n%3E10%29%7Bobserver.disconnect%28%29%7D%7Delse%7Bawait%20modify_window%28%29%7D%7D%29%29%3Bobserver.observe%28answer_list%2C%7BchildList%3Atrue%7D%29%3Bif%28more_btn.style.display%21%3D%22none%22%29%7Bmsg.innerHTML%3D%22%E5%9B%9E%E7%AD%94%E3%82%92%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BF%E4%B8%AD...%22%3Bmore_btn.click%28%29%7Delse%7Bawait%20modify_window%28%29%7D%7D%7D%29%28%29%3B"&gt;（仮）Wizball の詳細ページを保存用に、ちょっといじる&lt;/a&gt;&lt;pre&gt;/*
 * @title （仮）Wizball の詳細ページを保存用に、ちょっといじる
 * @description （仮）Wizball の詳細ページを保存用に、ちょっといじる
 * @include https://m.wizball.io/questions/*
 * @license MIT License http://opensource.org/licenses/MIT
 * @javascript_url *
 */
/*
・コメントを全て展開して、全文表示されるようにした
・コメントにアイコンをつけた
・Voter のアイコンを表示するようにした
・投稿時刻を日時にした
・下部の「人気の質問」を消した
・表示幅を、最大 640px にした

■免責事項
この Bookmarklet を使うことによって生じた、いかなる損害、不利益等に関しても a-kuma3 は一切の責任を負いません。
それを承諾した方だけ、お使いください。

history
2019-07-28  バッククォートを外して、Hatena::Let へ
2019-08-01  Wizball で告知
2019-08-02  Chrome : デフォルトアイコンだと名前が出ちゃう
2019-08-02  Chrome : コメントが複数行になってない
2019-08-02  コメントにポリシー違反があったときの対応

*/
(async _ =&amp;gt; {
	if (location.hostname != &amp;quot;m.wizball.io&amp;quot;) {
		alert(&amp;quot;Please use at m.wizball.io !&amp;quot;);
		return;
	}
	const d_ = document;
	const ts = Date.now();
	const msg = d_.querySelector(&amp;quot;.question_logo&amp;quot;);
	async function display_comments() {
//		console.log(&amp;quot;!!! load comments !!!&amp;quot;);
		const list = d_.querySelectorAll(&amp;quot;.comment_list&amp;quot;);
		for (let i = 0 ; i &amp;lt; list.length ; ++i) {
			const first_item = list[i].querySelector(&amp;quot;.comment_txt&amp;quot;);
			if (! first_item) {		// 質問はコメントがなくても UL 要素がある
				continue;
			}
			const orig_url = first_item.href;
			const url_base = orig_url.replace(/questions/, &amp;quot;apis/v1/questions&amp;quot;);
			const comments = [];
			let page = 1;
			while (true) {
				const url = url_base + &amp;quot;?page=&amp;quot; + page + &amp;quot;&amp;amp;size=50&amp;amp;sort=LATEST&amp;quot;;
				const resp = await fetch(url);
				const json = await resp.json();
				if (json.length &amp;gt; 0) {
					comments.push(... json);
					page += 1;
				} else {
					break;
				}
			}
//			console.log(comments);
			list[i].innerHTML = &amp;quot;&amp;quot;;
			comments.forEach(c =&amp;gt; {
				let img;
				if (c.status == &amp;quot;PENALTY&amp;quot;) {
					const item = Object.assign(d_.createElement(&amp;quot;li&amp;quot;), {
						className: &amp;quot;comment_item&amp;quot;,
						innerHTML: '&amp;lt;div class=&amp;quot;message_area&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;message_area_inner&amp;quot;&amp;gt;&amp;lt;p class=&amp;quot;message&amp;quot;&amp;gt;サービスポリシー違反により非表示になりました。&amp;lt;/p&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;',
					});
					list[i].appendChild(item);
					return;
				}
				if (c.author.image) {
					img = [
						'&amp;lt;img src=&amp;quot;https://obs.line-scdn.net/',
						c.author.image.hash,
						'/s150&amp;quot; class=&amp;quot;user_20&amp;quot; title=&amp;quot;',
						c.author.nickname,
						'&amp;quot;&amp;gt;'
					].join(&amp;quot;&amp;quot;);
				} else {
					img = '&amp;lt;img src=&amp;quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQYV2NgAAIAAAUAAarVyFEAAAAASUVORK5CYII=&amp;quot; class=&amp;quot;user_20&amp;quot; title=&amp;quot;' + c.author.nickname + '&amp;quot;&amp;gt;';
				}
				const item = Object.assign(d_.createElement(&amp;quot;li&amp;quot;), {
					className: &amp;quot;comment_item&amp;quot;,
					innerHTML: [
						'&amp;lt;div class=&amp;quot;comment_item_inner&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;profile_img comment_icon&amp;quot;&amp;gt;',
						img,
						'&amp;lt;/div&amp;gt;&amp;lt;a href=&amp;quot;/users/',
						c.author.id,
						'&amp;quot; class=&amp;quot;user_id&amp;quot;&amp;gt;',
						c.author.nickname,
						'&amp;lt;/a&amp;gt; &amp;lt;div class=&amp;quot;comment_txt type_space&amp;quot;&amp;gt;',
						c.text,
						'&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;',
					].join(&amp;quot;&amp;quot;),
				});
				list[i].appendChild(item);
			});
			const comment_value = list[i].parentNode.querySelector(&amp;quot;.comment_list ~ .comment_value&amp;quot;);
//			console.log(comment_value);
			list[i].parentNode.insertBefore(comment_value, list[i]);
		}
	}

	async function load_q(qid) {
		const resp = await fetch(&amp;quot;/apis/v1/questions/&amp;quot; + qid);
		const json = await resp.json();
		return json;
	}
	async function load_a(qid) {
		const map = {};
		for (let p = 1 ; p &amp;lt;= 300 ; ++p) {
			const resp = await fetch(&amp;quot;/apis/v1/questions/&amp;quot; + qid + &amp;quot;/answers?page=&amp;quot; + p + &amp;quot;&amp;amp;size=50&amp;amp;sort=POPULAR&amp;quot;);
			const json = await resp.json();
			if (json.length == 0) {
				break;
			}
			json.forEach(a =&amp;gt; {
				map[a.id] = a;
			});
		}
		return map;
	}
	async function load_v(a) {
		let ub;
		if (a.questionId) {		// answer
			ub = &amp;quot;/apis/v1/questions/&amp;quot; + a.questionId + &amp;quot;/answers/&amp;quot; + a.id + &amp;quot;/voters?size=50&amp;amp;sort=LATEST&amp;amp;&amp;quot;;
		} else { // question
			ub = &amp;quot;/apis/v1/questions/&amp;quot; + a.id + &amp;quot;/votes?size=50&amp;amp;sort=LATEST&amp;amp;&amp;quot;;
		}
		const list = [];
		for (let p = 1 ; p &amp;lt;= 300 ; ++p) {
			const resp = await fetch(ub + &amp;quot;page=&amp;quot; + p);
			const json = await resp.json();
			if (json.length == 0) {
				break;
			}
			list.push(... json);
		}
		return list;
	}

	function modify_time(e, q) {
		const qt = e.querySelector(&amp;quot;.user_info_detail.date&amp;quot;);
		qt.innerHTML = (new Date(q.createdAt)).toLocaleString();
	}

	async function display_voters(e, a) {
		const eopt = e.querySelector(&amp;quot;.qna_option_area&amp;quot;);
		const ea = d_.createElement(&amp;quot;div&amp;quot;);
		ea.className = &amp;quot;vote_area&amp;quot;;
		eopt.parentNode.insertBefore(ea, eopt);
//		eopt.parentNode.insertBefore(eul, eopt);
		const v = await load_v(a);
		ea.innerHTML = '&amp;lt;div class=&amp;quot;vote_value&amp;quot;&amp;gt;Vote : ' + v.length + '&amp;lt;/div&amp;gt;';
		const eul = d_.createElement(&amp;quot;ul&amp;quot;);
		ea.appendChild(eul);
		eul.className = &amp;quot;voter_list&amp;quot;;
		v.forEach(v =&amp;gt; {
			const li = eul.appendChild(d_.createElement(&amp;quot;li&amp;quot;));
			li.className = &amp;quot;voter_item profile_img&amp;quot;;
//			li.innerHTML = v.author.nickname + &amp;quot;, &amp;quot;;
			if (v.author.image) {
				li.innerHTML = '&amp;lt;img src=&amp;quot;https://obs.line-scdn.net/' + v.author.image.hash + '/s150&amp;quot; class=&amp;quot;user_20&amp;quot; title=&amp;quot;' + v.author.nickname + '&amp;quot;&amp;gt;';
			} else {
				li.innerHTML = '&amp;lt;img src=&amp;quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQYV2NgAAIAAAUAAarVyFEAAAAASUVORK5CYII=&amp;quot; class=&amp;quot;user_20&amp;quot; title=&amp;quot;' + v.author.nickname + '&amp;quot;&amp;gt;';
			}
		});
	}

	async function modify_data() {
		msg.innerHTML = &amp;quot;質問データを取得中...&amp;quot;;
		const m = /\/questions\/(\d+)/.exec(location.href);
		const qid = m[1];
		const q = await load_q(qid);
		const qe = d_.querySelector(&amp;quot;.qna_area.question&amp;quot;);
		modify_time(qe, q);
		msg.innerHTML = &amp;quot;質問のVoterを取得中...&amp;quot;;
//		const qv = await load_v(q);
		await display_voters(qe, q);

		msg.innerHTML = &amp;quot;回答データを取得中...&amp;quot;;
		const a = await load_a(qid);
		const ae = d_.querySelectorAll(&amp;quot;.qna_area.answer .answer_item&amp;quot;);
//		console.log(ae);
		msg.innerHTML = &amp;quot;回答のVoterを取得中...&amp;quot;;
		for (let i = 0 ; i &amp;lt; ae.length ; ++i) {
			const bc = ae[i].querySelector(&amp;quot;.btn_comment&amp;quot;);
			if (bc) {
				const m = /answers\/(\d+)/.exec(bc.href);
				const aid = m[1];
				modify_time(ae[i], a[aid]);
	//			const av = await load_v(a);
				await display_voters(ae[i], a[aid]);
			}
			// else PENALTY
		}
	}

//	function x() {
//		const imgs = d_.querySelectorAll(&amp;quot;img&amp;quot;);
//		const img = imgs[1];
//		console.log(img);
//		let canvas = Object.assign(document.createElement(&amp;quot;canvas&amp;quot;), {
//            width: img.width,
//            height: img.height,
//        });
//        let ctx = canvas.getContext('2d');
//        ctx.drawImage(img, 0, 0);
//		const uri = canvas.toDataURL();		// The operation is insecure.
//		console.log(uri);
//		img.src = uri;
//	}

	async function modify_window() {
		msg.innerHTML = &amp;quot;コメントを読み込み中...&amp;quot;;
		await display_comments();
		await modify_data();
//		x();
		msg.innerHTML = &amp;quot;★完了★&amp;quot;;
		setTimeout(function() {
			msg.innerHTML = &amp;quot;&amp;quot;;
		}, 3000);
		console.log(&amp;quot;!!! &amp;quot; + ((Date.now() - ts)/1000.0) + &amp;quot; sec&amp;quot;);
	}

	const more_btn = d_.querySelector(&amp;quot;.qna_area.answer .btn_more_answer&amp;quot;);
	if (more_btn) {
		d_.head.appendChild(Object.assign(d_.createElement(&amp;quot;style&amp;quot;), {
			innerHTML: [
'body {',
'	max-width: 640px;',
'}',
'.wrap.home_end .content .qna_area_inner .comment_area .comment_item_inner .comment_txt {',
'	max-height: none;',
'	display: block;',
'}',
'.comment_item_inner .comment_icon, .voter_list .voter_item {',
'	width: 20px;',
'	height: 20px;',
'	margin-right: 0.5ex;',
'}',
'.comment_item_inner .comment_icon {',
'	float: left;',
'}',
'.user_20 {',
'	border-radius: 50%;',
'	width: 100%;',
'}',
'.wrap.home_end .content .question_logo {',
'	font-size: inherit;',
'	color: inherit;',
'	font-size: 15px;',
'	color: #959aa5;',
'}',
'.wrap.home_end .content .qna_area_inner .comment_area .comment .comment_value {',
'	padding-top: 0;',
'	padding-bottom: 10px;',
'}',
'.qna_area.question .vote_area {',
'	padding-left: 22px;',
'}',
'.vote_area {',
'	padding-top: 14px;',
'}',
'.vote_value {',
'	padding-bottom: 10px;',
'}',
'.vote_area {',
'	color: #959aa5;',
'	font-size: 15px;',
'}',
'.voter_item {',
'	display: inline-block;',
'}',
'.related_question_area {',
'	display: none;',
'}',
'.wrap.home_end .content .qna_area.answer .message_area {',
'	height: initial;',
'	background-color: silver;',
'}',
'.wrap.home_end .content .message_area .message {',
'	color: #777;',
'}',
		].join(&amp;quot;&amp;quot;),
		}));
		let n = 0;
		const answer_list = d_.querySelector(&amp;quot;.answer_list&amp;quot;);
		// https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver
		const MutationObserver = window.MutationObserver || window.WebkitMutationObserver;
		const observer = new MutationObserver(async function (records) {
			n += 1;
//			console.log(n);
			if (more_btn.style.display != &amp;quot;none&amp;quot;) {
				more_btn.click();
				if (n &amp;gt; 10) {
					observer.disconnect();
				}
			} else {
				await modify_window();
			}
		});
		observer.observe(answer_list, { childList: true, /* subtree: true */ });

		if (more_btn.style.display != &amp;quot;none&amp;quot;) {
			msg.innerHTML = &amp;quot;回答を読み込み中...&amp;quot;;
			more_btn.click();
		} else {
			await modify_window();
		}
	}
})();
&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/a-kuma3/let/hLHV2LKa-6p_">
    <link>https://let.hatelabo.jp/a-kuma3/let/hLHV2LKa-6p_</link>
    <dc:date>2018-10-30T04:02:47Z</dc:date>
    <description>Wizball の詳細ページで質問投稿日時を表示する</description>
    <dc:creator>a-kuma3</dc:creator>
    <title>[Let] Wizball の詳細ページで質問投稿日時を表示する</title>
    <content:encoded>&lt;a href="javascript:%28_%3D%3E%7Bif%28location.hostname%21%3D%22wizball.io%22%7C%7C%21%2F%5E%5C%2Fquestions%5C%2F%5Cd%2B%2F.test%28location.pathname%29%29%7Breturn%7Dconst%20m%3D%2F%5E%5C%2Fquestions%5C%2F%28%5Cd%2B%29%2F.exec%28location.pathname%29%3Bif%28m%29%7Bfetch%28%22%2Fapis%2Fv1%2Fquestions%2F%22%2Bm%5B1%5D%29.then%28%28resp%3D%3Eresp.json%28%29%29%29.then%28%28json%3D%3E%7Bconst%20d%3Dnew%20Date%28json.createdAt%29%3Bconst%20e%3Ddocument.querySelector%28%22.profile_info_area%20%3E%20.date%22%29%3Be.innerHTML%3Dd.toLocaleString%28%29%7D%29%29%7D%7D%29%28%29%3B"&gt;Wizball の詳細ページで質問投稿日時を表示する&lt;/a&gt;&lt;pre&gt;/*
 * @title Wizball の詳細ページで質問投稿日時を表示する
 * @description Wizball の詳細ページで質問投稿日時を表示する
 * @include https://wizball.io/questions/*
 * @license MIT License http://opensource.org/licenses/MIT
 * @javascript_url *
 */

(_ =&amp;gt; {
    if (location.hostname != &amp;quot;wizball.io&amp;quot; || ! /^\/questions\/\d+/.test(location.pathname)) {
        return;
    }
    const m = /^\/questions\/(\d+)/.exec(location.pathname);
    if (m) {
        fetch(&amp;quot;/apis/v1/questions/&amp;quot; + m[1])
        .then(resp =&amp;gt; resp.json())
        .then(json =&amp;gt; {
            const d = new Date(json.createdAt);
            const e = document.querySelector(&amp;quot;.profile_info_area &amp;gt; .date&amp;quot;);
            e.innerHTML = d.toLocaleString();
        });
    }
})();
&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/a-kuma3/let/hJmc_YyG8sE-">
    <link>https://let.hatelabo.jp/a-kuma3/let/hJmc_YyG8sE-</link>
    <dc:date>2018-06-11T00:39:51Z</dc:date>
    <description>引用になってなくても引用スターできるようにします</description>
    <dc:creator>a-kuma3</dc:creator>
    <title>[Let] greed quote star feat. Proxy</title>
    <content:encoded>&lt;a href="javascript:%28%28%29%3D%3E%7Bfunction%20change_button_color%28img%29%7Blet%20canvas%3Bdocument.querySelectorAll%28%27img.hatena-star-add-button%5Bsrc%2A%3D%22s.hatena.ne.jp%22%27%29.forEach%28%28target%3D%3E%7Bif%28%21canvas%29%7Bcanvas%3DObject.assign%28document.createElement%28%22canvas%22%29%2C%7Bwidth%3Aimg.width%2Cheight%3Aimg.height%7D%29%3Blet%20ctx%3Dcanvas.getContext%28%272d%27%29%3Bctx.drawImage%28img%2C0%2C0%29%3Blet%20imageData%3Dctx.getImageData%280%2C0%2Cimg.width%2Cimg.height%29%3Blet%20data%3DimageData.data%3Bfor%28let%20i%3D0%3Bi%3Cdata.length%3Bi%2B%3D4%29%7Bif%28data%5Bi%5D%3C200%29%7Bdata%5Bi%5D%3D255%3Bdata%5Bi%2B1%5D%3D215%3Bdata%5Bi%2B2%5D%3D0%7D%7Dctx.putImageData%28imageData%2C0%2C0%29%7Dtarget.src%3Dcanvas.toDataURL%28%29%3Btarget.title%3Dtarget.title%2B%22%20%28force%20quote%29%22%7D%29%29%7Ddocument.body.appendChild%28Object.assign%28document.createElement%28%22img%22%29%2C%7Bsrc%3A%27data%3Aimage%2Fgif%3Bbase64%2CR0lGODlhEAAQAIABALrJ9f%2F%2F%2FyH5BAEAAAEALAAAAAAQABAAAAIojI%2Bpm%2BAPYQCIMlfZtLOvSEkexhmchXkjaHYlGpLpqrZNqbngnvd%2BAQA7%27%2CcrossOrigin%3A%22anonymous%22%2Conload%3Afunction%28%29%7Bchange_button_color%28this%29%7D%7D%29%29%3Bfunction%20convert_numeric_reference_quote%28url%29%7Bconst%20u%3Dnew%20URL%28url%29%3Blet%20param%3Du.searchParams%3Blet%20quote%3Dparam.get%28%22quote%22%29%3Bif%28quote%29%7Bquote%3D%28s%3D%3E%7Blet%20o%3D%22%22%2Ci%3D0%3Bwhile%28i%3Cs.length%29%7Blet%20code%3Ds.codePointAt%28i%29%3Bo%2B%3Dcode%3C128%3FString.fromCharCode%28code%29%3A%60%26%23%24%7Bcode%7D%3B%60%3Bi%2B%3D1%3Bif%28code%3E65535%29%7Bi%2B%3D1%7D%7Dreturn%20o%7D%29%28quote%29%3Bparam.set%28%22quote%22%2Cquote%29%3Bu.search%3D%22%3F%22%2Bparam.toString%28%29%3Burl%3Du.href%7Dreturn%20url%7Dconst%20re_addstar%3D%2F%5Ehttps%3F%3A%5C%2F%5C%2Fs%5C.hatena%5C.ne%5C.jp%5C%2Fstar%5C.add%5C.json%2F%3BTen.JSONP%3Dnew%20Proxy%28Ten.JSONP%2C%7Bconstruct%3A%28target%2Cargs%29%3D%3E%7Blet%20url%3Dargs%5B0%5D%3Bif%28re_addstar.test%28url%29%29%7Burl%3Dconvert_numeric_reference_quote%28url%29%3Bargs%5B0%5D%3Durl%7Dlet%20obj%3DReflect.construct%28target%2Cargs%29%3Breturn%20obj%7D%7D%29%7D%29%28%29%3B"&gt;greed quote star feat. Proxy&lt;/a&gt;&lt;pre&gt;/*
 * @title greed quote star feat. Proxy
 * @description 引用になってなくても引用スターできるようにします
 * @include http://*
 * @license MIT License
 * @javascript_url
 */
(() =&amp;gt; {
    // make star add button's color gold
    function change_button_color(img) {
        // change color with canvas
        // https://developer.mozilla.org/ja/docs/Web/Guide/HTML/Canvas_tutorial/Pixel_manipulation_with_canvas
        let canvas;
        document.querySelectorAll('img.hatena-star-add-button[src*=&amp;quot;s.hatena.ne.jp&amp;quot;').forEach(target =&amp;gt; {
            if (! canvas) {
                canvas = Object.assign(document.createElement(&amp;quot;canvas&amp;quot;), {
                    width: img.width,
                    height: img.height,
                });
                let ctx = canvas.getContext('2d');
                ctx.drawImage(img, 0, 0);
                let imageData = ctx.getImageData(0, 0, img.width, img.height);
                let data = imageData.data;
                for (let i = 0 ; i &amp;lt; data.length ; i += 4) {
                    if (data[i] &amp;lt; 200) {
                        // gold : rgb(255,215,0)
                        data[i]     = 255;      // red
                        data[i + 1] = 215;      // green
                        data[i + 2] = 0;        // blue
//                      data[i + 3] = 255;      // opacity
                    }
                }
                ctx.putImageData(imageData, 0, 0);
            }
            target.src = canvas.toDataURL();
            target.title = target.title + &amp;quot; (force quote)&amp;quot;;
        });
    }

    document.body.appendChild(Object.assign(document.createElement(&amp;quot;img&amp;quot;), {
        // http://s.hatena.ne.jp/images/add.gif
        src: 'data:image/gif;base64,R0lGODlhEAAQAIABALrJ9f///yH5BAEAAAEALAAAAAAQABAAAAIojI+pm+APYQCIMlfZtLOvSEkexhmchXkjaHYlGpLpqrZNqbngnvd+AQA7',
        // https://stackoverflow.com/questions/17035106/context-getimagedata-operation-is-insecure
        crossOrigin: &amp;quot;anonymous&amp;quot;,
        onload: function() {
            change_button_color(this);
        },
    }));


    // http://q.hatena.ne.jp/1487227736#a1262105
    function convert_numeric_reference_quote(url /* string */) {
        // https://developer.mozilla.org/en-US/docs/Web/API/URL
        // https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams
        const u = new URL(url);         /* string -&amp;gt; URL */
        let param = u.searchParams;     /* URLSearchParams */
        let quote = param.get(&amp;quot;quote&amp;quot;);
        if (quote) {
            // to numeric reference
            quote = (s =&amp;gt; {
                let o = &amp;quot;&amp;quot;, i = 0;
                while (i &amp;lt; s.length) {
                    let code = s.codePointAt(i);
                    o += code &amp;lt; 128 ? String.fromCharCode(code) : `&amp;amp;#${code};`;
                    i += 1;
                    if (code &amp;gt; 0xffff) {    // for surrogate pair
                        i += 1;
                    }
                }
                return o;
            })(quote);
            param.set(&amp;quot;quote&amp;quot;, quote);
            u.search = &amp;quot;?&amp;quot; + param.toString();
            url = u.href;
        }
        return url;
    }

    const re_addstar = /^https?:\/\/s\.hatena\.ne\.jp\/star\.add\.json/;

    // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy
    Ten.JSONP = new Proxy(Ten.JSONP, {
        construct: (target, args) =&amp;gt; {
            let url = args[0];
            if (re_addstar.test(url)) {
                url = convert_numeric_reference_quote(url);
                args[0] = url;
            }

            let obj = Reflect.construct(target, args);
            return obj;
        },
    });

})();


&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/a-kuma3/let/hJmc7ZTR7vBO">
    <link>https://let.hatelabo.jp/a-kuma3/let/hJmc7ZTR7vBO</link>
    <dc:date>2018-05-16T14:11:02Z</dc:date>
    <description>Hatena Haiku spam filtering w/ lightni.ng feat. Proxy</description>
    <dc:creator>a-kuma3</dc:creator>
    <title>[Let] H::H lightni.ng filter feat. Proxy</title>
    <content:encoded>&lt;a href="javascript:%28%28%29%3D%3E%7Bconst%20d_%3Ddocument%3Bconst%20g%3D%7BTHRESHOLD%3A5%2Cblacklist%3A%7B%7D%2Cno_more_entry%3Afalse%2Cme%3AHatena.Visitor.name%7D%3Bfunction%20is_spam%28entry%29%7Bconst%20poster%3Dentry.querySelector%28%22.info%20%3E%20.username%20%3E%20a%22%29%3Bconst%20id%3Dposter.title.slice%28%22id%3A%22.length%29%3Bconst%20is_spam%3Did%21%3Dg.me%26%26g.blacklist.has%28id%29%3Bif%28is_spam%29%7Bconst%20url%3Dentry.querySelector%28%22.info%20%3E%20.timestamp%20%3E%20a%22%29.href%3Bconsole.warn%28%60%24%7Burl%7D%20is%20SPAM%20%28id%3A%20%24%7Bid%7D%2C%20score%3A%20%24%7Bg.blacklist.get%28id%29%7D%29%60%29%7Dreturn%20is_spam%7DTL.compat.getPage%3Dnew%20Proxy%28TL.compat.getPage%2C%7Bapply%3A%28target%2CthisArg%2Cargs%29%3D%3E%7Bconst%20url%3Dargs%5B0%5D%3Bif%28%2Freftime%3D-%2F.test%28url%29%29%7Blet%20onload%3Dargs%5B1%5D%3Bonload%3Dnew%20Proxy%28onload%2C%7Bapply%3A%28target%2CthisArg%2Cargs%29%3D%3E%7Bconst%20xhr%3Dargs%5B0%5D%3Bif%28xhr.status%3C400%26%26xhr.responseText.trim%28%29.length%3D%3D0%29%7Bg.no_more_entry%3Dtrue%7Dreturn%20Reflect.apply%28target%2CthisArg%2Cargs%29%7D%7D%29%3Bargs%5B1%5D%3Donload%7Dreturn%20Reflect.apply%28target%2CthisArg%2Cargs%29%7D%7D%29%3BTL.EntryList.prototype.appendEntries%3Dnew%20Proxy%28TL.EntryList.prototype.appendEntries%2C%7Bapply%3A%28target%2CthisArg%2Cargs%29%3D%3E%7Bconst%20list%3Dargs%5B0%5D.filter%28%28e%3D%3E%21is_spam%28e.element%29%29%29%3Bif%28%21list.length%29%7Bvar%20ev%3Dnew%20TL.Event%28%27entriesappended%27%29%3Bev.newEntries%3Dlist%3BthisArg.dispatchEvent%28ev%29%7Dargs%5B0%5D%3Dlist%3Breturn%20Reflect.apply%28target%2CthisArg%2Cargs%29%7D%7D%29%3Bfunction%20do_pagerize%28%29%7Bif%28g.no_more_entry%29%7Breturn%7Dconst%20pager%3Dd_.querySelector%28%22div.pager%20a.pager-older%22%29%3Bconst%20y1%3Dpager.getBoundingClientRect%28%29.top%3Bconst%20y2%3Dwindow.innerHeight%3Bif%28y1%3Cy2%29%7Bpager.click%28%29%7D%7DTL.View.prototype.stopNextIndicator%3Dnew%20Proxy%28TL.View.prototype.stopNextIndicator%2C%7Bapply%3A%28target%2CthisArg%2Cargs%29%3D%3E%7Bdo_pagerize%28%29%3Breturn%20Reflect.apply%28target%2CthisArg%2Cargs%29%7D%7D%29%3B%28async%28%29%3D%3E%7Bconst%20resp%3Dawait%20fetch%28%22https%3A%2F%2Fhaikuantispam.lightni.ng%2Fapi%2Frecent_scores.json%22%2C%7Bmode%3A%22cors%22%2Ccredentials%3A%22same-origin%22%7D%29%3Bconst%20scores%3Dawait%20resp.json%28%29%3Bg.blacklist%3Dnew%20Map%28Object.entries%28scores%29.filter%28%28%28%5B%2Cscore%5D%29%3D%3Escore%3E%3Dg.THRESHOLD%29%29%29%3Bd_.querySelectorAll%28%22.tl-entry-list%20.tl-entry%22%29.forEach%28%28entry%3D%3E%7Bif%28is_spam%28entry%29%29%7Bentry.style.display%3D%22none%22%7D%7D%29%29%3Bdo_pagerize%28%29%7D%29%28%29%7D%29%28%29%3B"&gt;H::H lightni.ng filter feat. Proxy&lt;/a&gt;&lt;pre&gt;/*
 * @title H::H lightni.ng filter feat. Proxy
 * @description Hatena Haiku spam filtering w/ lightni.ng feat. Proxy
 * @include *://h.hatena.ne.jp/*
 * @contributor noromanba   http://let.hatelabo.jp/noromanba/let/hJmc6brdnsgL
 * @contributor austinburk  http://let.hatelabo.jp/austinburk/let/hLHU6PPgg9Ya
 * @license  The MIT License https://opensource.org/licenses/MIT
 * @javascript_url
 */
/*
    ref.
        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
        http://h.hatena.ne.jp/js/updu/ten-extras.js
*/
(() =&amp;gt; {
    const d_ = document;

    const g = {
        THRESHOLD: 5,
        blacklist: {},
        no_more_entry: false,
        me: Hatena.Visitor.name,
    };


    function is_spam(entry) {
        const poster = entry.querySelector(&amp;quot;.info &amp;gt; .username &amp;gt; a&amp;quot;);
        const id = poster.title.slice(&amp;quot;id:&amp;quot;.length);
        const is_spam = id != g.me &amp;amp;&amp;amp; g.blacklist.has(id);
        if (is_spam) {
            const url = entry.querySelector(&amp;quot;.info &amp;gt; .timestamp &amp;gt; a&amp;quot;).href;
            console.warn(`${url} is SPAM (id: ${id}, score: ${g.blacklist.get(id)})`);
        }
        return is_spam;
    }

    // see TL.DataSource.TimelinePage.prototype.loadData
    TL.compat.getPage = new Proxy(TL.compat.getPage, {
        apply: (target, thisArg, args) =&amp;gt; {
            const url = args[0];

            // maybe pager-older's request
            if (/reftime=-/.test(url)) {
                let onload = args[1];

                onload = new Proxy(onload, {
                    apply: (target, thisArg, args) =&amp;gt; {
                        const xhr = args[0];

                        // no more entry ?
                        if (xhr.status &amp;lt; 400 &amp;amp;&amp;amp; xhr.responseText.trim().length == 0) {
                            g.no_more_entry = true;
                        }

                        return Reflect.apply(target, thisArg, args);
                    },
                });

                args[1] = onload;
            }

            return Reflect.apply(target, thisArg, args);
        },
    });

    // filtering EntryList
    TL.EntryList.prototype.appendEntries = new Proxy(TL.EntryList.prototype.appendEntries, {
        apply: (target, thisArg, args) =&amp;gt; {
            // filter SPAM
            const list = args[0].filter(e =&amp;gt; ! is_spam(e.element));

            // if list is empty, Event &amp;quot;entriesappended&amp;quot; is not fired
            if (! list.length) {
                var ev = new TL.Event('entriesappended');
                ev.newEntries = list;
                thisArg.dispatchEvent(ev);
            }

            args[0] = list;
            return Reflect.apply(target, thisArg, args);
        },
    });

    function do_pagerize() {
        if (g.no_more_entry) {
            return;
        }
        const pager = d_.querySelector(&amp;quot;div.pager a.pager-older&amp;quot;);
        const y1 = pager.getBoundingClientRect().top;
        const y2 = window.innerHeight;
        if (y1 &amp;lt; y2) {
            pager.click();
        }
    }

    // do pagerize if pager is in view after remove entries
    TL.View.prototype.stopNextIndicator = new Proxy(TL.View.prototype.stopNextIndicator, {
        apply: (target, thisArg, args) =&amp;gt; {
            do_pagerize();
            return Reflect.apply(target, thisArg, args);
        },
    });


    (async () =&amp;gt; {

        // load scores
        const resp = await fetch(&amp;quot;https://haikuantispam.lightni.ng/api/recent_scores.json&amp;quot;, {
            mode: &amp;quot;cors&amp;quot;,
            credentials: &amp;quot;same-origin&amp;quot;,
        });
        const scores = await resp.json();
        g.blacklist = new Map(Object.entries(scores)
            .filter(([, score]) =&amp;gt; score &amp;gt;= g.THRESHOLD)
        );

        // filter SPAM already displayed
        d_.querySelectorAll(&amp;quot;.tl-entry-list .tl-entry&amp;quot;).forEach(entry =&amp;gt; {
            if (is_spam(entry)) {
                entry.style.display = &amp;quot;none&amp;quot;;
            }
        });

        do_pagerize();

    })();

})();
&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/a-kuma3/let/hJmc2r6j5rMx">
    <link>https://let.hatelabo.jp/a-kuma3/let/hJmc2r6j5rMx</link>
    <dc:date>2018-04-18T14:22:03Z</dc:date>
    <description>はてなハイクのタイムラインを自分の投稿だけにする（Proxy を使ってみたかっただけ</description>
    <dc:creator>a-kuma3</dc:creator>
    <title>[Let] Hatena::Haiku::Filter</title>
    <content:encoded>&lt;a href="javascript:%28%28%29%3D%3E%7Bconst%20d_%3Ddocument%3Bd_.head.appendChild%28Object.assign%28d_.createElement%28%22style%22%29%2C%7BinnerHTML%3A%60%5Cndiv.stream%20div.entries%20div.entry.tl-entry.blank-entry%20%7B%5Cn%20%20%20%20padding%3A%200%3B%5Cn%20%20%20%20border-bottom%3A%20none%3B%5Cn%7D%5Cn%20%20%20%20%20%20%20%20%60%7D%29%29%3Bconst%20def%3D%7Buser%3AHatena.Visitor.name%7D%3Bfunction%20is_match%28entry%29%7Breturn%5Bentry%3D%3E%7Blet%20e%3Dentry.querySelector%28%22.info%20%3E%20.username%20%3E%20a%22%29%3Breturn%20e.title%3D%3D%60id%3A%24%7Bdef.user%7D%60%7D%5D.find%28%28f%3D%3E%21f.call%28null%2Centry%29%29%29%3D%3Dnull%7DTL.Entry%3Dnew%20Proxy%28TL.Entry%2C%7Bconstruct%3A%28target%2Cargs%29%3D%3E%7Blet%20obj%3DReflect.construct%28target%2Cargs%29%3Bif%28%21is_match%28obj.element%29%29%7Bobj.element.innerHTML%3D%22%22%3Bobj.element.classList.add%28%22blank-entry%22%29%3Bobj.eid%3D-1%7Dreturn%20obj%7D%7D%29%3Bfunction%20auto_pagerize%28%29%7Blet%20pager%3Dd_.querySelector%28%22div.pager%20a.pager-older%22%29%3Bconst%20y1%3Dpager.getBoundingClientRect%28%29.top%3Bconst%20y2%3Dwindow.innerHeight%3Bif%28y1%3Cy2%29%7Bpager.click%28%29%7D%7DTL.View.prototype.stopNextIndicator%3Dnew%20Proxy%28TL.View.prototype.stopNextIndicator%2C%7Bapply%3A%28target%2CthisArg%2Cargs%29%3D%3E%7Bauto_pagerize%28%29%3Breturn%20Reflect.apply%28target%2CthisArg%2Cargs%29%7D%7D%29%3Bd_.querySelectorAll%28%22.tl-entry-list%20%3E%20.tl-entry%22%29.forEach%28%28entry%3D%3E%7Bif%28%21is_match%28entry%29%29%7Bentry.style.display%3D%22none%22%7D%7D%29%29%3Bauto_pagerize%28%29%7D%29%28%29%3B"&gt;Hatena::Haiku::Filter&lt;/a&gt;&lt;pre&gt;/*
 * @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
*/
(() =&amp;gt; {
    const d_ = document;

    /* make height 0 of .blank-entry */
    d_.head.appendChild(Object.assign(d_.createElement(&amp;quot;style&amp;quot;), {
        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 =&amp;gt; {
                let e = entry.querySelector(&amp;quot;.info &amp;gt; .username &amp;gt; a&amp;quot;);
                return e.title == `id:${def.user}`;
            },
        ].find(f =&amp;gt; ! f.call(null, entry)) == null;
    }

    TL.Entry = new Proxy(TL.Entry, {
        construct: (target, args) =&amp;gt; {
            let obj = Reflect.construct(target, args);
            if (! is_match(obj.element)) {
                obj.element.innerHTML = &amp;quot;&amp;quot;;
                obj.element.classList.add(&amp;quot;blank-entry&amp;quot;);
                obj.eid = -1;
            }
            return obj;
        },
    });

    function auto_pagerize() {
        let pager = d_.querySelector(&amp;quot;div.pager a.pager-older&amp;quot;);
        const y1 = pager.getBoundingClientRect().top;
        const y2 = window.innerHeight;
        if (y1 &amp;lt; y2) {
            pager.click();
        }
    }

    TL.View.prototype.stopNextIndicator = new Proxy(TL.View.prototype.stopNextIndicator, {
        apply: (target, thisArg, args) =&amp;gt; {
            auto_pagerize();
            return Reflect.apply(target, thisArg, args);
        },
    });

    d_.querySelectorAll(&amp;quot;.tl-entry-list &amp;gt; .tl-entry&amp;quot;).forEach(entry =&amp;gt; {
        if (! is_match(entry)) {
            entry.style.display = &amp;quot;none&amp;quot;;
        }
    });
    auto_pagerize();

})();



&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/a-kuma3/let/hJmfy_yqmbJ2">
    <link>https://let.hatelabo.jp/a-kuma3/let/hJmfy_yqmbJ2</link>
    <dc:date>2018-03-22T23:30:53Z</dc:date>
    <description>コメントがないブックマークも全て表示する</description>
    <dc:creator>a-kuma3</dc:creator>
    <title>[Let] display all bookmarks including no-comment @ Hatena::Bookmark</title>
    <content:encoded>&lt;a href="javascript:%28%28%29%3D%3E%7Bconst%20d_%3Ddocument%3Bconst%20entry_url%3DencodeURIComponent%28d_.documentElement.dataset%5B%27entryUrl%27%5D%29%3Blet%20bookmark_container%3Bconst%20bookmark_template%3Dd_.getElementById%28%22autoloader-bookmark-item%22%29.innerHTML.replace%28%2F%5E%5Cs%2B%2F%2C%22%22%29%3Bconst%20_2d%3Dn%3D%3E%28n%3C10%3F%220%22%3A%22%22%29%2Bn%3Bconst%20date_string%3D%28d%2Csep%29%3D%3E%5Bd.getFullYear%28%29%2C_2d%28d.getMonth%28%29%2B1%29%2C_2d%28d.getDate%28%29%29%5D.join%28sep%7C%7C%22%22%29%3Bconst%20datetime_string%3Dd%3D%3E%5Bd.getFullYear%28%29%2C_2d%28d.getMonth%28%29%2B1%29%2C_2d%28d.getDate%28%29%29%5D.join%28%22%2F%22%29%2B%22%20%22%2B%5B_2d%28d.getHours%28%29%29%2C_2d%28d.getMinutes%28%29%29%2C_2d%28d.getSeconds%28%29%29%5D.join%28%22%3A%22%29%3B%28%28%29%3D%3E%7Blet%20readmore%3Dd_.querySelector%28%22.js-read-more-button%22%29%3Bif%28readmore%29%7Breadmore.getBoundingClientRect%3D%28%29%3D%3E%28%7Btop%3A1e6%7D%29%7Dd_.head.appendChild%28Object.assign%28d_.createElement%28%22style%22%29%2C%7BinnerHTML%3A%27%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.hatena-star-comment-button%20%7B%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20display%3A%20initial%20%21important%3B%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20margin-right%3A%208px%20%21important%3B%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.js-bookmarks-sort-tab%5Bdata-sort%3D%22recent%22%5D%20%3E%20img%20%7B%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20width%3A%2012px%3B%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20margin%3A%200%200.5ex%3B%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.entry-comment-readmore%20%7B%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20display%3A%20none%3B%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.entry-info-meta%20%7B%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20display%3A%20initial%3B%20%2F%2A%20flex%20%2A%2F%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.twitter-clicks%20%7B%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20color%3A%20gray%3B%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20margin-left%3A%201em%3B%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%27%7D%29%29%3Blet%20comment_tabs%3Dd_.querySelector%28%22ul.entry-comment-tab%22%29%3Blet%20tab%3Dcomment_tabs.appendChild%28Object.assign%28d_.createElement%28%22li%22%29%2C%7BclassName%3A%22js-bookmarks-sort-tab%22%2CinnerHTML%3A%22%E5%85%A8%E3%81%A6%E3%81%AE%E3%83%96%E3%83%83%E3%82%AF%E3%83%9E%E3%83%BC%E3%82%AF%22%7D%29%29%3Btab.dataset%5B%22sort%22%5D%3D%22all%22%3Blet%20sort_panel%3Dd_.querySelector%28%22div.js-bookmarks-sort-panels%22%29%3Bbookmark_container%3Dsort_panel.appendChild%28Object.assign%28d_.createElement%28%22div%22%29%2C%7BclassName%3A%22bookmarks-sort-panel%20js-bookmarks-sort-panel%22%2CinnerHTML%3A%27%3Cdiv%20class%3D%22js-bookmarks%20js-bookmarks-all%22%3E%3C%2Fdiv%3E%27%7D%29%29%3Bbookmark_container.dataset%5B%22sort%22%5D%3D%22all%22%3Bbookmark_container%3Dbookmark_container.firstChild%3Btab.click%28%29%3Bd_.querySelector%28%22.js-entry-info%22%29.appendChild%28Object.assign%28d_.createElement%28%22span%22%29%2C%7Bid%3A%22entry_star_count%22%7D%29%29%7D%29%28%29%3Bfunction%20append_bookmark%28b%2Cbookmark_container%29%7Blet%20created%3Dnew%20Date%28b.created%29%3Blet%20date%3Ddatetime_string%28created%29%3Blet%20date2%3Ddate_string%28created%29%3Blet%20legacyTagLinks%3Db.tags.map%28%28tag%3D%3E%27%3Cli%3E%3Ca%20href%3D%22%2F%27%2Bb.user.name%2B%27%2F%27%2BencodeURIComponent%28tag%29%2B%27%2F%22%3E%27%2Btag%2B%27%3C%2Fa%3E%3C%2Fli%3E%27%29%29.join%28%22%22%29%3Blet%20keyword_map%3D%7Banchor_path%3A%27%2F%27%2Bb.user.name%2B%27%2F%27%2Bdate2%2B%27%23bookmark-%27%2Bb.location_id%2Ccomment_expanded%3Ab.comment_expanded%2Ccomment_page_path%3A%22%2Fentry%2F%22%2Bb.location_id%2B%22%2Fcomment%2F%22%2Bb.user.name%2Ccreated%3Adate%2Cprofile_image_url%3Ab.user.image.image_url%2Ctags%3AlegacyTagLinks%2Cuser_name%3Ab.user.name%2Cuser_page_path%3A%22%2F%22%2Bb.user.name%7D%3Blet%20x%3Dd_.createElement%28%22div%22%29%3Bx.innerHTML%3Dbookmark_template.replace%28%2F%5B%7B%5D%7B2%2C3%7D%5Cs%2A%28%5B%5E%7D%5Cs%5D%2B%29%5Cs%2A%5B%7D%5D%7B2%2C3%7D%2Fg%2C%28%28m%2Cp%29%3D%3Ekeyword_map%5Bp%5D%7C%7C%22%22%29%29%3Bif%28b.comment%3D%3D%22%22%29%7Blet%20comment_permalink%3Dx.querySelector%28%22.entry-comment-permalink%22%29%3Bcomment_permalink.parentNode.removeChild%28comment_permalink%29%7Dreturn%20bookmark_container.appendChild%28x.firstChild%29%7Dconst%20xhr%3Dnew%20XMLHttpRequest%3Blet%20bookmarks%3D%5B%5D%3Bxhr.onload%3Dev%3D%3E%7Bif%28ev.target.status%3C400%29%7Bconst%20resp%3Dev.target.response%3Bbookmarks%3Dbookmarks.concat%28resp.bookmarks%29%3Bif%28resp.cursor%29%7Bload_bookmark%28resp.cursor%29%7Delse%7Blet%20comment_tags_map%3D%7B%7D%3Bbookmarks.forEach%28%28b%3D%3E%7Blet%20e%3Dappend_bookmark%28b%2Cbookmark_container%29%3Bcomment_tags_map%5Bb.user.name%5D%3De.querySelector%28%22.entry-comment-tags%22%29%7D%29%29%3BHatena.Star.SiteConfig%3D%7BentryNodes%3A%7B%22div.entry-info%22%3A%7Buri%3A%22h1.entry-info-title%20a%22%2Ctitle%3A%22h1.entry-info-title%20a%22%2Ccontainer%3A%22%23entry_star_count%22%7D%2C%22div.js-bookmarks-all%20div.js-bookmark-item%22%3A%7Buri%3A%22a.js-bookmark-anchor-path%22%2Ctitle%3A%22span.js-bookmark-comment%22%2Ccontainer%3A%22span.js-add-star-container%22%7D%7D%7D%3Bnew%20Hatena.Star.EntryLoader%3Bfunction%20insert_clicks%28n%2Ce%29%7Blet%20x%3De.parentNode.insertBefore%28Object.assign%28d_.createElement%28%22span%22%29%2C%7BinnerHTML%3An%2B%22%20clicks%22%2CclassName%3A%22twitter-clicks%22%7D%29%2Ce.nextSibling%29%3Bx.dataset%5B%22clicks%22%5D%3Dn%3Breturn%20x%7Dconst%20xhr2%3Dnew%20XMLHttpRequest%3Bconst%20url%3D%22http%3A%2F%2Fb.hatena.ne.jp%2Fapi%2Fshorturl.clicks%22%3Blet%20clicks_list%3D%5B%5D%3Bxhr2.onload%3Dev%3D%3E%7Bif%28ev.target.status%3C400%29%7Blet%20data%3Dev.target.response%3Bdata.entries%5B0%5D.clicks.forEach%28%28e%3D%3E%7Bif%28e.count%3E0%29%7Bclicks_list.push%28insert_clicks%28e.count%2Ccomment_tags_map%5Be.user%5D%29%29%7D%7D%29%29%3Binsert_clicks%28clicks_list.reduce%28%28%28sum%2Citem%29%3D%3Esum%2BparseInt%28item.dataset%5B%22clicks%22%5D%2C10%29%29%2C0%29%2Cd_.getElementById%28%22entry_star_count%22%29%29%3Bconsole.log%28clicks_list.length%2B%22%20clicks%20%21%21%21%22%29%7D%7D%3Bxhr2.responseType%3D%22json%22%3Bxhr2.open%28%22POST%22%2Curl%2Ctrue%29%3Bxhr2.setRequestHeader%28%22Content-type%22%2C%22application%2Fx-www-form-urlencoded%22%29%3Bxhr2.send%28%22entry%3D%22%2Bd_.documentElement.dataset%5B%27entryEid%27%5D%2B%22%2C%22%2Bbookmarks.map%28%28b%3D%3Eb.user.name%29%29.join%28%22%7C%22%29%29%7D%7D%7D%3Bxhr.responseType%3D%22json%22%3Bfunction%20load_bookmark%28cursor%29%7Blet%20url%3D%5B%22http%3A%2F%2Fb.hatena.ne.jp%2Fapi%2Fentry%2F%22%2Centry_url%2C%22%2Fbookmarks%3Fcursor%3D%22%2Bcursor%2C%22%26limit%3D500%26commented_only%3D0%22%5D.join%28%22%22%29%3Bxhr.open%28%22GET%22%2Curl%2Ctrue%29%3Bxhr.send%28null%29%7Dload_bookmark%28%22%22%29%7D%29%28%29%3B"&gt;display all bookmarks including no-comment @ Hatena::Bookmark&lt;/a&gt;&lt;pre&gt;/*
 * @title display all bookmarks including no-comment @ Hatena::Bookmark
 * @description コメントがないブックマークも全て表示する
 * @include http://b.hatena.ne.jp/entry/*
 * @license MIT http://opensource.org/licenses/MIT
 * @javascript_url
 */
/*
    Changelog
    - 記事につけられたスターを表示してみる
    - ブックマークした時刻も表示
    - ツイートのクリック数を表示
*/
/*
    test case
    http://b.hatena.ne.jp/entry/s/www.slideshare.net/enakai/it-51854916
        コメントなしブックマークが多い
    http://b.hatena.ne.jp/entry/s/kazayo.com/gozaisho-sounan/
        コメントありブックマークが多い
    http://b.hatena.ne.jp/entry/kazayo.com/gozaisho-sounan/
        コメントありの最初のブックマークよりも前に、コメントなしのブックマークがある
    http://b.hatena.ne.jp/entry/ift.tt/2wV68BP
        コメントありのブックマークがない
*/
(() =&amp;gt; {
    const d_ = document;
    const entry_url = encodeURIComponent(d_.documentElement.dataset['entryUrl']);
    let bookmark_container;
    const bookmark_template = d_.getElementById(&amp;quot;autoloader-bookmark-item&amp;quot;).innerHTML.replace(/^\s+/, &amp;quot;&amp;quot;);
    const _2d = n =&amp;gt; (n &amp;lt; 10 ? &amp;quot;0&amp;quot; : &amp;quot;&amp;quot;) + n;
    const date_string = (d, sep) =&amp;gt; [
        d.getFullYear(),
        _2d(d.getMonth() + 1),
        _2d(d.getDate())
    ].join(sep || &amp;quot;&amp;quot;);
    const datetime_string = d =&amp;gt; [
        d.getFullYear(),
        _2d(d.getMonth() + 1),
        _2d(d.getDate()),
    ].join(&amp;quot;/&amp;quot;) + &amp;quot; &amp;quot; + [
        _2d(d.getHours()),
        _2d(d.getMinutes()),
        _2d(d.getSeconds()),
    ].join(&amp;quot;:&amp;quot;);


    // init
    (() =&amp;gt; {
        // inactivate auto loader
        let readmore = d_.querySelector(&amp;quot;.js-read-more-button&amp;quot;);
        if (readmore) {
            /*
                https://cdn-ak.b.st-hatena.com/js/v4/bookmark.js
                BookmarkAutoLoaderView#getLabelHeight

                要素を見えなくしちゃうと、getBoundingClientRect は、top = 0 を返すので、
                メソッドを乗っ取る
            */
            readmore.getBoundingClientRect = () =&amp;gt; {
                return {top: 1000000};
            };
        }

        d_.head.appendChild(Object.assign(d_.createElement(&amp;quot;style&amp;quot;), {
            innerHTML: '                                                \
                .hatena-star-comment-button {                           \
                    display: initial !important;                        \
                    margin-right: 8px !important;                       \
                }                                                       \
                .js-bookmarks-sort-tab[data-sort=&amp;quot;recent&amp;quot;] &amp;gt; img {      \
                    width: 12px;                                        \
                    margin: 0 0.5ex;                                    \
                }                                                       \
                .entry-comment-readmore {                               \
                    display: none;                                      \
                }                                                       \
                .entry-info-meta {                                      \
                    display: initial; /* flex */                        \
                }                                                       \
                .twitter-clicks {                                       \
                    color: gray;                                        \
                    margin-left: 1em;                                   \
                }                                                       \
            ',
        }));

        // add tab
        let comment_tabs = d_.querySelector(&amp;quot;ul.entry-comment-tab&amp;quot;);
        let tab = comment_tabs.appendChild(Object.assign(d_.createElement(&amp;quot;li&amp;quot;), {
            className: &amp;quot;js-bookmarks-sort-tab&amp;quot;,
            innerHTML: &amp;quot;全てのブックマーク&amp;quot;,
        }));
        tab.dataset[&amp;quot;sort&amp;quot;] = &amp;quot;all&amp;quot;;

        // add panel
        let sort_panel = d_.querySelector(&amp;quot;div.js-bookmarks-sort-panels&amp;quot;);
        bookmark_container = sort_panel.appendChild(Object.assign(d_.createElement(&amp;quot;div&amp;quot;), {
            className: &amp;quot;bookmarks-sort-panel js-bookmarks-sort-panel&amp;quot;,
            innerHTML: '&amp;lt;div class=&amp;quot;js-bookmarks js-bookmarks-all&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;',
        }));
        bookmark_container.dataset[&amp;quot;sort&amp;quot;] = &amp;quot;all&amp;quot;;
        bookmark_container = bookmark_container.firstChild;

        tab.click();

        // entry url star
        d_.querySelector(&amp;quot;.js-entry-info&amp;quot;).appendChild(Object.assign(d_.createElement(&amp;quot;span&amp;quot;), {
            id: &amp;quot;entry_star_count&amp;quot;,
        }));
    })();

    function append_bookmark(b, bookmark_container) {
        /*
            #enable_button ～ /enable_button       -- not implement
            #is_public ～ /is_public               -- not implement
            #should_nofollow ～ /should_nofollow   -- not implement
            anchor_path
            comment_expanded
            comment_page_path
            created
            profile_image_url
            tags
            user_name
            user_page_path
        */
        let created = new Date(b.created);
        let date = datetime_string(created);
        let date2 = date_string(created);
        let legacyTagLinks = b.tags.map(tag =&amp;gt; {
            return '&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;/' + b.user.name + '/' + encodeURIComponent(tag) + '/&amp;quot;&amp;gt;' + tag + '&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;';
        }).join(&amp;quot;&amp;quot;);
        let keyword_map = {
            anchor_path       : '/' + b.user.name + '/' + date2 + '#bookmark-' + b.location_id,
            comment_expanded  : b.comment_expanded,
            comment_page_path : &amp;quot;/entry/&amp;quot; + b.location_id + &amp;quot;/comment/&amp;quot; + b.user.name,
            created           : date,
            profile_image_url : b.user.image.image_url,
            tags              : legacyTagLinks,
            user_name         : b.user.name,
            user_page_path    : &amp;quot;/&amp;quot; + b.user.name,
        };
        let x = d_.createElement(&amp;quot;div&amp;quot;);
        x.innerHTML = bookmark_template.replace(/[{]{2,3}\s*([^}\s]+)\s*[}]{2,3}/g, (m, p) =&amp;gt; {
            return keyword_map[p] || &amp;quot;&amp;quot;;
        });
        // remove comment permalink with no comment
        if (b.comment == &amp;quot;&amp;quot;) {
            let comment_permalink = x.querySelector(&amp;quot;.entry-comment-permalink&amp;quot;);
            comment_permalink.parentNode.removeChild(comment_permalink);
        }

        return bookmark_container.appendChild(x.firstChild);
    }

    const xhr = new XMLHttpRequest();
    let bookmarks = [];
    xhr.onload = (ev) =&amp;gt; {
        if (ev.target.status &amp;lt; 400) {
            const resp = ev.target.response;
            /*
                https://cdn-ak.b.st-hatena.com/js/v4/bookmark.star.js
                EntryStarView.prototype.observeBookmarkListChange

                はてなスターは MutationObserver が作ってくれるのだけれど、
                Hatena.Star.EntryLoader は、static な領域を使って処理をするので、
                load するたびにブックマークを追加すると、最後のブロックしか
                スターが展開されない。
            */
            bookmarks = bookmarks.concat(resp.bookmarks);
            if (resp.cursor) {
                load_bookmark(resp.cursor);
            } else {
                let comment_tags_map = {};
                bookmarks.forEach(b =&amp;gt; {
                    let e = append_bookmark(b, bookmark_container);
                    comment_tags_map[ b.user.name ] = e.querySelector(&amp;quot;.entry-comment-tags&amp;quot;);
                });

                // hatena star
                Hatena.Star.SiteConfig = {
                    entryNodes: {
                        &amp;quot;div.entry-info&amp;quot;: {
                            uri: &amp;quot;h1.entry-info-title a&amp;quot;,
                            title: &amp;quot;h1.entry-info-title a&amp;quot;,
                            container: &amp;quot;#entry_star_count&amp;quot;,
                        },
                        &amp;quot;div.js-bookmarks-all div.js-bookmark-item&amp;quot;: {
                            uri: &amp;quot;a.js-bookmark-anchor-path&amp;quot;,
                            title: &amp;quot;span.js-bookmark-comment&amp;quot;,
                            container: &amp;quot;span.js-add-star-container&amp;quot;
                        }
                    }
                };
                new Hatena.Star.EntryLoader();

                // Tweet clicks
                function insert_clicks(n, e) {
                    let x = e.parentNode.insertBefore(Object.assign(d_.createElement(&amp;quot;span&amp;quot;), {
                        innerHTML: n + &amp;quot; clicks&amp;quot;,
                        className: &amp;quot;twitter-clicks&amp;quot;,
                    }), e.nextSibling);
                    x.dataset[&amp;quot;clicks&amp;quot;] = n;
                    return x;
                }
                const xhr2 = new XMLHttpRequest();
                const url = &amp;quot;http://b.hatena.ne.jp/api/shorturl.clicks&amp;quot;;
                let clicks_list = [];
                xhr2.onload = (ev) =&amp;gt; {
                    if (ev.target.status &amp;lt; 400) {
                        let data = ev.target.response;
                        data.entries[0].clicks.forEach(e =&amp;gt; {
                            if (e.count &amp;gt; 0) {
                                clicks_list.push(insert_clicks(e.count, comment_tags_map[ e.user ]));
                            }
                        });
                        insert_clicks(clicks_list.reduce((sum, item) =&amp;gt; {
                            return sum + parseInt(item.dataset[&amp;quot;clicks&amp;quot;], 10);
                        }, 0
                        ), d_.getElementById(&amp;quot;entry_star_count&amp;quot;));
                        console.log(clicks_list.length + &amp;quot; clicks !!!&amp;quot;);
                    }
                };
                xhr2.responseType = &amp;quot;json&amp;quot;;
                xhr2.open(&amp;quot;POST&amp;quot;, url, true);
                xhr2.setRequestHeader(&amp;quot;Content-type&amp;quot;, &amp;quot;application/x-www-form-urlencoded&amp;quot;);
                xhr2.send(
                    &amp;quot;entry=&amp;quot; + d_.documentElement.dataset['entryEid'] + &amp;quot;,&amp;quot; +
                    bookmarks.map(b =&amp;gt; b.user.name).join(&amp;quot;|&amp;quot;)
                );

            }
        }
    };
    xhr.responseType = &amp;quot;json&amp;quot;;
    function load_bookmark(cursor) {
        let url = [
            &amp;quot;http://b.hatena.ne.jp/api/entry/&amp;quot;,
            entry_url,
            &amp;quot;/bookmarks?cursor=&amp;quot; + cursor,
            &amp;quot;&amp;amp;limit=500&amp;amp;commented_only=0&amp;quot;
        ].join(&amp;quot;&amp;quot;);
        xhr.open(&amp;quot;GET&amp;quot;, url, true);
        xhr.send(null);
    }

    load_bookmark(&amp;quot;&amp;quot;);

})();&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/a-kuma3/let/hLHUyoDNoMc7">
    <link>https://let.hatelabo.jp/a-kuma3/let/hLHUyoDNoMc7</link>
    <dc:date>2018-03-22T23:27:12Z</dc:date>
    <description>question:1521455576</description>
    <dc:creator>a-kuma3</dc:creator>
    <title>[Let] question:1521455576</title>
    <content:encoded>&lt;a href="javascript:%28function%28%29%7Bconst%20d_%3Ddocument%3BArray.prototype.forEach.call%28d_.body.querySelectorAll%28%22script%2Cstyle%2Cnoscript%22%29%2C%28function%28e%29%7Be.parentNode.removeChild%28e%29%7D%29%29%3Bconst%20text%3Dd_.body.textContent.replace%28%2F%5Cs%2B%2Fg%2C%22%22%29%3Bconst%20count%3Dtext.length%3Bconst%20title%3Dd_.title%3Bconst%20hx_list%3Dd_.querySelectorAll%28%22h1%2Ch2%2Ch3%2Ch4%2Ch5%2Ch6%22%29%3Bconst%20panel%3Dd_.body.appendChild%28d_.createElement%28%22textarea%22%29%29%3Bpanel.style.position%3D%22fixed%22%3Bpanel.style.backgroundColor%3D%22white%22%3Bpanel.style.border%3D%221px%20solid%20black%22%3Bpanel.style.padding%3D%221ex%22%3Bpanel.style.top%3D%220%22%3Bpanel.style.width%3D%2280ex%22%3Bpanel.style.height%3D%2220em%22%3Bfunction%20indent%28tag%29%7Blet%20n%3DparseInt%28tag.replace%28%2F%5EH%2F%2C%22%22%29%29-1%3Blet%20pad%3D%22%22%3Bfor%28let%20i%3D0%3Bi%3Cn%3B%2B%2Bi%29%7Bpad%2B%3D%22%5Ct%22%7Dreturn%20pad%7Dpanel.value%3D%5B%22%E3%80%90%E6%96%87%E5%AD%97%E6%95%B0%E3%80%91%22%2Ccount%2C%22%5Cn%E3%80%90title%E3%80%91%22%2Ctitle%2C%22%5Cn%E3%80%90h%E3%82%BF%E3%82%B0%E3%80%91%22%2CArray.prototype.map.call%28hx_list%2C%28function%28h%29%7Breturn%20indent%28h.tagName%29%2Bh.tagName%2B%22%3A%22%2Bh.textContent%7D%29%29.join%28%22%5Cn%22%29%5D.join%28%22%5Cn%22%29%7D%29%28%29%3B"&gt;question:1521455576&lt;/a&gt;&lt;pre&gt;/*
 * @title question:1521455576
 * @description question:1521455576
 * @license MIT http://opensource.org/licenses/MIT
 * @javascript_url
 */
(function() {
	const d_ = document;

	Array.prototype.forEach.call(d_.body.querySelectorAll(&amp;quot;script,style,noscript&amp;quot;), function(e) {
		e.parentNode.removeChild(e);
	});


	const text = d_.body.textContent.replace(/\s+/g, &amp;quot;&amp;quot;);
	const count = text.length;
	const title = d_.title;
	const hx_list = d_.querySelectorAll(&amp;quot;h1,h2,h3,h4,h5,h6&amp;quot;);

	const panel = d_.body.appendChild(d_.createElement(&amp;quot;textarea&amp;quot;));
	panel.style.position = &amp;quot;fixed&amp;quot;;
	panel.style.backgroundColor = &amp;quot;white&amp;quot;;
	panel.style.border = &amp;quot;1px solid black&amp;quot;;
	panel.style.padding = &amp;quot;1ex&amp;quot;;
	panel.style.top = &amp;quot;0&amp;quot;;
	panel.style.width = &amp;quot;80ex&amp;quot;;
	panel.style.height = &amp;quot;20em&amp;quot;;
	function indent(tag) {
		let n = parseInt(tag.replace(/^H/, &amp;quot;&amp;quot;)) - 1;
		let pad = &amp;quot;&amp;quot;;
		for (let i = 0 ; i &amp;lt; n ; ++i) {
			pad += &amp;quot;\t&amp;quot;;
		}
		return pad;
	}
	panel.value = [
		&amp;quot;【文字数】&amp;quot;,
		count,
		&amp;quot;\n【title】&amp;quot;,
		title,
		&amp;quot;\n【hタグ】&amp;quot;,
		Array.prototype.map.call(hx_list, function(h) {return indent(h.tagName) + h.tagName + &amp;quot;:&amp;quot; + h.textContent;}).join(&amp;quot;\n&amp;quot;),
	].join(&amp;quot;\n&amp;quot;);
})();&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/a-kuma3/let/hJmfoun265t1">
    <link>https://let.hatelabo.jp/a-kuma3/let/hJmfoun265t1</link>
    <dc:date>2017-07-06T23:33:45Z</dc:date>
    <description>カテゴリがない記事一覧 question:1499310079</description>
    <dc:creator>a-kuma3</dc:creator>
    <title>[Let] no category list @ hatena blog</title>
    <content:encoded>&lt;a href="javascript:%28function%28%29%7Bconst%20forEach%3DArray.prototype.forEach%3Bconst%20d_%3Ddocument%3Bfunction%20display%28url%29%7Blet%20title%3Dd_.getElementById%28%22title%22%29%3Blet%20e%3Dtitle.querySelector%28%22.message%22%29%3Bif%28%21e%29%7Be%3Dtitle.appendChild%28d_.createElement%28%22span%22%29%29%3Be.className%3D%22message%22%3Be.style.marginLeft%3D%222em%22%7Dlet%20m%3D%2Fpage%3D%28%5Cd%2B%29%2F.exec%28url%29%3Bif%28m%29%7Be.innerHTML%3D%22%28%22%2Bm%5B1%5D%2B%22%29%22%7D%7Dfunction%20hide_has_category%28doc%29%7BforEach.call%28doc.querySelectorAll%28%22%23main-inner%20%3E%20.archive-entries%20%3E%20section.archive-entry%20a.archive-category-link%22%29%2C%28function%28category_link%29%7Bcategory_link.parentNode.parentNode.style.display%3D%22none%22%7D%29%29%7Dfunction%20get_next_page_url%28doc%29%7Blet%20url%3Blet%20pager_next%3Ddoc.querySelector%28%27.pager-next%20%3E%20a%5Brel%3D%22next%22%5D%27%29%3Bif%28pager_next%29%7Burl%3Dpager_next.href%7Dreturn%20url%7Dlet%20n%3D0%3Bfunction%20load_next%28url%29%7Bvar%20xhr%3Dnew%20XMLHttpRequest%3Bxhr.open%28%27GET%27%2Curl%2Ctrue%29%3Bxhr.onload%3Dfunction%28ev%29%7Bconsole.log%28ev.target.responseURL%2Cn%29%3Bdisplay%28ev.target.responseURL%29%3Blet%20dest%3Dd_.querySelector%28%22%23main-inner%20%3E%20.archive-entries%22%29%3Bhide_has_category%28ev.target.response%29%3BforEach.call%28ev.target.response.querySelectorAll%28%22%23main-inner%20%3E%20.archive-entries%20%3E%20section.archive-entry%22%29%2C%28function%28entry%29%7Bdest.appendChild%28entry%29%7D%29%29%3Bn%2B%3D1%3Blet%20url%3Dget_next_page_url%28ev.target.response%29%3Bif%28url%26%26n%3C100%29%7Bload_next%28url%29%7Delse%7Blet%20e%3Dd_.querySelector%28%22%23title%20.message%22%29%3Bif%28e%29%7Be.parentNode.removeChild%28e%29%7D%7D%7D%3Bxhr.responseType%3D%27document%27%3Bxhr.send%28null%29%7Dhide_has_category%28d_%29%3Bload_next%28get_next_page_url%28d_%29%29%7D%29%28%29%3B"&gt;no category list @ hatena blog&lt;/a&gt;&lt;pre&gt;/*
 * @title no category list @ hatena blog
 * @description カテゴリがない記事一覧 question:1499310079
 * @include http://blog.hatena.ne.jp/ * /archive
 * @license MIT http://opensource.org/licenses/MIT
 * @javascript_url
 */
/*
    http://q.hatena.ne.jp/1499310079
*/
(function() {
    const forEach = Array.prototype.forEach;
    const d_ = document;

    function display(url) {
        let title = d_.getElementById(&amp;quot;title&amp;quot;);
        let e = title.querySelector(&amp;quot;.message&amp;quot;);
        if (! e) {
            e = title.appendChild(d_.createElement(&amp;quot;span&amp;quot;));
            e.className = &amp;quot;message&amp;quot;;
            e.style.marginLeft = &amp;quot;2em&amp;quot;;
        }
        let m = /page=(\d+)/.exec(url);
        if (m) {
            e.innerHTML = &amp;quot;(&amp;quot; + m[1] + &amp;quot;)&amp;quot;;
        }
    }

    function hide_has_category(doc) {
        forEach.call(doc.querySelectorAll(&amp;quot;#main-inner &amp;gt; .archive-entries &amp;gt; section.archive-entry a.archive-category-link&amp;quot;), function(category_link) {
            category_link.parentNode.parentNode.style.display = &amp;quot;none&amp;quot;;
        });
    }

    function get_next_page_url(doc) {
        let url;
        let pager_next = doc.querySelector('.pager-next &amp;gt; a[rel=&amp;quot;next&amp;quot;]');
        if (pager_next) {
            url = pager_next.href;
        }
        return url;
    }

    let n = 0;  // びびりなので、一応 ガード
    function load_next(url) {
        var xhr = new XMLHttpRequest();
        xhr.open('GET', url, true);
        xhr.onload = function(ev) {
            console.log(ev.target.responseURL, n);
            display(ev.target.responseURL);
            let dest = d_.querySelector(&amp;quot;#main-inner &amp;gt; .archive-entries&amp;quot;);
            hide_has_category(ev.target.response);
            forEach.call(ev.target.response.querySelectorAll(&amp;quot;#main-inner &amp;gt; .archive-entries &amp;gt; section.archive-entry&amp;quot;), function(entry) {
                dest.appendChild(entry);
            });
            n += 1;
            let url = get_next_page_url(ev.target.response);
            if (url &amp;amp;&amp;amp; n &amp;lt; 100) {
                load_next(url);
            } else {
                let e = d_.querySelector(&amp;quot;#title .message&amp;quot;);
                if (e) {
                    e.parentNode.removeChild(e);
                }
            }
        };
        xhr.responseType = 'document';
        xhr.send(null);
    }

    hide_has_category(d_);
    load_next(get_next_page_url(d_));

})();

&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/a-kuma3/let/hLHXoviKjskP">
    <link>https://let.hatelabo.jp/a-kuma3/let/hLHXoviKjskP</link>
    <dc:date>2017-07-06T10:45:33Z</dc:date>
    <description>カテゴリがない記事の管理 question:1499310079</description>
    <dc:creator>a-kuma3</dc:creator>
    <title>[Let] no category list @ hatena blog manage</title>
    <content:encoded>&lt;a href="javascript:%28function%28%29%7Bconst%20forEach%3DArray.prototype.forEach%3Bconst%20d_%3Ddocument%3Bfunction%20hide_has_category%28%29%7BforEach.call%28d_.querySelectorAll%28%22table.table-blog-entries%20td.td-blog-category%22%29%2C%28function%28td%29%7Bif%28%21%2F%5E%5Cs%2B%24%2F.test%28td.textContent%29%29%7Btd.parentNode.style.display%3D%22none%22%7D%7D%29%29%7Dfunction%20load_next%28url%29%7Blet%20pager_next%3Dd_.querySelector%28%27button.load-next-entries%3Anot%28%5Bstyle%2A%3D%22display%3A%20none%22%5D%29%27%29%3Bif%28pager_next%29%7Bpager_next.click%28%29%7D%7Dlet%20n%3D0%3Bvar%20MutationObserver%3Dwindow.MutationObserver%7C%7Cwindow.WebkitMutationObserver%3Bnew%20MutationObserver%28%28function%28records%29%7Bif%28n%3C200%29%7Bhide_has_category%28%29%3Bload_next%28%29%7Dn%2B%3D1%7D%29%29.observe%28document.body%2C%7BchildList%3Atrue%2Csubtree%3Atrue%7D%29%3Bhide_has_category%28%29%3Bload_next%28%29%7D%29%28%29%3B"&gt;no category list @ hatena blog manage&lt;/a&gt;&lt;pre&gt;/*
 * @title no category list @ hatena blog manage
 * @description カテゴリがない記事の管理 question:1499310079
 * @include http://blog.hatena.ne.jp/my/entries
 * @license MIT http://opensource.org/licenses/MIT
 * @javascript_url
 */
(function() {
    const forEach = Array.prototype.forEach;
    const d_ = document;

    function hide_has_category() {
        forEach.call(d_.querySelectorAll(&amp;quot;table.table-blog-entries td.td-blog-category&amp;quot;), function(td) {
            if (! /^\s+$/.test(td.textContent)) {
                td.parentNode.style.display = &amp;quot;none&amp;quot;;
            }
        });
    }

    function load_next(url) {
        let pager_next = d_.querySelector('button.load-next-entries:not([style*=&amp;quot;display: none&amp;quot;])');
        if (pager_next) {
            pager_next.click();
        }
    }

    let n = 0;  // びびりなので、一応 ガード
    var MutationObserver = window.MutationObserver || window.WebkitMutationObserver;
    new MutationObserver(function (records) {
        if (n &amp;lt; 200) {
            hide_has_category();
            load_next();
        }
        n += 1;
    }).observe(document.body, { childList: true, subtree: true });

    hide_has_category();
    load_next();

})();

&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/a-kuma3/let/hJmfkuvY__MH">
    <link>https://let.hatelabo.jp/a-kuma3/let/hJmfkuvY__MH</link>
    <dc:date>2017-06-11T10:37:44Z</dc:date>
    <description>question:1497013762 で使ったやつ。日本相撲協会の検索ページでは、全力士で14ページもあってだるいので、どかっと読み込む。1ページ目で使うの。</description>
    <dc:creator>a-kuma3</dc:creator>
    <title>[Let] all sumo wrestler</title>
    <content:encoded>&lt;a href="javascript:%28function%28%29%7Bconst%20d_%3Ddocument%3Blet%20tbody%3Dd_.querySelector%28%22table.mdTable3%20tbody%22%29%3Bfunction%20load%28p%29%7Blet%20xhr%3Dnew%20XMLHttpRequest%3Bxhr.onload%3Dev%3D%3E%7Bif%28ev.target.status%3C400%29%7BArray.from%28ev.target.response.querySelectorAll%28%22table.mdTable3%20tbody%20tr%22%29%29.forEach%28%28e%3D%3E%7Btbody.appendChild%28e%29%7D%29%29%3Bif%28p%3C14%29%7Bload%28p%2B1%29%7D%7D%7D%3Blet%20url%3D%22http%3A%2F%2Fwww.sumo.or.jp%2FResultRikishiData%2Fsearch%3Fv%3D50%26p%3D%22%2Bp%3Bxhr.open%28%27GET%27%2Curl%2Ctrue%29%3Bxhr.responseType%3D%27document%27%3Bxhr.send%28null%29%7Dload%282%29%7D%29%28%29%3B"&gt;all sumo wrestler&lt;/a&gt;&lt;pre&gt;/*
 * @title all sumo wrestler
 * @description question:1497013762 で使ったやつ。日本相撲協会の検索ページでは、全力士で14ページもあってだるいので、どかっと読み込む。1ページ目で使うの。
 * @include http://www.sumo.or.jp/ResultRikishiData/search
 * @license MIT http://opensource.org/licenses/MIT
 * @javascript_url
 */
(function() {
    const d_ = document;
    let tbody = d_.querySelector(&amp;quot;table.mdTable3 tbody&amp;quot;);
    function load(p) {
        let xhr = new XMLHttpRequest();
        xhr.onload = ev =&amp;gt; {
            if (ev.target.status &amp;lt; 400) {
                Array.from(ev.target.response.querySelectorAll(&amp;quot;table.mdTable3 tbody tr&amp;quot;)).forEach(e =&amp;gt; {
                    tbody.appendChild(e);
                });
                if (p &amp;lt; 14) {
                    load(p + 1);
                }
            }
        };
        let url = &amp;quot;http://www.sumo.or.jp/ResultRikishiData/search?v=50&amp;amp;p=&amp;quot; + p;
//      console.log(url);
        xhr.open('GET', url, true);
        xhr.responseType = 'document';
        xhr.send(null);
    }

    load(2);

})();

&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/a-kuma3/let/hLHXhMP_wvgF">
    <link>https://let.hatelabo.jp/a-kuma3/let/hLHXhMP_wvgF</link>
    <dc:date>2017-05-20T08:30:47Z</dc:date>
    <description>はてなハイクで 2017-5-9 くらいから 不意に IDページに飛ばされちゃう件の無理やり対応（Haiku! するときに投稿内容の一部を数値参照に書き換えて投稿します）。</description>
    <dc:creator>a-kuma3</dc:creator>
    <title>[Let] avoid forwarding to id page @ Haiku (brute force version :-)</title>
    <content:encoded>&lt;a href="javascript:%28function%28%29%7Bvar%20d_%3Ddocument%3Bif%28d_.location.href.indexOf%28%22http%3A%2F%2Fh.hatena.ne.jp%2F%22%29%3D%3D0%29%7BTen.XHR%3Dnew%20Ten.Class%28%7Binitialize%3Afunction%28uri%2Copts%2Cobj%2CcallPropertyName%29%7BTen.EventDispatcher.implementEventDispatcher%28this%29%3Bthis.method%3D%27GET%27%3Bif%28%21uri%29return%3Bif%28%21Ten.XHR.isSafeUri%28uri%29%29%7Bthrow%22host%20differs%20%3A%20%22%2Buri%7Dif%28%21opts%29opts%3D%7B%7D%3Bif%28opts.method%29this.method%3Dopts.method%3Bvar%20self%3Dthis%3Bthis.addEventListener%28%27complete%27%2C%28function%28%29%7Bif%28%21obj%29return%3Bif%28typeof%20obj%3D%3D%27function%27%26%26typeof%20callPropertyName%3D%3D%27undefined%27%29%7Bobj.call%28obj%2Cself.request%29%7Delse%7Bobj%5BcallPropertyName%5D.call%28obj%2Cself.request%29%7D%7D%29%29%3Bif%28%2F%5C%2Fentry%5C.body%24%2F.test%28uri%29%29%7Blet%20mine_list%3D%5B%22%E3%83%9F%22%2C%22%D0%BE%22%2C%22%E5%8D%8D%22%5D%3Bopts.data.body%3Dopts.data.body.map%28%28function%28body%29%7Blet%20txt%3Dbody%3Bmine_list.forEach%28%28function%28mine%29%7Bvar%20re%3Dnew%20RegExp%28mine%2C%22g%22%29%3Bvar%20entity%3DArray.prototype.reduce.call%28mine%2C%28function%28prev%2Cv%29%7Breturn%20prev%2B%22%26%23%22%2Bv.codePointAt%280%29%2B%22%3B%22%7D%29%2C%22%22%29%3Btxt%3Dtxt.replace%28re%2Centity%29%7D%29%29%3Breturn%20txt%7D%29%29%7Dthis.load%28uri%2Copts.data%29%7D%2CgetXMLHttpRequest%3Afunction%28%29%7Bvar%20xhr%3Bvar%20tryThese%3D%5Bfunction%28%29%7Breturn%20new%20XMLHttpRequest%7D%2Cfunction%28%29%7Breturn%20new%20ActiveXObject%28%27Msxml2.XMLHTTP%27%29%7D%2Cfunction%28%29%7Breturn%20new%20ActiveXObject%28%27Microsoft.XMLHTTP%27%29%7D%2Cfunction%28%29%7Breturn%20new%20ActiveXObject%28%27Msxml2.XMLHTTP.4.0%27%29%7D%5D%3Bfor%28var%20i%3D0%3Bi%3CtryThese.length%3Bi%2B%2B%29%7Bvar%20func%3DtryThese%5Bi%5D%3Btry%7Bxhr%3Dfunc%3Breturn%20func%28%29%7Dcatch%28e%29%7B%7D%7Dreturn%20xhr%7D%2CisSafeUri%3Afunction%28uri%29%7Bif%28uri.match%28%2F%5E%5Cw%2B%3A%2F%29%7C%7Curi.match%28%2F%5E%5C%2F%5C%2F%2F%29%29%7Bif%28uri.split%28%27%2F%27%29%5B2%5D%3D%3Dlocation.host%29return%20true%3Belse%20return%20false%7Delse%20if%28uri.match%28%2F%5E%5C%2F%5B%5E%5C%2F%5D%2F%29%7C%7Curi%3D%3D%27%2F%27%29%7Breturn%20true%7Delse%20if%28%21uri%7C%7Curi.length%3D%3D0%29%7Breturn%20false%7Dreturn%20true%7D%2CmakePostData%3Afunction%28data%29%7Bvar%20regexp%3D%2F%2520%2Fg%3Bif%28typeof%20data%3D%3D%27string%27%7C%7Cdata%20instanceof%20String%29%7Breturn%20encodeURIComponent%28data%29.replace%28regexp%2C%27%2B%27%29%7Dvar%20pairs%3D%5B%5D%3Bfor%28var%20k%20in%20data%29%7Bif%28typeof%20data%5Bk%5D%3D%3D%27undefined%27%29continue%3Bvar%20prefix%3DencodeURIComponent%28k%29.replace%28regexp%2C%27%2B%27%29%2B%27%3D%27%3Bvar%20values%3DArray.prototype.concat%28data%5Bk%5D%29%3Bfor%28var%20i%3D0%3Bi%3Cvalues.length%3Bi%2B%2B%29%7Bvar%20pair%3Dprefix%2BencodeURIComponent%28values%5Bi%5D%29.replace%28regexp%2C%27%2B%27%29%3Bpairs.push%28pair%29%7D%7Dreturn%20pairs.join%28%27%26%27%29%7D%7D%2C%7Bload%3Afunction%28url%2Cparams%29%7Bvar%20req%3DTen.XHR.getXMLHttpRequest%28%29%3Bthis.request%3Dreq%3Bvar%20self%3Dthis%3Breq.onreadystatechange%3Dfunction%28%29%7Bself.stateChangeHandler.call%28self%2Creq%29%7D%3Bparams%3Dparams%3FTen.XHR.makePostData%28params%29%3Anull%3Breq.open%28this.method%2Curl%2Ctrue%29%3Bif%28this.method%3D%3D%27POST%27%29req.setRequestHeader%28%27Content-Type%27%2C%27application%2Fx-www-form-urlencoded%27%29%3Breq.send%28params%29%7D%2CstateChangeHandler%3Afunction%28req%29%7Bthis.dispatchEvent%28%27state_change%27%29%3Bif%28req.readyState%3D%3D4%29%7Bthis.dispatchEvent%28%27ready%27%2Creq.status.toString%28%29%29%3Bif%28req.status%3E%3D200%26%26req.status%3C300%29%7Bthis.dispatchEvent%28%27complete%27%2Creq%29%7Delse%7Bthis.dispatchEvent%28%27error%27%2Creq%29%7D%7D%7D%7D%29%7D%7D%29%28%29%3B"&gt;avoid forwarding to id page @ Haiku (brute force version :-)&lt;/a&gt;&lt;pre&gt;/*
 * @title avoid forwarding to id page @ Haiku (brute force version :-)
 * @description はてなハイクで 2017-5-9 くらいから 不意に IDページに飛ばされちゃう件の無理やり対応（Haiku! するときに投稿内容の一部を数値参照に書き換えて投稿します）。
 * @include http://h.hatena.ne.jp/*
 * @license MIT http://opensource.org/licenses/MIT
 * @javascript_url
 */
/*
    see http://h.hatena.ne.jp/target?word=%E3%81%AF%E3%81%A6%E3%81%AA%E3%83%8F%E3%82%A4%E3%82%AF&amp;amp;date=2017-05-19
*/
(function() {
    var d_ = document;
    if (d_.location.href.indexOf(&amp;quot;http://h.hatena.ne.jp/&amp;quot;) == 0) {

/*
    http://s.hatena.ne.jp/js/HatenaStar.js?201609121
    の Ten.XHR の部分をごっそりコピペして、一部だけ書き換えてる。
*/
Ten.XHR = new Ten.Class({
    initialize: function(uri,opts,obj,callPropertyName) {
        Ten.EventDispatcher.implementEventDispatcher(this);
        this.method = 'GET';

        if (!uri) return;

        if (!Ten.XHR.isSafeUri(uri)) {
            throw &amp;quot;host differs : &amp;quot; + uri;
        }

        if (!opts) opts = {};

        if (opts.method) 
            this.method = opts.method;

        var self = this;
        this.addEventListener('complete', function() {
            if (!obj) return;
            if (typeof(obj) == 'function' &amp;amp;&amp;amp; typeof(callPropertyName) == 'undefined') {
                obj.call(obj, self.request);
            } else {
                obj[callPropertyName].call(obj, self.request);
            }
        });


        /* ここから : 書き換え */

        if (/\/entry\.body$/.test(uri)) {
            /* IDページに飛ばされる地雷 */
            let mine_list = [
                &amp;quot;ミ&amp;quot;,
                &amp;quot;о&amp;quot;,
                &amp;quot;卍&amp;quot;,
            ];
            opts.data.body = opts.data.body.map(function(body) {
                let txt = body;
                mine_list.forEach(function(mine) {
                    var re = new RegExp(mine, &amp;quot;g&amp;quot;);
                    var entity = Array.prototype.reduce.call(mine, function(prev, v) {
                        return prev + &amp;quot;&amp;amp;#&amp;quot; + v.codePointAt(0) + &amp;quot;;&amp;quot;;
                    }, &amp;quot;&amp;quot;);
                    txt = txt.replace(re, entity);
                });
                return txt;
            });
        }

        /* ここまで : 書き換え */

        this.load(uri, opts.data);
    },
    getXMLHttpRequest: function() {
        var xhr;
        var tryThese = [
            function () { return new XMLHttpRequest(); },
            function () { return new ActiveXObject('Msxml2.XMLHTTP'); },
            function () { return new ActiveXObject('Microsoft.XMLHTTP'); },
            function () { return new ActiveXObject('Msxml2.XMLHTTP.4.0'); }
        ];
        for (var i = 0; i &amp;lt; tryThese.length; i++) {
            var func = tryThese[i];
            try {
                xhr = func;
                return func();
            } catch (e) {
                //alert(e);
            }
        }
        return xhr;
    },
    isSafeUri: function(uri) {
        if (uri.match(/^\w+:/) || uri.match(/^\/\//)) {
            if (uri.split('/')[2] == location.host) return true;
            else return false;
        } else if (uri.match(/^\/[^\/]/) || uri == '/') {
            return true;
        } else if (!uri || uri.length == 0) {
            return false;
        }
        return true;
    },
    makePostData: function(data) {
        var regexp = /%20/g;
        if (typeof data == 'string' || (data instanceof String)) {
            return encodeURIComponent(data).replace(regexp, '+');
        }
        var pairs = [];
        for (var k in data) {
            if (typeof data[k] == 'undefined') continue;
            var prefix = encodeURIComponent(k).replace(regexp, '+') + '=';
            var values = Array.prototype.concat(data[k]);
            for (var i = 0; i &amp;lt; values.length; i++) {
                var pair = prefix + encodeURIComponent(values[i]).replace(regexp, '+');
                pairs.push(pair);
            }
        }
        return pairs.join('&amp;amp;');
    }
},{
    load: function(url, params) {
        var req = Ten.XHR.getXMLHttpRequest();
        this.request = req;

        var self = this;
        req.onreadystatechange = function() {
            self.stateChangeHandler.call(self, req);
        };
        params = params ? Ten.XHR.makePostData(params) : null;

        req.open(this.method, url, true);
        if (this.method == 'POST') 
            req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
        req.send(params);
    },
    stateChangeHandler: function(req) {
        this.dispatchEvent('state_change');

        if (req.readyState == 4) {
            this.dispatchEvent('ready', req.status.toString());

            if (req.status &amp;gt;= 200 &amp;amp;&amp;amp; req.status &amp;lt; 300) {
                this.dispatchEvent('complete', req);
            } else {
                this.dispatchEvent('error', req);
            }
        }
    }
});

    }



})();


&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/a-kuma3/let/hJmfg_-o-rxf">
    <link>https://let.hatelabo.jp/a-kuma3/let/hJmfg_-o-rxf</link>
    <dc:date>2017-05-20T08:30:23Z</dc:date>
    <description>はてなハイクで 2017-5-9 くらいから 不意に IDページに飛ばされちゃう件のやっつけ対応（投稿内容の一部を数値参照に置き換える）</description>
    <dc:creator>a-kuma3</dc:creator>
    <title>[Let] avoid forwarding to id page @ Haiku</title>
    <content:encoded>&lt;a href="javascript:%28function%28%29%7Bconst%20d_%3Ddocument%3Bif%28d_.location.href.indexOf%28%22http%3A%2F%2Fh.hatena.ne.jp%2F%22%29%3D%3D0%29%7Blet%20ta%3Dd_.querySelector%28%22.entry-form%20textarea.entry-body%22%29%3Bif%28ta%29%7Blet%20txt%3Dta.value%3B%5B%22%E3%83%9F%22%2C%22%D0%BE%22%2C%22%E5%8D%8D%22%5D.forEach%28%28function%28mine%29%7Blet%20re%3Dnew%20RegExp%28mine%2C%22g%22%29%3Blet%20entity%3DArray.prototype.reduce.call%28mine%2C%28function%28prev%2Cv%29%7Breturn%20prev%2B%22%26%23%22%2Bv.codePointAt%280%29%2B%22%3B%22%7D%29%2C%22%22%29%3Btxt%3Dtxt.replace%28re%2Centity%29%7D%29%29%3Bta.value%3Dtxt%7D%7D%7D%29%28%29%3B"&gt;avoid forwarding to id page @ Haiku&lt;/a&gt;&lt;pre&gt;/*
 * @title avoid forwarding to id page @ Haiku
 * @description はてなハイクで 2017-5-9 くらいから 不意に IDページに飛ばされちゃう件のやっつけ対応（投稿内容の一部を数値参照に置き換える）
 * @include http://h.hatena.ne.jp/*
 * @license MIT http://opensource.org/licenses/MIT
 * @javascript_url
 */
/*
    see http://h.hatena.ne.jp/target?word=%E3%81%AF%E3%81%A6%E3%81%AA%E3%83%8F%E3%82%A4%E3%82%AF&amp;amp;date=2017-05-19
*/
(function() {
    const d_ = document;
    if (d_.location.href.indexOf(&amp;quot;http://h.hatena.ne.jp/&amp;quot;) == 0) {
        let ta = d_.querySelector(&amp;quot;.entry-form textarea.entry-body&amp;quot;);
        if (ta) {
            let txt = ta.value;
            /* IDページに飛ばされる地雷 */
            [
                &amp;quot;ミ&amp;quot;,
                &amp;quot;о&amp;quot;,
                &amp;quot;卍&amp;quot;,
            ].forEach(function(mine) {
                let re = new RegExp(mine, &amp;quot;g&amp;quot;);
                let entity = Array.prototype.reduce.call(mine, function(prev, v) {
                    return prev + &amp;quot;&amp;amp;#&amp;quot; + v.codePointAt(0) + &amp;quot;;&amp;quot;;
                }, &amp;quot;&amp;quot;);
                txt = txt.replace(re, entity);
            });
            ta.value = txt;
        }
    }
    // ほんとは entry.body の POST を横取りしたかったんだけど　(´・ω・｀)
})();
&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/a-kuma3/let/hJme_f-UgJ5P">
    <link>https://let.hatelabo.jp/a-kuma3/let/hJme_f-UgJ5P</link>
    <dc:date>2017-05-10T01:32:03Z</dc:date>
    <description>insert day to timestamp @ Haiku</description>
    <dc:creator>a-kuma3</dc:creator>
    <title>[Let] day of Haiku</title>
    <content:encoded>&lt;a href="javascript:%28%28%29%3D%3E%7Bfunction%20insert_day%28target%29%7Bconst%20w%3D%22%E6%97%A5%E6%9C%88%E7%81%AB%E6%B0%B4%E6%9C%A8%E9%87%91%E5%9C%9F%22%3Bconst%20re%3Dnew%20RegExp%28String.raw%60%5E%28%5Cd%7B4%7D%2F%5Cd%7B2%7D%2F%5Cd%7B2%7D%29%5Cs%28%5Cd%7B1%2C2%7D%3A%5Cd%7B2%7D%3A%5Cd%7B2%7D%29%24%60%29%3BArray.from%28target.querySelectorAll%28%22.list-body%20%3E%20.info%20time%5Bdatetime%5D%22%29%29.forEach%28%28e%3D%3E%7Blet%20t%3Dnew%20Date%28e.getAttribute%28%22datetime%22%29%29%3Be.innerHTML%3De.innerHTML.replace%28re%2C%60%241%28%24%7Bw.charAt%28t.getDay%28%29%29%7D%29%26nbsp%3B%242%60%29%7D%29%29%7Dinsert_day%28document.body%29%3Bnew%20MutationObserver%28%28records%3D%3E%7Brecords.forEach%28%28record%3D%3E%7Bif%28record.addedNodes%29%7BArray.from%28record.addedNodes%29.forEach%28%28entry_list%3D%3E%7Binsert_day%28entry_list%29%7D%29%29%7D%7D%29%29%7D%29%29.observe%28document.querySelector%28%22.tl-entry-list%22%29%2C%7BchildList%3Atrue%7D%29%7D%29%28%29%3B"&gt;day of Haiku&lt;/a&gt;&lt;pre&gt;/*
 * @title day of Haiku
 * @description insert day to timestamp @ Haiku
 * @include http://h.hatena.ne.jp/*
 * @license MIT http://opensource.org/licenses/MIT
 * @javascript_url
 */
(() =&amp;gt; {
    function insert_day(target) {
        const w = &amp;quot;日月火水木金土&amp;quot;;
        const re = new RegExp(String.raw`^(\d{4}/\d{2}/\d{2})\s(\d{1,2}:\d{2}:\d{2})$`);
        Array.from(target.querySelectorAll(&amp;quot;.list-body &amp;gt; .info time[datetime]&amp;quot;)).forEach(e =&amp;gt; {
            let t = new Date(e.getAttribute(&amp;quot;datetime&amp;quot;));
            e.innerHTML = e.innerHTML.replace(re, `$1(${w.charAt(t.getDay())})&amp;amp;nbsp;$2`);
        });
    }

    insert_day(document.body);

    // https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver
    new MutationObserver(records =&amp;gt; {
        records.forEach(record =&amp;gt; {
            if (record.addedNodes) {
                // record.addedNodes.length maybe 1
                Array.from(record.addedNodes).forEach(entry_list =&amp;gt; {
                    insert_day(entry_list);
                });
            }
        });
    }).observe(document.querySelector(&amp;quot;.tl-entry-list&amp;quot;), {childList: true});

})();
&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/a-kuma3/let/hLHW7JSExeZ_">
    <link>https://let.hatelabo.jp/a-kuma3/let/hLHW7JSExeZ_</link>
    <dc:date>2017-04-12T08:25:45Z</dc:date>
    <description>URL の一部を書き換えてからジャンプします (sample)</description>
    <dc:creator>a-kuma3</dc:creator>
    <title>[Let] jump with partial modification (sample)</title>
    <content:encoded>&lt;a href="javascript:%28url%3D%3E%7Bconst%20d_%3Ddocument%3Bconst%20variable%3D%22%40%40%40%22%3Bconst%20width%3D60%3Bconst%20c_style_%3D%7BbackgroundColor%3A%22green%22%2Ccolor%3A%22white%22%2Cposition%3A%22absolute%22%2Cwidth%3Awidth%2B20%2B%22ex%22%7D%3Bconst%20i_style_%3D%7BfontFamily%3A%22monospace%22%2CfontSize%3A%2210.5pt%22%2Cwidth%3Awidth%2B%22ex%22%2Cmargin%3A%222em%20auto%22%2Cdisplay%3A%22block%22%2Cborder%3A%22none%22%2Cpadding%3A%222px%201px%22%7D%3Bconst%20c_%3Dd_.body.appendChild%28Object.assign%28d_.createElement%28%22div%22%29%2C%7Bid%3A%22a-kuma3%22%7D%29%29%3BObject.assign%28c_.style%2Cc_style_%29%3Bconst%20i_%3Dc_.appendChild%28Object.assign%28d_.createElement%28%22input%22%29%2C%7Btype%3A%22text%22%2Cvalue%3Aurl%2Conkeydown%3Afunction%28ev%29%7Bswitch%28ev.keyCode%29%7Bcase%2013%3Alocation.href%3Dthis.value%3Bthis.style.display%3D%22none%22%3Bconst%20m_%3Dc_.appendChild%28Object.assign%28d_.createElement%28%22div%22%29%2C%7BinnerHTML%3A%22Now%20Loading%20...%22%7D%29%29%3BObject.assign%28m_.style%2Ci_style_%29%3Bbreak%3Bcase%2027%3Ac_.parentNode.removeChild%28c_%29%3Bbreak%7D%7D%7D%29%29%3BObject.assign%28i_.style%2Ci_style_%29%3Bconst%20h_%3Dd_.documentElement%3BObject.assign%28c_.style%2C%7Btop%3Ah_.scrollTop%2Bh_.clientHeight%2F2-c_.clientHeight%2F2%2B%22px%22%2Cleft%3Ah_.scrollLeft%2Bh_.clientWidth%2F2-c_.clientWidth%2F2%2B%22px%22%7D%29%3Bi_.select%28%29%3Bi_.selectionStart%3Durl.indexOf%28variable%29%3Bi_.selectionEnd%3Di_.selectionStart%2Bvariable.length%7D%29%28%22http%3A%2F%2Fq.hatena.ne.jp%2F%40%40%40%2Fwatchlist%22%29%3B"&gt;jump with partial modification (sample)&lt;/a&gt;&lt;pre&gt;/*
 * @title jump with partial modification (sample)
 * @description URL の一部を書き換えてからジャンプします (sample)
 * @include http://*, https://*
 * @license MIT http://opensource.org/licenses/MIT
 * @javascript_url
 */
// answer of http://q.hatena.ne.jp/1491958499
((url) =&amp;gt; {
    const d_ = document;

    const variable = &amp;quot;@@@&amp;quot;;
    const width = 60;
    const c_style_ = {
        backgroundColor: &amp;quot;green&amp;quot;,
        color: &amp;quot;white&amp;quot;,
        position: &amp;quot;absolute&amp;quot;,
        width: (width + 20) + &amp;quot;ex&amp;quot;,
    };
    const i_style_ = {
        fontFamily: &amp;quot;monospace&amp;quot;,
        fontSize: &amp;quot;10.5pt&amp;quot;,
        width: width + &amp;quot;ex&amp;quot;,
        margin: &amp;quot;2em auto&amp;quot;,
        display: &amp;quot;block&amp;quot;,
        border: &amp;quot;none&amp;quot;,
        padding: &amp;quot;2px 1px&amp;quot;,
    };

    // container
    const c_ = d_.body.appendChild(Object.assign(d_.createElement(&amp;quot;div&amp;quot;), {
        id: &amp;quot;a-kuma3&amp;quot;,
    }));
    Object.assign(c_.style, c_style_);

    // input
    const i_ = c_.appendChild(Object.assign(d_.createElement(&amp;quot;input&amp;quot;), {
        type: &amp;quot;text&amp;quot;,
        value: url,
        onkeydown: function(ev) {
            switch (ev.keyCode) {
            case 13: // Enter
                location.href = this.value;
                this.style.display = &amp;quot;none&amp;quot;;
                const m_ = c_.appendChild(Object.assign(d_.createElement(&amp;quot;div&amp;quot;), {
                    innerHTML: &amp;quot;Now Loading ...&amp;quot;,
                }));
                Object.assign(m_.style, i_style_);
                break;
            case 27: // ESC
                c_.parentNode.removeChild(c_);
                break;
            }
        },
    }));
    Object.assign(i_.style, i_style_);

    // position
    const h_ = d_.documentElement;
    Object.assign(c_.style, {
        top: (h_.scrollTop + h_.clientHeight / 2 - c_.clientHeight / 2) + &amp;quot;px&amp;quot;,
        left: (h_.scrollLeft + h_.clientWidth / 2 - c_.clientWidth / 2) + &amp;quot;px&amp;quot;,
    });

    // select variable part
    i_.select();
    i_.selectionStart = url.indexOf(variable);
    i_.selectionEnd = i_.selectionStart + variable.length;


})(&amp;quot;http://q.hatena.ne.jp/@@@/watchlist&amp;quot;);

&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/a-kuma3/let/hJme4N-s77x7">
    <link>https://let.hatelabo.jp/a-kuma3/let/hJme4N-s77x7</link>
    <dc:date>2017-03-25T14:53:54Z</dc:date>
    <description>タイトルと URL をコピーするための TEXTAREA</description>
    <dc:creator>a-kuma3</dc:creator>
    <title>[Let] title and url (for copy)</title>
    <content:encoded>&lt;a href="javascript:%28function%28%29%7Bconst%20c_id%3D%22a-kuma3-%22%2BDate.now%28%29%3Bconst%20remove_textarea%3Dfunction%28%29%7Bthis.parentNode.parentNode.removeChild%28this.parentNode%29%7D%3Bfunction%20append_element%28parent%2Ctag%2Cattr%29%7Breturn%20parent.appendChild%28Object.assign%28document.createElement%28tag%29%2Cattr%29%29%7Dlet%20c%3Dappend_element%28document.body%2C%22div%22%2C%7Bid%3Ac_id%7D%29%3Blet%20txt%3Dappend_element%28c%2C%22textarea%22%2C%7BclassName%3A%22txt%22%2Cvalue%3Adocument.title%2B%22%5Cn%22%2Blocation.href%2Ccols%3A100%2Crows%3A5%2Conkeypress%3Afunction%28ev%29%7Bif%28ev.keyCode%3D%3D27%29%7Bremove_textarea.call%28this%29%7D%7D%7D%29%3Bappend_element%28c%2C%22div%22%2C%7BclassName%3A%22btn%20close%22%2CinnerHTML%3A%22%26%23x274c%3B%22%2Conclick%3Aremove_textarea%7D%29%3Bappend_element%28c%2C%22div%22%2C%7BclassName%3A%22btn%20bookmark%22%2CinnerHTML%3A%22%3Cimg%20src%3D%27http%3A%2F%2Flocalhost%2Fimages%2Ffirefox_favicon%2Fhatebu.png%27%3E%22%2Conclick%3Afunction%28%29%7Blocation.href%3D%22http%3A%2F%2Fb.hatena.ne.jp%2Fentry%2F%22%2Blocation.href%7D%7D%29%3Bappend_element%28document.head%2C%22style%22%2C%7BinnerHTML%3A%60%5Cn%20%20%20%20%20%20%20%20%23%24%7Bc_id%7D%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20display%3A%20inline-block%3B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20position%3A%20fixed%3B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20top%3A%200%3B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20left%3A%200%3B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20background-color%3A%20white%3B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20border%3A%201px%20inset%20gray%3B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20z-index%3A%2010000%3B%5Cn%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%23%24%7Bc_id%7D%20textarea%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20height%3A%205em%20%21important%3B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20vertical-align%3A%20top%3B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20font-family%3A%20monospace%3B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20font-size%3A%2010pt%3B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20height%3A%205em%3B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20width%3A%20auto%3B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20margin%3A%200%3B%5Cn%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%23%24%7Bc_id%7D%20textarea%3A%3A-moz-selection%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20background-color%3A%20%235dacf2%3B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20color%3A%20%23444%3B%5Cn%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%23%24%7Bc_id%7D%20.btn%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20display%3A%20inline-block%3B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20position%3A%20absolute%3B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20right%3A%200%3B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20color%3A%20white%3B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20width%3A%201.5em%3B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20height%3A%20%221.5em%22%3B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20border%3A%202px%20silver%20solid%3B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20cursor%3A%20pointer%3B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20text-align%3A%20center%3B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20font-family%3A%20monospace%3B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20font-size%3A%2010pt%3B%5Cn%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%23%24%7Bc_id%7D%20.close%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20background-color%3A%20darkred%3B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20vertical-align%3A%20top%3B%5Cn%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%23%24%7Bc_id%7D%20.bookmark%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20top%3A%201.5em%3B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20padding%3A%200%3B%5Cn%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%23%24%7Bc_id%7D%20.bookmark%20img%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20width%3A%201.5em%3B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20height%3A%201.5em%3B%5Cn%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%60%7D%29%3Btxt.focus%28%29%3Btxt.select%28%29%7D%29%28%29%3B"&gt;title and url (for copy)&lt;/a&gt;&lt;pre&gt;/*
 * @title title and url (for copy)
 * @description タイトルと URL をコピーするための TEXTAREA
 * @include http://*
 * @include https://*
 * @license MIT License
 * @javascript_url
 */
(function () {
    const c_id = &amp;quot;a-kuma3-&amp;quot; + Date.now();
    const remove_textarea = function() {
        this.parentNode.parentNode.removeChild(this.parentNode);
    };

    function append_element(parent, tag, attr) {
        return parent.appendChild(Object.assign(document.createElement(tag), attr));
    }

    let c = append_element(document.body, &amp;quot;div&amp;quot;, {
        id: c_id
    });

    let txt = append_element(c, &amp;quot;textarea&amp;quot;, {
        className: &amp;quot;txt&amp;quot;,
        value: document.title + &amp;quot;\n&amp;quot; + location.href,
        cols: 100,
        rows: 5,
        onkeypress: function(ev) {
            if (ev.keyCode == 27) {     // ESC
                remove_textarea.call(this);
            }
        },
    });

    append_element(c, &amp;quot;div&amp;quot;, {
        className: &amp;quot;btn close&amp;quot;,
        innerHTML: &amp;quot;&amp;amp;#x274c;&amp;quot;,
        onclick: remove_textarea,
    });

    append_element(c, &amp;quot;div&amp;quot;, {
        className: &amp;quot;btn bookmark&amp;quot;,
        innerHTML: &amp;quot;&amp;lt;img src='http://localhost/images/firefox_favicon/hatebu.png'&amp;gt;&amp;quot;,
        onclick: function() {
            location.href = &amp;quot;http://b.hatena.ne.jp/entry/&amp;quot; + location.href;
        },
    });

    append_element(document.head, &amp;quot;style&amp;quot;, {
        innerHTML: `
        #${c_id} {
            display: inline-block;
            position: fixed;
            top: 0;
            left: 0;
            background-color: white;
            border: 1px inset gray;
            z-index: 10000;
        }
        #${c_id} textarea {
            height: 5em !important;
            vertical-align: top;
            font-family: monospace;
            font-size: 10pt;
            height: 5em;
            width: auto;
            margin: 0;
        }
        #${c_id} textarea::-moz-selection {
            background-color: #5dacf2;
            color: #444;
        }
        #${c_id} .btn {
            display: inline-block;
            position: absolute;
            right: 0;
            color: white;
            width: 1.5em;
            height: &amp;quot;1.5em&amp;quot;;
            border: 2px silver solid;
            cursor: pointer;
            text-align: center;
            font-family: monospace;
            font-size: 10pt;
        }
        #${c_id} .close {
            background-color: darkred;
            vertical-align: top;
        }
        #${c_id} .bookmark {
            top: 1.5em;
            padding: 0;
        }
        #${c_id} .bookmark img {
            width: 1.5em;
            height: 1.5em;
        }
        `,
    });

    txt.focus();
    txt.select();

})();


&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/a-kuma3/let/hJmeypnCy9oJ">
    <link>https://let.hatelabo.jp/a-kuma3/let/hJmeypnCy9oJ</link>
    <dc:date>2017-02-21T10:36:31Z</dc:date>
    <description>クリックしたところに、勝手に はてなスターを置きます（一回だけ）</description>
    <dc:creator>a-kuma3</dc:creator>
    <title>[Let] Yet Another 勝手にスター</title>
    <content:encoded>&lt;a href="javascript:%28%28%29%3D%3E%7Bconst%20d_%3Ddocument%3Bfunction%20put_star_container%28e%29%7Bif%28%21d_.querySelector%28%27script%5Bsrc%2A%3D%22s.hatena.ne.jp%22%5D%27%29%29%7Bd_.head.appendChild%28Object.assign%28d_.createElement%28%22script%22%29%2C%7Btype%3A%22text%2Fjavascript%22%2Csrc%3A%22%2F%2Fs.hatena.ne.jp%2Fjs%2FHatenaStar.js%22%2Conload%3A%28%29%3D%3Eput_star_container%28e%29%7D%29%29%3Breturn%7Dfunction%20insert_entry_node_next%28e%29%7Breturn%20e.parentNode.insertBefore%28d_.createElement%28%22span%22%29%2Ce.nextSibling%29%7Dlet%20p%3D%7Bnode%3Ae%2Curi%3Ad_.location.href%2Ctitle%3Ad_.title%7D%3Blet%20link%3De.tagName%3D%3D%22A%22%26%26e.href%3Fe%3Ae.querySelector%28%22a%5Bhref%5D%22%29%3Bif%28link%29%7Bp.uri%3Dlink.href%3Bp.title%3Dlink.textContent.trim%28%29%3Bp.node%3Dinsert_entry_node_next%28link%29%7Dif%28e.tagName%3D%3D%22IMG%22%29%7Bp.node%3Dinsert_entry_node_next%28e%29%7Dconsole.log%28p%29%3Blet%20c%3DHatena.Star.EntryLoader%3Bc.loadEntries%3Dfunction%28p%29%7Breturn%5Bnew%20Hatena.Star.Entry%28%7BentryNode%3Ap.node%2Curi%3Ap.uri%2Ctitle%3Ap.title%2Ccomment_container%3Ap.node.appendChild%28c.createCommentContainer%28%29%29%2Cstar_container%3Ap.node.appendChild%28c.createStarContainer%28%29%29%7D%29%5D%7D%3Bc.loadNewEntries%28p%29%3Bdelete%20c.loadEntries%7Dfunction%20once_handler%28e%29%7Be.stopPropagation%28%29%3Be.preventDefault%28%29%3Bput_star_container%28e.target%29%3Bd_.removeEventListener%28%27click%27%2Conce_handler%29%3Bd_.removeEventListener%28%27touchstart%27%2Conce_handler%29%7Dd_.addEventListener%28%27click%27%2Conce_handler%29%3Bd_.addEventListener%28%27touchstart%27%2Conce_handler%29%7D%29%28%29%3B"&gt;Yet Another 勝手にスター&lt;/a&gt;&lt;pre&gt;/*
 * @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

(() =&amp;gt; {
    const d_ = document;

    function put_star_container(e) {
        if (! d_.querySelector('script[src*=&amp;quot;s.hatena.ne.jp&amp;quot;]')) {
            d_.head.appendChild(Object.assign(d_.createElement(&amp;quot;script&amp;quot;), {
                type: &amp;quot;text/javascript&amp;quot;,
                src: &amp;quot;//s.hatena.ne.jp/js/HatenaStar.js&amp;quot;,
                onload: () =&amp;gt; put_star_container(e),
            }));
            return;
        }

        function insert_entry_node_next(e) {
            return e.parentNode.insertBefore(d_.createElement(&amp;quot;span&amp;quot;), e.nextSibling);
        }

        let p = {
            node: e,
            uri: d_.location.href,
            title: d_.title,
        };

        let link = e.tagName == &amp;quot;A&amp;quot; &amp;amp;&amp;amp; e.href ? e : e.querySelector(&amp;quot;a[href]&amp;quot;);
        if (link) {
            p.uri = link.href;
            p.title = link.textContent.trim();
            p.node = insert_entry_node_next(link);
            /*
                TODO: invisible a
                e.g.
                &amp;lt;div&amp;gt;
                    &amp;lt;div&amp;gt;visible&amp;lt;/div&amp;gt;      click !
                    &amp;lt;div style=&amp;quot;display: none;&amp;quot;&amp;gt;
                        invisible
                        &amp;lt;a href=&amp;quot;...&amp;quot;&amp;gt;...
                    &amp;lt;/div&amp;gt;
            */
        }

        // img にも appendChild できちゃうんだねえ
        if (e.tagName == &amp;quot;IMG&amp;quot;) {
            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);

})();
&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/a-kuma3/let/hLHWyZTasr9n">
    <link>https://let.hatelabo.jp/a-kuma3/let/hLHWyZTasr9n</link>
    <dc:date>2017-02-20T05:02:41Z</dc:date>
    <description>数値参照で汚染された s.hatena.ne.jp に平穏を取り戻します</description>
    <dc:creator>a-kuma3</dc:creator>
    <title>[Let] yet another stupid numeric character reference decoder</title>
    <content:encoded>&lt;a href="javascript:%28%28%29%3D%3E%7Bconst%20re_num_ref%3D%2F%26%23x%3F%5B0-9a-f%5D%7B1%2C6%7D%3B%2F%3BArray.from%28document.querySelectorAll%28%22.entry-title%20~%20blockquote%22%29%29.forEach%28%28b%3D%3E%7Bif%28re_num_ref.test%28b.textContent%29%29%7Bb.innerHTML%3Db.textContent%7D%7D%29%29%3Bdocument.head.appendChild%28Object.assign%28document.createElement%28%22style%22%29%2C%7BinnerHTML%3A%60%5Cn%20%20%20%20%20%20%20%20%20%20%20%20table.list%20td%20blockquote%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20word-break%3A%20break-all%3B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%60%7D%29%29%7D%29%28%29%3B"&gt;yet another stupid numeric character reference decoder&lt;/a&gt;&lt;pre&gt;/*
 * @title yet another stupid numeric character reference decoder
 * @description 数値参照で汚染された s.hatena.ne.jp に平穏を取り戻します
 * @include http://s.hatena.ne.jp/*
 * @license MIT License
 * @javascript_url
 */
(() =&amp;gt; {
    const re_num_ref = /&amp;amp;#x?[0-9a-f]{1,6};/;
    Array.from(document.querySelectorAll(&amp;quot;.entry-title ~ blockquote&amp;quot;)).forEach(b =&amp;gt; {
        if (re_num_ref.test(b.textContent)) {
            b.innerHTML = b.textContent;
        }
    });

    document.head.appendChild(Object.assign(document.createElement(&amp;quot;style&amp;quot;), {
        innerHTML: `
            table.list td blockquote {
                word-break: break-all;
            }
        `,
    }));

})();


&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/a-kuma3/let/hLHWyKSui4Z7">
    <link>https://let.hatelabo.jp/a-kuma3/let/hLHWyKSui4Z7</link>
    <dc:date>2017-02-19T08:16:18Z</dc:date>
    <description>出たがり屋の引用スター</description>
    <dc:creator>a-kuma3</dc:creator>
    <title>[Let] show star quote</title>
    <content:encoded>&lt;a href="javascript:%22https%3A%2F%2Flet.st-hatelabo.com%2Fa-kuma3%2Flet%2FhLHWyKSui4Z7.bookmarklet.js%20%28arg%29%22.replace%28%2F%28%5CS%2B%29%5Cs%2B%28%5CS%2A%29%2F%2Cfunction%28s%2Curl%2Carg%29%7Bs%3Ddocument.createElement%28%22script%22%29%3Bs.charset%3D%22utf-8%22%3Bs.src%3Durl%2B%22%3Fs%3D%22%2BencodeURIComponent%28arg%29%3Bdocument.body.appendChild%28s%29%7D%29%3Bvoid%280%29%3B"&gt;show star quote&lt;/a&gt;&lt;pre&gt;/*
 * @title show star quote
 * @description 出たがり屋の引用スター
 * @include http://*
 * @license MIT License
 */
/*
    1引用スター、1行の方が見やすいかな
    span -&amp;gt; q
*/
// http://h.hatena.ne.jp/noromanba/4623536828018945911
(() =&amp;gt; {
    let d_ = document;
    d_.body.appendChild(Object.assign(d_.createElement(&amp;quot;style&amp;quot;), {
        innerHTML: `
            .a-kuma3-star-quote-wrapper {
                border: silver 1px solid;
                margin-left: 0.5ex;
                margin-right: 0.7ex;
                display: block;
                line-height: 1 !important;
            }
            .a-kuma3-star-quote-wrapper &amp;gt; .quote {
                font-weight: normal;
                font-size: medium;
                color: black;
                padding-left: 2px;
            }
        `
    }));
    var show_star_quote = () =&amp;gt; {
        let entries = Hatena.Star.EntryLoader.entries;
        entries.forEach((e, i) =&amp;gt; {
            e.stars.forEach((s) =&amp;gt; {
                if (s.quote) {
                    if (s.anchor.parentNode.className == &amp;quot;a-kuma3-star-quote-wrapper&amp;quot;) {
                        return;
                    }
                    let wrap = Object.assign(d_.createElement(&amp;quot;span&amp;quot;), {
                        className: &amp;quot;a-kuma3-star-quote-wrapper&amp;quot;,
                    })
                    s.anchor.parentNode.insertBefore(wrap, s.anchor);
                    wrap.appendChild(s.anchor);
                    let quote = Object.assign(d_.createElement(&amp;quot;q&amp;quot;), {
                        innerHTML: s.quote,
                        className: &amp;quot;quote&amp;quot;,
                    });
                    wrap.appendChild(quote);
                }
            });
        });
    };

    show_star_quote();
})();

&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/a-kuma3/let/hLHWypmkorgp">
    <link>https://let.hatelabo.jp/a-kuma3/let/hLHWypmkorgp</link>
    <dc:date>2017-02-18T14:20:52Z</dc:date>
    <description>勝手に はてなスターを置きます</description>
    <dc:creator>a-kuma3</dc:creator>
    <title>[Let] 勝手にスター</title>
    <content:encoded>&lt;a href="javascript:%28%28%29%3D%3E%7Bconst%20d_%3Ddocument%3Bif%28%21d_.querySelector%28%27script%5Bsrc%2A%3D%22s.hatena.ne.jp%2Fjs%2FHatenaStar.js%22%5D%27%29%29%7Bd_.head.appendChild%28Object.assign%28d_.createElement%28%22script%22%29%2C%7Btype%3A%22text%2Fjavascript%22%2Csrc%3A%22%2F%2Fs.hatena.ne.jp%2Fjs%2FHatenaStar.js%22%2Conload%3Afunction%28%29%7Blet%20e%3Dd_.querySelector%28%22h1%2Ch2%2Ch3%2Ch4%2Ch5%2Ch6%22%29%3BHatena.Star.SiteConfig%3D%7BentryNodes%3A%7B%7D%7D%3BHatena.Star.SiteConfig.entryNodes%5Be.tagName%5D%3D%7Buri%3A%22document.location%22%2Ctitle%3A%22document.title%22%2Ccontainer%3A%22parent%22%7D%3Bnew%20Hatena.Star.EntryLoader%7D%7D%29%29%7Delse%7Bconsole.log%28%22already%20Hatena.Star%20exists%20%21%22%29%7D%7D%29%28%29%3B"&gt;勝手にスター&lt;/a&gt;&lt;pre&gt;/*
 * @title 勝手にスター
 * @description 勝手に はてなスターを置きます
 * @include http://*
 * @include https://*
 * @license MIT License
 * @javascript_url
 */
// inspired by http://let.hatelabo.jp/noromanba/let/gYC-xcvQ3PTQew
(() =&amp;gt; {
    const d_ = document
    if (! d_.querySelector('script[src*=&amp;quot;s.hatena.ne.jp/js/HatenaStar.js&amp;quot;]')) {
        d_.head.appendChild(Object.assign(d_.createElement(&amp;quot;script&amp;quot;), {
            type: &amp;quot;text/javascript&amp;quot;,
            src: &amp;quot;//s.hatena.ne.jp/js/HatenaStar.js&amp;quot;,
            onload: function() {
                let e = d_.querySelector(&amp;quot;h1,h2,h3,h4,h5,h6&amp;quot;)
                Hatena.Star.SiteConfig = {
                    entryNodes: {}
                }
                Hatena.Star.SiteConfig.entryNodes[ e.tagName ] = {
                    uri: &amp;quot;document.location&amp;quot;,
                    title: &amp;quot;document.title&amp;quot;,
                    container: &amp;quot;parent&amp;quot;,
                }
                new Hatena.Star.EntryLoader();
            },
        }))
    } else {
        console.log(&amp;quot;already Hatena.Star exists !&amp;quot;)
    }
})()

&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/a-kuma3/let/hLHWycCUqaF_">
    <link>https://let.hatelabo.jp/a-kuma3/let/hLHWycCUqaF_</link>
    <dc:date>2017-02-17T12:31:07Z</dc:date>
    <description>人力検索などで引用スターに失敗するのを回避します。【注意】カラースターの対応ができてません (´・ω・｀)</description>
    <dc:creator>a-kuma3</dc:creator>
    <title>[Let] Avoid losing a quote star</title>
    <content:encoded>&lt;a href="javascript:%22https%3A%2F%2Flet.st-hatelabo.com%2Fa-kuma3%2Flet%2FhLHWycCUqaF_.bookmarklet.js%20%28arg%29%22.replace%28%2F%28%5CS%2B%29%5Cs%2B%28%5CS%2A%29%2F%2Cfunction%28s%2Curl%2Carg%29%7Bs%3Ddocument.createElement%28%22script%22%29%3Bs.charset%3D%22utf-8%22%3Bs.src%3Durl%2B%22%3Fs%3D%22%2BencodeURIComponent%28arg%29%3Bdocument.body.appendChild%28s%29%7D%29%3Bvoid%280%29%3B"&gt;Avoid losing a quote star&lt;/a&gt;&lt;pre&gt;/*
 * @title Avoid losing a quote star
 * @description 人力検索などで引用スターに失敗するのを回避します。【注意】カラースターの対応ができてません (´・ω・｀)
 * @include http://*
 * @include https://*
 * @license MIT License
 */
/*
    http://q.hatena.ne.jp/1487227736#a1262105

    引用に失敗したっぽいときに
    - もう一度試す（最初の空振りしたスターは消す）
    - 引用は数値参照にする
*/
(() =&amp;gt; {
    const jsonp = (() =&amp;gt; {
        var count = 0;
        return function(url, callback) {
            var callbackName = 'akuma3_jsonp'+count++;
            var script = document.createElement('script');
            script.src = url.replace(/[=]\?(&amp;amp;|$)/g, '='+callbackName+'$1');
            window[callbackName] = function(data) {
                if (callback)
                    callback(data);
                window[callbackName] = undefined;
                try { delete window[callbackName]; } catch(e) {}
                document.body.removeChild(script);
            };
            document.body.appendChild(script);
        };
    })();

    const StarRequest = function(url) {
        let a = url.split(&amp;quot;?&amp;quot;)
        this.__api__ = a[0]
        // parse parameter
        a[1].split(&amp;quot;&amp;amp;&amp;quot;).forEach(s =&amp;gt; {
            let index = s.indexOf(&amp;quot;=&amp;quot;)
            if (index != -1) {
                let k = s.slice(0, index), v = s.slice(index + 1)
                this[k] = v
            } else {
                // maybe timestamp
                this.timestamp = s
            }
        })
        // method
        Object.assign(this, {
            to_parameter_string: function(p) {
                let a = [
                    &amp;quot;uri=&amp;quot; + this.uri,
                    &amp;quot;rks=&amp;quot; + this.rks,
                    &amp;quot;timestamp=&amp;quot; + new Date().getTime(),
                ]
                for (k in p) {
                    a.push(k + &amp;quot;=&amp;quot; + p[k])
                }
                return a.join(&amp;quot;&amp;amp;&amp;quot;)
            },
            add_url: function(q) {
                return this.__api__ + &amp;quot;?&amp;quot; + this.to_parameter_string({
                    title    : this.title  ,
                    quote    : (q ? q : this.quote)  ,
                    location : this.location  ,
                    callback : &amp;quot;?&amp;quot;,
                })
            },
            del_url: function(name) {
                return &amp;quot;http://s.hatena.ne.jp/star.delete.json?&amp;quot; + this.to_parameter_string({
                    name : encodeURIComponent(name),
                })
            },
            do_callback: function(json) {
                let func = new Function(&amp;quot;a&amp;quot;, this.callback + &amp;quot;(a)&amp;quot;)
                func.call(null, json)
            },
            numeric_reference_quote: function() {
                let s = decodeURIComponent(this.quote)
                let o = &amp;quot;&amp;quot;, i = 0
                while (i &amp;lt; s.length) {
                    let code = s.codePointAt(i)
                    if (code &amp;gt; 128) {
                        o += &amp;quot;&amp;amp;#&amp;quot; + code + &amp;quot;;&amp;quot;
                        if (code &amp;gt; 0xffff) {    // for surrogate pair
                            i += 1
                        }
                    } else {
                        o += s.charAt(i)
                    }
                    i += 1
                }
                return encodeURIComponent(o)
            },
        })
    }

    const enhanced_add_star = (url) =&amp;gt; {
        const req = new StarRequest(url)
        if (req.quote) {
            jsonp(req.add_url(), (data) =&amp;gt; {
                if (data.quote == &amp;quot;&amp;quot;) { // has quote, but lose it !

                    // remove no quote star
                    jsonp(req.del_url(encodeURIComponent(data.name)))

                    // retry and use numeric character reference
                    jsonp(req.add_url(req.numeric_reference_quote()), (data) =&amp;gt; {
                        console.log(&amp;quot;a-kuma3: repair quote star. &amp;quot;, data)
                        req.do_callback(data)
                    })

                } else {
                    req.do_callback(data)
                }
            })
        } else {
            // no quote
            jsonp(url)
        }
    }


    const head = document.querySelector(&amp;quot;head&amp;quot;)
    const re_add_star = /s\.hatena\.ne\.jp\/star\.add\.json\?/
    head.appendChild = function(e) {
        if (e.tagName == 'SCRIPT' &amp;amp;&amp;amp; re_add_star.test(e.src)) {
            enhanced_add_star(e.src)
        } else {
            // I believe e.nodeType == 1
            e.appendChild.call(this, e)
        }
    }

})();
&lt;/pre&gt;</content:encoded>
  </item>
</rdf:RDF>
