#include "Buffer.h"
#include "BufferParams.h"
#include "DispatchResult.h"
-#include "EmbeddedFiles.h"
#include "Encoding.h"
#include "FuncRequest.h"
#include "LaTeXFeatures.h"
InsetBibtex::InsetBibtex(InsetCommandParams const & p)
- : InsetCommand(p, "bibtex"), bibfiles_()
+ : InsetCommand(p, "bibtex")
{}
-void InsetBibtex::setBuffer(Buffer & buffer)
-{
- // FIXME We ought to have a buffer.
- if (buffer_) {
- EmbeddedFileList::iterator it = bibfiles_.begin();
- EmbeddedFileList::iterator it_end = bibfiles_.end();
- for (; it != it_end; ++it) {
- try {
- *it = it->copyTo(&buffer);
- } catch (ExceptionMessage const & message) {
- Alert::error(message.title_, message.details_);
- // failed to embed
- it->setEmbed(false);
- }
- }
- }
- InsetCommand::setBuffer(buffer);
-}
-
-
ParamInfo const & InsetBibtex::findInfo(string const & /* cmdName */)
{
static ParamInfo param_info_;
if (param_info_.empty()) {
param_info_.add("btprint", ParamInfo::LATEX_OPTIONAL);
param_info_.add("bibfiles", ParamInfo::LATEX_REQUIRED);
- param_info_.add("embed", ParamInfo::LYX_INTERNAL);
param_info_.add("options", ParamInfo::LYX_INTERNAL);
}
return param_info_;
break;
}
//
- createBibFiles(p["bibfiles"], p["embed"]);
- updateParam();
- setParam("options", p["options"]);
+ setParams(p);
buffer().updateBibfilesCache();
break;
}
// use such filenames.)
// Otherwise, store the (maybe absolute) path to the original,
// unmangled database name.
- EmbeddedFileList::const_iterator it = bibfiles_.begin();
- EmbeddedFileList::const_iterator it_end = bibfiles_.end();
+ vector<docstring> bibfilelist = getVectorFromString(getParam("bibfiles"));
+ vector<docstring>::const_iterator it = bibfilelist.begin();
+ vector<docstring>::const_iterator en = bibfilelist.end();
odocstringstream dbs;
- for (; it != it_end; ++it) {
- string utf8input = removeExtension(it->availableFile().absFilename());
+ bool didone = false;
+
+ for (; it != en; ++it) {
+ string utf8input = to_utf8(*it);
string database =
normalizeName(buffer(), runparams, utf8input, ".bib");
FileName const try_in_file =
from_utf8(database));
}
- if (it != bibfiles_.begin())
+ if (didone)
dbs << ',';
+ else
+ didone =- true;
// FIXME UNICODE
dbs << from_utf8(latex_path(database));
}
}
-EmbeddedFileList const & InsetBibtex::getBibFiles() const
+support::FileNameList InsetBibtex::getBibFiles() const
{
- return bibfiles_;
+ FileName path(buffer().filePath());
+ support::PathChanger p(path);
+
+ support::FileNameList vec;
+
+ vector<docstring> bibfilelist = getVectorFromString(getParam("bibfiles"));
+ vector<docstring>::const_iterator it = bibfilelist.begin();
+ vector<docstring>::const_iterator en = bibfilelist.end();
+ for (; it != en; ++it) {
+ FileName const file =
+ findtexfile(changeExtension(to_utf8(*it), "bib"), "bib");
+
+ // If we didn't find a matching file name just fail silently
+ if (!file.empty())
+ vec.push_back(file);
+ }
+
+ return vec;
+
}
namespace {
// We don't restrict keys to ASCII in LyX, since our own
// InsetBibitem can generate non-ASCII keys, and nonstandard
// 8bit clean bibtex forks exist.
- EmbeddedFileList const & files = getBibFiles();
- EmbeddedFileList::const_iterator it = files.begin();
- EmbeddedFileList::const_iterator en = files.end();
+ support::FileNameList const & files = getBibFiles();
+ support::FileNameList::const_iterator it = files.begin();
+ support::FileNameList::const_iterator en = files.end();
for (; it != en; ++ it) {
- idocfstream ifs(it->availableFile().toFilesystemEncoding().c_str(),
+ idocfstream ifs(it->toFilesystemEncoding().c_str(),
ios_base::in, buffer().params().encoding().iconvName());
char_type ch;
}
-
-bool InsetBibtex::addDatabase(string const & db)
-{
- EmbeddedFile file(changeExtension(db, "bib"), buffer().filePath());
-
- // only compare filename
- EmbeddedFileList::iterator it = bibfiles_.begin();
- EmbeddedFileList::iterator it_end = bibfiles_.end();
- for (; it != it_end; ++it)
- if (it->absFilename() == file.absFilename())
- return false;
-
- bibfiles_.push_back(file);
- updateParam();
- return true;
-}
-
-
-bool InsetBibtex::delDatabase(string const & db)
-{
- EmbeddedFile file(changeExtension(db, "bib"), buffer().filePath());
-
- // only compare filename
- EmbeddedFileList::iterator it = bibfiles_.begin();
- EmbeddedFileList::iterator it_end = bibfiles_.end();
- for (; it != it_end; ++it)
- if (it->absFilename() == file.absFilename()) {
- bibfiles_.erase(it);
- updateParam();
- return true;
- }
- return false;
-}
-
-
-void InsetBibtex::validate(LaTeXFeatures & features) const
+FileName InsetBibtex::getBibTeXPath(docstring const & filename, Buffer const & buf)
{
- if (features.bufferParams().use_bibtopic)
- features.require("bibtopic");
+ string texfile = changeExtension(to_utf8(filename), "bib");
+ // note that, if the filename can be found directly from the path,
+ // findtexfile will just return a FileName object for that path.
+ FileName file(findtexfile(texfile, "bib"));
+ if (file.empty())
+ file = FileName(makeAbsPath(texfile, buf.filePath()));
+ return file;
}
+
-
-void InsetBibtex::createBibFiles(docstring const & bibParam,
- docstring const & embedParam) const
+bool InsetBibtex::addDatabase(docstring const & db)
{
- bibfiles_.clear();
-
- string tmp;
- string emb;
-
- string bibfiles = to_utf8(bibParam);
- string embedStatus = to_utf8(embedParam);
-
- LYXERR(Debug::FILES, "Create bib files from parameters "
- << bibfiles << " and " << embedStatus);
-
- bibfiles = split(bibfiles, tmp, ',');
- embedStatus = split(embedStatus, emb, ',');
-
- while (!tmp.empty()) {
- EmbeddedFile file(changeExtension(tmp, "bib"), buffer().filePath());
-
- file.setInzipName(emb);
- file.setEmbed(!emb.empty());
- file.enable(buffer().embedded(), &buffer(), false);
- bibfiles_.push_back(file);
- // Get next file name
- bibfiles = split(bibfiles, tmp, ',');
- embedStatus = split(embedStatus, emb, ',');
+ docstring bibfiles = getParam("bibfiles");
+ if (tokenPos(bibfiles, ',', db) == -1) {
+ if (!bibfiles.empty())
+ bibfiles += ',';
+ setParam("bibfiles", bibfiles + db);
+ return true;
}
+ return false;
}
-void InsetBibtex::updateParam()
+bool InsetBibtex::delDatabase(docstring const & db)
{
- docstring bibfiles;
- docstring embed;
-
- bool first = true;
-
- EmbeddedFileList::iterator it = bibfiles_.begin();
- EmbeddedFileList::iterator en = bibfiles_.end();
- for (; it != en; ++it) {
- if (!first) {
- bibfiles += ',';
- embed += ',';
- } else
- first = false;
- bibfiles += from_utf8(it->outputFilename(buffer().filePath()));
- if (it->embedded())
- embed += from_utf8(it->inzipName());
+ docstring bibfiles = getParam("bibfiles");
+ if (contains(bibfiles, db)) {
+ int const n = tokenPos(bibfiles, ',', db);
+ docstring bd = db;
+ if (n > 0) {
+ // this is not the first database
+ docstring tmp = ',' + bd;
+ setParam("bibfiles", subst(bibfiles, tmp, docstring()));
+ } else if (n == 0)
+ // this is the first (or only) database
+ setParam("bibfiles", split(bibfiles, bd, ','));
+ else
+ return false;
}
- setParam("bibfiles", bibfiles);
- setParam("embed", embed);
-}
-
-
-void InsetBibtex::registerEmbeddedFiles(EmbeddedFileList & files) const
-{
- if (bibfiles_.empty())
- createBibFiles(params()["bibfiles"], params()["embed"]);
-
- EmbeddedFileList::const_iterator it = bibfiles_.begin();
- EmbeddedFileList::const_iterator it_end = bibfiles_.end();
- for (; it != it_end; ++it)
- files.registerFile(*it, this, buffer());
+ return true;
}
-void InsetBibtex::updateEmbeddedFile(EmbeddedFile const & file)
+void InsetBibtex::validate(LaTeXFeatures & features) const
{
- // look for the item and update status
- for (EmbeddedFileList::iterator it = bibfiles_.begin();
- it != bibfiles_.end(); ++it)
- if (it->absFilename() == file.absFilename())
- *it = file;
-
- updateParam();
+ if (features.bufferParams().use_bibtopic)
+ features.require("bibtopic");
}