X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2FInsetBibtex.cpp;h=a54b0b4a3a033155d0c5099b4fdf046c1595b9f1;hb=d8a6b5bfd0baa02a4ba03f8c9e9c618baf41b03f;hp=d337641f2515cab9b80836f2850cb69e80602d3f;hpb=f52b73747f32ac5ca563bbabc148ced2e6157517;p=lyx.git diff --git a/src/insets/InsetBibtex.cpp b/src/insets/InsetBibtex.cpp index d337641f25..a54b0b4a3a 100644 --- a/src/insets/InsetBibtex.cpp +++ b/src/insets/InsetBibtex.cpp @@ -16,11 +16,9 @@ #include "Buffer.h" #include "BufferParams.h" #include "DispatchResult.h" -#include "support/debug.h" #include "EmbeddedFiles.h" #include "Encoding.h" #include "FuncRequest.h" -#include "support/gettext.h" #include "LaTeXFeatures.h" #include "MetricsInfo.h" #include "OutputParams.h" @@ -28,15 +26,18 @@ #include "frontends/alert.h" +#include "support/debug.h" #include "support/ExceptionMessage.h" #include "support/docstream.h" #include "support/filetools.h" +#include "support/gettext.h" #include "support/lstrings.h" #include "support/os.h" #include "support/Path.h" #include "support/textutils.h" #include +#include using namespace std; using namespace lyx::support; @@ -52,13 +53,16 @@ InsetBibtex::InsetBibtex(InsetCommandParams const & p) {} -CommandInfo const * InsetBibtex::findInfo(string const & /* cmdName */) +ParamInfo const & InsetBibtex::findInfo(string const & /* cmdName */) { - static const char * const paramnames[] = - {"options", "btprint", "bibfiles", "embed", ""}; - static const bool isoptional[] = {true, true, false, false}; - static const CommandInfo info = {4, paramnames, isoptional}; - return &info; + 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_; } @@ -103,9 +107,7 @@ void InsetBibtex::doDispatch(Cursor & cur, FuncRequest & cmd) bibfiles = split(bibfiles, tmp, ','); embedStatus = split(embedStatus, emb, ','); while (!tmp.empty()) { - EmbeddedFile file(changeExtension(tmp, "bib"), cur.buffer().filePath()); - if (!file.exists()) - continue; + EmbeddedFile file(changeExtension(tmp, "bib"), buffer().filePath()); if (!newBibfiles.empty()) newBibfiles += ","; newBibfiles += tmp; @@ -126,14 +128,14 @@ void InsetBibtex::doDispatch(Cursor & cur, FuncRequest & cmd) setParams(p); try { // test parameter and copy files - getFiles(cur.buffer()); + embeddedFiles(); } catch (ExceptionMessage const & message) { Alert::error(message.title_, message.details_); // do not set parameter if an error happens setParams(orig); break; } - cur.buffer().updateBibfilesCache(); + buffer().updateBibfilesCache(); break; } @@ -144,16 +146,14 @@ void InsetBibtex::doDispatch(Cursor & cur, FuncRequest & cmd) } -docstring const InsetBibtex::getScreenLabel(Buffer const &) const +docstring InsetBibtex::screenLabel() const { return _("BibTeX Generated Bibliography"); } -namespace { - -string normalizeName(Buffer const & buffer, OutputParams const & runparams, - string const & name, string const & ext) +static string normalizeName(Buffer const & buffer, + OutputParams const & runparams, string const & name, string const & ext) { string const fname = makeAbsPath(name, buffer.filePath()).absFilename(); if (FileName(name).isAbsolute() || !FileName(fname + ext).isReadableFile()) @@ -166,11 +166,8 @@ string normalizeName(Buffer const & buffer, OutputParams const & runparams, from_utf8(buffer.masterBuffer()->filePath()))); } -} - -int InsetBibtex::latex(Buffer const & buffer, odocstream & os, - OutputParams const & runparams) const +int InsetBibtex::latex(odocstream & os, OutputParams const & runparams) const { // the sequence of the commands: // 1. \bibliographystyle{style} @@ -192,25 +189,16 @@ int InsetBibtex::latex(Buffer const & buffer, odocstream & os, // use such filenames.) // Otherwise, store the (maybe absolute) path to the original, // unmangled database name. - typedef boost::char_separator Separator; - typedef boost::tokenizer Tokenizer; - - Separator const separator(from_ascii(",").c_str()); - // The tokenizer must not be called with temporary strings, since - // it does not make a copy and uses iterators of the string further - // down. getParam returns a reference, so this is OK. - Tokenizer const tokens(getParam("bibfiles"), separator); - Tokenizer::const_iterator const begin = tokens.begin(); - Tokenizer::const_iterator const end = tokens.end(); - + EmbeddedFileList const bibs = embeddedFiles(); + EmbeddedFileList::const_iterator it = bibs.begin(); + EmbeddedFileList::const_iterator it_end = bibs.end(); odocstringstream dbs; - for (Tokenizer::const_iterator it = begin; it != end; ++it) { - docstring const input = trim(*it); - // FIXME UNICODE - string utf8input = to_utf8(input); + for (; it != it_end; ++it) { + string utf8input = removeExtension(it->availableFile().absFilename()); string database = - normalizeName(buffer, runparams, utf8input, ".bib"); - FileName const try_in_file(makeAbsPath(database + ".bib", buffer.filePath())); + normalizeName(buffer(), runparams, utf8input, ".bib"); + FileName const try_in_file = + makeAbsPath(database + ".bib", buffer().filePath()); bool const not_from_texmf = try_in_file.isReadableFile(); if (!runparams.inComment && !runparams.dryrun && !runparams.nice && @@ -220,7 +208,7 @@ int InsetBibtex::latex(Buffer const & buffer, odocstream & os, DocFileName const in_file = DocFileName(try_in_file); database = removeExtension(in_file.mangledFilename()); FileName const out_file = makeAbsPath(database + ".bib", - buffer.masterBuffer()->temppath()); + buffer().masterBuffer()->temppath()); bool const success = in_file.copyTo(out_file); if (!success) { @@ -236,7 +224,7 @@ int InsetBibtex::latex(Buffer const & buffer, odocstream & os, from_utf8(database)); } - if (it != begin) + if (it != bibs.begin()) dbs << ','; // FIXME UNICODE dbs << from_utf8(latex_path(database)); @@ -267,8 +255,9 @@ int InsetBibtex::latex(Buffer const & buffer, odocstream & os, int nlines = 0; if (!style.empty()) { - string base = normalizeName(buffer, runparams, style, ".bst"); - FileName const try_in_file(makeAbsPath(base + ".bst", buffer.filePath())); + string base = normalizeName(buffer(), runparams, style, ".bst"); + FileName const try_in_file = + makeAbsPath(base + ".bst", buffer().filePath()); bool const not_from_texmf = try_in_file.isReadableFile(); // If this style does not come from texmf and we are not // exporting to .tex copy it to the tmp directory. @@ -279,8 +268,8 @@ int InsetBibtex::latex(Buffer const & buffer, odocstream & os, // use new style name DocFileName const in_file = DocFileName(try_in_file); base = removeExtension(in_file.mangledFilename()); - FileName const out_file(makeAbsPath(base + ".bst", - buffer.masterBuffer()->temppath())); + FileName const out_file = makeAbsPath(base + ".bst", + buffer().masterBuffer()->temppath()); bool const success = in_file.copyTo(out_file); if (!success) { lyxerr << "Failed to copy '" << in_file @@ -290,7 +279,7 @@ int InsetBibtex::latex(Buffer const & buffer, odocstream & os, } // FIXME UNICODE os << "\\bibliographystyle{" - << from_utf8(latex_path(normalizeName(buffer, runparams, base, ".bst"))) + << from_utf8(latex_path(normalizeName(buffer(), runparams, base, ".bst"))) << "}\n"; nlines += 1; } @@ -304,7 +293,7 @@ int InsetBibtex::latex(Buffer const & buffer, odocstream & os, "BibTeX will be unable to find it.")); } - if (!db_out.empty() && buffer.params().use_bibtopic){ + if (!db_out.empty() && buffer().params().use_bibtopic) { os << "\\begin{btSect}{" << db_out << "}\n"; docstring btprint = getParam("btprint"); if (btprint.empty()) @@ -316,14 +305,13 @@ int InsetBibtex::latex(Buffer const & buffer, odocstream & os, } // bibtotoc-Option - if (!bibtotoc.empty() && !buffer.params().use_bibtopic) { + if (!bibtotoc.empty() && !buffer().params().use_bibtopic) { // maybe a problem when a textclass has no "art" as // part of its name, because it's than book. // For the "official" lyx-layouts it's no problem to support // all well - if (!contains(buffer.params().getTextClass().name(), - "art")) { - if (buffer.params().sides == OneSide) { + if (!contains(buffer().params().documentClass().name(), "art")) { + if (buffer().params().sides == OneSide) { // oneside os << "\\clearpage"; } else { @@ -340,7 +328,7 @@ int InsetBibtex::latex(Buffer const & buffer, odocstream & os, } } - if (!db_out.empty() && !buffer.params().use_bibtopic){ + if (!db_out.empty() && !buffer().params().use_bibtopic) { docstring btprint = getParam("btprint"); if (btprint == "btPrintAll") { os << "\\nocite{*}\n"; @@ -354,9 +342,9 @@ int InsetBibtex::latex(Buffer const & buffer, odocstream & os, } -EmbeddedFileList const InsetBibtex::getFiles(Buffer const & buffer) const +EmbeddedFileList InsetBibtex::embeddedFiles() const { - FileName path(buffer.filePath()); + FileName path(buffer().filePath()); PathChanger p(path); EmbeddedFileList vec; @@ -370,10 +358,10 @@ EmbeddedFileList const InsetBibtex::getFiles(Buffer const & buffer) const embedStatus = split(embedStatus, emb, ','); while (!tmp.empty()) { if (!emb.empty()) { - EmbeddedFile file(changeExtension(tmp, "bib"), buffer.filePath()); + EmbeddedFile file(changeExtension(tmp, "bib"), buffer().filePath()); // If the file structure is correct, this should not fail. file.setEmbed(true); - file.enable(buffer.embedded(), &buffer); + file.enable(buffer().embedded(), &buffer()); vec.push_back(file); } else { // this includes the cases when the embed parameter is empty @@ -381,9 +369,9 @@ EmbeddedFileList const InsetBibtex::getFiles(Buffer const & buffer) const // If we didn't find a matching file name just fail silently if (!file.empty()) { - EmbeddedFile efile = EmbeddedFile(file.absFilename(), buffer.filePath()); + EmbeddedFile efile = EmbeddedFile(file.absFilename(), buffer().filePath()); efile.setEmbed(false); - efile.enable(buffer.embedded(), &buffer); + efile.enable(buffer().embedded(), &buffer()); vec.push_back(efile); } } @@ -635,10 +623,10 @@ namespace { // This method returns a comma separated list of Bibtex entries -void InsetBibtex::fillWithBibKeys(Buffer const & buffer, - BiblioInfo & keylist, InsetIterator const & /*di*/) const +void InsetBibtex::fillWithBibKeys(BiblioInfo & keylist, + InsetIterator const & /*di*/) const { - EmbeddedFileList const files = getFiles(buffer); + EmbeddedFileList const files = embeddedFiles(); for (vector::const_iterator it = files.begin(); it != files.end(); ++ it) { // This bibtex parser is a first step to parse bibtex files @@ -661,8 +649,7 @@ void InsetBibtex::fillWithBibKeys(Buffer const & buffer, // 8bit clean bibtex forks exist. idocfstream ifs(it->availableFile().toFilesystemEncoding().c_str(), - ios_base::in, - buffer.params().encoding().iconvName()); + ios_base::in, buffer().params().encoding().iconvName()); char_type ch; VarMap strings; @@ -751,8 +738,7 @@ void InsetBibtex::fillWithBibKeys(Buffer const & buffer, docstring value; docstring commaNewline; docstring data; - BibTeXInfo keyvalmap; - keyvalmap.entryType = entryType; + BibTeXInfo keyvalmap(key, entryType); bool readNext = removeWSAndComma(ifs); @@ -778,15 +764,13 @@ void InsetBibtex::fillWithBibKeys(Buffer const & buffer, keyvalmap[name] = value; data += "\n\n" + value; - keylist.fieldNames.insert(name); + keylist.addFieldName(name); readNext = removeWSAndComma(ifs); } // add the new entry - keylist.entryTypes.insert(entryType); - keyvalmap.allData = data; - keyvalmap.isBibTeX = true; - keyvalmap.bibKey = key; + keylist.addEntryType(entryType); + keyvalmap.setAllData(data); keylist[key] = keyvalmap; } } //< searching '@' @@ -837,25 +821,25 @@ void InsetBibtex::validate(LaTeXFeatures & features) const } -void InsetBibtex::registerEmbeddedFiles(Buffer const & buffer, EmbeddedFileList & files) const +void InsetBibtex::registerEmbeddedFiles(EmbeddedFileList & files) const { - EmbeddedFileList const dbs = getFiles(buffer); + EmbeddedFileList const dbs = embeddedFiles(); for (vector::const_iterator it = dbs.begin(); - it != dbs.end(); ++ it) - files.registerFile(*it, this, buffer); + it != dbs.end(); ++it) + files.registerFile(*it, this, buffer()); } -void InsetBibtex::updateEmbeddedFile(Buffer const & buf, EmbeddedFile const & file) +void InsetBibtex::updateEmbeddedFile(EmbeddedFile const & file) { // look for the item and update status docstring bibfiles; docstring embed; bool first = true; - EmbeddedFileList dbs = getFiles(buf); + EmbeddedFileList dbs = embeddedFiles(); for (EmbeddedFileList::iterator it = dbs.begin(); - it != dbs.end(); ++ it) { + it != dbs.end(); ++it) { // update from file if (it->absFilename() == file.absFilename()) it->setEmbed(file.embedded()); @@ -863,9 +847,10 @@ void InsetBibtex::updateEmbeddedFile(Buffer const & buf, EmbeddedFile const & fi if (!first) { bibfiles += ','; embed += ','; - } else + } else { first = false; - bibfiles += from_utf8(it->outputFilename(buf.filePath())); + } + bibfiles += from_utf8(it->outputFilename(buffer().filePath())); if (it->embedded()) embed += from_utf8(it->inzipName()); }