X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FBuffer.cpp;h=aa6d936aec8e6fa00b4c92a4e71c386280e21078;hb=94f0968e9212f24997cfee0d17c6f060210edbc6;hp=53fa935451c8c44366c50bfb7971ba30a2582b66;hpb=e74468b4beaebd4b6d5983c28f38b5cb1331e574;p=lyx.git diff --git a/src/Buffer.cpp b/src/Buffer.cpp index 53fa935451..aa6d936aec 100644 --- a/src/Buffer.cpp +++ b/src/Buffer.cpp @@ -400,7 +400,7 @@ Buffer::~Buffer() Impl::BufferPositionMap::iterator end = d->children_positions.end(); for (; it != end; ++it) { Buffer * child = const_cast(it->first); - if (d->cloned_buffer_) + if (isClone()) delete child; // The child buffer might have been closed already. else if (theBufferList().isLoaded(child)) @@ -953,7 +953,7 @@ void Buffer::setFullyLoaded(bool value) PreviewLoader * Buffer::loader() const { - if (lyxrc.preview == LyXRC::PREVIEW_OFF) + if (!isExporting() && lyxrc.preview == LyXRC::PREVIEW_OFF) return 0; if (!d->preview_loader_) d->preview_loader_ = new PreviewLoader(*this); @@ -1301,7 +1301,7 @@ bool Buffer::write(ostream & ofs) const bool Buffer::makeLaTeXFile(FileName const & fname, string const & original_path, OutputParams const & runparams_in, - bool output_preamble, bool output_body) const + OutputWhat output) const { OutputParams runparams = runparams_in; @@ -1340,8 +1340,7 @@ bool Buffer::makeLaTeXFile(FileName const & fname, try { os.texrow().reset(); - writeLaTeXSource(os, original_path, - runparams, output_preamble, output_body); + writeLaTeXSource(os, original_path, runparams, output); } catch (EncodingException & e) { odocstringstream ods; @@ -1386,7 +1385,7 @@ bool Buffer::makeLaTeXFile(FileName const & fname, void Buffer::writeLaTeXSource(otexstream & os, string const & original_path, OutputParams const & runparams_in, - bool const output_preamble, bool const output_body) const + OutputWhat output) const { // The child documents, if any, shall be already loaded at this point. @@ -1401,6 +1400,11 @@ void Buffer::writeLaTeXSource(otexstream & os, validate(features); LYXERR(Debug::LATEX, " Buffer validation done."); + bool const output_preamble = + output == FullSource || output == OnlyPreamble; + bool const output_body = + output == FullSource || output == OnlyBody; + // The starting paragraph of the coming rows is the // first paragraph of the document. (Asger) if (output_preamble && runparams.nice) { @@ -1562,7 +1566,7 @@ void Buffer::writeLaTeXSource(otexstream & os, void Buffer::makeDocBookFile(FileName const & fname, OutputParams const & runparams, - bool const body_only) const + OutputWhat output) const { LYXERR(Debug::LATEX, "makeDocBookFile..."); @@ -1575,7 +1579,7 @@ void Buffer::makeDocBookFile(FileName const & fname, updateBuffer(); updateMacroInstances(OutputUpdate); - writeDocBookSource(ofs, fname.absFileName(), runparams, body_only); + writeDocBookSource(ofs, fname.absFileName(), runparams, output); ofs.close(); if (ofs.fail()) @@ -1585,7 +1589,7 @@ void Buffer::makeDocBookFile(FileName const & fname, void Buffer::writeDocBookSource(odocstream & os, string const & fname, OutputParams const & runparams, - bool const only_body) const + OutputWhat output) const { LaTeXFeatures features(*this, params(), runparams); validate(features); @@ -1595,7 +1599,12 @@ void Buffer::writeDocBookSource(odocstream & os, string const & fname, DocumentClass const & tclass = params().documentClass(); string const top_element = tclass.latexname(); - if (!only_body) { + bool const output_preamble = + output == FullSource || output == OnlyPreamble; + bool const output_body = + output == FullSource || output == OnlyBody; + + if (output_preamble) { if (runparams.flavor == OutputParams::XML) os << "\n"; @@ -1630,29 +1639,31 @@ void Buffer::writeDocBookSource(odocstream & os, string const & fname, os << ">\n\n"; } - string top = top_element; - top += " lang=\""; - if (runparams.flavor == OutputParams::XML) - top += params().language->code(); - else - top += params().language->code().substr(0, 2); - top += '"'; - - if (!params().options.empty()) { - top += ' '; - top += params().options; + if (output_body) { + string top = top_element; + top += " lang=\""; + if (runparams.flavor == OutputParams::XML) + top += params().language->code(); + else + top += params().language->code().substr(0, 2); + top += '"'; + + if (!params().options.empty()) { + top += ' '; + top += params().options; + } + + os << "\n"; + + params().documentClass().counters().reset(); + + sgml::openTag(os, top); + os << '\n'; + docbookParagraphs(text(), *this, os, runparams); + sgml::closeTag(os, top_element); } - - os << "\n"; - - params().documentClass().counters().reset(); - - sgml::openTag(os, top); - os << '\n'; - docbookParagraphs(text(), *this, os, runparams); - sgml::closeTag(os, top_element); } @@ -1670,7 +1681,7 @@ void Buffer::makeLyXHTMLFile(FileName const & fname, updateBuffer(UpdateMaster, OutputUpdate); updateMacroInstances(OutputUpdate); - writeLyXHTMLSource(ofs, runparams); + writeLyXHTMLSource(ofs, runparams, FullSource); ofs.close(); if (ofs.fail()) @@ -1680,13 +1691,18 @@ void Buffer::makeLyXHTMLFile(FileName const & fname, void Buffer::writeLyXHTMLSource(odocstream & os, OutputParams const & runparams, - bool const only_body) const + OutputWhat output) const { LaTeXFeatures features(*this, params(), runparams); validate(features); d->bibinfo_.makeCitationLabels(*this); - if (!only_body) { + bool const output_preamble = + output == FullSource || output == OnlyPreamble; + bool const output_body = + output == FullSource || output == OnlyBody; + + if (output_preamble) { os << "\n" << "\n" // FIXME Language should be set properly. @@ -1698,7 +1714,9 @@ void Buffer::writeLyXHTMLSource(odocstream & os, docstring const & doctitle = features.htmlTitle(); os << "" - << (doctitle.empty() ? from_ascii("LyX Document") : doctitle) + << (doctitle.empty() ? + from_ascii("LyX Document") : + html::htmlize(doctitle, XHTMLStream::ESCAPE_ALL)) << "\n"; os << "\n\n" @@ -1728,14 +1746,19 @@ void Buffer::writeLyXHTMLSource(odocstream & os, << ";\n"; os << "}\n\n"; } - os << "\n\n"; + os << "\n"; } - XHTMLStream xs(os); - params().documentClass().counters().reset(); - xhtmlParagraphs(text(), *this, xs, runparams); - if (!only_body) - os << "\n\n"; + if (output_body) { + os << "\n"; + XHTMLStream xs(os); + params().documentClass().counters().reset(); + xhtmlParagraphs(text(), *this, xs, runparams); + os << "\n"; + } + + if (output_preamble) + os << "\n"; } @@ -2095,7 +2118,7 @@ void Buffer::dispatch(FuncRequest const & func, DispatchResult & dr) break; case LFUN_BUFFER_EXPORT: { - ExportStatus const status = doExport(argument, false, false); + ExportStatus const status = doExport(argument, false); dr.setError(status != ExportSuccess); if (status != ExportSuccess) dr.setMessage(bformat(_("Error exporting to format: %1$s."), @@ -2104,7 +2127,7 @@ void Buffer::dispatch(FuncRequest const & func, DispatchResult & dr) } case LFUN_BUILD_PROGRAM: - doExport("program", true, false); + doExport("program", true); break; case LFUN_BUFFER_CHKTEX: @@ -2136,7 +2159,7 @@ void Buffer::dispatch(FuncRequest const & func, DispatchResult & dr) break; } else { - doExport(format_name, true, false, filename); + doExport(format_name, true, filename); } // Substitute $$FName for filename @@ -3165,7 +3188,7 @@ void Buffer::changeRefsIfUnique(docstring const & from, docstring const & to, void Buffer::getSourceCode(odocstream & os, string const format, pit_type par_begin, pit_type par_end, - bool full_source) const + OutputWhat output) const { OutputParams runparams(¶ms().encoding()); runparams.nice = true; @@ -3174,21 +3197,7 @@ void Buffer::getSourceCode(odocstream & os, string const format, // No side effect of file copying and image conversion runparams.dryrun = true; - if (full_source) { - os << "% " << _("Preview source code") << "\n\n"; - d->texrow.reset(); - d->texrow.newline(); - d->texrow.newline(); - if (params().isDocBook()) - writeDocBookSource(os, absFileName(), runparams, false); - else if (runparams.flavor == OutputParams::HTML) - writeLyXHTMLSource(os, runparams, false); - else { - // latex or literate - otexstream ots(os, d->texrow); - writeLaTeXSource(ots, string(), runparams, true, true); - } - } else { + if (output == CurrentParagraph) { runparams.par_begin = par_begin; runparams.par_end = par_end; if (par_begin + 1 == par_end) { @@ -3217,6 +3226,27 @@ void Buffer::getSourceCode(odocstream & os, string const format, otexstream ots(os, texrow); latexParagraphs(*this, text(), ots, runparams); } + } else { + os << "% "; + if (output == FullSource) + os << _("Preview source code"); + else if (output == OnlyPreamble) + os << _("Preview preamble"); + else if (output == OnlyBody) + os << _("Preview body"); + os << "\n\n"; + d->texrow.reset(); + d->texrow.newline(); + d->texrow.newline(); + if (params().isDocBook()) + writeDocBookSource(os, absFileName(), runparams, output); + else if (runparams.flavor == OutputParams::HTML) + writeLyXHTMLSource(os, runparams, output); + else { + // latex or literate + otexstream ots(os, d->texrow); + writeLaTeXSource(ots, string(), runparams, output); + } } } @@ -3447,23 +3477,22 @@ bool Buffer::autoSave() const } -namespace { - // helper class, to guarantee this gets reset properly - class MarkAsExporting { - public: - MarkAsExporting(Buffer const * buf) : buf_(buf) - { - LASSERT(buf_, /* */); - buf_->setExportStatus(true); - } - ~MarkAsExporting() - { - buf_->setExportStatus(false); - } - private: - Buffer const * const buf_; - }; -} +// helper class, to guarantee this gets reset properly +class Buffer::MarkAsExporting { +public: + MarkAsExporting(Buffer const * buf) : buf_(buf) + { + LASSERT(buf_, /* */); + buf_->setExportStatus(true); + } + ~MarkAsExporting() + { + buf_->setExportStatus(false); + } +private: + Buffer const * const buf_; +}; + void Buffer::setExportStatus(bool e) const @@ -3483,14 +3512,32 @@ bool Buffer::isExporting() const } -bool Buffer::doExport(string const & target, bool put_in_tempdir) const +Buffer::ExportStatus Buffer::doExport(string const & target, bool put_in_tempdir) + const +{ + string result_file; + return doExport(target, put_in_tempdir, result_file); +} + +Buffer::ExportStatus Buffer::doExport(string const & target, bool put_in_tempdir, + string & result_file) const { bool const update_unincluded = params().maintain_unincluded_children && !params().getIncludedChildren().empty(); - return (doExport(target, put_in_tempdir, update_unincluded) == ExportSuccess); + + // (1) export with all included children (omit \includeonly) + if (update_unincluded) { + ExportStatus const status = + doExport(target, put_in_tempdir, true, result_file); + if (status != ExportSuccess) + return status; + } + // (2) export with included children only + return doExport(target, put_in_tempdir, false, result_file); } + Buffer::ExportStatus Buffer::doExport(string const & target, bool put_in_tempdir, bool includeall, string & result_file) const { @@ -3700,7 +3747,10 @@ Buffer::ExportStatus Buffer::doExport(string const & target, bool put_in_tempdir if (status == CANCEL) { message(_("Document export cancelled.")); - } else if (tmp_result_file.exists()) { + return ExportCancel; + } + + if (tmp_result_file.exists()) { // Finally copy the main file use_force = use_gui ? lyxrc.export_overwrite != NO_FILES : force_overwrite != NO_FILES; @@ -3709,10 +3759,15 @@ Buffer::ExportStatus Buffer::doExport(string const & target, bool put_in_tempdir status = copyFile(format, tmp_result_file, FileName(result_file), result_file, status == FORCE); - message(bformat(_("Document exported as %1$s " - "to file `%2$s'"), - formats.prettyName(format), - makeDisplayPath(result_file))); + if (status == CANCEL) { + message(_("Document export cancelled.")); + return ExportCancel; + } else { + message(bformat(_("Document exported as %1$s " + "to file `%2$s'"), + formats.prettyName(format), + makeDisplayPath(result_file))); + } } else { // This must be a dummy converter like fax (bug 1888) message(bformat(_("Document exported as %1$s"), @@ -3723,29 +3778,12 @@ Buffer::ExportStatus Buffer::doExport(string const & target, bool put_in_tempdir } -Buffer::ExportStatus Buffer::doExport(string const & target, bool put_in_tempdir, - bool includeall) const -{ - string result_file; - // (1) export with all included children (omit \includeonly) - if (includeall) { - ExportStatus const status = - doExport(target, put_in_tempdir, true, result_file); - if (status != ExportSuccess) - return status; - } - // (2) export with included children only - return doExport(target, put_in_tempdir, false, result_file); -} - - -bool Buffer::preview(string const & format) const +Buffer::ExportStatus Buffer::preview(string const & format) const { bool const update_unincluded = params().maintain_unincluded_children && !params().getIncludedChildren().empty(); - ExportStatus const status = preview(format, update_unincluded); - return (status == PreviewSuccess); + return preview(format, update_unincluded); } Buffer::ExportStatus Buffer::preview(string const & format, bool includeall) const @@ -3754,7 +3792,7 @@ Buffer::ExportStatus Buffer::preview(string const & format, bool includeall) con string result_file; // (1) export with all included children (omit \includeonly) if (includeall) { - ExportStatus const status = doExport(format, true, true); + ExportStatus const status = doExport(format, true, true, result_file); if (status != ExportSuccess) return status; }