mirror of
https://github.com/mawww/kakoune.git
synced 2024-12-19 01:11:36 +03:00
Improve wrap_lines behaviour, split on punctiation as well
This commit is contained in:
parent
b3a2e4bd25
commit
a444cd1d60
@ -149,12 +149,6 @@ String expand_tabs(StringView line, CharCount tabstop, CharCount col)
|
|||||||
|
|
||||||
std::vector<StringView> wrap_lines(StringView text, CharCount max_width)
|
std::vector<StringView> wrap_lines(StringView text, CharCount max_width)
|
||||||
{
|
{
|
||||||
enum CharCategory { Word, Blank, Eol };
|
|
||||||
static const auto categorize = [](Codepoint c) {
|
|
||||||
return is_blank(c) ? Blank
|
|
||||||
: is_eol(c) ? Eol : Word;
|
|
||||||
};
|
|
||||||
|
|
||||||
using Utf8It = utf8::iterator<const char*>;
|
using Utf8It = utf8::iterator<const char*>;
|
||||||
Utf8It word_begin{text.begin()};
|
Utf8It word_begin{text.begin()};
|
||||||
Utf8It word_end{word_begin};
|
Utf8It word_end{word_begin};
|
||||||
@ -162,23 +156,27 @@ std::vector<StringView> wrap_lines(StringView text, CharCount max_width)
|
|||||||
CharCount col = 0;
|
CharCount col = 0;
|
||||||
std::vector<StringView> lines;
|
std::vector<StringView> lines;
|
||||||
const char* line_begin = text.begin();
|
const char* line_begin = text.begin();
|
||||||
|
const char* line_end = line_begin;
|
||||||
while (word_begin != end)
|
while (word_begin != end)
|
||||||
{
|
{
|
||||||
CharCategory cat = categorize(*word_begin);
|
const CharCategories cat = categorize(*word_begin);
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
++word_end;
|
++word_end;
|
||||||
} while (word_end != end and categorize(*word_end) == cat);
|
} while (word_end != end and categorize(*word_end) == cat);
|
||||||
|
|
||||||
col += word_end - word_begin;
|
col += word_end - word_begin;
|
||||||
if (col > max_width or *word_begin == '\n')
|
if (col > max_width or cat == CharCategories::EndOfLine)
|
||||||
{
|
{
|
||||||
lines.emplace_back(line_begin, word_begin.base());
|
lines.emplace_back(line_begin, line_end);
|
||||||
line_begin = word_begin.base();
|
line_begin = (cat == CharCategories::EndOfLine or
|
||||||
if (*line_begin == '\n')
|
cat == CharCategories::Blank) ? word_end.base()
|
||||||
++line_begin;
|
: word_begin.base();
|
||||||
col = 0;
|
col = word_end - Utf8It{line_begin};
|
||||||
}
|
}
|
||||||
|
if (cat == CharCategories::Word or cat == CharCategories::Punctuation)
|
||||||
|
line_end = word_end.base();
|
||||||
|
|
||||||
word_begin = word_end;
|
word_begin = word_end;
|
||||||
}
|
}
|
||||||
if (line_begin != word_begin.base())
|
if (line_begin != word_begin.base())
|
||||||
|
Loading…
Reference in New Issue
Block a user