RTextHelper.lua 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. local Element = class("Element")
  2. function Element:ctor()
  3. self.type = nil
  4. self.content = nil
  5. self.attr = nil
  6. end
  7. local RTextHelper = class("RTextHelper")
  8. RTextHelper.Type =
  9. {
  10. NEW_LINE = "NEW_LINE",
  11. TEXT = "TEXT",
  12. COLOR_TEXT = "COLOR_TEXT",
  13. AUTO_COLOR_TEXT = "AUTO_COLOR_TEXT",
  14. LINK_COLOR_TEXT = "LINK_COLOR_TEXT",
  15. LINK_AUTO_COLOR_TEXT = "LINK_AUTO_COLOR_TEXT",
  16. }
  17. RTextHelper.Attr =
  18. {
  19. COLOR = "COLOR",
  20. AUTO_COLOR = "AUTO_COLOR",
  21. LINK = "LINK",
  22. }
  23. function RTextHelper:ctor()
  24. end
  25. function RTextHelper:push_newline( elements )
  26. local element = Element.new()
  27. element.type = RTextHelper.Type.NEW_LINE
  28. table.insert( elements, element )
  29. end
  30. function RTextHelper:parse_text( content )
  31. local element = Element.new()
  32. element.type = RTextHelper.Type.TEXT
  33. element.content = content
  34. return element
  35. end
  36. function RTextHelper:parse_color_text( params_table )
  37. if not params_table[3] or not params_table[4] then
  38. return nil
  39. end
  40. local element = Element.new()
  41. element.type = RTextHelper.Type.COLOR_TEXT
  42. element.content = params_table[3]
  43. element.attr = {
  44. [RTextHelper.Attr.COLOR] = params_table[4]
  45. }
  46. return element
  47. end
  48. function RTextHelper:parse_auto_color_text( params_table )
  49. if not params_table[3] or not params_table[4] then
  50. return nil
  51. end
  52. local element = Element.new()
  53. element.type = RTextHelper.Type.AUTO_COLOR_TEXT
  54. element.content = params_table[3]
  55. element.attr = {
  56. [RTextHelper.Attr.AUTO_COLOR] = string.split( params_table[4], "," )
  57. }
  58. return element
  59. end
  60. function RTextHelper:parse_red_color_text( params_table )
  61. if not params_table[3] then
  62. return nil
  63. end
  64. local element = Element.new()
  65. element.type = RTextHelper.Type.LINK_COLOR_TEXT
  66. element.content = params_table[3]
  67. element.attr = {
  68. [RTextHelper.Attr.COLOR] = 249,
  69. }
  70. return element
  71. end
  72. function RTextHelper:parse_link_color_text( params_table )
  73. if not params_table[3] or not params_table[4] or not params_table[5] then
  74. return nil
  75. end
  76. local element = Element.new()
  77. element.type = RTextHelper.Type.LINK_COLOR_TEXT
  78. element.content = params_table[3]
  79. element.attr = {
  80. [RTextHelper.Attr.COLOR] = params_table[4],
  81. [RTextHelper.Attr.LINK] = params_table[5],
  82. }
  83. return element
  84. end
  85. function RTextHelper:parse_link_auto_color_text( params_table )
  86. if not params_table[3] or not params_table[4] or not params_table[5] then
  87. return nil
  88. end
  89. local element = Element.new()
  90. element.type = RTextHelper.Type.LINK_AUTO_COLOR_TEXT
  91. element.content = params_table[3]
  92. element.attr = {
  93. [RTextHelper.Attr.AUTO_COLOR] = string.split( params_table[4], "," ),
  94. [RTextHelper.Attr.LINK] = params_table[5],
  95. }
  96. return element
  97. end
  98. function RTextHelper:parse_link_default_color_text( params_table )
  99. if not params_table[3] or not params_table[4] then
  100. return nil
  101. end
  102. local element = Element.new()
  103. element.type = RTextHelper.Type.LINK_COLOR_TEXT
  104. element.content = params_table[3]
  105. element.attr = {
  106. [RTextHelper.Attr.COLOR] = 151,
  107. [RTextHelper.Attr.LINK] = params_table[4],
  108. }
  109. return element
  110. end
  111. function RTextHelper:Parse( source )
  112. local elements = {}
  113. if not source or source == "" then
  114. return elements
  115. end
  116. source = string.gsub(source, ">", ">\n")
  117. source = string.gsub(source, "}", "}\n")
  118. local slices = string.split(source, "\n")
  119. for _, slice in ipairs(slices) do
  120. local source_lines = string.split( slice, "\\" )
  121. local oneline_size = 0
  122. for l, content_line in ipairs( source_lines ) do
  123. if l > 1 then
  124. self:push_newline( elements )
  125. end
  126. oneline_size = string.len( content_line )
  127. if oneline_size > 0 then
  128. self:parse_oneline( elements, content_line, oneline_size )
  129. end
  130. end
  131. end
  132. return elements
  133. end
  134. function RTextHelper:parse_oneline( element_table, content_line, oneline_size )
  135. local element = nil
  136. local begin_pos = 0
  137. local end_pos = 0
  138. local find_info = nil
  139. local element_str = content_line
  140. local pattern_finded = false
  141. local content_size = oneline_size
  142. local parster = nil
  143. while oneline_size > 0 and end_pos < content_size do
  144. pattern_finded = false
  145. for _, pattern_info in ipairs( self.Pattern ) do
  146. find_info = { string.find( element_str, pattern_info[1] ) }
  147. begin_pos = find_info[1]
  148. end_pos = find_info[2]
  149. if begin_pos and end_pos then
  150. parster = pattern_info[2]
  151. pattern_finded = true
  152. break
  153. end
  154. end
  155. if pattern_finded then
  156. -- pattern pref text
  157. if begin_pos ~= 1 then
  158. local content = string.sub( element_str, 1, begin_pos - 1 )
  159. self:parse_oneline( element_table, content, string.len(content) )
  160. end
  161. -- finded, parse one element
  162. element = parster( self, find_info )
  163. if element then
  164. table.insert( element_table, element )
  165. end
  166. -- pattern suff text
  167. if end_pos < oneline_size then
  168. content_size = string.len( element_str )
  169. element_str = string.sub( element_str, end_pos + 1 )
  170. end
  171. else
  172. -- push text
  173. element = self:parse_text( element_str )
  174. if element then
  175. table.insert( element_table, element )
  176. end
  177. break
  178. end
  179. end
  180. end
  181. RTextHelper.Pattern =
  182. {
  183. { "<(.-)/FCOLOR=(.-)>", RTextHelper.parse_color_text },
  184. { "<(.-)/AUTOCOLOR=(.-)>", RTextHelper.parse_auto_color_text },
  185. { "<(.-){FCOLOR=(.-)}/(@.-)>", RTextHelper.parse_link_color_text },
  186. { "<(.-){AUTOCOLOR=(.-)}/(@.-)>", RTextHelper.parse_link_auto_color_text },
  187. { "<(.-)/(@.-)>", RTextHelper.parse_link_default_color_text },
  188. { "<(.-)>", RTextHelper.parse_red_color_text },
  189. { "{(.-)/FCOLOR=(.-)}", RTextHelper.parse_color_text },
  190. { "{(.-)/AUTOCOLOR=(.-)}", RTextHelper.parse_auto_color_text },
  191. { "{(.-){FCOLOR=(.-)}/(@.-)}", RTextHelper.parse_link_color_text },
  192. { "{(.-){AUTOCOLOR=(.-)}/(@.-)}", RTextHelper.parse_link_auto_color_text },
  193. { "{(.-)/(@.-)}", RTextHelper.parse_link_default_color_text },
  194. { "{(.-)}", RTextHelper.parse_red_color_text },
  195. }
  196. return RTextHelper