RTextHelperEx.lua 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. local RTextHelperEx = class("RTextHelperEx")
  2. RTextHelperEx.Type =
  3. {
  4. NEW_LINE = "NEW_LINE",
  5. TEXT = "TEXT",
  6. ITEM = "ITEM",
  7. EFFECT = "EFFECT"
  8. }
  9. function RTextHelperEx:ctor()
  10. end
  11. -- 换行元素
  12. function RTextHelperEx:SetBrAttr( elements )
  13. table.insert( elements, { type = RTextHelperEx.Type.NEW_LINE })
  14. end
  15. -- 文本元素
  16. function RTextHelperEx:SetTextAttr( content, attr )
  17. return { type = RTextHelperEx.Type.TEXT, content = content, attr = attr }
  18. end
  19. -- 道具元素
  20. function RTextHelperEx:SetItemAttr(attr)
  21. return { type = RTextHelperEx.Type.ITEM, attr = attr }
  22. end
  23. -- 特效元素
  24. function RTextHelperEx:SetEffectAttr(attr)
  25. return { type = RTextHelperEx.Type.EFFECT, attr = attr }
  26. end
  27. function RTextHelperEx:ParseCustomRText(source)
  28. local elements = {}
  29. source = string.gsub(source, "<br></br>", "\\")
  30. source = string.gsub(source, "<(%s-)/(%s-)font(%s-)>", "</font>")
  31. source = string.gsub(source, "<(%s-)font", "<font")
  32. source = string.gsub(source, "</font>", "</font>\n")
  33. local slices = string.split(source, "\\")
  34. for k, content_one in ipairs(slices) do
  35. if k > 1 then
  36. self:SetBrAttr( elements )
  37. end
  38. for _, content in ipairs(string.split(content_one, "\n")) do
  39. local len = string.len(content)
  40. if len > 0 then
  41. self:ParseOneLine(elements, content)
  42. end
  43. end
  44. end
  45. return elements
  46. end
  47. function RTextHelperEx:ParseOneLine(elements, content)
  48. local i, j, var = string.find(content, "<font(.-)</font>")
  49. if var and i > 1 then
  50. self:ParseCustomText(elements, string.sub(content, 1, i-1))
  51. end
  52. if not var then
  53. return self:ParseCustomText(elements, content)
  54. end
  55. -- 解析富文本
  56. local _,__,t,v = string.find(var, "(.-)>(.+)")
  57. t = string.gsub(t, "'", "")
  58. t = string.gsub(t, "#", "")
  59. t = string.gsub(t, "\"", "")
  60. t = string.gsub(t, "(%s+)=(%s+)", "=")
  61. local attr = {}
  62. if t then
  63. for k1,v1 in string.gmatch(t, "(%w+)=(%w+)") do
  64. if k1 == "color" then
  65. v1 = "#"..v1
  66. end
  67. attr[k1] = v1
  68. end
  69. end
  70. if string.len(v or "") > 0 then
  71. table.insert(elements, self:SetTextAttr(v, attr))
  72. end
  73. end
  74. -- 解析道具
  75. function RTextHelperEx:ParseCustomText(elements, content)
  76. local len = string.len(content)
  77. local i, j, var = string.find(content, "{{(.-)}}")
  78. if var and i > 1 then
  79. table.insert(elements, self:SetTextAttr(string.sub(content, 1, i-1), {}))
  80. end
  81. if not var then
  82. table.insert(elements, self:SetTextAttr(content, {}))
  83. return false
  84. end
  85. local strs = string.split(var, ",")
  86. local type = string.lower(strs[1])
  87. local params = {}
  88. for i,v in ipairs(strs) do
  89. if i > 1 then
  90. for key,value in string.gmatch(string.gsub(v, "(%s+)=(%s+)", "="), "(%w+)=(%w+)") do
  91. params[string.lower(key)] = tonumber(value)
  92. end
  93. end
  94. end
  95. if type == "item" then -- itemID, width, height, bgVisible
  96. local data = {itemID = params.id, size = {width = params.width, height = params.height}, bgVisible = params.bgvisible}
  97. table.insert(elements, self:SetItemAttr(data))
  98. elseif type == "effect" then -- sfxID, scale, speed
  99. local data = {sfxID = params.id, x = params.x, y = params.y, scale = params.scale, speed = params.speed}
  100. table.insert(elements, self:SetEffectAttr(data))
  101. end
  102. if len > j then
  103. self:ParseCustomText(elements, string.sub(content, j+1, len))
  104. end
  105. end
  106. return RTextHelperEx