mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-12-22 13:18:28 +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) {
|
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,
|
||||||
|
@ -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';
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user