]> git.lyx.org Git - features.git/blobdiff - src/insets/InsetBibtex.cpp
Rename legacy input encoding settings.
[features.git] / src / insets / InsetBibtex.cpp
index d5798630a75a693f645c2ef2d15ac24e9b3c5b63..d20f67187cdaf652f9ecdda1d28590106eed60ef 100644 (file)
@@ -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: {
@@ -105,6 +106,7 @@ void InsetBibtex::doDispatch(Cursor & cur, FuncRequest & cmd)
 
                cur.recordUndo();
                setParams(p);
+               cur.buffer()->clearBibFileCache();
                cur.forceBufferUpdate();
                break;
        }
@@ -130,15 +132,15 @@ bool InsetBibtex::getStatus(Cursor & cur, FuncRequest const & cmd,
 }
 
 
-void InsetBibtex::editDatabases() const
+void InsetBibtex::editDatabases(docstring const db) const
 {
        vector<docstring> 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."),
@@ -153,6 +155,8 @@ void InsetBibtex::editDatabases() const
        vector<docstring>::const_iterator it = bibfilelist.begin();
        vector<docstring>::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));
@@ -289,8 +293,11 @@ void InsetBibtex::latex(otexstream & os, OutputParams const & runparams) const
                os << "\n";
        } else {// using BibTeX
                // Database(s)
-               vector<docstring> const db_out =
+               vector<pair<docstring, string>> const dbs =
                        buffer().prepareBibFilePaths(runparams, getBibFiles(), false);
+               vector<docstring> db_out;
+               for (pair<docstring, string> const & db : dbs)
+                       db_out.push_back(db.first);
                // Style options
                if (style == "default")
                        style = buffer().masterParams().defaultBiblioStyle();
@@ -671,8 +678,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);
@@ -894,10 +904,35 @@ void InsetBibtex::updateBuffer(ParIterator const &, UpdateType)
        // 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<string, string> encs = getFileEncodings();
+       map<string, string>::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<string, string> InsetBibtex::getFileEncodings() const
+{
+       vector<string> ps =
+               getVectorFromString(to_utf8(getParam("file_encodings")), "\t");
+       std::map<string, string> res;
+       for (string const & s: ps) {
+               string key;
+               string val = split(s, key, ' ');
+               res[key] = val;
        }
+       return res;
 }
 
 
@@ -964,7 +999,7 @@ int InsetBibtex::plaintext(odocstringstream & os,
                refoutput += bibinfo.getInfo(entry.key(), buffer(), ci) + "\n\n";
        }
        os << refoutput;
-       return refoutput.size();
+       return int(refoutput.size());
 }