X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2Finsetinclude.C;h=36d745ffaab50d50390a14dbced97131035e6018;hb=e28331ed63062dea10d0a21b9ec12034b4b17b9a;hp=daa2a436783e5f0e9fc2ee4b84ac2cf5c889d678;hpb=6ada61e182f55c612b4d743f37b14c10d032ccad;p=lyx.git diff --git a/src/insets/insetinclude.C b/src/insets/insetinclude.C index daa2a43678..36d745ffaa 100644 --- a/src/insets/insetinclude.C +++ b/src/insets/insetinclude.C @@ -30,9 +30,9 @@ #include "lyxlex.h" #include "metricsinfo.h" #include "outputparams.h" +#include "TocBackend.h" #include "frontends/Alert.h" -#include "frontends/Application.h" #include "frontends/Painter.h" #include "graphics/PreviewImage.h" @@ -40,39 +40,37 @@ #include "insets/render_preview.h" -#include "support/lyxalgo.h" -#include "support/filename.h" #include "support/filetools.h" #include "support/lstrings.h" // contains +#include "support/lyxalgo.h" #include "support/lyxlib.h" #include "support/convert.h" #include #include -#include "support/std_ostream.h" - -#include - -using lyx::docstring; -using lyx::support::addName; -using lyx::support::absolutePath; -using lyx::support::bformat; -using lyx::support::changeExtension; -using lyx::support::contains; -using lyx::support::copy; -using lyx::support::FileName; -using lyx::support::getFileContents; -using lyx::support::isFileReadable; -using lyx::support::isLyXFilename; -using lyx::support::latex_path; -using lyx::support::makeAbsPath; -using lyx::support::makeDisplayPath; -using lyx::support::makeRelPath; -using lyx::support::onlyFilename; -using lyx::support::onlyPath; -using lyx::support::subst; -using lyx::support::sum; + +namespace lyx { + +using support::addName; +using support::absolutePath; +using support::bformat; +using support::changeExtension; +using support::contains; +using support::copy; +using support::DocFileName; +using support::FileName; +using support::getFileContents; +using support::isFileReadable; +using support::isLyXFilename; +using support::latex_path; +using support::makeAbsPath; +using support::makeDisplayPath; +using support::makeRelPath; +using support::onlyFilename; +using support::onlyPath; +using support::subst; +using support::sum; using std::endl; using std::string; @@ -81,16 +79,16 @@ using std::istringstream; using std::ostream; using std::ostringstream; -namespace Alert = lyx::frontend::Alert; +namespace Alert = frontend::Alert; namespace fs = boost::filesystem; namespace { -string const uniqueID() +docstring const uniqueID() { static unsigned int seed = 1000; - return "file" + convert(++seed); + return "file" + convert(++seed); } } // namespace anon @@ -127,8 +125,8 @@ void InsetInclude::doDispatch(LCursor & cur, FuncRequest & cmd) switch (cmd.action) { case LFUN_INSET_MODIFY: { - InsetCommandParams p; - InsetIncludeMailer::string2params(lyx::to_utf8(cmd.argument()), p); + InsetCommandParams p("include"); + InsetIncludeMailer::string2params(to_utf8(cmd.argument()), p); if (!p.getCmdName().empty()) { set(p, cur.buffer()); cur.buffer().updateBibfilesCache(); @@ -219,10 +217,10 @@ string const parentFilename(Buffer const & buffer) } -string const includedFilename(Buffer const & buffer, +FileName const includedFilename(Buffer const & buffer, InsetCommandParams const & params) { - return makeAbsPath(params.getContents(), + return makeAbsPath(to_utf8(params["filename"]), onlyPath(parentFilename(buffer))); } @@ -259,7 +257,7 @@ void InsetInclude::write(Buffer const &, ostream & os) const void InsetInclude::write(ostream & os) const { - os << "Include " << params_.getCommand() << '\n' + os << "Include " << to_utf8(params_.getCommand()) << '\n' << "preview " << convert(params_.preview()) << '\n'; } @@ -272,11 +270,31 @@ void InsetInclude::read(Buffer const &, LyXLex & lex) void InsetInclude::read(LyXLex & lex) { - params_.read(lex); + if (lex.isOK()) { + lex.next(); + string const command = lex.getString(); + params_.scanCommand(command); + } + string token; + while (lex.isOK()) { + lex.next(); + token = lex.getString(); + if (token == "\\end_inset") + break; + if (token == "preview") { + lex.next(); + params_.preview(lex.getBool()); + } else + lex.printError("Unknown parameter name `$$Token' for command " + params_.getCmdName()); + } + if (token != "\\end_inset") { + lex.printError("Missing \\end_inset at this point. " + "Read: `$$Token'"); + } } -string const InsetInclude::getScreenLabel(Buffer const &) const +docstring const InsetInclude::getScreenLabel(Buffer const &) const { docstring temp; @@ -295,15 +313,14 @@ string const InsetInclude::getScreenLabel(Buffer const &) const break; } - temp += lyx::from_ascii(": "); + temp += ": "; - if (params_.getContents().empty()) - temp += lyx::from_ascii("???"); + if (params_["filename"].empty()) + temp += "???"; else - temp += lyx::from_ascii(onlyFilename(params_.getContents())); + temp += from_utf8(onlyFilename(to_utf8(params_["filename"]))); - // FIXME UNICODE - return lyx::to_utf8(temp); + return temp; } @@ -315,11 +332,11 @@ Buffer * getChildBuffer(Buffer const & buffer, InsetCommandParams const & params if (isVerbatim(params)) return 0; - string const included_file = includedFilename(buffer, params); + string const included_file = includedFilename(buffer, params).absFilename(); if (!isLyXFilename(included_file)) return 0; - return theApp->bufferList().getBuffer(included_file); + return theBufferList().getBuffer(included_file); } @@ -329,16 +346,16 @@ bool loadIfNeeded(Buffer const & buffer, InsetCommandParams const & params) if (isVerbatim(params)) return false; - string const included_file = includedFilename(buffer, params); - if (!isLyXFilename(included_file)) + FileName const included_file = includedFilename(buffer, params); + if (!isLyXFilename(included_file.absFilename())) return false; - Buffer * buf = theApp->bufferList().getBuffer(included_file); + Buffer * buf = theBufferList().getBuffer(included_file.absFilename()); if (!buf) { // the readonly flag can/will be wrong, not anymore I think. - if (!fs::exists(included_file)) + if (!fs::exists(included_file.toFilesystemEncoding())) return false; - buf = theApp->bufferList().newBuffer(included_file); + buf = theBufferList().newBuffer(included_file.absFilename()); if (!loadLyXFile(buf, included_file)) return false; } @@ -351,30 +368,30 @@ bool loadIfNeeded(Buffer const & buffer, InsetCommandParams const & params) } // namespace anon -int InsetInclude::latex(Buffer const & buffer, ostream & os, +int InsetInclude::latex(Buffer const & buffer, odocstream & os, OutputParams const & runparams) const { - string incfile(params_.getContents()); + string incfile(to_utf8(params_["filename"])); // Do nothing if no file name has been specified if (incfile.empty()) return 0; - string const included_file = includedFilename(buffer, params_); + FileName const included_file(includedFilename(buffer, params_)); Buffer const * const m_buffer = buffer.getMasterBuffer(); // if incfile is relative, make it relative to the master // buffer directory. if (!absolutePath(incfile)) { - incfile = makeRelPath(included_file, + incfile = makeRelPath(included_file.absFilename(), m_buffer->filePath()); } // write it to a file (so far the complete file) string const exportfile = changeExtension(incfile, ".tex"); - string const mangled = FileName(changeExtension(included_file, + string const mangled = DocFileName(changeExtension(included_file.absFilename(), ".tex")).mangledFilename(); - string const writefile = makeAbsPath(mangled, m_buffer->temppath()); + FileName const writefile(makeAbsPath(mangled, m_buffer->temppath())); if (!runparams.nice) incfile = mangled; @@ -386,16 +403,16 @@ int InsetInclude::latex(Buffer const & buffer, ostream & os, // Don't try to load or copy the file ; else if (loadIfNeeded(buffer, params_)) { - Buffer * tmp = theApp->bufferList().getBuffer(included_file); + Buffer * tmp = theBufferList().getBuffer(included_file.absFilename()); if (tmp->params().textclass != m_buffer->params().textclass) { // FIXME UNICODE docstring text = bformat(_("Included file `%1$s'\n" "has textclass `%2$s'\n" "while parent file has textclass `%3$s'."), - makeDisplayPath(included_file), - lyx::from_utf8(tmp->params().getLyXTextClass().name()), - lyx::from_utf8(m_buffer->params().getLyXTextClass().name())); + makeDisplayPath(included_file.absFilename()), + from_utf8(tmp->params().getLyXTextClass().name()), + from_utf8(m_buffer->params().getLyXTextClass().name())); Alert::warning(_("Different textclasses"), text); //return 0; } @@ -423,9 +440,9 @@ int InsetInclude::latex(Buffer const & buffer, ostream & os, if (!copy(included_file, writefile)) { // FIXME UNICODE lyxerr[Debug::LATEX] - << lyx::to_utf8(bformat(_("Could not copy the file\n%1$s\n" + << to_utf8(bformat(_("Could not copy the file\n%1$s\n" "into the temporary directory."), - lyx::from_utf8(included_file))) + from_utf8(included_file.absFilename()))) << endl; return 0; } @@ -436,21 +453,25 @@ int InsetInclude::latex(Buffer const & buffer, ostream & os, "latex" : "pdflatex"; if (isVerbatim(params_)) { incfile = latex_path(incfile); - os << '\\' << params_.getCmdName() << '{' << incfile << '}'; + // FIXME UNICODE + os << '\\' << from_ascii(params_.getCmdName()) << '{' + << from_utf8(incfile) << '}'; } else if (type(params_) == INPUT) { runparams.exportdata->addExternalFile(tex_format, writefile, exportfile); // \input wants file with extension (default is .tex) - if (!isLyXFilename(included_file)) { + if (!isLyXFilename(included_file.absFilename())) { incfile = latex_path(incfile); - os << '\\' << params_.getCmdName() << '{' << incfile << '}'; + // FIXME UNICODE + os << '\\' << from_ascii(params_.getCmdName()) + << '{' << from_utf8(incfile) << '}'; } else { incfile = changeExtension(incfile, ".tex"); incfile = latex_path(incfile); - os << '\\' << params_.getCmdName() << '{' - << incfile - << '}'; + // FIXME UNICODE + os << '\\' << from_ascii(params_.getCmdName()) + << '{' << from_utf8(incfile) << '}'; } } else { runparams.exportdata->addExternalFile(tex_format, writefile, @@ -460,21 +481,22 @@ int InsetInclude::latex(Buffer const & buffer, ostream & os, // file really have .tex incfile = changeExtension(incfile, string()); incfile = latex_path(incfile); - os << '\\' << params_.getCmdName() << '{' - << incfile - << '}'; + // FIXME UNICODE + os << '\\' << from_ascii(params_.getCmdName()) << '{' + << from_utf8(incfile) << '}'; } return 0; } -int InsetInclude::plaintext(Buffer const & buffer, ostream & os, +int InsetInclude::plaintext(Buffer const & buffer, odocstream & os, OutputParams const &) const { if (isVerbatim(params_)) { - string const str = - getFileContents(includedFilename(buffer, params_)); + // FIXME: We don't know the encoding of the file + docstring const str = from_utf8( + getFileContents(includedFilename(buffer, params_))); os << str; // Return how many newlines we issued. return int(lyx::count(str.begin(), str.end(), '\n')); @@ -483,25 +505,25 @@ int InsetInclude::plaintext(Buffer const & buffer, ostream & os, } -int InsetInclude::docbook(Buffer const & buffer, ostream & os, +int InsetInclude::docbook(Buffer const & buffer, odocstream & os, OutputParams const & runparams) const { - string incfile(params_.getContents()); + string incfile = to_utf8(params_["filename"]); // Do nothing if no file name has been specified if (incfile.empty()) return 0; - string const included_file = includedFilename(buffer, params_); + string const included_file = includedFilename(buffer, params_).absFilename(); // write it to a file (so far the complete file) string const exportfile = changeExtension(incfile, ".sgml"); - string writefile = changeExtension(included_file, ".sgml"); + DocFileName writefile(changeExtension(included_file, ".sgml")); if (loadIfNeeded(buffer, params_)) { - Buffer * tmp = theApp->bufferList().getBuffer(included_file); + Buffer * tmp = theBufferList().getBuffer(included_file); - string const mangled = FileName(writefile).mangledFilename(); + string const mangled = writefile.mangledFilename(); writefile = makeAbsPath(mangled, buffer.getMasterBuffer()->temppath()); if (!runparams.nice) @@ -524,7 +546,7 @@ int InsetInclude::docbook(Buffer const & buffer, ostream & os, << '&' << include_label << ';' << "\" format=\"linespecific\">"; } else - os << '&' << include_label << ';'; + os << '&' << include_label << ';'; return 0; } @@ -532,12 +554,12 @@ int InsetInclude::docbook(Buffer const & buffer, ostream & os, void InsetInclude::validate(LaTeXFeatures & features) const { - string incfile(params_.getContents()); + string incfile(to_utf8(params_["filename"])); string writefile; Buffer const & buffer = features.buffer(); - string const included_file = includedFilename(buffer, params_); + string const included_file = includedFilename(buffer, params_).absFilename(); if (isLyXFilename(included_file)) writefile = changeExtension(included_file, ".sgml"); @@ -545,9 +567,9 @@ void InsetInclude::validate(LaTeXFeatures & features) const writefile = included_file; if (!features.runparams().nice && !isVerbatim(params_)) { - incfile = FileName(writefile).mangledFilename(); + incfile = DocFileName(writefile).mangledFilename(); writefile = makeAbsPath(incfile, - buffer.getMasterBuffer()->temppath()); + buffer.getMasterBuffer()->temppath()).absFilename(); } features.includeFile(include_label, writefile); @@ -560,7 +582,7 @@ void InsetInclude::validate(LaTeXFeatures & features) const // to be loaded: if (loadIfNeeded(buffer, params_)) { // a file got loaded - Buffer * const tmp = theApp->bufferList().getBuffer(included_file); + Buffer * const tmp = theBufferList().getBuffer(included_file); if (tmp) { // We must temporarily change features.buffer, // otherwise it would always be the master buffer, @@ -574,11 +596,11 @@ void InsetInclude::validate(LaTeXFeatures & features) const void InsetInclude::getLabelList(Buffer const & buffer, - std::vector & list) const + std::vector & list) const { if (loadIfNeeded(buffer, params_)) { - string const included_file = includedFilename(buffer, params_); - Buffer * tmp = theApp->bufferList().getBuffer(included_file); + string const included_file = includedFilename(buffer, params_).absFilename(); + Buffer * tmp = theBufferList().getBuffer(included_file); tmp->setParentName(""); tmp->getLabelList(list); tmp->setParentName(parentFilename(buffer)); @@ -587,11 +609,11 @@ void InsetInclude::getLabelList(Buffer const & buffer, void InsetInclude::fillWithBibKeys(Buffer const & buffer, - std::vector > & keys) const + std::vector > & keys) const { if (loadIfNeeded(buffer, params_)) { - string const included_file = includedFilename(buffer, params_); - Buffer * tmp = theApp->bufferList().getBuffer(included_file); + string const included_file = includedFilename(buffer, params_).absFilename(); + Buffer * tmp = theBufferList().getBuffer(included_file); tmp->setParentName(""); tmp->fillWithBibKeys(keys); tmp->setParentName(parentFilename(buffer)); @@ -610,28 +632,28 @@ void InsetInclude::updateBibfilesCache(Buffer const & buffer) } -std::vector const & +std::vector const & InsetInclude::getBibfilesCache(Buffer const & buffer) const { Buffer * const tmp = getChildBuffer(buffer, params_); if (tmp) { tmp->setParentName(""); - std::vector const & cache = tmp->getBibfilesCache(); + std::vector const & cache = tmp->getBibfilesCache(); tmp->setParentName(parentFilename(buffer)); return cache; } - static std::vector const empty; + static std::vector const empty; return empty; } -void InsetInclude::metrics(MetricsInfo & mi, Dimension & dim) const +bool InsetInclude::metrics(MetricsInfo & mi, Dimension & dim) const { BOOST_ASSERT(mi.base.bv && mi.base.bv->buffer()); bool use_preview = false; if (RenderPreview::status() != LyXRC::PREVIEW_OFF) { - lyx::graphics::PreviewImage const * pimage = + graphics::PreviewImage const * pimage = preview_->getPreviewImage(*mi.base.bv->buffer()); use_preview = pimage && pimage->image(); } @@ -650,7 +672,9 @@ void InsetInclude::metrics(MetricsInfo & mi, Dimension & dim) const Box b(0, dim.wid, -dim.asc, dim.des); button_.setBox(b); + bool const changed = dim_ != dim; dim_ = dim; + return changed; } @@ -662,7 +686,7 @@ void InsetInclude::draw(PainterInfo & pi, int x, int y) const bool use_preview = false; if (RenderPreview::status() != LyXRC::PREVIEW_OFF) { - lyx::graphics::PreviewImage const * pimage = + graphics::PreviewImage const * pimage = preview_->getPreviewImage(*pi.base.bv->buffer()); use_preview = pimage && pimage->image(); } @@ -701,16 +725,16 @@ namespace { bool preview_wanted(InsetCommandParams const & params, Buffer const & buffer) { - string const included_file = includedFilename(buffer, params); + FileName const included_file = includedFilename(buffer, params); return type(params) == INPUT && params.preview() && isFileReadable(included_file); } -string const latex_string(InsetInclude const & inset, Buffer const & buffer) +docstring const latex_string(InsetInclude const & inset, Buffer const & buffer) { - ostringstream os; + odocstringstream os; OutputParams runparams; runparams.flavor = OutputParams::LATEX; inset.latex(buffer, os, runparams); @@ -726,7 +750,7 @@ void add_preview(RenderMonitoredPreview & renderer, InsetInclude const & inset, if (RenderPreview::status() != LyXRC::PREVIEW_OFF && preview_wanted(params, buffer)) { renderer.setAbsFile(includedFilename(buffer, params)); - string const snippet = latex_string(inset, buffer); + docstring const snippet = latex_string(inset, buffer); renderer.addPreview(snippet, buffer); } } @@ -734,17 +758,42 @@ void add_preview(RenderMonitoredPreview & renderer, InsetInclude const & inset, } // namespace anon -void InsetInclude::addPreview(lyx::graphics::PreviewLoader & ploader) const +void InsetInclude::addPreview(graphics::PreviewLoader & ploader) const { Buffer const & buffer = ploader.buffer(); if (preview_wanted(params(), buffer)) { preview_->setAbsFile(includedFilename(buffer, params())); - string const snippet = latex_string(*this, buffer); + docstring const snippet = latex_string(*this, buffer); preview_->addPreview(snippet, ploader); } } +void InsetInclude::addToToc(TocList & toclist, Buffer const & buffer) const +{ + Buffer const * const childbuffer = getChildBuffer(buffer, params_); + if (!childbuffer) + return; + + TocList const & childtoclist = childbuffer->tocBackend().tocs(); + TocList::const_iterator it = childtoclist.begin(); + TocList::const_iterator const end = childtoclist.end(); + for(; it != end; ++it) + toclist[it->first].insert(toclist[it->first].end(), + it->second.begin(), it->second.end()); +} + + +void InsetInclude::updateLabels(Buffer const & buffer) const +{ + Buffer const * const childbuffer = getChildBuffer(buffer, params_); + if (!childbuffer) + return; + + lyx::updateLabels(*childbuffer, true); +} + + string const InsetIncludeMailer::name_("include"); InsetIncludeMailer::InsetIncludeMailer(InsetInclude & inset) @@ -761,7 +810,7 @@ string const InsetIncludeMailer::inset2string(Buffer const &) const void InsetIncludeMailer::string2params(string const & in, InsetCommandParams & params) { - params = InsetCommandParams(); + params.clear(); if (in.empty()) return; @@ -797,3 +846,6 @@ InsetIncludeMailer::params2string(InsetCommandParams const & params) data << "\\end_inset\n"; return data.str(); } + + +} // namespace lyx