mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-11-09 18:31:04 +00:00
Add support for Farsi (thanks to Mostafa Vahedi).
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@18599 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
parent
1c2cf3567c
commit
35eb5ddb22
@ -25,6 +25,7 @@ english english "English" false iso8859-15 en_US ""
|
||||
# Esperanto has no country code
|
||||
esperanto esperanto "Esperanto" false iso8859-3 eo ""
|
||||
estonian estonian "Estonian" false iso8859-15 et_EE ""
|
||||
farsi farsi "Farsi" true utf8 fa_IR ""
|
||||
finnish finnish "Finnish" false iso8859-15 fi_FI ""
|
||||
# We redefine \og and \fg (guillemets) for older french language definitions
|
||||
french french "French" false iso8859-15 fr_FR "\addto\extrasfrench{\providecommand{\og}{\leavevmode\flqq~}\providecommand{\fg}{\ifdim\lastskip>\z@\unskip\fi~\frqq}}"
|
||||
|
129
src/Encoding.cpp
129
src/Encoding.cpp
@ -42,7 +42,7 @@ Encodings encodings;
|
||||
|
||||
namespace {
|
||||
|
||||
char_type arabic_table[50][4] = {
|
||||
char_type arabic_table[172][4] = {
|
||||
{0xfe80, 0xfe80, 0xfe80, 0xfe80}, // 0x0621 = hamza
|
||||
{0xfe81, 0xfe82, 0xfe81, 0xfe82}, // 0x0622 = ligature madda on alef
|
||||
{0xfe83, 0xfe84, 0xfe83, 0xfe84}, // 0x0623 = ligature hamza on alef
|
||||
@ -96,11 +96,134 @@ char_type arabic_table[50][4] = {
|
||||
{0x0650, 0x0650, 0x0650, 0x0650}, // 0x0650 = kasra
|
||||
{0x0651, 0x0651, 0x0651, 0x0651}, // 0x0651 = shadda
|
||||
{0x0652, 0x0652, 0x0652, 0x0652}, // 0x0652 = sukun
|
||||
|
||||
{0, 0, 0, 0}, // 0x0653
|
||||
{0, 0, 0, 0}, // 0x0654
|
||||
{0, 0, 0, 0}, // 0x0655
|
||||
{0, 0, 0, 0}, // 0x0656
|
||||
{0, 0, 0, 0}, // 0x0657
|
||||
{0, 0, 0, 0}, // 0x0658
|
||||
{0, 0, 0, 0}, // 0x0659
|
||||
{0, 0, 0, 0}, // 0x065a
|
||||
{0, 0, 0, 0}, // 0x065b
|
||||
{0, 0, 0, 0}, // 0x065c
|
||||
{0, 0, 0, 0}, // 0x065d
|
||||
{0, 0, 0, 0}, // 0x065e
|
||||
{0, 0, 0, 0}, // 0x065f
|
||||
{0, 0, 0, 0}, // 0x0660
|
||||
{0, 0, 0, 0}, // 0x0661
|
||||
{0, 0, 0, 0}, // 0x0662
|
||||
{0, 0, 0, 0}, // 0x0663
|
||||
{0, 0, 0, 0}, // 0x0664
|
||||
{0, 0, 0, 0}, // 0x0665
|
||||
{0, 0, 0, 0}, // 0x0666
|
||||
{0, 0, 0, 0}, // 0x0667
|
||||
{0, 0, 0, 0}, // 0x0668
|
||||
{0, 0, 0, 0}, // 0x0669
|
||||
{0, 0, 0, 0}, // 0x066a
|
||||
{0, 0, 0, 0}, // 0x066b
|
||||
{0, 0, 0, 0}, // 0x066c
|
||||
{0, 0, 0, 0}, // 0x066d
|
||||
{0, 0, 0, 0}, // 0x066e
|
||||
{0, 0, 0, 0}, // 0x066f
|
||||
{0, 0, 0, 0}, // 0x0670
|
||||
{0, 0, 0, 0}, // 0x0671
|
||||
{0, 0, 0, 0}, // 0x0672
|
||||
{0, 0, 0, 0}, // 0x0673
|
||||
{0, 0, 0, 0}, // 0x0674
|
||||
{0, 0, 0, 0}, // 0x0675
|
||||
{0, 0, 0, 0}, // 0x0676
|
||||
{0, 0, 0, 0}, // 0x0677
|
||||
{0, 0, 0, 0}, // 0x0678
|
||||
{0, 0, 0, 0}, // 0x0679
|
||||
{0, 0, 0, 0}, // 0x067a
|
||||
{0, 0, 0, 0}, // 0x067b
|
||||
{0, 0, 0, 0}, // 0x067c
|
||||
{0, 0, 0, 0}, // 0x067d
|
||||
{0xfb56, 0xfb57, 0xfb58, 0xfb59}, // 0x067e = peh
|
||||
{0, 0, 0, 0}, // 0x067f
|
||||
{0, 0, 0, 0}, // 0x0680
|
||||
{0, 0, 0, 0}, // 0x0681
|
||||
{0, 0, 0, 0}, // 0x0682
|
||||
{0, 0, 0, 0}, // 0x0683
|
||||
{0, 0, 0, 0}, // 0x0684
|
||||
{0, 0, 0, 0}, // 0x0685
|
||||
{0xfb7a, 0xfb7b, 0xfb7c, 0xfb7d}, // 0x0686 = tcheh
|
||||
{0, 0, 0, 0}, // 0x0687
|
||||
{0, 0, 0, 0}, // 0x0688
|
||||
{0, 0, 0, 0}, // 0x0689
|
||||
{0, 0, 0, 0}, // 0x068a
|
||||
{0, 0, 0, 0}, // 0x068b
|
||||
{0, 0, 0, 0}, // 0x068c
|
||||
{0, 0, 0, 0}, // 0x068d
|
||||
{0, 0, 0, 0}, // 0x068e
|
||||
{0, 0, 0, 0}, // 0x068f
|
||||
{0, 0, 0, 0}, // 0x0690
|
||||
{0, 0, 0, 0}, // 0x0691
|
||||
{0, 0, 0, 0}, // 0x0692
|
||||
{0, 0, 0, 0}, // 0x0693
|
||||
{0, 0, 0, 0}, // 0x0694
|
||||
{0, 0, 0, 0}, // 0x0695
|
||||
{0, 0, 0, 0}, // 0x0696
|
||||
{0, 0, 0, 0}, // 0x0697
|
||||
{0xfb8a, 0xfb8b, 0xfb8a, 0xfb8b}, // 0x0698 = jeh
|
||||
{0, 0, 0, 0}, // 0x0699
|
||||
{0, 0, 0, 0}, // 0x069a
|
||||
{0, 0, 0, 0}, // 0x069b
|
||||
{0, 0, 0, 0}, // 0x069c
|
||||
{0, 0, 0, 0}, // 0x069d
|
||||
{0, 0, 0, 0}, // 0x069e
|
||||
{0, 0, 0, 0}, // 0x069f
|
||||
{0, 0, 0, 0}, // 0x06a0
|
||||
{0, 0, 0, 0}, // 0x06a1
|
||||
{0, 0, 0, 0}, // 0x06a2
|
||||
{0, 0, 0, 0}, // 0x06a3
|
||||
{0, 0, 0, 0}, // 0x06a4
|
||||
{0, 0, 0, 0}, // 0x06a5
|
||||
{0, 0, 0, 0}, // 0x06a6
|
||||
{0, 0, 0, 0}, // 0x06a7
|
||||
{0, 0, 0, 0}, // 0x06a8
|
||||
{0xfb8e, 0xfb8f, 0xfb90, 0xfb91}, // 0x06a9 = farsi kaf
|
||||
{0, 0, 0, 0}, // 0x06aa
|
||||
{0, 0, 0, 0}, // 0x06ab
|
||||
{0, 0, 0, 0}, // 0x06ac
|
||||
{0, 0, 0, 0}, // 0x06ad
|
||||
{0, 0, 0, 0}, // 0x06ae
|
||||
{0xfb92, 0xfb93, 0xfb94, 0xfb95}, // 0x06af = gaf
|
||||
{0, 0, 0, 0}, // 0x06b0
|
||||
{0, 0, 0, 0}, // 0x06b1
|
||||
{0, 0, 0, 0}, // 0x06b2
|
||||
{0, 0, 0, 0}, // 0x06b3
|
||||
{0, 0, 0, 0}, // 0x06b4
|
||||
{0, 0, 0, 0}, // 0x06b5
|
||||
{0, 0, 0, 0}, // 0x06b6
|
||||
{0, 0, 0, 0}, // 0x06b7
|
||||
{0, 0, 0, 0}, // 0x06b8
|
||||
{0, 0, 0, 0}, // 0x06b9
|
||||
{0, 0, 0, 0}, // 0x06ba
|
||||
{0, 0, 0, 0}, // 0x06bb
|
||||
{0, 0, 0, 0}, // 0x06bc
|
||||
{0, 0, 0, 0}, // 0x06bd
|
||||
{0, 0, 0, 0}, // 0x06be
|
||||
{0, 0, 0, 0}, // 0x06bf
|
||||
{0, 0, 0, 0}, // 0x06c0
|
||||
{0, 0, 0, 0}, // 0x06c1
|
||||
{0, 0, 0, 0}, // 0x06c2
|
||||
{0, 0, 0, 0}, // 0x06c3
|
||||
{0, 0, 0, 0}, // 0x06c4
|
||||
{0, 0, 0, 0}, // 0x06c5
|
||||
{0, 0, 0, 0}, // 0x06c6
|
||||
{0, 0, 0, 0}, // 0x06c7
|
||||
{0, 0, 0, 0}, // 0x06c8
|
||||
{0, 0, 0, 0}, // 0x06c9
|
||||
{0, 0, 0, 0}, // 0x06ca
|
||||
{0, 0, 0, 0}, // 0x06cb
|
||||
{0xfbfc, 0xfbfd, 0xfbfe, 0xfbff} // 0x06cc = farsi yeh
|
||||
};
|
||||
|
||||
|
||||
char_type const arabic_start = 0x0621;
|
||||
char_type const arabic_end = 0x0652;
|
||||
char_type const arabic_end = 0x06cc;
|
||||
|
||||
|
||||
/// Information about a single UCS4 character
|
||||
@ -244,7 +367,7 @@ bool Encodings::is_arabic_special(char_type c)
|
||||
c == 0x0627 || c == 0x0629 ||
|
||||
c == 0x062f || c == 0x0648 ||
|
||||
(c >= 0x0630 && c <= 0x0632) ||
|
||||
c == 0x0649;
|
||||
c == 0x0649 || c == 0x0698;
|
||||
}
|
||||
|
||||
|
||||
|
@ -737,7 +737,10 @@ void Paragraph::Pimpl::simpleTeXSpecialChars(Buffer const & buf,
|
||||
|| inset->lyxCode() == Inset::MATH_CODE
|
||||
|| inset->lyxCode() == Inset::URL_CODE)
|
||||
&& running_font.isRightToLeft()) {
|
||||
os << "\\L{";
|
||||
if (running_font.language()->lang() == "farsi")
|
||||
os << "\\beginL{}";
|
||||
else
|
||||
os << "\\L{";
|
||||
close = true;
|
||||
}
|
||||
|
||||
@ -759,8 +762,12 @@ void Paragraph::Pimpl::simpleTeXSpecialChars(Buffer const & buf,
|
||||
|
||||
int tmp = inset->latex(buf, os, runparams);
|
||||
|
||||
if (close)
|
||||
os << '}';
|
||||
if (close) {
|
||||
if (running_font.language()->lang() == "farsi")
|
||||
os << "\\endL{}";
|
||||
else
|
||||
os << '}';
|
||||
}
|
||||
|
||||
if (tmp) {
|
||||
for (int j = 0; j < tmp; ++j) {
|
||||
|
@ -367,7 +367,8 @@ int Text::singleWidth(Paragraph const & par,
|
||||
if (isPrintable(c)) {
|
||||
Language const * language = font.language();
|
||||
if (language->rightToLeft()) {
|
||||
if (language->lang() == "arabic") {
|
||||
if (language->lang() == "arabic" ||
|
||||
language->lang() == "farsi") {
|
||||
if (Encodings::isComposeChar_arabic(c))
|
||||
return 0;
|
||||
c = par.transformChar(c, pos);
|
||||
|
@ -2282,8 +2282,13 @@ int Tabular::TeXRow(odocstream & os, row_type i, Buffer const & buf,
|
||||
&& !par.empty()
|
||||
&& getPWidth(cell).zero();
|
||||
|
||||
if (rtl)
|
||||
os << "\\R{";
|
||||
if (rtl) {
|
||||
if (par.getParLanguage(buf.params())->lang() ==
|
||||
"farsi")
|
||||
os << "\\textFR{";
|
||||
else
|
||||
os << "\\R{";
|
||||
}
|
||||
ret += inset->latex(buf, os, runparams);
|
||||
if (rtl)
|
||||
os << '}';
|
||||
|
@ -311,6 +311,10 @@ void RowPainter::paintChars(pos_type & vpos, Font const & font,
|
||||
|
||||
if (arabic) {
|
||||
char_type c = str[0];
|
||||
if (c == '(')
|
||||
c = ')';
|
||||
else if (c == ')')
|
||||
c = '(';
|
||||
str[0] = par_.transformChar(c, pos);
|
||||
}
|
||||
|
||||
@ -355,6 +359,10 @@ void RowPainter::paintChars(pos_type & vpos, Font const & font,
|
||||
*/
|
||||
|
||||
if (arabic) {
|
||||
if (c == '(')
|
||||
c = ')';
|
||||
else if (c == ')')
|
||||
c = '(';
|
||||
c = par_.transformChar(c, pos);
|
||||
/* see comment in hebrew, explaining why we break */
|
||||
break;
|
||||
@ -414,7 +422,7 @@ void RowPainter::paintFromPos(pos_type & vpos)
|
||||
// special case languages
|
||||
std::string const & lang = orig_font.language()->lang();
|
||||
bool const hebrew = lang == "hebrew";
|
||||
bool const arabic = lang == "arabic";
|
||||
bool const arabic = lang == "arabic" || lang == "farsi";
|
||||
|
||||
// draw as many chars as we can
|
||||
if ((!hebrew && !arabic)
|
||||
|
Loading…
Reference in New Issue
Block a user