]> git.lyx.org Git - lyx.git/blobdiff - src/tex2lyx/text.cpp
tex2lyx/Preamble.cpp: remove a FIXME, the problem was only in trunk (bug #8211) and...
[lyx.git] / src / tex2lyx / text.cpp
index 55e964c7f5368e5c27104f6971c660b23ae6a97b..b01925ea3011d7c3865a0bcfdda4ccc7abae5d0b 100644 (file)
@@ -118,7 +118,7 @@ char const * const known_coded_ref_commands[] = { "ref", "pageref", "vref",
  "vpageref", "formatted", "eqref", 0 };
 
 /**
- * known polyglossia language names (inluding synomyms)
+ * known polyglossia language names (including variants)
  */
 const char * const polyglossia_languages[] = {
 "albanian", "croatian", "hebrew", "norsk", "swedish", "amharic", "czech", "hindi",
@@ -130,7 +130,9 @@ const char * const polyglossia_languages[] = {
 "brazilian", "finnish", "lithuanian", "scottish", "usorbian", "breton", "french",
 "lsorbian", "serbian", "vietnamese", "bulgarian", "galician", "magyar", "slovak",
 "welsh", "catalan", "german", "malayalam", "slovenian", "coptic", "greek",
-"marathi", "spanish", 0};
+"marathi", "spanish",
+"american", "ancient", "australian", "british", "monotonic", "newzealand",
+"polytonic", 0};
 
 /**
  * the same as polyglossia_languages with .lyx names
@@ -146,15 +148,9 @@ const char * const coded_polyglossia_languages[] = {
 "brazilian", "finnish", "lithuanian", "scottish", "uppersorbian", "breton", "french",
 "lowersorbian", "serbian", "vietnamese", "bulgarian", "galician", "magyar", "slovak",
 "welsh", "catalan", "ngerman", "malayalam", "slovene", "coptic", "greek",
-"marathi", "spanish", 0};
-
-string polyglossia2lyx(string const & language)
-{
-       char const * const * where = is_known(language, polyglossia_languages);
-       if (where)
-               return coded_polyglossia_languages[where - polyglossia_languages];
-       return language;
-}
+"marathi", "spanish",
+"american", "ancientgreek", "australian", "british", "greek", "newzealand",
+"polutonikogreek", 0};
 
 /*!
  * natbib commands.
@@ -1252,9 +1248,19 @@ void parse_environment(Parser & p, ostream & os, bool outer,
        }
 
        else if (is_known(name, polyglossia_languages)) {
-               parent_context.check_layout(os);
+               // We must begin a new paragraph if not already done
+               if (! parent_context.atParagraphStart()) {
+                       parent_context.check_end_layout(os);
+                       parent_context.new_paragraph(os);
+               }
+               // save the language in the context so that it is
+               // handled by parse_text
                parent_context.font.language = polyglossia2lyx(name);
-               os << "\n\\lang " << parent_context.font.language << "\n";
+               parse_text(p, os, FLAG_END, outer, parent_context);
+               // Just in case the environment is empty
+               parent_context.extra_stuff.erase();
+               // We must begin a new paragraph to reset the language
+               parent_context.new_paragraph(os);
                p.skip_spaces();
        }
 
@@ -3457,6 +3463,38 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer,
                                              context, "\\lang",
                                              context.font.language, lang);
                }
+               
+               else if (is_known(t.cs().substr(4, string::npos), polyglossia_languages)) {
+                       // scheme is \textLANGUAGE{text} where LANGUAGE is in polyglossia_languages[]
+                       string lang;
+                       // We have to output the whole command if it has an option
+                       // because LyX doesn't support this yet, see bug #8214,
+                       // only if there is a single option specifying a variant, we can handle it.
+                       if (p.hasOpt()) {
+                               string langopts = p.getOpt();
+                               // check if the option contains a variant, if yes, extract it
+                               string::size_type pos_var = langopts.find("variant");
+                               string::size_type i = langopts.find(',');
+                               if (pos_var != string::npos){
+                                       string variant;
+                                       if (i == string::npos) {
+                                               variant = langopts.substr(pos_var + 8, langopts.length() - pos_var - 9);
+                                               lang = polyglossia2lyx(variant);
+                                               parse_text_attributes(p, os, FLAG_ITEM, outer,
+                                                                         context, "\\lang",
+                                                                         context.font.language, lang);
+                                       }
+                                       else
+                                               handle_ert(os, t.asInput() + langopts, context);
+                               } else
+                                       handle_ert(os, t.asInput() + langopts, context);
+                       } else {
+                               lang = polyglossia2lyx(t.cs().substr(4, string::npos));
+                               parse_text_attributes(p, os, FLAG_ITEM, outer,
+                                                         context, "\\lang",
+                                                         context.font.language, lang);
+                       }
+               }
 
                else if (t.cs() == "inputencoding") {
                        // nothing to write here