NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name Mastodon Monotext // @namespace http://tampermonkey.net/ // @version 0.5 // @description add limited markdown-like formatting capabilities to mastodon using unicode // @author MightyPork, using original code by cpsdqs // @match https://dev.glitch.social/web/* // @match https://ephemeral.glitch.social/web/* // @match https://mastodon.social/web/* // @match https://witches.town/web/* // @match https://glitch.social/web/* // @match https://cybre.space/web/* // @match https://mastodon.xyz/web/* // ==/UserScript== (function() { 'use strict'; let monotext = (function() { /** * (c) cpsdqs 2016 * MIT License * * A small utility for converting text to unicode variants */ // offsets to apply counting up from 0-26 for A-Z, 27-52 for a-z, and 0-9 for 0-9 /* * letters sorted alphabetically * m: monospace * b: bold * i: italic * c: script * f: fraktur * d: double-struck * s: sans-serif * g: greek */ let offsets = { m: [0x1d670, 0x1d7f6], b: [0x1d400, 0x1d7ce], i: [0x1d434, 0x00030], bi: [0x1d468, 0x00030], c: [0x1d49c, 0x00030], bc: [0x1d4d0, 0x00030], f: [0x1d504, 0x00030], d: [0x1d538, 0x1d7d8], bf: [0x1d56c, 0x00030], s: [0x1d5a0, 0x1d7e2], bs: [0x1d5d4, 0x1d7ec], is: [0x1d608, 0x00030], bis: [0x1d63c, 0x00030], bg: [0x1d6a8, 0x00030], gi: [0x1d6e2, 0x00030], bgi: [0x1d71c, 0x00030] }; // special characters (absolute values) // applied *before* any offsets let special = { m: { ' ': 0x2000, '-': 0x2013 }, i: { 'h': 0x210e }, f: { 'C': 0x212d, 'H': 0x210c, 'I': 0x2111, 'R': 0x211c, 'Z': 0x2128 } }; let chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'; let numbers = '0123456789'; let convert = function(t, type) { if(!type) return t; let result = ''; for (let k of t) { let index; let c = k; if (type == 'u') { result += c + '\u0332'; } else if (type == 't') { result += c + '\u0336'; } else { if (special[type] && special[type][c]) c = String.fromCodePoint(special[type][c]); if ((index = chars.indexOf(c)) > -1) result += String.fromCodePoint(index + offsets[type][0]); else if ((index = numbers.indexOf(c)) > -1) result += String.fromCodePoint(index + offsets[type][1]); else result += c; } } return result; }; return convert; })(); let processToot = function(str) { const regex = /([\W]|^)([%`_*~=\\-])(.*?)\2(?![a-z0-9])/gi; let m; return str.replace(regex, function (match, prev, format, text) { let type = ''; if (format == '_') type = 'i'; if (format == '*') type = 'b'; if (format == '%') type = 'f'; if (format == '`') type = 'm'; if (format == '~') type = 'bc'; if (format == '=') type = 'd'; if (format == '\\') type = 'u'; if (format == '-') type = 't'; return prev+monotext(text, type); }); }; setTimeout(() => { document.querySelector('.compose-form__publish-button-wrapper > button').addEventListener('click', (e) => { let ta = document.querySelector('.autosuggest-textarea__textarea'); ta.value = processToot(ta.value); }); }, 1000); })();