X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ftex2lyx%2FPreamble.cpp;h=7b69bc4db5392eaa0bbba2853c42684f4866b721;hb=fd5adacef25eb40f813dedd961920c353448213a;hp=005a10348690f7145badf0b874a61724b23b9671;hpb=01c1d1e156b02ea94ea11645d9bbd976446d374c;p=features.git diff --git a/src/tex2lyx/Preamble.cpp b/src/tex2lyx/Preamble.cpp index 005a103486..7b69bc4db5 100644 --- a/src/tex2lyx/Preamble.cpp +++ b/src/tex2lyx/Preamble.cpp @@ -18,7 +18,6 @@ #include "Encoding.h" #include "LayoutFile.h" -#include "Layout.h" #include "Lexer.h" #include "TextClass.h" #include "version.h" @@ -28,10 +27,9 @@ #include "support/filetools.h" #include "support/lstrings.h" -#include "support/regex.h" - #include #include +#include using namespace std; using namespace lyx::support; @@ -123,6 +121,9 @@ const char * const known_german_quotes_languages[] = {"austrian", "bulgarian", const char * const known_polish_quotes_languages[] = {"afrikaans", "bosnian", "croatian", "dutch", "magyar", "polish", "romanian", "serbian", "serbian-latin", 0}; +/// languages with hungarian quotes (.lyx names) +const char * const known_hungarian_quotes_languages[] = {"magyar", 0}; + /// languages with russian quotes (.lyx names) const char * const known_russian_quotes_languages[] = {"azerbaijani", "oldrussian", "russian", "ukrainian", 0}; @@ -295,7 +296,7 @@ vector split_options(string const & input) * \p options and return the value. * The found option is also removed from \p options. */ -string process_keyval_opt(vector & options, string name) +string process_keyval_opt(vector & options, string const & name) { for (size_t i = 0; i < options.size(); ++i) { vector option; @@ -445,8 +446,7 @@ int Preamble::getSpecialTableColumnArguments(char c) const void Preamble::add_package(string const & name, vector & options) { // every package inherits the global options - if (used_packages.find(name) == used_packages.end()) - used_packages[name] = split_options(h_options); + used_packages.insert({name, split_options(h_options)}); // Insert options passed via PassOptionsToPackage for (auto const & p : extra_package_options_) { @@ -469,6 +469,16 @@ void Preamble::add_package(string const & name, vector & options) } } +void Preamble::setTextClass(string const & tclass, TeX2LyXDocClass & tc) +{ + h_textclass = tclass; + tc.setName(h_textclass); + if (!LayoutFileList::get().haveClass(h_textclass) || !tc.load()) { + cerr << "Error: Could not read layout file for textclass \"" << h_textclass << "\"." << endl; + exit(EXIT_FAILURE); + } +} + namespace { @@ -543,6 +553,8 @@ Preamble::Preamble() : one_language(true), explicit_babel(false), h_html_be_strict = "false"; h_html_css_as_file = "0"; h_html_math_output = "0"; + h_docbook_table_output = "0"; + h_docbook_mathml_prefix = "1"; h_index[0] = "Index"; h_index_command = "default"; h_inputencoding = "auto-legacy"; @@ -1938,6 +1950,11 @@ bool Preamble::writeLyXHeader(ostream & os, bool subdoc, string const & outfiled << "\\save_transient_properties " << h_save_transient_properties << "\n" << "\\origin " << origin << "\n" << "\\textclass " << h_textclass << "\n"; + if (!h_doc_metadata.empty()) { + os << "\\begin_metadata\n" + << h_doc_metadata + << "\n\\end_metadata\n"; + } string const raw = subdoc ? empty_string() : h_preamble.str(); if (!raw.empty()) { os << "\\begin_preamble\n"; @@ -2117,6 +2134,8 @@ bool Preamble::writeLyXHeader(ostream & os, bool subdoc, string const & outfiled << "\\html_math_output " << h_html_math_output << "\n" << "\\html_css_as_file " << h_html_css_as_file << "\n" << "\\html_be_strict " << h_html_be_strict << "\n" + << "\\docbook_table_output " << h_docbook_table_output << "\n" + << "\\docbook_mathml_prefix " << h_docbook_mathml_prefix << "\n" << authors_ << "\\end_header\n\n" << "\\begin_body\n"; @@ -2139,6 +2158,7 @@ void Preamble::parse(Parser & p, string const & forceclass, bool is_full_document = false; bool is_lyx_file = false; bool in_lyx_preamble = false; + bool class_set = false; // determine whether this is a full document or a fragment for inclusion while (p.good()) { @@ -2154,6 +2174,12 @@ void Preamble::parse(Parser & p, string const & forceclass, if (detectEncoding && !is_full_document) return; + // Force textclass if the user wanted it + if (!forceclass.empty()) { + setTextClass(forceclass, tc); + class_set = true; + } + while (is_full_document && p.good()) { if (detectEncoding && h_inputencoding != "auto-legacy" && h_inputencoding != "auto-legacy-plain") @@ -2658,15 +2684,16 @@ void Preamble::parse(Parser & p, string const & forceclass, vector opts = split_options(p.getArg('[', ']')); // FIXME This does not work for classes that have a // different name in LyX than in LaTeX - h_textclass = p.getArg('{', '}'); + string const tclass = p.getArg('{', '}'); p.skip_spaces(); - // Force textclass if the user wanted it - if (!forceclass.empty()) - h_textclass = forceclass; - tc.setName(h_textclass); - if (!LayoutFileList::get().haveClass(h_textclass) || !tc.load()) { - cerr << "Error: Could not read layout file for textclass \"" << h_textclass << "\"." << endl; - exit(EXIT_FAILURE); + // Only set text class if a class hasn't been forced + // (this was set above) + if (!class_set) { + // textclass needs to be set at this place (if not already done) + // as we need to know it for other parameters + // (such as class-dependent paper size) + setTextClass(tclass, tc); + class_set = true; } // Font sizes. @@ -2744,7 +2771,6 @@ void Preamble::parse(Parser & p, string const & forceclass, // paper sizes // some size options are known by the document class, other sizes // are handled by the \geometry command of the geometry package - string paper; vector class_psizes = getVectorFromString(tc.opt_pagesize(), "|"); string const psize_format = tc.pagesizeformat(); for (auto const & psize : class_psizes) { @@ -2772,6 +2798,11 @@ void Preamble::parse(Parser & p, string const & forceclass, continue; } + if (t.cs() == "DocumentMetadata") { + h_doc_metadata = trimSpaceAndEol(p.getArg('{', '}')); + continue; + } + if (t.cs() == "usepackage") { string const options = p.getArg('[', ']'); string const name = p.getArg('{', '}'); @@ -3089,6 +3120,10 @@ void Preamble::parse(Parser & p, string const & forceclass, } } + // set textclass if not yet done (snippets without \documentclass and forced class) + if (!class_set) + setTextClass(h_textclass, tc); + // remove the whitespace p.skip_spaces(); @@ -3153,6 +3188,9 @@ void Preamble::parse(Parser & p, string const & forceclass, // polish else if (is_known(h_language, known_polish_quotes_languages)) h_quotes_style = "polish"; + // hungarian + else if (is_known(h_language, known_hungarian_quotes_languages)) + h_quotes_style = "hungarian"; // russian else if (is_known(h_language, known_russian_quotes_languages)) h_quotes_style = "russian";