2019-04-24 07:16:34 +02:00
|
|
|
|
//
|
|
|
|
|
// Copyright (c) 2019 Ted Unangst <tedu@tedunangst.com>
|
|
|
|
|
//
|
|
|
|
|
// Permission to use, copy, modify, and distribute this software for any
|
|
|
|
|
// purpose with or without fee is hereby granted, provided that the above
|
|
|
|
|
// copyright notice and this permission notice appear in all copies.
|
|
|
|
|
//
|
|
|
|
|
// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
|
|
|
// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
|
|
|
// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
|
|
|
// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
|
|
|
// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
|
|
|
// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
|
|
|
// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
|
|
|
|
|
|
|
|
package main
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"regexp"
|
|
|
|
|
|
|
|
|
|
"github.com/mattn/go-runewidth"
|
|
|
|
|
)
|
|
|
|
|
|
2019-09-19 04:53:13 +02:00
|
|
|
|
// these lists are mostly (?) accurate
|
2019-04-24 07:16:34 +02:00
|
|
|
|
var bigboldshitz = "𝐀𝐁𝐂𝐃𝐄𝐅𝐆𝐇𝐈𝐉𝐊𝐋𝐌𝐍𝐎𝐏𝐐𝐑𝐒𝐓𝐔𝐕𝐖𝐗𝐘𝐙"
|
|
|
|
|
var lilboldshitz = "𝐚𝐛𝐜𝐝𝐞𝐟𝐠𝐡𝐢𝐣𝐤𝐥𝐦𝐧𝐨𝐩𝐪𝐫𝐬𝐭𝐮𝐯𝐰𝐱𝐲𝐳"
|
2019-07-16 06:10:29 +02:00
|
|
|
|
var moeboldshitz = "𝗔𝗕𝗖𝗗𝗘𝗙𝗚𝗛𝗜𝗝𝗞𝗟𝗠𝗡𝗢𝗣𝗤𝗥𝗦𝗧𝗨𝗩𝗪𝗫𝗬𝗭"
|
|
|
|
|
var morboldshitz = "𝗮𝗯𝗰𝗱𝗲𝗳𝗴𝗵𝗶𝗷𝗸𝗹𝗺𝗻𝗼𝗽𝗾𝗿𝘀𝘁𝘂𝘃𝘄𝘅𝘆𝘇"
|
2019-04-24 07:16:34 +02:00
|
|
|
|
var biggothshitz = "𝕬𝕭𝕮𝕯𝕰𝕱𝕲𝕳𝕴𝕵𝕶𝕷𝕸𝕹𝕺𝕻𝕼𝕽𝕾𝕿𝖀𝖁𝖂𝖃𝖄𝖅"
|
|
|
|
|
var lilgothshitz = "𝖆𝖇𝖈𝖉𝖊𝖋𝖌𝖍𝖎𝖏𝖐𝖑𝖒𝖓𝖔𝖕𝖖𝖗𝖘𝖙𝖚𝖛𝖜𝖝𝖞𝖟"
|
2019-05-11 15:34:20 +02:00
|
|
|
|
var moegothshitz = "𝔄𝔅𝕮𝔇𝔈𝔉𝔊𝕳ℑ𝔍𝔎𝔏𝔐𝔑𝔒𝔓𝔔ℜ𝔖𝔗𝔘𝔙𝔚𝔛𝔜𝖅"
|
|
|
|
|
var morgothshitz = "𝔞𝔟𝔠𝔡𝔢𝔣𝔤𝔥𝔦𝔧𝔨𝔩𝔪𝔫𝔬𝔭𝔮𝔯𝔰𝔱𝔲𝔳𝔴𝔵𝔶𝔷"
|
2019-04-24 07:16:34 +02:00
|
|
|
|
var bigitalshitz = "𝑨𝑩𝑪𝑫𝑬𝑭𝑮𝑯𝑰𝑱𝑲𝑳𝑴𝑵𝑶𝑷𝑸𝑹𝑺𝑻𝑼𝑽𝑾𝑿𝒀𝒁"
|
|
|
|
|
var lilitalshitz = "𝒂𝒃𝒄𝒅𝒆𝒇𝒈𝒉𝒊𝒋𝒌𝒍𝒎𝒏𝒐𝒑𝒒𝒓𝒔𝒕𝒖𝒗𝒘𝒙𝒚𝒛"
|
2019-07-16 06:14:09 +02:00
|
|
|
|
var moeitalshitz = "𝘼𝘽𝘾𝘿𝙀𝙁𝙂𝙃𝙄𝙅𝙆𝙇𝙈𝙉𝙊𝙋𝙌𝙍𝙎𝙏𝙐𝙑𝙒𝙓𝙔𝙕"
|
|
|
|
|
var moritalshitz = "𝙖𝙗𝙘𝙙𝙚𝙛𝙜𝙝𝙞𝙟𝙠𝙡𝙢𝙣𝙤𝙥𝙦𝙧𝙨𝙩𝙪𝙫𝙬𝙭𝙮𝙯"
|
2019-04-24 07:16:34 +02:00
|
|
|
|
var bigbangshitz = "𝔸𝔹ℂ𝔻𝔼𝔽𝔾ℍ𝕀𝕁𝕂𝕃𝕄ℕ𝕆ℙℚℝ𝕊𝕋𝕌𝕍𝕎𝕏𝕐ℤ"
|
|
|
|
|
var lilbangshitz = "𝕒𝕓𝕔𝕕𝕖𝕗𝕘𝕙𝕚𝕛𝕜𝕝𝕞𝕟𝕠𝕡𝕢𝕣𝕤𝕥𝕦𝕧𝕨𝕩𝕪𝕫"
|
2019-05-22 01:01:53 +02:00
|
|
|
|
var bigwideshitz = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
2019-05-22 02:12:41 +02:00
|
|
|
|
var lilwideshitz = "abcdefghijklmnopqrstuvwxyz"
|
2019-05-02 00:46:36 +02:00
|
|
|
|
var bigblokshitz = "🅰🅱🅲🅳🅴🅵🅶🅷🅸🅹🅺🅻🅼🅽🅾🅿🆀🆁🆂🆃🆄🆅🆆🆇🆈🆉"
|
2019-09-19 04:53:13 +02:00
|
|
|
|
var evenmoeshitz = "𝐴𝐵𝐶𝐷𝐸𝐹𝐺𝐻𝐼𝐽𝐾𝐿𝑀𝑁𝑂𝑃𝑄𝑅𝑆𝑇𝑈𝑉𝑊𝑋𝑌𝑍"
|
|
|
|
|
var evenmorshitz = "𝒶𝒷𝒸𝒹𝑒𝒻𝓰𝒽𝒾𝒿𝓀𝓁𝓂𝓃𝓸𝓅𝓆𝓇𝓈𝓉𝓊𝓋𝓌𝓍𝓎𝓏"
|
2019-04-24 07:16:34 +02:00
|
|
|
|
|
2019-05-01 00:04:18 +02:00
|
|
|
|
var re_alltheshitz = regexp.MustCompile(`([` +
|
2019-04-24 07:16:34 +02:00
|
|
|
|
bigboldshitz + lilboldshitz +
|
2019-07-16 06:10:29 +02:00
|
|
|
|
moeboldshitz + morboldshitz +
|
2019-04-24 07:16:34 +02:00
|
|
|
|
biggothshitz + lilgothshitz +
|
2019-05-11 15:34:20 +02:00
|
|
|
|
moegothshitz + morgothshitz +
|
2019-04-24 07:16:34 +02:00
|
|
|
|
bigitalshitz + lilitalshitz +
|
2019-07-16 06:14:09 +02:00
|
|
|
|
moeitalshitz + moritalshitz +
|
2019-04-24 07:16:34 +02:00
|
|
|
|
bigbangshitz + lilbangshitz +
|
2019-05-22 01:01:53 +02:00
|
|
|
|
bigwideshitz + lilwideshitz +
|
2019-09-19 04:53:13 +02:00
|
|
|
|
evenmoeshitz + evenmorshitz +
|
2019-05-02 00:46:36 +02:00
|
|
|
|
bigblokshitz +
|
2019-05-11 15:34:20 +02:00
|
|
|
|
"][ '\ufe0f]?){3,}")
|
2019-04-24 07:16:34 +02:00
|
|
|
|
|
2019-09-19 04:53:13 +02:00
|
|
|
|
var allUppers = []string{bigboldshitz, moeboldshitz, biggothshitz, bigwideshitz, moegothshitz, bigitalshitz, moeitalshitz, bigbangshitz, bigblokshitz, evenmoeshitz}
|
|
|
|
|
var allLowers = []string{lilboldshitz, morboldshitz, lilgothshitz, lilwideshitz, morgothshitz, lilitalshitz, moritalshitz, lilbangshitz, evenmorshitz}
|
2019-07-16 06:10:29 +02:00
|
|
|
|
|
2019-09-27 22:48:34 +02:00
|
|
|
|
var skinTones = "\U0001F3FB\U0001F3FC\U0001F3FD\U0001F3FE\U0001F3FF"
|
|
|
|
|
var re_moredumb = regexp.MustCompile("[\U0001f44f\U0001f6a8\U000026a0][" + skinTones + "\ufe0f]*")
|
2019-05-17 22:11:40 +02:00
|
|
|
|
|
2019-04-24 07:16:34 +02:00
|
|
|
|
// this may not be especially fast
|
|
|
|
|
func unpucker(s string) string {
|
|
|
|
|
fixer := func(r string) string {
|
|
|
|
|
x := make([]byte, len(r))
|
|
|
|
|
xi := 0
|
|
|
|
|
loop1:
|
|
|
|
|
for _, c := range r {
|
|
|
|
|
xi++
|
2019-05-11 15:34:20 +02:00
|
|
|
|
if c == ' ' || c == '\'' {
|
|
|
|
|
x[xi] = byte(c)
|
2019-05-01 00:04:18 +02:00
|
|
|
|
continue
|
|
|
|
|
}
|
2019-07-16 06:10:29 +02:00
|
|
|
|
for _, set := range allUppers {
|
2019-04-24 07:16:34 +02:00
|
|
|
|
i := 0
|
|
|
|
|
for _, rr := range set {
|
|
|
|
|
if rr == c {
|
|
|
|
|
x[xi] = byte('A' + i)
|
|
|
|
|
continue loop1
|
|
|
|
|
}
|
|
|
|
|
i++
|
|
|
|
|
}
|
|
|
|
|
}
|
2019-07-16 06:10:29 +02:00
|
|
|
|
for _, set := range allLowers {
|
2019-04-24 07:16:34 +02:00
|
|
|
|
i := 0
|
|
|
|
|
for _, rr := range set {
|
|
|
|
|
if rr == c {
|
|
|
|
|
x[xi] = byte('a' + i)
|
|
|
|
|
continue loop1
|
|
|
|
|
}
|
|
|
|
|
i++
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
x[xi] = '.'
|
|
|
|
|
}
|
|
|
|
|
return string(x)
|
|
|
|
|
}
|
|
|
|
|
s = re_alltheshitz.ReplaceAllStringFunc(s, fixer)
|
2019-04-25 16:59:57 +02:00
|
|
|
|
|
2019-05-17 22:11:40 +02:00
|
|
|
|
s = re_moredumb.ReplaceAllString(s, ".")
|
|
|
|
|
|
2019-04-24 07:16:34 +02:00
|
|
|
|
zw := false
|
|
|
|
|
for _, c := range s {
|
|
|
|
|
if runewidth.RuneWidth(c) == 0 {
|
|
|
|
|
zw = true
|
2019-04-25 16:59:57 +02:00
|
|
|
|
break
|
2019-04-24 07:16:34 +02:00
|
|
|
|
}
|
|
|
|
|
}
|
2019-04-25 16:59:57 +02:00
|
|
|
|
if zw {
|
|
|
|
|
x := make([]byte, 0, len(s))
|
|
|
|
|
zw = false
|
|
|
|
|
for _, c := range s {
|
|
|
|
|
if runewidth.RuneWidth(c) == 0 {
|
|
|
|
|
if zw {
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
zw = true
|
|
|
|
|
} else {
|
|
|
|
|
zw = false
|
|
|
|
|
}
|
|
|
|
|
q := string(c)
|
|
|
|
|
x = append(x, []byte(q)...)
|
|
|
|
|
}
|
|
|
|
|
return string(x)
|
|
|
|
|
}
|
|
|
|
|
return s
|
2019-04-24 07:16:34 +02:00
|
|
|
|
}
|