X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FLayoutFile.cpp;h=8cca663c4b6ace8e872ace70304b801e2074afee;hb=d2ec79beac9a539770ddf5a7010621ab629eace6;hp=8ec7474a0a3673be826d90cb1a3efedee0d5a4a0;hpb=1b1f8dd235ba8e168348cd23c824063f2595a0c5;p=lyx.git diff --git a/src/LayoutFile.cpp b/src/LayoutFile.cpp index 8ec7474a0a..8cca663c4b 100644 --- a/src/LayoutFile.cpp +++ b/src/LayoutFile.cpp @@ -29,6 +29,7 @@ #include "support/bind.h" #include "support/regex.h" +#include "support/TempFile.h" #include @@ -224,8 +225,9 @@ string layoutpost = LayoutFileIndex LayoutFileList::addEmptyClass(string const & textclass) { // FIXME This could be simplified a bit to call TextClass::read(string, ReadType). - - FileName const tempLayout = FileName::tempName("basic_layout"); + + TempFile tempfile("basicXXXXXX.layout"); + FileName const tempLayout = tempfile.name(); ofstream ofs(tempLayout.toFilesystemEncoding().c_str()); // This writes a very basic class, but it also attempts to include // stdclass.inc. That would give us something moderately usable. @@ -266,7 +268,7 @@ LayoutFileIndex LayoutFileList::addEmptyClass(string const & textclass) LayoutFileIndex LayoutFileList::addLocalLayout( - string const & textclass, string const & path) + string const & textclass, string const & path, string const & oldpath) { // FIXME There is a bug here: 4593 // @@ -275,10 +277,22 @@ LayoutFileIndex LayoutFileList::addLocalLayout( // different from textclass string fullName = addName(path, textclass + ".layout"); - FileName const layout_file(fullName); - - if (!layout_file.exists()) - return string(); + FileName layout_file(fullName); + bool moved = false; + + if (!layout_file.exists()) { + if (oldpath.empty()) + return string(); + // The document has been moved to a different directory. + // However, oldpath always points to the right spot, unless + // the user also moved the layout file. + fullName = addName(oldpath, textclass + ".layout"); + layout_file.set(fullName); + layout_file.refresh(); + if (!layout_file.exists()) + return string(); + moved = true; + } LYXERR(Debug::TCLASS, "Adding class " << textclass << " from directory " << path); // Read .layout file and get description, real latex classname etc @@ -287,9 +301,9 @@ LayoutFileIndex LayoutFileList::addLocalLayout( // which uses the following regex // \Declare(LaTeX|DocBook)Class\s*(\[([^,]*)(,.*)*\])*\s*{(.*)} ifstream ifs(layout_file.toFilesystemEncoding().c_str()); - static regex const reg("^#\\s*\\\\Declare(LaTeX|DocBook)Class\\s*" + static regex const reg("^\\s*#\\s*\\\\Declare(LaTeX|DocBook)Class\\s*" "(?:\\[([^,]*)(?:,.*)*\\])*\\s*\\{(.*)\\}\\s*"); - static regex const catreg("^#\\s*\\\\DeclareCategory\\{(.*)\\}"); + static regex const catreg("^\\s*#\\s*\\\\DeclareCategory\\{(.*)\\}\\s*"); string line; string class_name; string class_prereq; @@ -325,15 +339,18 @@ LayoutFileIndex LayoutFileList::addLocalLayout( // This textclass is added on request so it will definitely be // used. Load it now because other load() calls may fail if they // are called in a context without buffer path information. - tmpl->load(path); + tmpl->load(moved ? oldpath : path); // There will be only one textclass with this name, even if different // layout files are loaded from different directories. if (haveClass(textclass)) { - LYXERR0("Existing textclass " << textclass << " is redefined by " << fullName); + // Unconditionally issuing the warning may be confusing when + // saving the document with a different name, as it is exactly + // the same textclass that is being re-established. + LYXERR(Debug::TCLASS, "Existing textclass " << textclass << " is redefined by " << fullName); delete classmap_[textclass]; } classmap_[textclass] = tmpl; - return textclass; + return removeExtension(fullName); }