Fix get_column function and add some unit tests for fullwidth text

This commit is contained in:
Maxime Coste 2016-09-24 18:52:54 +01:00
parent 35559b65dd
commit 28cfd0bb61
8 changed files with 24 additions and 8 deletions

View File

@ -18,13 +18,15 @@ ColumnCount get_column(const Buffer& buffer,
auto line = buffer[coord.line]; auto line = buffer[coord.line];
auto col = 0_col; auto col = 0_col;
for (auto it = line.begin(); for (auto it = line.begin();
it != line.end() and coord.column > (int)(it - line.begin()); it != line.end() and coord.column > (int)(it - line.begin()); )
it = utf8::next(it, line.end()))
{ {
if (*it == '\t') if (*it == '\t')
{
col = (col / tabstop + 1) * tabstop; col = (col / tabstop + 1) * tabstop;
++it;
}
else else
++col; col += get_width(utf8::read_codepoint(it, line.end()));
} }
return col; return col;
} }
@ -41,10 +43,16 @@ ByteCount get_byte_to_column(const Buffer& buffer, ColumnCount tabstop, DisplayC
col = (col / tabstop + 1) * tabstop; col = (col / tabstop + 1) * tabstop;
if (col > coord.column) // the target column was in the tab if (col > coord.column) // the target column was in the tab
break; break;
++it;
} }
else else
++col; {
it = utf8::next(it, line.end()); auto next = it;
col += get_width(utf8::read_codepoint(next, line.end()));
if (col > coord.column) // the target column was in the char
break;
it = next;
}
} }
return (int)(it - line.begin()); return (int)(it - line.begin());
} }

View File

@ -648,7 +648,7 @@ HighlighterAndId create_column_highlighter(HighlighterParameters params)
void expand_tabulations(const Context& context, HighlightFlags flags, DisplayBuffer& display_buffer, BufferRange) void expand_tabulations(const Context& context, HighlightFlags flags, DisplayBuffer& display_buffer, BufferRange)
{ {
const int tabstop = context.options()["tabstop"].get<int>(); const ColumnCount tabstop = context.options()["tabstop"].get<int>();
auto& buffer = context.buffer(); auto& buffer = context.buffer();
for (auto& line : display_buffer.lines()) for (auto& line : display_buffer.lines())
{ {
@ -668,8 +668,8 @@ void expand_tabulations(const Context& context, HighlightFlags flags, DisplayBuf
if (it+1 != end) if (it+1 != end)
atom_it = line.split(atom_it, (it+1).coord()); atom_it = line.split(atom_it, (it+1).coord());
int column = (int)get_column(buffer, tabstop, it.coord()); ColumnCount column = get_column(buffer, tabstop, it.coord());
int count = tabstop - (column % tabstop); ColumnCount count = tabstop - (column % tabstop);
String padding; String padding;
for (int i = 0; i < count; ++i) for (int i = 0; i < count; ++i)
padding += ' '; padding += ' ';

View File

@ -0,0 +1 @@
j

View File

@ -0,0 +1,2 @@
一 %(二)
1234567890

View File

@ -0,0 +1 @@
9

View File

@ -0,0 +1 @@
k

View File

@ -0,0 +1,2 @@
123456789012
一%(二)三%(四)五六

View File

@ -0,0 +1 @@
3:7