// ==UserScript==
// @name bgmnote
// @namespace https://github.com/hentaiPanda
// @description 简易备注
// @author niR
// @version 0.0.3 pre 飞呀飞呀
// @license MIT License
// @encoding utf-8
// @require http://code.jquery.com/jquery-2.1.1.js
// @grant GM_setClipboard
// @grant GM_getResourceText
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_listValues
// @grant GM_registerMenuCommand
// @include http://bangumi.tv/group/topic/*
// @include http://bgm.tv/group/topic/*
// @include http://chii.in/group/topic/*
// @include http://bangumi.tv/subject/topic/*
// @include http://bgm.tv/subject/topic/*
// @include http://chii.in/subject/topic/*
// @include http://bangumi.tv/rakuen/topic/group/*
// @include http://bgm.tv/rakuen/topic/group/*
// @include http://chii.in/rakuen/topic/group/*
// @include http://bangumi.tv/rakuen/topic/ep/*
// @include http://bgm.tv/rakuen/topic/ep/*
// @include http://chii.in/rakuen/topic/ep/*
// @include http://bangumi.tv/blog/*
// @include http://bgm.tv/blog/*
// @include http://chii.in/blog/*
// @include http://bangumi.tv/ep/*
// @include http://bgm.tv/ep/*
// @include http://chii.in/user/*
// @include http://bangumi.tv/user/*
// @include http://bgm.tv/user/*
// @exclude http://chii.in/user/*/*
// @exclude http://bangumi.tv/user/*/*
// @exclude http://bgm.tv/user/*/*
// ==/UserScript==
var addBtn, addNotes, appendStyle, base64toutf8, confirmHiding, exportData, exportPlainText, formatNum, getTm, getVal, hideNote, importData, main, readFile, replaceNlc, saveFile, showNote, updateNote, utf8tobase64;
getVal = function() {
var userlink, val;
userlink = $('.headerAvatar > a.avatar').attr('href');
val = GM_getValue(userlink, '');
return val;
};
updateNote = function() {
var userlink, val;
val = $('#bgmnote textarea').val();
userlink = $('.headerAvatar > a.avatar').attr('href');
GM_setValue(userlink, val);
return hideNote();
};
confirmHiding = function() {
var answer, new_val, val;
val = getVal();
new_val = $('#bgmnote textarea').val();
if (val === new_val) {
return hideNote();
} else {
answer = confirm('备注似乎已经被更改,是否保存更改?');
if (answer) {
return updateNote();
} else {
return hideNote();
}
}
};
showNote = function() {
var val;
$('#user_home .user_box').html(function(i, old) {
var nvct;
nvct = '<div id="bgmnote"><textarea name="bgmnote" class="reply" style="width:97.5%; height: 150px;"></textarea><div id="submitBtnO"><input id="updatenote" class="inputBtn" value="写好了" name="submit" type="submit"> <a id="cancelbtn" href="javascript:;">取消</a></div></div>';
return nvct + old;
});
val = getVal();
$('#bgmnote textarea').val(val);
$('body').off('click.show_n');
$('body').on('click.textarea', '#bgmnotebtn', confirmHiding);
$('body').on('click.textarea', '#cancelbtn', hideNote);
return $('body').on('click.textarea', '#updatenote', updateNote);
};
hideNote = function() {
$('body').off('click.textarea');
$('#bgmnote').remove();
return $('body').on('click.show_n', '#bgmnotebtn', showNote);
};
addBtn = function() {
var new_btn, rr;
rr = $('#headerProfile div.rr');
new_btn = '<a href="javascript:;" class="chiiBtn" id="bgmnotebtn"><span>备注</span></a>';
rr.html(rr.html() + new_btn);
return $('body').on('click.show_n', '#bgmnotebtn', showNote);
};
addNotes = function() {
return $('a.avatar').each(function() {
var note, userlink;
if (this.parentNode.id.indexOf('post_') !== 0) {
return 0;
}
userlink = this.getAttribute('href');
note = GM_getValue(userlink, '');
return this.setAttribute('title', note);
});
};
replaceNlc = function(str) {
var _str, new_str;
_str = str.replace(/>[\n\s]*</g, '><');
new_str = _str.replace(/(>|^)([^<]*)\n([^>]*)(<|$)/g, function(s) {
return s.replace(/\n/g, '<br>');
});
return new_str;
};
utf8tobase64 = function(str) {
return btoa(unescape(encodeURIComponent(str)));
};
base64toutf8 = function(str) {
return decodeURIComponent(escape(atob(str)));
};
exportData = function() {
var b64str, i, j, len, pairs, ref, value;
pairs = [];
ref = GM_listValues();
for (j = 0, len = ref.length; j < len; j++) {
i = ref[j];
value = GM_getValue(i);
if (!value.trim()) {
continue;
}
pairs.push([utf8tobase64(i), utf8tobase64(value)].join(':'));
}
b64str = pairs.join(';');
console.log(b64str);
GM_setClipboard(b64str);
return alert('已复制到剪贴板');
};
exportPlainText = function() {
var i, j, len, n, pairs, plain_text, ref, sub, subl, subr, sup, supl, supr, t, value;
n = 3;
sup = '♀';
sub = '♂';
t = n + 1;
supl = Array(t).join(sup) + ' ';
supr = ' ' + Array(t).join(sup);
subl = Array(t).join(sub) + ' ';
subr = ' ' + Array(t).join(sub);
pairs = [];
ref = GM_listValues();
for (j = 0, len = ref.length; j < len; j++) {
i = ref[j];
value = GM_getValue(i);
if (!value.trim()) {
continue;
}
pairs.push([supl + i.slice(6) + supr, value, subl + i.slice(6) + subr].join('\n'));
}
plain_text = pairs.join('\n\n');
console.log(plain_text);
GM_setClipboard(plain_text);
return alert('已复制到剪贴板');
};
importData = function(b64str) {
var error, i, j, key, len, pair, pairs, results, value;
pairs = b64str.split(';');
results = [];
for (j = 0, len = pairs.length; j < len; j++) {
i = pairs[j];
pair = i.split(':');
try {
key = base64toutf8(pair[0]);
value = base64toutf8(pair[1]);
} catch (_error) {
error = _error;
console.log(error);
continue;
}
results.push(GM_setValue(key, value));
}
return results;
};
formatNum = function(n) {
if (n < 10) {
return "0" + n;
}
return "" + n;
};
getTm = function() {
var d, day, m, y;
day = new Date();
y = day.getFullYear();
m = formatNum(day.getMonth() + 1);
d = formatNum(day.getDate());
return "" + y + m + d;
};
saveFile = function() {
var blob, day, j, key, len, pairs, ref, text, value;
pairs = [];
ref = GM_listValues();
for (j = 0, len = ref.length; j < len; j++) {
key = ref[j];
value = GM_getValue(key);
if (!value.trim()) {
continue;
}
pairs.push([key, value]);
}
text = JSON.stringify(pairs);
blob = new Blob([data], {
type: "text/plain;charset=utf-8"
});
day = getTm();
return saveAs(blob, "bgmnote_" + day + ".txt");
};
readFile = function(evt) {
var file, reader;
if (!(window.File && window.FileReader && window.FileList)) {
alert("浏览器不支持");
return false;
}
file = evt.target.files[0];
reader = new FileReader();
reader.onload = function(e) {
var j, len, pair, pairs, results, text;
console.log(typeof e.target.result);
text = e.target.result.trim();
pairs = JSON.parse(text);
results = [];
for (j = 0, len = pairs.length; j < len; j++) {
pair = pairs[j];
results.push(GM_setValue(pair[0], pair[1]));
}
return results;
};
return reader.readAsText(file);
};
appendStyle = function() {
return $('head').append('<style type="text/css">\n .ui-helper-hidden {\n display: none;\n }\n .ui-helper-hidden-accessible {\n border: 0;\n clip: rect(0 0 0 0);\n height: 1px;\n margin: -1px;\n overflow: hidden;\n padding: 0;\n position: absolute;\n width: 1px;\n }\n .ui-helper-reset {\n margin: 0;\n padding: 0;\n border: 0;\n outline: 0;\n line-height: 1.3;\n text-decoration: none;\n font-size: 100%;\n list-style: none;\n }\n .ui-helper-clearfix:before,\n .ui-helper-clearfix:after {\n content: "";\n display: table;\n border-collapse: collapse;\n }\n .ui-helper-clearfix:after {\n clear: both;\n }\n .ui-helper-clearfix {\n min-height: 0; /* support: IE7 */\n }\n .ui-helper-zfix {\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n position: absolute;\n opacity: 0;\n filter:Alpha(Opacity=0);\n }\n .ui-front {\n z-index: 100;\n }\n .ui-tooltip {\n padding: 8px;\n position: absolute;\n z-index: 9999;\n max-width: 500px;\n -webkit-box-shadow: 0 0 5px #aaa;\n box-shadow: 0 0 5px #aaa;\n }\n body .ui-tooltip {\n border-width: 2px;\n }\n</style>');
};
main = function() {
if (location.href.indexOf('user') > 0) {
addBtn();
return GM_registerMenuCommand('导出注释', exportPlainText);
} else {
appendStyle();
addNotes();
return $('a.avatar').tooltip({
track: true,
items: '[title]',
content: function() {
return replaceNlc(this.title);
}
});
}
};
main();