X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FBuffer.cpp;h=8ca74103a232a48705cd0814cdb14ab1dba8a768;hb=c5cab5a8f7e1f0f3996c1655c45a0fb88576dd5f;hp=7569a4ec128d5404b56f656f7137d4c778508388;hpb=64acc06b919e08001cb8ff8d5b69e0902176fe35;p=lyx.git diff --git a/src/Buffer.cpp b/src/Buffer.cpp index 7569a4ec12..8ca74103a2 100644 --- a/src/Buffer.cpp +++ b/src/Buffer.cpp @@ -562,13 +562,13 @@ Buffer::~Buffer() } -Buffer * Buffer::cloneFromMaster() const +Buffer * Buffer::cloneWithChildren() const { BufferMap bufmap; cloned_buffers.push_back(new CloneList); CloneList * clones = cloned_buffers.back(); - masterBuffer()->cloneWithChildren(bufmap, clones); + cloneWithChildren(bufmap, clones); // make sure we got cloned BufferMap::const_iterator bit = bufmap.find(this); @@ -888,6 +888,7 @@ int Buffer::readHeader(Lexer & lex) params().options.erase(); params().master.erase(); params().float_placement.erase(); + params().float_alignment.erase(); params().paperwidth.erase(); params().paperheight.erase(); params().leftmargin.erase(); @@ -1040,6 +1041,10 @@ bool Buffer::readDocument(Lexer & lex) << absFileName() << ") does not include " "this document. Ignoring the master assignment."); + // If the master has just been created, un-hide it (#11162) + if (!master->fileName().exists()) + lyx::dispatch(FuncRequest(LFUN_BUFFER_SWITCH, + master->absFileName())); } } } @@ -1329,14 +1334,37 @@ Buffer::ReadStatus Buffer::convertLyXFormat(FileName const & fn, FileName Buffer::getBackupName() const { + map const file_formats = { + {544, "23"}, + {508, "22"}, + {474, "21"}, + {413, "20"}, + {345, "16"}, + {276, "15"}, + {245, "14"}, + {221, "13"}, + {220, "12"}, + {218, "1163"}, + {217, "116"}, + {216, "115"}, + {215, "11"}, + {210, "010"}, + {200, "006"} + }; FileName const & fn = fileName(); string const fname = fn.onlyFileNameWithoutExt(); string const fext = fn.extension() + "~"; string const fpath = lyxrc.backupdir_path.empty() ? fn.onlyPath().absFileName() : lyxrc.backupdir_path; - string const fform = convert(d->file_format); - string const backname = fname + "-lyxformat-" + fform; + string backup_suffix; + // If file format is from a stable series use version instead of file format + auto const it = file_formats.find(d->file_format); + if (it != file_formats.end()) + backup_suffix = "-lyx" + it->second; + else + backup_suffix = "-lyxformat-" + convert(d->file_format); + string const backname = fname + backup_suffix; FileName backup(addName(fpath, addExtension(backname, fext))); // limit recursion, just in case @@ -1874,8 +1902,7 @@ Buffer::ExportStatus Buffer::writeLaTeXSource(otexstream & os, "file path name."), inputpath, uncodable_glyphs)); } else { - string docdir = - latex_path(original_path); + string docdir = os::latex_path(original_path); if (contains(docdir, '#')) { docdir = subst(docdir, "#", "\\#"); os << "\\catcode`\\#=11" @@ -1886,9 +1913,20 @@ Buffer::ExportStatus Buffer::writeLaTeXSource(otexstream & os, os << "\\catcode`\\%=11" "\\def\\%{%}\\catcode`\\%=14\n"; } + bool const detokenize = !isAscii(from_utf8(docdir)); + bool const quote = contains(docdir, ' '); os << "\\makeatletter\n" - << "\\def\\input@path{{" - << docdir << "}}\n" + << "\\def\\input@path{{"; + if (detokenize) + os << "\\detokenize{"; + if (quote) + os << "\""; + os << docdir; + if (quote) + os << "\""; + if (detokenize) + os << "}"; + os << "}}\n" << "\\makeatother\n"; } } @@ -2382,7 +2420,8 @@ BiblioInfo const & Buffer::bibInfo() const } -void Buffer::registerBibfiles(FileNamePairList const & bf) const { +void Buffer::registerBibfiles(FileNamePairList const & bf) const +{ // We register the bib files in the master buffer, // if there is one, but also in every single buffer, // in case a child is compiled alone. @@ -2430,17 +2469,17 @@ void Buffer::checkIfBibInfoCacheIsValid() const } -void Buffer::reloadBibInfoCache() const +void Buffer::reloadBibInfoCache(bool const force) const { // use the master's cache Buffer const * const tmp = masterBuffer(); if (tmp != this) { - tmp->reloadBibInfoCache(); + tmp->reloadBibInfoCache(force); return; } checkIfBibInfoCacheIsValid(); - if (d->bibinfo_cache_valid_) + if (d->bibinfo_cache_valid_ && !force) return; d->bibinfo_.clear(); @@ -3869,6 +3908,9 @@ unique_ptr Buffer::getSourceCode(odocstream & os, string const & format, // No side effect of file copying and image conversion runparams.dryrun = true; + // Some macros rely on font encoding + runparams.main_fontenc = params().main_font_encoding(); + if (output == CurrentParagraph) { runparams.par_begin = par_begin; runparams.par_end = par_end; @@ -4363,7 +4405,10 @@ Buffer::ExportStatus Buffer::doExport(string const & target, bool put_in_tempdir } else if (!lyxrc.tex_allows_spaces && contains(filePath(), ' ')) { Alert::error(_("File name error"), - _("The directory path to the document cannot contain spaces.")); + bformat(_("The directory path to the document\n%1$s\n" + "contains spaces, but your TeX installation does " + "not allow them. You should save the file to a directory " + "whose name does not contain spaces."), from_ascii(filePath()))); return ExportTexPathHasSpaces; } else { runparams.nice = false; @@ -4789,9 +4834,13 @@ void Buffer::updateBuffer(UpdateScope scope, UpdateType utype) const return; // if the bibfiles changed, the cache of bibinfo is invalid - sort(d->bibfiles_cache_.begin(), d->bibfiles_cache_.end()); - // the old one should already be sorted - if (old_bibfiles != d->bibfiles_cache_) { + FileNamePairList new_bibfiles = d->bibfiles_cache_; + // this is a trick to determine whether the two vectors have + // the same elements. + sort(new_bibfiles.begin(), new_bibfiles.end()); + sort(old_bibfiles.begin(), old_bibfiles.end()); + if (old_bibfiles != new_bibfiles) { + LYXERR(Debug::FILES, "Reloading bibinfo cache."); invalidateBibinfoCache(); reloadBibInfoCache(); // We relied upon the bibinfo cache when recalculating labels. But that @@ -4808,8 +4857,11 @@ void Buffer::updateBuffer(UpdateScope scope, UpdateType utype) const // updateMacros(); setChangesPresent(false); updateBuffer(parit, utype); + // this will already have been done by reloadBibInfoCache(); + // d->bibinfo_cache_valid_ = true; } else { + LYXERR(Debug::FILES, "Bibfiles unchanged."); // this is also set to true on the other path, by reloadBibInfoCache. d->bibinfo_cache_valid_ = true; }