はてなキーワード: .bookとは
非常に心がざわつく。
酷いこと言うんだな、とか、いや何かわざとショッキングに伝えてない?とか、
なんだ関係ない写真は、とか、これで文春は何億も稼ごうとしてるんだなとか、いろいろ感じたりする。
ブコメで、したり顔が見えてきそうな人に、反論したくなっちゃったり、
でも、やっぱ、そんなこと自分の人生の時間であんまり意味ないよね。
ということで、「uBlockOrigin」というツールをブラウザに入れて、
とても心が穏やかです。
ーーーーーーーーーーーーーーーーーーーーーーーーーーー
hatena.ne.jp##li.EntryList_entryListItem__1vXtf:has-text(人志)
b.hatena.ne.jp##.js-keyboard-selectable-item:has-text(人志)
b.hatena.ne.jp##li.js-keyboard-selectable-item.entrylist-image-entry.cat-entertainment:has-text(人志)
b.hatena.ne.jp##.entrylist-header-main > .js-keyboard-selectable-item.entrylist-image-entry.cat-entertainment:has-text(人志)
www.hatena.ne.jp##li.AnondEntry.EntryList_entryListItem__1vXtf:has-text(人志)
www.hatena.ne.jp##li.EntryList_entryListItem__1vXtf:has-text(人志)
news.yahoo.co.jp##.newsFeed_item_link:has-text(人志)
hatena.ne.jp##li.BookmarkEntry.EntryList_entryListItem__1vXtf:has-text(女性自身)
1 気になってる人が男じゃなかった ttps://comic.pixiv.net/viewer/stories/142066
ただの百合だった。来るとは思えない。
2 猫に転生したおじさん ttps://yajimasyoukai.blog.jp/archives/22265291.html
ただのおじさんの顔がうるさいホモだった。来るとは思えない。
3 幼稚園WARS ttps://shonenjumpplus.com/episode/4855956445109234830
ただの主人公TUEEEEだった。来るとは思えない。
4 訳アリ心霊マンション ttps://kuragebunch.com/episode/3270296674343531283
ここまで酷かったのでちゃんと起承転結で漫画になってるから驚いた。来るほどとは思えない。
5 お前、タヌキにならねーか ttps://comic.pixiv.net/viewer/stories/94699
猫に転生したおじさんよりは面白かった。来るほどとは思えない。
6 拷問バイト君の日常 ttps://younganimal.com/episodes/c44e40bd07ed7
イケメンが会話してるだけだった。来るとは思えない。
7 放課後ひみつクラブ。ttps://shonenjumpplus.com/episode/316112896941522424
ヒロインは本当の美少女で女装じゃなかった。ちゃんとした漫画してるので来る可能性はある。
8 アフターゴッド ttps://urasunday.com/title/1755
なんか凄そうな漫画だった。来るのかも知れない。
9 悪役令嬢の中の人~断罪された転生者のため嘘つきヒロインに復讐いたします~ ttps://comic.pixiv.net/viewer/stories/106531
タイトルの印象よりも丁寧な作りだった。来るのかは分からない。
10バンオウ-盤王- ttps://shonenjumpplus.com/episode/316190247030932381
要素詰め込んでるけど目が滑るってほどではなかった。ちゃんと頑張れば来る可能性はある。
1 生徒会にも穴はある! ttps://viewer-trial.bookwalker.jp/03/15/viewer.html?cid=f57f295f-d33b-4dbf-972a-794c292fb62f&cty=1
これだけはちょっと反則しますね。なんでかって言うとこの漫画が伸びた理由が「作者の分身とも言えるキャラクター(いわゆる"ウチの子")をそのまま作品に出してるんだけど、このキャラって作者のエロアカウントで獣姦とかもされてたかなりピーキーな立ち位置のキャラですよね?」っていう部分がバズりの原動力になっているのでそのキャラがまだ出てきてない1話をそのまま貼っても意味ないので。えっと2巻の表紙になってるこの「こまろ」ってキャラがそうなんですけど、このキャラが出てきた時に界隈は明らかに「え??これ出すの???え???アリなの???」と騒然としたんですよね。あっ……でも今検索しようとしたら出てこない……え嘘……情報統制みたいのかかってる?マジ??でもここまで書いた増田消すの面倒くさいからこのまま残しますけど、この辺の話はあんましないほうがいいっぽいので皆さん気をつけてくださいね。
2 黄泉のツガイ ttps://www.ganganonline.com/title/1327/chapter/53533
絵を見ただけで来るのは明白ですね。作者実績で殿堂入りという名のハブを導入したほうがいいんじゃないですか?
3 一ノ瀬家の大罪 ttps://shonenjumpplus.com/episode/4856001361517909894
タコピー鬼つええ!別にこの漫画にはタコピー出てこないしジャンプ読者からはタコピーで上がったハードルの下をくぐってる扱いされまくってるのにこんなに伸びるとかすげえ!!!
4 暗号学園のいろは ttps://shonenjumpplus.com/episode/316190246981910093
原作者のネームバリューで殿堂入りとか導入したらいいんじゃないですか?
5 すだちの魔王城 ttps://pocket.shonenmagazine.com/episode/3269754496526909416
主人公の不快感が薄い。ヒロインが可愛いい。この2つの要素は大事ですよね。
6 多聞くん今どっち!? ttps://www.cmoa.jp/bib/speedreader/?cid=0000236863_jp_0001&u0=1&u1=0&rurl=https%3A%2F%2Fwww.cmoa.jp%2Ftitle%2F236863%2F
7 ダイヤモンドの功罪 ttps://tonarinoyj.jp/episode/4855956445056488441
1話の盛り上がりだと今回の20作品でトップな感じじゃないですか?次に来そうな漫画の青田買いってコンセプトと噛み合ってるのはこういう漫画だと思います。
8 帝乃三姉妹は案外、チョロい。 ttps://www.sunday-webry.com/episode/3269754496643512580
凄くサンデーっぽい漫画だと思ったらサンデーっぽい漫画で過去に当ててきた人だった。
9 極楽街 ttps://jumpsq.shueisha.co.jp/rensai/gokurakugai/read/
10 あそこではたらくムスブさん ttps://www.sunday-webry.com/episode/3269754496551508754
ここ1年で初めてはてなブックマーク日毎の総合人気エントリ入りしたドメインからのホットエントリ、ブクマ数順トップ30
ブクマ数 | タイトル | ドメイン |
---|---|---|
1376 | Prompt Engineering Guide – Nextra | www.promptingguide.ai |
1323 | 独身男性の最近のつくりおき - #つくりおき | tsukurioki.hatenablog.com |
1205 | DON'T SAY YES | mindhack.xyz |
1096 | 良さが分からない名盤(30−1位)(後編) | www.zippu21.com |
1013 | 離乳食提供開始の反響を受けまして | Soup Stock Tokyo(スープストックトーキョー) | www.soup-stock-tokyo.com |
995 | 日常会話はなぜ成り立つのか? 「究極のフリースタイル」である言語を考える【いとうせいこう×ライムスター宇多丸・対談】 | 対談・鼎談 | Book Bang -ブックバン- | www.bookbang.jp |
938 | ニュース :: 【研究発表】昆虫学の大問題=「昆虫はなぜ海にいないのか」に関する新仮説 | www.tmu.ac.jp |
890 | GPT-1→GPT-2→GPT-3→GPT-3.5→ChatGPT→GPT-4までの進化の軌跡と違いをまとめてみた|スタビジ | toukei-lab.com |
888 | 人生を仕組み化していったら結婚できた件 - Amosapientiam | yuchiki1000yen.hatenablog.com |
789 | 後輩が配達先で立ちションした件で、ミーティングした日の話 | twister | makiya-twister.com |
785 | ダイエー写真集 | d-gallery.nakauchi.com |
724 | 日立製作所「同期SEの2割が、病気休職か治療中」――労務管理システムをハックして改ざん、360度評価は機能せず | www.mynewsjapan.com |
712 | 国内のクラフトビール業界が抱えるジレンマ | kyotobrewing.com |
675 | 葱ダシの作り方 - /var/lib/azumakuniyuki | azumakuniyuki.hatenablog.com |
663 | 東大理Ⅲにお子さんが4人受かったお母さんの、例の教育法を受けて育った一般人の感想 | webcache.googleusercontent.com |
651 | ソシャゲ運営を8年やって感じた、良いところと悪いところ - 音速きなこおはぎ | eihigh.hatenablog.com |
645 | 論文読みの日課について - ジョイジョイジョイ | joisino.hatenablog.com |
638 | ラッコの水槽にiPhoneを落としてしまい、ラッコにより徹底的に叩き割られる | epinesis.net |
638 | Suicaの新改札システムはようやっとキタ感が強いよねって話とか何ができるようになるのかとか耐障害性の話。 - O-Lab +Ossan Laboratory+ | ossan.hatenablog.com |
631 | Linux におけるファイル I/O の基礎 | itkq.jp |
584 | Cache Storage がめちゃくちゃ肥大化する問題について調べる | ぴんくいろにっき | blog.hinaloe.net |
574 | Stable Diffusionでハイクオリティなリアル系イラストを生成できるモデル、LoRAを紹介 | Murasan Lab | murasan-net.com |
569 | 更地にした土地の固定資産税が、意外な金額だった - 薬指のブログ | kusuriyubino.hatenablog.com |
569 | 【著作権侵害】NHKによる無断転載の詳細と裁判結果のご報告|将棋講座ドットコム | xn--pet04dr1n5x9a.com |
537 | フェスガチ勢が「疲れにくい」と太鼓判を押すスニーカー「ホカオネオネ」がやっぱりほしい #楽天お買い物マラソン #ソレドコ - ソレドコ | soredoko.jp |
503 | GPT作曲くん | compose.yumetaro.info |
502 | 生成系AI(ChatGPT, BingAI, Bard, Midjourney, Stable Diffusion等)について | utelecon.adm.u-tokyo.ac.jp |
499 | Vol.107 | PIZZA OF DEATH RECORDS | www.pizzaofdeath.com |
482 | ChatGPT英語例文自動添削プロンプト | yanase-yosuke.blogspot.com |
481 | 年収1500万円だけど「ペットボトルは買わずに水筒持参。徒歩20分以内なら電車に乗らない」と語る女性(2023年3月31日)|BIGLOBEニュース | news.biglobe.ne.jp |
480 | なぜHTMLだけなのか。拙著「武器になるHTML」の執筆を通して伝えたかったこと - Shibajuku | shibajuku.net |
480 | 三菱重工 | 社名変更のお知らせ | www.mhi.com |
普段から俺様が使っているスクリプトあるから、公開してほめちぎってもらうぞー!
出力はただの文字列だから音声読み上げアプリでも何でも、突っ込んで遊んでくれ。
jq必須です。
ログインせず使うので当然アカウント固有の非表示設定とかは動きません。
あれなIDのコメントも全部所得することになるのでご注意ください。
まあそこらへんはsedでも使って気に入らないidの行を勝手に削除してくれ
hatebu_comment.sh
#!/bin/bash if [[ "$1" =~ ^http ]];then : # Success else echo "Error: 引数に指定したURLのブックマークのコメント一覧を取得するやーつ" echo "例: ./hatebu_comment.sh 'https://www3.nhk.or.jp/news/html/20200405/k10012369381000.html' | less" exit; fi if [[ "$1" =~ b.hatena.ne.jp/entry/s ]];then # はてブページのURLでも動作するように url="https://$(echo $1 | sed -e 's@.*/entry/s/@@')" else url=$1 fi if ! jq --version > /dev/null ;then echo "Error: jqがインストールされていません" exit; fi curl -s "https://b.hatena.ne.jp/entry/jsonlite/?url=$url" | jq '.bookmarks[] | if .comment != "" then ("「" + .user + "」 " + .comment) else empty end' | sed 's@^"@@g' | sed 's@"$@@g'
aa ʕ•̫͡•ʕ•̫͡•ʕ•̫͡•ʕ•̫͡•ʕ•̫͡•ʕ•̫͡•ʔ
じゃなくて
aa ʕ•̫͡•ʕ•̫͡•ʔ•̫͡•ʔ•̫͡•ʕ•̫͡•ʔ•̫͡•ʔ
にしたい
javascript:(function (d, lowerThan, count) { const MinimumRequiredLength = 33; let currentCount = count(); const elem = d.querySelectorAll(".bookmarkadd-comment-form")[0]; if (!elem) { return; } if (lowerThan(count(), MinimumRequiredLength)) { if (elem.value.slice(-1) !== " ") { elem.value += " "; currentCount += 1; } } if (lowerThan(count(), MinimumRequiredLength)) { const kumas = ['ʕ•̫͡•', 'ʔ•̫͡•']; const indexes = '001101'; for (let i = 0; i === 0 || (lowerThan(currentCount + i * 5, MinimumRequiredLength) || currentCount + i * 5 === MinimumRequiredLength); i++) { elem.value += kumas[indexes[i % 6]]; } elem.value += 'ʔ'; elem.dispatchEvent(new Event("input")); } })(document, function(a, b) { return Math.floor(b / a) !== 0 }, function() { return Number(document.querySelectorAll('.js-bookmarkadd-comment-count')[0].innerText) || 0 } ); //add bear
こういう、特定の URL で特定の bookmarklet を呼び出す extension とか欲しい。これは用途に合わないけれど、クマを消すやつは自動で実行されてほしいものだろうし
クマが30匹程度では建設的と判定されないことがあるようなので、そんな時は
const MinimumRequiredLength = 30;
の部分を変えてみてください。
その際は、ドラッグし直すのでなく、
追加済みのブックマークレットを右クリック→「編集」で、30の部分だけ書き換えればOKです。
追記ここまで
https://anond.hatelabo.jp/20210803012020
に刺激を受けて作りました。
https://b.hatena.ne.jp/entry/4706344345181168386/comment/new3
で、書き込み時の自動クマ補完について書かれてたので、それを実装しました。
以下の文字列を選択して、Chromeのブックマークバーにドラッグしてください。
javascript:(function () { const MinimumRequiredLength = 30; const currentCount = Number(document.querySelectorAll(".js-bookmarkadd-comment-count")[0].innerText); if (Math.floor(MinimumRequiredLength / currentCount) !== 0) { const elem = document.querySelectorAll(".bookmarkadd-comment-form")[0]; if (elem.value.slice(-1) !== " ") { elem.value += " "; } const loopNum = Math.ceil((MinimumRequiredLength - currentCount) / 5); for (let i = 0; i !== loopNum; i++) { elem.value += "ʕ•̫͡•"; } elem.value += "ʔ"; elem.dispatchEvent(new Event("input")); } })();
「_5)」みたいな変な名前で追加されるので、右クリック→「編集」から好きな名前に変えてください。(addBearとか)
はてブのコメント書き込み画面でブックマークレットをクリックしてください。
これで追加したクマを、コメント一覧画面で削除するためのブックマークレットは、
javascript:(function () { document.querySelectorAll(".entry-comment-text").forEach(function (e) { e.innerText = e.innerText.replace(/[ʕ•̫͡•ʔ]+$/, ""); }); })();
です。
セットでお使いください。(名前はremoveBear?)
私はクマで埋めることはしないのですが、埋めたい人もいるでしょうから、道具としてはあればよいと思いました。
最後のクマだけ左頬のパーツを変えて……、など10秒くらい掛けてると思うのです。
その間、「ああ……またこんな作業をして……私ったら承認欲求の塊なのかしら、いやらしいわ」と自己嫌悪してたら可哀想なので、
少しでもネガティブな時間が短くなるよう、活用してみてください。
数日前に puppeteer で自動で PDF にする試みを書いたブログがホッテントリに入ってるのを見た
bg.js
const username = "" const api_key = "" chrome.runtime.onMessage.addListener((message, sender, sendResponse) => { if(message.bookmark){ bookmark(message.bookmark) } }) async function bookmark(url){ fetch("http://b.hatena.ne.jp/atom/post", { method: "POST", referrer: "no-referrer", headers: { Accept: "application/x.atom+xml, application/xml, text/xml, */*", "X-WSSE": await createCredential(), }, body: ` <entry xmlns="http://purl.org/atom/ns#"> <link rel="related" type="text/html" href="${url}" /> </entry> `.replace(/\t/g, ""), }).then(e => {console.log(e)}) } async function createCredential(){ const non = Math.random().toString(36).substr(2) const now = new Date().toISOString() const buf = new TextEncoder().encode(non + now + api_key) const u8a = new Uint8Array(await crypto.subtle.digest("SHA-1", buf)) const str = Array.from(u8a, e => String.fromCharCode(e)).join("") const b64 = btoa(str) return `UsernameToken Username="${username}", PasswordDigest="${b64}", Nonce="${btoa(non)}", Created="${now}"` }
username と api_key を埋めてバックグラウンドで動かす
page.js
chrome.runtime.sendMessage({ bookmark: location.href })
ページ内で動かすコード
こういう感じ http://i.imgur.com/LCbUGwe.png
// ==UserScript== // @name metaBKM // @include http://b.hatena.ne.jp/entry/* // @version 1 // @grant none // ==/UserScript== (function(){ function make(){ var list = document.querySelectorAll('#public-bookmarks .bookmark-list > li'); for(var i = 0;i < list.length;i++){ var commentLink = list[i].querySelector('.user-comment-link'); if(!commentLink) {continue;} var bkmImg = 'http://b.hatena.ne.jp/entry/image/' + commentLink.href; var img = document.createElement('img'); var a = document.createElement('a'); img.setAttribute('src',bkmImg); a.setAttribute('href','http://b.hatena.ne.jp/entry/' + commentLink.href.replace(/.*?\/\//,'')); a.appendChild(img); var parentElm = list[i].querySelector('span'); parentElm.insertBefore(a, parentElm.children[2]); } } function check(){ if(document.querySelector('.commentlist-loading')){ return false; } else { return true; } } var timer = setInterval(function(){ if(check()) { console.log(check()); make(); clearInterval(timer); } }, 1000); })();
・コメントが3行なのを一行に戻す。
・コメントがない行を消す
.nocomment{display:none;}
.bookmark-list span.comment { display: inline; }
.bookmark-list img.profile-image { width:18px; height:18px; }
■参考
http://hatena.g.hatena.ne.jp/hatenabookmark/20110405/1301981564
http://hibari.2ch.net/test/read.cgi/esite/1300432939/23-26
23 :名無しさん@お腹いっぱい。:2011/04/06(水) 11:48:38.71
/*サイドバー非表示*/
#container .curvebox-body { padding:20px; }
#sidebar { display:none; }
.bookmark-list li { padding-left: 20px; }
.bookmark-list img.profile-image { width:18px; height:18px; }
.bookmark-list span.comment { display: inline; }
/*ブクマ用フォーム非表示*/
#add-bookmark-container { display:none; }
/*人気コメント非表示*/
#scored-bokkmarks { display:none; }
https://gist.github.com/903132 を組み合わせて
ブクマ追加は[B!]アイコンからにするとこれまでに近い表示に。
26 :名無しさん@お腹いっぱい。:2011/04/06(水) 11:59:27.60
#scored-bookmarks { display:none; }
http://b.hatena.ne.jp/entry/hatena.g.hatena.ne.jp/hatenabookmark/20110405/1301981564
https://addons.mozilla.org/ja/firefox/addon/stylish/
見た目だけ変えてみたぞ。
あんまりいいもんじゃないと思うけど、サイドバーがなくなったらどんな感じになるか体験してみるといいんじゃないかな。
まあどんなもんかやってみて。叩き台、印象の変化の確認。
あとおまけでスター順の部分は消しておいた。#scored-bookmarksってあるだろ、そこじゃ。
@namespace url(http://www.w3.org/1999/xhtml); @-moz-document url-prefix("http://b.hatena.ne.jp/entry/") { #container .curvebox-body { padding-right:20px !important; } #main, #sidebar { width:100% !important; float:none !important; } #sidebar { margin-left:0 !important; } #scored-bookmarks{ display:none !important; } }
http://b.hatena.ne.jp/entry/lifehack2ch.livedoor.biz/archives/51229298.html
うりゃ!
@namespace url(http://www.w3.org/1999/xhtml); @-moz-document url-prefix("http://b.hatena.ne.jp/entry/") { #container .curvebox-body { padding-right:20px !important; } #main, #sidebar { width:100% !important; float:none !important; } #sidebar { margin-left:0 !important; } #scored-bookmarks{ display:none !important; } .comment { display:inline !important; } .bookmark-list .profile-image { width:16px!important; height:16px!important; margin-left:-24px!important; } .user-navigator.user-navigator-large { width:34px!important; height:20px!important; } .bookmark-list li {padding-left:32px!important;} }
すべて、ゴリゴリとプログラムを作りこんでは、ネット上にサービスを公開する形でサイトを公開している。
ブログとかで色々な情報発信・・・は、十何年前に自分にはできない・・とあきらめたからだ。
(一日に、1個の投稿をする・・など自分にはできない。)
サイトのアイデアを思いついたら、短期間集中して作りこみを行い、完成したら公開、このスタイルが自分には一番合っている。
公開したサイトが、役に立ちそうかどうかの判断は、ブックマークしていただいた件数を見て判断している。
しかし、はてぶの新着には、一度も表示されたことが無い。
なぜか、サイトへの訪問者が少ない&ブックマークしてもらえる時期が短期間ではないからしょうがないのだけれでも・・。
(新規登録~短期間で複数のブックマークされないと新着には上がらない)
しょうがないといえばしょうがないな・・・。
twitterでも、サイトをつぶやいてみた、でも訪問者少なかった(フォロアーがロボット収集されたフォロアーだからしょうがないか)
今までのところ
はてぶ・・4件(内1件自分)
www.mixclips.org・・mixclips・・1件
はてぶ 見てると、一日で、何十~何千のブックマークされるページがあるけど、すごいな・・。
さて、6月20日に公開してから、20日間過ぎたけど、はたしてこのサイトに未来はあるのでしょうか・・?
でも、一回公開しちゃったら、利用する方がいる間はなかなかサービス止めれないしな・・・。
一度でいいから、はてぶの新着 トップページに 載ってみたい。
ニッチなサービスだし、需要が少ないことはわかってはいるのだけれでも・・。
サイト作っていて、一番の励ましは、アクセスしかないんだよな・・。
さ、気分一新、本業の3k職である開発に戻ろう・・。
おそらく一昨日の激しいMOJIBAKE不具合の発生原因となった修正によると思われる、キーワードがアンカー文字列にあるとそこからキーワードリンクにされてしまう、という別の不具合が発生している。
+[http://anond.hatelabo.jp/:title=はてな匿名ダイアリー] +<a href="http://anond.hatelabo.jp/">はてな匿名ダイアリー</a> +[http://anond.hatelabo.jp/:title=はてな匿名ダイアリー] +[http://anond.hatelabo.jp/:title=これがはてな匿名ダイアリーの姿] +[http://anond.hatelabo.jp/:title]
5番目のパターンは、多くの文字の数値文字参照化と取得した文字との関係で起こっている現象であろうと、たとえば「YouTube - Broadcast Yourself([http://www.youtube.com/:title])」等から推察できる。
+http://www.hatelabo.jp/ +http://anond.hatelabo.jp/ +[http://www.hatelabo.jp/:title=http://www.hatelabo.jp/] +[http://anond.hatelabo.jp/:title=http://anond.hatelabo.jp/] +[http://anond.hatelabo.jp/:title=http://www.hatelabo.jp/] +[http://www.hatelabo.jp/:title=http://anond.hatelabo.jp/]
例えばwwwとこのエントリー内に書いてありキーワードリンクが発生している条件では、上記の内容が下記のようなリンクになる。
この時、ASCII文字によるanondもキーワードである事に注意。
これは若干異なるものの、以下のように連続した英数字からなる文字列の場合は途中でキーワードリンクにならないが、他の場所でキーワードリンクとなってる文字列の場合はキーワードリンクとなる従来の仕様の影響かもしれない。
このほか従来からのpタグ(下記参照)に加え、&や>(ASCII文字による&と>)等の不具合も出ている。
<p>
しかし、この修正でhttp://anond.hatelabo.jp/20070129012129と同一の内容であっても、多くのキーワードが正常にリンクされるようになった。
OK
C# $10 (T_T) *ist D +ANIMA yes,mama ok -196℃ .book c/w :active ave;new アンリ・カルティエ=ブレッソン ?B @CHaT [TV] ^H _no PE`Z ||リ・_・`川
AirH" AirH" 女子高生 GIRL'S-HIGH 女子高生 GIRL'S-HIGH MÄR MÄR (*゚∀゚)ノ パキャッ (*゚∀゚)ノ パキャッ
文字参照に変換されるため双方上と同様に
P&G
含むキーワードを見つけられず
% \ { } ~
キーワード関連
また、近い問題としてhttp://anond.hatelabo.jp/20070328234724もあげておく。修正されていた。
結論としてエスケープは面倒臭
o 21 !K7
22 AirH"
o 22 AirH"
22 AirH&quot;
o 23 C#
o 24 $10
26 R&B
o 26 R&B
27 B'z
27 B'z
o 28 (T_T)
o 29 (T_T)
o 2a *ist D
o 2c yes,mama ok
o 2e .book
x 2f c/w
o 3a :active
3c のどごし<生>
3c のどごし<生>
3e のどごし<生>
3e のどごし<生>
x 3f ?B
o 40 @CHaT
o 5b [TV]
5c \
o 5d [TV]
^H
o 5f _no
o 60 PE`Z
7b {
o 7c ||リ・_・`川
7d }
7e ~
MÄR
o MÄR
(*゚∀゚)ノ パキャッ
P&G
P&G
結局概要表示機能追加した。unsafeWindow使いまくり。大丈夫かいな。
// ==UserScript== // @name Hatena Bookmark Tree Expander // @namespace http://anond.hatelabo.jp/ // @include http://b.hatena.ne.jp/entry/* // ==/UserScript== // <div class="info"> // <ul id="similar_entries" class="bookmarklist"> // <li></li> // </ul> // </div> // <div class="info"> // <ul id="referred_entries" class="bookmarklist"> // <li id="referred-entry-\d+"></li> // </ul> // </div> // <div class="info"> // <ul id="relation_diary" class="bookmarklist"> // <li id="diary-{id}-\d+"></li> // </ul> // </div> (function() { function main() { loadBookmarkCommentViewer(); similar.prototype.rootAppend(); referred.prototype.rootAppend(); } function HBTM(target) { this.target = target; this.targetXPath = "//ul[@id='"+target+"']/li"; this.targetRegExp = new RegExp('<ul id="'+target+'"(.|\\s)*?</ul>'); } HBTM.prototype = { openIcon: '<img width="15" height="15" class="icon" style="opacity: 0.6" src="http://anond.hatelabo.jp/images/common/open.gif"/>', closeIcon: '<img width="15" height="15" class="icon" style="opacity: 0.6" src="http://anond.hatelabo.jp/images/common/close.gif"/>', loadingIcon: '<img width="13" height="13" class="icon" src="http://anond.hatelabo.jp/images/common/loading.gif"/>', commentIcon: function(url) { return '<img class="hatena-bcomment-view-icon" src="http://r.hatena.ne.jp/images/popup.gif" onclick="iconImageClickHandler(this, \''+url+'\', event);">' }, create: function() { this.comment = document.createElement("span"); this.comment.innerHTML = this.commentIcon($X("string(descendant::a/@href)", this.node).value()); this.open = document.createElement("a"); this.open.href = "javascript:void(0)"; this.open.innerHTML = this.openIcon; this.close = document.createElement("a"); this.close.href = "javascript:void(0)"; this.close.innerHTML = this.closeIcon; this.close.style.display = "none"; this.loading = document.createElement("span"); this.loading.innerHTML = this.loadingIcon; this.loading.style.display = "none"; this.node.appendChild(this.comment); this.node.appendChild(document.createTextNode(" ")); this.node.appendChild(this.open); this.node.appendChild(this.close); this.node.appendChild(this.loading); this.open.addEventListener("click", bind(this.openAct, this), false); this.close.addEventListener("click", bind(this.closeAct, this), false); }, openAct: function() { this.open.style.display = "none"; if (this.tree) { this.tree.style.display = "block"; this.close.style.display = "inline"; } else { this.loading.style.display = "inline"; this.load(); } }, closeAct: function() { if (this.tree) { this.tree.style.display = "none"; this.close.style.display = "none"; this.open.style.display = "inline"; } }, load: function() { var url = $X("string(descendant::a[starts-with(@href, '/entry/')]/@href)", this.node).value(); GM_xmlhttpRequest({ method: "GET", url: "http://b.hatena.ne.jp"+url, onload: bind(this.loadCallback, this) }); }, loadCallback: function(result) { var match = result.responseText.match(this.targetRegExp); if (match) { var sandbox = document.createElement("div"); sandbox.innerHTML = match[0].replace(this.target,""); this.tree = sandbox.firstChild; } else { this.tree = document.createElement("ul"); } this.append(); this.loading.style.display = "none"; this.close.style.display = "inline"; }, append: function() { this.tree.style.backgroundColor = "transparent"; this.tree.style.listStyleType = "circle"; this.node.appendChild(this.tree); $X("li", this.tree).each(function(n) { var a = $X("a",n).node(); var c = $X("count(//li/a[@href='"+a.href+"'])").value(); if (c > 1) n.parentNode.removeChild(n); }); $X("li", this.tree).each(bind(function(node){new this.constructor(node)}, this)); }, rootAppend: function() { $X(this.targetXPath).each(bind(function(node){new this.constructor(node)}, this)); } }; function similar(node) { this.node = node; this.create(); } similar.prototype = new HBTM("similar_entries"); similar.prototype.constructor = similar; function referred(node) { this.node = node; this.create(); } referred.prototype = new HBTM("referred_entries"); referred.prototype.constructor = referred; function loadBookmarkCommentViewer() { var head = document.getElementsByTagName("head")[0]; var script = document.createElement("script"); script.type = "text/javascript"; script.src = "http://b.hatena.ne.jp/js/BookmarkCommentViewerAllInOne.1.2.js"; head.appendChild(script); var css = document.createElement("link"); css.rel="stylesheet"; css.href="http://d.hatena.ne.jp/css/base.css"; css.type="text/css"; css.media="all"; head.insertBefore(css, head.firstChild); window.addEventListener("load",function(){ var BCV = unsafeWindow.BookmarkCommentViewer; BCV.options['screenshot'] = true; var asyncCommnetView = BCV.asyncCommnetView; BCV.asyncCommnetView = function(url, onCompleteCallback) { var div = asyncCommnetView(url, function(){ onCompleteCallback.apply(this, arguments); new unsafeWindow.Ten.XHR("http://b.hatena.ne.jp/entry/rss/"+url, {}, function(result) { if (! result.responseText.match(/<description>(.*?)<\/description>/)) return; if (! RegExp.$1) return; // var desc = document.createTextNode("desc: "+RegExp.$1); var desc = document.createElement("li"); desc.appendChild(document.createTextNode("desc: "+RegExp.$1)); div.lastChild.insertBefore(desc,div.lastChild.getElementsByTagName("li")[0]); }); }); return div; }; BCV.asyncCommnetView.origin = asyncCommnetView; }, false); } function bind(f,o) {return function() {return f.apply(o, arguments)}} function $X(xpath, context) { if (!(this instanceof $X)) return new $X(xpath, context); this.xpath = xpath; this.context = context || document; } $X.prototype = { evaluate: function() { var result = document.evaluate(this.xpath, this.context, null, this.type, null); switch (result.resultType) { case XPathResult.STRING_TYPE : return result.stringValue; case XPathResult.NUMBER_TYPE : return result.numberValue; case XPathResult.BOOLEAN_TYPE: return result.booleanValue; case XPathResult.FIRST_ORDERED_NODE_TYPE: return result.singleNodeValue; } return result; }, node: function() { this.type = XPathResult.FIRST_ORDERED_NODE_TYPE; return this.evaluate(); }, value: function() { this.type = XPathResult.ANY_TYPE; return this.evaluate(); }, each: function(func) { this.type = XPathResult.ORDERED_NODE_SNAPSHOT_TYPE; var result = this.evaluate(); for (var i=0; i<result.snapshotLength; i++) func(result.snapshotItem(i)); } }; main(); })();