Fix bracket output in RTL languages

This is a real mess!

Fixes: #11187
(cherry picked from commit 195f62ac93)
This commit is contained in:
Juergen Spitzmueller 2018-07-15 14:26:29 +02:00
parent a17dfeee0e
commit cc845ed2cf
4 changed files with 51 additions and 23 deletions

View File

@ -1181,10 +1181,7 @@ void Paragraph::Private::latexSpecialChar(otexstream & os,
pos_type end_pos, pos_type end_pos,
unsigned int & column) unsigned int & column)
{ {
// With polyglossia, brackets and stuff need not be reversed char_type const c = owner_->getUChar(bparams, runparams, i);
// in RTL scripts (see bug #8251)
char_type const c = (runparams.use_polyglossia) ?
owner_->getUChar(bparams, i) : text_[i];
if (style.pass_thru || runparams.pass_thru if (style.pass_thru || runparams.pass_thru
|| contains(style.pass_thru_chars, c) || contains(style.pass_thru_chars, c)
@ -1903,31 +1900,59 @@ Font const Paragraph::getLayoutFont
} }
char_type Paragraph::getUChar(BufferParams const & bparams, pos_type pos) const char_type Paragraph::getUChar(BufferParams const & bparams,
OutputParams const & rp,
pos_type pos) const
{ {
char_type c = d->text_[pos]; char_type c = d->text_[pos];
// Return unchanged character in LTR languages.
if (!getFontSettings(bparams, pos).isRightToLeft()) if (!getFontSettings(bparams, pos).isRightToLeft())
return c; return c;
// FIXME: The arabic special casing is due to the difference of arabic // FIXME This is a complete mess due to all the language-specific
// round brackets input introduced in r18599. Check if this should be // special cases. We need to unify this eventually, but this
// unified with Hebrew or at least if all bracket types should be // requires a file format change and some thought.
// handled the same (file format change in either case). // We also need to unify the input of parentheses in different RTL
// languages. Currently, some have their own methods (Arabic:
// 18599/lyxsvn, Hebrew: e5f42f67d/lyxgit), some don't (Urdu, Syriac).
// Also note that the representation in the LyX file is probably wrong
// (see FIXME in TextMetrics::breakRow).
// Most likely, we should simply rely on Qt's unicode handling here.
string const & lang = getFontSettings(bparams, pos).language()->lang(); string const & lang = getFontSettings(bparams, pos).language()->lang();
bool const arabic = lang == "arabic_arabtex" || lang == "arabic_arabi"
|| lang == "farsi"; // With polyglossia, brackets and stuff need not be reversed in RTL scripts
// FIXME: The special casing for Hebrew parens is due to the special
// handling on input (for Hebrew in e5f42f67d/lyxgit); see #8251.
char_type uc = c; char_type uc = c;
if (rp.use_polyglossia) {
switch (c) { switch (c) {
case '(': case '(':
uc = arabic ? c : ')'; if (lang == "hebrew")
uc = ')';
break; break;
case ')': case ')':
uc = arabic ? c : '('; if (lang == "hebrew")
uc = '(';
break; break;
}
return uc;
}
// In the following languages, brackets don't need to be reversed.
// Furthermore, in arabic_arabi, they are transformed to Arabic
// Ornate Parentheses (dunno if this is really wanted)
bool const reversebrackets = lang != "arabic_arabtex"
&& lang != "arabic_arabi"
&& lang != "farsi";
switch (c) {
case '[': case '[':
if (reversebrackets)
uc = ']'; uc = ']';
break; break;
case ']': case ']':
if (reversebrackets)
uc = '['; uc = '[';
break; break;
case '{': case '{':
@ -3293,7 +3318,8 @@ docstring Paragraph::simpleLyXHTMLOnePar(Buffer const & buf,
retval += inset->xhtml(xs, np); retval += inset->xhtml(xs, np);
} }
} else { } else {
char_type c = getUChar(buf.masterBuffer()->params(), i); char_type c = getUChar(buf.masterBuffer()->params(),
runparams, i);
xs << c; xs << c;
} }
font_old = font.fontInfo(); font_old = font.fontInfo();

View File

@ -358,7 +358,8 @@ public:
/// ///
char_type getChar(pos_type pos) const; char_type getChar(pos_type pos) const;
/// Get the char, but mirror all bracket characters if it is right-to-left /// Get the char, but mirror all bracket characters if it is right-to-left
char_type getUChar(BufferParams const &, pos_type pos) const; char_type getUChar(BufferParams const &, OutputParams const &,
pos_type pos) const;
/// pos <= size() (there is a dummy font change at the end of each par) /// pos <= size() (there is a dummy font change at the end of each par)
void setFont(pos_type pos, Font const & font); void setFont(pos_type pos, Font const & font);
/// ///

View File

@ -188,7 +188,7 @@ void writePlaintextParagraph(Buffer const & buf,
if (os.str().size() > max_length) if (os.str().size() > max_length)
break; break;
char_type c = par.getUChar(buf.params(), i); char_type c = par.getUChar(buf.params(), runparams, i);
if (par.isInset(i) || c == ' ') { if (par.isInset(i) || c == ' ') {
if (runparams.linelen > 0 && if (runparams.linelen > 0 &&

View File

@ -271,7 +271,8 @@ What's new
- Improve warning message dialogs. - Improve warning message dialogs.
- Fix insertion of quotation marks in RTL languages (bug 11188). - Fix insertion of quotation marks and brackets in RTL languages
(bugs 11188 and 11187).
* INTERNALS * INTERNALS