X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2FInsetCitation.cpp;h=93e79263f6f64f331457a3aee8a2b1611424a5e2;hb=26006c8ffca453dafc4aff95381f42b9f91e4d8a;hp=da075faf0b8a101671a0cc8dcded97c3c676561f;hpb=937de4d880ca903edbd770d16d188a35fbf86981;p=lyx.git diff --git a/src/insets/InsetCitation.cpp b/src/insets/InsetCitation.cpp index da075faf0b..93e79263f6 100644 --- a/src/insets/InsetCitation.cpp +++ b/src/insets/InsetCitation.cpp @@ -16,9 +16,11 @@ #include "Buffer.h" #include "buffer_funcs.h" #include "BufferParams.h" +#include "BufferView.h" #include "DispatchResult.h" #include "FuncRequest.h" #include "LaTeXFeatures.h" +#include "output_xhtml.h" #include "ParIterator.h" #include "TocBackend.h" @@ -354,8 +356,8 @@ docstring basicLabel(docstring const & keyList, docstring const & after) ParamInfo InsetCitation::param_info_; -InsetCitation::InsetCitation(InsetCommandParams const & p) - : InsetCommand(p, "citation") +InsetCitation::InsetCitation(Buffer * buf, InsetCommandParams const & p) + : InsetCommand(buf, p, "citation") {} @@ -382,10 +384,42 @@ bool InsetCitation::isCompatibleCommand(string const & cmd) } +docstring InsetCitation::toolTip(BufferView const & bv, int, int) const +{ + Buffer const & buf = bv.buffer(); + // Only after the buffer is loaded from file... + if (!buf.isFullyLoaded()) + return docstring(); + + BiblioInfo const & bi = buf.masterBibInfo(); + if (bi.empty()) + return _("No bibliography defined!"); + + docstring const & key = getParam("key"); + if (key.empty()) + return _("No citations selected!"); + + vector keys = getVectorFromString(key); + vector::const_iterator it = keys.begin(); + vector::const_iterator en = keys.end(); + docstring tip; + for (; it != en; ++it) { + docstring const key_info = bi.getInfo(*it); + if (key_info.empty()) + continue; + if (!tip.empty()) + tip += "\n"; + tip += wrap(key_info, -4); + } + return tip; +} + + + docstring InsetCitation::generateLabel() const { - docstring const before = getParam("before"); - docstring const after = getParam("after"); + docstring const & before = getParam("before"); + docstring const & after = getParam("after"); docstring label; CiteEngine const engine = buffer().params().citeEngine(); @@ -433,7 +467,7 @@ void InsetCitation::updateLabels(ParIterator const &) void InsetCitation::addToToc(DocIterator const & cpit) { Toc & toc = buffer().tocBackend().toc("citation"); - toc.push_back(TocItem(cpit, 0, cache.screen_label)); + toc.push_back(TocItem(cpit, 0, getParam("key"))); } @@ -471,6 +505,48 @@ int InsetCitation::docbook(odocstream & os, OutputParams const &) const } +docstring InsetCitation::xhtml(XHTMLStream & xs, OutputParams const &) const +{ + BiblioInfo const & bi = buffer().masterBibInfo(); + docstring const & key_list = getParam("key"); + if (key_list.empty()) + return docstring(); + + // FIXME We shuld do a better job outputing different things for the + // different citation styles. For now, we use square brackets for every + // case. + xs << "["; + docstring const & before = getParam("before"); + if (!before.empty()) + xs << before << " "; + + vector const keys = getVectorFromString(key_list); + vector::const_iterator it = keys.begin(); + vector::const_iterator const en = keys.end(); + bool first = true; + for (; it != en; ++it) { + BiblioInfo::const_iterator const bt = bi.find(*it); + if (bt == bi.end()) + continue; + BibTeXInfo const & bibinfo = bt->second; + if (!first) { + xs << ", "; + first = false; + } + docstring const & label = bibinfo.label(); + docstring const & target = label.empty() ? *it : label; + string const attr = "href='#" + to_utf8(*it) + "'"; + xs << StartTag("a", attr) << target << EndTag("a"); + } + + docstring const & after = getParam("after"); + if (!after.empty()) + xs << ", " << after; + xs << "]"; + return docstring(); +} + + void InsetCitation::tocString(odocstream & os) const { plaintext(os, OutputParams(0)); @@ -481,13 +557,16 @@ void InsetCitation::tocString(odocstream & os) const // the \cite command is valid. Eg, the user has natbib enabled, inputs some // citations and then changes his mind, turning natbib support off. The output // should revert to \cite[]{} -int InsetCitation::latex(odocstream & os, OutputParams const &) const +int InsetCitation::latex(odocstream & os, OutputParams const & runparams) const { CiteEngine cite_engine = buffer().params().citeEngine(); // FIXME UNICODE docstring const cite_str = from_utf8( asValidLatexCommand(getCmdName(), cite_engine)); + if (runparams.inulemcmd) + os << "\\mbox{"; + os << "\\" << cite_str; docstring const & before = getParam("before"); @@ -499,6 +578,9 @@ int InsetCitation::latex(odocstream & os, OutputParams const &) const os << '{' << cleanupWhitespace(getParam("key")) << '}'; + if (runparams.inulemcmd) + os << "}"; + return 0; }