X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FBiblioInfo.cpp;h=1464e7088e0aa636835871f7c1f7d64e5e33f93e;hb=48d9d01a826eb9f1c1e7c62edb664ec97f6a6e8d;hp=149b93b5e0422c13bedca077f6ba910b9076eeee;hpb=b4ca3e4fa4760787a7209064f338993019ef869e;p=features.git diff --git a/src/BiblioInfo.cpp b/src/BiblioInfo.cpp index 149b93b5e0..1464e7088e 100644 --- a/src/BiblioInfo.cpp +++ b/src/BiblioInfo.cpp @@ -5,7 +5,7 @@ * * \author Angus Leeming * \author Herbert Voß - * \author Richard Heck + * \author Richard Kimberly Heck * \author Julien Rioux * \author Jürgen Spitzmüller * @@ -15,28 +15,27 @@ #include #include "BiblioInfo.h" + #include "Buffer.h" #include "BufferParams.h" -#include "buffer_funcs.h" #include "Citation.h" #include "Encoding.h" -#include "InsetIterator.h" #include "Language.h" -#include "xml.h" -#include "Paragraph.h" #include "TextClass.h" #include "TocBackend.h" +#include "xml.h" #include "support/convert.h" #include "support/debug.h" #include "support/docstream.h" +#include "support/FileName.h" #include "support/gettext.h" #include "support/lassert.h" #include "support/lstrings.h" -#include "support/regex.h" #include "support/textutils.h" #include +#include #include using namespace std; @@ -278,8 +277,14 @@ vector const getAuthors(docstring const & author) // in author names, but can happen (consider cases such as "C \& A Corp."). docstring iname = subst(author, from_ascii("&"), from_ascii("$$amp!")); // Then, we temporarily make all " and " strings to ampersands in order - // to handle them later on a per-char level. - iname = subst(iname, from_ascii(" and "), from_ascii(" & ")); + // to handle them later on a per-char level. Note that arbitrary casing + // ("And", "AND", "aNd", ...) is allowed in bibtex (#10465). + static regex const and_reg("(.* )([aA][nN][dD])( .*)"); + smatch sub; + string res = to_utf8(iname); + while (regex_match(res, sub, and_reg)) + res = sub.str(1) + "&" + sub.str(3); + iname = from_utf8(res); // Now we traverse through the string and replace the "&" by the proper // output in- and outside groups docstring name; @@ -384,8 +389,8 @@ docstring convertLaTeXCommands(docstring const & str) // {\v a} to \v{a} (see #9340). // FIXME: This is a sort of mini-tex2lyx. // Use the real tex2lyx instead! - static lyx::regex const tma_reg("^\\{\\\\[bcCdfGhHkrtuUv]\\s\\w\\}"); - if (lyx::regex_search(to_utf8(val), tma_reg)) { + static regex const tma_reg("^\\{\\\\[bcCdfGhHkrtuUv]\\s\\w\\}"); + if (regex_search(to_utf8(val), tma_reg)) { val = val.substr(1); val.replace(2, 1, from_ascii("{")); continue; @@ -412,8 +417,8 @@ docstring convertLaTeXCommands(docstring const & str) // look for that and change it, if necessary. // FIXME: This is a sort of mini-tex2lyx. // Use the real tex2lyx instead! - static lyx::regex const reg("^\\\\\\W\\w"); - if (lyx::regex_search(to_utf8(val), reg)) { + static regex const reg("^\\\\\\W\\w"); + if (regex_search(to_utf8(val), reg)) { val.insert(3, from_ascii("}")); val.insert(2, from_ascii("{")); } @@ -488,8 +493,8 @@ docstring processRichtext(docstring const & str, bool richtext) ////////////////////////////////////////////////////////////////////// BibTeXInfo::BibTeXInfo(docstring const & key, docstring const & type) - : is_bibtex_(true), bib_key_(key), num_bib_key_(0), entry_type_(type), info_(), - modifier_(0) + : is_bibtex_(true), bib_key_(key), num_bib_key_(0), entry_type_(type), + info_(), format_(), modifier_(0) {} @@ -1000,6 +1005,19 @@ docstring const & BibTeXInfo::getInfo(BibTeXInfoList const & xrefs, { bool const richtext = ci.richtext; + CiteEngineType const engine_type = buf.params().citeEngineType(); + DocumentClass const & dc = buf.params().documentClass(); + docstring const & format = format_in.empty()? + from_utf8(dc.getCiteFormat(engine_type, to_utf8(entry_type_))) + : format_in; + + if (format != format_) { + // clear caches since format changed + info_.clear(); + info_richtext_.clear(); + format_ = format; + } + if (!richtext && !info_.empty()) { info_ = convertLaTeXCommands(processRichtext(info_, false)); return info_; @@ -1013,11 +1031,6 @@ docstring const & BibTeXInfo::getInfo(BibTeXInfoList const & xrefs, return info_; } - CiteEngineType const engine_type = buf.params().citeEngineType(); - DocumentClass const & dc = buf.params().documentClass(); - docstring const & format = format_in.empty()? - from_utf8(dc.getCiteFormat(engine_type, to_utf8(entry_type_))) - : format_in; int counter = 0; info_ = expandFormat(format, xrefs, counter, buf, ci, false, false); @@ -1037,7 +1050,7 @@ docstring const & BibTeXInfo::getInfo(BibTeXInfoList const & xrefs, } -docstring const BibTeXInfo::getLabel(BibTeXInfoList const xrefs, +docstring const BibTeXInfo::getLabel(BibTeXInfoList const & xrefs, Buffer const & buf, docstring const & format, CiteItem const & ci, bool next, bool second) const { @@ -1395,7 +1408,7 @@ docstring const BiblioInfo::getInfo(docstring const & key, { BiblioInfo::const_iterator it = find(key); if (it == end()) - return docstring(_("Bibliography entry not found!")); + return _("Bibliography entry not found!"); BibTeXInfo const & data = it->second; BibTeXInfoList xrefptrs; for (docstring const & xref : getXRefs(data)) { @@ -1692,6 +1705,8 @@ docstring authorsToDocBookAuthorGroup(docstring const & authorsString, XMLStream // Output the list of authors. xs << xml::StartTag("authorgroup"); + xs << xml::CR(); + auto it = authors.cbegin(); auto en = authors.cend(); for (size_t i = 0; it != en; ++it, ++i) {