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
我找到了一个代码,我想在我玩的 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