Fancy Text Converter

Converts to letter-look-alike text.

by MegaScience

HTML

<select id="ConvertMode" name="ConvertMode"><!--
  <option value="MinecraftTrick" selected>Minecraft Trick Text</option>
  <option value="FFXIVBlockText">FFXIV Block Text</option>
  <option value="SortWords">Sort Words</option>
--></select>
<textarea id="input"></textarea>
<textarea id="output" readonly></textarea>

CSS

html {
  display: flex;
  height: 100%;
}

body.darkMode {
  &, select, textarea {
    background-color: black;
    color: white;
  }
}

body {
  display: flex;
  flex-grow: 1;
  flex-direction: column;
}

textarea {
  flex-grow: 1;
  --matchHighlight: #00000000;
  box-shadow: 0px 0px 5px 0px var(--matchHighlight);
}

textarea#output:not(.matches) {
  --matchHighlight: #FF0000;
}

textarea#output.matches {
  --matchHighlight: #00FF00;
}

JavaScript

class textConverterClass {
    static converters = new Set()
}

class MinecraftTrick extends textConverterClass {
    static { textConverterClass.converters.add(this) }
    static friendlyName = 'Minecraft Trick Text'
    static input = 'eawmyilo_Cn3'
    static output = 'ɐəɯʍч¡|○▁⊂ηЗ'
}

class FFXIVBlockText extends textConverterClass {
    static { textConverterClass.converters.add(this) }
    static friendlyName = 'FFXIV Block Text'
    static input = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
    static output = ''
    static inputOperation = t => t.toUpperCase()
}

class SortWords extends textConverterClass {
    static { textConverterClass.converters.add(this) }
    static friendlyName = 'Sort Words'
    static input = ''
    static output = ''
    static sortFunction = (a, b) => a.localeCompare(b, 'en', { 'sensitivity': 'base' })
    static inputOperation = function (value) {
        const words = value.split(' ')
        for (const [index, word] of words.entries()) words[index] = [...word].sort(this.sortFunction).join('')
        return words.join(' ')
    }
}

class SortTags extends textConverterClass {
    static { textConverterClass.converters.add(this) }
    static friendlyName = 'Sort Tags'
    static input = ''
    static output = ''
    static filterList = n => n
    static regex = {
        inputOperation: /, ?/
    }
    static mapIn = (() => {
        const regex = /(?<!\\)[()\[\]]/g
        return v => [v, v.replace(regex, '')]
    })()
    static mapOut = ([v]) => v
    static sortFunction = ([, a], [, b]) => a.localeCompare(b, 'en', { 'sensitivity': 'base' })
    static inputOperation = function (value) {
        return value.split(this.regex.inputOperation).filter(this.filterList).map(this.mapIn).sort(this.sortFunction).map(this.mapOut).join(', ')
    }
}

class DanbooruToAI extends textConverterClass {
    static { textConverterClass.converters.add(this) }
    static...