Movatterモバイル変換


[0]ホーム

URL:


はてラボはてな匿名ダイアリー
ようこそ ゲスト さんログインユーザー登録
< ■ |■ >

2008-07-22

[greasemonkey]関連エントリーのツリーをたどれるグレモン

結局概要表示機能追加した。unsafeWindow使いまくり大丈夫かいな。

// ==UserScript==// @nameHatenaBookmarkTree Expander// @namespacehttp://anond.hatelabo.jp/// @includehttp://b.hatena.ne.jp/entry/*// ==/UserScript==// <div class="info">//   <ulid="similar_entries" class="bookmarklist">//     <li></li>//   </ul>// </div>// <div class="info">//   <ulid="referred_entries" class="bookmarklist">//     <liid="referred-entry-\d+"></li>//   </ul>// </div>// <div class="info">//   <ulid="relation_diary" class="bookmarklist">//     <liid="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 = newRegExp('<ulid="'+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() {varurl = $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() {varhead = document.getElementsByTagName("head")[0];varscript = document.createElement("script");script.type = "text/javascript";script.src = "http://b.hatena.ne.jp/js/BookmarkCommentViewerAllInOne.1.2.js";head.appendChild(script);varcss = 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);}functionbind(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();})();

Permalink |記事への反応(1) | 01:37

このエントリーをはてなブックマークに追加ツイートシェア

記事への反応 -

記事への反応(ブックマークコメント)

全てのコメントを見る

人気エントリ

注目エントリ

ログインユーザー登録
ようこそ ゲスト さん
Copyright (C) 2001-2025 hatena. All Rights Reserved.

[8]ページ先頭

©2009-2025 Movatter.jp