X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2FInsetBibtex.cpp;h=15953e1cded7dec4a6455e55c8c18e05df1e02ce;hb=2d48072e664099385b2442f7166b3c57129799bb;hp=ae76a7f26c0c2bd7e8270fc35e322f3ec501e63c;hpb=4115d2487f57f58774ee2846aa2b35818c0bc1b9;p=lyx.git diff --git a/src/insets/InsetBibtex.cpp b/src/insets/InsetBibtex.cpp index ae76a7f26c..15953e1cde 100644 --- a/src/insets/InsetBibtex.cpp +++ b/src/insets/InsetBibtex.cpp @@ -73,6 +73,7 @@ ParamInfo const & InsetBibtex::findInfo(string const & /* cmdName */) param_info_.add("bibfiles", ParamInfo::LATEX_REQUIRED); param_info_.add("options", ParamInfo::LYX_INTERNAL); param_info_.add("encoding", ParamInfo::LYX_INTERNAL); + param_info_.add("file_encodings", ParamInfo::LYX_INTERNAL); param_info_.add("biblatexopts", ParamInfo::LATEX_OPTIONAL); } return param_info_; @@ -84,7 +85,7 @@ void InsetBibtex::doDispatch(Cursor & cur, FuncRequest & cmd) switch (cmd.action()) { case LFUN_INSET_EDIT: - editDatabases(); + editDatabases(cmd.argument()); break; case LFUN_INSET_MODIFY: { @@ -131,15 +132,15 @@ bool InsetBibtex::getStatus(Cursor & cur, FuncRequest const & cmd, } -void InsetBibtex::editDatabases() const +void InsetBibtex::editDatabases(docstring const & db) const { vector bibfilelist = getVectorFromString(getParam("bibfiles")); if (bibfilelist.empty()) return; - int nr_databases = bibfilelist.size(); - if (nr_databases > 1) { + size_t nr_databases = bibfilelist.size(); + if (nr_databases > 1 && db.empty()) { docstring const engine = usingBiblatex() ? _("Biblatex") : _("BibTeX"); docstring message = bformat(_("The %1$s[[BibTeX/Biblatex]] inset includes %2$s databases.\n" "If you proceed, all of them will be opened."), @@ -154,6 +155,8 @@ void InsetBibtex::editDatabases() const vector::const_iterator it = bibfilelist.begin(); vector::const_iterator en = bibfilelist.end(); for (; it != en; ++it) { + if (!db.empty() && db != *it) + continue; FileName const bibfile = buffer().getBibfilePath(*it); theFormats().edit(buffer(), bibfile, theFormats().getFormatFromFile(bibfile)); @@ -263,6 +266,15 @@ void InsetBibtex::latex(otexstream & os, OutputParams const & runparams) const && buffer().params().multibib == "child") return; + if (runparams.inDeletedInset) { + // We cannot strike-out bibligraphies, + // so we just output a note. + os << "\\textbf{" + << buffer().B_("[BIBLIOGRAPHY DELETED!]") + << "}"; + return; + } + string style = to_utf8(getParam("options")); // maybe empty! and with bibtotoc string bibtotoc; if (prefixIs(style, "bibtotoc")) { @@ -290,8 +302,11 @@ void InsetBibtex::latex(otexstream & os, OutputParams const & runparams) const os << "\n"; } else {// using BibTeX // Database(s) - vector const db_out = + vector> const dbs = buffer().prepareBibFilePaths(runparams, getBibFiles(), false); + vector db_out; + for (pair const & db : dbs) + db_out.push_back(db.first); // Style options if (style == "default") style = buffer().masterParams().defaultBiblioStyle(); @@ -357,7 +372,8 @@ void InsetBibtex::latex(otexstream & os, OutputParams const & runparams) const << "\\end{btSect}\n"; } // bibtotoc option - if (!bibtotoc.empty() && !buffer().masterParams().useBibtopic()) { + if (!bibtotoc.empty() && !buffer().masterParams().useBibtopic() + && !buffer().masterParams().documentClass().bibInToc()) { // set label for hyperref, see http://www.lyx.org/trac/ticket/6470 if (buffer().masterParams().pdfoptions().use_hyperref) os << "\\phantomsection"; @@ -672,8 +688,11 @@ void InsetBibtex::parseBibTeXFiles(FileNameList & checkedFiles) const // record that we check this. checkedFiles.push_back(bibfile); string encoding = buffer().masterParams().encoding().iconvName(); - string const ienc = to_ascii(params()["encoding"]); - if (!ienc.empty() && ienc != "default" && encodings.fromLyXName(ienc)) + string ienc = buffer().masterParams().bibFileEncoding(to_utf8(bf)); + if (ienc.empty() || ienc == "general") + ienc = to_ascii(params()["encoding"]); + + if (!ienc.empty() && ienc != "auto-legacy-plain" && ienc != "auto-legacy" && encodings.fromLyXName(ienc)) encoding = encodings.fromLyXName(ienc)->iconvName(); ifdocstream ifs(bibfile.toFilesystemEncoding().c_str(), ios_base::in, encoding); @@ -889,16 +908,41 @@ void InsetBibtex::validate(LaTeXFeatures & features) const } -void InsetBibtex::updateBuffer(ParIterator const &, UpdateType) +void InsetBibtex::updateBuffer(ParIterator const &, UpdateType, bool const /*deleted*/) { buffer().registerBibfiles(getBibFiles()); // record encoding of bib files for biblatex string const enc = (params()["encoding"] == from_ascii("default")) ? string() : to_ascii(params()["encoding"]); + bool invalidate = false; if (buffer().params().bibEncoding() != enc) { buffer().params().setBibEncoding(enc); + invalidate = true; + } + map encs = getFileEncodings(); + map::const_iterator it = encs.begin(); + for (; it != encs.end(); ++it) { + if (buffer().params().bibFileEncoding(it->first) != it->second) { + buffer().params().setBibFileEncoding(it->first, it->second); + invalidate = true; + } + } + if (invalidate) buffer().invalidateBibinfoCache(); +} + + +map InsetBibtex::getFileEncodings() const +{ + vector ps = + getVectorFromString(to_utf8(getParam("file_encodings")), "\t"); + std::map res; + for (string const & s: ps) { + string key; + string val = split(s, key, ' '); + res[key] = val; } + return res; } @@ -917,9 +961,12 @@ void InsetBibtex::addToToc(DocIterator const & cpit, bool output_active, return; docstring const str = getRefLabel(); - TocBuilder & b = backend.builder("tableofcontents"); - b.pushItem(cpit, str, output_active); - b.pop(); + shared_ptr toc = backend.toc("tableofcontents"); + // Assign to appropriate level + int const item_depth = + (buffer().masterParams().documentClass().hasLaTeXLayout("chapter")) + ? 1 : 2; + toc->push_back(TocItem(cpit, item_depth, str, output_active)); } @@ -965,7 +1012,7 @@ int InsetBibtex::plaintext(odocstringstream & os, refoutput += bibinfo.getInfo(entry.key(), buffer(), ci) + "\n\n"; } os << refoutput; - return refoutput.size(); + return int(refoutput.size()); }