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
Другие вопросы по тегам