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 "bufferparams.h"
24 #include "converter.h"
27 #include "latexrunparams.h"
30 #include "frontends/Alert.h"
32 #include "support/filetools.h"
34 using namespace lyx::support;
43 vector<string> const Backends(Buffer const & buffer)
46 if (buffer.params().getLyXTextClass().isTeXClassAvailable())
47 v.push_back(BufferFormat(buffer));
55 bool Exporter::Export(Buffer * buffer, string const & format,
56 bool put_in_tempdir, string & result_file)
58 string backend_format;
59 LatexRunParams runparams;
60 runparams.flavor = LatexRunParams::LATEX;
61 vector<string> backends = Backends(*buffer);
62 if (find(backends.begin(), backends.end(), format) == backends.end()) {
63 for (vector<string>::const_iterator it = backends.begin();
64 it != backends.end(); ++it) {
66 converters.getPath(*it, format);
68 if (converters.usePdflatex(p))
69 runparams.flavor = LatexRunParams::PDFLATEX;
74 if (backend_format.empty()) {
75 Alert::error(_("Couldn't export file"),
76 bformat(_("No information for exporting the format %1$s."),
77 formats.prettyName(format)));
81 backend_format = format;
83 string filename = buffer->getLatexName(false);
84 if (!buffer->temppath().empty())
85 filename = AddName(buffer->temppath(), filename);
86 filename = ChangeExtension(filename,
87 formats.extension(backend_format));
90 if (backend_format == "text")
91 buffer->writeFileAscii(filename, lyxrc.ascii_linelen);
93 else if (buffer->isLinuxDoc())
94 buffer->makeLinuxDocFile(filename, !put_in_tempdir);
96 else if (buffer->isDocBook())
97 buffer->makeDocBookFile(filename, !put_in_tempdir);
99 else if (backend_format == format) {
100 runparams.nice = true;
101 buffer->makeLaTeXFile(filename, string(), runparams);
102 } else if (contains(buffer->filePath(), ' ')) {
103 Alert::error(_("File name error"),
104 _("The directory path to the document cannot contain spaces."));
107 runparams.nice = false;
108 buffer->makeLaTeXFile(filename, buffer->filePath(), runparams);
111 string outfile_base = (put_in_tempdir)
112 ? filename : buffer->getLatexName(false);
114 if (!converters.convert(buffer, filename, outfile_base,
115 backend_format, format, result_file))
119 buffer->message(_("Document exported as ")
120 + formats.prettyName(format)
122 + MakeDisplayPath(result_file) +'\'');
127 bool Exporter::Export(Buffer * buffer, string const & format,
131 return Export(buffer, format, put_in_tempdir, result_file);
135 bool Exporter::Preview(Buffer * buffer, string const & format)
138 if (!Export(buffer, format, true, result_file))
140 return formats.view(*buffer, result_file, format);
144 bool Exporter::IsExportable(Buffer const & buffer, string const & format)
146 vector<string> backends = Backends(buffer);
147 for (vector<string>::const_iterator it = backends.begin();
148 it != backends.end(); ++it)
149 if (converters.isReachable(*it, format))
155 vector<Format const *> const
156 Exporter::GetExportableFormats(Buffer const & buffer, bool only_viewable)
158 vector<string> backends = Backends(buffer);
159 vector<Format const *> result =
160 converters.getReachable(backends[0], only_viewable, true);
161 for (vector<string>::const_iterator it = backends.begin() + 1;
162 it != backends.end(); ++it) {
163 vector<Format const *> r =
164 converters.getReachable(*it, only_viewable, false);
165 result.insert(result.end(), r.begin(), r.end());