]> git.lyx.org Git - lyx.git/blobdiff - src/insets/insetcite.C
more cleanup:
[lyx.git] / src / insets / insetcite.C
index ff2ee37b940a54e76c5551dc13cb6fadb63ce9d8..fcdbd0be88aed6fdadb49fbb60bdfc41cc4cc9b5 100644 (file)
@@ -15,7 +15,6 @@
 
 #include "buffer.h"
 #include "bufferparams.h"
-#include "BufferView.h"
 #include "debug.h"
 #include "dispatchresult.h"
 #include "funcrequest.h"
 
 #include "frontends/controllers/biblio.h"
 
+#include "support/fs_extras.h"
 #include "support/lstrings.h"
 
+#include <algorithm>
+
 #include <boost/filesystem/operations.hpp>
+#include <boost/filesystem/exception.hpp>
+
 
-using lyx::support::ascii_lowercase;
-using lyx::support::contains;
-using lyx::support::getVectorFromString;
-using lyx::support::ltrim;
-using lyx::support::rtrim;
-using lyx::support::split;
+namespace lyx {
+
+using support::ascii_lowercase;
+using support::contains;
+using support::FileName;
+using support::getStringFromVector;
+using support::getVectorFromString;
+using support::ltrim;
+using support::rtrim;
+using support::split;
+using support::tokenPos;
 
 using std::endl;
+using std::replace;
 using std::string;
 using std::ostream;
 using std::vector;
 using std::map;
 
-namespace biblio = lyx::biblio;
 namespace fs = boost::filesystem;
 
 
@@ -60,22 +69,29 @@ string const getNatbibLabel(Buffer const & buffer,
        static CachedMap cached_keys;
 
        // and cache the timestamp of the bibliography files.
-       static std::map<string, time_t> bibfileStatus;
+       static std::map<FileName, time_t> bibfileStatus;
 
        biblio::InfoMap infomap;
 
-       vector<string> const & bibfilesCache = buffer.getBibfilesCache();
+       vector<FileName> const & bibfilesCache = buffer.getBibfilesCache();
        // compare the cached timestamps with the actual ones.
        bool changed = false;
-       for (vector<string>::const_iterator it = bibfilesCache.begin();
+       for (vector<FileName>::const_iterator it = bibfilesCache.begin();
                        it != bibfilesCache.end(); ++ it) {
-               string const f = *it;
-               if (!fs::exists(f)) {
-                       lyxerr << "Couldn't find bibtex file " << f << endl;
-                       changed = true;
-               } else if (bibfileStatus[f] != fs::last_write_time(f)) {
+               FileName const f = *it;
+               try {
+                       std::time_t lastw = fs::last_write_time(f.toFilesystemEncoding());
+                       if (lastw != bibfileStatus[f]) {
+                               changed = true;
+                               bibfileStatus[f] = lastw;
+                       }
+               }
+               catch (fs::filesystem_error & fserr) {
                        changed = true;
-                       bibfileStatus[f] = fs::last_write_time(f);
+                       lyxerr << "Couldn't find or read bibtex file "
+                              << f << endl;
+                       lyxerr[Debug::DEBUG] << "Fs error: "
+                                            << fserr.what() << endl;
                }
        }
 
@@ -292,7 +308,7 @@ InsetCitation::InsetCitation(InsetCommandParams const & p)
 {}
 
 
-string const InsetCitation::generateLabel(Buffer const & buffer) const
+docstring const InsetCitation::generateLabel(Buffer const & buffer) const
 {
        string const before = getSecOptions();
        string const after  = getOptions();
@@ -309,11 +325,12 @@ string const InsetCitation::generateLabel(Buffer const & buffer) const
                label = getBasicLabel(getContents(), after);
        }
 
-       return label;
+       // FIXME UNICODE
+       return from_utf8(label);
 }
 
 
-string const InsetCitation::getScreenLabel(Buffer const & buffer) const
+docstring const InsetCitation::getScreenLabel(Buffer const & buffer) const
 {
        biblio::CiteEngine const engine = biblio::getEngine(buffer);
        if (cache.params == params() && cache.engine == engine)
@@ -323,11 +340,11 @@ string const InsetCitation::getScreenLabel(Buffer const & buffer) const
        string const before = getSecOptions();
        string const after  = getOptions();
 
-       string const glabel = generateLabel(buffer);
+       docstring const glabel = generateLabel(buffer);
 
        unsigned int const maxLabelChars = 45;
 
-       string label = glabel;
+       docstring label = glabel;
        if (label.size() > maxLabelChars) {
                label.erase(maxLabelChars-3);
                label += "...";
@@ -342,7 +359,8 @@ string const InsetCitation::getScreenLabel(Buffer const & buffer) const
 }
 
 
-int InsetCitation::plaintext(Buffer const & buffer, ostream & os, OutputParams const &) const
+int InsetCitation::plaintext(Buffer const & buffer, odocstream & os,
+                             OutputParams const &) const
 {
        if (cache.params == params() &&
            cache.engine == biblio::getEngine(buffer))
@@ -375,14 +393,16 @@ string const cleanupWhitespace(string const & citelist)
 // end anon namyspace
 }
 
-int InsetCitation::docbook(Buffer const &, ostream & os, OutputParams const &) const
+int InsetCitation::docbook(Buffer const &, odocstream & os, OutputParams const &) const
 {
-       os << "<citation>" << cleanupWhitespace(getContents()) << "</citation>";
+       os << "<citation>"
+           << from_ascii(cleanupWhitespace(getContents()))
+           << "</citation>";
        return 0;
 }
 
 
-int InsetCitation::textString(Buffer const & buf, ostream & os,
+int InsetCitation::textString(Buffer const & buf, odocstream & os,
                       OutputParams const & op) const
 {
        return plaintext(buf, os, op);
@@ -393,23 +413,25 @@ int InsetCitation::textString(Buffer const & buf, ostream & os,
 // the \cite command is valid. Eg, the user has natbib enabled, inputs some
 // citations and then changes his mind, turning natbib support off. The output
 // should revert to \cite[]{}
-int InsetCitation::latex(Buffer const & buffer, ostream & os,
+int InsetCitation::latex(Buffer const & buffer, odocstream & os,
                         OutputParams const &) const
 {
        biblio::CiteEngine const cite_engine = buffer.params().cite_engine;
-       string const cite_str =
-               biblio::asValidLatexCommand(getCmdName(), cite_engine);
+       // FIXME UNICODE
+       docstring const cite_str = from_utf8(
+               biblio::asValidLatexCommand(getCmdName(), cite_engine));
 
        os << "\\" << cite_str;
 
-       string const before = getSecOptions();
-       string const after  = getOptions();
+       docstring const & before = getParam("before");
+       docstring const & after  = getParam("after");
        if (!before.empty() && cite_engine != biblio::ENGINE_BASIC)
                os << '[' << before << "][" << after << ']';
        else if (!after.empty())
                os << '[' << after << ']';
 
-       os << '{' << cleanupWhitespace(getContents()) << '}';
+       // FIXME UNICODE
+       os << '{' << from_utf8(cleanupWhitespace(getContents())) << '}';
 
        return 0;
 }
@@ -429,3 +451,16 @@ void InsetCitation::validate(LaTeXFeatures & features) const
                break;
        }
 }
+
+
+void InsetCitation::replaceContents(string const & from, string const & to)
+{
+       if (tokenPos(getContents(), ',', from) != -1) {
+               vector<string> items = getVectorFromString(getContents());
+               replace(items.begin(), items.end(), from, to);
+               setContents(getStringFromVector(items));
+       }
+}
+
+
+} // namespace lyx