// ==UserScript==
// @name Tieba Coder
// @namespace http://nota.moe/
// @version 0.1-alpha
// @description 在贴吧发表格式美观、语法高亮的代码片段
// @author NotaStudio
// @match http://tieba.baidu.com/p/*
// @match http://tieba.baidu.com/f?kw=*
// @grant GM_addStyle
// @run-at document-end
// @license GPLv3
// @downloadURL none
// ==/UserScript==
console.log(" Tieba Coder 0.1-alpha\n Created by Nota\n 2015.08.07\n┏┛┻━━━┛┻┓\n┃|||||||┃\n┃ ━ ┃\n┃ ┳┛ ┗┳ ┃\n┃ ┃\n┃ ┻ ┃\n┃ ┃\n┗━┓ ┏━┛\n ┃ ┃\n ┃ ┃\n ┃ ┃\n ┃ ┃\n ┃ ┗━━━┓\n ┃ Tieba Coder ┣┓\n ┃ 吉翔物 ┃\n ┗┓┓┏━┳┓┏┛\n ┃┫┫ ┃┫┫\n ┗┻┛ ┗┻┛\n ");
GM_addStyle("code{display:inline}.tc_input_code_button{display:inline;cursor:pointer;color:#990000}.tc_container{border-radius:5px;position:fixed;width:480px;height:320px;z-index:9999999;top:100px;bottom:auto;left:30%;right:auto;background:rgba(169,169,169,0.7);text-align:center}.tc_lang_select,.tc_tab_select{margin:5px}.tc_tip{display:inline}.tc_input_box{overflow:auto;display:block;margin:2px;width:474px}.tc_code_div{border-radius:7px;border-color:#666;border-width:1px;background-color:#f5f2f0}.tc_p{display:none}.tc_code_pre{font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace}.tc_submit_button,.tc_cancel_button{margin:3px}");
GM_addStyle("code[class*='language-'],pre[class*='language-']{color:black;text-shadow:0 1px white;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;direction:ltr;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*='language-']::-moz-selection,pre[class*='language-']::-moz-selection,code[class*='language-']::-moz-selection,code[class*='language-']::-moz-selection{text-shadow:none;background:#b3d4fc}pre[class*='language-']::selection,pre[class*='language-']::selection,code[class*='language-']::selection,code[class*='language-']::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*='language-'],pre[class*='language-']{text-shadow:none}}pre[class*='language-']{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*='language-'],pre[class*='language-']{background:#f5f2f0}:not(pre)>code[class*='language-']{padding:.1em;border-radius:.3em}.token.comment,.token.prolog,.token.doctype,.token.cdata{color:slategray}.token.punctuation{color:#999}.namespace{opacity:.7}.token.property,.token.tag,.token.boolean,.token.number,.token.constant,.token.symbol,.token.deleted{color:#905}.token.selector,.token.attr-name,.token.string,.token.char,.token.builtin,.token.inserted{color:#690}.token.operator,.token.entity,.token.url,.language-css .token.string,.style .token.string{color:#a67f59;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.function{color:#dd4a68}.token.regex,.token.important,.token.variable{color:#e90}.token.important,.token.bold{font-weight:bold}.token.italic{font-style:italic}.token.entity{cursor:help}pre.line-numbers{position:relative;padding-left:3.8em;counter-reset:linenumber}pre.line-numbers>code{position:relative}.line-numbers .line-numbers-rows{position:absolute;pointer-events:none;top:0;font-size:100%;left:-3.8em;width:3em;letter-spacing:-1px;border-right:1px solid #999;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.line-numbers-rows>span{pointer-events:none;display:block;counter-increment:linenumber}.line-numbers-rows>span:before{content:counter(linenumber);color:#999;display:block;padding-right:.8em;text-align:right}");// Prism.js stylesheet
window.addNode = function (sTagName,oAttr,sTagContent,oParentNode) {
var e = document.createElement(sTagName);
if (sTagContent) {
var c = document.createTextNode(sTagContent);
e.appendChild(c);
}
if (oAttr) {
for (var a in oAttr) {
e.setAttribute(a,oAttr[a]);
}
}
if (oParentNode) {
oParentNode.appendChild(e);
return;
} else {
return e;
}
};
// oAttr 可选,接受用对象形式表示的属性-值对,sTagContent 可选,oParentNode 可选,若有,则把新建的元素添加为 oParentNode 的子节点并返回 undefined ;若无,则直接返回新建的元素
// e.g. addNode("div",{"width":"100px","height":"50px","dir":"rtl"},"bbb",document.getElementById("content_wrap"));
// 发帖
GM_addStyle("@keyframes nodeInserted{from{opacity:.99}to{opacity:1}}.edui-btn-toolbar{animation-duration:.01s;animation-name:nodeInserted}");
//为 edui-btn-toolbar 类增加动画,方便通过 animationstart 事件获取相应节点
window.tcPostInit = function() {
addNode("button",{"class":"tc_input_code_button"},"插入代码",document.getElementsByClassName("edui-btn-toolbar")[0]);
document.getElementsByClassName("tc_input_code_button")[0].addEventListener("click",inputCode,false);
};
var insertListener = function(event){
if (event.animationName == "nodeInserted") {// This is the debug for knowing our listener worked! event.target is the new node!
tcPostInit();
}
};
document.addEventListener("animationstart", insertListener, false);
window.inputCode = function() {
addNode("div",{"class":"tc_container"},"",document.body);
addNode("p",{"class":"tc_tip"},"语言",document.getElementsByClassName("tc_container")[0]);
addNode("select",{"class":"tc_lang_select"},"",document.getElementsByClassName("tc_container")[0]);
addNode("option",{"value":"markup"},"HTML",document.getElementsByClassName("tc_lang_select")[0]);
addNode("option",{"value":"css"},"CSS",document.getElementsByClassName("tc_lang_select")[0]);
addNode("option",{"value":"javascript"},"JavaScript",document.getElementsByClassName("tc_lang_select")[0]);
addNode("option",{"value":"bash"},"Bash",document.getElementsByClassName("tc_lang_select")[0]);
addNode("option",{"value":"php"},"世界上最好的语言~~",document.getElementsByClassName("tc_lang_select")[0]);
addNode("option",{"value":"c"},"C",document.getElementsByClassName("tc_lang_select")[0]);
addNode("option",{"value":"cpp"},"C++",document.getElementsByClassName("tc_lang_select")[0]);
addNode("option",{"value":"python"},"Python",document.getElementsByClassName("tc_lang_select")[0]);
addNode("p",{"class":"tc_tip"},"Tab Width",document.getElementsByClassName("tc_container")[0]);
addNode("select",{"class":"tc_tab_select"},"",document.getElementsByClassName("tc_container")[0]);
addNode("option",{"value":"2"},"2",document.getElementsByClassName("tc_tab_select")[0]);
addNode("option",{"value":"4","selected":"selected"},"4",document.getElementsByClassName("tc_tab_select")[0]);
addNode("option",{"value":"8"},"8",document.getElementsByClassName("tc_tab_select")[0]);
addNode("textarea",{"class":"tc_input_box","placeholder":"在这里输入代码","rows":"10"},"",document.getElementsByClassName("tc_container")[0]);
addNode("button",{"class":"tc_submit_button"},"确认",document.getElementsByClassName("tc_container")[0]);
document.getElementsByClassName("tc_submit_button")[0].addEventListener("click",submitCode,false);
addNode("button",{"class":"tc_cancel_button"},"取消",document.getElementsByClassName("tc_container")[0]);
document.getElementsByClassName("tc_cancel_button")[0].addEventListener("click",function(){document.body.removeChild(document.getElementsByClassName('tc_container')[0]);},false);
};
window.submitCode = function() {
var postLang = document.getElementsByClassName("tc_lang_select")[0].options[document.getElementsByClassName("tc_lang_select")[0].options.selectedIndex].value,
tabWidth = document.getElementsByClassName("tc_tab_select")[0].options[document.getElementsByClassName("tc_tab_select")[0].options.selectedIndex].value,
code;
for (var space = " "; space.length < tabWidth; space+=space) {}// 空循环,使 space 长度为指定的 Tab 宽度
var tempCode = document.getElementsByClassName("tc_input_box")[0].value.replace(/\t/g,space);// 将 Tab 替换为半角空格
tempCode = tempCode.replace(/\n/g,"
")
code = tempCode.replace(/\s{2}/g,"\u3000");// 使用一个全角空格替换2个半角空格,使得代码可以正常缩进
document.body.removeChild(document.getElementsByClassName("tc_container")[0]);
document.getElementById("ueditor_replace").innerHTML += ( "
// ==Tieba Coder lang:" + postLang + "==
" + code + "
// 这段代码使用 Tieba Coder 进行格式化和语法高亮,您可以在 http 下载 Tieba Coder 使用
// 注意:这段代码中的空格可能是全角空格
");
document.getElementById("j_p_postlist").innerHTML = document.getElementById("j_p_postlist").innerHTML.replace(/\/\/ 这段代码使用 Tieba Coder 进行格式化和语法高亮,您可以在 http 下载 Tieba Coder 使用\n\/\/ 注意:这段代码中的空格可能是全角空格/g,"
");
};
// Prism.js START
// themes=prism&languages=markup+css+clike+javascript+bash+php+c+cpp+python&plugins=line-numbers
var _self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(){var e=/\blang(?:uage)?-(?!\*)(\w+)\b/i,t=_self.Prism={util:{encode:function(e){return e instanceof n?new n(e.type,t.util.encode(e.content),e.alias):"Array"===t.util.type(e)?e.map(t.util.encode):e.replace(/&/g,"&").replace(/e.length)break e;if(!(d instanceof a)){u.lastIndex=0;var m=u.exec(d);if(m){c&&(f=m[1].length);var y=m.index-1+f,m=m[0].slice(f),v=m.length,k=y+v,b=d.slice(0,y+1),w=d.slice(k+1),N=[p,1];b&&N.push(b);var O=new a(l,g?t.tokenize(m,g):m,h);N.push(O),w&&N.push(w),Array.prototype.splice.apply(r,N)}}}}}return r},hooks:{all:{},add:function(e,n){var a=t.hooks.all;a[e]=a[e]||[],a[e].push(n)},run:function(e,n){var a=t.hooks.all[e];if(a&&a.length)for(var r,i=0;r=a[i++];)r(n)}}},n=t.Token=function(e,t,n){this.type=e,this.content=t,this.alias=n};if(n.stringify=function(e,a,r){if("string"==typeof e)return e;if("Array"===t.util.type(e))return e.map(function(t){return n.stringify(t,a,e)}).join("");var i={type:e.type,content:n.stringify(e.content,a,r),tag:"span",classes:["token",e.type],attributes:{},language:a,parent:r};if("comment"==i.type&&(i.attributes.spellcheck="true"),e.alias){var l="Array"===t.util.type(e.alias)?e.alias:[e.alias];Array.prototype.push.apply(i.classes,l)}t.hooks.run("wrap",i);var s="";for(var o in i.attributes)s+=o+'="'+(i.attributes[o]||"")+'"';return"<"+i.tag+' class="'+i.classes.join(" ")+'" '+s+">"+i.content+""+i.tag+">"},!_self.document)return _self.addEventListener?(_self.addEventListener("message",function(e){var n=JSON.parse(e.data),a=n.language,r=n.code;_self.postMessage(JSON.stringify(t.util.encode(t.tokenize(r,t.languages[a])))),_self.close()},!1),_self.Prism):_self.Prism;var a=document.getElementsByTagName("script");return a=a[a.length-1],a&&(t.filename=a.src,document.addEventListener&&!a.hasAttribute("data-manual")&&document.addEventListener("DOMContentLoaded",t.highlightAll)),_self.Prism}();"undefined"!=typeof module&&module.exports&&(module.exports=Prism);;
Prism.languages.markup={comment://,prolog:/<\?[\w\W]+?\?>/,doctype://,cdata://i,tag:{pattern:/<\/?[^\s>\/]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\\1|\\?(?!\1)[\w\W])*\1|[^\s'">=]+))?)*\s*\/?>/i,inside:{tag:{pattern:/^<\/?[^\s>\/]+/i,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"attr-value":{pattern:/=(?:('|")[\w\W]*?(\1)|[^\s>]+)/i,inside:{punctuation:/[=>"']/}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:/?[\da-z]{1,8};/i},Prism.hooks.add("wrap",function(t){"entity"===t.type&&(t.attributes.title=t.content.replace(/&/,"&"))});;
Prism.languages.css={comment:/\/\*[\w\W]*?\*\//,atrule:{pattern:/@[\w-]+?.*?(;|(?=\s*\{))/i,inside:{rule:/@[\w-]+/}},url:/url\((?:(["'])(\\(?:\r\n|[\w\W])|(?!\1)[^\\\r\n])*\1|.*?)\)/i,selector:/[^\{\}\s][^\{\};]*?(?=\s*\{)/,string:/("|')(\\(?:\r\n|[\w\W])|(?!\1)[^\\\r\n])*\1/,property:/(\b|\B)[\w-]+(?=\s*:)/i,important:/\B!important\b/i,"function":/[-a-z0-9]+(?=\()/i,punctuation:/[(){};:]/},Prism.languages.css.atrule.inside.rest=Prism.util.clone(Prism.languages.css),Prism.languages.markup&&(Prism.languages.insertBefore("markup","tag",{style:{pattern:/