From 81d4064273825c621468c99f67a3f28379309966 Mon Sep 17 00:00:00 2001 From: DUO Labs Date: Thu, 23 Jan 2025 04:17:00 -0500 Subject: [PATCH] Add wildcard `file` when configuring the save filename (#6171) * Add wildcard `file` when configuring the save filename. `file` will use the filename of the file itself, instead of the name of the PDF background. --- src/core/model/Document.cpp | 6 ++++-- src/util/SaveNameUtils.cpp | 21 ++++++++++++++++----- src/util/include/util/SaveNameUtils.h | 10 +++++++--- test/unit_tests/util/SaveNameUtilsTest.cpp | 17 ++++++++++------- ui/settings.glade | 3 ++- 5 files changed, 39 insertions(+), 18 deletions(-) diff --git a/src/core/model/Document.cpp b/src/core/model/Document.cpp index d7ac88b1a014..e78f9f4ad075 100644 --- a/src/core/model/Document.cpp +++ b/src/core/model/Document.cpp @@ -152,9 +152,11 @@ auto Document::createSaveFilename(DocumentType type, const std::string& defaultS return p; } } else if (!pdfFilepath.empty()) { - wildcardString = SaveNameUtils::parseFilenameFromWildcardString(defaultPdfName, this->pdfFilepath.filename()); + wildcardString = SaveNameUtils::parseFilenameFromWildcardString(defaultPdfName, this->pdfFilepath.filename(), + this->filepath.filename()); } else if (!filepath.empty()) { - wildcardString = SaveNameUtils::parseFilenameFromWildcardString(defaultPdfName, this->filepath.filename()); + wildcardString = SaveNameUtils::parseFilenameFromWildcardString(defaultPdfName, this->filepath.filename(), + this->filepath.filename()); } auto format_str = wildcardString.empty() ? defaultSaveName : wildcardString; diff --git a/src/util/SaveNameUtils.cpp b/src/util/SaveNameUtils.cpp index 11f9a15bc6ad..87a3c80701f5 100644 --- a/src/util/SaveNameUtils.cpp +++ b/src/util/SaveNameUtils.cpp @@ -1,9 +1,11 @@ #include "util/SaveNameUtils.h" +#include "include/util/SaveNameUtils.h" #include "util/PathUtil.h" // for clearExtensions -auto SaveNameUtils::parseFilenameFromWildcardString(const std::string& wildcardString, const fs::path& defaultFilePath) -> std::string { +auto SaveNameUtils::parseFilenameFromWildcardString(const std::string& wildcardString, const fs::path& PdfPath, + const fs::path& FilePath) -> std::string { std::string saveString = wildcardString; size_t pos = saveString.find(DEFAULT_WILDCARD_START); @@ -14,7 +16,8 @@ auto SaveNameUtils::parseFilenameFromWildcardString(const std::string& wildcardS if (endPos == std::string::npos) { break; } - std::string parsedWildcard = parseWildcard(saveString.substr(pos + wildcardStartLength, endPos - pos - wildcardStartLength), defaultFilePath); + std::string parsedWildcard = parseWildcard( + saveString.substr(pos + wildcardStartLength, endPos - pos - wildcardStartLength), PdfPath, FilePath); saveString.replace(pos, endPos + 1 - pos, parsedWildcard); pos += parsedWildcard.size(); pos = saveString.find(DEFAULT_WILDCARD_START, pos); @@ -23,12 +26,20 @@ auto SaveNameUtils::parseFilenameFromWildcardString(const std::string& wildcardS return saveString; } -auto SaveNameUtils::parseWildcard(const std::string& wildcard, const fs::path& defaultFilePath) -> std::string { - if (wildcard == WILDCARD_NAME) { - fs::path path = defaultFilePath; +auto SaveNameUtils::parseWildcard(const std::string& wildcard, const fs::path& PdfPath, + const fs::path& FilePath) -> std::string { + if (wildcard == WILDCARD_PDF_NAME) { + fs::path path = PdfPath; Util::clearExtensions(path, ".pdf"); return path.u8string(); } + + if (wildcard == WILDCARD_FILE_NAME) { + fs::path path = FilePath; + Util::clearExtensions(path, ""); + return path.u8string(); + } + if (wildcard == WILDCARD_DATE || wildcard == WILDCARD_TIME) { // Backwards compatibility: redirect to std::chrono placeholders return wildcard == WILDCARD_DATE ? "%F" : "%X"; diff --git a/src/util/include/util/SaveNameUtils.h b/src/util/include/util/SaveNameUtils.h index 7faed9c7b79d..0ae8e3b652ab 100644 --- a/src/util/include/util/SaveNameUtils.h +++ b/src/util/include/util/SaveNameUtils.h @@ -19,14 +19,18 @@ constexpr auto DEFAULT_WILDCARD_START = "%{"; constexpr auto DEFAULT_WILDCARD_END = "}"; // wildcard options -constexpr auto WILDCARD_NAME = "name"; ///< default store name, e.g. original pdf name +constexpr auto WILDCARD_PDF_NAME = "name"; ///< default store name, e.g. original pdf name + +constexpr auto WILDCARD_FILE_NAME = "file"; ///< name of the file itself + constexpr auto WILDCARD_DATE = "date"; ///< current date - Deprecated: prefer using %F instead of %{date} constexpr auto WILDCARD_TIME = "time"; ///< current time - Deprecated: prefer using %X instead of %{time} class SaveNameUtils { public: - static std::string parseFilenameFromWildcardString(const std::string& wildcardString, const fs::path& defaultFilePath); + static std::string parseFilenameFromWildcardString(const std::string& wildcardString, const fs::path& PdfPath, + const fs::path& FilePath); private: - static std::string parseWildcard(const std::string& wildcard, const fs::path& defaultFilePath); + static std::string parseWildcard(const std::string& wildcard, const fs::path& PdfPath, const fs::path& FilePath); }; diff --git a/test/unit_tests/util/SaveNameUtilsTest.cpp b/test/unit_tests/util/SaveNameUtilsTest.cpp index e63ee67b8fb7..854f4779ecda 100644 --- a/test/unit_tests/util/SaveNameUtilsTest.cpp +++ b/test/unit_tests/util/SaveNameUtilsTest.cpp @@ -15,11 +15,14 @@ #include "util/SaveNameUtils.h" TEST(SaveNameUtils, testWildcardExpansion) { - EXPECT_EQ(SaveNameUtils::parseFilenameFromWildcardString("", "defaultpath"), ""); - EXPECT_EQ(SaveNameUtils::parseFilenameFromWildcardString("%{name}}%{name}", "x"), "x}x"); - EXPECT_EQ(SaveNameUtils::parseFilenameFromWildcardString("%{name}", "defaultpath.pdf"), "defaultpath"); - EXPECT_EQ(SaveNameUtils::parseFilenameFromWildcardString("%{", "defaultpath"), "%{"); - EXPECT_EQ(SaveNameUtils::parseFilenameFromWildcardString("%{name%{name}}x", ""), "}x"); - EXPECT_EQ(SaveNameUtils::parseFilenameFromWildcardString("\\%\\{name%{name}}x", ""), "\\%\\{name}x"); - EXPECT_EQ(SaveNameUtils::parseFilenameFromWildcardString("%{name}", " %{name}"), " %{name}"); + EXPECT_EQ(SaveNameUtils::parseFilenameFromWildcardString("", "defaultpath", ""), ""); + EXPECT_EQ(SaveNameUtils::parseFilenameFromWildcardString("%{name}}%{name}", "x", ""), "x}x"); + EXPECT_EQ(SaveNameUtils::parseFilenameFromWildcardString("%{name}", "defaultpath.pdf", ""), "defaultpath"); + + EXPECT_EQ(SaveNameUtils::parseFilenameFromWildcardString("%{file}", "pdfpath.pdf", "filepath.xopp"), "filepath"); + + EXPECT_EQ(SaveNameUtils::parseFilenameFromWildcardString("%{", "defaultpath", ""), "%{"); + EXPECT_EQ(SaveNameUtils::parseFilenameFromWildcardString("%{name%{name}}x", "", ""), "}x"); + EXPECT_EQ(SaveNameUtils::parseFilenameFromWildcardString("\\%\\{name%{name}}x", "", ""), "\\%\\{name}x"); + EXPECT_EQ(SaveNameUtils::parseFilenameFromWildcardString("%{name}", " %{name}", ""), " %{name}"); } diff --git a/ui/settings.glade b/ui/settings.glade index 5b7c98d1ae94..5a743cc19961 100644 --- a/ui/settings.glade +++ b/ui/settings.glade @@ -706,7 +706,8 @@ Illegal characters are replaced with "_" True False - %{name} The name of the exported document + %{name} The filename (if any) of the PDF background +%{file} The saved filename of the file %a Abbreviated weekday name (e.g. Thu) %A Full weekday name (e.g. Thursday) %b Abbreviated month name (e.g. Aug)