X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2FInsetCitation.cpp;h=d878056cd6a3be952cde07254d49c0c5155a267d;hb=eb294eadb5e7f22880da399ae082f74567bbfc4e;hp=760c1da745fd49f4e8751adbd8011946d50de275;hpb=0c0613327cad178d2546392d73cddab5feceaa19;p=lyx.git diff --git a/src/insets/InsetCitation.cpp b/src/insets/InsetCitation.cpp index 760c1da745..d878056cd6 100644 --- a/src/insets/InsetCitation.cpp +++ b/src/insets/InsetCitation.cpp @@ -18,11 +18,14 @@ #include "buffer_funcs.h" #include "BufferParams.h" #include "BufferView.h" +#include "Citation.h" #include "DispatchResult.h" #include "FuncCode.h" #include "FuncRequest.h" #include "FuncStatus.h" #include "LaTeXFeatures.h" +#include "LyX.h" +#include "LyXRC.h" #include "output_xhtml.h" #include "output_docbook.h" #include "ParIterator.h" @@ -47,6 +50,7 @@ InsetCitation::InsetCitation(Buffer * buf, InsetCommandParams const & p) : InsetCommand(buf, p) { buffer().removeBiblioTempFiles(); + cleanKeys(); } @@ -133,6 +137,9 @@ CitationStyle InsetCitation::getCitationStyle(BufferParams const & bp, string co void InsetCitation::doDispatch(Cursor & cur, FuncRequest & cmd) { switch (cmd.action()) { + case LFUN_INSET_EDIT: + openCitation(); + break; case LFUN_INSET_MODIFY: { buffer().removeBiblioTempFiles(); cache.recalculate = true; @@ -161,6 +168,73 @@ void InsetCitation::doDispatch(Cursor & cur, FuncRequest & cmd) // fall through default: InsetCommand::doDispatch(cur, cmd); + if (cmd.action() == LFUN_INSET_MODIFY) + cleanKeys(); + } +} + +bool InsetCitation::openCitationPossible() const +{ + Buffer const & buf = *buffer_; + // only after the buffer is loaded from file... + if (!buf.isFullyLoaded()) + return false; + + BiblioInfo const & bi = buf.masterBibInfo(); + if (bi.empty()) + return false; + + docstring const & key = getParam("key"); + if (key.empty()) + return false; + + // does bibtex item contains some locator? + vector keys = getVectorFromString(key); + docstring doi, url, file; + for (docstring const & kvar : keys) { + bi.getLocators(kvar, doi, url, file); + if (!file.empty() || !doi.empty() || !url.empty()) + return true; + } + + // last resort: is external script activated? + return lyxrc.citation_search; +} + +void InsetCitation::openCitation() +{ + Buffer const & buf = *buffer_; + BiblioInfo const & bi = buf.masterBibInfo(); + docstring const & key = getParam("key"); + + vector keys = getVectorFromString(key); + docstring titledata, doi, url, file; + for (docstring const & kvar : keys) { + CiteItem ci; + titledata = bi.getInfo(kvar, buffer(), ci, + from_ascii(lyxrc.citation_search_pattern)); + // some cleanup: commas, " and " and " et al.", as used in name lists, + // are not expected in file names + titledata = subst(titledata, from_ascii(","), docstring()); + titledata = subst(titledata, from_ascii(" and "), from_ascii(" ")); + titledata = subst(titledata, from_ascii(" et al."), docstring()); + bi.getLocators(kvar, doi, url, file); + LYXERR(Debug::INSETS, "Locators: doi:" << doi << " url:" + << url << " file:" << file << " title data:" << titledata + << " citation search: " << lyxrc.citation_search + << " citation search pattern: " << lyxrc.citation_search_pattern); + docstring locator; + if (!file.empty()) { + locator = file; + } else if (!doi.empty()) { + locator = doi; + } else if (!url.empty()) { + locator = url; + } else { + locator = "EXTERNAL " + titledata; + } + FuncRequest cmd = FuncRequest(LFUN_CITATION_OPEN, locator); + lyx::dispatch(cmd); } } @@ -203,6 +277,8 @@ bool InsetCitation::getStatus(Cursor & cur, FuncRequest const & cmd, } } return true; + case LFUN_INSET_EDIT: + return openCitationPossible(); default: return InsetCommand::getStatus(cur, cmd, status); } @@ -211,7 +287,7 @@ bool InsetCitation::getStatus(Cursor & cur, FuncRequest const & cmd, bool InsetCitation::addKey(string const & key) { - docstring const ukey = from_utf8(key); + docstring const ukey = from_utf8(trim(key)); docstring const & curkeys = getParam("key"); if (curkeys.empty()) { setParam("key", ukey); @@ -220,10 +296,8 @@ bool InsetCitation::addKey(string const & key) } vector keys = getVectorFromString(curkeys); - vector::const_iterator it = keys.begin(); - vector::const_iterator en = keys.end(); - for (; it != en; ++it) { - if (*it == ukey) { + for (auto const & k : keys) { + if (k == ukey) { LYXERR0("Key " << key << " already present."); return false; } @@ -522,7 +596,7 @@ int InsetCitation::plaintext(odocstringstream & os, if (cmd == "nocite") return 0; - docstring const label = generateLabel(false); + docstring const label = generateLabel(); os << label; return label.size(); } @@ -530,36 +604,40 @@ int InsetCitation::plaintext(odocstringstream & os, static docstring const cleanupWhitespace(docstring const & citelist) { - docstring::const_iterator it = citelist.begin(); - docstring::const_iterator end = citelist.end(); // Paranoia check: make sure that there is no whitespace in here // -- at least not behind commas or at the beginning docstring result; char_type last = ','; - for (; it != end; ++it) { - if (*it != ' ') - last = *it; - if (*it != ' ' || last != ',') - result += *it; + for (char_type c : citelist) { + if (c != ' ') + last = c; + if (c != ' ' || last != ',') + result += c; } return result; } +void InsetCitation::cleanKeys() { + docstring cleankeys = cleanupWhitespace(getParam("key")); + setParam("key", cleankeys); +} + void InsetCitation::docbook(XMLStream & xs, OutputParams const &) const { if (getCmdName() == "nocite") return; // Split the different citations (on ","), so that one tag can be output for each of them. - string citations = to_utf8(xml::cleanID(getParam("key"))); + // DocBook does not support having multiple citations in one tag, so that we have to deal with formatting here. + docstring citations = getParam("key"); if (citations.find(',') == string::npos) { - xs << xml::CompTag("biblioref", "endterm=\"" + citations + "\""); + xs << xml::CompTag("biblioref", "endterm=\"" + to_utf8(xml::cleanID(citations)) + "\""); } else { size_t pos = 0; while (pos != string::npos) { pos = citations.find(','); - xs << xml::CompTag("biblioref", "endterm=\"" + citations.substr(0, pos) + "\""); + xs << xml::CompTag("biblioref", "endterm=\"" + to_utf8(xml::cleanID(citations.substr(0, pos))) + "\""); citations.erase(0, pos + 1); if (pos != string::npos) { @@ -585,7 +663,7 @@ docstring InsetCitation::xhtml(XMLStream & xs, OutputParams const &) const void InsetCitation::toString(odocstream & os) const { odocstringstream ods; - plaintext(ods, OutputParams(0)); + plaintext(ods, OutputParams(nullptr)); os << ods.str(); } @@ -703,6 +781,13 @@ void InsetCitation::latex(otexstream & os, OutputParams const & runparams) const } +pair InsetCitation::isWords() const +{ + docstring const label = generateLabel(false); + return pair(label.size(), wordCount(label)); +} + + string InsetCitation::contextMenuName() const { return "context-citation";