X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2FInsetBibitem.cpp;h=d0a28e73fe964d02965d168b1b6829fa78f51096;hb=c9d9309c1ecffa218dee04ce4f7991ed4fc0c9bb;hp=3aaaceacbdd8d954fb53fcd1b692b4f3f75e8dd9;hpb=1e947e3a18f3676c527684affa96cd41aa61345c;p=lyx.git diff --git a/src/insets/InsetBibitem.cpp b/src/insets/InsetBibitem.cpp index 3aaaceacbd..d0a28e73fe 100644 --- a/src/insets/InsetBibitem.cpp +++ b/src/insets/InsetBibitem.cpp @@ -41,6 +41,7 @@ #include "support/docstream.h" #include "support/gettext.h" #include "support/lstrings.h" +#include "support/mutex.h" using namespace std; using namespace lyx::support; @@ -49,6 +50,7 @@ namespace lyx { int InsetBibitem::key_counter = 0; +static Mutex counter_mutex; docstring const key_prefix = from_ascii("key-"); @@ -56,8 +58,10 @@ InsetBibitem::InsetBibitem(Buffer * buf, InsetCommandParams const & p) : InsetCommand(buf, p) { buffer().invalidateBibinfoCache(); - if (getParam("key").empty()) + if (getParam("key").empty()) { + Mutex::Locker lock(&counter_mutex); setParam("key", key_prefix + convert(++key_counter)); + } } @@ -77,12 +81,10 @@ void InsetBibitem::initView() void InsetBibitem::updateCommand(docstring const & new_key, bool) { docstring key = new_key; - vector bibkeys = buffer().masterBibInfo().getKeys(); - int i = 1; - if (find(bibkeys.begin(), bibkeys.end(), key) != bibkeys.end()) { + int i = 1; // generate unique label key = new_key + '-' + convert(i); while (find(bibkeys.begin(), bibkeys.end(), key) != bibkeys.end()) { @@ -130,7 +132,6 @@ void InsetBibitem::doDispatch(Cursor & cur, FuncRequest & cmd) docstring label = p["label"]; // definitions for escaping - int previous; static docstring const backslash = from_ascii("\\"); static docstring const lbrace = from_ascii("{"); static docstring const rbrace = from_ascii("}"); @@ -139,6 +140,7 @@ void InsetBibitem::doDispatch(Cursor & cur, FuncRequest & cmd) 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++) @@ -177,8 +179,7 @@ void InsetBibitem::doDispatch(Cursor & cur, FuncRequest & cmd) setParam("label", p["label"]); if (p["key"] != old_key) { updateCommand(p["key"]); - cur.bv().buffer().changeRefsIfUnique(old_key, - params()["key"], CITE_CODE); + cur.bv().buffer().changeRefsIfUnique(old_key, params()["key"]); cur.forceBufferUpdate(); buffer().invalidateBibinfoCache(); } @@ -198,6 +199,7 @@ void InsetBibitem::read(Lexer & lex) if (prefixIs(getParam("key"), key_prefix)) { int const key = convert(getParam("key").substr(key_prefix.length())); + Mutex::Locker lock(&counter_mutex); key_counter = max(key_counter, key); } } @@ -205,6 +207,9 @@ void InsetBibitem::read(Lexer & lex) docstring InsetBibitem::bibLabel() const { + BufferParams const & bp = buffer().masterBuffer()->params(); + if (bp.citeEngineType() == ENGINE_TYPE_NUMERICAL) + return autolabel_; docstring const & label = getParam("label"); return label.empty() ? autolabel_ : label; } @@ -216,7 +221,8 @@ docstring InsetBibitem::screenLabel() const } -int InsetBibitem::plaintext(odocstream & os, OutputParams const &) const +int InsetBibitem::plaintext(odocstringstream & os, + OutputParams const &, size_t) const { odocstringstream oss; oss << '[' << bibLabel() << "] "; @@ -231,6 +237,10 @@ int InsetBibitem::plaintext(odocstream & os, OutputParams const &) const // ale070405 docstring bibitemWidest(Buffer const & buffer, OutputParams const & runparams) { + BufferParams const & bp = buffer.masterBuffer()->params(); + if (bp.citeEngineType() == ENGINE_TYPE_NUMERICAL) + return from_ascii("99"); + int w = 0; InsetBibitem const * bitem = 0; @@ -291,20 +301,9 @@ docstring bibitemWidest(Buffer const & buffer, OutputParams const & runparams) } if (!lbl.empty()) { - docstring latex_lbl; - for (size_t n = 0; n < lbl.size(); ++n) { - try { - latex_lbl += runparams.encoding->latexChar(lbl[n]); - } catch (EncodingException & /* e */) { - if (runparams.dryrun) { - latex_lbl += "<" + _("LyX Warning: ") - + _("uncodable character") + " '"; - latex_lbl += docstring(1, lbl[n]); - latex_lbl += "'>"; - } - } - } - return latex_lbl; + pair latex_lbl = + runparams.encoding->latexString(lbl, runparams.dryrun); + return latex_lbl.first; } return from_ascii("99"); @@ -318,6 +317,17 @@ void InsetBibitem::collectBibKeys(InsetIterator const & it) const BibTeXInfo keyvalmap(false); keyvalmap.key(key); keyvalmap.label(label); + + BufferParams const & bp = buffer().masterBuffer()->params(); + Counters & counters = bp.documentClass().counters(); + docstring const bibitem = from_ascii("bibitem"); + if (bp.citeEngineType() == ENGINE_TYPE_NUMERICAL || getParam("label").empty()) { + if (counters.hasCounter(bibitem)) + counters.step(bibitem, InternalUpdate); + string const & lang = it.paragraph().getParLanguage(bp)->code(); + keyvalmap.setCiteNumber(counters.theCounter(bibitem, lang)); + } + DocIterator doc_it(it); doc_it.forwardPos(); keyvalmap[from_ascii("ref")] = doc_it.paragraph().asString( @@ -332,7 +342,7 @@ void InsetBibitem::updateBuffer(ParIterator const & it, UpdateType utype) BufferParams const & bp = buffer().masterBuffer()->params(); Counters & counters = bp.documentClass().counters(); docstring const bibitem = from_ascii("bibitem"); - if (getParam("label").empty()) { + if (bp.citeEngineType() == ENGINE_TYPE_NUMERICAL || getParam("label").empty()) { if (counters.hasCounter(bibitem)) counters.step(bibitem, utype); string const & lang = it.paragraph().getParLanguage(bp)->code(); @@ -351,7 +361,8 @@ docstring InsetBibitem::xhtml(XHTMLStream & xs, OutputParams const &) const // need to use "name" anyway, eventually, because some browsers do not // handle jumping to ids. If we don't do that, though, we can just put the // id into the span tag. - string const attrs = "id='" + to_utf8(getParam("label")) + "'"; + string const attrs = + "id='LyXCite-" + to_utf8(html::cleanAttr(getParam("key"))) + "'"; xs << html::CompTag("a", attrs); xs << html::StartTag("span", "class='bibitemlabel'"); xs << bibLabel();