X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FConverter.h;h=091dbcd394e4b8075f3d4d04af6ad279c96a3d7d;hb=6f7b39f84299660586b0485713d9672279ebe226;hp=f4c8458674deed0369c0da3d271570ea385a07a8;hpb=288c1e0faad85d4b0f17e366cb5c44473a133957;p=features.git diff --git a/src/Converter.h b/src/Converter.h index f4c8458674..091dbcd394 100644 --- a/src/Converter.h +++ b/src/Converter.h @@ -13,7 +13,7 @@ #define CONVERTER_H #include "Graph.h" -#include "OutputParams.h" +#include "support/trivstring.h" #include #include @@ -30,6 +30,18 @@ class Format; class Formats; class OutputParams; +enum class Flavor : int; + +class ConversionException : public std::exception { +public: + ConversionException() {} + virtual ~ConversionException() noexcept {} + const char * what() const noexcept override + { return "Exception caught in conversion routine!"; } +}; + + +typedef std::vector FormatList; /// class Converter { @@ -40,36 +52,82 @@ public: /// void readFlags(); /// - std::string from; + std::string const from() const { return from_; } + /// + std::string const to() const { return to_; } + /// + std::string const command() const { return command_; } + /// + void setCommand(std::string const & command); + /// + std::string const flags() const { return flags_; } + /// + void setFlags(std::string const & flags) { flags_ = flags; } + /// + Format const * From() const { return From_; } + /// + void setFrom(Format const * From) { From_ = From; } + /// + void setTo(Format const * To) { To_ = To; } + /// + Format const * To() const { return To_; } + /// + bool latex() const { return latex_; } + /// + std::string const latex_flavor() const { return latex_flavor_; } /// - std::string to; + bool docbook() const { return docbook_; } /// - std::string command; + bool need_aux() const { return need_aux_; } + /// Return whether or not the needauth option is set for this converter + bool need_auth() const { return need_auth_; } /// - std::string flags; + bool nice() const { return nice_; } /// - Format const * From; + std::string const result_dir() const { return result_dir_; } /// - Format const * To; + std::string const result_file() const { return result_file_; } + /// + std::string const parselog() const { return parselog_; } + /// + std::string const hyperref_driver() const { return href_driver_; } + +private: + /// + trivstring from_; + /// + trivstring to_; + /// + trivstring command_; + /// + trivstring flags_; + /// + Format const * From_; + /// + Format const * To_; /// The converter is latex or its derivatives - bool latex; + bool latex_; /// The latex derivate - std::string latex_flavor; - /// The converter is xml - bool xml; + trivstring latex_flavor_; + /// The converter is DocBook + bool docbook_; /// This converter needs the .aux files - bool need_aux; - /// we need a "nice" file from the backend - bool nice; + bool need_aux_; + /// we need a "nice" file from the backend, c.f. OutputParams.nice. + bool nice_; + /// Use of this converter needs explicit user authorization + bool need_auth_; /// If the converter put the result in a directory, then result_dir /// is the name of the directory - std::string result_dir; + trivstring result_dir_; /// If the converter put the result in a directory, then result_file /// is the name of the main file in that directory - std::string result_file; + trivstring result_file_; /// Command to convert the program output to a LaTeX log file format - std::string parselog; + trivstring parselog_; + /// The hyperref driver + trivstring href_driver_; }; @@ -80,8 +138,12 @@ public: typedef std::vector ConverterList; /// typedef ConverterList::const_iterator const_iterator; - /// - typedef std::vector FormatList; + /// Return values for converter runs + enum RetVal { + SUCCESS = 0, + FAILURE = 1, + KILLED = 1000 + }; /// Converter const & get(int i) const { return converterlist_[i]; } @@ -96,16 +158,16 @@ public: // void erase(std::string const & from, std::string const & to); /// - std::vector const - getReachableTo(std::string const & target, bool clear_visited); + FormatList const + getReachableTo(std::string const & target, bool clear_visited); /// - std::vector const - getReachable(std::string const & from, bool only_viewable, - bool clear_visited, - std::set const & excludes = std::set()); + FormatList const + getReachable(std::string const & from, bool only_viewable, + bool clear_visited, + std::set const & excludes = std::set()); - std::vector importableFormats(); - std::vector exportableFormats(bool only_viewable); + FormatList importableFormats(); + FormatList exportableFormats(bool only_viewable); std::vector loaders() const; std::vector savers() const; @@ -115,8 +177,10 @@ public: /// Graph::EdgePath getPath(std::string const & from, std::string const & to); /// - OutputParams::FLAVOR getFlavor(Graph::EdgePath const & path, - Buffer const * buffer = 0); + Flavor getFlavor(Graph::EdgePath const & path, + Buffer const * buffer = nullptr) const; + /// + std::string getHyperrefDriver(Graph::EdgePath const & path) const; /// Flags for converting files enum ConversionFlags { /// No special flags @@ -127,45 +191,61 @@ public: try_cache = 1 << 1 }; /// - bool convert(Buffer const * buffer, + RetVal convert(Buffer const * buffer, support::FileName const & from_file, support::FileName const & to_file, support::FileName const & orig_from, std::string const & from_format, std::string const & to_format, - ErrorList & errorList, int conversionflags = none); + ErrorList & errorList, int conversionflags = none, bool includeall = false); /// void update(Formats const & formats); /// void updateLast(Formats const & formats); /// - bool formatIsUsed(std::string const & format); + bool formatIsUsed(std::string const & format) const; /// const_iterator begin() const { return converterlist_.begin(); } /// const_iterator end() const { return converterlist_.end(); } /// void buildGraph(); + + /// Check whether converter conv is authorized to be run for elements + /// within document doc_fname. + /// The check succeeds for safe converters, whilst for those potentially + /// able to execute arbitrary code, tagged with the 'needauth' option, + /// authorization is: always denied if lyxrc.use_converter_needauth_forbidden + /// is enabled; always allowed if the lyxrc.use_converter_needauth + /// is disabled; user is prompted otherwise. + /// However, if use_shell_escape is true and a LaTeX backend is + /// going to be executed, both lyxrc.use_converter_needauth and + /// lyxrc.use_converter_needauth_forbidden are ignored, because in + /// this case the backend has to be executed and LyX will add the + /// -shell-escape option, so that user consent is always needed. + bool checkAuth(Converter const & conv, std::string const & doc_fname, + bool use_shell_escape = false); + private: /// - std::vector const + FormatList const intToFormat(std::vector const & input); /// bool scanLog(Buffer const & buffer, std::string const & command, support::FileName const & filename, ErrorList & errorList); /// - bool runLaTeX(Buffer const & buffer, std::string const & command, + RetVal runLaTeX(Buffer const & buffer, std::string const & command, OutputParams const &, ErrorList & errorList); /// ConverterList converterlist_; /// - std::string latex_command_; + trivstring latex_command_; /// - std::string dvilualatex_command_; + trivstring dvilualatex_command_; /// - std::string lualatex_command_; + trivstring lualatex_command_; /// - std::string pdflatex_command_; + trivstring pdflatex_command_; /// - std::string xelatex_command_; + trivstring xelatex_command_; /// If \p from = /path/file.ext and \p to = /path2/file2.ext2 then /// this method moves each /path/file*.ext file to /path2/file2*.ext2 bool move(std::string const & fmt,