From 61d68d05bd0f2172ab9406f23dc2640e6b9ac56b Mon Sep 17 00:00:00 2001 From: Jean-Marc Lasgouttes Date: Sun, 17 Jul 2022 20:10:53 +0200 Subject: [PATCH] Add proper extension as needed in Save as and Export Introduce the new FileName method ensureExtension, which does the following: * if the extension is already correct (in a case-insensitive way), do nothing. * if it is not correct, add the extension to the file name. This is different from changeExtension that will fail in a case where the file contains dots, but not a real extension, like newfile2.1. Use this new method in renameBuffer() and exportBufferAs(). Fixes bug #11008. --- src/frontends/qt/GuiView.cpp | 8 ++++---- src/support/FileName.cpp | 13 +++++++++++++ src/support/FileName.h | 3 +++ 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/frontends/qt/GuiView.cpp b/src/frontends/qt/GuiView.cpp index 24969c2112..8f6bf07115 100644 --- a/src/frontends/qt/GuiView.cpp +++ b/src/frontends/qt/GuiView.cpp @@ -3080,8 +3080,7 @@ bool GuiView::renameBuffer(Buffer & b, docstring const & newname, RenameKind kin dlg.setButton1(qt_("D&ocuments"), toqstr(lyxrc.document_path)); dlg.setButton2(qt_("&Templates"), toqstr(lyxrc.template_path)); - if (!isLyXFileName(fname.absFileName())) - fname.changeExtension(".lyx"); + fname.ensureExtension(".lyx"); string const path = as_template ? getTemplatesPath(b) @@ -3099,8 +3098,7 @@ bool GuiView::renameBuffer(Buffer & b, docstring const & newname, RenameKind kin if (fname.empty()) return false; - if (!isLyXFileName(fname.absFileName())) - fname.changeExtension(".lyx"); + fname.ensureExtension(".lyx"); } // fname is now the new Buffer location. @@ -3248,6 +3246,8 @@ bool GuiView::exportBufferAs(Buffer & b, docstring const & iformat) if (fmt_name.empty() || fname.empty()) return false; + fname.ensureExtension(theFormats().extension(fmt_name)); + // fname is now the new Buffer location. if (fname.exists()) { docstring const file = makeDisplayPath(fname.absFileName(), 30); diff --git a/src/support/FileName.cpp b/src/support/FileName.cpp index 8ad7e00fa0..5b494a5ec9 100644 --- a/src/support/FileName.cpp +++ b/src/support/FileName.cpp @@ -812,6 +812,19 @@ void FileName::changeExtension(string const & extension) } +void FileName::ensureExtension(string const & extension) +{ + string ext; + // Make sure the extension starts with a dot + if (!extension.empty() && extension[0] != '.') + ext= '.' + extension; + else + ext = extension; + if (!suffixIs(ascii_lowercase(absFileName()), ext)) + set(absFileName() + ext); +} + + docstring const FileName::relPath(string const & path) const { // FIXME UNICODE diff --git a/src/support/FileName.h b/src/support/FileName.h index 1cf1e730f4..95940a9235 100644 --- a/src/support/FileName.h +++ b/src/support/FileName.h @@ -177,6 +177,9 @@ public: */ void changeExtension(std::string const & extension); + /// Add extension to the file name if it is not already there + void ensureExtension(std::string const & extension); + static FileName fromFilesystemEncoding(std::string const & name); /// get the current working directory -- 2.39.5