#include <map>
#include <set>
#include <sstream>
-#include <stack>
#include <vector>
using namespace std;
*/
bool file_fully_loaded;
+ /// Ignore the parent (e.g. when exporting a child standalone)?
+ bool ignore_parent;
+
///
mutable TocBackend toc_backend;
/// This is here to force the test to be done whenever parent_buffer
/// is accessed.
- Buffer const * parent() const {
+ Buffer const * parent() const
+ {
+ // ignore_parent temporarily "orphans" a buffer
+ // (e.g. if a child is compiled standalone)
+ if (ignore_parent)
+ return 0;
// if parent_buffer is not loaded, then it has been unloaded,
// which means that parent_buffer is an invalid pointer. So we
// set it to null in that case.
}
///
- void setParent(Buffer const * pb) {
+ void setParent(Buffer const * pb)
+ {
if (parent_buffer == pb)
// nothing to do
return;
/// \p from initial position
/// \p to points to the end position
void updateStatistics(DocIterator & from, DocIterator & to,
- bool skipNoOutput = true);
+ bool skipNoOutput = true);
/// statistics accessor functions
- int wordCount() const { return word_count_; }
- int charCount(bool with_blanks) const {
+ int wordCount() const
+ {
+ return word_count_;
+ }
+ int charCount(bool with_blanks) const
+ {
return char_count_
+ (with_blanks ? blank_count_ : 0);
}
Buffer const * cloned_buffer)
: owner_(owner), lyx_clean(true), bak_clean(true), unnamed(false),
internal_buffer(false), read_only(readonly_), filename(file),
- file_fully_loaded(false), toc_backend(owner), macro_lock(false),
- timestamp_(0), checksum_(0), wa_(0), gui_(0), undo_(*owner),
- bibinfo_cache_valid_(false), bibfile_cache_valid_(false),
+ file_fully_loaded(false), ignore_parent(false), toc_backend(owner),
+ macro_lock(false), timestamp_(0), checksum_(0), wa_(0), gui_(0),
+ undo_(*owner), bibinfo_cache_valid_(false), bibfile_cache_valid_(false),
cite_labels_valid_(false), preview_loader_(0),
cloned_buffer_(cloned_buffer), clone_list_(0),
doing_export(false), parent_buffer(0)
Buffer * Buffer::cloneFromMaster() const
{
BufferMap bufmap;
- cloned_buffers.push_back(new CloneList());
+ cloned_buffers.push_back(new CloneList);
CloneList * clones = cloned_buffers.back();
masterBuffer()->cloneWithChildren(bufmap, clones);
Buffer * Buffer::cloneBufferOnly() const {
- cloned_buffers.push_back(new CloneList());
+ cloned_buffers.push_back(new CloneList);
CloneList * clones = cloned_buffers.back();
Buffer * buffer_clone = new Buffer(fileName().absFileName(), false, this);
clones->insert(buffer_clone);
ofdocstream ofs;
try { ofs.reset(encoding); }
- catch (iconv_codecvt_facet_exception & e) {
+ catch (iconv_codecvt_facet_exception const & e) {
lyxerr << "Caught iconv exception: " << e.what() << endl;
Alert::error(_("Iconv software exception Detected"), bformat(_("Please "
"verify that the support software for your encoding (%1$s) is "
os.texrow().reset();
writeLaTeXSource(os, original_path, runparams, output);
}
- catch (EncodingException & e) {
+ catch (EncodingException const & e) {
odocstringstream ods;
ods.put(e.failed_char);
ostringstream oss;
e.par_id, e.pos, e.pos + 1));
failed_export = true;
}
- catch (iconv_codecvt_facet_exception & e) {
+ catch (iconv_codecvt_facet_exception const & e) {
errorList.push_back(ErrorItem(_("iconv conversion failed"),
_(e.what()), -1, 0, 0));
failed_export = true;
void Buffer::writeLaTeXSource(otexstream & os,
string const & original_path,
OutputParams const & runparams_in,
- OutputWhat output) const
+ OutputWhat output) const
{
// The child documents, if any, shall be already loaded at this point.
OutputParams runparams = runparams_in;
+ // If we are compiling a file standalone, even if this is the
+ // child of some other buffer, let's cut the link here, so the
+ // file is really independent and no concurring settings from
+ // the master (e.g. branch state) interfere (see #8100).
+ if (!runparams.is_child)
+ d->ignore_parent = true;
+
// Classify the unicode characters appearing in math insets
Encodings::initUnicodeMath(*this);
runparams.use_japanese = features.isRequired("japanese");
- if (!output_body)
+ if (!output_body) {
+ // Restore the parenthood if needed
+ if (!runparams.is_child)
+ d->ignore_parent = false;
return;
+ }
// make the body.
os << "\\begin{document}\n";
LYXERR(Debug::INFO, "preamble finished, now the body.");
- // if we are doing a real file with body, even if this is the
- // child of some other buffer, let's cut the link here.
- // This happens for example if only a child document is printed.
- Buffer const * save_parent = 0;
- if (output_preamble) {
- save_parent = d->parent();
- d->setParent(0);
- }
-
// the real stuff
latexParagraphs(*this, text(), os, runparams);
// Restore the parenthood if needed
- if (output_preamble)
- d->setParent(save_parent);
+ if (!runparams.is_child)
+ d->ignore_parent = false;
// add this just in case after all the paragraphs
os << endl;
void Buffer::validate(LaTeXFeatures & features) const
{
- params().validate(features);
+ // Validate the buffer params, but not for included
+ // files, since they also use the parent buffer's
+ // params (# 5941)
+ if (!features.runparams().is_child)
+ params().validate(features);
for_each(paragraphs().begin(), paragraphs().end(),
bind(&Paragraph::validate, _1, ref(features)));
void Buffer::getSourceCode(odocstream & os, string const format,
pit_type par_begin, pit_type par_end,
- OutputWhat output) const
+ OutputWhat output, bool master) const
{
OutputParams runparams(¶ms().encoding());
runparams.nice = true;
} else if (params().isDocBook()) {
docbookParagraphs(text(), *this, os, runparams);
} else {
+ // If we are previewing a paragraph, even if this is the
+ // child of some other buffer, let's cut the link here,
+ // so that no concurring settings from the master
+ // (e.g. branch state) interfere (see #8101).
+ if (!master)
+ d->ignore_parent = true;
// We need to validate the Buffer params' features here
// in order to know if we should output polyglossia
// macros (instead of babel macros)
texrow.newline();
// latex or literate
otexstream ots(os, texrow);
+
+ // the real stuff
latexParagraphs(*this, text(), ots, runparams);
+
+ // Restore the parenthood
+ if (!master)
+ d->ignore_parent = false;
}
} else {
os << "% ";
writeLyXHTMLSource(os, runparams, output);
} else if (runparams.flavor == OutputParams::TEXT) {
if (output == OnlyPreamble) {
- os << _("% Plaintext does not have a preamble.");
+ os << "% "<< _("Plain text does not have a preamble.");
} else
writePlaintextFile(*this, os, runparams);
} else if (params().isDocBook()) {
d->texrow.newline();
d->texrow.newline();
otexstream ots(os, d->texrow);
+ if (master)
+ runparams.is_child = true;
writeLaTeXSource(ots, string(), runparams, output);
}
}
buf->d->bak_clean = true;
FileName const fname = getAutosaveFileName();
- if (d->cloned_buffer_) {
- // If this buffer is cloned, we assume that
- // we are running in a separate thread already.
- FileName const tmp_ret = FileName::tempName("lyxauto");
- if (!tmp_ret.empty()) {
- writeFile(tmp_ret);
- // assume successful write of tmp_ret
- if (tmp_ret.moveTo(fname))
- return true;
- }
- // failed to write/rename tmp_ret so try writing direct
- return writeFile(fname);
- } else {
- /// This function is deprecated as the frontend needs to take care
- /// of cloning the buffer and autosaving it in another thread. It
- /// is still here to allow (QT_VERSION < 0x040400).
- AutoSaveBuffer autosave(*this, fname);
- autosave.start();
- return true;
+ LASSERT(d->cloned_buffer_, return false);
+
+ // If this buffer is cloned, we assume that
+ // we are running in a separate thread already.
+ FileName const tmp_ret = FileName::tempName("lyxauto");
+ if (!tmp_ret.empty()) {
+ writeFile(tmp_ret);
+ // assume successful write of tmp_ret
+ if (tmp_ret.moveTo(fname))
+ return true;
}
+ // failed to write/rename tmp_ret so try writing direct
+ return writeFile(fname);
}
Counters & counters = textclass.counters();
if (par.params().startOfAppendix()) {
- // FIXME: only the counter corresponding to toplevel
- // sectioning should be reset
- counters.reset();
+ // We want to reset the counter corresponding to toplevel sectioning
+ Layout const & lay = textclass.getTOCLayout();
+ docstring const cnt = lay.counter;
+ if (!cnt.empty())
+ counters.reset(cnt);
counters.appendix(true);
}
par.params().appendix(counters.appendix());
}
-Buffer::ReadStatus Buffer::reload()
+Buffer::ReadStatus Buffer::reload(bool clearUndo)
{
setBusy(true);
// c.f. bug http://www.lyx.org/trac/ticket/6587
updateTitles();
markClean();
message(bformat(_("Document %1$s reloaded."), disp_fn));
- d->undo_.clear();
+ if (clearUndo)
+ d->undo_.clear();
} else {
message(bformat(_("Could not reload document %1$s."), disp_fn));
}