miduo_client/Assets/ManagedResources/~Lua/BadWords/MsgParser.lua

113 lines
2.3 KiB
Lua

local MsgParser = { inited = false }
local utf8 = require("BadWords/utf8")
local utf8Len = utf8.len
local utf8Sub = utf8.sub
local strSub = string.sub
local strLen = string.len
local strByte = string.byte
local strGsub = string.gsub
local _maskWord = '*'
local _tree = {}
local function _word2Tree(root, word)
if strLen(word) == 0 then return end
local function _byte2Tree(r, ch, tail)
if tail then
if type(r[ch]) == 'table' then
r[ch].isTail = true
else
r[ch] = true
end
else
if r[ch] == true then
r[ch] = { isTail = true }
else
r[ch] = r[ch] or {}
end
end
return r[ch]
end
local tmpparent = root
local len = utf8Len(word)
for i=1, len do
if tmpparent == true then
tmpparent = { isTail = true }
end
tmpparent = _byte2Tree(tmpparent, utf8Sub(word, i, i), i==len)
end
end
local function _detect(parent, word, idx)
local len = utf8Len(word)
local ch = utf8Sub(word, 1, 1)
local child = parent[ch]
if not child then
elseif type(child) == 'table' then
if len > 1 then
if child.isTail then
return _detect(child, utf8Sub(word, 2), idx+1) or idx
else
return _detect(child, utf8Sub(word, 2), idx+1)
end
elseif len == 1 then
if child.isTail == true then
return idx
end
end
elseif (child == true) then
return idx
end
return false
end
function MsgParser:init()
if self.inited then return end
local words = require("BadWords/SensitiveCfg")
for _, word in pairs(words) do
_word2Tree(_tree, word)
end
self.inited = true
package.loaded["BadWords/SensitiveCfg"] = nil
end
function MsgParser:getString(s)
local word, idx, illegals, tmps
local i = 1
local len = utf8Len(s)
while true do
word = utf8Sub(s, i)
idx = _detect(_tree, word, i)
if idx then
illegals = utf8Sub(s, i, idx)
tmps = ''
for j=1, utf8Len(illegals) do
tmps = tmps .. _maskWord
end
s = strGsub(s, illegals, tmps)
i = idx+1
else
i = i + 1
end
if i > len then
break
end
end
return s
end
MsgParser:init()
return MsgParser