]> git.lyx.org Git - lyx.git/blobdiff - src/TextClass.cpp
Provide proper fallback if a bibliography processor is not found
[lyx.git] / src / TextClass.cpp
index 615734870dc7d87290e61d6b55b6ac8499989596..56a59520aec595e4d6012c6b7b4e31d577c6c1d7 100644 (file)
@@ -62,7 +62,7 @@ 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 = 63; //spitz: new tags CiteFramework, MaxCiteNames, extended InsetCite syntax.
+int const LAYOUT_FORMAT = 66; //spitz: New layout tag AutoNests
 
 
 // Layout format for the current lyx file format. Controls which format is
@@ -133,7 +133,7 @@ string translateReadType(TextClass::ReadType rt)
        return string();
 }
 
-} // namespace anon
+} // namespace
 
 
 // This string should not be translated here,
@@ -152,7 +152,7 @@ TextClass::TextClass()
          opt_enginetype_("authoryear|numerical"), opt_fontsize_("10|11|12"),
          opt_pagestyle_("empty|plain|headings|fancy"), pagestyle_("default"),
          columns_(1), sides_(OneSide), secnumdepth_(3), tocdepth_(3),
-         outputType_(LATEX), outputFormat_("latex"),
+         outputType_(LATEX), outputFormat_("latex"), has_output_format_(false),
          defaultfont_(sane_font),
          titletype_(TITLE_COMMAND_AFTER), titlename_("maketitle"),
          min_toclevel_(0), max_toclevel_(0), maxcitenames_(2),
@@ -282,7 +282,7 @@ LexerKeyword textClassTags[] = {
        { "tocdepth",          TC_TOCDEPTH }
 };
 
-} //namespace anon
+} // namespace
 
 
 bool TextClass::convertLayoutFormat(support::FileName const & filename, ReadType rt)
@@ -408,11 +408,14 @@ TextClass::ReturnValues TextClass::read(Lexer & lexrc, ReadType rt)
        if (!lexrc.isOK())
                return ERROR;
 
-       // Format of files before the 'Format' tag was introduced
-       int format = 1;
-       bool error = false;
+       // The first usable line should be
+       // Format LAYOUT_FORMAT
+       if (lexrc.lex() != TC_FORMAT || !lexrc.next()
+           || lexrc.getInteger() != LAYOUT_FORMAT)
+               return FORMAT_MISMATCH;
 
        // parsing
+       bool error = false;
        while (lexrc.isOK() && !error) {
                int le = lexrc.lex();
 
@@ -437,13 +440,15 @@ TextClass::ReturnValues TextClass::read(Lexer & lexrc, ReadType rt)
                switch (static_cast<TextClassTags>(le)) {
 
                case TC_FORMAT:
-                       if (lexrc.next())
-                               format = lexrc.getInteger();
+                       lexrc.next();
+                       lexrc.printError("Duplicate Format directive");
                        break;
 
                case TC_OUTPUTFORMAT:
-                       if (lexrc.next())
+                       if (lexrc.next()) {
                                outputFormat_ = lexrc.getString();
+                               has_output_format_ = true;
+                       }
                        break;
 
                case TC_OUTPUTTYPE:
@@ -463,8 +468,13 @@ TextClass::ReturnValues TextClass::read(Lexer & lexrc, ReadType rt)
 
                case TC_INPUT: // Include file
                        if (lexrc.next()) {
+                               FileName tmp;
                                string const inc = lexrc.getString();
-                               FileName tmp = libFileSearch("layouts", inc,
+                               if (!path().empty() && (prefixIs(inc, "./") ||
+                                                       prefixIs(inc, "../")))
+                                       tmp = fileSearch(path(), inc, "layout");
+                               else
+                                       tmp = libFileSearch("layouts", inc,
                                                            "layout");
 
                                if (tmp.empty()) {
@@ -512,9 +522,9 @@ TextClass::ReturnValues TextClass::read(Lexer & lexrc, ReadType rt)
                                error = !readStyle(lexrc, lay);
                                break;
                        }
-                       
+
                        bool const have_layout = hasLayout(name);
-                       
+
                        // If the layout already exists, then we want to add it to
                        // the existing layout, as long as we are not in an ProvideStyle
                        // block.
@@ -544,9 +554,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);
+                               // signal to coverity that we do not care about the result
+                               (void)readStyle(lexrc, lay);
                        }
                        break;
                }
@@ -722,6 +731,7 @@ TextClass::ReturnValues TextClass::read(Lexer & lexrc, ReadType rt)
                                break;
                        }
                        docstring const name = subst(lexrc.getDocString(), '_', ' ');
