NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name HKGolden CodeMirror // @namespace Saren // @description HKGolden code tag syntax highlighter, powered by CodeMirror and cdnjs // @include http://*.hkgolden.com/view.aspx*message=* // @require http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js // @version 0.0.2c // ==/UserScript== this.$ = this.jQuery = jQuery.noConflict(true); var similarTable = []; var theme = "ambiance"; var languages = { "xml": "xml", "html": ["xml", "javascript", "css", "vbscript", "htmlmixed"], "lisp": "commonlisp", "sql": "sql", "mysql": "sql", "postgresql": "sql", "mssql": "sql", "livescript": "livescript", "gas": "gas", "python": "python", "q": "q", "haml": "haml", "eiffel": "eiffel", "pig latin": "pig", "jinja2": "jinja2", "ruby": "ruby", "scala": "clike", "shell": "shell", "vbscript": "vbscript", "stex": "stex", "latex": "stex", "vb.net": "vb", "fortran": "fortran", "cobol": "cobol", "tcl": "tcl", "gherkin": "gherkin", "perl": "perl", "cython": "python", "xquery": "xquery", "toml": "toml", "sieve": "sieve", "smalltalk": "smalltalk", "sparql": "sparql", "django": "django", "haxe": "haxe", "f#": "mllike", "groovy": "groovy", "ocaml": "mllike", "diff": "diff", "puppet": "puppet", "rust": "rust", "pascal": "pascal", "javascript": "javascript", "less": "css", "apl": "apl", "smarty": ["xml", "javascript", "css", "htmlmixed", "smarty", "smartymixed"], "octave": "octave", "velocity": "velocity", "d": "d", "php": "php", "rpm": "rpm", "rpm spec": "spec", "rpm changelog": "changes", "r": "r", "yaml": "yaml", "verilog": "verilog", "systemverilog": "verilog", "asterisk dialplan": "asterisk", "asterisk": "asterisk", "go": "go", "tiki wiki": "tiki", "properties files": "properties", "ntriples": "ntriples", "nginx": "nginx", "sass": "sass", "html embedded": ["xml", "javascript", "css", "htmlmixed", "htmlembedded"], "scss": "css", "haskell": "haskell", "clojure": "clojure", "ecl": "ecl", "c": "clike", "c++": "clike", "c#": "clike", "java": "clike", "http": "http", "turtle": "turtle", "mirc": "mirc", "erlang": "erlang", "restructuredtext": "rst", "tiddlywiki": "tiddlywiki", "peg.js": "pegjs", "css": "css", "coffeescript": "coffeescript", "z80": "z80", "lua": "lua", "solr": "solr", "jade": "jade", "julia": "julia", "scheme": "scheme", "cypher": "cypher", "markdown": ["xml", "markdown"], "github markdown": ["xml", "markdown", "javascript", "css", "htmlmixed", "clike", "gfm"], "dtd": "dtd", "dylan": "dylan" }; function levDist(s, t) { var d = []; //2d matrix // Step 1 var n = s.length; var m = t.length; if (n == 0) return m; if (m == 0) return n; //Create an array of arrays in javascript (a descending loop is quicker) for (var i = n; i >= 0; i--) d[i] = []; // Step 2 for (var i = n; i >= 0; i--) d[i][0] = i; for (var j = m; j >= 0; j--) d[0][j] = j; // Step 3 for (var i = 1; i <= n; i++) { var s_i = s.charAt(i - 1); // Step 4 for (var j = 1; j <= m; j++) { //Check the jagged ld total so far if (i == j && d[i][j] > 4) return n; var t_j = t.charAt(j - 1); var cost = (s_i == t_j) ? 0 : 1; // Step 5 //Calculate the minimum var mi = d[i - 1][j] + 1; var b = d[i][j - 1] + 1; var c = d[i - 1][j - 1] + cost; if (b < mi) mi = b; if (c < mi) mi = c; d[i][j] = mi; // Step 6 //Damerau transposition if (i > 1 && j > 1 && s_i == t.charAt(j - 2) && s.charAt(i - 2) == t_j) { d[i][j] = Math.min(d[i][j], d[i - 2][j - 2] + cost); } } } // Step 7 return d[n][m]; } function loadFile(url, type, callback) { var head = document.getElementsByTagName('head')[0]; if (type == "js") { //if filename is a external JavaScript file var fileref = document.createElement('script'); fileref.type = "text/javascript"; fileref.src = url; } else if (type == "css") { //if filename is an external CSS file var fileref = document.createElement('link'); fileref.rel = "stylesheet"; fileref.type = "text/css"; fileref.href = url; } fileref.onreadystatechange = callback; fileref.onload = callback; head.appendChild(fileref); } function preSetCodeMirror(elem, jsName) { loadFile("//cdnjs.cloudflare.com/ajax/libs/codemirror/4.2.0/mode/" + jsName + "/" + jsName + ".js", "js", function() { setCodeMirror(elem, jsName); }); } function preSetCodeMirrorJSArray(elem, jsNames) { var count = jsNames.length; for (var i in jsNames) { loadFile("//cdnjs.cloudflare.com/ajax/libs/codemirror/4.2.0/mode/" + jsNames[i] + "/" + jsNames[i] + ".js", "js", function() { count--; if (count === 0) { setCodeMirror(elem, jsNames[jsNames.length - 1]); } }); } } function betterTab(cm) { if (cm.somethingSelected()) { cm.indentSelection("add"); } else { cm.replaceSelection(cm.getOption("indentWithTabs")? "\t": Array(cm.getOption("indentUnit") + 1).join(" "), "end", "+input"); } } function setCodeMirror(elem, langMode) { var CodeMirrorEditor = CodeMirror(function(elt) { elem.parentNode.replaceChild(elt, elem); }, { value: $(elem).text(), mode: langMode, indentWithTabs: false, indentUnit: 4, lineWrapping: true, lineNumbers: true, theme: theme, extraKeys: { Tab: betterTab } }); var charWidth = CodeMirrorEditor.defaultCharWidth(), basePadding = 4; CodeMirrorEditor.on("renderLine", function(cm, line, elt) { var off = CodeMirror.countColumn(line.text, null, cm.getOption("tabSize")) * charWidth; elt.style.textIndent = "-" + off + "px"; elt.style.paddingLeft = (basePadding + off) + "px"; }); CodeMirrorEditor.refresh(); } function getValueOfSimilarestKey(string, dict) { if (string in similarTable) { return similarTable[string]; } var similarites = []; for (var key in dict) { similarites[key] = levDist(string, key); if (similarites[key] === 0) { similarTable[string] = dict[key]; return dict[key]; } } var min = similarites[key]; var target = key; for (var key in similarites) { if (similarites[key] < min) { target = key; min = similarites[key]; } } similarTable[string] = dict[target]; return dict[target]; } function setCodeMirrors() { var pre; var postCount = 0; var editorCount = 0; var postLanguages; var jsName; var editorLanguages = []; $(".ContentGrid").each(function() { postLanguages = []; $(this).find("strong").each(function () { postLanguages.push($(this).text().toLowerCase()); }); editorLanguages.push(postLanguages); }); for (var post in editorLanguages) { for (var editor in editorLanguages[post]) { editorLanguages[post][editor] = getValueOfSimilarestKey(editorLanguages[post][editor], languages); } } $(".ContentGrid").each(function() { editorCount = 0; $(this).find("pre").each(function() { jsName = editorLanguages[postCount][editorCount]; pre = this; if (typeof jsName !== 'undefined') { if (jsName instanceof Array) { preSetCodeMirrorJSArray(pre, jsName); } else { preSetCodeMirror(pre, jsName); } } editorCount++; }); postCount++; }); } $(function () { loadFile("//cdnjs.cloudflare.com/ajax/libs/codemirror/4.2.0/codemirror.css", "css", function() {}); loadFile("//cdnjs.cloudflare.com/ajax/libs/codemirror/4.2.0/theme/" + theme + ".css", "css", function() {}); var css = document.createElement("style"); css.type = "text/css"; css.innerHTML = ".CodeMirror { border: 1px solid #eee; height: auto; } .CodeMirror-scroll { overflow-y: hidden; overflow-x: auto; } .CodeMirror-linenumber { z-index: 1; } .CodeMirror-gutters { z-index: 0; }"; document.body.appendChild(css); loadFile("//cdnjs.cloudflare.com/ajax/libs/codemirror/4.2.0/codemirror.js", "js", function() { setCodeMirrors(); }); });