]> git.lyx.org Git - lyx.git/blobdiff - src/TextClass.cpp
Account for old versions of Pygments
[lyx.git] / src / TextClass.cpp
index d14ef2994a34cfff4e74accba4d25fdd56365384..612539843f0b2148574d4eb3cb512ce113786e6e 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 = 62; //spitz PassThru for arguments.
+int const LAYOUT_FORMAT = 63; //spitz: new tags CiteFramework, MaxCiteNames, extended InsetCite syntax.
 
 
 // Layout format for the current lyx file format. Controls which format is
@@ -155,7 +155,7 @@ TextClass::TextClass()
          outputType_(LATEX), outputFormat_("latex"),
          defaultfont_(sane_font),
          titletype_(TITLE_COMMAND_AFTER), titlename_("maketitle"),
-         min_toclevel_(0), max_toclevel_(0),
+         min_toclevel_(0), max_toclevel_(0), maxcitenames_(2),
          cite_full_author_list_(true)
 {
 }
@@ -221,6 +221,8 @@ enum TextClassTags {
        TC_CITEENGINE,
        TC_CITEENGINETYPE,
        TC_CITEFORMAT,
+       TC_CITEFRAMEWORK,
+       TC_MAXCITENAMES,
        TC_DEFAULTBIBLIO,
        TC_FULLAUTHORLIST,
        TC_OUTLINERNAME
@@ -236,6 +238,7 @@ LexerKeyword textClassTags[] = {
        { "citeengine",        TC_CITEENGINE },
        { "citeenginetype",    TC_CITEENGINETYPE },
        { "citeformat",        TC_CITEFORMAT },
+       { "citeframework",     TC_CITEFRAMEWORK },
        { "classoptions",      TC_CLASSOPTIONS },
        { "columns",           TC_COLUMNS },
        { "counter",           TC_COUNTER },
@@ -254,6 +257,7 @@ LexerKeyword textClassTags[] = {
        { "input",             TC_INPUT },
        { "insetlayout",       TC_INSETLAYOUT },
        { "leftmargin",        TC_LEFTMARGIN },
+       { "maxcitenames",      TC_MAXCITENAMES },
        { "modifystyle",       TC_MODIFYSTYLE },
        { "nocounter",         TC_NOCOUNTER },
        { "nofloat",           TC_NOFLOAT },
@@ -459,8 +463,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()) {
@@ -540,9 +549,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;
                }
@@ -758,9 +766,35 @@ TextClass::ReturnValues TextClass::read(Lexer & lexrc, ReadType rt)
                        error = !readCiteFormat(lexrc);
                        break;
 
+               case TC_CITEFRAMEWORK:
+                       lexrc.next();
+                       citeframework_ = rtrim(lexrc.getString());
+                       break;
+
+               case TC_MAXCITENAMES:
+                       lexrc.next();
+                       maxcitenames_ = size_t(lexrc.getInteger());
+                       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, ':')) {
+                                               vector<string> const enginetypes =
+                                                       getVectorFromString(opt_enginetype_, "|");
+                                               for (string const &s: enginetypes)
+                                                       cite_default_biblio_style_[s] = *it;
+                                       } else {
+                                               string eng;
+                                               string const db = split(*it, eng, ':');
+                                               cite_default_biblio_style_[eng] = db;
+                                       }
+                               }
+                       }
                        break;
 
                case TC_FULLAUTHORLIST:
@@ -1016,30 +1050,85 @@ bool TextClass::readCiteEngine(Lexer & lexrc)
                        getout = true;
                        continue;
                }
-               string cmd;
                CitationStyle cs;
                char ichar = def[0];
                if (ichar == '#')
                        continue;
-               if (ichar == 'C') {
+               if (isUpperCase(ichar)) {
                        cs.forceUpperCase = true;
-                       def[0] = 'c';
+                       def[0] = lowercase(ichar);
                }
 
+               /** For portability reasons (between different
+                *  cite engines such as natbib and biblatex),
+                *  we distinguish between:
+                *  1. The LyX name as output in the LyX file
+                *  2. Possible aliases that might fall back to
+                *     the given LyX name in the current engine
+                *  3. The actual LaTeX command that is output
+                *  (2) and (3) are optional.
+                *  Also, the GUI string for the starred version can
+                *  be changed
+                *  The syntax is:
+                *  LyXName|alias,nextalias*<!stardesc!stardesctooltip>[][]=latexcmd
+                */
+               enum ScanMode {
+                       LyXName,
+                       Alias,
+                       LaTeXCmd,
+                       StarDesc
+               };
+
+               ScanMode mode = LyXName;
+               ScanMode oldmode = LyXName;
+               string lyx_cmd;
+               string alias;
+               string latex_cmd;
+               string stardesc;
                size_t const n = def.size();
                for (size_t i = 0; i != n; ++i) {
                        ichar = def[i];
-                       if (ichar == '*')
-                               cs.fullAuthorList = true;
+                       if (ichar == '|')
+                               mode = Alias;
+                       else if (ichar == '=')
+                               mode = LaTeXCmd;
+                       else if (ichar == '<') {
+                               oldmode = mode;
+                               mode = StarDesc;
+                       } else if (ichar == '>')
+                               mode = oldmode;
+                       else if (mode == LaTeXCmd)
+                               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)
                                cs.textBefore = true;
                        else if (ichar == '[')
                                cs.textAfter = true;
-                       else if (ichar != ']')
-                               cmd += ichar;
+                       else if (ichar != ']') {
+                               if (mode == Alias)
+                                       alias += ichar;
+                               else
+                                       lyx_cmd += ichar;
+                       }
                }
-
-               cs.cmd = cmd;
+               cs.name = lyx_cmd;
+               cs.cmd = latex_cmd.empty() ? lyx_cmd : latex_cmd;
+               if (!alias.empty()) {
+                       vector<string> const aliases = getVectorFromString(alias);
+                       for (string const &s: aliases)
+                               cite_command_aliases_[s] = lyx_cmd;
+               }
+               vector<string> const stardescs = getVectorFromString(stardesc, "!");
+               int size = stardesc.size();
+               if (size > 0)
+                       cs.stardesc = stardescs[0];
+               if (size > 1)
+                       cs.startooltip = stardescs[1];
                if (type & ENGINE_TYPE_AUTHORYEAR)
                        cite_styles_[ENGINE_TYPE_AUTHORYEAR].push_back(cs);
                if (type & ENGINE_TYPE_NUMERICAL)
@@ -1333,18 +1422,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_, ',')) {
@@ -1732,10 +1809,12 @@ Layout const & DocumentClass::htmlTOCLayout() const
 }
 
 
-string const DocumentClass::getCiteFormat(CiteEngineType const & type,
-       string const & entry, string const & fallback) const
+string const DocumentClass::getCiteFormat(CiteEngineType const & type,
+       string const & entry, bool const punct, string const & fallback) const
 {
-       static 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 += ".";
 
        map<CiteEngineType, map<string, string> >::const_iterator itype = cite_formats_.find(type);
        if (itype == cite_formats_.end())
@@ -1745,6 +1824,8 @@ string const & DocumentClass::getCiteFormat(CiteEngineType const & type,
                it = itype->second.find(fallback);
        if (it == itype->second.end())
                return default_format;
+       if (punct)
+               return it->second + ".";
        return it->second;
 }
 
@@ -1772,7 +1853,7 @@ vector<string> const DocumentClass::citeCommands(
        vector<string> cmds;
        for (; it != end; ++it) {
                CitationStyle const cite = *it;
-               cmds.push_back(cite.cmd);
+               cmds.push_back(cite.name);
        }
        return cmds;
 }