]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/controllers/tex_helpers.C
more unicode filenames
[lyx.git] / src / frontends / controllers / tex_helpers.C
index 3dcb62ee95ca3b01446fa574a99acd9518f2cda5..fbc78c2d78b1e023b9e8e120072aa9084662b282 100644 (file)
@@ -3,9 +3,9 @@
  * This file is part of LyX, the document processor.
  * Licence details can be found in the file COPYING.
  *
- * \author Herbert Voss
+ * \author Herbert Voß
  *
- * Full author contact details are available in file CREDITS
+ * Full author contact details are available in file CREDITS.
  */
 
 #include <config.h>
 #include "debug.h"
 #include "gettext.h"
 
+#include "frontends/Alert.h"
+
 #include "support/filetools.h"
 #include "support/lstrings.h"
-#include "support/systemcall.h"
-#include "support/path.h"
 #include "support/lyxalgo.h"
+#include "support/os.h"
+#include "support/package.h"
+#include "support/path.h"
+#include "support/systemcall.h"
 
 #include <boost/cregex.hpp>
-#include <vector>
 #include <fstream>
-#include <algorithm>
 
-using std::vector;
+using std::string;
 using std::endl;
-using std::sort;
-using std::unique;
-
-extern string user_lyxdir; // home of *Files.lst
 
+namespace lyx {
+
+using support::bformat;
+using support::contains;
+using support::FileName;
+using support::getExtension;
+using support::getFileContents;
+using support::getVectorFromString;
+using support::libFileSearch;
+using support::onlyFilename;
+using support::package;
+using support::Path;
+using support::quoteName;
+using support::split;
+using support::Systemcall;
+using support::token;
+
+namespace frontend {
 
-// build filelists of all availabe bst/cls/sty-files. done through
-// kpsewhich and an external script, saved in *Files.lst
 void rescanTexStyles()
 {
        // Run rescan in user lyx directory
-       Path p(user_lyxdir);
+       Path p(package().user_support());
+       FileName const command = libFileSearch("scripts", "TeXFiles.py");
        Systemcall one;
-       one.startscript(Systemcall::Wait,
-                       LibFileSearch("scripts", "TeXFiles.sh"));
+       int const status = one.startscript(Systemcall::Wait,
+                       lyx::support::os::python() + ' ' +
+                       quoteName(command.toFilesystemEncoding()));
+       if (status == 0)
+               return;
+       // FIXME UNICODE
+       Alert::error(_("Could not update TeX information"),
+                    bformat(_("The script `%s' failed."), lyx::from_utf8(command.absFilename())));
 }
 
 
 void texhash()
 {
        // Run texhash in user lyx directory
-       Path p(user_lyxdir);
+       Path p(package().user_support());
 
        //path to texhash through system
        Systemcall one;
@@ -60,38 +81,42 @@ void texhash()
 void getTexFileList(string const & filename, std::vector<string> & list)
 {
        list.clear();
-       string const file = LibFileSearch("", filename);
+       FileName const file = libFileSearch("", filename);
        if (file.empty())
                return;
 
-       list = getVectorFromString(GetFileContents(file), "\n");
+       list = getVectorFromString(getFileContents(file), "\n");
 
        // Normalise paths like /foo//bar ==> /foo/bar
        boost::RegEx regex("/{2,}");
        std::vector<string>::iterator it  = list.begin();
        std::vector<string>::iterator end = list.end();
        for (; it != end; ++it) {
-               *it = regex.Merge(*it, "/");
+               *it = regex.Merge((*it), "/");
        }
 
-       lyx::eliminate_duplicates(list);
+       // remove empty items and duplicates
+       list.erase(std::remove(list.begin(), list.end(), ""), list.end());
+       eliminate_duplicates(list);
 }
 
 
 string const getListOfOptions(string const & classname, string const & type)
 {
-       string const filename = getTexFileFromList(classname,type);
+       FileName const filename(getTexFileFromList(classname, type));
+       if (filename.empty())
+               return string();
        string optionList = string();
-       std::ifstream is(filename.c_str());
+       std::ifstream is(filename.toFilesystemEncoding().c_str());
        while (is) {
-           string s;
-           is >> s;
-           if (contains(s,"DeclareOption")) {
-               s = s.substr(s.find("DeclareOption"));
-               s = split(s,'{');               // cut front
-               s = token(s,'}',0);             // cut end
-               optionList += (s + '\n');
-           }
+               string s;
+               is >> s;
+               if (contains(s,"DeclareOption")) {
+                       s = s.substr(s.find("DeclareOption"));
+                       s = split(s,'{');               // cut front
+                       s = token(s,'}',0);             // cut end
+                       optionList += (s + '\n');
+               }
        }
        return optionList;
 }
@@ -100,19 +125,33 @@ string const getListOfOptions(string const & classname, string const & type)
 string const getTexFileFromList(string const & file,
                            string const & type)
 {
-       string const file_ = (type == "cls") ? file + ".cls" : file + ".sty";
-
-       lyxerr << "Search for classfile " << file_ << endl;
-
-       string const lstfile =
-               ((type == "cls") ? "clsFiles.lst" : "styFiles.lst");
-       string const allClasses = GetFileContents(LibFileSearch(string(),
-                                                               lstfile));
+       string file_ = file;
+       // do we need to add the suffix?
+       if (!(getExtension(file) == type))
+               file_ += '.' + type;
+
+       lyxerr << "Searching for file " << file_ << endl;
+
+       string lstfile;
+       if (type == "cls")
+               lstfile = "clsFiles.lst";
+       else if (type == "sty")
+               lstfile = "styFiles.lst";
+       else if (type == "bst")
+               lstfile = "bstFiles.lst";
+       else if (type == "bib")
+               lstfile = "bibFiles.lst";
+       FileName const abslstfile = libFileSearch(string(), lstfile);
+       if (abslstfile.empty()) {
+               lyxerr << "File `'" << lstfile << "' not found." << endl;
+               return string();
+       }
+       string const allClasses = getFileContents(abslstfile);
        int entries = 0;
        string classfile = token(allClasses, '\n', entries);
        int count = 0;
        while ((!contains(classfile, file) ||
-               (OnlyFilename(classfile) != file)) &&
+               (onlyFilename(classfile) != file)) &&
                (++count < 1000)) {
                classfile = token(allClasses, '\n', ++entries);
        }
@@ -122,3 +161,6 @@ string const getTexFileFromList(string const & file,
 
        return classfile;
 }
+
+} // namespace frontend
+} // namespace lyx