Lua通过代码换行传递值

之前,我在以下链接中获得了帮助:

排除特定字符的Lua换行

以上的简短描述是:我正在寻找一种方法,能够在忽略某些字符的情况下运行换行函数。

现在我又遇到了另一个问题。我想要能够将最后一个颜色代码带到新行。例如:

如果这一行@R超过79个字符,我希望将最后已知的颜色代码@Y返回到换行。

运行我心目中的函数将会得到:

如果这一行@R超过79个字符,我希望将最后已知的
@B颜色代码@Y返回到换行。

而不是

如果这一行@R超过79个字符,我希望将最后已知的
颜色代码@Y返回到换行。

我希望这样做是因为在许多情况下,MUD会默认返回@w颜色代码,这会使文本着色变得相当困难。

我想到实现这个功能最简单的方法是使用反向匹配,因此我编写了一个reverse_text函数:

function reverse_text(str)
  local text = {}
  for word in str:gmatch("[^%s]+") do
    table.insert(text, 1, word)
  end
  return table.concat(text, " ")
end

它将:

@GThis @Yis @Ba @Mtest.

转换为:

@Mtest. @Ba @Yis @GThis

我遇到的问题是创建字符串匹配的事实是,颜色代码可以采用以下两种格式之一:

@%a@x%d%d%d

另外,我不希望它返回不着色的颜色代码,这是指:

@@%a@@x%d%d%d

在不影响我的要求的情况下,如何实现我的最终目标?

点赞
用户1847592
用户1847592
function wrap(str, limit, indent, indent1)
  indent = indent or ""
  indent1 = indent1 or indent
  limit = limit or 79
  local here = 1-#indent1
  local last_color = ''
  return indent1..str:gsub("(%s+)()(%S+)()",
    function(sp, st, word, fi)
      local delta = 0
      local color_before_current_word = last_color
      word:gsub('()@([@%a])',
        function(pos, c)
          if c == '@' then
            delta = delta + 1
          elseif c == 'x' then
            delta = delta + 5
            last_color = word:sub(pos, pos+4)
          else
            delta = delta + 2
            last_color = word:sub(pos, pos+1)
          end
        end)
      here = here + delta
      if fi-here > limit then
        here = st - #indent + delta
        return "\n"..indent..color_before_current_word..word
      end
    end)
end

解释:这是一段 Lua 代码,用于将输入的字符串按照指定长度进行换行和缩进。其中 str 表示输入的字符串,limit 表示每行的限制长度,默认值是 79,indent 表示每行之间的缩进,indent1 表示第一行的缩进,两者默认值相同。函数返回一个格式化好的字符串。具体实现采用了正则表达式和匿名函数,逐步处理字符串并进行相应的操作(如计算长度、添加换行符、记录颜色等)。

2015-08-16 21:29:45