X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ftex2lyx%2Ftext.cpp;h=b01925ea3011d7c3865a0bcfdda4ccc7abae5d0b;hb=7a103ba6d74dd49b7affb84508baaba0d7f2bf07;hp=2f59222ed7deeeaa7725ceb9d737fb31236f1a62;hpb=1a6c599917355743a868c20a0b62b5f4c47c8294;p=lyx.git diff --git a/src/tex2lyx/text.cpp b/src/tex2lyx/text.cpp index 2f59222ed7..b01925ea30 100644 --- a/src/tex2lyx/text.cpp +++ b/src/tex2lyx/text.cpp @@ -117,6 +117,41 @@ char const * const known_ref_commands[] = { "ref", "pageref", "vref", char const * const known_coded_ref_commands[] = { "ref", "pageref", "vref", "vpageref", "formatted", "eqref", 0 }; +/** + * known polyglossia language names (including variants) + */ +const char * const polyglossia_languages[] = { +"albanian", "croatian", "hebrew", "norsk", "swedish", "amharic", "czech", "hindi", +"nynorsk", "syriac", "arabic", "danish", "icelandic", "occitan", "tamil", +"armenian", "divehi", "interlingua", "polish", "telugu", "asturian", "dutch", +"irish", "portuges", "thai", "bahasai", "english", "italian", "romanian", "turkish", +"bahasam", "esperanto", "lao", "russian", "turkmen", "basque", "estonian", "latin", +"samin", "ukrainian", "bengali", "farsi", "latvian", "sanskrit", "urdu", "brazil", +"brazilian", "finnish", "lithuanian", "scottish", "usorbian", "breton", "french", +"lsorbian", "serbian", "vietnamese", "bulgarian", "galician", "magyar", "slovak", +"welsh", "catalan", "german", "malayalam", "slovenian", "coptic", "greek", +"marathi", "spanish", +"american", "ancient", "australian", "british", "monotonic", "newzealand", +"polytonic", 0}; + +/** + * the same as polyglossia_languages with .lyx names + * please keep this in sync with polyglossia_languages line by line! + */ +const char * const coded_polyglossia_languages[] = { +"albanian", "croatian", "hebrew", "norsk", "swedish", "amharic", "czech", "hindi", +"nynorsk", "syriac", "arabic_arabi", "danish", "icelandic", "occitan", "tamil", +"armenian", "divehi", "interlingua", "polish", "telugu", "asturian", "dutch", +"irish", "portuges", "thai", "bahasa", "english", "italian", "romanian", "turkish", +"bahasam", "esperanto", "lao", "russian", "turkmen", "basque", "estonian", "latin", +"samin", "ukrainian", "bengali", "farsi", "latvian", "sanskrit", "urdu", "brazilian", +"brazilian", "finnish", "lithuanian", "scottish", "uppersorbian", "breton", "french", +"lowersorbian", "serbian", "vietnamese", "bulgarian", "galician", "magyar", "slovak", +"welsh", "catalan", "ngerman", "malayalam", "slovene", "coptic", "greek", +"marathi", "spanish", +"american", "ancientgreek", "australian", "british", "greek", "newzealand", +"polutonikogreek", 0}; + /*! * natbib commands. * The starred forms are also known except for "citefullauthor", @@ -461,7 +496,9 @@ docstring convert_unicodesymbols(docstring s) set req; docstring parsed = encodings.fromLaTeXCommand(s, Encodings::TEXT_CMD, termination, rem, &req); - for (set::const_iterator it = req.begin(); it != req.end(); it++) + set::const_iterator it = req.begin(); + set::const_iterator en = req.end(); + for (; it != en; ++it) preamble.registerAutomaticallyLoadedPackage(*it); os << parsed; s = rem; @@ -1186,8 +1223,7 @@ void parse_unknown_environment(Parser & p, string const & name, ostream & os, void parse_environment(Parser & p, ostream & os, bool outer, - string & last_env, bool & title_layout_found, - Context & parent_context) + string & last_env, Context & parent_context) { Layout const * newlayout; InsetLayout const * newinsetlayout = 0; @@ -1211,6 +1247,23 @@ void parse_environment(Parser & p, ostream & os, bool outer, } } + else if (is_known(name, polyglossia_languages)) { + // 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); + 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(); + } + else if (unstarred_name == "tabular" || name == "longtable") { eat_whitespace(p, os, parent_context, false); string width = "0pt"; @@ -1554,10 +1607,12 @@ void parse_environment(Parser & p, ostream & os, bool outer, context.check_end_deeper(os); parent_context.new_paragraph(os); p.skip_spaces(); - if (!title_layout_found) - title_layout_found = newlayout->intitle; + if (!preamble.titleLayoutFound()) + preamble.titleLayoutFound(newlayout->intitle); set const & req = newlayout->requires(); - for (set::const_iterator it = req.begin(); it != req.end(); it++) + set::const_iterator it = req.begin(); + set::const_iterator en = req.end(); + for (; it != en; ++it) preamble.registerAutomaticallyLoadedPackage(*it); } @@ -1971,7 +2026,6 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer, bool const use_natbib = preamble.isPackageUsed("natbib"); bool const use_jurabib = preamble.isPackageUsed("jurabib"); string last_env; - bool title_layout_found = false; while (p.good()) { Token const & t = p.get_token(); @@ -2298,7 +2352,7 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer, else if (t.cs() == "begin") parse_environment(p, os, outer, last_env, - title_layout_found, context); + context); else if (t.cs() == "end") { if (flags & FLAG_END) { @@ -2469,10 +2523,14 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer, // Must catch empty dates before findLayout is called below else if (t.cs() == "date") { + eat_whitespace(p, os, context, false); + p.pushPosition(); string const date = p.verbatim_item(); - if (date.empty()) + p.popPosition(); + if (date.empty()) { preamble.suppressDate(true); - else { + p.verbatim_item(); + } else { preamble.suppressDate(false); if (context.new_layout_allowed && (newlayout = findLayout(context.textclass, @@ -2480,16 +2538,18 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer, // write the layout output_command_layout(os, p, outer, context, newlayout); - p.skip_spaces(); - if (!title_layout_found) - title_layout_found = newlayout->intitle; + parse_text_snippet(p, os, FLAG_ITEM, outer, context); + if (!preamble.titleLayoutFound()) + preamble.titleLayoutFound(newlayout->intitle); set const & req = newlayout->requires(); - for (set::const_iterator it = req.begin(); - it != req.end(); it++) + set::const_iterator it = req.begin(); + set::const_iterator en = req.end(); + for (; it != en; ++it) preamble.registerAutomaticallyLoadedPackage(*it); } else - handle_ert(os, "\\date{" + date + '}', - context); + handle_ert(os, + "\\date{" + p.verbatim_item() + '}', + context); } } @@ -2502,10 +2562,10 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer, p.get_token(); output_command_layout(os, p, outer, context, newlayout); p.skip_spaces(); - if (!title_layout_found) - title_layout_found = newlayout->intitle; + if (!preamble.titleLayoutFound()) + preamble.titleLayoutFound(newlayout->intitle); set const & req = newlayout->requires(); - for (set::const_iterator it = req.begin(); it != req.end(); it++) + for (set::const_iterator it = req.begin(); it != req.end(); ++it) preamble.registerAutomaticallyLoadedPackage(*it); } @@ -2515,10 +2575,10 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer, // write the layout output_command_layout(os, p, outer, context, newlayout); p.skip_spaces(); - if (!title_layout_found) - title_layout_found = newlayout->intitle; + if (!preamble.titleLayoutFound()) + preamble.titleLayoutFound(newlayout->intitle); set const & req = newlayout->requires(); - for (set::const_iterator it = req.begin(); it != req.end(); it++) + for (set::const_iterator it = req.begin(); it != req.end(); ++it) preamble.registerAutomaticallyLoadedPackage(*it); } @@ -2808,18 +2868,20 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer, } else if (t.cs() == "makeindex" || t.cs() == "maketitle") { - if (title_layout_found) { + if (preamble.titleLayoutFound()) { // swallow this skip_spaces_braces(p); } else handle_ert(os, t.asInput(), context); } - else if (t.cs() == "tableofcontents") { + else if (t.cs() == "tableofcontents" || t.cs() == "lstlistoflistings") { context.check_layout(os); - begin_command_inset(os, "toc", "tableofcontents"); + begin_command_inset(os, "toc", t.cs()); end_inset(os); skip_spaces_braces(p); + if (t.cs() == "lstlistoflistings") + preamble.registerAutomaticallyLoadedPackage("listings"); } else if (t.cs() == "listoffigures") { @@ -3391,7 +3453,6 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer, context.check_layout(os); // save the language for the case that a // \foreignlanguage is used - context.font.language = babel2lyx(p.verbatim_item()); os << "\n\\lang " << context.font.language << "\n"; } @@ -3402,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 @@ -3516,7 +3609,7 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer, << ", result is " << to_utf8(s) << "+" << to_utf8(rem) << endl; os << to_utf8(s); - for (set::const_iterator it = req.begin(); it != req.end(); it++) + for (set::const_iterator it = req.begin(); it != req.end(); ++it) preamble.registerAutomaticallyLoadedPackage(*it); } else // we did not find a non-ert version @@ -4123,7 +4216,7 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer, os << to_utf8(s); if (termination) skip_spaces_braces(p); - for (set::const_iterator it = req.begin(); it != req.end(); it++) + for (set::const_iterator it = req.begin(); it != req.end(); ++it) preamble.registerAutomaticallyLoadedPackage(*it); } //cerr << "#: " << t << " mode: " << mode << endl;