X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2FInsetInclude.cpp;h=4e44ec8c87800f1825b2d65da6991fb9b6a1d837;hb=239b9919ffe28338d789e6dc9122228f77ab77a7;hp=58d46ab09416bdde95cd6b8309c4fbff143685d4;hpb=eff76bd3ab5643340cc0216f5db7215893f3d2ac;p=lyx.git diff --git a/src/insets/InsetInclude.cpp b/src/insets/InsetInclude.cpp index 58d46ab094..4e44ec8c87 100644 --- a/src/insets/InsetInclude.cpp +++ b/src/insets/InsetInclude.cpp @@ -31,11 +31,12 @@ #include "LayoutFile.h" #include "LayoutModuleList.h" #include "LyX.h" -#include "LyXRC.h" #include "Lexer.h" #include "MetricsInfo.h" +#include "output_plaintext.h" #include "output_xhtml.h" #include "OutputParams.h" +#include "texstream.h" #include "TextClass.h" #include "TocBackend.h" @@ -60,6 +61,8 @@ #include "support/lassert.h" #include "support/lstrings.h" // contains #include "support/lyxalgo.h" +#include "support/mutex.h" +#include "support/ExceptionMessage.h" #include "support/bind.h" @@ -76,6 +79,8 @@ namespace { docstring const uniqueID() { static unsigned int seed = 1000; + static Mutex mutex; + Mutex::Locker lock(&mutex); return "file" + convert(++seed); } @@ -124,7 +129,7 @@ bool isVerbatim(InsetCommandParams const & params) bool isInputOrInclude(InsetCommandParams const & params) { Types const t = type(params); - return t == INPUT || t == INCLUDE; + return t == INPUT || t == INCLUDE; } @@ -387,7 +392,8 @@ docstring InsetInclude::screenLabel() const temp = listings_label_; break; case NONE: - LASSERT(false, /**/); + LASSERT(false, temp = buffer().B_("Unknown")); + break; } temp += ": "; @@ -405,7 +411,9 @@ Buffer * InsetInclude::getChildBuffer() const { Buffer * childBuffer = loadIfNeeded(); - // FIXME: recursive includes + // FIXME RECURSIVE INCLUDE + // This isn't sufficient, as the inclusion could be downstream. + // But it'll have to do for now. return (childBuffer == &buffer()) ? 0 : childBuffer; } @@ -532,74 +540,153 @@ void InsetInclude::latex(otexstream & os, OutputParams const & runparams) const mangledFileName(); } - FileName const writefile(makeAbsPath(mangled, masterBuffer->temppath())); - if (!runparams.nice) incfile = mangled; + else if (!runparams.silent) + ; // no warning wanted else if (!isValidLaTeXFileName(incfile)) { frontend::Alert::warning(_("Invalid filename"), _("The following filename will cause troubles " - "when running the exported file through LaTeX: ") + + "when running the exported file through LaTeX: ") + from_utf8(incfile)); - } - else if (!isValidDVIFileName(incfile)) { + } else if (!isValidDVIFileName(incfile)) { 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: ") + + "when running the exported file through LaTeX " + "and opening the resulting DVI: ") + from_utf8(incfile), true); } + + FileName const writefile(makeAbsPath(mangled, runparams.for_preview ? + buffer().temppath() : masterBuffer->temppath())); + LYXERR(Debug::LATEX, "incfile:" << incfile); LYXERR(Debug::LATEX, "exportfile:" << exportfile); LYXERR(Debug::LATEX, "writefile:" << writefile); string const tex_format = flavor2format(runparams.flavor); - if (runparams.inComment || runparams.dryrun) { - //Don't try to load or copy the file if we're - //in a comment or doing a dryrun - } else if (isInputOrInclude(params()) && + + switch (type(params())) { + case VERB: + case VERBAST: { + incfile = latex_path(incfile); + // FIXME UNICODE + os << '\\' << from_ascii(params().getCmdName()) << '{' + << from_utf8(incfile) << '}'; + break; + } + case INPUT: { + runparams.exportdata->addExternalFile(tex_format, writefile, + exportfile); + + // \input wants file with extension (default is .tex) + if (!isLyXFileName(included_file.absFileName())) { + incfile = latex_path(incfile); + // FIXME UNICODE + os << '\\' << from_ascii(params().getCmdName()) + << '{' << from_utf8(incfile) << '}'; + } else { + incfile = changeExtension(incfile, ".tex"); + incfile = latex_path(incfile); + // FIXME UNICODE + os << '\\' << from_ascii(params().getCmdName()) + << '{' << from_utf8(incfile) << '}'; + } + break; + } + case LISTINGS: { + runparams.exportdata->addExternalFile(tex_format, writefile, + exportfile); + os << '\\' << from_ascii(params().getCmdName()); + string const opt = to_utf8(params()["lstparams"]); + // opt is set in QInclude dialog and should have passed validation. + InsetListingsParams params(opt); + if (!params.params().empty()) + os << "[" << from_utf8(params.params()) << "]"; + os << '{' << from_utf8(incfile) << '}'; + break; + } + case INCLUDE: { + runparams.exportdata->addExternalFile(tex_format, writefile, + exportfile); + + // \include don't want extension and demands that the + // file really have .tex + incfile = changeExtension(incfile, string()); + incfile = latex_path(incfile); + // FIXME UNICODE + os << '\\' << from_ascii(params().getCmdName()) << '{' + << from_utf8(incfile) << '}'; + break; + } + case NONE: + break; + } + + if (runparams.inComment || runparams.dryrun) + // Don't try to load or copy the file if we're + // in a comment or doing a dryrun + return; + + if (isInputOrInclude(params()) && isLyXFileName(included_file.absFileName())) { // if it's a LyX file and we're inputting or including, // try to load it so we can write the associated latex Buffer * tmp = loadIfNeeded(); if (!tmp) { - docstring text = bformat(_("Could not load included " - "file\n`%1$s'\n" - "Please, check whether it actually exists."), - included_file.displayName()); - Alert::warning(_("Missing included file"), text); + if (!runparams.silent) { + docstring text = bformat(_("Could not load included " + "file\n`%1$s'\n" + "Please, check whether it actually exists."), + included_file.displayName()); + Alert::warning(_("Missing included file"), text); + } return; } - if (tmp->params().baseClass() != masterBuffer->params().baseClass()) { - // FIXME UNICODE - docstring text = bformat(_("Included file `%1$s'\n" - "has textclass `%2$s'\n" - "while parent file has textclass `%3$s'."), - included_file.displayName(), - from_utf8(tmp->params().documentClass().name()), - from_utf8(masterBuffer->params().documentClass().name())); - Alert::warning(_("Different textclasses"), text, true); - } + if (!runparams.silent) { + if (tmp->params().baseClass() != masterBuffer->params().baseClass()) { + // FIXME UNICODE + docstring text = bformat(_("Included file `%1$s'\n" + "has textclass `%2$s'\n" + "while parent file has textclass `%3$s'."), + included_file.displayName(), + from_utf8(tmp->params().documentClass().name()), + from_utf8(masterBuffer->params().documentClass().name())); + Alert::warning(_("Different textclasses"), text, true); + } - // Make sure modules used in child are all included in master - // FIXME It might be worth loading the children's modules into the master - // over in BufferParams rather than doing this check. - LayoutModuleList const masterModules = masterBuffer->params().getModules(); - LayoutModuleList const childModules = tmp->params().getModules(); - LayoutModuleList::const_iterator it = childModules.begin(); - LayoutModuleList::const_iterator end = childModules.end(); - for (; it != end; ++it) { - string const module = *it; - LayoutModuleList::const_iterator found = - find(masterModules.begin(), masterModules.end(), module); - if (found == masterModules.end()) { + string const child_tf = tmp->params().useNonTeXFonts ? "true" : "false"; + string const master_tf = masterBuffer->params().useNonTeXFonts ? "true" : "false"; + if (tmp->params().useNonTeXFonts != masterBuffer->params().useNonTeXFonts) { docstring text = bformat(_("Included file `%1$s'\n" - "uses module `%2$s'\n" - "which is not used in parent file."), - included_file.displayName(), from_utf8(module)); - Alert::warning(_("Module not found"), text); + "has use-non-TeX-fonts set to `%2$s'\n" + "while parent file has use-non-TeX-fonts set to `%3$s'."), + included_file.displayName(), + from_utf8(child_tf), + from_utf8(master_tf)); + Alert::warning(_("Different use-non-TeX-fonts settings"), text, true); + } + + // Make sure modules used in child are all included in master + // FIXME It might be worth loading the children's modules into the master + // over in BufferParams rather than doing this check. + LayoutModuleList const masterModules = masterBuffer->params().getModules(); + LayoutModuleList const childModules = tmp->params().getModules(); + LayoutModuleList::const_iterator it = childModules.begin(); + LayoutModuleList::const_iterator end = childModules.end(); + for (; it != end; ++it) { + string const module = *it; + LayoutModuleList::const_iterator found = + find(masterModules.begin(), masterModules.end(), module); + if (found == masterModules.end()) { + docstring text = bformat(_("Included file `%1$s'\n" + "uses module `%2$s'\n" + "which is not used in parent file."), + included_file.displayName(), from_utf8(module)); + Alert::warning(_("Module not found"), text); + } } } @@ -615,28 +702,34 @@ void InsetInclude::latex(otexstream & os, OutputParams const & runparams) const // and language. Encoding const * const oldEnc = runparams.encoding; Language const * const oldLang = runparams.master_language; - // If the master has full unicode flavor (XeTeX, LuaTeX), + // If the master uses non-TeX fonts (XeTeX, LuaTeX), // the children must be encoded in plain utf8! - runparams.encoding = runparams.isFullUnicode() ? + runparams.encoding = masterBuffer->params().useNonTeXFonts ? encodings.fromLyXName("utf8-plain") : &tmp->params().encoding(); runparams.master_language = buffer().params().language; runparams.par_begin = 0; runparams.par_end = tmp->paragraphs().size(); - if (!tmp->makeLaTeXFile(tmpwritefile, runparams, false)) { - docstring msg = bformat(_("Included file `%1$s' " - "was not exported correctly.\nWarning: " + runparams.is_child = true; + if (!tmp->makeLaTeXFile(tmpwritefile, masterFileName(buffer()). + onlyPath().absFileName(), runparams, Buffer::OnlyBody)) { + if (!runparams.silent) { + docstring msg = bformat(_("Included file `%1$s' " + "was not exported correctly.\n " "LaTeX export is probably incomplete."), included_file.displayName()); - ErrorList const & el = tmp->errorList("Export"); - if (!el.empty()) - msg = bformat(from_ascii("%1$s\n\n%2$s\n\n%3$s"), + ErrorList const & el = tmp->errorList("Export"); + if (!el.empty()) + msg = bformat(from_ascii("%1$s\n\n%2$s\n\n%3$s"), msg, el.begin()->error, el.begin()->description); - Alert::warning(_("Export failure"), msg); + throw ExceptionMessage(ErrorException, _("Error: "), + msg); + } } runparams.encoding = oldEnc; runparams.master_language = oldLang; + runparams.is_child = false; // If needed, use converters to produce a latex file from the child if (tmpwritefile != writefile) { @@ -646,24 +739,25 @@ void InsetInclude::latex(otexstream & os, OutputParams const & runparams) const included_file, inc_format, tex_format, el); - if (!success) { + if (!success && !runparams.silent) { docstring msg = bformat(_("Included file `%1$s' " - "was not exported correctly.\nWarning: " + "was not exported correctly.\n " "LaTeX export is probably incomplete."), included_file.displayName()); if (!el.empty()) msg = bformat(from_ascii("%1$s\n\n%2$s\n\n%3$s"), msg, el.begin()->error, el.begin()->description); - Alert::warning(_("Export failure"), msg); + throw ExceptionMessage(ErrorException, _("Error: "), + msg); } } } else { // In this case, it's not a LyX file, so we copy the file // to the temp dir, so that .aux files etc. are not created // in the original dir. Files included by this file will be - // found via the environment variable TEXINPUTS, which may be - // set in preferences and by default includes the original dir. + // found via either the environment variable TEXINPUTS, or + // input@path, see ../Buffer.cpp. unsigned long const checksum_in = included_file.checksum(); unsigned long const checksum_out = writefile.checksum(); @@ -672,69 +766,12 @@ void InsetInclude::latex(otexstream & os, OutputParams const & runparams) const // FIXME UNICODE LYXERR(Debug::LATEX, to_utf8(bformat(_("Could not copy the file\n%1$s\n" - "into the temporary directory."), - from_utf8(included_file.absFileName())))); + "into the temporary directory."), + from_utf8(included_file.absFileName())))); return; } } } - - switch (type(params())) { - case VERB: - case VERBAST: { - incfile = latex_path(incfile); - // FIXME UNICODE - os << '\\' << from_ascii(params().getCmdName()) << '{' - << from_utf8(incfile) << '}'; - break; - } - case INPUT: { - runparams.exportdata->addExternalFile(tex_format, writefile, - exportfile); - - // \input wants file with extension (default is .tex) - if (!isLyXFileName(included_file.absFileName())) { - incfile = latex_path(incfile); - // FIXME UNICODE - os << '\\' << from_ascii(params().getCmdName()) - << '{' << from_utf8(incfile) << '}'; - } else { - incfile = changeExtension(incfile, ".tex"); - incfile = latex_path(incfile); - // FIXME UNICODE - os << '\\' << from_ascii(params().getCmdName()) - << '{' << from_utf8(incfile) << '}'; - } - break; - } - case LISTINGS: { - runparams.exportdata->addExternalFile(tex_format, writefile, - exportfile); - os << '\\' << from_ascii(params().getCmdName()); - string const opt = to_utf8(params()["lstparams"]); - // opt is set in QInclude dialog and should have passed validation. - InsetListingsParams params(opt); - if (!params.params().empty()) - os << "[" << from_utf8(params.params()) << "]"; - os << '{' << from_utf8(incfile) << '}'; - break; - } - case INCLUDE: { - runparams.exportdata->addExternalFile(tex_format, writefile, - exportfile); - - // \include don't want extension and demands that the - // file really have .tex - incfile = changeExtension(incfile, string()); - incfile = latex_path(incfile); - // FIXME UNICODE - os << '\\' << from_ascii(params().getCmdName()) << '{' - << from_utf8(incfile) << '}'; - break; - } - case NONE: - break; - } } @@ -761,7 +798,8 @@ docstring InsetInclude::xhtml(XHTMLStream & xs, OutputParams const & rp) const // converter on the included file. But that's just masochistic.) FileName const included_file = includedFileName(buffer(), params()); if (!isLyXFileName(included_file.absFileName())) { - frontend::Alert::warning(_("Unsupported Inclusion"), + if (!rp.silent) + frontend::Alert::warning(_("Unsupported Inclusion"), bformat(_("LyX does not know how to include non-LyX files when " "generating HTML output. Offending file:\n%1$s"), params()["filename"])); @@ -792,7 +830,7 @@ docstring InsetInclude::xhtml(XHTMLStream & xs, OutputParams const & rp) const if (all_pars) { op.par_begin = 0; op.par_end = 0; - ibuf->writeLyXHTMLSource(xs.os(), op, true); + ibuf->writeLyXHTMLSource(xs.os(), op, Buffer::IncludedFile); } else xs << XHTMLStream::ESCAPE_NONE << "