Fancy Yakety - Bonk.io

A mod to allow limited Markdown formatting.

目前为 2022-11-16 提交的版本。查看 最新版本

// ==UserScript==
// @name         Fancy Yakety - Bonk.io
// @version      0.0.1
// @author       left paren
// @description  A mod to allow limited Markdown formatting.
// @match        https://bonk.io/gameframe-release.html
// @run-at       document-start
// @license      MIT
// @namespace    left paren
// ==/UserScript==

// for use as a userscript ensure you have Excigma's code injector userscript
// https://greasyfork.org/en/scripts/433861-code-injector-bonk-io

const injectorName = `Fancy Yakety`;
const errorMsg = `Whoops! ${injectorName} was unable to load.
This may be due to an update to Bonk.io. If so, please report this error!
This could also be because you have an extension that is incompatible with \
${injectorName}`;

// $$ in replacement string is treated as $
function replace(src, qry, rpl){
  rpl = rpl.replaceAll('$', '$$$');
  return src.replace(qry, rpl);
}

// escape special regex characters for RegExp obj
function escReg(reg){
  return reg.replace(/([[\]])/g, "\\$1");
}

function injector(src){
    let newSrc = src;

    var MAINFUNC_MATCH = /requirejs\(.*?"use strict";/.exec(src);
    newSrc = replace(newSrc, MAINFUNC_MATCH[0], MAINFUNC_MATCH[0] + `var md_oldio = arguments[0];
    arguments[0] = ${(function() {
        let text = 'qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM';
        let bold= ['𝐪','𝐰','𝐞','𝐫','𝐭','𝐲','𝐮','𝐢','𝐨','𝐩','𝐚','𝐬','𝐝','𝐟','𝐠','𝐡','𝐣','𝐤','𝐥','𝐳','𝐱','𝐜','𝐯','𝐛','𝐧','𝐦','𝐐','𝐖','𝐄','𝐑','𝐓','𝐘','𝐔','𝐈','𝐎','𝐏','𝐀','𝐒','𝐃','𝐅','𝐆','𝐇','𝐉','𝐊','𝐋','𝐙','𝐗','𝐂','𝐕','𝐁','𝐍','𝐌'];
        let italic= ['𝑞','𝑤','𝑒','𝑟','𝑡','𝑦','𝑢','𝑖','𝑜','𝑝','𝑎','𝑠','𝑑','𝑓','𝑔','ℎ','𝑗','𝑘','𝑙','𝑧','𝑥','𝑐','𝑣','𝑏','𝑛','𝑚','𝑄','𝑊','𝐸','𝑅','𝑇','𝑌','𝑈','𝐼','𝑂','𝑃','𝐴','𝑆','𝐷','𝐹','𝐺','𝐻','𝐽','𝐾','𝐿','𝑍','𝑋','𝐶','𝑉','𝐵','𝑁','𝑀'];
        let boldtalic = ['𝒒','𝒘','𝒆','𝒓','𝒕','𝒚','𝒖','𝒊','𝒐','𝒑','𝒂','𝒔','𝒅','𝒇','𝒈','𝒉','𝒋','𝒌','𝒍','𝒛','𝒙','𝒄','𝒗','𝒃','𝒏','𝒎','𝑸','𝑾','𝑬','𝑹','𝑻','𝒀','𝑼','𝑰','𝑶','𝑷','𝑨','𝑺','𝑫','𝑭','𝑮','𝑯','𝑱','𝑲','𝑳','𝒁','𝑿','𝑪','𝑽','𝑩','𝑵','𝑴'];
        let formatting = ["\u0332", "\u0336"]
        var sock = md_oldio(...arguments)
        let oldEmit = sock.emit
        /// [10,{"message":"asdfsdafsfsf"}]
        sock.emit = function (id, thing) {
            if (id == 10) {
                arguments[1].message = arguments[1].message.replace(/\*\*(.*?)\*\*/gim, (_, t) => {
                    var bytes = t
                    var out = ""
                    for (var i=0; i < bytes.length; i++) {
                        if (/[\uD800-\uDBFF][\uDC00-\uDFFF]/.exec(bytes.slice(i, i+2))) {
                            var c = bytes.slice(i, i+2)
                            i += 1
                        } else {
                            var c = bytes[i]
                        }
                        if (text.includes(c)) {
                            out += bold[text.indexOf(c)]
                        } else if (italic.includes(c)) {
                            out += boldtalic[italic.indexOf(c)]
                        } else {
                            out += c
                        }
                    }
                    return out
                }).replace(/\*(.*?)\*/gim, (_, t) => {
                    var bytes = t
                    var out = ""
                    for (var i=0; i < bytes.length; i++) {
                        if (/[\uD800-\uDBFF][\uDC00-\uDFFF]/.exec(bytes.slice(i, i+2))) {
                            var c = bytes.slice(i, i+2)
                            i += 1
                        } else {
                            var c = bytes[i]
                        }
                        if (text.includes(c)) {
                            out += italic[text.indexOf(c)]
                        } else if (bold.includes(c)) {
                            out += boldtalic[bold.indexOf(c)]
                        } else {
                            out += c
                        }
                    }
                    return out
                }).replace(/__(.*?)__/gim, (_, t) => {
                    var bytes = t
                    var out = ""
                    for (var i=0; i < bytes.length; i++) {
                        if (/[\uD800-\uDBFF][\uDC00-\uDFFF]/.exec(bytes.slice(i, i+2))) {
                            var c = bytes.slice(i, i+2)
                            i += 1
                        } else {
                            var c = bytes[i]
                        }
                        out += c+"\u0332"
                    }
                    return out
                }).replace(/~~(.*?)~~/gim, (_, t) => {
                    var bytes = t
                    var out = "\u200b\u0336"
                    for (var i=0; i < bytes.length; i++) {
                        if (/[\uD800-\uDBFF][\uDC00-\uDFFF]/.exec(bytes.slice(i, i+2))) {
                            var c = bytes.slice(i, i+2)
                            i += 1
                        } else {
                            var c = bytes[i]
                        }
                        if (!formatting.includes(c)) {
                          out += c + "\u0336"
                        }
                    }
                    return out
                })
            }
            return oldEmit.call(this, ...arguments)
        }
        return sock
    })};`);

    if(src === newSrc) throw "Injection failed!";
    console.log(injectorName+" injector run");
    return newSrc;
}

// Compatibility with Excigma's code injector userscript
if(!window.bonkCodeInjectors) window.bonkCodeInjectors = [];
window.bonkCodeInjectors.push(bonkCode => {
	try {
		return injector(bonkCode);
	} catch (error) {
		alert(errorMsg);
		throw error;
	}
});

console.log(injectorName+" injector loaded");