]> git.lyx.org Git - features.git/commitdiff
Add support for Farsi (thanks to Mostafa Vahedi).
authorJosé Matox <jamatos@lyx.org>
Thu, 31 May 2007 18:53:01 +0000 (18:53 +0000)
committerJosé Matox <jamatos@lyx.org>
Thu, 31 May 2007 18:53:01 +0000 (18:53 +0000)
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@18599 a592a061-630c-0410-9148-cb99ea01b6c8

lib/languages
src/Encoding.cpp
src/Paragraph.cpp
src/Text.cpp
src/insets/InsetTabular.cpp
src/rowpainter.cpp

index b5019d29d6aec66a107237a6100714242a8a8c96..8a8a719520bd0ec25c0b7908a5781f05e8aa8f08 100644 (file)
@@ -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}}"
index e1001bf9efc5e9bad780a68038caaf5be7af8d48..a4cd882f7316d65e8c4be75d10d628f281cebcb8 100644 (file)
@@ -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;
 }
 
 
index 796abf461764430a8ad30fd09937c1c6f639eed0..cf09a491b1e17d01a9aba6ca27fa1dfe8c31e707 100644 (file)
@@ -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) {
index c05cc2130d7512289eb9e49177b323bc7ae0c59d..58ad897e30f620ed32980ab4709dbd8eaa76904f 100644 (file)
@@ -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);
index 53a6efd01fc219f7801644e55746fce7085861f9..2f078201fdedf50581b549b1b4a85ddb2633d45b 100644 (file)
@@ -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 << '}';
index 5f0f6c53306b793f3aac67cb71227d99c3e131eb..8f4d19599c4d42f0a407c52bfc5a20f25aecad57 100644 (file)
@@ -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)