X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2Finsetexternal.C;h=735480991cc9c7671cbe9a4382ff3aa2172c4ed5;hb=b922cdd796f9e4b9a46a79808cdee596e04903eb;hp=51f177de40f5cecb313db0678db8da7dbc454220;hpb=7c0dad35b33c8f23f3d74d26f5689cc4d869c8b2;p=lyx.git diff --git a/src/insets/insetexternal.C b/src/insets/insetexternal.C index 51f177de40..735480991c 100644 --- a/src/insets/insetexternal.C +++ b/src/insets/insetexternal.C @@ -30,6 +30,8 @@ #include "support/path.h" #include "support/syscall.h" #include "gettext.h" +#include "debug.h" +#include "support/FileInfo.h" using std::endl; @@ -96,13 +98,15 @@ void InsetExternal::read(Buffer const *, LyXLex & lex) string token; // Read inset data from lex and store in format - if (lex.EatLine()) { - format = lex.GetString(); - } else + if (lex.eatLine()) { + format = lex.getString(); + } else { lex.printError("InsetExternal: Parse error: `$$Token'"); - while (lex.IsOK()) { + } + + while (lex.isOK()) { lex.nextToken(); - token = lex.GetString(); + token = lex.getString(); if (token == "\\end_inset") break; } @@ -137,12 +141,7 @@ int InsetExternal::write(string const & format, return 0; } - if (et.automaticProduction) { - executeCommand(doSubstitution(buf, - cit->second.updateCommand), - buf); - } - + updateExternal(format, buf); os << doSubstitution(buf, cit->second.product); return 0; // CHECK (FIXME check what ? - jbl) } @@ -167,7 +166,7 @@ int InsetExternal::linuxdoc(Buffer const * buf, std::ostream & os) const } -int InsetExternal::docBook(Buffer const * buf, std::ostream & os) const +int InsetExternal::docbook(Buffer const * buf, std::ostream & os) const { return write("DocBook", buf, os); } @@ -186,7 +185,7 @@ void InsetExternal::validate(LaTeXFeatures & features) const features.require(cit->second.requirement); } if (!cit->second.preamble.empty()) { - features.externalPreambles += cit->second.preamble + "\n"; + features.addExternalPreamble(cit->second.preamble + "\n"); } } @@ -202,7 +201,7 @@ Inset * InsetExternal::clone(Buffer const &, bool same_id) const } -string const InsetExternal::getScreenLabel() const +string const InsetExternal::getScreenLabel(Buffer const *) const { ExternalTemplate const & et = params_.templ; if (et.guiName.empty()) @@ -232,9 +231,14 @@ string const InsetExternal::doSubstitution(Buffer const * buffer, { string result; string const basename = ChangeExtension(params_.filename, string()); + string filepath = ""; + if (buffer && (!buffer->niceFile)) { + filepath = OnlyPath(MakeAbsPath(buffer->fileName())); + } result = subst(s, "$$FName", params_.filename); result = subst(result, "$$Basename", basename); result = subst(result, "$$Parameters", params_.parameters); + result = subst(result, "$$FPath", filepath); result = ReplaceEnvironmentPath(result); result = subst(result, "$$Tempname", tempname_); result = subst(result, "$$Sysdir", system_lyxdir); @@ -265,25 +269,47 @@ string const InsetExternal::doSubstitution(Buffer const * buffer, void InsetExternal::updateExternal() const +{ + updateExternal("LaTeX", view_->buffer()); +} + +void InsetExternal::updateExternal(string const & format, + Buffer const * buf) const { ExternalTemplate const & et = params_.templ; ExternalTemplate::Formats::const_iterator cit = - et.formats.find("LaTeX"); - if (cit == et.formats.end()) + et.formats.find(format); + + if (cit == et.formats.end() || + cit->second.updateCommand.empty() || + !et.automaticProduction) return; - executeCommand(doSubstitution(view_->buffer(), - cit->second.updateCommand), - view_->buffer()); + if (!cit->second.updateResult.empty()) { + string const resultfile = doSubstitution(buf, + cit->second.updateResult); + FileInfo fi(params_.filename); + FileInfo fi2(resultfile); + if (fi2.exist() && fi.exist() && + ::difftime(fi2.getModificationTime(), + fi.getModificationTime()) >= 0) { + lyxerr[Debug::FILES] << resultfile + << " is up to date" << endl; + return; + } + } + + executeCommand(doSubstitution(buf, cit->second.updateCommand), buf); } void InsetExternal::viewExternal() const { ExternalTemplate const & et = params_.templ; - if (et.automaticProduction) - updateExternal(); + if (et.viewCommand.empty()) + return; + updateExternal(); executeCommand(doSubstitution(view_->buffer(), et.viewCommand), view_->buffer()); @@ -293,9 +319,10 @@ void InsetExternal::viewExternal() const void InsetExternal::editExternal() const { ExternalTemplate const & et = params_.templ; - if (et.automaticProduction) - updateExternal(); + if (et.editCommand.empty()) + return; + updateExternal(); executeCommand(doSubstitution(view_->buffer(), et.editCommand), view_->buffer());