Consider EuropeanNumberTerminator property when determining text direction

Also, use EuropeanNumberSeparator information rather than relying on an
own (incomplete) list of number separators.

Fixes: #4057
This commit is contained in:
Juergen Spitzmueller 2018-07-22 12:36:38 +02:00
parent 05d3a64952
commit 611df441b6
3 changed files with 36 additions and 3 deletions

View File

@ -971,14 +971,19 @@ void Text::insertChar(Cursor & cur, char_type c)
if (lyxrc.auto_number) { if (lyxrc.auto_number) {
static docstring const number_operators = from_ascii("+-/*"); static docstring const number_operators = from_ascii("+-/*");
static docstring const number_unary_operators = from_ascii("+-"); static docstring const number_unary_operators = from_ascii("+-");
static docstring const number_separators = from_ascii(".,:");
// European Number Separators: comma, dot etc.
// European Number Terminators: percent, permille, degree, euro etc.
if (cur.current_font.fontInfo().number() == FONT_ON) { if (cur.current_font.fontInfo().number() == FONT_ON) {
if (!isDigitASCII(c) && !contains(number_operators, c) && if (!isDigitASCII(c) && !contains(number_operators, c) &&
!(contains(number_separators, c) && !(isEuropeanNumberSeparator(c) &&
cur.pos() != 0 && cur.pos() != 0 &&
cur.pos() != cur.lastpos() && cur.pos() != cur.lastpos() &&
tm.displayFont(pit, cur.pos()).fontInfo().number() == FONT_ON && tm.displayFont(pit, cur.pos()).fontInfo().number() == FONT_ON &&
tm.displayFont(pit, cur.pos() - 1).fontInfo().number() == FONT_ON) &&
!(isEuropeanNumberTerminator(c) &&
cur.pos() != 0 &&
tm.displayFont(pit, cur.pos()).fontInfo().number() == FONT_ON &&
tm.displayFont(pit, cur.pos() - 1).fontInfo().number() == FONT_ON) tm.displayFont(pit, cur.pos() - 1).fontInfo().number() == FONT_ON)
) )
number(cur); // Set current_font.number to OFF number(cur); // Set current_font.number to OFF
@ -996,7 +1001,7 @@ void Text::insertChar(Cursor & cur, char_type c)
) { ) {
setCharFont(pit, cur.pos() - 1, cur.current_font, setCharFont(pit, cur.pos() - 1, cur.current_font,
tm.font_); tm.font_);
} else if (contains(number_separators, ch) } else if (isEuropeanNumberSeparator(ch)
&& cur.pos() >= 2 && cur.pos() >= 2
&& tm.displayFont(pit, cur.pos() - 2).fontInfo().number() == FONT_ON) { && tm.displayFont(pit, cur.pos() - 2).fontInfo().number() == FONT_ON) {
setCharFont(pit, cur.pos() - 1, cur.current_font, setCharFont(pit, cur.pos() - 1, cur.current_font,

View File

@ -164,6 +164,26 @@ bool isNumber(char_type c)
} }
bool isEuropeanNumberSeparator(char_type c)
{
if (!is_utf16(c))
// assume that no non-utf16 character is a numeral
// c outside the UCS4 range is catched as well
return false;
return ucs4_to_qchar(c).direction() == QChar::DirES;
}
bool isEuropeanNumberTerminator(char_type c)
{
if (!is_utf16(c))
// assume that no non-utf16 character is a numeral
// c outside the UCS4 range is catched as well
return false;
return ucs4_to_qchar(c).direction() == QChar::DirET;
}
bool isDigitASCII(char_type c) bool isDigitASCII(char_type c)
{ {
return '0' <= c && c <= '9'; return '0' <= c && c <= '9';

View File

@ -44,6 +44,14 @@ bool isSpace(char_type c);
/// return true if a unicode char is a numeral. /// return true if a unicode char is a numeral.
bool isNumber(char_type c); bool isNumber(char_type c);
/// return true if a unicode char has the direction attribute
/// European Number Separator [ES]
bool isEuropeanNumberSeparator(char_type c);
/// return true if a unicode char has the direction attribute
/// European Number Terminator [ET]
bool isEuropeanNumberTerminator(char_type c);
/// return whether \p c is a digit in the ASCII range /// return whether \p c is a digit in the ASCII range
bool isDigitASCII(char_type c); bool isDigitASCII(char_type c);