]> git.lyx.org Git - features.git/blobdiff - src/tex2lyx/Preamble.cpp
Handle empty index subentries (#7820)
[features.git] / src / tex2lyx / Preamble.cpp
index f28df64b9f03022bc1b37c33e793f0423857f10b..7b69bc4db5392eaa0bbba2853c42684f4866b721 100644 (file)
@@ -18,7 +18,6 @@
 
 #include "Encoding.h"
 #include "LayoutFile.h"
-#include "Layout.h"
 #include "Lexer.h"
 #include "TextClass.h"
 #include "version.h"
 #include "support/filetools.h"
 #include "support/lstrings.h"
 
-#include "support/regex.h"
-
 #include <algorithm>
 #include <iostream>
+#include <regex>
 
 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<string> 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<string> & options, string name)
+string process_keyval_opt(vector<string> & options, string const & name)
 {
        for (size_t i = 0; i < options.size(); ++i) {
                vector<string> option;
@@ -445,8 +446,7 @@ int Preamble::getSpecialTableColumnArguments(char c) const
 void Preamble::add_package(string const & name, vector<string> & 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,7 +469,7 @@ void Preamble::add_package(string const & name, vector<string> & options)
        }
 }
 
-void Preamble::setTextClass(string const tclass, TeX2LyXDocClass & tc)
+void Preamble::setTextClass(string const tclass, TeX2LyXDocClass & tc)
 {
        h_textclass = tclass;
        tc.setName(h_textclass);
@@ -554,6 +554,7 @@ Preamble::Preamble() : one_language(true), explicit_babel(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";
@@ -1949,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";
@@ -2129,6 +2135,7 @@ bool Preamble::writeLyXHeader(ostream & os, bool subdoc, string const & outfiled
           << "\\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";
@@ -2167,17 +2174,17 @@ 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")
                        return;
 
-               // Force textclass if the user wanted it
-               if (!forceclass.empty()) {
-                       setTextClass(forceclass, tc);
-                       class_set = true;
-               }
-
                Token const & t = p.get_token();
 
 #ifdef FILEDEBUG
@@ -2764,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<string> class_psizes = getVectorFromString(tc.opt_pagesize(), "|");
                        string const psize_format = tc.pagesizeformat();
                        for (auto const & psize : class_psizes) {
@@ -2792,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('{', '}');
@@ -3177,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";