]> git.lyx.org Git - lyx.git/blobdiff - src/support/filetools.h
Add acmart template
[lyx.git] / src / support / filetools.h
index 3d2eb15bfea11642258a42265966f0065cb72beb..5177cdddee81ade1ced639a892c1225d36c5a6cb 100644 (file)
@@ -4,7 +4,7 @@
  * This file is part of LyX, the document processor.
  * Licence details can be found in the file COPYING.
  *
- * \author Lars Gullik Bjønnes
+ * \author Lars Gullik Bjønnes
  *
  * Full author contact details are available in file CREDITS.
  */
 #define LYX_FILETOOL_H
 
 #include "support/docstring.h"
-#include "support/filename.h"
 
-#include <vector>
 #include <utility>
 #include <string>
 
 namespace lyx {
 namespace support {
 
-/// remove directory and all contents, returns true on success
-bool destroyDir(std::string const & tmpdir);
-
-/// Creates the per buffer temporary directory
-std::string const createBufferTmpDir();
-
-/// Creates directory. Returns true on success
-bool createDirectory(std::string const & name, int permissions);
+class FileName;
 
 /** Creates the global LyX temp dir.
   \p deflt can be an existing directory name. In this case a new directory
@@ -39,6 +30,8 @@ bool createDirectory(std::string const & name, int permissions);
  */
 FileName const createLyXTmpDir(FileName const & deflt);
 
+#if 0
+// FIXME unused. Should this be deleted or resurrected?
 /** Find file by searching several directories.
   Uses a string of paths separated by ";"s to find a file to open.
     Can't cope with pathnames with a ';' in them. Returns full path to file.
@@ -49,6 +42,21 @@ FileName const createLyXTmpDir(FileName const & deflt);
 FileName const fileOpenSearch(std::string const & path,
                                 std::string const & name,
                                 std::string const & ext = std::string());
+#endif
+
+/// How to search files
+enum search_mode {
+       /// The file must exist (return an empty file name otherwise)
+       must_exist,
+       /// Only do file name expansion, return the complete name even if
+       /// the file does not exist
+       may_not_exist,
+       /// The (image) file may be present with hi-dpi resolution -
+       /// the lookup checks for a file named "image" + "@2x" + ".ext" first.
+       /// If found it will return e.g. "image@2x.png" instead of "image.png".
+       /// Otherwise it will work as must_exist.
+       check_hidpi
+};
 
 /** Returns the real name of file name in directory path, with optional
   extension ext.
@@ -57,29 +65,26 @@ FileName const fileOpenSearch(std::string const & path,
   */
 FileName const fileSearch(std::string const & path,
                             std::string const & name,
-                            std::string const & ext = std::string());
+                            std::string const & ext = std::string(),
+                            search_mode mode = must_exist);
 
-/// Returns a vector of all files in directory dir having extension ext.
-std::vector<std::string> const dirList(std::string const & dir,
-                                      std::string const & ext = std::string());
+///
+bool isLyXFileName(std::string const & filename);
 
-/** Is directory read only?
-  returns
-    true: dir writeable
-    false: not writeable
-*/
-bool isDirWriteable(std::string const & path);
+///
+bool isSGMLFileName(std::string const & filename);
 
-/** Is a file readable ?
-  Returns true if the file `path' is readable.
- */
-bool isFileReadable(FileName const & path);
+/// check for characters in filenames not allowed by LaTeX
+bool isValidLaTeXFileName(std::string const & filename);
 
-///
-bool isLyXFilename(std::string const & filename);
+/** check for characters in filenames that might lead to
+  problems when manually compiling the LaTeX export of LyX
+  and opening the result with some older DVI-viewers
+*/
+bool isValidDVIFileName(std::string const & filename);
 
-///
-bool isSGMLFilename(std::string const & filename);
+/// check whether the file has binary contents
+bool isBinaryFile(FileName const & filename);
 
 /** Returns the path of a library data file.
     Search the file name.ext in the subdirectory dir of
@@ -90,7 +95,8 @@ bool isSGMLFilename(std::string const & filename);
 */
 FileName const libFileSearch(std::string const & dir,
                                std::string const & name,
-                               std::string const & ext = std::string());
+                               std::string const & ext = std::string(),
+                               search_mode mode = must_exist);
 
 /** Same as libFileSearch(), but tries first to find an
   internationalized version of the file by prepending $LANG_ to the
@@ -101,11 +107,22 @@ i18nLibFileSearch(std::string const & dir,
                  std::string const & name,
                  std::string const & ext = std::string());
 
+/** Same as libFileSearch(), but tries first to find a preferred
+  version of the file by appending the icon set name to the dir
+  */
+FileName const
+imageLibFileSearch(std::string & dir, std::string const & name,
+                  std::string const & ext = std::string(),
+                  search_mode mode = must_exist);
+
 /// How to quote a filename
 enum quote_style {
        /** Quote for the (OS dependant) shell. This is needed for command
            line arguments of subprocesses. */
        quote_shell,
+       /** Quote a file name for the (OS dependant) shell. This is needed
+           for file names as command line arguments of subprocesses. */
+       quote_shell_filename,
        /** Quote for python. Use this if you want to store a filename in a
            python script. Example: \code
            os << "infile = " << quoteName(filename) << '\\n';
@@ -121,8 +138,7 @@ enum quote_style {
  *  command will still fail, but the error message will make some sort of
  *  sense ;-)
  */
-std::string const libScriptSearch(std::string const & command,
-               quote_style style = quote_shell);
+std::string const commandPrep(std::string const & command);
 
 enum latex_path_extension {
        PROTECT_EXTENSION,
@@ -158,7 +174,7 @@ std::string const latex_path(std::string const & path,
                latex_path_dots dots = LEAVE_DOTS);
 
 /// Substitutes active latex characters with underscores in filename
-std::string const makeLatexName(std::string const & file);
+FileName const makeLatexName(FileName const & file);
 
 /** Put the name in quotes suitable for the current shell or python,
     depending on \p style. */
@@ -180,17 +196,16 @@ changeExtension(std::string const & oldname, std::string const & extension);
 /// Remove the extension from \p name
 std::string const removeExtension(std::string const & name);
 
-/// Return the extension of the file (not including the .)
-std::string const getExtension(std::string const & name);
-
-/** Guess the file format name (as in Format::name()) from contents.
- Normally you don't want to use this directly, but rather
- Formats::getFormatFromFile().
+/** Add the extension \p ext to \p name.
+ Use this instead of changeExtension if you know that \p name is without
+ extension, because changeExtension would wrongly interpret \p name if it
+ contains a dot.
  */
-std::string const getFormatFromContents(FileName const & name);
+std::string const
+addExtension(std::string const & name, std::string const & extension);
 
-/// check for zipped file
-bool zippedFile(FileName const & name);
+/// Return the extension of the file (not including the .)
+std::string const getExtension(std::string const & name);
 
 /** \return the name that LyX will give to the unzipped file \p zipped_file
   if the second argument of unzipFile() is empty.
@@ -203,19 +218,13 @@ std::string const unzippedFileName(std::string const & zipped_file);
   Will overwrite an already existing unzipped file without warning.
  */
 FileName const unzipFile(FileName const & zipped_file,
-                         std::string const & unzipped_file = std::string());
-
-/// Returns true is path is absolute
-bool absolutePath(std::string const & path);
-
-/// Create absolute path. If impossible, don't do anything
-std::string const expandPath(std::string const & path);
+                        std::string const & unzipped_file = std::string());
 
 /** Convert relative path into absolute path based on a basepath.
   If relpath is absolute, just use that.
   If basepath doesn't exist use CWD.
   */
-std::string const makeAbsPath(std::string const & RelPath = std::string(),
+FileName const makeAbsPath(std::string const & RelPath = std::string(),
                              std::string const & BasePath = std::string());
 
 /** Creates a nice compact path for displaying. The parameter
@@ -231,22 +240,14 @@ makeDisplayPath(std::string const & path, unsigned int threshold = 1000);
   different, then the absolute path will be used as relative path
   WARNING: the absolute path and base path must really be absolute paths!!!
   */
-std::string const
-makeRelPath(std::string const & abspath, std::string const & basepath);
+docstring const
+makeRelPath(docstring const & abspath, docstring const & basepath);
 
 /// Strip filename from path name
 std::string const onlyPath(std::string const & fname);
 
-/** Normalize a path. Constracts path/../path
- *  Also converts paths like /foo//bar ==> /foo/bar
- */
-std::string const normalizePath(std::string const & path);
-
 /// Strips path from filename
-std::string const onlyFilename(std::string const & fname);
-
-/// Get the contents of a file as a huge std::string
-std::string const getFileContents(FileName const & fname);
+std::string const onlyFileName(std::string const & fname);
 
 /** Check and Replace Environmentvariables ${NAME} in Path.
     Replaces all occurences of these, if they are found in the
@@ -255,22 +256,33 @@ std::string const getFileContents(FileName const & fname);
 */
 std::string const replaceEnvironmentPath(std::string const & path);
 
-/* Set \c link to the path \c file points to as a symbolic link.
-   If \c resolve is true, then \c link is an absolute path
-   Returns true if successful */
-bool readLink(std::string const & file,
-             std::string & link,
-             bool resolve = false);
+/**
+   Return a string to be used as a prefix to a command for setting the
+   environment of the TeX engine with respect to the paths \p path and \p lpath.
+ */
+std::string latexEnvCmdPrefix(std::string const &path, std::string const & lpath);
 
-/// Uses kpsewhich to find tex files
-std::string const findtexfile(std::string const & fil,
-                             std::string const & format);
+/** Replace all references to a current directory (a lonely '.' or
+    the prefix "./") in \c pathlist with \c path. Also prefixes
+    all non-absolute paths with \c path.
+*/
+std::string const replaceCurdirPath(std::string const & path, std::string const & pathlist);
 
-/// remove the autosave-file and give a Message if it can't be done
-void removeAutosaveFile(std::string const & filename);
+/** Set \c link to the path \c file points to as a symbolic link.
+    \return true if successful.
+ */
+bool readLink(FileName const & file, FileName & link);
 
-/// read the BoundingBox entry from a ps/eps/pdf-file
-std::string const readBB_from_PSFile(FileName const & file);
+/**
+ * Search a TeX file in all locations the latex compiler would search it,
+ * with the help of kpsewhich.
+ * The current working directory must be set correctly, so that relative
+ * names work.
+ * \param fil The filename to search
+ * \param format The file format as used by kpsewhich, e.g. "bib", "bst" etc.
+ */
+FileName const findtexfile(std::string const & fil,
+                             std::string const & format);
 
 /** \param file1, file2 the two files to be compared. Must have absolute paths.
  *  \returns 1 if \c file1 has a more recent timestamp than \c file2,
@@ -281,11 +293,23 @@ std::string const readBB_from_PSFile(FileName const & file);
  */
 int compare_timestamps(FileName const & file1, FileName const & file2);
 
+/// \param lfuns: true if we're converting lfuns, false if prefs
+bool prefs2prefs(FileName const & filename, FileName const & tempfile,
+                 bool lfuns);
+
+/// Does file \p file need to be updated by configure.py?
+bool configFileNeedsUpdate(std::string const & file);
+
 typedef std::pair<int, std::string> cmd_ret;
 
 cmd_ret const runCommand(std::string const & cmd);
 
+int fileLock(const char * lock_file);
+void fileUnlock(int fd, const char * lock_file);
+
 } // namespace support
 } // namespace lyx
 
+
+
 #endif