LexicalHelper.lua 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516
  1. local LexicalHelper = class("LexicalHelper")
  2. local slen = string.len
  3. local sgsub = string.gsub
  4. local sfind = string.find
  5. local strim = string.trim
  6. local ssplit = string.split
  7. local sformat = string.format
  8. local Element = require("sui/Element")
  9. function LexicalHelper:ctor()
  10. end
  11. function LexicalHelper:checkElement(etype, kvmap)
  12. if etype == "Img" then
  13. if not kvmap.img or kvmap.img == "" then
  14. return false
  15. end
  16. if (not sfind(kvmap.img, ".png")) and (not sfind(kvmap.img, ".jpg")) then
  17. return false
  18. end
  19. end
  20. return true
  21. end
  22. function LexicalHelper:Parse(source)
  23. local elements = {}
  24. if not source or source == "" then
  25. return elements
  26. end
  27. --
  28. source = string.gsub(source, "[\t\n\r]", "")
  29. source = string.gsub(source, "<>", "")
  30. local names =
  31. {
  32. "Img",
  33. "Text",
  34. "RText",
  35. "Input",
  36. "Button",
  37. "Effect",
  38. "Frames",
  39. "Layout",
  40. "CheckBox",
  41. "ListView",
  42. "ItemShow",
  43. "CostItem",
  44. "COUNTDOWN",
  45. "ITEMBOX",
  46. "EquipShow",
  47. "BAGITEMS",
  48. "EQUIPITEMS",
  49. "DBItemShow",
  50. "TIMETIPS",
  51. "TextAtlas",
  52. "LoadingBar",
  53. "CircleBar",
  54. "PercentImg",
  55. "UIModel",
  56. "HEROEquipShow",
  57. "HEROEQUIPITEMS",
  58. "HERODBItemShow",
  59. "HEROBAGITEMS",
  60. "QuickTextView",
  61. "RTextX",
  62. "DLINKITEMS",
  63. "MKItemShow",
  64. "PETEQUIPSHOW",
  65. "PageView",
  66. "Slider",
  67. "MenuItem",
  68. "ScrapePic",
  69. "BmpText",
  70. "ButtonKeFu",
  71. }
  72. for i, v in ipairs(names) do
  73. local origin = sformat("<%s|", v)
  74. local replace = sformat("\n<%s|", v)
  75. source = string.gsub(source, origin, replace)
  76. end
  77. local source_lines = ssplit(source, "\n")
  78. for line, content in ipairs(source_lines) do
  79. if slen(content) > 0 then
  80. self:parse_oneline(elements, content)
  81. end
  82. end
  83. return elements
  84. end
  85. function LexicalHelper:parse_kvmap(source)
  86. local function parse(str)
  87. local pattern = {sfind(str, "(.-)=(.+)")}
  88. if pattern[1] and pattern[2] then
  89. local key = strim(pattern[3])
  90. local value = strim(pattern[4])
  91. return {key=key, value=value}
  92. end
  93. return nil
  94. end
  95. local kvmap = {}
  96. local kv_source = ssplit(source, "|")
  97. for _, v in pairs(kv_source) do
  98. local kv = parse(v)
  99. if kv then
  100. kvmap[kv.key] = kv.value
  101. end
  102. end
  103. return kvmap
  104. end
  105. function LexicalHelper:push_element(elements, etype, kvmap)
  106. local element = Element.new()
  107. element.type = etype
  108. element.attr = kvmap
  109. table.insert(elements, element)
  110. end
  111. function LexicalHelper:parse_oneline(elements, content)
  112. while content and slen(content) > 0 do
  113. local find_info = {sfind(content, "<(%a-)|(.+)>")}
  114. local begin_pos = find_info[1]
  115. local end_pos = find_info[2]
  116. if begin_pos and end_pos then
  117. -- prefix
  118. if begin_pos ~= 1 then
  119. local substr = string.sub(content, 1, begin_pos - 1)
  120. local etype = "RText"
  121. local kvmap = {text = substr}
  122. self:push_element(elements, etype, kvmap)
  123. end
  124. -- element
  125. local etype = strim(find_info[3])
  126. local kvmap = self:parse_kvmap(find_info[4])
  127. if self:checkElement(etype, kvmap) then
  128. self:push_element(elements, etype, kvmap)
  129. else
  130. -- print("del", etype, find_info[4])
  131. end
  132. -- suffix
  133. content = string.sub(content, end_pos+1, slen(content))
  134. else
  135. -- push text
  136. local etype = "RText"
  137. local kvmap = {text = content}
  138. self:push_element(elements, etype, kvmap)
  139. content = ""
  140. end
  141. end
  142. end
  143. -- ++++++++++++++++++++++++++++++++++++++++++
  144. -- 通用属性
  145. -- id 元素ID !!禁止使用 default_x (x为数字 1 2 3)
  146. -- children 子节点
  147. -- link 响应事件
  148. -- ax 锚点X
  149. -- ay 锚点Y
  150. -- x 坐标X
  151. -- y 坐标Y
  152. -- percentx 坐标X 百分比
  153. -- pencenty 坐标Y 百分比
  154. -- width 宽
  155. -- height 高
  156. -- percentwidth 宽 百分比
  157. -- percentheight 高 百分比
  158. -- tips 鼠标悬停提醒文本 (非PC端可点击触发)
  159. -- tipsx 鼠标悬停提醒文本X偏移
  160. -- tipsy 鼠标悬停提醒文本Y偏移
  161. -- tipWidth 鼠标悬停提醒文本宽度设置
  162. -- **************************
  163. -- 显示文本
  164. -- <Text>
  165. -- <Text|text=测试文本|color=xx|size=12|scrollWidth=50|link=@脚本命令>
  166. -- text 文本
  167. -- color 文本颜色 支持闪烁,格式为{255,254,253},闪烁间隔1s
  168. -- size 文本大小
  169. -- scrollWidth 滚动区域宽度
  170. -- scrollWay 滚动方式 -- 0 从右到左 1 从下到上
  171. -- scrollTime 滚动时间
  172. -- scrollHeight 滚动区域高度
  173. -- clickInterval 点击间隔 单位:毫秒
  174. -- auto 自动执行秒数 (配合platform参数使用
  175. -- platform 平台 1 PC端 2 手机端
  176. -- simplenum 简化数值
  177. -- **************************
  178. -- **************************
  179. -- 图片
  180. -- <Img>
  181. -- <Img|img=xxx.png|bg=1|move=1|reset=1|show=0|layerid=0|width=xx|height=xx|scale9l=xx|scale9r=xx|scale9t=xx|scale9b=xx|link=@脚本命令>
  182. -- img 图片路径
  183. -- bg 是背景图
  184. -- esc ESC关闭
  185. -- move 可移动
  186. -- reset 重置界面坐标
  187. -- show 显示位置 0左上 1右上 2左下 3右下 4中间
  188. -- layerid 界面ID
  189. -- scale9l 九宫拉伸 距左侧距离
  190. -- scale9r 九宫拉伸 距右侧距离
  191. -- scale9t 九宫拉伸 距上方距离
  192. -- scale9b 九宫拉伸 距下方距离
  193. -- loadDelay 延迟加载
  194. -- loadCount 延迟加载时第一次需要加载的层数
  195. -- loadStep 延迟加载每次加载的层数
  196. -- grey 灰化显示
  197. -- bagPos 背包位置 1左边 0右边
  198. -- flip 翻转显示
  199. -- **************************
  200. -- **************************
  201. -- 按钮
  202. -- <Button>
  203. -- <Button|nimg=xx|pimg=xx|mimg=xx|tips=xx|text=按钮文本|color=255|size=12|width=xx|height=xx|link=@脚本命令>
  204. -- nimg 正常图片路径
  205. -- pimg 按下图片路径
  206. -- mimg 鼠标经过图片路径
  207. -- text 文本
  208. -- color 文本颜色
  209. -- size 文本大小
  210. -- grey 灰化显示
  211. -- textwidth 文本最大宽度
  212. -- clickInterval 点击间隔 单位:毫秒
  213. -- **************************
  214. -- **************************
  215. -- 复选框
  216. -- <CheckBox>
  217. -- <CheckBox|checkboxid=xx|nimg=xx|pimg=xx|default=xx|submit=xx|delay=xx|count=xx|link=@脚本命令>
  218. -- checkboxid 复选框ID 用于提交数据
  219. -- nimg 未选择时显示的图片
  220. -- pimg 选择时显示的图片
  221. -- default 默认选择状态 1显示 0不显示
  222. -- submit 点击是否提交
  223. -- delay 自动提交时间
  224. -- count 自动提交次数
  225. -- **************************
  226. -- **************************
  227. -- 特效
  228. -- <Effect>
  229. -- <Effect|effectid=xxxx|effecttype=xx|scale=xx>
  230. -- effectid 特效id
  231. -- effecttype 特效类型 0.普通特效 1.npc模型 2.怪物模型 3.技能特效
  232. -- act 特效动作 0.待机 1.走 2.攻击...
  233. -- dir 特效方向 0.上 1.右上 2.右 ...
  234. -- speed 特效速度 1.正常速度
  235. -- scale 缩放比例 1.正常缩放
  236. -- count 播放次数
  237. -- **************************
  238. -- **************************
  239. -- 输入框
  240. -- <Input>
  241. -- <Input|inputid=xx|type=xx|width=xx|height=xx|color=xx|size=xx|mincount=xx|maxcount=xx|errortips=xx>
  242. -- inputid 输入框ID 用于提交数据
  243. -- type 输入类型 0任意文本 1数字 2密码
  244. -- text 默认内容
  245. -- place 空着时提醒文本
  246. -- placecolor 空着时提醒文本颜色
  247. -- width 输入框宽度
  248. -- height 输入框高度
  249. -- color 输入文本颜色
  250. -- size 输入文本大小
  251. -- mincount 最小输入字符数
  252. -- maxcount 最大输入字符数
  253. -- errortips 输入类型不符提醒
  254. -- onlyCh 输入仅能中文 1仅中文
  255. -- **************************
  256. -- **************************
  257. -- 倒计时
  258. -- <COUNTDOWN>
  259. -- <COUNTDOWN|time=xx|count=xx|size=xx|color=xx|link=@脚本命令>
  260. -- time 倒计时时间
  261. -- link 脚本命令
  262. -- count 循环次数
  263. -- size 文本大小
  264. -- color 文本颜色
  265. -- showWay 显示方式 1 [小于1天 xx:xx:xx 大于1天 xx天xx时xx分] 0 [xx秒]
  266. -- outline 描边大小
  267. -- outlinecolor 描边颜色
  268. -- **************************
  269. -- **************************
  270. -- 道具图标
  271. -- <ItemShow>
  272. -- <ItemShow|itemid=xx|itemcount|showtips=xx|link=@脚本命令>
  273. -- itemid 物品id
  274. -- itemcount 物品数量
  275. -- showtips 是否显示tips
  276. -- link 脚本命令
  277. -- grey 灰化显示
  278. -- lock 1/0 显示锁图标
  279. -- color 数量文本颜色
  280. -- dblink 双击触发
  281. -- **************************
  282. -- **************************
  283. -- 容器
  284. -- <Layout>
  285. -- <Layout|width=xx|height=xx|color=xx|link=@脚本命令>
  286. -- width 容器宽度
  287. -- height 容器高度
  288. -- color 容器颜色
  289. -- **************************
  290. -- **************************
  291. -- 富文本
  292. -- <RText>
  293. -- <RText|text='<我是富文本/FCOLOR=254>'|text=>
  294. -- text 内容
  295. -- scrollWidth 滚动区域宽度
  296. -- scrollWay 滚动方式 -- 0 从右到左 1 从下到上
  297. -- scrollTime 滚动时间
  298. -- scrollHeight 滚动区域高度
  299. -- **************************
  300. -- **************************
  301. -- 序列帧
  302. -- <Frames>
  303. -- <Frames|prefix=xx|suffix=xx|count=xx|speed=xx|loop=xx>
  304. -- prefix 前缀
  305. -- suffix 后缀
  306. -- count 图片数量
  307. -- speed 播放速度 毫秒
  308. -- loop 是否循环 -1.循环 1.播放1次 2.播放2次
  309. -- finishframe 结束帧 (图标下标)
  310. -- finishhide 结束是否隐藏 0默认 1隐藏
  311. -- **************************
  312. -- **************************
  313. -- 物品放入框
  314. -- <ITEMBOX>
  315. -- <ITEMBOX|boxindex=xx|img=xx|stdmode=xx>
  316. -- 物品放入框
  317. -- boxindex 编号
  318. -- img 背景图片
  319. -- stdmode 允许放入的物品类型。DB库的StdMode值,如果有多个使用“,”隔开,如果为“*”时,允许所有物品
  320. -- **************************
  321. -- **************************
  322. -- 列表容器
  323. -- <ListView>
  324. -- <ListView|children={1,2}|direction=xx|bounce=xx|margin=xx|default=xx>
  325. -- 物品放入框
  326. -- direction 方向 1竖向 2横向
  327. -- bounce 是否弹性 1是 0否
  328. -- margin 子控件间隔
  329. -- default 默认跳转的索引条目
  330. -- reload 是否强制重新加载
  331. -- cantouch 是否可交互 1默认 0不可
  332. -- **************************
  333. -- **************************
  334. -- 装备图标
  335. -- <EquipShow>
  336. -- <EquipShow|index=xx|showtips=xx|link=@脚本命令>
  337. -- index 位置
  338. -- showtips 是否显示tips
  339. -- link 脚本命令
  340. -- grey 灰化显示
  341. -- showstar 显示星级 1.显示 0.不显示
  342. -- bgtype 是否显示背景图
  343. -- scale 缩放比例
  344. -- **************************
  345. -- **************************
  346. -- 背包道具
  347. -- <BAGITEMS>
  348. -- <BAGITEMS|condition=xx#xx,xx#xx,|select=1,2,3|count=xx|row=1|link=@脚本命令>
  349. -- condition StdMode#Shape&StdMode#Shape
  350. -- exclude 被排除显示的, 唯一ID,唯一ID
  351. -- select 已经选择的道具唯一ID
  352. -- count 格子数量
  353. -- row 行数
  354. -- link 脚本命令
  355. -- selecttype 选择类型 0.多选 1.单选
  356. -- showstar 显示星级 1.显示 0.不显示
  357. -- iwidth 元素宽
  358. -- iheight 元素高
  359. -- iimg 元素背景图
  360. -- **************************
  361. -- **************************
  362. -- 穿戴装备
  363. -- <EQUIPITEMS>
  364. -- <EQUIPITEMS|positions=*|select=1,2,3|count=xx|row=1|link=@脚本命令>
  365. -- positions 装备位
  366. -- select 已经选择的道具唯一ID
  367. -- count 格子数量
  368. -- row 行数
  369. -- link 脚本命令
  370. -- selecttype 选择类型 0.多选 1.单选
  371. -- showstar 显示星级 1.显示 0.不显示
  372. -- iwidth 元素宽
  373. -- iheight 元素高
  374. -- iimg 元素背景图
  375. -- **************************
  376. -- **************************
  377. -- 数据库装备图标
  378. -- <DBItemShow>
  379. -- <DBItemShow|makeindex>
  380. -- makeindex 唯一ID
  381. -- showtips 是否显示tips
  382. -- link 脚本命令
  383. -- grey 灰化显示
  384. -- showstar 显示星级 1.显示 0.不显示
  385. -- **************************
  386. -- **************************
  387. -- 倒计时
  388. -- <TIMETIPS>
  389. -- <TIMETIPS|time>
  390. -- time 剩余时间
  391. -- size 大小
  392. -- color 颜色
  393. -- **************************
  394. -- **************************
  395. -- 数据库装备图标
  396. -- <TextAtlas>
  397. -- <TextAtlas|img=xx|iwidth=xx|iheight=xx|schar=xx|text=xx>
  398. -- img 资源路径
  399. -- iwidth 宽
  400. -- iheight 高
  401. -- schar startCharMap
  402. -- **************************
  403. -- **************************
  404. -- 基本等同BAGITEM
  405. -- <DLINKITEMS>
  406. -- link 双击触发
  407. -- **************************
  408. -- **************************
  409. -- 基于DBItemShow和HERODBItemShow
  410. -- <MKItemShow>
  411. -- link 双击触发和拖动到背包触发
  412. -- canmove 可拖动参数
  413. -- **************************
  414. -- **************************
  415. -- 滑动条/拉杆
  416. -- <Slider>
  417. -- sliderid 滑动条ID 用于提交数据
  418. -- link 拖动触发
  419. -- ballimg 拖动球资源
  420. -- barimg 拖动条资源
  421. -- bgimg 拖动背景资源
  422. -- defvalue 默认展示值
  423. -- maxvalue 拖动最大值(非进度百分比)
  424. -- **************************
  425. -- **************************
  426. -- 下拉菜单
  427. -- <MenuItem>
  428. -- menuid 下拉菜单ID 用于提交数据
  429. -- link 拖动触发
  430. -- img 展示底资源
  431. -- arrowimg 箭头图资源
  432. -- listimg 菜单列表底图资源
  433. -- itemname 菜单列表文本 #分隔
  434. -- select 默认选择文本
  435. -- selectimg 选中图片资源
  436. -- direction 方向 默认0下拉 1上拉
  437. -- itemhei 单条菜单列表项高
  438. -- fontsize 字体大小
  439. -- fontcolor 字体色值
  440. -- selectcolor 选中的字体色值
  441. -- **************************
  442. -- **************************
  443. -- 刮图
  444. -- <ScrapePic>
  445. -- showimg 展示图片资源
  446. -- maskimg 遮罩图片资源 默认 "public/mask_1.png"
  447. -- clearhei 刮除高度
  448. -- movetime 移动时间
  449. -- begintime 开始点击到结束触发间隔
  450. -- link 结束触发
  451. -- **************************
  452. return LexicalHelper