local RTextHelperEx = class("RTextHelperEx")
RTextHelperEx.Type =
{
NEW_LINE = "NEW_LINE",
TEXT = "TEXT",
ITEM = "ITEM",
EFFECT = "EFFECT"
}
function RTextHelperEx:ctor()
end
-- 换行元素
function RTextHelperEx:SetBrAttr( elements )
table.insert( elements, { type = RTextHelperEx.Type.NEW_LINE })
end
-- 文本元素
function RTextHelperEx:SetTextAttr( content, attr )
return { type = RTextHelperEx.Type.TEXT, content = content, attr = attr }
end
-- 道具元素
function RTextHelperEx:SetItemAttr(attr)
return { type = RTextHelperEx.Type.ITEM, attr = attr }
end
-- 特效元素
function RTextHelperEx:SetEffectAttr(attr)
return { type = RTextHelperEx.Type.EFFECT, attr = attr }
end
function RTextHelperEx:ParseCustomRText(source)
local elements = {}
source = string.gsub(source, "
", "\\")
source = string.gsub(source, "<(%s-)/(%s-)font(%s-)>", "")
source = string.gsub(source, "<(%s-)font", "", "\n")
local slices = string.split(source, "\\")
for k, content_one in ipairs(slices) do
if k > 1 then
self:SetBrAttr( elements )
end
for _, content in ipairs(string.split(content_one, "\n")) do
local len = string.len(content)
if len > 0 then
self:ParseOneLine(elements, content)
end
end
end
return elements
end
function RTextHelperEx:ParseOneLine(elements, content)
local i, j, var = string.find(content, "")
if var and i > 1 then
self:ParseCustomText(elements, string.sub(content, 1, i-1))
end
if not var then
return self:ParseCustomText(elements, content)
end
-- 解析富文本
local _,__,t,v = string.find(var, "(.-)>(.+)")
t = string.gsub(t, "'", "")
t = string.gsub(t, "#", "")
t = string.gsub(t, "\"", "")
t = string.gsub(t, "(%s+)=(%s+)", "=")
local attr = {}
if t then
for k1,v1 in string.gmatch(t, "(%w+)=(%w+)") do
if k1 == "color" then
v1 = "#"..v1
end
attr[k1] = v1
end
end
if string.len(v or "") > 0 then
table.insert(elements, self:SetTextAttr(v, attr))
end
end
-- 解析道具
function RTextHelperEx:ParseCustomText(elements, content)
local len = string.len(content)
local i, j, var = string.find(content, "{{(.-)}}")
if var and i > 1 then
table.insert(elements, self:SetTextAttr(string.sub(content, 1, i-1), {}))
end
if not var then
table.insert(elements, self:SetTextAttr(content, {}))
return false
end
local strs = string.split(var, ",")
local type = string.lower(strs[1])
local params = {}
for i,v in ipairs(strs) do
if i > 1 then
for key,value in string.gmatch(string.gsub(v, "(%s+)=(%s+)", "="), "(%w+)=(%w+)") do
params[string.lower(key)] = tonumber(value)
end
end
end
if type == "item" then -- itemID, width, height, bgVisible
local data = {itemID = params.id, size = {width = params.width, height = params.height}, bgVisible = params.bgvisible}
table.insert(elements, self:SetItemAttr(data))
elseif type == "effect" then -- sfxID, scale, speed
local data = {sfxID = params.id, x = params.x, y = params.y, scale = params.scale, speed = params.speed}
table.insert(elements, self:SetEffectAttr(data))
end
if len > j then
self:ParseCustomText(elements, string.sub(content, j+1, len))
end
end
return RTextHelperEx