]> git.lyx.org Git - lyx.git/blobdiff - src/tex2lyx/text.cpp
Fix more warnings and simplify a tiny bit.
[lyx.git] / src / tex2lyx / text.cpp
index badae84ada500cc873e6db19cd0fd0dac6f77819..f9201cd1a26f73f307979729869a3f243d5d0683 100644 (file)
@@ -2300,6 +2300,9 @@ void parse_environment(Parser & p, ostream & os, bool outer,
                        }
                        switch (context.layout->latextype) {
                        case  LATEX_LIST_ENVIRONMENT:
+                               context.in_list_preamble =
+                                       !context.layout->listpreamble().empty()
+                                       && p.hasListPreamble(context.layout->itemcommand());
                                context.add_par_extra_stuff("\\labelwidthstring "
                                                            + p.verbatim_item() + '\n');
                                p.skip_spaces();
@@ -2323,11 +2326,20 @@ void parse_environment(Parser & p, ostream & os, bool outer,
                                output_arguments(os, p, outer, false, string(), context,
                                                 context.layout->latexargs());
                        else if (context.layout->latextype == LATEX_ITEM_ENVIRONMENT) {
+                               context.in_list_preamble =
+                                       !context.layout->listpreamble().empty()
+                                       && p.hasListPreamble(context.layout->itemcommand());
                                ostringstream oss;
                                output_arguments(oss, p, outer, false, string(), context,
                                                 context.layout->latexargs());
                                context.list_extra_stuff = oss.str();
                        }
+                       if (context.in_list_preamble) {
+                               // Collect the stuff between \begin and first \item
+                               context.list_preamble =
+                                       parse_text_snippet(p, FLAG_END, outer, context);
+                               context.in_list_preamble = false;
+                       }
                        parse_text(p, os, FLAG_END, outer, context);
                        if (context.layout->latextype == LATEX_ENVIRONMENT)
                                output_arguments(os, p, outer, false, "post", context,
@@ -2343,7 +2355,7 @@ void parse_environment(Parser & p, ostream & os, bool outer,
                        p.skip_spaces();
                        if (!preamble.titleLayoutFound())
                                preamble.titleLayoutFound(newlayout->intitle);
-                       set<string> const & req = newlayout->requires();
+                       set<string> const & req = newlayout->required();
                        set<string>::const_iterator it = req.begin();
                        set<string>::const_iterator en = req.end();
                        for (; it != en; ++it)
@@ -2907,6 +2919,13 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer,
                debugToken(cerr, t, flags);
 #endif
 
+               if (context.in_list_preamble
+                   && p.next_token().cs() == context.layout->itemcommand()) {
+                       // We are parsing a list preamble. End before first \item.
+                       flags |= FLAG_LEAVE;
+                       context.in_list_preamble = false;
+               }
+
                if (flags & FLAG_ITEM) {
                        if (t.cat() == catSpace)
                                continue;
@@ -3351,6 +3370,16 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer,
                        if (context.layout->labeltype != LABEL_MANUAL)
                                output_arguments(os, p, outer, false, "item", context,
                                                 context.layout->itemargs());
+                       if (!context.list_preamble.empty()) {
+                               // We have a list preamble. Output it here.
+                               begin_inset(os, "Argument listpreamble:1");
+                               os << "\nstatus collapsed\n\n"
+                                  << "\\begin_layout Plain Layout\n\n"
+                                  << rtrim(context.list_preamble)
+                                  << "\n\\end_layout";
+                               end_inset(os);
+                               context.list_preamble.clear();
+                       }
                        if (!context.list_extra_stuff.empty()) {
                                os << context.list_extra_stuff;
                                context.list_extra_stuff.clear();
@@ -3504,7 +3533,7 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer,
                                        parse_text_snippet(p, os, FLAG_ITEM, outer, context);
                                        if (!preamble.titleLayoutFound())
                                                preamble.titleLayoutFound(newlayout->intitle);
-                                       set<string> const & req = newlayout->requires();
+                                       set<string> const & req = newlayout->required();
                                        set<string>::const_iterator it = req.begin();
                                        set<string>::const_iterator en = req.end();
                                        for (; it != en; ++it)
@@ -3530,7 +3559,7 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer,
                        p.skip_spaces();
                        if (!preamble.titleLayoutFound())
                                preamble.titleLayoutFound(newlayout->intitle);
-                       set<string> const & req = newlayout->requires();
+                       set<string> const & req = newlayout->required();
                        for (set<string>::const_iterator it = req.begin(); it != req.end(); ++it)
                                preamble.registerAutomaticallyLoadedPackage(*it);
                        continue;
@@ -3547,7 +3576,7 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer,
                        p.skip_spaces();
                        if (!preamble.titleLayoutFound())
                                preamble.titleLayoutFound(newlayout->intitle);
-                       set<string> const & req = newlayout->requires();
+                       set<string> const & req = newlayout->required();
                        for (set<string>::const_iterator it = req.begin(); it != req.end(); ++it)
                                preamble.registerAutomaticallyLoadedPackage(*it);
                        continue;
@@ -3561,7 +3590,7 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer,
                        p.skip_spaces();
                        if (!preamble.titleLayoutFound())
                                preamble.titleLayoutFound(newlayout->intitle);
-                       set<string> const & req = newlayout->requires();
+                       set<string> const & req = newlayout->required();
                        for (set<string>::const_iterator it = req.begin(); it != req.end(); ++it)
                                preamble.registerAutomaticallyLoadedPackage(*it);
                        continue;
@@ -3704,9 +3733,9 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer,
                        if (opts.find("width") != opts.end())
                                os << "\twidth "
                                   << translate_len(opts["width"]) << '\n';
-                       if (opts.find("height") != opts.end())
+                       if (opts.find("totalheight") != opts.end())
                                os << "\theight "
-                                  << translate_len(opts["height"]) << '\n';
+                                  << translate_len(opts["totalheight"]) << '\n';
                        if (opts.find("scale") != opts.end()) {
                                istringstream iss(opts["scale"]);
                                double val;
@@ -3722,7 +3751,7 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer,
                                vector<string>::const_iterator s =
                                        find(keys.begin(), keys.end(), "width");
                                if (s == keys.end())
-                                       s = find(keys.begin(), keys.end(), "height");
+                                       s = find(keys.begin(), keys.end(), "totalheight");
                                if (s == keys.end())
                                        s = find(keys.begin(), keys.end(), "scale");
                                if (s != keys.end() && distance(s, a) > 0)
@@ -3783,8 +3812,8 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer,
                                special << "trim,";
                        if (opts.find("viewport") != opts.end())
                                special << "viewport=" << opts["viewport"] << ',';
-                       if (opts.find("totalheight") != opts.end())
-                               special << "totalheight=" << opts["totalheight"] << ',';
+                       if (opts.find("height") != opts.end())
+                               special << "height=" << opts["height"] << ',';
                        if (opts.find("type") != opts.end())
                                special << "type=" << opts["type"] << ',';
                        if (opts.find("ext") != opts.end())
@@ -3890,18 +3919,29 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer,
 
                if (t.cs() == "listof") {
                        p.skip_spaces(true);
-                       string const name = p.get_token().cs();
+                       string const name = p.verbatim_item();
                        if (context.textclass.floats().typeExist(name)) {
                                context.check_layout(os);
                                begin_inset(os, "FloatList ");
                                os << name << "\n";
                                end_inset(os);
-                               p.get_token(); // swallow second arg
+                               p.verbatim_item(); // swallow second arg
                        } else
                                output_ert_inset(os, "\\listof{" + name + "}", context);
                        continue;
                }
 
+               if (t.cs() == "theendnotes"
+                  || (t.cs() == "printendnotes"
+                      && p.next_token().asInput() != "*"
+                      && !p.hasOpt())) {
+                       context.check_layout(os);
+                       begin_inset(os, "FloatList endnote\n");
+                       end_inset(os);
+                       skip_spaces_braces(p);
+                       continue;
+               }
+
                if ((where = is_known(t.cs(), known_text_font_families))) {
                        parse_text_attributes(p, os, FLAG_ITEM, outer,
                                context, "\\family", context.font.family,
@@ -4011,11 +4051,16 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer,
                        continue;
                }
 
-               if (t.cs() == "lyxadded" || t.cs() == "lyxdeleted") {
+               if (t.cs() == "lyxadded" || t.cs() == "lyxdeleted" || t.cs() == "lyxobjdeleted"
+                   || t.cs() == "lyxdisplayobjdeleted" || t.cs() == "lyxudisplayobjdeleted") {
                        context.check_layout(os);
+                       string initials;
+                       if (p.hasOpt()) {
+                               initials = p.getArg('[', ']');
+                       }
                        string name = p.getArg('{', '}');
                        string localtime = p.getArg('{', '}');
-                       preamble.registerAuthor(name);
+                       preamble.registerAuthor(name, initials);
                        Author const & author = preamble.getAuthor(name);
                        // from_asctime_utc() will fail if LyX decides to output the
                        // time in the text language.
@@ -4031,7 +4076,6 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer,
                                os << "\n\\change_deleted ";
                        os << author.bufferId() << ' ' << ptime << '\n';
                        parse_text_snippet(p, os, FLAG_ITEM, outer, context);
-                       bool dvipost    = LaTeXPackages::isAvailable("dvipost");
                        bool xcolorulem = LaTeXPackages::isAvailable("ulem") &&
                                          LaTeXPackages::isAvailable("xcolor");
                        // No need to test for luatex, since luatex comes in
@@ -4044,9 +4088,7 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer,
                                        preamble.registerAutomaticallyLoadedPackage("pdfcolmk");
                                }
                        } else {
-                               if (dvipost) {
-                                       preamble.registerAutomaticallyLoadedPackage("dvipost");
-                               } else if (xcolorulem) {
+                               if (xcolorulem) {
                                        preamble.registerAutomaticallyLoadedPackage("ulem");
                                        preamble.registerAutomaticallyLoadedPackage("xcolor");
                                }
@@ -4432,13 +4474,13 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer,
                        }
                        string keys, pretextlist, posttextlist;
                        if (qualified) {
-                               map<string, string> pres, posts, preslit, postslit;
+                               vector<pair<string, string>> pres, posts, preslit, postslit;
                                vector<string> lkeys;
                                // text before the citation
                                string lbefore, lbeforelit;
                                // text after the citation
                                string lafter, lafterlit;
-                               string lkey;    
+                               string lkey;
                                pair<bool, string> laft, lbef;
                                while (true) {
                                        get_cite_arguments(p, true, lbefore, lafter);
@@ -4449,7 +4491,7 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer,
                                                laft = convert_latexed_command_inset_arg(lafter);
                                                literal |= !laft.first;
                                                lafter = laft.second;
-                                               lafterlit = subst(lbefore, "\n", " ");
+                                               lafterlit = subst(lafter, "\n", " ");
                                        }
                                        if (!lbefore.empty()) {
                                                lbefore.erase(0, 1);
@@ -4474,14 +4516,10 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer,
                                        lkey = p.getArg('{', '}');
                                        if (lkey.empty())
                                                break;
-                                       if (!lbefore.empty()) {
-                                               pres.insert(make_pair(lkey, lbefore));
-                                               preslit.insert(make_pair(lkey, lbeforelit));
-                                       }
-                                       if (!lafter.empty()) {
-                                               posts.insert(make_pair(lkey, lafter));
-                                               postslit.insert(make_pair(lkey, lafterlit));
-                                       }
+                                       pres.push_back(make_pair(lkey, lbefore));
+                                       preslit.push_back(make_pair(lkey, lbeforelit));
+                                       posts.push_back(make_pair(lkey, lafter));
+                                       postslit.push_back(make_pair(lkey, lafterlit));
                                        lkeys.push_back(lkey);
                                }
                                keys = convert_literate_command_inset_arg(getStringFromVector(lkeys));
@@ -4492,12 +4530,16 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer,
                                for (auto const & ptl : pres) {
                                        if (!pretextlist.empty())
                                                pretextlist += '\t';
-                                       pretextlist += ptl.first + " " + ptl.second;
+                                       pretextlist += ptl.first;
+                                       if (!ptl.second.empty())
+                                               pretextlist += " " + ptl.second;
                                }
                                for (auto const & potl : posts) {
                                        if (!posttextlist.empty())
                                                posttextlist += '\t';
-                                       posttextlist += potl.first + " " + potl.second;
+                                       posttextlist += potl.first;
+                                       if (!potl.second.empty())
+                                               posttextlist += " " + potl.second;
                                }
                        } else
                                keys = convert_literate_command_inset_arg(p.verbatim_item());
@@ -5344,6 +5386,14 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer,
                                } else
                                        os << "encoding " << '"' << enc->name() << '"' << "\n";
                        }
+                       string bibfileencs;
+                       for (auto const & bf : preamble.biblatex_encodings) {
+                               if (!bibfileencs.empty())
+                                       bibfileencs += "\t";
+                               bibfileencs += bf;
+                       }
+                       if (!bibfileencs.empty())
+                               os << "file_encodings " << '"' << bibfileencs << '"' << "\n";
                        end_inset(os);
                        need_commentbib = false;
                        continue;
@@ -6209,6 +6259,14 @@ void check_comment_bib(ostream & os, Context & context)
        }
        if (!bibfiles.empty())
                os << "bibfiles " << '"' << bibfiles << '"' << "\n";
+       string bibfileencs;
+       for (auto const & bf : preamble.biblatex_encodings) {
+               if (!bibfileencs.empty())
+                       bibfileencs += "\t";
+               bibfileencs += bf;
+       }
+       if (!bibfileencs.empty())
+               os << "file_encodings " << '"' << bibfileencs << '"' << "\n";
        end_inset(os);// Bibtex
        os << "\\end_layout\n";
        end_inset(os);// Note