X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2FInsetInclude.cpp;h=2c0c412d04591f706e1f7018e1db6ebfb6fe9f1d;hb=9914f21bceef9610bd1822f96eff0aa6d1a8df7c;hp=4d164cf56b8bd8397b0b864e6df063614714371b;hpb=d866717ef7503a1373dd1cb3925e1ac97b079192;p=lyx.git diff --git a/src/insets/InsetInclude.cpp b/src/insets/InsetInclude.cpp index 4d164cf56b..2c0c412d04 100644 --- a/src/insets/InsetInclude.cpp +++ b/src/insets/InsetInclude.cpp @@ -18,6 +18,7 @@ #include "BufferList.h" #include "BufferParams.h" #include "BufferView.h" +#include "Converter.h" #include "Cursor.h" #include "DispatchResult.h" #include "Encoding.h" @@ -33,6 +34,7 @@ #include "LyXRC.h" #include "Lexer.h" #include "MetricsInfo.h" +#include "output_plaintext.h" #include "output_xhtml.h" #include "OutputParams.h" #include "TextClass.h" @@ -270,7 +272,7 @@ void InsetInclude::doDispatch(Cursor & cur, FuncRequest & cmd) } if (new_label != old_label) { - label_->updateCommand(new_label); + label_->updateLabelAndRefs(new_label, &cur); // the label might have been adapted (duplicate) if (new_label != label_->getParam("name")) { new_params.addParam("label", "{" + @@ -512,15 +514,21 @@ void InsetInclude::latex(otexstream & os, OutputParams const & runparams) const from_utf8(masterBuffer->filePath()))); } + string exppath = incfile; + if (!runparams.export_folder.empty()) { + exppath = makeAbsPath(exppath, runparams.export_folder).realPath(); + FileName(exppath).onlyPath().createPath(); + } + // write it to a file (so far the complete file) string exportfile; string mangled; // bug 5681 if (type(params()) == LISTINGS) { - exportfile = incfile; + exportfile = exppath; mangled = DocFileName(included_file).mangledFileName(); } else { - exportfile = changeExtension(incfile, ".tex"); + exportfile = changeExtension(exppath, ".tex"); mangled = DocFileName(changeExtension(included_file.absFileName(), ".tex")). mangledFileName(); } @@ -546,6 +554,7 @@ void InsetInclude::latex(otexstream & os, OutputParams const & runparams) const 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 @@ -553,10 +562,16 @@ void InsetInclude::latex(otexstream & os, OutputParams const & runparams) const 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) + 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); return; + } if (tmp->params().baseClass() != masterBuffer->params().baseClass()) { // FIXME UNICODE @@ -591,11 +606,12 @@ void InsetInclude::latex(otexstream & os, OutputParams const & runparams) const tmp->markDepClean(masterBuffer->temppath()); + // Don't assume the child's format is latex + string const inc_format = tmp->params().bufferFormat(); + FileName const tmpwritefile(changeExtension(writefile.absFileName(), + formats.extension(inc_format))); + // FIXME: handle non existing files - // FIXME: Second argument is irrelevant! - // since only_body is true, makeLaTeXFile will not look at second - // argument. Should we set it to string(), or should makeLaTeXFile - // make use of it somehow? (JMarc 20031002) // The included file might be written in a different encoding // and language. Encoding const * const oldEnc = runparams.encoding; @@ -608,16 +624,50 @@ void InsetInclude::latex(otexstream & os, OutputParams const & runparams) const runparams.master_language = buffer().params().language; runparams.par_begin = 0; runparams.par_end = tmp->paragraphs().size(); - tmp->makeLaTeXFile(writefile, - masterFileName(buffer()).onlyPath().absFileName(), - runparams, false); + runparams.is_child = true; + if (!tmp->makeLaTeXFile(tmpwritefile, masterFileName(buffer()). + onlyPath().absFileName(), runparams, Buffer::OnlyBody)) { + docstring msg = bformat(_("Included file `%1$s' " + "was not exported correctly.\nWarning: " + "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"), + msg, el.begin()->error, + el.begin()->description); + Alert::warning(_("Export failure"), 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) { + ErrorList el; + bool const success = + theConverters().convert(tmp, tmpwritefile, writefile, + included_file, + inc_format, tex_format, el); + + if (!success) { + docstring msg = bformat(_("Included file `%1$s' " + "was not exported correctly.\nWarning: " + "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); + } + } } 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 input@path, see ../Buffer.cpp. + // 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(); @@ -633,8 +683,6 @@ void InsetInclude::latex(otexstream & os, OutputParams const & runparams) const } } - string const tex_format = (runparams.flavor == OutputParams::LATEX) ? - "latex" : "pdflatex"; switch (type(params())) { case VERB: case VERBAST: { @@ -655,8 +703,8 @@ void InsetInclude::latex(otexstream & os, OutputParams const & runparams) const os << '\\' << from_ascii(params().getCmdName()) << '{' << from_utf8(incfile) << '}'; } else { - incfile = changeExtension(incfile, ".tex"); - incfile = latex_path(incfile); + incfile = changeExtension(incfile, ".tex"); + incfile = latex_path(incfile); // FIXME UNICODE os << '\\' << from_ascii(params().getCmdName()) << '{' << from_utf8(incfile) << '}'; @@ -664,6 +712,8 @@ void InsetInclude::latex(otexstream & os, OutputParams const & runparams) const 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. @@ -692,7 +742,7 @@ void InsetInclude::latex(otexstream & os, OutputParams const & runparams) const } -docstring InsetInclude::xhtml(XHTMLStream & xs, OutputParams const &rp) const +docstring InsetInclude::xhtml(XHTMLStream & xs, OutputParams const & rp) const { if (rp.inComment) return docstring(); @@ -736,12 +786,28 @@ docstring InsetInclude::xhtml(XHTMLStream & xs, OutputParams const &rp) const Buffer const * const ibuf = loadIfNeeded(); if (!ibuf) return docstring(); - ibuf->writeLyXHTMLSource(xs.os(), rp, true); + + // are we generating only some paragraphs, or all of them? + bool const all_pars = !rp.dryrun || + (rp.par_begin == 0 && + rp.par_end == (int)buffer().text().paragraphs().size()); + + OutputParams op = rp; + if (all_pars) { + op.par_begin = 0; + op.par_end = 0; + ibuf->writeLyXHTMLSource(xs.os(), op, Buffer::IncludedFile); + } else + xs << XHTMLStream::ESCAPE_NONE + << ""; return docstring(); } -int InsetInclude::plaintext(odocstream & os, OutputParams const &) const +int InsetInclude::plaintext(odocstream & os, OutputParams const & op) const { if (isVerbatim(params()) || isListings(params())) { os << '[' << screenLabel() << '\n'; @@ -749,11 +815,16 @@ int InsetInclude::plaintext(odocstream & os, OutputParams const &) const os << includedFileName(buffer(), params()).fileContents("UTF-8"); os << "\n]"; return PLAINTEXT_NEWLINE + 1; // one char on a separate line - } else { + } + + Buffer const * const ibuf = loadIfNeeded(); + if (!ibuf) { docstring const str = '[' + screenLabel() + ']'; os << str; return str.size(); } + writePlaintextFile(*ibuf, os, op); + return 0; } @@ -778,8 +849,14 @@ int InsetInclude::docbook(odocstream & os, OutputParams const & runparams) const return 0; } + string exppath = incfile; + if (!runparams.export_folder.empty()) { + exppath = makeAbsPath(exppath, runparams.export_folder).realPath(); + FileName(exppath).onlyPath().createPath(); + } + // write it to a file (so far the complete file) - string const exportfile = changeExtension(incfile, ".sgml"); + string const exportfile = changeExtension(exppath, ".sgml"); DocFileName writefile(changeExtension(included_file, ".sgml")); Buffer * tmp = loadIfNeeded(); @@ -794,7 +871,7 @@ int InsetInclude::docbook(odocstream & os, OutputParams const & runparams) const LYXERR(Debug::LATEX, "exportfile:" << exportfile); LYXERR(Debug::LATEX, "writefile:" << writefile); - tmp->makeDocBookFile(writefile, runparams, true); + tmp->makeDocBookFile(writefile, runparams, Buffer::OnlyBody); } runparams.exportdata->addExternalFile("docbook", writefile, @@ -836,6 +913,7 @@ void InsetInclude::validate(LaTeXFeatures & features) const features.includeFile(include_label, writefile); + features.useInsetLayout(getLayout()); if (isVerbatim(params())) features.require("verbatim"); else if (isListings(params())) @@ -856,7 +934,9 @@ void InsetInclude::validate(LaTeXFeatures & features) const // otherwise it would always be the master buffer, // and nested includes would not work. features.setBuffer(*tmp); + features.runparams().is_child = true; tmp->validate(features); + features.runparams().is_child = false; features.setBuffer(buffer()); } } @@ -916,9 +996,9 @@ void InsetInclude::draw(PainterInfo & pi, int x, int y) const } -docstring InsetInclude::contextMenuName() const +string InsetInclude::contextMenuName() const { - return from_ascii("context-include"); + return "context-include"; } @@ -928,6 +1008,13 @@ Inset::DisplayType InsetInclude::display() const } +docstring InsetInclude::layoutName() const +{ + if (isListings(params())) + return from_ascii("IncludeListings"); + return InsetCommand::layoutName(); +} + // // preview stuff @@ -1042,7 +1129,7 @@ void InsetInclude::updateCommand() return; docstring old_label = label_->getParam("name"); - label_->updateCommand(old_label, false); + label_->updateLabel(old_label); // the label might have been adapted (duplicate) docstring new_label = label_->getParam("name"); if (old_label == new_label) @@ -1057,8 +1144,11 @@ void InsetInclude::updateCommand() setParams(p); } + void InsetInclude::updateBuffer(ParIterator const & it, UpdateType utype) { + button_.update(screenLabel(), true); + Buffer const * const childbuffer = getChildBuffer(); if (childbuffer) { childbuffer->updateBuffer(Buffer::UpdateChildOnly, utype);