]> git.lyx.org Git - features.git/blobdiff - src/TextClass.cpp
Rework default bibliography style UI
[features.git] / src / TextClass.cpp
index c9655df6dcde3c75d38cb9883c9fef8978a17ee0..73f3cd194a3f69e54867576e70956fa481e2d11d 100644 (file)
@@ -17,6 +17,7 @@
 #include "TextClass.h"
 
 #include "LayoutFile.h"
+#include "CiteEnginesList.h"
 #include "Color.h"
 #include "Counters.h"
 #include "Floating.h"
@@ -61,7 +62,13 @@ namespace lyx {
 // You should also run the development/tools/updatelayouts.py script,
 // to update the format of all of our layout files.
 //
-int const LAYOUT_FORMAT = 59; //gm: OutlinerName, AddToToc, IsTocCaption
+int const LAYOUT_FORMAT = 62; //spitz PassThru for arguments.
+
+
+// Layout format for the current lyx file format. Controls which format is
+// targeted by Local Layout > Convert. In master, equal to LAYOUT_FORMAT.
+int const LYXFILE_LAYOUT_FORMAT = LAYOUT_FORMAT;
+
 
 namespace {
 
@@ -79,26 +86,29 @@ private:
 };
 
 
-bool layout2layout(FileName const & filename, FileName const & tempfile)
+bool layout2layout(FileName const & filename, FileName const & tempfile,
+                   int const format = LAYOUT_FORMAT)
 {
        FileName const script = libFileSearch("scripts", "layout2layout.py");
        if (script.empty()) {
                LYXERR0("Could not find layout conversion "
-                         "script layout2layout.py.");
+                       "script layout2layout.py.");
                return false;
        }
 
        ostringstream command;
        command << os::python() << ' ' << quoteName(script.toFilesystemEncoding())
-               << ' ' << quoteName(filename.toFilesystemEncoding())
-               << ' ' << quoteName(tempfile.toFilesystemEncoding());
+               << " -t " << format
+               << ' ' << quoteName(filename.toFilesystemEncoding())
+               << ' ' << quoteName(tempfile.toFilesystemEncoding());
        string const command_str = command.str();
 
        LYXERR(Debug::TCLASS, "Running `" << command_str << '\'');
 
        cmd_ret const ret = runCommand(command_str);
        if (ret.first != 0) {
-               LYXERR0("Could not run layout conversion script layout2layout.py.");
+               if (format == LAYOUT_FORMAT)
+                       LYXERR0("Conversion of layout with layout2layout.py has failed.");
                return false;
        }
        return true;
@@ -114,6 +124,8 @@ string translateReadType(TextClass::ReadType rt)
                return "input file";
        case TextClass::MODULE:
                return "module file";
+       case TextClass::CITE_ENGINE:
+               return "cite engine";
        case TextClass::VALIDATION:
                return "validation";
        }
@@ -290,7 +302,7 @@ std::string TextClass::convert(std::string const & str)
        os.close();
        TempFile tmp2("convert_localXXXXXX.layout");
        FileName const tempfile = tmp2.name();
-       bool success = layout2layout(fn, tempfile);
+       bool success = layout2layout(fn, tempfile, LYXFILE_LAYOUT_FORMAT);
        if (!success)
                return "";
        ifstream is(tempfile.toFilesystemEncoding().c_str());
@@ -375,13 +387,13 @@ TextClass::ReturnValues TextClass::read(std::string const & str, ReadType rt)
        os << str;
        os.close();
 
-       // now try to convert it
-       bool const worx = convertLayoutFormat(tempfile, rt);
-       if (!worx) {
+       // now try to convert it to LAYOUT_FORMAT
+       if (!convertLayoutFormat(tempfile, rt)) {
                LYXERR0("Unable to convert internal layout information to format "
                        << LAYOUT_FORMAT);
                return ERROR;
        }
+
        return OK_OLDFORMAT;
 }
 
@@ -528,6 +540,8 @@ TextClass::ReturnValues TextClass::read(Lexer & lexrc, ReadType rt)
                        // Either way, we just scan the rest and discard it
                        else {
                                Layout lay;
+                               // false positive from coverity
+                               // coverity[CHECKED_RETURN]
                                readStyle(lexrc, lay);
                        }
                        break;
@@ -603,15 +617,15 @@ TextClass::ReturnValues TextClass::read(Lexer & lexrc, ReadType rt)
                        break;
 
                case TC_PREAMBLE:
-                       preamble_ = from_utf8(lexrc.getLongString("EndPreamble"));
+                       preamble_ = lexrc.getLongString(from_ascii("EndPreamble"));
                        break;
 
                case TC_HTMLPREAMBLE:
-                       htmlpreamble_ = from_utf8(lexrc.getLongString("EndPreamble"));
+                       htmlpreamble_ = lexrc.getLongString(from_ascii("EndPreamble"));
                        break;
 
                case TC_HTMLSTYLES:
-                       htmlstyles_ = from_utf8(lexrc.getLongString("EndStyles"));
+                       htmlstyles_ = lexrc.getLongString(from_ascii("EndStyles"));
                        break;
 
                case TC_HTMLTOCSECTION:
