3 * This file is part of LyX, the document processor.
4 * Licence details can be found in the file COPYING.
7 * \author Alfredo Braunstein
8 * \author Lars Gullik Bjønnes
9 * \author Jean Marc Lasgouttes
10 * \author Angus Leeming
12 * \author André Pönitz
14 * Full author contact details are available in file CREDITS.
22 #include "buffer_funcs.h"
23 #include "converter.h"
26 #include "latexrunparams.h"
29 #include "frontends/Alert.h"
31 #include "support/filetools.h"
33 using namespace lyx::support;
42 vector<string> const Backends(Buffer const & buffer)
45 if (buffer.params.getLyXTextClass().isTeXClassAvailable())
46 v.push_back(BufferFormat(buffer));
54 bool Exporter::Export(Buffer * buffer, string const & format,
55 bool put_in_tempdir, string & result_file)
57 string backend_format;
58 LatexRunParams runparams;
59 runparams.flavor = LatexRunParams::LATEX;
60 vector<string> backends = Backends(*buffer);
61 if (find(backends.begin(), backends.end(), format) == backends.end()) {
62 for (vector<string>::const_iterator it = backends.begin();
63 it != backends.end(); ++it) {
65 converters.getPath(*it, format);
67 if (converters.usePdflatex(p))
68 runparams.flavor = LatexRunParams::PDFLATEX;
73 if (backend_format.empty()) {
74 Alert::error(_("Couldn't export file"),
75 bformat(_("No information for exporting the format %1$s."),
76 formats.prettyName(format)));
80 backend_format = format;
82 string filename = buffer->getLatexName(false);
83 if (!buffer->tmppath.empty())
84 filename = AddName(buffer->tmppath, filename);
85 filename = ChangeExtension(filename,
86 formats.extension(backend_format));
89 if (backend_format == "text")
90 buffer->writeFileAscii(filename, lyxrc.ascii_linelen);
92 else if (buffer->isLinuxDoc())
93 buffer->makeLinuxDocFile(filename, !put_in_tempdir);
95 else if (buffer->isDocBook())
96 buffer->makeDocBookFile(filename, !put_in_tempdir);
98 else if (backend_format == format) {
99 runparams.nice = true;
100 buffer->makeLaTeXFile(filename, string(), runparams);
101 } else if (contains(buffer->filePath(), ' ')) {
102 Alert::error(_("File name error"),
103 _("The directory path to the document cannot contain spaces."));
106 runparams.nice = false;
107 buffer->makeLaTeXFile(filename, buffer->filePath(), runparams);
110 string outfile_base = (put_in_tempdir)
111 ? filename : buffer->getLatexName(false);
113 if (!converters.convert(buffer, filename, outfile_base,
114 backend_format, format, result_file))
118 buffer->message(_("Document exported as ")
119 + formats.prettyName(format)
121 + MakeDisplayPath(result_file) +'\'');
126 bool Exporter::Export(Buffer * buffer, string const & format,
130 return Export(buffer, format, put_in_tempdir, result_file);
134 bool Exporter::Preview(Buffer * buffer, string const & format)
137 if (!Export(buffer, format, true, result_file))
139 return formats.view(*buffer, result_file, format);
143 bool Exporter::IsExportable(Buffer const & buffer, string const & format)
145 vector<string> backends = Backends(buffer);
146 for (vector<string>::const_iterator it = backends.begin();
147 it != backends.end(); ++it)
148 if (converters.isReachable(*it, format))
154 vector<Format const *> const
155 Exporter::GetExportableFormats(Buffer const & buffer, bool only_viewable)
157 vector<string> backends = Backends(buffer);
158 vector<Format const *> result =
159 converters.getReachable(backends[0], only_viewable, true);
160 for (vector<string>::const_iterator it = backends.begin() + 1;
161 it != backends.end(); ++it) {
162 vector<Format const *> r =
163 converters.getReachable(*it, only_viewable, false);
164 result.insert(result.end(), r.begin(), r.end());