There are 6 previous versions of this script.
// ==UserScript==
// @name amazon_cross_meter
// @namespace http://web.zgo.jp/
// @include http://www.amazon.co.jp/*
// @description Amazonの書籍ページに読書メーターの感想を表示
// ==/UserScript==
(function () {
/* config */
var defalutView = true;// レビューエリアの表示/非表示
var defalutURL = true;// ジャンルがよく分からないときの場合、trueなら読書メーター、falseならゲームメーター
var insertPoint = document.getElementById("handleBuy");//上の方に表示
//var insertPoint = document.getElementById("customerReviews");//カスタマーレビューの位置に表示
/* end config */
var GAMEMETER = "http://gamemeter.net";
var BOOKMETER = "http://book.akahoshitakuya.com";
var appear = "display:block;"
var hidden = "display:none;"
var contentView = defalutView;
var XPath = {
cache: null,
reset: function () {
this.cache = {__proto__: null};
},
get: function (context, expr, type) {
var x = new XPathEvaluator();
var cache = this.cache, evaluator;
if (expr in cache) {
evaluator = cache[expr];
} else {
evaluator = cache[expr] = x.createExpression(expr, null);
}
return evaluator.evaluate(context, type, null);
},
has: function (context, expr) {
return this.get(context, expr, XPathResult.BOOLEAN_TYPE).booleanValue;
},
first: function (context, expr) {
return this.get(context, expr, XPathResult.FIRST_ORDERED_NODE_TYPE).singleNodeValue;
},
last: function (context, expr) {
var all = this.get(context, expr, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE);
return all.snapshotItem(all.snapshotLength - 1) || null;
},
all: function (context, expr) {
var all = this.get(context, expr, XPathResult.ORDERED_NODE_ITERAATE_TYPE);
var ret = [];
for (var i; (i = all.iterateNext()) !== null;) {
ret.push(i);
}
return ret;
}
};
XPath.reset();
function createHTMLDocument(aText) {
var xsl = (new DOMParser()).parseFromString(["<?xml version='1.0'?>", "<stylesheet version='1.0' xmlns='http://www.w3.org/1999/XSL/Transform'>", "<output method='html' />", "</stylesheet>"].join("\n"), "text/xml");
var xsltp = new XSLTProcessor();
xsltp.importStylesheet(xsl);
var doc = xsltp.transformToDocument(document.implementation.createDocument("", "", null));
var range = doc.createRange();
doc.appendChild(doc.createElement("html"));
range.selectNodeContents(doc.documentElement);
doc.documentElement.appendChild(range.createContextualFragment(aText));
return doc;
}
function toggleButtonEventLiner(){
var toggleArea = document.getElementById("meter_review_main");
if(contentView){//ボタンが内容が表示されてる時
contentView = false;
toggleArea.setAttribute("style", hidden);
}else{
contentView = true;
toggleArea.setAttribute("style", appear);
}
}
/* ジャンルID取得 */
function getGenreID(){
if(XPath.has(document, 'id("navSubnav")//td[@class="navSubnavCell"]/a[starts-with(text(),"機種") or starts-with(text(),"ジャンル")]')){
var nodeTag = XPath.first(document, 'id("navSubnav")//td[@class="navSubnavCell"]/a[starts-with(text(),"機種") or starts-with(text(),"ジャンル")]')
if(nodeTag.getAttributeNode('href').value.match(/node=([^&\"]+)/)){
return RegExp.$1;
}
}else{
return null
}
}
requestCrossreview = function () {
var asin = document.getElementById("ASIN") ? document.getElementById("ASIN").value : null;
if (!asin) {
return;
}
var genreID = getGenreID();
//console.log(genreID);
genreID = parseInt(genreID);
//アマゾン(Amazon.co.jp)のブラウズノード(Browse Node)一覧 [ http://aws.pheelo.info/browse-node/ ]
if(genreID == 465610 || genreID == 52231011){//本&洋書
var XHRURL = BOOKMETER;
var XHRURL_method = XHRURL + "/b/";
}else if(genreID == 637872 || genreID == 637642){
var XHRURL = GAMEMETER;
var XHRURL_method = XHRURL + "/g/";
}else{
if(defalutURL){//読書メーター
var XHRURL = BOOKMETER;
var XHRURL_method = XHRURL + "/b/";
}else{
var XHRURL = GAMEMETER;
var XHRURL_method = XHRURL + "/g/";
}
}
var opt = {
method : "get",
url : XHRURL_method + asin,
onload : function (detail) {
var res = createHTMLDocument(detail.responseText);
var reviewArea = res.getElementsByClassName("res_link_off");
var reviewAreaNum = reviewArea.length;
//邪魔な要素を隠す
if(reviewAreaNum > 0){
for (var i = 0; i < reviewAreaNum ; i++) {
var aTags = reviewArea[i].parentNode.getElementsByTagName("a");
for (var j = 0, l = aTags.length; j < l; j++) {
var tmp = aTags[j].href;
tmp = XHRURL + tmp;
aTags[j].href = tmp;
}
var imgTags = reviewArea[i].parentNode.getElementsByTagName("img");
for (var j = 0, l = imgTags.length; j < l; j++) {
var tmp = imgTags[j].src;
tmp = XHRURL + tmp;
imgTags[j].src = tmp;
imgTags[j].setAttribute("style", "border: 0px!important;");
}
var spanTags = reviewArea[i].parentNode.getElementsByTagName("span");
for (var j = 0, l = spanTags.length; j < l; j++) {
spanTags[j].setAttribute("style", "display:none;");
}
}
}
var divTag = document.createElement("div");
divTag.id = "meter_review";
var divTagMain = document.createElement("div");
divTagMain.id = "meter_review_main";
var toggleButton = <>
<div class="meter_review_button" id ="toggleButton">
<span id="meter_review__value">感想はありません</span>
</div>
</>;
divTag.innerHTML = toggleButton + '<a href ="'+ XHRURL_method + asin +'"><img src="'+XHRURL+'/image/favicon.ico" style="border: 0px;padding: 5px 0 5px 0;" /></a><br style="clear:both;" />';
var divReviewContent = document.createElement("div");
divReviewContent.id = "meter_content";
if(reviewAreaNum > 0){
if(defalutView){
contentView = true;;
divTagMain.setAttribute("style", appear);
}else{
contentView = false;
divTagMain.setAttribute("style", hidden);
}
var i = 0
for (var i = 0; i < reviewAreaNum; i++) {
var tmpObj = reviewArea[i].parentNode.cloneNode(true);
divReviewContent.appendChild(tmpObj);
}
}else{
contentView = false;
divTagMain.setAttribute("style", hidden);
}
divTagMain.appendChild(divReviewContent);
divTag.appendChild(divTagMain);
insertPoint.insertBefore(divTag, insertPoint.firstChild);
var button = document.getElementById("toggleButton");
if(reviewAreaNum > 0)
button.getElementsByTagName("span")[0].innerHTML =reviewAreaNum +"件の感想"
button.addEventListener("click", toggleButtonEventLiner, false);
}
};
GM_xmlhttpRequest(opt);
};
GM_addStyle(<><![CDATA[
#meter_content {
overflow:auto;
width:auto;
max-height:200px;
background-color:#f9f7ed;
letter-spacing: 1px;
margin:5px ;
padding:1px;
line-height:1.6;
}
#meter_review_main{
border:solid 1px #919191;
padding:1px;
background-color:#f9f7ed;
-moz-border-radius:10px;
}
.clear { /* generic container (i.e. div) for floating buttons */
overflow: hidden;
width: 100%;
}
#meter_review{
margin:5px 33px;
}
div.meter_review_button {
background: transparent url('data:image/gif;base64,R0lGODlhEgAwANUAAPj4+PX19dnZ2fLy8tHR0fv7++7u7re3t9jY2NbW1tPT09fX1/39/dDQ0Obm5uzs7Onp6c/Pz8zMzM7Oztzc3MXFxa+vr6ysrK2trc3NzcnJycLCwtLS0sjIyODg4L+/v/Dw8MrKytXV1cTExPz8/Lq6ut7e3tra2vr6+u/v79TU1Nvb2+Li4uvr66qqqurq6uHh4efn5+Tk5N/f393d3f///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAAAAAALAAAAAASADAAAAb/QJdwiDlUFo+acslckgYyjkXSalqZKNqBcu3WQJeF9xq4cMdN0KGKZtIkNYZ8Tq8DLI+Cfs/vFxoLAIKDhIUAMxUBiouMjQEvBwOSk5SVAykYBpqbnJ0GLRgvoqOkpS8eBzGqq6ytMSoVMrKztLUyRzC5uru8JngzwMHCwyFwNMfIyckqazXKz8cLZkrQyiphS9XHJx1bbsorIhkbU2xLQ0RGSFfoQkVHSVYZ8/QSHRsl5U0T/P3+Eh+8LYlAsKBBghqwKWnAsKHDhhKm1SBAsaJFiyGaKdjIsaPHDXBUiBxJsiQBPAlSqlzJMsGHBQhiypxJE4GGCgJy6tzJUwCHXgMrggodSnSFAAzaoK3AMKzpsAUHeEnl1aACi6tYs2plMWKBra+yPOBxQLas2bMT4LhaG4NCMwhw48qNy0KiKVMzFNZowbev3xgEBCp5QLgwBBYLNOhj0s7Fu3VWggAAOw==') no-repeat scroll top right;
color: #444;
display: block;
float: left;
font: normal 12px arial, sans-serif;
height: 24px;
margin-right: 6px;
padding-right: 18px; /* sliding doors padding */
text-decoration: none;
}
div.meter_review_button span {
background: transparent url('data:image/gif;base64,R0lGODlhLAEwANUAANbW1tjY2NHR0e7u7vv7+9DQ0NPT0+bm5v39/ezs7Onp6c/Pz87Ozs3Nzbe3t9fX18zMzNzc3MXFxaysrK2tra+vr8nJycLCwsrKytLS0r+/v/Dw8ODg4MjIyNra2tXV1d7e3rq6usTExO/v7/z8/Pr6+vj4+PX19fLy8tnZ2dTU1Nvb2+Li4uvr6+rq6uHh4efn5+Tk5N/f36qqqt3d3f///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAAAAAALAAAAAAsATAAAAb/wJpwWEs8JA7KbMlsOp/QqHRKrVqv2Kx2y+16v+AqsdaCVDIxFGnMbrvf8Lh8Tq/b7/i8fs/v+4URDjQlf4WGh4iJiouMjQ8TG42Sk5SVlpeUERMnmJ2en6Chki0OkaKnqKmqqhA0q6+wsbKGCRUmCLi5uru8vb6/wMHCw8TFxsfIycrLzM3LDwUE0tPU1dbX2Nna29zd3t/g4eLj5OXm5+YSMibs7e7v8PHy8/T19vf4+fr7/P3+/wADAnTg4oTBgwgTKlzIsKHDhxAjSpxIsaLFixgzatyokcIIFCBDihxJsqTJkyhTqlzJsqXLlzBjypxJsyZNCi0G6NzJs6fP/59AgwodSrSo0aNIkypdyrSp06dOHXBwQbWq1atYs2rdyrWr169gw4odS7as2bNo06KVoAKG27dw48qdS7eu3bt48+rdy7ev37+AAwseLPhIjMOIEytezLix48eQI0ueTLmy5cuYM2vezHlzLRAvQoseTbq06dOoU6tezbq169ewY8ueTbu2bdo1IGCQwbu379/AgwsfTry48ePIkytfzry58+fQoz8n40AFjevYs2vfzr279+/gw4sfT768+fPo06tfzz49oAkP2sufT7++/fv48+v/PuSR9f0ABijggAQWuB8RgXTggYEMNujggxDiN0YZFVzQwAcrRKjhhhx22P9gG0YgoUQYJJZo4okopqjiiiwuAeIRSbQo44w01mjjjShOaEYIF3QAQQNABinkkEQWaeSRSCap5JJMNunkk1BGKeWUVFapJIIOaAABA1x26eWXYIYp5phklmnmmWimqeaabLbp5ptwxqlmfxNYsMCdeOap55589unnn4AGKuighBZq6KGIJqrooowe+h4EBUQq6aSUVmrppZhmqummnHbq6aeghirqqKSWaqqo1GEgwKqsturqq7DGKuustNZq66245qrrrrz26uuvwPaa2wUGFGvsscgmq+yyzDbr7LPQRivttNRWa+212GarLba1CKDCt+CGK+645JZr7rnopqv/7rrstuvuu/DGK++89Mr7gAYA5Kvvvvz26++/AAcs8MAEF2zwwQgnrPDCDDfscMMSWBDAxBRXbPHFGGes8cYcd+zxxyCHLPLIJJds8skon+xABim07PLLMMcs88w012zzzTjnrPPOPPfs889ABy100BSksMLRSCet9NJMN+3001BHLfXUVFdt9dVYZ6311lxvTUGGHoYt9thk0+fAA9KlrfbabLft9ttwx32cBAXcZvfdeOet99589+03aw+IwMLghBdu+OGIJ6744ow37vjjkEcu+eSUV2755ZhfXgsHnXXu+eeghy766KSXHlluDByg+uqst+7667DHLvvstNduqPvtuOeu++689+77771TFwFhxBdv/PHIJ6/88szf9R4LCkQv/fTUV2/99dhnr/323Hfv/ffghy/++OSXb774dMqg1vrst+/++/DHL//8W2EpAAwt5K///vz37///AAygAAdIwAIa8IAITKACF8jABjrwgDqqgAUeAL0EWPCCGMygBjfIwQ568IMgDKEIR0jCEprwhChMoQpXCMIXiQhHMIyhDGdIQxMFAQA7') no-repeat;
display: block;
line-height: 14px;
padding: 5px 0 5px 18px;
}
div.meter_review_button:active {
background-position: bottom right;
color: #000;
outline: none; /* hide dotted outline in Firefox */
}
div.meter_review_button:hover {
cursor:pointer;
}
div.meter_review_button:active span {
background-position: bottom left;
padding: 6px 0 4px 18px; /* push text down 1px */
}
]]></>.toString().replace(/\${([^}]+)}/g, function(_, name) {
if(name == 'base')
return 'body > div.' + base_classname;
else
return classname_prefix + name;
}));
requestCrossreview();
})();
