X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FBiblioInfo.cpp;h=80cafeb3595bf1a60b005084f43bf5c2bf295ac2;hb=1e519d1115f41f71c253cb9e2fbb7803e9a583a9;hp=87245d3824f1c8c74f69e61798897dd195c8ed30;hpb=e30f3d76d2bee0011ceaeb5f0cc221156458cbad;p=lyx.git diff --git a/src/BiblioInfo.cpp b/src/BiblioInfo.cpp index 87245d3824..80cafeb359 100644 --- a/src/BiblioInfo.cpp +++ b/src/BiblioInfo.cpp @@ -236,6 +236,8 @@ docstring constructName(docstring const & name, string const scheme) static regex const reg2("(.*)(\\{%suffix%\\[\\[)([^\\]]+)(\\]\\]\\})(.*)"); static regex const reg3("(.*)(\\{%prefix%\\[\\[)([^\\]]+)(\\]\\]\\})(.*)"); smatch sub; + // Changing the first parameter of regex_match() may corrupt the + // second one. In this case we use the temporary string tmp. if (regex_match(scheme, sub, reg1)) { res = sub.str(1); if (!prename.empty()) @@ -243,16 +245,16 @@ docstring constructName(docstring const & name, string const scheme) res += sub.str(5); } if (regex_match(res, sub, reg2)) { - res = sub.str(1); + string tmp = sub.str(1); if (!suffix.empty()) - res += sub.str(3); - res += sub.str(5); + tmp += sub.str(3); + res = tmp + sub.str(5); } if (regex_match(res, sub, reg3)) { - res = sub.str(1); + string tmp = sub.str(1); if (!prefix.empty()) - res += sub.str(3); - res += sub.str(5); + tmp += sub.str(3); + res = tmp + sub.str(5); } docstring result = from_ascii(res); result = subst(result, from_ascii("%prename%"), prename); @@ -522,6 +524,12 @@ docstring const BibTeXInfo::getAuthorList(Buffer const * buf, // in this case, we didn't find a "(", // so we don't have author (year) return docstring(); + if (full) { + // Natbib syntax is "Jones et al.(1990)Jones, Baker, and Williams" + docstring const fullauthors = trim(rsplit(remainder, ')')); + if (!fullauthors.empty()) + return fullauthors; + } return authors; } @@ -539,16 +547,16 @@ docstring const BibTeXInfo::getAuthorList(Buffer const * buf, // These are defined in the styles string const etal = - buf ? buf->params().documentClass().getCiteMacro(engine_type, "_etal") + buf ? buf->params().documentClass().getCiteMacro(engine_type, "B_etal") : " et al."; string const namesep = - buf ? buf->params().documentClass().getCiteMacro(engine_type, "_namesep") + buf ? buf->params().documentClass().getCiteMacro(engine_type, "B_namesep") : ", "; string const lastnamesep = - buf ? buf->params().documentClass().getCiteMacro(engine_type, "_lastnamesep") + buf ? buf->params().documentClass().getCiteMacro(engine_type, "B_lastnamesep") : ", and "; string const pairnamesep = - buf ? buf->params().documentClass().getCiteMacro(engine_type, "_pairnamesep") + buf ? buf->params().documentClass().getCiteMacro(engine_type, "B_pairnamesep") : " and "; string firstnameform = buf ? buf->params().documentClass().getCiteMacro(engine_type, "!firstnameform") @@ -809,13 +817,20 @@ docstring BibTeXInfo::expandFormat(docstring const & format, fmt = from_utf8(val) + fmt.substr(1); counter += 1; continue; - } else if (key[0] == '_') { - // a translatable bit + } else if (prefixIs(key, "B_")) { + // a translatable bit (to the Buffer language) string const val = buf.params().documentClass().getCiteMacro(engine_type, key); docstring const trans = translateIfPossible(from_utf8(val), buf.params().language->code()); ret << trans; + } else if (key[0] == '_') { + // a translatable bit (to the GUI language) + string const val = + buf.params().documentClass().getCiteMacro(engine_type, key); + docstring const trans = + translateIfPossible(from_utf8(val)); + ret << trans; } else { docstring const val = getValueForKey(key, buf, ci, xrefs, max_keysize); @@ -1259,10 +1274,8 @@ docstring const BiblioInfo::getYear(docstring const & key, bool use_modifier) co if (xrefs.empty()) // no luck return docstring(); - vector::const_iterator it = xrefs.begin(); - vector::const_iterator en = xrefs.end(); - for (; it != en; ++it) { - BiblioInfo::const_iterator const xrefit = find(*it); + for (docstring const & xref : xrefs) { + BiblioInfo::const_iterator const xrefit = find(xref); if (xrefit == end()) continue; BibTeXInfo const & xref_data = xrefit->second; @@ -1296,14 +1309,10 @@ docstring const BiblioInfo::getInfo(docstring const & key, BibTeXInfo const & data = it->second; BibTeXInfoList xrefptrs; vector const xrefs = getXRefs(data); - if (!xrefs.empty()) { - vector::const_iterator it = xrefs.begin(); - vector::const_iterator en = xrefs.end(); - for (; it != en; ++it) { - BiblioInfo::const_iterator const xrefit = find(*it); - if (xrefit != end()) - xrefptrs.push_back(&(xrefit->second)); - } + for (docstring const & xref : getXRefs(data)) { + BiblioInfo::const_iterator const xrefit = find(xref); + if (xrefit != end()) + xrefptrs.push_back(&(xrefit->second)); } return data.getInfo(xrefptrs, buf, ci); } @@ -1335,15 +1344,10 @@ docstring const BiblioInfo::getLabel(vector keys, vector xrefptrs; if (it != end()) { data = it->second; - vector const xrefs = getXRefs(data); - if (!xrefs.empty()) { - vector::const_iterator it = xrefs.begin(); - vector::const_iterator en = xrefs.end(); - for (; it != en; ++it) { - BiblioInfo::const_iterator const xrefit = find(*it); - if (xrefit != end()) - xrefptrs.push_back(&(xrefit->second)); - } + for (docstring const & xref : getXRefs(data)) { + BiblioInfo::const_iterator const xrefit = find(xref); + if (xrefit != end()) + xrefptrs.push_back(&(xrefit->second)); } } ret = data.getLabel(xrefptrs, buf, ret, ci, key + 1 != ken, i == 1);