Lua 换行排除某些字符

Lua Line Wrapping excluding certain characters

我找到了一个代码,我想在我玩的 MUD 上写笔记时使用它。每个音符的行只能有 79 个字符,所以有时写一个音符很麻烦,除非你在计算字符数。代码如下:

function wrap(str, limit, indent, indent1)
  indent = indent or ""
  indent1 = indent1 or indent
  limit = limit or 79
  local here = 1-#indent1
  return indent1..str:gsub("(%s+)()(%S+)()",
                          function(sp, st, word, fi)
                            if fi-here > limit then
                              here = st - #indent
                              return "\n"..indent..word
                            end
                          end)
end

这会很好用;我可以输入 300 个字符的行,它会将其格式化为 79 个字符,尊重完整的单词。

我遇到的问题是,有时我想在行中添加颜色代码,但颜色代码不计入字数,我似乎无法弄清楚如何解决。例如:

@GThis is a colour-coded @Yline that should @Bbreak off at 79 @Mcharacters, but ignore @Rthe colour codes (@G, @Y, @B, @M, @R, etc) when doing so.

本质上,它会去除颜色代码并适当地断开线条,但不会丢失颜色代码。

编辑以包括它应该检查的内容,以及最终输出应该是什么。

该函数只会检查下面的字符串是否有换行符:

This is a colour-coded line that should break off at 79 characters, but ignore the colour codes (, , , , , etc) when doing so.

但实际上 return:

@GThis is a colour-coded @Yline that should @Bbreak off at 79 @Ncharacters, but ignore 
the colour codes (@G, @Y, @B, @M, @R, etc) when doing so.

更复杂的是,我们还有 xterm 颜色代码,它们很相似,但看起来像这样:

@x123

它总是@x 后跟一个 3 位数字。最后,为了使事情更加复杂,我不希望它去除目的颜色代码(@@R、@@x123 等)。

有没有一种我缺少的干净方法?

function(sp, st, word, fi)
  local delta = 0
  word:gsub('@([@%a])', 
    function(c)
      if c == '@'     then delta = delta + 1 
      elseif c == 'x' then delta = delta + 5
      else                 delta = delta + 2 
      end
    end)
  here = here + delta
  if fi-here > limit then
    here = st - #indent + delta
    return "\n"..indent..word
  end
end