]> git.lyx.org Git - lyx.git/blobdiff - src/insets/InsetCitation.cpp
Fix wrongly copy-pasted entries in SpellcheckerUi.ui
[lyx.git] / src / insets / InsetCitation.cpp
index 8ea7da606d359c0ad206a260125e788ce8717bd2..7780f24a8d09c721b3cede8b6ac4fd1787ad68b9 100644 (file)
 
 #include "InsetCitation.h"
 
+#include "BiblioInfo.h"
 #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"
@@ -41,7 +41,7 @@ ParamInfo InsetCitation::param_info_;
 
 
 InsetCitation::InsetCitation(Buffer * buf, InsetCommandParams const & p)
-       : InsetCommand(buf, p, "citation")
+       : InsetCommand(buf, p)
 {}
 
 
@@ -119,7 +119,7 @@ docstring InsetCitation::toolTip(BufferView const & bv, int, int) const
        vector<docstring>::const_iterator en = keys.end();
        docstring tip;
        for (; it != en; ++it) {
-               docstring const key_info = bi.getInfo(*it);
+               docstring const key_info = bi.getInfo(*it, buffer());
                if (key_info.empty())
                        continue;
                if (!tip.empty())
@@ -207,7 +207,8 @@ inline docstring wrapCitation(docstring const & key,
                return content;
        // we have to do the escaping here, because we will ultimately
        // write this as a raw string, so as not to escape the tags.
-       return "<a href='#" + key + "'>" + html::htmlize(content) + "</a>";
+       return "<a href='#" + key + "'>" +
+                       html::htmlize(content, XHTMLStream::ESCAPE_ALL) + "</a>";
 }
 
 } // anonymous namespace
@@ -456,7 +457,7 @@ docstring InsetCitation::screenLabel() const
 }
 
 
-void InsetCitation::updateLabels(ParIterator const &, UpdateType)
+void InsetCitation::updateBuffer(ParIterator const &, UpdateType)
 {
        CiteEngine const engine = buffer().params().citeEngine();
        if (cache.params == params() && cache.engine == engine)
@@ -469,7 +470,7 @@ void InsetCitation::updateLabels(ParIterator const &, UpdateType)
 
        docstring label = glabel;
        if (label.size() > maxLabelChars) {
-               label.erase(maxLabelChars-3);
+               label.erase(maxLabelChars - 3);
                label += "...";
        }
 
@@ -480,10 +481,15 @@ void InsetCitation::updateLabels(ParIterator const &, UpdateType)
 }
 
 
-void InsetCitation::addToToc(DocIterator const & cpit)
+void InsetCitation::addToToc(DocIterator const & cpit) const
 {
+       // NOTE
+       // XHTML output uses the TOC to collect the citations
+       // from the document. So if this gets changed, then we
+       // will need to change how the citations are collected.
+       docstring const tocitem = getParam("key");
        Toc & toc = buffer().tocBackend().toc("citation");
-       toc.push_back(TocItem(cpit, 0, getParam("key")));
+       toc.push_back(TocItem(cpit, 0, tocitem));
 }
 
 
@@ -528,25 +534,32 @@ docstring InsetCitation::xhtml(XHTMLStream & xs, OutputParams const &) const
                return docstring();
 
        // have to output this raw, because generateLabel() will include tags
-       xs << XHTMLStream::NextRaw() << generateLabel(true);
+       xs << XHTMLStream::ESCAPE_NONE << generateLabel(true);
 
        return docstring();
 }
 
 
-void InsetCitation::tocString(odocstream & os) const
+void InsetCitation::toString(odocstream & os) const
 {
        plaintext(os, OutputParams(0));
 }
 
 
+void InsetCitation::forToc(docstring & os, size_t) const
+{
+       os += screenLabel();
+}
+
+
 // Have to overwrite the default InsetCommand method in order to check that
 // 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 & runparams) const
+void InsetCitation::latex(otexstream & os, OutputParams const & runparams) const
 {
        CiteEngine cite_engine = buffer().params().citeEngine();
+       BiblioInfo const & bi = buffer().masterBibInfo();
        // FIXME UNICODE
        docstring const cite_str = from_utf8(
                asValidLatexCommand(getCmdName(), cite_engine));
@@ -563,12 +576,14 @@ int InsetCitation::latex(odocstream & os, OutputParams const & runparams) const
        else if (!after.empty())
                os << '[' << after << ']';
 
-       os << '{' << cleanupWhitespace(getParam("key")) << '}';
+       if (!bi.isBibtex(getParam("key")))
+               // escape chars with bibitems
+               os << '{' << escape(cleanupWhitespace(getParam("key"))) << '}';
+       else
+               os << '{' << cleanupWhitespace(getParam("key")) << '}';
 
        if (runparams.inulemcmd)
                os << "}";
-
-       return 0;
 }
 
 
@@ -588,7 +603,7 @@ void InsetCitation::validate(LaTeXFeatures & features) const
 }
 
 
-docstring InsetCitation::contextMenu(BufferView const &, int, int) const
+docstring InsetCitation::contextMenuName() const
 {
        return from_ascii("context-citation");
 }