// ==UserScript==
// @name 绯月表情增强插件
// @namespace https://greasyfork.org/users/5415
// @version 4.0.0
// @author eddie32
// @description KF论坛专用的回复表情, 插图扩展插件, 在发帖时快速输入自定义表情和论坛BBCODE
// @icon https://blog.nekohand.moe/favicon.ico
// @homepage https://github.com/liu599/KF-Emotion-UserScript
// @include http://*2dkf.com/*
// @include http://*9moe.com/*
// @include http://*kfgal.com/*
// @copyright 2014-2017, eddie32
// @grant none
// @license MIT
// @run-at document-end
// ==/UserScript==
//var ex00000000 = (function($){
// B站和tora酱
var w4 = [];
for(var j = 0; j < 16; j++) {
w4[j] = 'http://smile.nekohand.moe/blogAcc/LoveliveEmotion01/EmCol/BiliBili/2233 (' +
(j+1) + ').gif';
}
for(var j = 16; j < 30; j++) {
w4[j] = 'http://smile.nekohand.moe/blogAcc/LoveliveEmotion01/EmCol/BiliBili/bilibiliTV (' +
(j+1-17) + ').png';
}
// tora酱
var w5 = [];
for(var j = 0; j < 14; j++) {
w5[j] = 'http://smile.nekohand.moe/blogAcc/LoveliveEmotion01/EmCol/tora/0' +
((j)>=9?(j+1):('0'+(j+1))) + '.jpg';
}
w4 = w4.concat(w5);
//阿卡林
//7. Akari 摇曳百合
var ACSmile1 = [];
for(var j = 0; j < 20; j++) {
ACSmile1[j] = 'http://smile.nekohand.moe/blogAcc/LoveliveEmotion01/EmCol/Dynamic/akari' +
(j+1) + '.gif';
}
var AkariSmile1 = [];
for(var j = 0; j < 71; j++) {
AkariSmile1[j] = 'http://smile.nekohand.moe/blogAcc/LoveliveEmotion01/EmCol/akari/akari' +
(j+1) + '.png';
}
AkariSmile1 = AkariSmile1.concat(ACSmile1);
// KF拓展, New Game以及巫女控
var kfaux = [];
for(var j = 0; j < 19; j++) {
kfaux[j] = 'http://ss.nekohand.moe/Asource/EmotionPic/KFEM (' +
(j+1) + ').gif';
}
var NG = [];
for(var j = 0; j < 62; j++) {
NG[j] = 'http://nekohand.moe/spsmile/01Sora/0xx' +
(j+2) + '.png';
}
NG = NG.concat(kfaux);
// ACFUN new
var ACSmile4 = [];
for(var j = 0; j < 50; j++) {
ACSmile4[j] = 'http://smile.nekohand.moe/blogAcc/LoveliveEmotion01/EmCol/ACFUN/New/' +
(j+1) + '.png';
}
for(var j = 50; j < 90; j++) {
ACSmile4[j] = 'http://smile.nekohand.moe/blogAcc/LoveliveEmotion01/EmCol/ACFUN/Niming/' +
((j-50)>=9?(j-49):('0'+(j-49))) + '.gif';
}
// KF 内置
var KFSmileURL = [];
var KFSmileCode = [];
for(var j = 0; j < 48; j++) {
KFSmileURL[j] = (typeof imgpath != 'undefined' ? imgpath : '') + '/post/smile/em/em' +
((j)>=9?(j+1):('0'+(j+1))) + '.gif';
KFSmileCode[j] = '[s:'+(j+10)+']';
}
// lovelive专用小
var LoveliveSmalltargetURL = [];
for(var j = 0; j < 40; j++) {
LoveliveSmalltargetURL[j] = 'http://smile.nekohand.moe/blogAcc/LoveliveEmotion02/Small/Lovelive2nd' +
(j+1) + '.png';
LoveliveSmalltargetURL[j+40] = 'http://smile.nekohand.moe/blogAcc/LoveliveEmotion01/Small/Lovelive' +
(j+1) + '.png';
}
var MenuList = {
item4:{datatype:'imageLink', title:'kfdefault',addr:KFSmileURL, ref:KFSmileCode},
item1:{datatype:'plain',title:'kf',addr:["[sell=100][/sell]","[quote][/quote]","[hide=100][/hide]","[code][/code]",
"[strike][/strike]","[fly][/fly]","[color=#00FF00][/color]","[b][/b]","[u][/u]","[i][/i]","[hr]", "[backcolor=][/backcolor]","[img][/img]"]},
item2:{datatype:'plain',title:'颜文字', addr:["(●・ 8 ・●)",
"╰(๑◕ ▽ ◕๑)╯","(﹡ˆˆ﹡)","〜♪♪","(゚Д゚≡゚Д゚)", "(^o^)ノ" , "(|||゚Д゚)", "(`ε´ )", "(╬゚д゚)", "(|||゚д゚)" , "( ̄∇ ̄)", "( ̄3 ̄)", "( ̄ー ̄)", "( ̄ .  ̄)", "( ̄︿ ̄)", "( ̄︶ ̄)", "(*´ω`*)", "(・ω・)","(⌒▽⌒)","( ̄▽ ̄)","(=・ω・=)","(`・ω・´)","(〜 ̄△ ̄)〜","(・∀・)",
"(°∀°)ノ","( ̄3 ̄)","╮( ̄▽ ̄)╭","( ´_ゝ`)","←_←","→_→","(<_<)","(>_>)","(;¬_¬)","(▔□▔)/","(゚Д゚≡゚д゚)!?","Σ(゚д゚;)","Σ(  ̄□ ̄||)",
"(´;ω;`)","(/TДT)/","(^・ω・^ )","(。・ω・。)","(● ̄(エ) ̄●)","ε=ε=(ノ≧∇≦)ノ","(´・_・`)","(-_-#)","( ̄へ ̄)","( ̄ε(# ̄) Σ","ヽ(`Д´)ノ","(╯°口°)╯(┴—┴","(#-_-)┯━┯","_(:3」∠)_","(笑)","(汗)","(泣)","(苦笑)", "(´・ω・`)", "(╯°□°)╯︵ ┻━┻","(╯‵□′)╯︵┻━┻", "( ´ρ`)", "( ゚ω゚)", "(o゚ω゚o)", "( ^ω^)", "(。◕∀◕。)", "/( ◕‿‿◕ )\\","ε٩( º∀º )۶з","( ̄ε(# ̄)☆╰╮( ̄▽ ̄///)",
"(●´3`)~♪", "_(:з」∠)_","хорошо!","\(^o^)/","(•̅灬•̅ )", "(゚Д゚)","まったく、小学生は最高だぜ!!","ε=ε=ε=┏(゜ロ゜;)┛",
"(;°ほ°)","もうこの国は駄目だぁ","ヽ(✿゚▽゚)ノ","焔に舞い上がるスパークよ、邪悪な異性交際に、天罰を与え!","お疲れ様でした"]},
item5:{datatype:'image',title:'ACFUN',addr:ACSmile4},
item6:{datatype:'image',title:'常用',addr:NG},
item7:{datatype:'image',title:'Akari',addr:AkariSmile1},
item8:{datatype:'image',title:'BiliBili',addr:w4},
item3:{datatype:'image',title:'LoveLive',addr:LoveliveSmalltargetURL}
};
/* Event 函数 */
var EventUtil = {
getEvent: function(event){
return event ? event : window.event;
},
getTarget: function(event){
return event.target || event.srcElement;
},
preventDefault: function(event){
if (event.preventDefault){
event.preventDefault();
} else {
event.returnValue = false;
}
},
stopPropagation: function(event){
if (event.stopPropagation){
event.stopPropagation();
} else {
event.cancelBubble = true;
}
},
addHandler: function(element, type, handler){
if (element.addEventListener){
element.addEventListener(type, handler, false); //DOM2
} else if (element.attachEvent){
element.attachEvent("on" + type, handler); //IE
} else {
element["on" + type] = handler; //DOM 0
}
},
removeHandler: function(element, type, handler){
if (element.removeEventListener){
element.removeEventListener(type, handler, false); //DOM2
} else if (element.detachEvent){
element.detachEvent("on" + type, handler); //IE
} else {
element["on" + type] = null; //DOM 0
}
}
};
var EleUtil = {
create: function(ele){
return document.createElement(ele);
},
selectID: function(ele){
return document.getElementById(ele);
},
select: function(selector){
return document.querySelector(selector);
}
};
var createItems = {
createImages:function(key){
'use strict';
console.log(MenuList[key]);
const imgList = MenuList[key].addr;
const imgLength = imgList.length;
for(var k=0;k<imgLength;k++){
const imgItem = EleUtil.create('img');
imgItem.src = imgList[k];
imgItem.className = 'Ems';
imgItem.onclick = expandMenu.attachEmotion;
imgItem.style.cssText = 'cursor:pointer;padding: 10px 10px:width: 50px;height: 50px;';
EleUtil.selectID("toggleWindow").appendChild(imgItem);
}
},
createPlainText: function(key){
'use strict';
console.log(MenuList[key]);
const txtList = MenuList[key].addr;
const txtLength = txtList.length;
for(var k=0;k<txtLength;k++){
const txtItem = EleUtil.create('span');
txtItem.style.cssText = "cursor:pointer; margin: 10px 10px;";
txtItem.innerHTML = '<a data-sign='+encodeURI(txtList[k])+' class="txtBtnEmotion">'+txtList[k]+'</a>';
txtItem.onclick = expandMenu.attachEmotion;
txtItem.style.cssText = 'cursor:pointer;padding: 10px 10px:width: 50px;';
EleUtil.selectID("toggleWindow").appendChild(txtItem);
}
},
createImageLink: function(key){
console.log(MenuList[key]);
const imgList = MenuList[key].addr;
const refList = MenuList[key].ref;
const imgLength = imgList.length;
for(var k=0;k<imgLength;k++){
const imgItem = EleUtil.create('img');
imgItem.dataset.link = refList[k];
imgItem.src = imgList[k];
imgItem.className = 'Ems';
imgItem.onclick = expandMenu.attachEmotion;
imgItem.style.cssText = 'cursor:pointer;padding: 10px 10px:width: 50px;height: 50px;';
EleUtil.selectID("toggleWindow").appendChild(imgItem);
}
}
};
var expandMenu = {
init: function(event){
"use strict";
createMenu.clear();
const eventTarget = EventUtil.getTarget(event);
EleUtil.selectID("toggleWindow").style.display = "block";
const dataType = eventTarget.attributes[2].nodeValue;
const dataKey = eventTarget.attributes[1].nodeValue;
if(dataType =='plain'){
createItems.createPlainText(dataKey);
}else if(dataType =='image'){
createItems.createImages(dataKey);
}else if(dataType == 'imageLink'){
createItems.createImageLink(dataKey);
}
},
attachEmotion: function(event){
"use strict";
const eventTarget = EventUtil.getTarget(event);
console.log(eventTarget);
var emotionAddress;
if(eventTarget.attributes.length==3){
if(eventTarget.src){
const addressTarget = eventTarget.src;
emotionAddress = expandMenu.addressParse(addressTarget,'image');
}else{
console.log(eventTarget.attributes);
const addressTarget = eventTarget.attributes[0].nodeValue;
emotionAddress = expandMenu.addressParse(addressTarget,'plain');
}
}
else{
console.log(eventTarget.attributes);
const addressTarget = eventTarget.attributes[0].nodeValue;
emotionAddress = expandMenu.addressParse(addressTarget,'plain');
}
const selectTextArea = EleUtil.select("textarea");
const ovalue = selectTextArea.value;
const startPos = selectTextArea.selectionStart;
const endPos = selectTextArea.selectionEnd;
selectTextArea.value = ovalue.slice(0, startPos) + emotionAddress + ovalue.slice(startPos);
// console.log(eventTarget);
// console.log(emotionAddress);
},
addressParse: function(addStr, pattern){
"use strict";
var stringReturn;
if(pattern === 'image'){
stringReturn = '[img]'+addStr+'[/img]';
}
if(pattern === 'plain'){
stringReturn = decodeURI(addStr);
}
if(pattern === 'imageLink'){
stringReturn = addStr;
}
return stringReturn;
}
};
var createMenu = {
defaultID: 'emotion0000',
main: function(){
"use strict";
const mainMenu = EleUtil.create('div');
mainMenu.innerHTML = '<span title="made by eddie32 version 4.0.0" style="cursor:pointer;"><b>囧⑨</b></span>';
mainMenu.id = createMenu.defaultID;
mainMenu.style.cssText = 'padding:5px 5px;width: 780px; vertical-align: middle; \
font: 14px/20px "Hiragino Sans GB","Microsoft YaHei","Arial","sans-serif"';
const MenuLength = Object.keys(MenuList).length;
for(var i=0;i<MenuLength;i++){
const MenuKey = Object.keys(MenuList)[i];
const MenuTitle = MenuList[MenuKey].title;
const MenuType = MenuList[MenuKey].datatype;
if(!MenuType || !MenuTitle) console.log('dataerror '+MenuKey);
const testMenu = createMenu.subs(MenuTitle,expandMenu.init,MenuKey, MenuType);
mainMenu.appendChild(testMenu);
}
const closeBtn = EleUtil.create('span');
closeBtn.innerHTML = '[-]';
closeBtn.className= "subMenu";
closeBtn.id = 'closeEM';
closeBtn.onclick = createMenu.clear;
mainMenu.appendChild(closeBtn);
const itemWindow = EleUtil.create('div');
itemWindow.id = "toggleWindow";
itemWindow.style.cssText = 'width: 780px; height: 50px; padding: 3px 3px; overflow: auto; margin-top:14px';
itemWindow.style.display = 'none';
mainMenu.appendChild(itemWindow);
const styleItem = EleUtil.create('style');
styleItem.innerHTML = '#toggleWindow a{padding: 3px 3px;line-height:2} \
#toggleWindow span{}\
a.subBut{text-decoration: none; margin: 5px 5px;} \
a.subBut:hover{color: deeppink;} \
a.txtBtnEmotion{text-decoration:none;} \
a.txtBtnEmotion:hover{background: #2b2b2b;color: #fff} \
.subMenu{cursor:pointer; width:200px; margin-left: 10px; margin-right: 4px; margin-bottom:10px; background: #fff !important; \
font: 14px/16px "Hiragino Sans GB","Microsoft YaHei","Arial","sans-serif"} \
.subMenu:hover{border-bottom: 2px solid deeppink}';
mainMenu.appendChild(styleItem);
return mainMenu;
},
subs: function(title,func,subid,subtype){
"use strict";
const subMenu = EleUtil.create('span');
subMenu.id = subid;
subMenu.className= "subMenu";
const subcontent = '<a class="subBut" data-kid='+subid+' date-type=' + subtype +'>' + title + '</a>';
//EleUtil.selectClass(".subBut").style.cssText = 'width: 30px; margin-right: 5px';
subMenu.onclick = func;
subMenu.title = title;
// subMenu.dataset.hook = 'item1';
subMenu.innerHTML = subcontent;
return subMenu;
},
clear: function(){
"use strict";
EleUtil.selectID("toggleWindow").innerHTML = '';
EleUtil.selectID("toggleWindow").style.display = "none";
}
};
var KFE = {
init: function(){
"use strict";
const mainEmotionMenu = createMenu.main();
//console.log(mainEmotionMenu);
//const textareas = document.getElementsByTagName('textarea');
//if (!textareas.length) { return; }
const textarea = EleUtil.select("textarea");
textarea.parentNode.insertBefore(mainEmotionMenu, textarea);
}
};
KFE.init();
//});