greed quote star feat. Proxy
by
a-kuma3
2018-06-11 [2018/06/11 09:39:51]
引用になってなくても引用スターできるようにします
@@ -76,7 +76,7 @@
return url;
}
- const re_addstar = new RegExp(String.raw`^https?://s\.hatena\.ne\.jp/star\.add\.json`);
+ 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, {
/*
* @title greed quote star feat. Proxy
* @description 引用になってなくても引用スターできるようにします
* @include http://*
* @license MIT License
* @javascript_url
*/
(() => {
// 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*="s.hatena.ne.jp"').forEach(target => {
if (! canvas) {
canvas = Object.assign(document.createElement("canvas"), {
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 < data.length ; i += 4) {
if (data[i] < 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 + " (force quote)";
});
}
document.body.appendChild(Object.assign(document.createElement("img"), {
// 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: "anonymous",
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 -> URL */
let param = u.searchParams; /* URLSearchParams */
let quote = param.get("quote");
if (quote) {
// to numeric reference
quote = (s => {
let o = "", i = 0;
while (i < s.length) {
let code = s.codePointAt(i);
o += code < 128 ? String.fromCharCode(code) : `&#${code};`;
i += 1;
if (code > 0xffff) { // for surrogate pair
i += 1;
}
}
return o;
})(quote);
param.set("quote", quote);
u.search = "?" + 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) => {
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;
},
});
})();
- Permalink
- このページへの個別リンクです。
- RAW
- 書かれたコードへの直接のリンクです。
- Packed
- 文字列が圧縮された書かれたコードへのリンクです。
- Userscript
- Greasemonkey 等で利用する場合の .user.js へのリンクです。
- Loader
- @require やソースコードが長い場合に多段ロードする Loader コミのコードへのリンクです。
- Metadata
- コード中にコメントで @xxx と書かれたメタデータの JSON です。