#include "frontends/alert.h"
+#include "support/lassert.h"
#include "support/convert.h"
#include "support/debug.h"
#include "support/docstream.h"
InsetBibitem::~InsetBibitem()
{
- if (isBufferLoaded())
- buffer().invalidateBibinfoCache();
+ if (isBufferLoaded()) {
+ /* We do not use buffer() because Coverity believes that this
+ * may throw an exception. Actually this code path is not
+ * taken when buffer_ == 0 */
+ buffer_->invalidateBibinfoCache();
+ }
}
param_info_.add("label", ParamInfo::LATEX_OPTIONAL,
ParamInfo::HANDLING_LATEXIFY);
param_info_.add("key", ParamInfo::LATEX_REQUIRED,
- ParamInfo::HANDLING_ESCAPE);
+ ParamInfo::ParamHandling(ParamInfo::HANDLING_ESCAPE
+ | ParamInfo::HANDLING_LTRIM));
+ param_info_.add("literal", ParamInfo::LYX_INTERNAL);
}
return param_info_;
}
docstring const & old_key = params()["key"];
docstring const & old_label = params()["label"];
+ docstring const & old_literal = params()["literal"];
docstring label = p["label"];
-
- // definitions for escaping
- static docstring const backslash = from_ascii("\\");
- static docstring const lbrace = from_ascii("{");
- static docstring const rbrace = from_ascii("}");
- static char_type const chars_escape[6] = {
- '&', '_', '$', '%', '#', '^'};
- static char_type const brackets_escape[2] = {'[', ']'};
-
- if (!label.empty()) {
- int previous;
- // The characters in chars_name[] need to be changed to a command when
- // they are in the name field.
- for (int k = 0; k < 6; k++)
- for (size_t i = 0, pos;
- (pos = label.find(chars_escape[k], i)) != string::npos;
- i = pos + 2) {
- if (pos == 0)
- previous = 0;
- else
- previous = pos - 1;
- // only if not already escaped
- if (label[previous] != '\\')
- label.replace(pos, 1, backslash + chars_escape[k] + lbrace + rbrace);
- }
- // The characters '[' and ']' need to be put into braces
- for (int k = 0; k < 2; k++)
- for (size_t i = 0, pos;
- (pos = label.find(brackets_escape[k], i)) != string::npos;
- i = pos + 2) {
- if (pos == 0)
- previous = 0;
- else
- previous = pos - 1;
- // only if not already escaped
- if (label[previous] != '{')
- label.replace(pos, 1, lbrace + brackets_escape[k] + rbrace);
- }
- }
+ docstring literal = p["literal"];
if (old_label != label) {
p["label"] = label;
cur.forceBufferUpdate();
buffer().invalidateBibinfoCache();
}
-
setParam("label", p["label"]);
+
+ if (old_literal != literal) {
+ p["literal"] = literal;
+ cur.forceBufferUpdate();
+ buffer().invalidateBibinfoCache();
+ }
+ setParam("literal", p["literal"]);
+
if (p["key"] != old_key) {
+ cur.recordUndoFullBuffer();
+ cur.bv().buffer().changeRefsIfUnique(old_key, p["key"]);
updateCommand(p["key"]);
- cur.bv().buffer().changeRefsIfUnique(old_key, params()["key"]);
cur.forceBufferUpdate();
buffer().invalidateBibinfoCache();
}
BufferParams const & bp = buffer().masterBuffer()->params();
if (bp.citeEngineType() == ENGINE_TYPE_NUMERICAL)
return autolabel_;
- docstring const & label = getParam("label");
+ docstring label = getParam("label");
+ if (!label.empty() && bp.citeEngine() == "natbib") {
+ // Add a space before opening paren
+ label = subst(label, from_ascii("("), from_ascii(" ("));
+ // and strip off long author list
+ docstring striplabel;
+ label = rsplit(label, striplabel, ')');
+ if (!striplabel.empty())
+ label = striplabel + ")";
+ }
return label.empty() ? autolabel_ : label;
}
docstring const str = oss.str();
os << str;
- return str.size();
+ return int(str.size());
}
int w = 0;
- InsetBibitem const * bitem = 0;
+ InsetBibitem const * bitem = nullptr;
// FIXME: this font is used unitialized for now but should be set to
// a proportional font. Here is what Georg Baum has to say about it:
ParagraphList::const_iterator it = buffer.paragraphs().begin();
ParagraphList::const_iterator end = buffer.paragraphs().end();
+ bool is_literal = false;
for (; it != end; ++it) {
if (it->insetList().empty())
continue;
// So for now we just use the label size in order to be sure
// that GUI and no-GUI gives the same bibitem (even if that is
// potentially the wrong one.
- int const wx = label.size();
+ int const wx = int(label.size());
if (wx > w) {
w = wx;
lbl = label;
+ is_literal = (bitem->getParam("literal") == "true");
}
}
if (!lbl.empty()) {
- pair<docstring, docstring> latex_lbl =
- runparams.encoding->latexString(lbl, runparams.dryrun);
- return latex_lbl.first;
+ InsetCommandParams p(BIBITEM_CODE);
+ if (is_literal)
+ p["literal"] = from_ascii("true");
+ return p.prepareCommand(runparams, lbl, ParamInfo::HANDLING_LATEXIFY);
}
return from_ascii("99");
}
-void InsetBibitem::collectBibKeys(InsetIterator const & it) const
+void InsetBibitem::collectBibKeys(InsetIterator const & it, FileNameList & /*checkedFiles*/) const
{
docstring const key = getParam("key");
docstring const label = getParam("label");