// ==UserScript== // @name Go.dev Golang Website Code Highlight // @version 1.1.7 // @description Golang code highlighter // @author Anton Vi // @match https://*.go.dev/* // @resource IMPORTED_CSS https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism-tomorrow.min.css // @grant GM_getResourceText // @grant GM_addStyle // @license GNU GPLv3 // @exclude https://go.dev/tour/* // @exclude https://go.dev/solutions/* // @exclude https://go.dev/security/* // @namespace GolangDevNamespace // @downloadURL https://update.greasyfork.icu/scripts/482660/Godev%20Golang%20Website%20Code%20Highlight.user.js // @updateURL https://update.greasyfork.icu/scripts/482660/Godev%20Golang%20Website%20Code%20Highlight.meta.js // ==/UserScript== (function() { 'use strict'; document.addEventListener('readystatechange', (e) => { if (e.target.readyState === 'complete') { resetBlogCss(); start(); } }) })(); function resetBlogCss() { // reset styles for go dev blog let css = `#blog pre, #content .code, #content .playground { background: black; font-family: Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace; font-size: 1rem; }`; GM_addStyle(css); } function start() { // create Prisma object window.Prism = window.Prism || {}; // no highlight on auto Prism.manual = true; // add highlight styles css const my_css = GM_getResourceText("IMPORTED_CSS"); GM_addStyle(my_css); // loop pre-s and add code child elements for highlight let pre_s = document.getElementsByTagName('pre'); for (let el of pre_s) { // skip pre element for ==Output== code run in documentation if (el.getElementsByClassName('Documentation-exampleOutputLabel').length > 0) { continue; } el.className = 'language-go'; if (!el.getElementsByTagName('code').length > 0) { let text = el.innerHTML; el.innerHTML = ''; let code = document.createElement('code'); code.innerHTML = text; code.className = 'language-go'; el.appendChild(code); } } // get examples in go library doc let divS = document.getElementsByClassName('Documentation-exampleDetailsBody'); for (divEl of divS) { let outputPre = divEl.getElementsByTagName('pre')[0]; outputPre.className = 'language-go'; let textareaBlock = divEl.querySelector('textarea.Documentation-exampleCode.code'); textareaBlock.style.display = 'none'; // textareaBlock.remove(); divEl.insertAdjacentHTML('afterbegin', '
' + textareaBlock.value + '
');
}
// start prism
initPrismCore();
// add languages syntax
addClikeSyntax();
addGoSyntax();
// start highlight syntax
Prism.highlightAll();
}
function initPrismCore() {
var _self = "undefined" != typeof window ? window : "undefined" != typeof WorkerGlobalScope && self instanceof WorkerGlobalScope ? self : {},
Prism = function(e) {
var n = /(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,
t = 0,
r = {},
a = {
manual: e.Prism && e.Prism.manual,
disableWorkerMessageHandler: e.Prism && e.Prism.disableWorkerMessageHandler,
util: {
encode: function e(n) { return n instanceof i ? new i(n.type, e(n.content), n.alias) : Array.isArray(n) ? n.map(e) : n.replace(/&/g, "&").replace(/= g.reach); A += w.value.length, w = w.next) {
var E = w.value;
if (n.length > e.length) return;
if (!(E instanceof i)) {
var P, L = 1;
if (y) {
if (!(P = l(b, A, e, m)) || P.index >= e.length) break;
var S = P.index,
O = P.index + P[0].length,
j = A;
for (j += w.value.length; S >= j;) j += (w = w.next).value.length;
if (A = j -= w.value.length, w.value instanceof i) continue;
for (var C = w; C !== n.tail && (j < O || "string" == typeof C.value); C = C.next) L++, j += C.value.length;
L--, E = e.slice(A, j), P.index -= A
} else if (!(P = l(b, 0, E, m))) continue;
S = P.index;
var N = P[0],
_ = E.slice(0, S),
M = E.slice(S + N.length),
W = A + E.length;
g && W > g.reach && (g.reach = W);
var z = w.prev;
if (_ && (z = u(n, z, _), A += _.length), c(n, z, L), w = u(n, z, new i(f, p ? a.tokenize(N, p) : N, k, N)), M && u(n, w, M), L > 1) {
var I = { cause: f + "," + d, reach: W };
o(e, n, t, w.prev, A, I), g && I.reach > g.reach && (g.reach = I.reach)
}
}
}
}
}
}
function s() {
var e = { value: null, prev: null, next: null },
n = { value: null, prev: e, next: null };
e.next = n, this.head = e, this.tail = n, this.length = 0
}
function u(e, n, t) {
var r = n.next,
a = { value: t, prev: n, next: r };
return n.next = a, r.prev = a, e.length++, a
}
function c(e, n, t) {
for (var r = n.next, a = 0; a < t && r !== e.tail; a++) r = r.next;
n.next = r, r.prev = n, e.length -= a
}
if (e.Prism = a, i.stringify = function e(n, t) {
if ("string" == typeof n) return n;
if (Array.isArray(n)) { var r = ""; return n.forEach((function(n) { r += e(n, t) })), r }
var i = { type: n.type, content: e(n.content, t), tag: "span", classes: ["token", n.type], attributes: {}, language: t },
l = n.alias;
l && (Array.isArray(l) ? Array.prototype.push.apply(i.classes, l) : i.classes.push(l)), a.hooks.run("wrap", i);
var o = "";
for (var s in i.attributes) o += " " + s + '="' + (i.attributes[s] || "").replace(/"/g, """) + '"';
return "<" + i.tag + ' class="' + i.classes.join(" ") + '"' + o + ">" + i.content + "" + i.tag + ">"
}, !e.document) return e.addEventListener ? (a.disableWorkerMessageHandler || e.addEventListener("message", (function(n) {
var t = JSON.parse(n.data),
r = t.language,
i = t.code,
l = t.immediateClose;
e.postMessage(a.highlight(i, a.languages[r], r)), l && e.close()
}), !1), a) : a;
var g = a.util.currentScript();
function f() { a.manual || a.highlightAll() }
if (g && (a.filename = g.src, g.hasAttribute("data-manual") && (a.manual = !0)), !a.manual) { var h = document.readyState; "loading" === h || "interactive" === h && g && g.defer ? document.addEventListener("DOMContentLoaded", f) : window.requestAnimationFrame ? window.requestAnimationFrame(f) : window.setTimeout(f, 16) }
return a
}(_self);
"undefined" != typeof module && module.exports && (module.exports = Prism), "undefined" != typeof global && (global.Prism = Prism);
}
function addClikeSyntax() {
Prism.languages.clike = {
comment: [{ pattern: /(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/, lookbehind: !0, greedy: !0 },
{ pattern: /(^|[^\\:])\/\/.*/, lookbehind: !0, greedy: !0 }
],
string: { pattern: /(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/, greedy: !0 },
"class-name": { pattern: /(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i, lookbehind: !0, inside: { punctuation: /[.\\]/ } },
keyword: /\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,
boolean: /\b(?:false|true)\b/,
function: /\b\w+(?=\()/,
number: /\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,
operator: /[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,
punctuation: /[{}[\];(),.:]/
};
}
function addGoSyntax() {
Prism.languages.go = Prism.languages
.extend("clike", {
string: { pattern: /(^|[^\\])"(?:\\.|[^"\\\r\n])*"|`[^`]*`/, lookbehind: !0, greedy: !0 },
keyword: /\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,
boolean: /\b(?:_|false|iota|nil|true)\b/,
number: [/\b0(?:b[01_]+|o[0-7_]+)i?\b/i, /\b0x(?:[a-f\d_]+(?:\.[a-f\d_]*)?|\.[a-f\d_]+)(?:p[+-]?\d+(?:_\d+)*)?i?(?!\w)/i, /(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?[\d_]+)?i?(?!\w)/i],
operator: /[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,
builtin: /\b(?:append|bool|byte|cap|close|complex|complex(?:64|128)|copy|delete|error|float(?:32|64)|u?int(?:8|16|32|64)?|imag|len|make|new|panic|print(?:ln)?|real|recover|rune|string|uintptr)\b/
}),
Prism.languages.insertBefore("go", "string", { char: { pattern: /'(?:\\.|[^'\\\r\n]){0,10}'/, greedy: !0 } }), delete Prism.languages.go["class-name"];
}