defmodule UrbitEx.Utils do def random_hex(num) do :crypto.strong_rand_bytes(num) |> Base.encode16(case: :lower) end def tokenize(string) do urls = tokenize_item(string, :url) mentions = tokenize_item(string, :mention) non_text = [urls, mentions] |> List.flatten() text = extract_text(string) [text, non_text] |> List.flatten() |> Enum.sort_by(fn {_token, index} -> index end) |> Enum.map(fn {token, _ind} -> token end) end def tokenize_item(string, type) do list = extract_token(string, type) indexes = Regex.scan(regexes()[type], string, return: :index) |> List.flatten() list |> Enum.with_index() |> Enum.map(fn {item, index} -> {item, indexes |> Enum.at(index) |> elem(0)} end) |> Enum.map(fn {item, ind} -> {%{type => item}, ind} end) end def extract_text(string) do t = string |> String.split(regexes().url) |> Enum.map(&String.split(&1, regexes().mention)) |> List.flatten() indexes = t |> Enum.map(fn x -> Regex.scan(Regex.compile!(x), string, return: :index) end) |> List.flatten() |> Enum.map(fn {ind, _length} -> ind end) t |> Enum.with_index() |> Enum.map(fn {item, ind} -> {item, Enum.at(indexes, ind)} end) |> Enum.map(fn {item, ind} -> {%{text: item}, ind} end) end def extract_token(string, type) do Regex.scan(regexes()[type], string) |> List.flatten() end def check_patp(shipname) do syllables = syllabize(shipname) case syllables.length do 1 -> syllable_list().s |> Enum.member?(syllables[0]) 2 -> check_bisyllable(syllables) 4 -> check_long(syllables) 8 -> check_long(syllables) 16 -> check_long(syllables) _ -> false end end def check_long(syllables) do join = syllables |> Enum.join() pairs = Regex.scan(~r(.{6}), join) |> List.flatten() |> Enum.map(fn x -> Regex.scan(~r/.{3}/, x) |> List.flatten() end) Enum.all?(pairs, fn x -> check_bisyllable(x) end) end def check_bisyllable(pair) do [pref, suf] = pair syllable_list().p |> Enum.member?(pref) && syllable_list().s |> Enum.member?(suf) end def syllabize(shipname) do clean = shipname |> String.replace(~r([~^-]), "") Regex.scan(~r(.{3}), clean) |> List.flatten() end defp regexes do %{ url: ~r/\w+:\/\/[-a-zA-Z0-9:@;?&=\/%\+\.\*!'\(\),\$_\{\}\^~\[\]`#|]+\w/, mention: ~r/~[bcdfghjlmnprstwz][aeiouy][\w^-]+/, code: ~r/`.+`/ } end defp syllable_list do %{ p: [ "doz", "mar", "bin", "wan", "sam", "lit", "sig", "hid", "fid", "lis", "sog", "dir", "wac", "sab", "wis", "sib", "rig", "sol", "dop", "mod", "fog", "lid", "hop", "dar", "dor", "lor", "hod", "fol", "rin", "tog", "sil", "mir", "hol", "pas", "lac", "rov", "liv", "dal", "sat", "lib", "tab", "han", "tic", "pid", "tor", "bol", "fos", "dot", "los", "dil", "for", "pil", "ram", "tir", "win", "tad", "bic", "dif", "roc", "wid", "bis", "das", "mid", "lop", "ril", "nar", "dap", "mol", "san", "loc", "nov", "sit", "nid", "tip", "sic", "rop", "wit", "nat", "pan", "min", "rit", "pod", "mot", "tam", "tol", "sav", "pos", "nap", "nop", "som", "fin", "fon", "ban", "mor", "wor", "sip", "ron", "nor", "bot", "wic", "soc", "wat", "dol", "mag", "pic", "dav", "bid", "bal", "tim", "tas", "mal", "lig", "siv", "tag", "pad", "sal", "div", "dac", "tan", "sid", "fab", "tar", "mon", "ran", "nis", "wol", "mis", "pal", "las", "dis", "map", "rab", "tob", "rol", "lat", "lon", "nod", "nav", "fig", "nom", "nib", "pag", "sop", "ral", "bil", "had", "doc", "rid", "moc", "pac", "rav", "rip", "fal", "tod", "til", "tin", "hap", "mic", "fan", "pat", "tac", "lab", "mog", "sim", "son", "pin", "lom", "ric", "tap", "fir", "has", "bos", "bat", "poc", "hac", "tid", "hav", "sap", "lin", "dib", "hos", "dab", "bit", "bar", "rac", "par", "lod", "dos", "bor", "toc", "hil", "mac", "tom", "dig", "fil", "fas", "mit", "hob", "har", "mig", "hin", "rad", "mas", "hal", "rag", "lag", "fad", "top", "mop", "hab", "nil", "nos", "mil", "fop", "fam", "dat", "nol", "din", "hat", "nac", "ris", "fot", "rib", "hoc", "nim", "lar", "fit", "wal", "rap", "sar", "nal", "mos", "lan", "don", "dan", "lad", "dov", "riv", "bac", "pol", "lap", "tal", "pit", "nam", "bon", "ros", "ton", "fod", "pon", "sov", "noc", "sor", "lav", "mat", "mip", "fip" ], s: [ "zod", "nec", "bud", "wes", "sev", "per", "sut", "let", "ful", "pen", "syt", "dur", "wep", "ser", "wyl", "sun", "ryp", "syx", "dyr", "nup", "heb", "peg", "lup", "dep", "dys", "put", "lug", "hec", "ryt", "tyv", "syd", "nex", "lun", "mep", "lut", "sep", "pes", "del", "sul", "ped", "tem", "led", "tul", "met", "wen", "byn", "hex", "feb", "pyl", "dul", "het", "mev", "rut", "tyl", "wyd", "tep", "bes", "dex", "sef", "wyc", "bur", "der", "nep", "pur", "rys", "reb", "den", "nut", "sub", "pet", "rul", "syn", "reg", "tyd", "sup", "sem", "wyn", "rec", "meg", "net", "sec", "mul", "nym", "tev", "web", "sum", "mut", "nyx", "rex", "teb", "fus", "hep", "ben", "mus", "wyx", "sym", "sel", "ruc", "dec", "wex", "syr", "wet", "dyl", "myn", "mes", "det", "bet", "bel", "tux", "tug", "myr", "pel", "syp", "ter", "meb", "set", "dut", "deg", "tex", "sur", "fel", "tud", "nux", "rux", "ren", "wyt", "nub", "med", "lyt", "dus", "neb", "rum", "tyn", "seg", "lyx", "pun", "res", "red", "fun", "rev", "ref", "mec", "ted", "rus", "bex", "leb", "dux", "ryn", "num", "pyx", "ryg", "ryx", "fep", "tyr", "tus", "tyc", "leg", "nem", "fer", "mer", "ten", "lus", "nus", "syl", "tec", "mex", "pub", "rym", "tuc", "fyl", "lep", "deb", "ber", "mug", "hut", "tun", "byl", "sud", "pem", "dev", "lur", "def", "bus", "bep", "run", "mel", "pex", "dyt", "byt", "typ", "lev", "myl", "wed", "duc", "fur", "fex", "nul", "luc", "len", "ner", "lex", "rup", "ned", "lec", "ryd", "lyd", "fen", "wel", "nyd", "hus", "rel", "rud", "nes", "hes", "fet", "des", "ret", "dun", "ler", "nyr", "seb", "hul", "ryl", "lud", "rem", "lys", "fyn", "wer", "ryc", "sug", "nys", "nyl", "lyn", "dyn", "dem", "lux", "fed", "sed", "bec", "mun", "lyr", "tes", "mud", "nyt", "byr", "sen", "weg", "fyr", "mur", "tel", "rep", "teg", "pec", "nel", "nev", "fes" ] } end end