]> git.lyx.org Git - lyx.git/blobdiff - src/insets/InsetBibtex.cpp
Remove TextClassPtr without losing the type safety it provided.
[lyx.git] / src / insets / InsetBibtex.cpp
index 9996cd23f0089e36b0c1376c986dca4a30615816..a54b0b4a3a033155d0c5099b4fdf046c1595b9f1 100644 (file)
 #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"
 
 #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 <boost/tokenizer.hpp>
+#include <limits>
 
 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,15 +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.
-       EmbeddedFileList const bibs = getFiles(buffer);
+       EmbeddedFileList const bibs = embeddedFiles();
        EmbeddedFileList::const_iterator it = bibs.begin();
        EmbeddedFileList::const_iterator it_end = bibs.end();
        odocstringstream dbs;
        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 &&
@@ -210,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) {
@@ -257,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.
@@ -269,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
@@ -280,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;
        }
@@ -294,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())
@@ -306,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 {
@@ -330,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";
@@ -344,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;
@@ -360,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
@@ -371,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);
                        }
                }
@@ -625,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<EmbeddedFile>::const_iterator it = files.begin();
             it != files.end(); ++ it) {
                // This bibtex parser is a first step to parse bibtex files
@@ -651,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;
@@ -741,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);
  
@@ -768,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 '@'
@@ -827,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<EmbeddedFile>::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());
@@ -853,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());
        }