X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FTextClass.cpp;h=25965c6762ef367d3324964e449dac2aff422b00;hb=890fb133b1b2349588705d32fe0c9b95eb50503a;hp=d14ef2994a34cfff4e74accba4d25fdd56365384;hpb=ff8fe6aaf87882f629a8865fc02f55001f427605;p=lyx.git diff --git a/src/TextClass.cpp b/src/TextClass.cpp index d14ef2994a..25965c6762 100644 --- a/src/TextClass.cpp +++ b/src/TextClass.cpp @@ -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 = 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,10 +152,10 @@ 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), + 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 }, @@ -278,7 +282,7 @@ LexerKeyword textClassTags[] = { { "tocdepth", TC_TOCDEPTH } }; -} //namespace anon +} // namespace bool TextClass::convertLayoutFormat(support::FileName const & filename, ReadType rt) @@ -404,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(); @@ -433,13 +440,15 @@ TextClass::ReturnValues TextClass::read(Lexer & lexrc, ReadType rt) switch (static_cast(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: @@ -459,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()) { @@ -508,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. @@ -540,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; } @@ -758,9 +771,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 const dbs = + getVectorFromString(rtrim(lexrc.getString()), "|"); + vector::const_iterator it = dbs.begin(); + vector::const_iterator end = dbs.end(); + for (; it != end; ++it) { + if (!contains(*it, ':')) { + vector 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: @@ -819,11 +858,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, @@ -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*[][]=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 const aliases = getVectorFromString(alias); + for (string const &s: aliases) + cite_command_aliases_[s] = lyx_cmd; + } + vector 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) @@ -1090,7 +1179,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) @@ -1333,18 +1422,6 @@ bool TextClass::readOutlinerName(Lexer & lexrc) } -docstring TextClass::outlinerName(std::string const & type) const -{ - std::map::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_, ',')) { @@ -1711,7 +1788,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; @@ -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%[[, {!!}%journal%{!!}]][[{%publisher%[[, %publisher%]][[{%institution%[[, %institution%]]}]]}]]}{%year%[[ (%year%)]]}{%pages%[[, %pages%]]}."; + string default_format = "{%fullnames:author%[[%fullnames:author%, ]][[{%fullnames:editor%[[%fullnames:editor%, ed., ]]}]]}\"%title%\"{%journal%[[, {!!}%journal%{!!}]][[{%publisher%[[, %publisher%]][[{%institution%[[, %institution%]]}]]}]]}{%year%[[ (%year%)]]}{%pages%[[, %pages%]]}"; + if (punct) + default_format += "."; map >::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 const DocumentClass::citeCommands( vector cmds; for (; it != end; ++it) { CitationStyle const cite = *it; - cmds.push_back(cite.cmd); + cmds.push_back(cite.name); } return cmds; }