X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FConverter.cpp;h=e674fc9d484cef2d4ccafc013bdea806acf3dcca;hb=0362c6aae73c293d1c20277c12d362acfe0b2ef6;hp=65189d41a11a09de9bfecdfb3bda5953961634fd;hpb=b025e9a2495415ec9a8120abc182d89be6c8b96c;p=lyx.git diff --git a/src/Converter.cpp b/src/Converter.cpp index 65189d41a1..e674fc9d48 100644 --- a/src/Converter.cpp +++ b/src/Converter.cpp @@ -16,53 +16,30 @@ #include "Buffer.h" #include "buffer_funcs.h" #include "BufferParams.h" -#include "debug.h" #include "ErrorList.h" #include "Format.h" -#include "gettext.h" #include "Language.h" #include "LaTeX.h" #include "Mover.h" #include "frontends/alert.h" +#include "support/debug.h" +#include "support/FileNameList.h" #include "support/filetools.h" -#include "support/lyxlib.h" +#include "support/FileZipListDir.h" +#include "support/gettext.h" +#include "support/lstrings.h" #include "support/os.h" +#include "support/Package.h" #include "support/Path.h" #include "support/Systemcall.h" +using namespace std; +using namespace lyx::support; namespace lyx { -using support::addName; -using support::bformat; -using support::changeExtension; -using support::compare_ascii_no_case; -using support::contains; -using support::dirList; -using support::FileName; -using support::getExtension; -using support::isFileReadable; -using support::libFileSearch; -using support::libScriptSearch; -using support::makeAbsPath; -using support::makeRelPath; -using support::onlyFilename; -using support::onlyPath; -using support::prefixIs; -using support::quoteName; -using support::removeExtension; -using support::split; -using support::subst; -using support::Systemcall; - -using std::endl; -using std::find_if; -using std::string; -using std::vector; -using std::distance; - namespace Alert = lyx::frontend::Alert; @@ -88,8 +65,8 @@ string const dvipdfm_options(BufferParams const & bp) string result; if (bp.papersize != PAPER_CUSTOM) { - string const paper_size = bp.paperSizeName(); - if (paper_size != "b5" && paper_size != "foolscap") + string const paper_size = bp.paperSizeName(BufferParams::DVIPDFM); + if (!paper_size.empty()) result = "-p "+ paper_size; if (bp.orientation == ORIENTATION_LANDSCAPE) @@ -100,7 +77,7 @@ string const dvipdfm_options(BufferParams const & bp) } -class ConverterEqual : public std::binary_function { +class ConverterEqual { public: ConverterEqual(string const & from, string const & to) : from_(from), to_(to) {} @@ -119,7 +96,7 @@ Converter::Converter(string const & f, string const & t, string const & c, string const & l) : from(f), to(t), command(c), flags(l), From(0), To(0), latex(false), xml(false), - original_dir(false), need_aux(false) + need_aux(false) {} @@ -134,8 +111,6 @@ void Converter::readFlags() latex = true; else if (flag_name == "xml") xml = true; - else if (flag_name == "originaldir") - original_dir = true; else if (flag_name == "needaux") need_aux = true; else if (flag_name == "resultdir") @@ -311,19 +286,17 @@ bool Converters::convert(Buffer const * buffer, formats.extension(from_format); string const to_ext = formats.extension(to_format); string const command = - support::os::python() + ' ' + + os::python() + ' ' + quoteName(libFileSearch("scripts", "convertDefault.py").toFilesystemEncoding()) + ' ' + quoteName(from_ext + ':' + from_file.toFilesystemEncoding()) + ' ' + quoteName(to_ext + ':' + to_file.toFilesystemEncoding()); - LYXERR(Debug::FILES) - << "No converter defined! " - "I use convertDefault.py:\n\t" - << command << endl; + LYXERR(Debug::FILES, "No converter defined! " + "I use convertDefault.py:\n\t" << command); Systemcall one; one.startscript(Systemcall::Wait, command); - if (isFileReadable(to_file)) { + if (to_file.isReadableFile()) { if (conversionflags & try_cache) ConverterCache::get().add(orig_from, to_format, to_file); @@ -351,7 +324,7 @@ bool Converters::convert(Buffer const * buffer, string const path(onlyPath(from_file.absFilename())); // Prevent the compiler from optimizing away p FileName pp(path); - support::Path p(pp); + PathChanger p(pp); // empty the error list before any new conversion takes place. errorList.clear(); @@ -365,9 +338,10 @@ bool Converters::convert(Buffer const * buffer, cit != edgepath.end(); ++cit) { Converter const & conv = converterlist_[*cit]; bool dummy = conv.To->dummy() && conv.to != "program"; - if (!dummy) - LYXERR(Debug::FILES) << "Converting from " - << conv.from << " to " << conv.to << endl; + if (!dummy) { + LYXERR(Debug::FILES, "Converting from " + << conv.from << " to " << conv.to); + } infile = outfile; outfile = FileName(conv.result_dir.empty() ? changeExtension(from_file.absFilename(), conv.To->extension()) @@ -381,31 +355,33 @@ bool Converters::convert(Buffer const * buffer, FileName real_outfile; if (outfile == infile) { real_outfile = infile; - outfile = FileName(addName(buffer->temppath(), "tmpfile.out")); + // when importing, a buffer does not necessarily exist + if (buffer) + outfile = FileName(addName(buffer->temppath(), "tmpfile.out")); + else + outfile = FileName(addName(package().temp_dir().absFilename(), + "tmpfile.out")); } if (conv.latex) { run_latex = true; string const command = subst(conv.command, token_from, ""); - LYXERR(Debug::FILES) << "Running " << command << endl; + LYXERR(Debug::FILES, "Running " << command); if (!runLaTeX(*buffer, command, runparams, errorList)) return false; } else { if (conv.need_aux && !run_latex && !latex_command_.empty()) { - LYXERR(Debug::FILES) - << "Running " << latex_command_ - << " to update aux file"<< endl; + LYXERR(Debug::FILES, "Running " << latex_command_ + << " to update aux file"); runLaTeX(*buffer, latex_command_, runparams, errorList); } // FIXME UNICODE - string const infile2 = (conv.original_dir) - ? infile.absFilename() : to_utf8(makeRelPath(from_utf8(infile.absFilename()), - from_utf8(path))); - string const outfile2 = (conv.original_dir) - ? outfile.absFilename() : to_utf8(makeRelPath(from_utf8(outfile.absFilename()), - from_utf8(path))); + string const infile2 = + to_utf8(makeRelPath(from_utf8(infile.absFilename()), from_utf8(path))); + string const outfile2 = + to_utf8(makeRelPath(from_utf8(outfile.absFilename()), from_utf8(path))); string command = conv.command; command = subst(command, token_from, quoteName(infile2)); @@ -423,48 +399,44 @@ bool Converters::convert(Buffer const * buffer, command = add_options(command, dvipdfm_options(buffer->params())); - LYXERR(Debug::FILES) << "Calling " << command << endl; + LYXERR(Debug::FILES, "Calling " << command); if (buffer) buffer->message(_("Executing command: ") + from_utf8(command)); - Systemcall::Starttype const type = (dummy) - ? Systemcall::DontWait : Systemcall::Wait; Systemcall one; int res; - if (conv.original_dir) { - FileName path(buffer->filePath()); - support::Path p(path); - res = one.startscript(type, + if (dummy) { + res = one.startscript(Systemcall::DontWait, to_filesystem8bit(from_utf8(command))); - } else - res = one.startscript(type, - to_filesystem8bit(from_utf8(command))); - - if (!real_outfile.empty()) { - Mover const & mover = getMover(conv.to); - if (!mover.rename(outfile, real_outfile)) - res = -1; - else - LYXERR(Debug::FILES) - << "renaming file " << outfile - << " to " << real_outfile - << endl; - // Finally, don't forget to tell any future - // converters to use the renamed file... - outfile = real_outfile; - } - - if (!conv.parselog.empty()) { - string const logfile = infile2 + ".log"; - string const script = libScriptSearch(conv.parselog); - string const command2 = script + - " < " + quoteName(infile2 + ".out") + - " > " + quoteName(logfile); - one.startscript(Systemcall::Wait, - to_filesystem8bit(from_utf8(command2))); - if (!scanLog(*buffer, command, makeAbsPath(logfile, path), errorList)) - return false; + // We're not waiting for the result, so we can't do anything + // else here. + } else { + res = one.startscript(Systemcall::Wait, + to_filesystem8bit(from_utf8(command))); + if (!real_outfile.empty()) { + Mover const & mover = getMover(conv.to); + if (!mover.rename(outfile, real_outfile)) + res = -1; + else + LYXERR(Debug::FILES, "renaming file " << outfile + << " to " << real_outfile); + // Finally, don't forget to tell any future + // converters to use the renamed file... + outfile = real_outfile; + } + + if (!conv.parselog.empty()) { + string const logfile = infile2 + ".log"; + string const script = libScriptSearch(conv.parselog); + string const command2 = script + + " < " + quoteName(infile2 + ".out") + + " > " + quoteName(logfile); + one.startscript(Systemcall::Wait, + to_filesystem8bit(from_utf8(command2))); + if (!scanLog(*buffer, command, makeAbsPath(logfile, path), errorList)) + return false; + } } if (res) { @@ -524,9 +496,8 @@ bool Converters::move(string const & fmt, string const to_base = removeExtension(to.absFilename()); string const to_extension = getExtension(to.absFilename()); - vector const files = dirList(FileName(path), - getExtension(from.absFilename())); - for (vector::const_iterator it = files.begin(); + FileNameList const files = FileName(path).dirList(getExtension(from.absFilename())); + for (FileNameList::const_iterator it = files.begin(); it != files.end(); ++it) { string const from2 = it->absFilename(); string const file2 = onlyFilename(from2); @@ -534,8 +505,7 @@ bool Converters::move(string const & fmt, string const to2 = changeExtension( to_base + file2.substr(base.length()), to_extension); - LYXERR(Debug::FILES) << "moving " << from2 - << " to " << to2 << endl; + LYXERR(Debug::FILES, "moving " << from2 << " to " << to2); Mover const & mover = getMover(fmt); bool const moved = copy @@ -577,7 +547,7 @@ bool Converters::scanLog(Buffer const & buffer, string const & /*command*/, int const result = latex.scanLogFile(terr); if (result & LaTeX::ERRORS) - bufferErrors(buffer, terr, errorList); + buffer.bufferErrors(terr, errorList); return true; } @@ -585,13 +555,11 @@ bool Converters::scanLog(Buffer const & buffer, string const & /*command*/, namespace { -class showMessage : public std::unary_function, public boost::signals::trackable { +class ShowMessage + : public boost::signals::trackable { public: - showMessage(Buffer const & b) : buffer_(b) {}; - void operator()(docstring const & m) const - { - buffer_.message(m); - } + ShowMessage(Buffer const & b) : buffer_(b) {} + void operator()(docstring const & msg) const { buffer_.message(msg); } private: Buffer const & buffer_; }; @@ -602,21 +570,21 @@ private: bool Converters::runLaTeX(Buffer const & buffer, string const & command, OutputParams const & runparams, ErrorList & errorList) { - buffer.busy(true); + buffer.setBusy(true); buffer.message(_("Running LaTeX...")); runparams.document_language = buffer.params().language->babel(); // do the LaTeX run(s) - string const name = buffer.getLatexName(); + string const name = buffer.latexName(); LaTeX latex(command, runparams, FileName(makeAbsPath(name))); TeXErrors terr; - showMessage show(buffer); + ShowMessage show(buffer); latex.message.connect(show); int const result = latex.run(terr); if (result & LaTeX::ERRORS) - bufferErrors(buffer, terr, errorList); + buffer.bufferErrors(terr, errorList); // check return value from latex.run(). if ((result & LaTeX::NO_LOGFILE)) { @@ -631,7 +599,7 @@ bool Converters::runLaTeX(Buffer const & buffer, string const & command, } - buffer.busy(false); + buffer.setBusy(false); int const ERROR_MASK = LaTeX::NO_LOGFILE | @@ -657,8 +625,8 @@ void Converters::buildGraph() } -std::vector const -Converters::intToFormat(std::vector const & input) +vector const +Converters::intToFormat(vector const & input) { vector result(input.size()); @@ -702,11 +670,34 @@ bool Converters::isReachable(string const & from, string const & to) } -Graph::EdgePath const -Converters::getPath(string const & from, string const & to) +Graph::EdgePath Converters::getPath(string const & from, string const & to) { return G_.getPath(formats.getNumber(from), formats.getNumber(to)); } + +vector Converters::importableFormats() +{ + vector l = loaders(); + vector result = getReachableTo(l[0], true); + for (vector::const_iterator it = l.begin() + 1; + it != l.end(); ++it) { + vector r = getReachableTo(*it, false); + result.insert(result.end(), r.begin(), r.end()); + } + return result; +} + + +vector Converters::loaders() const +{ + vector v; + v.push_back("lyx"); + v.push_back("text"); + v.push_back("textparagraph"); + return v; +} + + } // namespace lyx