Skip to content

Commit

Permalink
Add wildcard file when configuring the save filename (xournalpp#6171)
Browse files Browse the repository at this point in the history
* 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.
  • Loading branch information
DUOLabs333 authored Jan 23, 2025
1 parent ea59db6 commit 81d4064
Show file tree
Hide file tree
Showing 5 changed files with 39 additions and 18 deletions.
6 changes: 4 additions & 2 deletions src/core/model/Document.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
21 changes: 16 additions & 5 deletions src/util/SaveNameUtils.cpp
Original file line number Diff line number Diff line change
@@ -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);

Expand All @@ -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);
Expand All @@ -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";
Expand Down
10 changes: 7 additions & 3 deletions src/util/include/util/SaveNameUtils.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
};
17 changes: 10 additions & 7 deletions test/unit_tests/util/SaveNameUtilsTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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}");
}
3 changes: 2 additions & 1 deletion ui/settings.glade
Original file line number Diff line number Diff line change
Expand Up @@ -706,7 +706,8 @@ Illegal characters are replaced with "_"</property>
<object class="GtkLabel" id="label7">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">%{name} The name of the exported document
<property name="label" translatable="yes">%{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)
Expand Down

0 comments on commit 81d4064

Please sign in to comment.