From: José Matox Date: Thu, 31 May 2007 18:53:01 +0000 (+0000) Subject: Add support for Farsi (thanks to Mostafa Vahedi). X-Git-Tag: 1.6.10~9541 X-Git-Url: https://git.lyx.org/gitweb/?a=commitdiff_plain;h=35eb5ddb22b945afca0c149b92fd7a8d3cb4aead;p=features.git 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 --- diff --git a/lib/languages b/lib/languages index b5019d29d6..8a8a719520 100644 --- a/lib/languages +++ b/lib/languages @@ -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}}" diff --git a/src/Encoding.cpp b/src/Encoding.cpp index e1001bf9ef..a4cd882f73 100644 --- a/src/Encoding.cpp +++ b/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; } diff --git a/src/Paragraph.cpp b/src/Paragraph.cpp index 796abf4617..cf09a491b1 100644 --- a/src/Paragraph.cpp +++ b/src/Paragraph.cpp @@ -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) { diff --git a/src/Text.cpp b/src/Text.cpp index c05cc2130d..58ad897e30 100644 --- a/src/Text.cpp +++ b/src/Text.cpp @@ -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); diff --git a/src/insets/InsetTabular.cpp b/src/insets/InsetTabular.cpp index 53a6efd01f..2f078201fd 100644 --- a/src/insets/InsetTabular.cpp +++ b/src/insets/InsetTabular.cpp @@ -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 << '}'; diff --git a/src/rowpainter.cpp b/src/rowpainter.cpp index 5f0f6c5330..8f4d19599c 100644 --- a/src/rowpainter.cpp +++ b/src/rowpainter.cpp @@ -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)