+                       bool const validating = (rt == VALIDATION);
                        if (name.empty()) {
                                string s = "Could not read name for InsetLayout: `$$Token' "
                                        + lexrc.getString() + " is probably not valid UTF-8!";
@@ -730,15 +740,17 @@ TextClass::ReturnValues TextClass::read(Lexer & lexrc, ReadType rt)
                                // Since we couldn't read the name, we just scan the rest
                                // of the style and discard it.
                                il.read(lexrc, *this);
-                               // Let's try to continue rather than abort.
-                               // error = true;
+                               // Let's try to continue rather than abort, unless we're validating
+                               // in which case we want to report the error
+                               if (validating)
+                                       error = true;
                        } else if (hasInsetLayout(name)) {
                                InsetLayout & il = insetlayoutlist_[name];
-                               error = !il.read(lexrc, *this);
+                               error = !il.read(lexrc, *this, validating);
                        } else {
                                InsetLayout il;
                                il.setName(name);
-                               error = !il.read(lexrc, *this);
+                               error = !il.read(lexrc, *this, validating);
                                if (!error)
                                        insetlayoutlist_[name] = il;
                        }
@@ -849,11 +861,6 @@ TextClass::ReturnValues TextClass::read(Lexer & lexrc, ReadType rt)
                        error = !readOutlinerName(lexrc);
                        break;
                } // end of switch
-
-               // Note that this is triggered the first time through the loop unless
-               // we hit a format tag.
-               if (format != LAYOUT_FORMAT)
-                       return FORMAT_MISMATCH;
        }
 
        // at present, we abort if we encounter an error,
@@ -1097,6 +1104,8 @@ bool TextClass::readCiteEngine(Lexer & lexrc)
                                latex_cmd += ichar;
                        else if (mode == StarDesc)
                                stardesc += ichar;
+                       else if (ichar == '$')
+                               cs.hasQualifiedList = true;
                        else if (ichar == '*')
                                cs.hasStarredVersion = true;
                        else if (ichar == '[' && cs.textAfter)
@@ -1173,7 +1182,7 @@ bool TextClass::readCiteFormat(Lexer & lexrc)
                char initchar = etype[0];
                if (initchar == '#')
                        continue;
-               if (initchar == '!' || initchar == '_') {
+               if (initchar == '!' || initchar == '_' || prefixIs(etype, "B_")) {
                        if (type & ENGINE_TYPE_AUTHORYEAR)
                                cite_macros_[ENGINE_TYPE_AUTHORYEAR][etype] = definition;
                        if (type & ENGINE_TYPE_NUMERICAL)
@@ -1416,18 +1425,6 @@ bool TextClass::readOutlinerName(Lexer & lexrc)
 }
 
 
-docstring TextClass::outlinerName(std::string const & type) const
-{
-       std::map<std::string,docstring>::const_iterator const it
-               = outliner_names_.find(type);
-       if (it == outliner_names_.end()) {
-               LYXERR0("Missing OutlinerName for " << type << "!");
-               return from_utf8(type);
-       } else
-               return it->second;
-}
-
-
 string const & TextClass::prerequisites(string const & sep) const
 {
        if (contains(prerequisites_, ',')) {
@@ -1794,7 +1791,7 @@ Layout const & DocumentClass::getTOCLayout() const
        for (; lit != len; ++lit) {
                int const level = lit->toclevel;
                // we don't want Part or unnumbered sections
-               if (level == Layout::NOT_IN_TOC || level < 0 
+               if (level == Layout::NOT_IN_TOC || level < 0
                    || level >= minlevel || lit->counter.empty())
                        continue;
                lay = &*lit;
@@ -1818,7 +1815,7 @@ Layout const & DocumentClass::htmlTOCLayout() const
 string const DocumentClass::getCiteFormat(CiteEngineType const & type,
        string const & entry, bool const punct, string const & fallback) const
 {
-       string default_format = "{%author%[[%author%, ]][[{%editor%[[%editor%, ed., ]]}]]}\"%title%\"{%journal%[[, {!<i>!}%journal%{!</i>!}]][[{%publisher%[[, %publisher%]][[{%institution%[[, %institution%]]}]]}]]}{%year%[[ (%year%)]]}{%pages%[[, %pages%]]}";
+       string default_format = "{%fullnames:author%[[%fullnames:author%, ]][[{%fullnames:editor%[[%fullnames:editor%, ed., ]]}]]}\"%title%\"{%journal%[[, {!<i>!}%journal%{!</i>!}]][[{%publisher%[[, %publisher%]][[{%institution%[[, %institution%]]}]]}]]}{%year%[[ (%year%)]]}{%pages%[[, %pages%]]}";
        if (punct)
                default_format += ".";