Extend the Bibfiles cache

For biblatex, we need the file name as it was entered in the inset
(abs path, rel path, only file name) in order to resolve it properly
for the export (as in the BibTeX inset intself).

Therefore, we now store a pair<docstring, FileName>.

A FileNamePairList has been added to FileNameList for this purpose.
This commit is contained in:
Juergen Spitzmueller 2017-01-02 13:00:14 +01:00
parent ee653e1968
commit 867cdb0662
5 changed files with 35 additions and 21 deletions

View File

@ -278,7 +278,7 @@ public:
/// A cache for the bibfiles (including bibfiles of loaded child
/// documents), needed for appropriate update of natbib labels.
mutable support::FileNameList bibfiles_cache_;
mutable support::FileNamePairList bibfiles_cache_;
// FIXME The caching mechanism could be improved. At present, we have a
// cache for each Buffer, that caches all the bibliography info for that
@ -2302,7 +2302,7 @@ void Buffer::updateBibfilesCache(UpdateScope scope) const
for (InsetIterator it = inset_iterator_begin(inset()); it; ++it) {
if (it->lyxCode() == BIBTEX_CODE) {
InsetBibtex const & inset = static_cast<InsetBibtex const &>(*it);
support::FileNameList const bibfiles = inset.getBibFiles();
support::FileNamePairList const bibfiles = inset.getBibFiles();
d->bibfiles_cache_.insert(d->bibfiles_cache_.end(),
bibfiles.begin(),
bibfiles.end());
@ -2311,7 +2311,7 @@ void Buffer::updateBibfilesCache(UpdateScope scope) const
Buffer const * const incbuf = inset.getChildBuffer();
if (!incbuf)
continue;
support::FileNameList const & bibfiles =
support::FileNamePairList const & bibfiles =
incbuf->getBibfilesCache(UpdateChildOnly);
if (!bibfiles.empty()) {
d->bibfiles_cache_.insert(d->bibfiles_cache_.end(),
@ -2349,7 +2349,7 @@ void Buffer::invalidateBibfileCache() const
}
support::FileNameList const & Buffer::getBibfilesCache(UpdateScope scope) const
support::FileNamePairList const & Buffer::getBibfilesCache(UpdateScope scope) const
{
// FIXME This is probably unnecessary, given where we call this.
// If this is a child document, use the master's cache instead.
@ -2383,16 +2383,17 @@ void Buffer::checkIfBibInfoCacheIsValid() const
}
// compare the cached timestamps with the actual ones.
FileNameList const & bibfiles_cache = getBibfilesCache();
FileNameList::const_iterator ei = bibfiles_cache.begin();
FileNameList::const_iterator en = bibfiles_cache.end();
FileNamePairList const & bibfiles_cache = getBibfilesCache();
FileNamePairList::const_iterator ei = bibfiles_cache.begin();
FileNamePairList::const_iterator en = bibfiles_cache.end();
for (; ei != en; ++ ei) {
time_t lastw = ei->lastModified();
time_t prevw = d->bibfile_status_[*ei];
FileName const fn = ei->second;
time_t lastw = fn.lastModified();
time_t prevw = d->bibfile_status_[fn];
if (lastw != prevw) {
d->bibinfo_cache_valid_ = false;
d->cite_labels_valid_ = false;
d->bibfile_status_[*ei] = lastw;
d->bibfile_status_[fn] = lastw;
}
}
}

View File

@ -69,7 +69,7 @@ class WorkAreaManager;
namespace support {
class DocFileName;
class FileName;
class FileNameList;
class FileNamePairList;
}
namespace graphics {
@ -790,7 +790,7 @@ private:
void updateBibfilesCache(UpdateScope scope = UpdateMaster) const;
/// Return the list with all bibfiles in use (including bibfiles
/// of loaded child documents).
support::FileNameList const &
support::FileNamePairList const &
getBibfilesCache(UpdateScope scope = UpdateMaster) const;
///
void collectChildren(ListOfBuffers & children, bool grand_children) const;

View File

@ -402,12 +402,15 @@ void InsetBibtex::latex(otexstream & os, OutputParams const & runparams) const
}
support::FileNameList InsetBibtex::getBibFiles() const
support::FileNamePairList InsetBibtex::getBibFiles() const
{
FileName path(buffer().filePath());
support::PathChanger p(path);
support::FileNameList vec;
// We need to store both the real FileName and the way it is entered
// (with full path, rel path or as a single file name).
// The latter is needed for biblatex's central bibfile macro.
support::FileNamePairList vec;
vector<docstring> bibfilelist = getVectorFromString(getParam("bibfiles"));
vector<docstring>::const_iterator it = bibfilelist.begin();
@ -416,7 +419,7 @@ support::FileNameList InsetBibtex::getBibFiles() const
FileName const file = getBibTeXPath(*it, buffer());
if (!file.empty())
vec.push_back(file);
vec.push_back(make_pair(*it, file));
else
LYXERR0("Couldn't find " + to_utf8(*it) + " in InsetBibtex::getBibFiles()!");
}
@ -695,11 +698,11 @@ void InsetBibtex::parseBibTeXFiles() const
BiblioInfo keylist;
support::FileNameList const files = getBibFiles();
support::FileNameList::const_iterator it = files.begin();
support::FileNameList::const_iterator en = files.end();
support::FileNamePairList const files = getBibFiles();
support::FileNamePairList::const_iterator it = files.begin();
support::FileNamePairList::const_iterator en = files.end();
for (; it != en; ++ it) {
ifdocstream ifs(it->toFilesystemEncoding().c_str(),
ifdocstream ifs(it->second.toFilesystemEncoding().c_str(),
ios_base::in, buffer().params().encoding().iconvName());
char_type ch;

View File

@ -20,7 +20,7 @@ class BiblioInfo;
namespace support {
class FileName;
class FileNameList;
class FileNamePairList;
}
/** Used to insert BibTeX's information
@ -33,7 +33,7 @@ public:
~InsetBibtex();
///
support::FileNameList getBibFiles() const;
support::FileNamePairList getBibFiles() const;
///
bool addDatabase(docstring const &);
///

View File

@ -28,6 +28,16 @@ class FileNameList: public std::vector<FileName>
{
};
/**
* List of filename with additional information. Used by the Bibfiles cache,
* which needs to store, next to the real filename, the way it was entered
* in the BibTeX inset (as abspath, relpath or texmf file)
*/
class FileNamePairList: public std::vector<std::pair<docstring, FileName>>
{
};
} // namespace support
} // namespace lyx