X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2FExternalSupport.cpp;h=7ea6d566fda73911d930f81646e9e77f7d024365;hb=57b69a5efddf9f3c148007322f00dad6c253a2ed;hp=653a195e56fcb3abb1ede33cde63043038323121;hpb=a02653e4ddb08d97850088eec87f4943427c4577;p=lyx.git diff --git a/src/insets/ExternalSupport.cpp b/src/insets/ExternalSupport.cpp index 653a195e56..7ea6d566fd 100644 --- a/src/insets/ExternalSupport.cpp +++ b/src/insets/ExternalSupport.cpp @@ -18,8 +18,6 @@ #include "Buffer.h" #include "Converter.h" -#include "debug.h" -#include "gettext.h" #include "ErrorList.h" #include "Exporter.h" #include "Format.h" @@ -27,26 +25,20 @@ #include "frontends/alert.h" +#include "support/debug.h" #include "support/filetools.h" -#include "support/Forkedcall.h" +#include "support/gettext.h" #include "support/lstrings.h" #include "support/lyxalgo.h" -#include "support/lyxlib.h" #include "support/os.h" #include "support/Package.h" #include -using std::endl; -using std::string; -using std::vector; - +using namespace std; +using namespace lyx::support; namespace lyx { - -using support::FileName; -using support::isValidLaTeXFilename; - namespace external { Template const * getTemplatePtr(InsetExternalParams const & params) @@ -58,8 +50,8 @@ Template const * getTemplatePtr(InsetExternalParams const & params) void editExternal(InsetExternalParams const & params, Buffer const & buffer) { - formats.edit(buffer, params.filename, - formats.getFormatFromFile(params.filename)); + formats.edit(buffer, params.filename, + formats.getFormatFromFile(params.filename)); } @@ -69,8 +61,8 @@ string const subst_path(string const & input, string const & placeholder, string const & path, bool use_latex_path, - support::latex_path_extension ext = support::PROTECT_EXTENSION, - support::latex_path_dots dots = support::LEAVE_DOTS) + latex_path_extension ext = PROTECT_EXTENSION, + latex_path_dots dots = LEAVE_DOTS) { if (input.find(placeholder) == string::npos) return input; @@ -78,8 +70,8 @@ string const subst_path(string const & input, // path will be compared with another one in internal style later // in Converters::move. string const path2 = use_latex_path ? - support::latex_path(path, ext, dots) : path; - return support::subst(input, placeholder, path2); + latex_path(path, ext, dots) : path; + return subst(input, placeholder, path2); } } // namespace anon @@ -91,71 +83,85 @@ string const doSubstitution(InsetExternalParams const & params, bool external_in_tmpdir, Substitute what) { - Buffer const * m_buffer = buffer.getMasterBuffer(); + string result = s; + if (what != PATHS && contains(result, "$$pngOrjpg")) { + // This is for raster images and pdflatex: + // Since pdflatex supports both jpg and png, we choose the best format: + // jpg if the original file is jpg to retain the compression, else png. + string format = formats.getFormatFromFile(params.filename); + if (format == "jpg") + result = subst(result, "$$pngOrjpg", "jpg"); + else + result = subst(result, "$$pngOrjpg", "png"); + } + + if (what == FORMATS) + return result; + + Buffer const * masterBuffer = buffer.masterBuffer(); string const parentpath = external_in_tmpdir ? - m_buffer->temppath() : + masterBuffer->temppath() : buffer.filePath(); string const filename = external_in_tmpdir ? - params.filename.mangledFilename() : - params.filename.outputFilename(parentpath); - string const basename = support::changeExtension( - support::onlyFilename(filename), string()); - string const absname = support::makeAbsPath(filename, parentpath).absFilename(); + params.filename.mangledFileName() : + params.filename.outputFileName(parentpath); + string const basename = changeExtension( + onlyFileName(filename), string()); + string const absname = makeAbsPath(filename, parentpath).absFileName(); - string result = s; if (what != ALL_BUT_PATHS) { - string const filepath = support::onlyPath(filename); - string const abspath = support::onlyPath(absname); + string const filepath = onlyPath(filename); + string const abspath = onlyPath(absname); string const masterpath = external_in_tmpdir ? - m_buffer->temppath() : - m_buffer->filePath(); + masterBuffer->temppath() : + masterBuffer->filePath(); // FIXME UNICODE - string relToMasterPath = support::onlyPath( - to_utf8(support::makeRelPath(from_utf8(absname), + string relToMasterPath = onlyPath( + to_utf8(makeRelPath(from_utf8(absname), from_utf8(masterpath)))); if (relToMasterPath == "./") relToMasterPath.clear(); // FIXME UNICODE - string relToParentPath = support::onlyPath( - to_utf8(support::makeRelPath(from_utf8(absname), + string relToParentPath = onlyPath( + to_utf8(makeRelPath(from_utf8(absname), from_utf8(parentpath)))); if (relToParentPath == "./") relToParentPath.clear(); result = subst_path(result, "$$FPath", filepath, use_latex_path, - support::PROTECT_EXTENSION, - support::ESCAPE_DOTS); + PROTECT_EXTENSION, + ESCAPE_DOTS); result = subst_path(result, "$$AbsPath", abspath, use_latex_path, - support::PROTECT_EXTENSION, - support::ESCAPE_DOTS); + PROTECT_EXTENSION, + ESCAPE_DOTS); result = subst_path(result, "$$RelPathMaster", relToMasterPath, use_latex_path, - support::PROTECT_EXTENSION, - support::ESCAPE_DOTS); + PROTECT_EXTENSION, + ESCAPE_DOTS); result = subst_path(result, "$$RelPathParent", relToParentPath, use_latex_path, - support::PROTECT_EXTENSION, - support::ESCAPE_DOTS); - if (support::absolutePath(filename)) { + PROTECT_EXTENSION, + ESCAPE_DOTS); + if (FileName::isAbsolute(filename)) { result = subst_path(result, "$$AbsOrRelPathMaster", abspath, use_latex_path, - support::PROTECT_EXTENSION, - support::ESCAPE_DOTS); + PROTECT_EXTENSION, + ESCAPE_DOTS); result = subst_path(result, "$$AbsOrRelPathParent", abspath, use_latex_path, - support::PROTECT_EXTENSION, - support::ESCAPE_DOTS); + PROTECT_EXTENSION, + ESCAPE_DOTS); } else { result = subst_path(result, "$$AbsOrRelPathMaster", relToMasterPath, use_latex_path, - support::PROTECT_EXTENSION, - support::ESCAPE_DOTS); + PROTECT_EXTENSION, + ESCAPE_DOTS); result = subst_path(result, "$$AbsOrRelPathParent", relToParentPath, use_latex_path, - support::PROTECT_EXTENSION, - support::ESCAPE_DOTS); + PROTECT_EXTENSION, + ESCAPE_DOTS); } } @@ -163,22 +169,22 @@ string const doSubstitution(InsetExternalParams const & params, return result; result = subst_path(result, "$$FName", filename, use_latex_path, - support::EXCLUDE_EXTENSION); + EXCLUDE_EXTENSION); result = subst_path(result, "$$Basename", basename, use_latex_path, - support::PROTECT_EXTENSION, support::ESCAPE_DOTS); + PROTECT_EXTENSION, ESCAPE_DOTS); result = subst_path(result, "$$Extension", - '.' + support::getExtension(filename), use_latex_path); - result = subst_path(result, "$$Tempname", params.tempname().absFilename(), use_latex_path); + '.' + getExtension(filename), use_latex_path); + result = subst_path(result, "$$Tempname", params.tempname().absFileName(), use_latex_path); result = subst_path(result, "$$Sysdir", - support::package().system_support().absFilename(), use_latex_path); + package().system_support().absFileName(), use_latex_path); // Handle the $$Contents(filename) syntax - if (support::contains(result, "$$Contents(\"")) { + if (contains(result, "$$Contents(\"")) { // Since use_latex_path may be true we must extract the file // name from s instead of result and do the substitutions // again, this time with use_latex_path false. - string::size_type const spos = s.find("$$Contents(\""); - string::size_type const send = s.find("\")", spos); + size_t const spos = s.find("$$Contents(\""); + size_t const send = s.find("\")", spos); string const file_template = s.substr(spos + 12, send - (spos + 12)); string const file = doSubstitution(params, buffer, file_template, false, @@ -186,12 +192,13 @@ string const doSubstitution(InsetExternalParams const & params, string contents; FileName const absfile( - support::makeAbsPath(file, m_buffer->temppath())); - if (absfile.isFileReadable()) - contents = support::getFileContents(absfile); + makeAbsPath(file, masterBuffer->temppath())); + if (absfile.isReadableFile()) + // FIXME UNICODE + contents = to_utf8(absfile.fileContents("UTF-8")); - string::size_type const pos = result.find("$$Contents(\""); - string::size_type const end = result.find("\")", pos); + size_t const pos = result.find("$$Contents(\""); + size_t const end = result.find("\")", pos); result.replace(pos, end + 2, contents); } @@ -240,33 +247,32 @@ void updateExternal(InsetExternalParams const & params, from_format = formats.getFormatFromFile(params.filename); if (from_format.empty()) return; // FAILURE - } - string const to_format = outputFormat.updateFormat; + string const to_format = doSubstitution(params, buffer, + outputFormat.updateFormat, false, external_in_tmpdir, FORMATS); if (to_format.empty()) return; // NOT_NEEDED // The master buffer. This is useful when there are multiple levels // of include files - Buffer const * m_buffer = buffer.getMasterBuffer(); + Buffer const * masterBuffer = buffer.masterBuffer(); // We copy the source file to the temp dir and do the conversion // there if necessary + bool const isDir = params.filename.isDirectory(); FileName const temp_file( - support::makeAbsPath(params.filename.mangledFilename(), - m_buffer->temppath())); - if (!params.filename.empty() && !params.filename.isDirectory()) { - unsigned long const from_checksum = support::sum(params.filename); - unsigned long const temp_checksum = support::sum(temp_file); + makeAbsPath(params.filename.mangledFileName(), + masterBuffer->temppath())); + if (!params.filename.empty() && !isDir) { + unsigned long const from_checksum = params.filename.checksum(); + unsigned long const temp_checksum = temp_file.checksum(); if (from_checksum != temp_checksum) { Mover const & mover = getMover(from_format); if (!mover.copy(params.filename, temp_file)) { - LYXERR(Debug::EXTERNAL) - << "external::updateExternal. " - << "Unable to copy " - << params.filename << " to " << temp_file << endl; + LYXERR(Debug::EXTERNAL, "external::updateExternal. " + << "Unable to copy " << params.filename << " to " << temp_file); return; // FAILURE } } @@ -277,7 +283,7 @@ void updateExternal(InsetExternalParams const & params, outputFormat.updateResult, false, true); FileName const abs_to_file( - support::makeAbsPath(to_file, m_buffer->temppath())); + makeAbsPath(to_file, masterBuffer->temppath())); if (!dryrun) { // Record the referenced files for the exporter. @@ -289,15 +295,15 @@ void updateExternal(InsetExternalParams const & params, vector::const_iterator fit = rit->second.begin(); vector::const_iterator fend = rit->second.end(); for (; fit != fend; ++fit) { - FileName const source(support::makeAbsPath( + FileName const source(makeAbsPath( doSubstitution(params, buffer, *fit, false, true), - m_buffer->temppath())); + masterBuffer->temppath())); // The path of the referenced file is never the // temp path, but the filename may be the mangled // or the real name. Therefore we substitute the // paths and names separately. - string file = support::subst(*fit, "$$FName", + string file = subst(*fit, "$$FName", "$$FPath$$Basename$$Extension"); file = doSubstitution(params, buffer, file, false, false, PATHS); @@ -306,14 +312,17 @@ void updateExternal(InsetExternalParams const & params, ALL_BUT_PATHS); // if file is a relative name, it is interpreted // relative to the master document. - exportdata.addExternalFile(rit->first, source, file); + if (makeAbsPath(file, masterBuffer->filePath()) != + params.filename.absFileName()) + exportdata.addExternalFile(rit->first, source, file); } } } // Do we need to perform the conversion? // Yes if to_file does not exist or if from_file is newer than to_file - if (support::compare_timestamps(temp_file, abs_to_file) < 0) + // or if from_file is a directory (bug 9925) + if (!isDir && compare_timestamps(temp_file, abs_to_file) < 0) return; // SUCCESS // FIXME (Abdel 12/08/06): Is there a need to show these errors? @@ -324,10 +333,8 @@ void updateExternal(InsetExternalParams const & params, Converters::try_default | Converters::try_cache); if (!success) { - LYXERR(Debug::EXTERNAL) - << "external::updateExternal. " - << "Unable to convert from " - << from_format << " to " << to_format << endl; + LYXERR(Debug::EXTERNAL, "external::updateExternal. " + << "Unable to convert from " << from_format << " to " << to_format); } // return success @@ -343,28 +350,26 @@ string const substituteOptions(InsetExternalParams const & params, } // namespace anon -int writeExternal(InsetExternalParams const & params, - string const & format, - Buffer const & buffer, odocstream & os, - ExportData & exportdata, - bool external_in_tmpdir, - bool dryrun) +void writeExternal(InsetExternalParams const & params, + string const & format, + Buffer const & buffer, otexstream & os, + ExportData & exportdata, + bool external_in_tmpdir, + bool dryrun) { Template const * const et_ptr = getTemplatePtr(params); if (!et_ptr) - return 0; + return; Template const & et = *et_ptr; Template::Formats::const_iterator cit = et.formats.find(format); if (cit == et.formats.end()) { - LYXERR(Debug::EXTERNAL) - << "External template format '" << format - << "' not specified in template " - << params.templatename() << endl; - return 0; + LYXERR(Debug::EXTERNAL, "External template format '" << format + << "' not specified in template " << params.templatename()); + return; } - if (!dryrun || support::contains(cit->second.product, "$$Contents")) + if (!dryrun || contains(cit->second.product, "$$Contents")) updateExternal(params, format, buffer, exportdata, external_in_tmpdir, dryrun); @@ -372,21 +377,30 @@ int writeExternal(InsetExternalParams const & params, string str = doSubstitution(params, buffer, cit->second.product, use_latex_path, external_in_tmpdir); - string const absname = support::makeAbsPath( - params.filename.outputFilename(buffer.filePath()), buffer.filePath()).absFilename(); + string const absname = makeAbsPath( + params.filename.outputFileName(buffer.filePath()), buffer.filePath()).absFileName(); - if (!external_in_tmpdir && !isValidLaTeXFilename(absname)) { - lyx::frontend::Alert::warning(_("Invalid filename"), - _("The following filename is likely to cause trouble " - "when running the exported file through LaTeX: ") + - from_utf8(absname)); + if (!dryrun && !external_in_tmpdir) { + if (!isValidLaTeXFileName(absname)) { + lyx::frontend::Alert::warning(_("Invalid filename"), + _("The following filename will cause troubles " + "when running the exported file through LaTeX: ") + + from_utf8(absname)); + } + if (!isValidDVIFileName(absname)) { + lyx::frontend::Alert::warning(_("Problematic filename for DVI"), + _("The following filename can cause troubles " + "when running the exported file through LaTeX " + "and opening the resulting DVI: ") + + from_utf8(absname), true); + } } str = substituteCommands(params, str, format); str = substituteOptions(params, str, format); // FIXME UNICODE os << from_utf8(str); - return int(std::count(str.begin(), str.end(),'\n')); + return; } namespace { @@ -407,7 +421,7 @@ string const substituteIt(string const & input, Template::Format const & format, InsetExternalParams const & params) { - typedef std::map Transformers; + typedef map Transformers; Transformers::const_iterator it = format.command_transformers.find(id); if (it == format.command_transformers.end()) return input; @@ -420,12 +434,12 @@ string const substituteIt(string const & input, else if (id == Resize) ptr = store.getCommandTransformer(params.resizedata); - if (!ptr.get()) + if (!ptr) return input; string result = - support::subst(input, ptr->front_placeholder(), ptr->front()); - return support::subst(result, ptr->back_placeholder(), ptr->back()); + subst(input, ptr->front_placeholder(), ptr->front()); + return subst(result, ptr->back_placeholder(), ptr->back()); } @@ -436,7 +450,7 @@ string const substituteIt(string const & input, Template::Format const & format, InsetExternalParams const & params) { - typedef std::map Transformers; + typedef map Transformers; Transformers::const_iterator it = format.option_transformers.find(id); if (it == format.option_transformers.end()) return input; @@ -459,10 +473,10 @@ string const substituteIt(string const & input, break; } - if (!ptr.get()) + if (!ptr) return input; - return support::subst(input, ptr->placeholder(), ptr->option()); + return subst(input, ptr->placeholder(), ptr->option()); } @@ -532,7 +546,7 @@ string const substituteOptions(InsetExternalParams const & params, for (; it != end; ++it) { string const opt = substituteOption(params, it->option, format); string const placeholder = "$$" + it->name; - output = support::subst(output, placeholder, opt); + output = subst(output, placeholder, opt); } return output;