(local lib (require :lib)) (local synonyms [["шэн" "шен"] ["бан" "бань"] ["чжан" "чжань"] ["чжень" "чжэнь"] ["билочунь" "би ло чунь"] ["бутылка" "термос"] ["доска" "чабань"] ["даньцун" "дяньцун" "дянь цун" "дань цун"] ["фаньгу" "фань гу" "фангу" "фан гу"] ["бай му дань" "баймудань"] ["бай хао" "байхао"] ["гуанбай" "гуан бай"] ["буланшань" "булан шань"] ["биндао" "бин дао"] ["лунцзин" "лун цзин"] ["термос" "бутылка"] ["чахай" "сливник"] ["те гуань инь" "те гуаньинь" "тегуань инь" "тегуаньинь"] ["фан гу" "фангу" "фаньгу" "фань гу"] ["точа" "то ча"] ["гушу" "гу шу"]]) (fn find-synonyms [word] (var input-word (_G.must (luna.utf8.lower word))) (var result nil) (each [_ synonyms-line (ipairs synonyms) &until result] (each [_ synonym-word (ipairs synonyms-line) &until result] (when (= input-word synonym-word) (set result synonyms-line)))) result) (fn replace [line] (var results []) (let [words (lib.split line " ") words-count (# words)] (for [i 1 words-count] (var word nil) (for [j i words-count] (set word (if (not word) (. words j) (.. word " " (. words j)))) (table.insert results word)))) (var final-result line) (each [_ result (ipairs results)] (local synonyms (find-synonyms result)) (when synonyms (var query (.. (table.concat synonyms "* OR ") "*")) (set final-result (: final-result :gsub result query)))) final-result) {: replace}