// You should also run the development/tools/updatelayouts.py script,
// to update the format of all of our layout files.
//
-int const LAYOUT_FORMAT = 67; //spitz: New layout tag NeedsCProtect
+int const LAYOUT_FORMAT = 71; // spitz: NeedMBoxProtect
// Layout format for the current lyx file format. Controls which format is
TC_EXCLUDESMODULE,
TC_HTMLTOCSECTION,
TC_CITEENGINE,
+ TC_ADDTOCITEENGINE,
TC_CITEENGINETYPE,
TC_CITEFORMAT,
TC_CITEFRAMEWORK,
namespace {
LexerKeyword textClassTags[] = {
+ { "addtociteengine", TC_ADDTOCITEENGINE },
{ "addtohtmlpreamble", TC_ADDTOHTMLPREAMBLE },
{ "addtohtmlstyles", TC_ADDTOHTMLSTYLES },
{ "addtopreamble", TC_ADDTOPREAMBLE },
break;
case TC_CITEENGINE:
- error = !readCiteEngine(lexrc);
+ error = !readCiteEngine(lexrc, rt);
+ break;
+
+ case TC_ADDTOCITEENGINE:
+ error = !readCiteEngine(lexrc, rt, true);
break;
case TC_CITEENGINETYPE:
break;
case TC_CITEFORMAT:
- error = !readCiteFormat(lexrc);
+ error = !readCiteFormat(lexrc, rt);
break;
case TC_CITEFRAMEWORK:
}
-bool TextClass::readCiteEngine(Lexer & lexrc)
+vector<CitationStyle> const & TextClass::getCiteStyles(
+ CiteEngineType const & type) const
+{
+ static vector<CitationStyle> empty;
+ map<CiteEngineType, vector<CitationStyle> >::const_iterator it = cite_styles_.find(type);
+ if (it == cite_styles_.end())
+ return empty;
+ return it->second;
+}
+
+
+bool TextClass::readCiteEngine(Lexer & lexrc, ReadType rt, bool const add)
{
int const type = readCiteEngineType(lexrc);
- if (type & ENGINE_TYPE_AUTHORYEAR)
- cite_styles_[ENGINE_TYPE_AUTHORYEAR].clear();
- if (type & ENGINE_TYPE_NUMERICAL)
- cite_styles_[ENGINE_TYPE_NUMERICAL].clear();
- if (type & ENGINE_TYPE_DEFAULT)
- cite_styles_[ENGINE_TYPE_DEFAULT].clear();
+ bool authoryear = (type & ENGINE_TYPE_AUTHORYEAR);
+ bool numerical = (type & ENGINE_TYPE_NUMERICAL);
+ bool defce = (type & ENGINE_TYPE_DEFAULT);
+
+ if (rt == CITE_ENGINE) {
+ // The cite engines are not supposed to overwrite
+ // CiteStyle defined by the class or a module.
+ if (authoryear)
+ authoryear = getCiteStyles(ENGINE_TYPE_AUTHORYEAR).empty();
+ if (numerical)
+ numerical = getCiteStyles(ENGINE_TYPE_NUMERICAL).empty();
+ if (defce)
+ defce = getCiteStyles(ENGINE_TYPE_DEFAULT).empty();
+ }
+
+ if (rt != CITE_ENGINE && !add) {
+ // Reset if we defined CiteStyle
+ // from the class or a module
+ if (authoryear)
+ cite_styles_[ENGINE_TYPE_AUTHORYEAR].clear();
+ if (numerical)
+ cite_styles_[ENGINE_TYPE_NUMERICAL].clear();
+ if (defce)
+ cite_styles_[ENGINE_TYPE_DEFAULT].clear();
+ }
+
string def;
bool getout = false;
while (!getout && lexrc.isOK()) {
cs.stardesc = stardescs[0];
if (size > 1)
cs.startooltip = stardescs[1];
+ if (add) {
+ if (authoryear)
+ class_cite_styles_[ENGINE_TYPE_AUTHORYEAR].push_back(cs);
+ if (numerical)
+ class_cite_styles_[ENGINE_TYPE_NUMERICAL].push_back(cs);
+ if (defce)
+ class_cite_styles_[ENGINE_TYPE_DEFAULT].push_back(cs);
+ } else {
+ if (authoryear)
+ cite_styles_[ENGINE_TYPE_AUTHORYEAR].push_back(cs);
+ if (numerical)
+ cite_styles_[ENGINE_TYPE_NUMERICAL].push_back(cs);
+ if (defce)
+ cite_styles_[ENGINE_TYPE_DEFAULT].push_back(cs);
+ }
+ }
+ // If we do AddToCiteEngine, do not apply yet,
+ // except if we have already a style to add something to
+ bool apply_ay = !add;
+ bool apply_num = !add;
+ bool apply_def = !add;
+ if (add) {
if (type & ENGINE_TYPE_AUTHORYEAR)
- cite_styles_[ENGINE_TYPE_AUTHORYEAR].push_back(cs);
+ apply_ay = !getCiteStyles(ENGINE_TYPE_AUTHORYEAR).empty();
if (type & ENGINE_TYPE_NUMERICAL)
- cite_styles_[ENGINE_TYPE_NUMERICAL].push_back(cs);
+ apply_num = !getCiteStyles(ENGINE_TYPE_NUMERICAL).empty();
if (type & ENGINE_TYPE_DEFAULT)
- cite_styles_[ENGINE_TYPE_DEFAULT].push_back(cs);
+ apply_def = !getCiteStyles(ENGINE_TYPE_DEFAULT).empty();
+ }
+
+ // Add the styles from AddToCiteEngine to the class' styles
+ // (but only if they are not yet defined)
+ for (auto const cis : class_cite_styles_) {
+ // Only consider the current CiteEngineType
+ if (!(type & cis.first))
+ continue;
+ for (auto const ciss : cis.second) {
+ bool defined = false;
+ // Check if the style "name" is already def'ed
+ for (auto const av : getCiteStyles(cis.first))
+ if (av.name == ciss.name)
+ defined = true;
+ if (!defined) {
+ if (cis.first == ENGINE_TYPE_AUTHORYEAR && apply_ay)
+ cite_styles_[ENGINE_TYPE_AUTHORYEAR].push_back(ciss);
+ else if (cis.first == ENGINE_TYPE_NUMERICAL && apply_num)
+ cite_styles_[ENGINE_TYPE_NUMERICAL].push_back(ciss);
+ else if (cis.first == ENGINE_TYPE_DEFAULT && apply_def)
+ cite_styles_[ENGINE_TYPE_DEFAULT].push_back(ciss);
+ }
+ }
}
+ if (type & ENGINE_TYPE_AUTHORYEAR && apply_ay)
+ class_cite_styles_[ENGINE_TYPE_AUTHORYEAR].clear();
+ if (type & ENGINE_TYPE_NUMERICAL && apply_num)
+ class_cite_styles_[ENGINE_TYPE_NUMERICAL].clear();
+ if (type & ENGINE_TYPE_DEFAULT && apply_def)
+ class_cite_styles_[ENGINE_TYPE_DEFAULT].clear();
return getout;
}
}
-bool TextClass::readCiteFormat(Lexer & lexrc)
+bool TextClass::readCiteFormat(Lexer & lexrc, ReadType rt)
{
int const type = readCiteEngineType(lexrc);
string etype;
string definition;
+ // Cite engine definitions do not overwrite existing
+ // definitions from the class or a module
+ bool const overwrite = rt != CITE_ENGINE;
while (lexrc.isOK()) {
lexrc.next();
etype = lexrc.getString();
if (initchar == '#')
continue;
if (initchar == '!' || initchar == '_' || prefixIs(etype, "B_")) {
- if (type & ENGINE_TYPE_AUTHORYEAR)
- cite_macros_[ENGINE_TYPE_AUTHORYEAR][etype] = definition;
- if (type & ENGINE_TYPE_NUMERICAL)
- cite_macros_[ENGINE_TYPE_NUMERICAL][etype] = definition;
- if (type & ENGINE_TYPE_DEFAULT)
- cite_macros_[ENGINE_TYPE_DEFAULT][etype] = definition;
+ bool defined = false;
+ // Check if the macro is already def'ed
+ for (auto const cm : cite_macros_) {
+ if (!(type & cm.first))
+ continue;
+ if (cm.second.find(etype) != cm.second.end())
+ defined = true;
+ }
+ if (!defined || overwrite) {
+ if (type & ENGINE_TYPE_AUTHORYEAR)
+ cite_macros_[ENGINE_TYPE_AUTHORYEAR][etype] = definition;
+ if (type & ENGINE_TYPE_NUMERICAL)
+ cite_macros_[ENGINE_TYPE_NUMERICAL][etype] = definition;
+ if (type & ENGINE_TYPE_DEFAULT)
+ cite_macros_[ENGINE_TYPE_DEFAULT][etype] = definition;
+ }
} else {
- if (type & ENGINE_TYPE_AUTHORYEAR)
- cite_formats_[ENGINE_TYPE_AUTHORYEAR][etype] = definition;
- if (type & ENGINE_TYPE_NUMERICAL)
- cite_formats_[ENGINE_TYPE_NUMERICAL][etype] = definition;
- if (type & ENGINE_TYPE_DEFAULT)
- cite_formats_[ENGINE_TYPE_DEFAULT][etype] = definition;
+ bool defined = false;
+ // Check if the format is already def'ed
+ for (auto const cm : cite_formats_) {
+ if (!(type & cm.first))
+ continue;
+ if (cm.second.find(etype) != cm.second.end())
+ defined = true;
+ }
+ if (!defined || overwrite){
+ if (type & ENGINE_TYPE_AUTHORYEAR)
+ cite_formats_[ENGINE_TYPE_AUTHORYEAR][etype] = definition;
+ if (type & ENGINE_TYPE_NUMERICAL)
+ cite_formats_[ENGINE_TYPE_NUMERICAL][etype] = definition;
+ if (type & ENGINE_TYPE_DEFAULT)
+ cite_formats_[ENGINE_TYPE_DEFAULT][etype] = definition;
+ }
}
}
return true;
}
}
+ if (cengine.empty())
+ return doc_class;
+
LyXCiteEngine * ce = theCiteEnginesList[cengine];
if (!ce) {
docstring const msg =