@@ -619,15 +633,15 @@ TextClass::ReturnValues TextClass::read(Lexer & lexrc, ReadType rt)
                        break;
 
                case TC_ADDTOPREAMBLE:
-                       preamble_ += from_utf8(lexrc.getLongString("EndPreamble"));
+                       preamble_ += lexrc.getLongString(from_ascii("EndPreamble"));
                        break;
 
                case TC_ADDTOHTMLPREAMBLE:
-                       htmlpreamble_ += from_utf8(lexrc.getLongString("EndPreamble"));
+                       htmlpreamble_ += lexrc.getLongString(from_ascii("EndPreamble"));
                        break;
 
                case TC_ADDTOHTMLSTYLES:
-                       htmlstyles_ += from_utf8(lexrc.getLongString("EndStyles"));
+                       htmlstyles_ += lexrc.getLongString(from_ascii("EndStyles"));
                        break;
 
                case TC_PROVIDES: {
@@ -745,8 +759,21 @@ TextClass::ReturnValues TextClass::read(Lexer & lexrc, ReadType rt)
                        break;
 
                case TC_DEFAULTBIBLIO:
-                       if (lexrc.next())
-                               cite_default_biblio_style_ = rtrim(lexrc.getString());
+                       if (lexrc.next()) {
+                               vector<string> const dbs =
+                                       getVectorFromString(rtrim(lexrc.getString()), "|");
+                               vector<string>::const_iterator it  = dbs.begin();
+                               vector<string>::const_iterator end = dbs.end();
+                               for (; it != end; ++it) {
+                                       if (!contains(*it, ':'))
+                                               cite_default_biblio_style_[opt_enginetype_] = *it;
+                                       else {
+                                               string eng;
+                                               string const db = split(*it, eng, ':');
+                                               cite_default_biblio_style_[eng] = db;
+                                       }
+                               }
+                       }
                        break;
 
                case TC_FULLAUTHORLIST:
@@ -1144,7 +1171,7 @@ bool TextClass::readFloat(Lexer & lexrc)
 
        string ext;
        string htmlattr;
-       string htmlstyle;
+       docstring htmlstyle;
        string htmltag;
        string listname;
        string listcommand;
@@ -1248,7 +1275,7 @@ bool TextClass::readFloat(Lexer & lexrc)
                        break;
                case FT_HTMLSTYLE:
                        lexrc.next();
-                       htmlstyle = lexrc.getLongString("EndHTMLStyle");
+                       htmlstyle = lexrc.getLongString(from_ascii("EndHTMLStyle"));
                        break;
                case FT_HTMLTAG:
                        lexrc.next();
@@ -1574,6 +1601,7 @@ Layout TextClass::createBasicLayout(docstring const & name, bool unknown) const
 
 DocumentClassPtr getDocumentClass(
                LayoutFile const & baseClass, LayoutModuleList const & modlist,
+               LayoutModuleList const & celist,
                bool const clone)
 {
        DocumentClassPtr doc_class =
@@ -1612,6 +1640,42 @@ DocumentClassPtr getDocumentClass(
                        frontend::Alert::warning(_("Read Error"), msg);
                }
        }
+
+       LayoutModuleList::const_iterator cit = celist.begin();
+       LayoutModuleList::const_iterator cen = celist.end();
+       for (; cit != cen; ++cit) {
+               string const ceName = *cit;
+               LyXCiteEngine * ce = theCiteEnginesList[ceName];
+               if (!ce) {
+                       docstring const msg =
+                                               bformat(_("The cite engine %1$s has been requested by\n"
+                                               "this document but has not been found in the list of\n"
+                                               "available engines. If you recently installed it, you\n"
+                                               "probably need to reconfigure LyX.\n"), from_utf8(ceName));
+                       if (!clone)
+                               frontend::Alert::warning(_("Cite Engine not available"), msg);
+                       continue;
+               }
+               if (!ce->isAvailable() && !clone) {
+                       docstring const prereqs = from_utf8(getStringFromVector(ce->prerequisites(), "\n\t"));
+                       docstring const msg =
+                               bformat(_("The cite engine %1$s requires a package that is not\n"
+                                       "available in your LaTeX installation, or a converter that\n"
+                                       "you have not installed. LaTeX output may not be possible.\n"
+                                       "Missing prerequisites:\n"
+                                               "\t%2$s\n"
+                                       "See section 3.1.2.3 (Modules) of the User's Guide for more information."),
+                               from_utf8(ceName), prereqs);
+                       frontend::Alert::warning(_("Package not available"), msg, true);
+               }
+               FileName layout_file = libFileSearch("citeengines", ce->getFilename());
+               if (!doc_class->read(layout_file, TextClass::CITE_ENGINE)) {
+                       docstring const msg =
+                                               bformat(_("Error reading cite engine %1$s\n"), from_utf8(ceName));
+                       frontend::Alert::warning(_("Read Error"), msg);
+               }
+       }
+
        return doc_class;
 }