From 611df441b6e44ad641d6d9424fe68fe72d641706 Mon Sep 17 00:00:00 2001 From: Juergen Spitzmueller Date: Sun, 22 Jul 2018 12:36:38 +0200 Subject: [PATCH] Consider EuropeanNumberTerminator property when determining text direction Also, use EuropeanNumberSeparator information rather than relying on an own (incomplete) list of number separators. Fixes: #4057 --- src/Text.cpp | 11 ++++++++--- src/support/lstrings.cpp | 20 ++++++++++++++++++++ src/support/textutils.h | 8 ++++++++ 3 files changed, 36 insertions(+), 3 deletions(-) diff --git a/src/Text.cpp b/src/Text.cpp index cf5b2ef02e..d7540c8712 100644 --- a/src/Text.cpp +++ b/src/Text.cpp @@ -971,14 +971,19 @@ void Text::insertChar(Cursor & cur, char_type c) if (lyxrc.auto_number) { static docstring const number_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 (!isDigitASCII(c) && !contains(number_operators, c) && - !(contains(number_separators, c) && + !(isEuropeanNumberSeparator(c) && cur.pos() != 0 && cur.pos() != cur.lastpos() && 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) ) 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, tm.font_); - } else if (contains(number_separators, ch) + } else if (isEuropeanNumberSeparator(ch) && cur.pos() >= 2 && tm.displayFont(pit, cur.pos() - 2).fontInfo().number() == FONT_ON) { setCharFont(pit, cur.pos() - 1, cur.current_font, diff --git a/src/support/lstrings.cpp b/src/support/lstrings.cpp index 4a12c34b4d..21fe05aa09 100644 --- a/src/support/lstrings.cpp +++ b/src/support/lstrings.cpp @@ -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) { return '0' <= c && c <= '9'; diff --git a/src/support/textutils.h b/src/support/textutils.h index f5965882ec..314ea7588d 100644 --- a/src/support/textutils.h +++ b/src/support/textutils.h @@ -44,6 +44,14 @@ bool isSpace(char_type c); /// return true if a unicode char is a numeral. 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 bool isDigitASCII(char_type c); -- 2.39.5