您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
A script for adding code markup at 2ch.hk
// ==UserScript== // @name MakabaCode // @namespace MakabaCode // @include /^https?:\/\/(2ch\.(hk|pm|re|tf|wf|yt)|2-ch\.so).*$/ // @version 1.0.1 // @grant GM_getValue // @grant GM_setValue // @grant GM_xmlhttpRequest // @description A script for adding code markup at 2ch.hk // ==/UserScript== var mcode = mcode || {}; mcode.tasks = {}; mcode.langs = ["abap", "as", "as3", "ada", "antlr", "antlr-as", "antlr-csharp", "antlr-cpp", "antlr-java", "antlr-objc", "antlr-perl", "antlr-python", "antlr-ruby", "apacheconf", "applescript", "aspectj", "aspx-cs", "aspx-vb", "asy", "ahk", "autoit", "awk", "basemake", "bash", "console", "bat", "bbcode", "befunge", "blitzmax", "boo", "brainfuck", "bro", "bugs", "c", "csharp", "cpp", "c-objdump", "ca65", "cbmbas", "ceylon", "cfengine3", "cfs", "cheetah", "clojure", "cmake", "cobol", "cobolfree", "coffee-script", "cfm", "common-lisp", "coq", "cpp-objdump", "croc", "css", "css+django", "css+genshitext", "css+lasso", "css+mako", "css+myghty", "css+php", "css+erb", "css+smarty", "cuda", "cython", "d", "d-objdump", "dpatch", "dart", "control", "sourceslist", "delphi", "dg", "diff", "django", "dtd", "duel", "dylan", "dylan-console", "dylan-lid", "ec", "ecl", "elixir", "iex", "ragel-em", "erb", "erlang", "erl", "evoque", "factor", "fancy", "fan", "felix", "fortran", "clipper", "fsharp", "gas", "genshi", "genshitext", "pot", "cucumber", "glsl", "gnuplot", "go", "gooddata-cl", "gosu", "gst", "groff", "groovy", "haml", "haskell", "hx", "html", "html+cheetah", "html+django", "html+evoque", "html+genshi", "html+lasso", "html+mako", "html+myghty", "html+php", "html+smarty", "html+velocity", "http", "haxeml", "hybris", "idl", "ini", "io", "ioke", "irc", "jade", "jags", "java", "jsp", "js", "js+cheetah", "js+django", "js+genshitext", "js+lasso", "js+mako", "js+myghty", "js+php", "js+erb", "js+smarty", "json", "julia", "jlcon", "kconfig", "koka", "kotlin", "lasso", "lighty", "lhs", "live-script", "llvm", "logos", "logtalk", "lua", "make", "mako", "maql", "mason", "matlab", "matlabsession", "minid", "modelica", "modula2", "trac-wiki", "monkey", "moocode", "moon", "mscgen", "mupad", "mxml", "myghty", "mysql", "nasm", "nemerle", "newlisp", "newspeak", "nginx", "nimrod", "nsis", "numpy", "objdump", "objective-c", "objective-c++", "objective-j", "ocaml", "octave", "ooc", "opa", "openedge", "perl", "php", "plpgsql", "psql", "postgresql", "postscript", "pov", "powershell", "prolog", "properties", "protobuf", "puppet", "pypylog", "python", "python3", "py3tb", "pycon", "pytb", "qml", "racket", "ragel", "ragel-c", "ragel-cpp", "ragel-d", "ragel-java", "ragel-objc", "ragel-ruby", "raw", "rconsole", "rd", "rebol", "redcode", "registry", "rst", "rhtml", "RobotFramework", "spec", "rb", "rbcon", "rust", "splus", "sass", "scala", "ssp", "scaml", "scheme", "scilab", "scss", "shell-session", "smali", "smalltalk", "smarty", "snobol", "sp", "sql", "sqlite3", "squidconf", "stan", "sml", "systemverilog", "tcl", "tcsh", "tea", "tex", "text", "treetop", "ts", "urbiscript", "vala", "vb.net", "velocity", "verilog", "vgl", "vhdl", "vim", "xml", "xml+cheetah", "xml+django", "xml+evoque", "xml+lasso", "xml+mako", "xml+myghty", "xml+php", "xml+erb", "xml+smarty", "xml+velocity", "xquery", "xslt", "xtend", "yaml", /*Here follows aliases*/ "lisp", "c#", "f#", "ruby"]; mcode.lexerSelectHtml = "<select id='makabaCodeLexer'><option value='abap'>ABAP</option>" + "<option value='as'>ActionScript</option><option value='as3'>ActionScript 3</option>" + "<option value='ada'>Ada</option><option value='antlr'>ANTLR</option>" + "<option value='antlr-as'>ANTLR With ActionScript Target</option>" + "<option value='antlr-csharp'>ANTLR With C# Target</option>" + "<option value='antlr-cpp'>ANTLR With CPP Target</option>" + "<option value='antlr-java'>ANTLR With Java Target</option>" + "<option value='antlr-objc'>ANTLR With ObjectiveC Target</option>" + "<option value='antlr-perl'>ANTLR With Perl Target</option>" + "<option value='antlr-python'>ANTLR With Python Target</option>" + "<option value='antlr-ruby'>ANTLR With Ruby Target</option><option value='apacheconf'>ApacheConf</option>" + "<option value='applescript'>AppleScript</option><option value='aspectj'>AspectJ</option>" + "<option value='aspx-cs'>aspx-cs</option><option value='aspx-vb'>aspx-vb</option>" + "<option value='asy'>Asymptote</option><option value='ahk'>autohotkey</option>" + "<option value='autoit'>AutoIt</option><option value='awk'>Awk</option>" + "<option value='basemake'>Base Makefile</option><option value='bash'>Bash</option>" + "<option value='console'>Bash Session</option><option value='bat'>Batchfile</option>" + "<option value='bbcode'>BBCode</option><option value='befunge'>Befunge</option>" + "<option value='blitzmax'>BlitzMax</option><option value='boo'>Boo</option>" + "<option value='brainfuck'>Brainfuck</option><option value='bro'>Bro</option><option value='bugs'>BUGS</option>" + "<option value='c'>C</option><option value='csharp'>C#</option><option value='cpp'>C++</option>" + "<option value='c-objdump'>c-objdump</option><option value='ca65'>ca65</option>" + "<option value='cbmbas'>CBM BASIC V2</option><option value='ceylon'>Ceylon</option>" + "<option value='cfengine3'>CFEngine3</option><option value='cfs'>cfstatement</option>" + "<option value='cheetah'>Cheetah</option><option value='clojure'>Clojure</option>" + "<option value='cmake'>CMake</option><option value='cobol'>COBOL</option>" + "<option value='cobolfree'>COBOLFree</option><option value='coffee-script'>CoffeeScript</option>" + "<option value='cfm'>Coldfusion HTML</option><option value='common-lisp'>Common Lisp</option>" + "<option value='coq'>Coq</option><option value='cpp-objdump'>cpp-objdump</option>" + "<option value='croc'>Croc</option><option value='css'>CSS</option>" + "<option value='css+django'>CSS+Django/Jinja</option><option value='css+genshitext'>CSS+Genshi Text</option>" + "<option value='css+lasso'>CSS+Lasso</option><option value='css+mako'>CSS+Mako</option>" + "<option value='css+myghty'>CSS+Myghty</option><option value='css+php'>CSS+PHP</option>" + "<option value='css+erb'>CSS+Ruby</option><option value='css+smarty'>CSS+Smarty</option>" + "<option value='cuda'>CUDA</option><option value='cython'>Cython</option><option value='d'>D</option>" + "<option value='d-objdump'>d-objdump</option><option value='dpatch'>Darcs Patch</option>" + "<option value='dart'>Dart</option><option value='control'>Debian Control file</option>" + "<option value='sourceslist'>Debian Sourcelist</option><option value='delphi'>Delphi</option>" + "<option value='dg'>dg</option><option value='diff'>Diff</option><option value='django'>Django/Jinja</option>" + "<option value='dtd'>DTD</option><option value='duel'>Duel</option><option value='dylan'>Dylan</option>" + "<option value='dylan-console'>Dylan session</option><option value='dylan-lid'>DylanLID</option>" + "<option value='ec'>eC</option><option value='ecl'>ECL</option><option value='elixir'>Elixir</option>" + "<option value='iex'>Elixir iex session</option><option value='ragel-em'>Embedded Ragel</option>" + "<option value='erb'>ERB</option><option value='erlang'>Erlang</option>" + "<option value='erl'>Erlang erl session</option><option value='evoque'>Evoque</option>" + "<option value='factor'>Factor</option><option value='fancy'>Fancy</option>" + "<option value='fan'>Fantom</option><option value='felix'>Felix</option><option value='fortran'>Fortran</option>" + "<option value='Clipper'>FoxPro</option><option value='fsharp'>FSharp</option><option value='gas'>GAS</option>" + "<option value='genshi'>Genshi</option><option value='genshitext'>Genshi Text</option>" + "<option value='pot'>Gettext Catalog</option><option value='Cucumber'>Gherkin</option>" + "<option value='glsl'>GLSL</option><option value='gnuplot'>Gnuplot</option><option value='go'>Go</option>" + "<option value='gooddata-cl'>GoodData-CL</option><option value='gosu'>Gosu</option>" + "<option value='gst'>Gosu Template</option><option value='groff'>Groff</option>" + "<option value='groovy'>Groovy</option><option value='haml'>Haml</option>" + "<option value='haskell'>Haskell</option><option value='hx'>haXe</option><option value='html'>HTML</option>" + "<option value='html+cheetah'>HTML+Cheetah</option><option value='html+django'>HTML+Django/Jinja</option>" + "<option value='html+evoque'>HTML+Evoque</option><option value='html+genshi'>HTML+Genshi</option>" + "<option value='html+lasso'>HTML+Lasso</option><option value='html+mako'>HTML+Mako</option>" + "<option value='html+myghty'>HTML+Myghty</option><option value='html+php'>HTML+PHP</option>" + "<option value='html+smarty'>HTML+Smarty</option><option value='html+velocity'>HTML+Velocity</option>" + "<option value='http'>HTTP</option><option value='haxeml'>Hxml</option><option value='hybris'>Hybris</option>" + "<option value='idl'>IDL</option><option value='ini'>INI</option><option value='io'>Io</option>" + "<option value='ioke'>Ioke</option><option value='irc'>IRC logs</option><option value='jade'>Jade</option>" + "<option value='jags'>JAGS</option><option value='java'>Java</option>" + "<option value='jsp'>Java Server Page</option><option value='js'>JavaScript</option>" + "<option value='js+cheetah'>JavaScript+Cheetah</option>" + "<option value='js+django'>JavaScript+Django/Jinja</option>" + "<option value='js+genshitext'>JavaScript+Genshi Text</option><option value='js+lasso'>JavaScript+Lasso</option>" + "<option value='js+mako'>JavaScript+Mako</option><option value='js+myghty'>JavaScript+Myghty</option>" + "<option value='js+php'>JavaScript+PHP</option><option value='js+erb'>JavaScript+Ruby</option>" + "<option value='js+smarty'>JavaScript+Smarty</option><option value='json'>JSON</option>" + "<option value='julia'>Julia</option><option value='jlcon'>Julia console</option>" + "<option value='kconfig'>Kconfig</option><option value='koka'>Koka</option>" + "<option value='kotlin'>Kotlin</option><option value='lasso'>Lasso</option>" + "<option value='lighty'>Lighttpd configuration file</option><option value='lhs'>Literate Haskell</option>" + "<option value='live-script'>LiveScript</option><option value='llvm'>LLVM</option>" + "<option value='logos'>Logos</option><option value='logtalk'>Logtalk</option><option value='lua'>Lua</option>" + "<option value='make'>Makefile</option><option value='mako'>Mako</option><option value='maql'>MAQL</option>" + "<option value='mason'>Mason</option><option value='matlab'>Matlab</option>" + "<option value='matlabsession'>Matlab session</option><option value='minid'>MiniD</option>" + "<option value='modelica'>Modelica</option><option value='modula2'>Modula-2</option>" + "<option value='trac-wiki'>MoinMoin/Trac Wiki markup</option><option value='monkey'>Monkey</option>" + "<option value='moocode'>MOOCode</option><option value='moon'>MoonScript</option>" + "<option value='mscgen'>Mscgen</option><option value='mupad'>MuPAD</option><option value='mxml'>MXML</option>" + "<option value='myghty'>Myghty</option><option value='mysql'>MySQL</option><option value='nasm'>NASM</option>" + "<option value='nemerle'>Nemerle</option><option value='newlisp'>NewLisp</option>" + "<option value='newspeak'>Newspeak</option><option value='nginx'>Nginx configuration file</option>" + "<option value='nimrod'>Nimrod</option><option value='nsis'>NSIS</option><option value='numpy'>NumPy</option>" + "<option value='objdump'>objdump</option><option value='objective-c'>Objective-C</option>" + "<option value='objective-c++'>Objective-C++</option><option value='objective-j'>Objective-J</option>" + "<option value='ocaml'>OCaml</option><option value='octave'>Octave</option><option value='ooc'>Ooc</option>" + "<option value='opa'>Opa</option><option value='openedge'>OpenEdge ABL</option>" + "<option value='perl'>Perl</option><option value='php'>PHP</option><option value='plpgsql'>PL/pgSQL</option>" + "<option value='psql'>PostgreSQL console (psql)</option>" + "<option value='postgresql'>PostgreSQL SQL dialect</option><option value='postscript'>PostScript</option>" + "<option value='pov'>POVRay</option><option value='powershell'>PowerShell</option>" + "<option value='prolog'>Prolog</option><option value='properties'>Properties</option>" + "<option value='protobuf'>Protocol Buffer</option><option value='puppet'>Puppet</option>" + "<option value='pypylog'>PyPy Log</option><option value='python'>Python</option>" + "<option value='python3'>Python 3</option><option value='py3tb'>Python 3.0 Traceback</option>" + "<option value='pycon'>Python console session</option><option value='pytb'>Python Traceback</option>" + "<option value='qml'>QML</option><option value='racket'>Racket</option><option value='ragel'>Ragel</option>" + "<option value='ragel-c'>Ragel in C Host</option><option value='ragel-cpp'>Ragel in CPP Host</option>" + "<option value='ragel-d'>Ragel in D Host</option><option value='ragel-java'>Ragel in Java Host</option>" + "<option value='ragel-objc'>Ragel in Objective C Host</option>" + "<option value='ragel-ruby'>Ragel in Ruby Host</option><option value='raw'>Raw token data</option>" + "<option value='rconsole'>RConsole</option><option value='rd'>Rd</option><option value='rebol'>REBOL</option>" + "<option value='redcode'>Redcode</option><option value='registry'>reg</option>" + "<option value='rst'>reStructuredText</option><option value='rhtml'>RHTML</option>" + "<option value='RobotFramework'>RobotFramework</option><option value='spec'>RPMSpec</option>" + "<option value='rb'>Ruby</option><option value='rbcon'>Ruby irb session</option>" + "<option value='rust'>Rust</option>" + "<option value='splus'>S</option><option value='sass'>Sass</option><option value='scala'>Scala</option>" + "<option value='ssp'>Scalate Server Page</option><option value='scaml'>Scaml</option>" + "<option value='scheme'>Scheme</option><option value='scilab'>Scilab</option><option value='scss'>SCSS</option>" + "<option value='shell-session'>Shell Session</option><option value='smali'>Smali</option>" + "<option value='smalltalk'>Smalltalk</option><option value='smarty'>Smarty</option>" + "<option value='snobol'>Snobol</option><option value='sp'>SourcePawn</option><option value='sql'>SQL</option>" + "<option value='sqlite3'>sqlite3con</option>" + "<option value='squidconf'>SquidConf</option><option value='stan'>Stan</option>" + "<option value='sml'>Standard ML</option><option value='systemverilog'>systemverilog</option>" + "<option value='tcl'>Tcl</option><option value='tcsh'>Tcsh</option><option value='tea'>Tea</option>" + "<option value='tex'>TeX</option><option selected='true' value='text'>Text only</option>" + "<option value='treetop'>Treetop</option><option value='ts'>TypeScript</option>" + "<option value='urbiscript'>UrbiScript</option><option value='vala'>Vala</option>" + "<option value='vb.net'>VB.net</option><option value='velocity'>Velocity</option>" + "<option value='verilog'>verilog</option><option value='vgl'>VGL</option><option value='vhdl'>vhdl</option>" + "<option value='vim'>VimL</option><option value='xml'>XML</option>" + "<option value='xml+cheetah'>XML+Cheetah</option>" + "<option value='xml+django'>XML+Django/Jinja</option><option value='xml+evoque'>XML+Evoque</option>" + "<option value='xml+lasso'>XML+Lasso</option><option value='xml+mako'>XML+Mako</option>" + "<option value='xml+myghty'>XML+Myghty</option><option value='xml+php'>XML+PHP</option>" + "<option value='xml+erb'>XML+Ruby</option><option value='xml+smarty'>XML+Smarty</option>" + "<option value='xml+velocity'>XML+Velocity</option><option value='xquery'>XQuery</option>" + "<option value='xslt'>XSLT</option><option value='xtend'>Xtend</option><option value='yaml'>YAML</option>" + "</select>"; mcode.styleSelectHtml = "<select id='makabaCodeStyle'><option value='autumn'>autumn</option>" + "<option value='borland'>borland</option><option value='bw'>bw</option>" + "<option value='colorful'>colorful</option><option value='default'>default</option>" + "<option value='emacs'>emacs</option><option value='friendly'>friendly</option>" + "<option value='fruity'>fruity</option><option value='manni'>manni</option>" + "<option value='monokai'>monokai</option><option value='murphy'>murphy</option>" + "<option value='native'>native</option><option value='pastie'>pastie</option>" + "<option value='perldoc'>perldoc</option><option value='rrt'>rrt</option><option value='tango'>tango</option>" + "<option value='trac'>trac</option><option value='vim'>vim</option><option value='vs'>vs</option></select>"; mcode.lineNosHtml = "<input id='makabaCodeLineNos' id='linenos' type='checkbox' />"; mcode.makabaTags = ["b", "i", "u", "s", "o", "sup", "sub", "spoiler"]; mcode.inLangs = function(lang) { if (!lang) return true; for (var i = 0; i < mcode.langs.length; ++i) { if (lang == mcode.langs[i]) return true; } return false; }; mcode.isEmpty = function(obj) { if (!obj) return true; for (p in obj) { if (obj.hasOwnProperty(p)) return false; } return true; }; mcode.toCenter = function(element) { if (!element) return; var doc = document.documentElement; element.style.left = (doc.clientWidth / 2 - element.offsetWidth / 2) + "px"; element.style.top = (doc.clientHeight / 2 - element.offsetHeight / 2) + "px"; }; mcode.filled = function(what, count) { var s = ""; for (var i = 0; i < count; ++i) s += what; return s; }; mcode.replaceTabs = function(s, tabWidth) { var i = 0; while (i < s.length) { if (s.charAt(i) == "\t") { var spcount = tabWidth - (i < tabWidth ? i : i % tabWidth); s = s.substr(0, i) + mcode.filled(" ", spcount ? spcount : tabWidth) + s.substr(i + 1); i += spcount; } else { ++i; } } return s; }; mcode.language = function(source) { var lang = source.match(/lang\="?(\w|\+|\-| |#)+"?\]/gi); if (!lang) return null; lang = lang[0].replace("lang=", "").replace("]", "").split("\"").join("").replace(" ", "-"); lang = lang.replace("++", "pp").toLowerCase(); if ("lisp" == lang) lang = "common-lisp"; else if ("ruby" == lang) lang = "rb"; else if ("c#" == lang) lang = "csharp"; else if ("f#" == lang) lang = "fsharp"; return lang; }; mcode.code = function(source) { var ind = source.indexOf("]"); var code = source.substring(ind + 1, source.length - 7); code = code.split("<em>").join("*").split("</em>").join("*").split("<br>").join("\n"); code = code.split("<").join("<").split(">").join(">").split(""").join("\"").split("&").join("&"); code = code.split("#92;").join("\\"); if (code.length < 1) return code; mcode.makabaTags.forEach(function(tag) { code = code.split("[ " + tag + " ]").join("[" + tag + "]"); }); while (code.indexOf("\n") == 0) code = code.substr(1); while (code.lastIndexOf("\n") == code.length - 1) code = code.substr(0, code.length - 1); var lines = code.split("\n"); for (var i = 0; i < lines.length; ++i) lines[i] = mcode.replaceTabs(lines[i], 4); code = lines.join("\n"); return code; }; mcode.appendRow = function(table, labelText, html) { if (!table || !labelText || !html) return; var tr = document.createElement("tr"); var tdl = document.createElement("td"); tdl.appendChild(document.createTextNode(labelText)); tr.appendChild(tdl); var td = document.createElement("td"); td.innerHTML = html; tr.appendChild(td); table.appendChild(tr); }; mcode.showSettings = function() { var div = document.createElement("div"); div.style.position = "fixed"; div.style.zIndex = "9000"; div.style.height = "120px"; div.style.width = "300px"; div.style.backgroundColor = "#DDDDDD"; var table = document.createElement("table"); mcode.appendRow(table, "Стиль:", mcode.styleSelectHtml); mcode.appendRow(table, "Номера строк:", mcode.lineNosHtml); div.appendChild(table); var font = document.createElement("font"); font.color = "red"; font.appendChild(document.createTextNode("Не забудьте обновить страницу!")); div.appendChild(font); var buttonBox = document.createElement("div"); buttonBox.style.position = "absolute"; buttonBox.style.bottom = "5px"; buttonBox.style.right = "10px"; var button = document.createElement("button"); button.appendChild(document.createTextNode("Сохранить")); button.onclick = function() { GM_setValue("makabaCodeStyle", sel.options[sel.selectedIndex].value); GM_setValue("makabaCodeLineNos", !!lineNos.checked); document.body.removeChild(div); }; buttonBox.appendChild(button); var cButton = document.createElement("button"); cButton.appendChild(document.createTextNode("Отмена")); cButton.onclick = function() { document.body.removeChild(div); }; buttonBox.appendChild(cButton); div.appendChild(buttonBox); document.body.appendChild(div); var sel = document.getElementById("makabaCodeStyle"); var lineNos = document.getElementById("makabaCodeLineNos"); var style = GM_getValue("makabaCodeStyle", "friendly"); for (var i = 0; i < sel.options.length; ++i) { if (style == sel.options[i].value) { sel.options[i].selected = true; break; } } if (!!GM_getValue("makabaCodeLineNos", false)) lineNos.checked = true; mcode.toCenter(div); }; mcode.subtaskReceived = function(element, source, target) { var task = { "source": source, "target": target }; mcode.tasks[element.id]["subtasks"].push(task); if (mcode.tasks[element.id]["subtasks"].length == mcode.tasks[element.id]["subtaskCount"]) { mcode.doTask(element, mcode.tasks[element.id]["subtasks"]); delete mcode.tasks[element.id]; } }; mcode.doTask = function(element, subtasks) { if (!element || !subtasks || 0 === subtasks.length) return; var html = element.innerHTML; subtasks.forEach(function(task) { var source = task["source"]; var target = task["target"]; html = html.replace(source, target); }); element.innerHTML = html; }; mcode.request = function(element, source, lang) { if (!element || typeof source != "string") return; if (!lang) { lang = mcode.language(source); if (!mcode.inLangs(lang)) { delete mcode.tasks[element.id]; return; } } var params = "code=" + encodeURIComponent(mcode.code(source)); params += "&lexer=" + (!!lang ? encodeURIComponent(lang) : "text"); params += "&style=" + GM_getValue("makabaCodeStyle", "friendly"); if (!!GM_getValue("makabaCodeLineNos", false)) params += "&linenos=true"; GM_xmlhttpRequest({ method: "POST", url: "http://hilite.me/api", data: params, headers: { "Content-Type": "application/x-www-form-urlencoded" }, onload: function(res) { if (4 === res.readyState) { if (200 == res.status) { var html = res.responseText; html = html.replace("overflow:auto;", "overflow-y:hidden;"); html = html.replace("<pre style=\"margin: 0;", "<pre style=\"overflow-y: hidden; margin: 0;"); if (!!GM_getValue("makabaCodeLineNos", false)) html = html.replace("<pre style=\"margin: 0;", "<pre style=\"overflow-y: hidden; margin: 0;"); //Yep, twice, because there are two <pre> tags if (line numbers are enabled) mcode.subtaskReceived(element, source, html); } else { delete mcode.tasks[element.id]; alert(res.statusText); } } } }); }; mcode.processExpand = function(expand) { if (!expand) return; var a = document.createElement("a"); a.appendChild(document.createTextNode("Показать текст полностью")); var id = expand.parentNode.id.replace("m", ""); a.id = "expandLink" + id; (function(id, a) { document.body.addEventListener("click", function(e) { if (a.id != e.target.id) return; var parent = document.getElementById("m" + id); parent.removeChild(document.getElementById("shrinked-post" + id)); parent.removeChild(document.getElementById("expandLink" + id)); parent.innerHTML = document.getElementById("original-post" + id).innerHTML; }, false); })(id, a); expand.parentNode.replaceChild(a, expand); }; mcode.processBlockquote = function(element) { if (!element || !element.childNodes) return; element["makaba-code"] = "true"; var html = element.innerHTML; var rx = /\[code(\s+lang\="?(\w|\+|\-| |#)+"?)?\].+?\[\/code\]/gi; var matches = html.match(rx); if (!matches) return; var expand = element.querySelector("span.expand-large-comment"); if (expand) mcode.processExpand(expand); mcode.tasks[element.id] = { "subtasks": [], "subtaskCount": matches.length, }; matches.forEach(function(source) { mcode.request(element, source); }); }; mcode.processLink = function(link, host, href, after) { if (!link || !host || !href) return; link["makaba-code"] = "true"; (function(link) { var rx = new RegExp(host + "\/(\\w+)"); var m = link.href.match(rx); if (!m || m.length < 2) return; var id = m[1]; var div = document.createElement("div"); div.style.overflow = "hidden"; div.style.width = "1000px"; var iframe = document.createElement("iframe"); iframe.style.margin = 0; iframe.style.width = "1000px"; iframe.style.border = "none"; iframe.style.overflow = "hidden"; iframe.style.scrolling = "no"; iframe.src = href.replace("%id%", id); div.appendChild(iframe); if (typeof after != "function") { var height = (typeof after == "number") ? after : 500; div.style.height = height + "px"; iframe.style.height = height + "px"; return; } GM_xmlhttpRequest({ method: "GET", url: href.replace("%id%", id), onload: function(res) { if (4 === res.readyState) { if (200 == res.status) { var html = res.responseText; var height = after(html); div.style.height = height + "px"; iframe.style.height = height + "px"; if (html.indexOf("<div") < 0) return; link.parentNode.replaceChild(div, link); } else { alert(res.statusText); } } } }); })(link); }; mcode.processLinks = function(host, href, after) { var links = document.body.querySelectorAll("a[href^='http://" + host + "/']:not([makaba-code='true']), " + "a[href^='https://" + host + "/']:not([makaba-code='true'])"); if (!links) return; for (var i = 0; i < links.length; ++i) mcode.processLink(links[i], host, href, after); }; mcode.execute = function() { var elements = document.body.querySelectorAll("blockquote.post-message:not([makaba-code='true'])"); if (elements) { for (var i = 0; i < elements.length; ++i) mcode.processBlockquote(elements[i]); } mcode.processLinks("pastebin.com", "https://pastebin.com/embed_iframe.php?i=%id%", function(html) { return 21 * (html.match(/<li/gi) || []).length + 22 + 1; }); mcode.processLinks("ideone.com", "https://ideone.com/embed/%id%", function(html) { return 20 * (html.match(/<li class\="li1/gi) || []).length + 35 + 16; }); mcode.processLinks("jsfiddle.net", "https://jsfiddle.net/%id%/embedded"); }; mcode.caretPos = function(ctrl) { var caretPos = 0; // IE Support if (document.selection) { ctrl.focus (); var sel = document.selection.createRange (); sel.moveStart ('character', -ctrl.value.length); caretPos = Sel.text.length; } else if (ctrl.selectionStart || ctrl.selectionStart == '0') { // Firefox support caretPos = ctrl.selectionStart; } return (caretPos); }; mcode.setCaretPos = function(ctrl, pos) { if(ctrl.setSelectionRange) { ctrl.focus(); ctrl.setSelectionRange(pos,pos); } else if (ctrl.createTextRange) { var range = ctrl.createTextRange(); range.collapse(true); range.moveEnd('character', pos); range.moveStart('character', pos); range.select(); } }; mcode.insertCodeTag = function(lang) { var field = document.getElementById("shampoo"); var value = "[code lang=\"" + lang + "\"]\n\n[/code]"; var m = 0; if (document.selection) { field.focus(); var sel = document.selection.createRange(); sel.text = value; } else if (field.selectionStart || field.selectionStart == "0") { var startPos = field.selectionStart; var endPos = field.selectionEnd; m = field.value.length - endPos; field.value = field.value.substring(0, startPos) + value + field.value.substring(endPos); } else { field.value += value; } mcode.setCaretPos(field, mcode.caretPos(field) - 8 - m); field.focus(); }; mcode.processBeforeSubmit = function() { var shampoo = document.getElementById("shampoo"); var text = shampoo.value; var rx = /\[code(\s+lang\="?(\w|\+|\-| |#)+"?)?\](.|\n)+?\[\/code\]/gi; var matches = text.match(rx); if (!matches) return; for (var i = 0; i < matches.length; ++i) { var m = matches[i]; var pm = m; mcode.makabaTags.forEach(function(tag) { m = m.split("[" + tag + "]").join("[ " + tag + " ]"); }); text = text.replace(pm, m); } shampoo.value = text; }; mcode.initSubmitHook = function() { var sumbit = document.getElementById("submit"); var wrapper = document.createElement("div"); wrapper.style.display = "inline-block"; wrapper.style.width = "88px"; wrapper.style.backgroundColor = "#EAEAEA"; wrapper.style.borderColor = "#CACACA"; wrapper.style.borderWidth = "1px"; wrapper.style.borderStyle = "solid"; wrapper.style.paddingLeft = "6px"; wrapper.style.paddingRight = "6px"; wrapper.style.paddingTop = "2px"; wrapper.style.paddingBottom = "2px"; wrapper.style.marginLeft = "2px"; var nsubmit = document.createElement("a"); nsubmit.style.color = "#323232"; nsubmit.onclick = function() { mcode.processBeforeSubmit(); submit.click(); }; nsubmit.className = submit.className; nsubmit.appendChild(document.createTextNode(submit.value)); wrapper.appendChild(nsubmit); sumbit.parentNode.insertBefore(wrapper, submit); submit.style.display = "none"; }; mcode.initControls = function() { var toolbar = document.getElementById("CommentToolbar"); var span = document.createElement("span"); span.innerHTML = mcode.lexerSelectHtml; var button = document.createElement("button"); button.appendChild(document.createTextNode("Вставить тег [code]")); button.onclick = function() { var sel = document.getElementById("makabaCodeLexer"); var lang = sel.options[sel.selectedIndex].value; mcode.insertCodeTag(lang); return false; }; span.appendChild(button); var sButton = document.createElement("button"); var img = document.createElement("img"); img.src = "https://ololoepepe.me/files/configure.png"; sButton.appendChild(img); sButton.title = "Настройки"; sButton.onclick = function() { mcode.showSettings(); return false; }; span.insertBefore(sButton, span.firstChild); toolbar.appendChild(span); }; mcode.executeFirstTime = function() { mcode.execute(); document.addEventListener ("DOMNodeInserted", function(e) { var el = e.target; if (!el || !el.className) return; if ("post-wrapper" != el.className) return; mcode.execute(); }, false); mcode.initSubmitHook(); mcode.initControls(); }; mcode.addOnloadListener = function() { if (!document.addEventListener) return; document.addEventListener("DOMContentLoaded", mcode.executeFirstTime, false); }; mcode.addOnloadListener();