commit 00f344effa3edbc5668667478a991d1f9445bd74
Author: Juergen Spitzmueller <[email protected]>
Date: Sun Jul 22 12:36:38 2018 +0200
Consider EuropeanNumberTerminator property when determining text direction
Also, use EuropeanNumberSeparator information rather than relying on an
own (incomplete) list of number separators.
Fixes: #4057
(cherry picked from commit 611df441b6e44ad641d6d9424fe68fe72d641706)
---
src/Text.cpp | 11 ++++++++---
src/support/lstrings.cpp | 20 ++++++++++++++++++++
src/support/textutils.h | 8 ++++++++
status.23x | 3 +++
4 files changed, 39 insertions(+), 3 deletions(-)
diff --git a/src/Text.cpp b/src/Text.cpp
index b386205..ca2d06e 100644
--- a/src/Text.cpp
+++ b/src/Text.cpp
@@ -968,14 +968,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
@@ -993,7 +998,7 @@ void Text::insertChar(Cursor & cur, char_type c)
) {
setCharFont(pit, cur.pos() - 1,
cur.current_font,
tm.font_);
- } else if (contains(number_separators, c)
+ } else if (isEuropeanNumberSeparator(c)
&& 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 4a12c34..21fe05a 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 f596588..314ea75 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);
diff --git a/status.23x b/status.23x
index 9474b7e..9d44843 100644
--- a/status.23x
+++ b/status.23x
@@ -64,6 +64,9 @@ What's new
- Fix document-wide language setting with minted (bug 11203).
+- Fix display of percent sign with numbers in RTL (bug 4057).
+
+
* INTERNALS