mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-09-20 06:49:56 +00:00
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:
parent
ee653e1968
commit
867cdb0662
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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 &);
|
||||
///
|
||||
|
@ -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
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user