lyx_mirror/src/Converter.h
Enrico Forestieri 99fe8ef2ba Use the right latex backend when a converter needs aux files.
If a converter specifies the needaux flag, latex (or xelatex) is
always run to produce the needed auxiliary files. This is wrong
because there are documents that can only be compiled with a specific
backend and thus the conversion may fail. On the other hand, even if
the document specifies the backend to be used, LyX ignores this info.

This commit rectifies this behavior by letting LyX run the same flavor
of the latex backend that shall be used for previewing the document
also for producing the auxiliary files.

(cherry picked from commit 3285ce1d5c)

Conflicts:

	src/Converter.cpp
2012-04-11 20:32:27 +02:00

189 lines
4.8 KiB
C++

// -*- C++ -*-
/**
* \file Converter.h
* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
* \author Dekel Tsur
*
* Full author contact details are available in file CREDITS.
*/
#ifndef CONVERTER_H
#define CONVERTER_H
#include "Graph.h"
#include "OutputParams.h"
#include <vector>
#include <set>
#include <string>
namespace lyx {
namespace support { class FileName; }
class Buffer;
class ErrorList;
class Format;
class Formats;
class OutputParams;
///
class Converter {
public:
///
Converter(std::string const & f, std::string const & t, std::string const & c,
std::string const & l);
///
void readFlags();
///
std::string from;
///
std::string to;
///
std::string command;
///
std::string flags;
///
Format const * From;
///
Format const * To;
/// The converter is latex or its derivatives
bool latex;
/// The latex derivate
std::string latex_flavor;
/// The converter is xml
bool xml;
/// This converter needs the .aux files
bool need_aux;
/// If the converter put the result in a directory, then result_dir
/// is the name of the directory
std::string 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;
/// Command to convert the program output to a LaTeX log file format
std::string parselog;
};
///
class Converters {
public:
///
typedef std::vector<Converter> ConverterList;
///
typedef ConverterList::const_iterator const_iterator;
///
typedef std::vector<std::string> FormatList;
///
Converter const & get(int i) const { return converterlist_[i]; }
///
Converter const * getConverter(std::string const & from,
std::string const & to) const;
///
int getNumber(std::string const & from, std::string const & to) const;
///
void add(std::string const & from, std::string const & to,
std::string const & command, std::string const & flags);
//
void erase(std::string const & from, std::string const & to);
///
void sort();
///
std::vector<Format const *> const
getReachableTo(std::string const & target, bool clear_visited);
///
std::vector<Format const *> const
getReachable(std::string const & from, bool only_viewable,
bool clear_visited,
std::set<std::string> const & excludes = std::set<std::string>());
std::vector<Format const *> importableFormats();
std::vector<Format const *> exportableFormats(bool only_viewable);
std::vector<std::string> loaders() const;
std::vector<std::string> savers() const;
/// Does a conversion path from format \p from to format \p to exist?
bool isReachable(std::string const & from, std::string const & to);
///
Graph::EdgePath getPath(std::string const & from, std::string const & to);
///
OutputParams::FLAVOR getFlavor(Graph::EdgePath const & path,
Buffer const * buffer = 0);
/// Flags for converting files
enum ConversionFlags {
/// No special flags
none = 0,
/// Use the default converter if no converter is defined
try_default = 1 << 0,
/// Get the converted file from cache if possible
try_cache = 1 << 1
};
///
bool 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);
///
void update(Formats const & formats);
///
void updateLast(Formats const & formats);
///
bool formatIsUsed(std::string const & format);
///
const_iterator begin() const { return converterlist_.begin(); }
///
const_iterator end() const { return converterlist_.end(); }
///
void buildGraph();
private:
///
std::vector<Format const *> const
intToFormat(std::vector<int> 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,
OutputParams const &, ErrorList & errorList);
///
ConverterList converterlist_;
///
std::string latex_command_;
///
std::string dvilualatex_command_;
///
std::string lualatex_command_;
///
std::string pdflatex_command_;
///
std::string 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,
support::FileName const & from, support::FileName const & to,
bool copy);
///
Graph G_;
};
/// The global instance.
/// Implementation is in LyX.cpp.
extern Converters & theConverters();
/// The global copy after reading lyxrc.defaults.
/// Implementation is in LyX.cpp.
extern Converters & theSystemConverters();
} // namespace lyx
#endif //CONVERTER_H