mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-11-09 18:31:04 +00:00
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:
parent
05d3a64952
commit
611df441b6
11
src/Text.cpp
11
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,
|
||||
|
@ -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';
|
||||
|
@ -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);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user