mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-11-29 13:04:58 +00:00
Fix bracket output in RTL languages
This is a real mess!
Fixes: #11187
(cherry picked from commit 195f62ac93
)
This commit is contained in:
parent
a17dfeee0e
commit
cc845ed2cf
@ -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();
|
||||||
|
@ -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);
|
||||||
///
|
///
|
||||||
|
@ -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 &&
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user