local LexicalHelper = class("LexicalHelper") local slen = string.len local sgsub = string.gsub local sfind = string.find local strim = string.trim local ssplit = string.split local sformat = string.format local Element = require("sui/Element") function LexicalHelper:ctor() end function LexicalHelper:checkElement(etype, kvmap) if etype == "Img" then if not kvmap.img or kvmap.img == "" then return false end if (not sfind(kvmap.img, ".png")) and (not sfind(kvmap.img, ".jpg")) then return false end end return true end function LexicalHelper:Parse(source) local elements = {} if not source or source == "" then return elements end -- source = string.gsub(source, "[\t\n\r]", "") source = string.gsub(source, "<>", "") local names = { "Img", "Text", "RText", "Input", "Button", "Effect", "Frames", "Layout", "CheckBox", "ListView", "ItemShow", "CostItem", "COUNTDOWN", "ITEMBOX", "EquipShow", "BAGITEMS", "EQUIPITEMS", "DBItemShow", "TIMETIPS", "TextAtlas", "LoadingBar", "CircleBar", "PercentImg", "UIModel", "HEROEquipShow", "HEROEQUIPITEMS", "HERODBItemShow", "HEROBAGITEMS", "QuickTextView", "RTextX", "DLINKITEMS", "MKItemShow", "PETEQUIPSHOW", "PageView", "Slider", "MenuItem", "ScrapePic", "BmpText", "ButtonKeFu", } for i, v in ipairs(names) do local origin = sformat("<%s|", v) local replace = sformat("\n<%s|", v) source = string.gsub(source, origin, replace) end local source_lines = ssplit(source, "\n") for line, content in ipairs(source_lines) do if slen(content) > 0 then self:parse_oneline(elements, content) end end return elements end function LexicalHelper:parse_kvmap(source) local function parse(str) local pattern = {sfind(str, "(.-)=(.+)")} if pattern[1] and pattern[2] then local key = strim(pattern[3]) local value = strim(pattern[4]) return {key=key, value=value} end return nil end local kvmap = {} local kv_source = ssplit(source, "|") for _, v in pairs(kv_source) do local kv = parse(v) if kv then kvmap[kv.key] = kv.value end end return kvmap end function LexicalHelper:push_element(elements, etype, kvmap) local element = Element.new() element.type = etype element.attr = kvmap table.insert(elements, element) end function LexicalHelper:parse_oneline(elements, content) while content and slen(content) > 0 do local find_info = {sfind(content, "<(%a-)|(.+)>")} local begin_pos = find_info[1] local end_pos = find_info[2] if begin_pos and end_pos then -- prefix if begin_pos ~= 1 then local substr = string.sub(content, 1, begin_pos - 1) local etype = "RText" local kvmap = {text = substr} self:push_element(elements, etype, kvmap) end -- element local etype = strim(find_info[3]) local kvmap = self:parse_kvmap(find_info[4]) if self:checkElement(etype, kvmap) then self:push_element(elements, etype, kvmap) else -- print("del", etype, find_info[4]) end -- suffix content = string.sub(content, end_pos+1, slen(content)) else -- push text local etype = "RText" local kvmap = {text = content} self:push_element(elements, etype, kvmap) content = "" end end end -- ++++++++++++++++++++++++++++++++++++++++++ -- 通用属性 -- id 元素ID !!禁止使用 default_x (x为数字 1 2 3) -- children 子节点 -- link 响应事件 -- ax 锚点X -- ay 锚点Y -- x 坐标X -- y 坐标Y -- percentx 坐标X 百分比 -- pencenty 坐标Y 百分比 -- width 宽 -- height 高 -- percentwidth 宽 百分比 -- percentheight 高 百分比 -- tips 鼠标悬停提醒文本 (非PC端可点击触发) -- tipsx 鼠标悬停提醒文本X偏移 -- tipsy 鼠标悬停提醒文本Y偏移 -- tipWidth 鼠标悬停提醒文本宽度设置 -- ************************** -- 显示文本 -- -- -- text 文本 -- color 文本颜色 支持闪烁,格式为{255,254,253},闪烁间隔1s -- size 文本大小 -- scrollWidth 滚动区域宽度 -- scrollWay 滚动方式 -- 0 从右到左 1 从下到上 -- scrollTime 滚动时间 -- scrollHeight 滚动区域高度 -- clickInterval 点击间隔 单位:毫秒 -- auto 自动执行秒数 (配合platform参数使用 -- platform 平台 1 PC端 2 手机端 -- simplenum 简化数值 -- ************************** -- ************************** -- 图片 -- -- -- img 图片路径 -- bg 是背景图 -- esc ESC关闭 -- move 可移动 -- reset 重置界面坐标 -- show 显示位置 0左上 1右上 2左下 3右下 4中间 -- layerid 界面ID -- scale9l 九宫拉伸 距左侧距离 -- scale9r 九宫拉伸 距右侧距离 -- scale9t 九宫拉伸 距上方距离 -- scale9b 九宫拉伸 距下方距离 -- loadDelay 延迟加载 -- loadCount 延迟加载时第一次需要加载的层数 -- loadStep 延迟加载每次加载的层数 -- grey 灰化显示 -- bagPos 背包位置 1左边 0右边 -- flip 翻转显示 -- ************************** -- ************************** -- 按钮 --