Lua Line Wrapping, исключая определенные символы
Я нашел код, который хочу использовать, когда пишу заметки в 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.
но на самом деле вернется:
@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 и т. Д.).
Есть ли чистый способ сделать это, что я скучаю?
1 ответ
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