[LyX/master] Handle multiple files in file and localfile BibTeX field (#12896)

Juergen Spitzmueller spitz at lyx.org
Fri Sep 8 10:45:50 UTC 2023


commit 117e259f0a756773307bbd6da553c277a359c24b
Author: Juergen Spitzmueller <spitz at lyx.org>
Date:   Fri Sep 8 14:02:23 2023 +0200

    Handle multiple files in file and localfile BibTeX field (#12896)
---
 src/BiblioInfo.cpp              |   46 ++++++++++++++++++++++++++------------
 src/frontends/qt/qt_helpers.cpp |   11 +++++++-
 src/support/filetools.cpp       |    2 +
 3 files changed, 42 insertions(+), 17 deletions(-)

diff --git a/src/BiblioInfo.cpp b/src/BiblioInfo.cpp
index 36509c6..c5094b2 100644
--- a/src/BiblioInfo.cpp
+++ b/src/BiblioInfo.cpp
@@ -688,30 +688,46 @@ void BibTeXInfo::getLocators(docstring & doi, docstring & url, docstring & file)
 
 		// Jabref case, field has a format:
 		// Description:Location:Filetype;Description:Location:Filetype...
-		// We will grab only first pdf
+		// We will strip out the locations and return an \n-separated list
 		if (!file.empty()) {
-			docstring ret, filedest, tmp;
-			ret = split(file, tmp, ':');
-			tmp = split(ret, filedest, ':');
-			//TODO howto deal with relative directories?
-			FileName f(to_utf8(filedest));
-			if (f.exists())
-				file = "file:///" + filedest;
+			docstring filelist;
+			vector<docstring> files = getVectorFromString(file, from_ascii(";"));
+			for (auto const & f : files) {
+				docstring ret, filedest, tmp;
+				ret = split(f, tmp, ':');
+				tmp = split(ret, filedest, ':');
+				// TODO howto deal with relative directories?
+				FileName fn(to_utf8(filedest));
+				if (fn.exists()) {
+					if (!filelist.empty())
+						filelist += '\n';
+					filelist += "file:///" + filedest;
+				}
+			}
+			if (!filelist.empty())
+				file = filelist;
 		}
 
 		// kbibtex case, format:
 		// file1.pdf;file2.pdf
-		// We will grab only first pdf
+		// We will strip out the locations and return an \n-separated list
 		docstring kfile;
 		if (file.empty())
 			kfile = operator[]("localfile");
 		if (!kfile.empty()) {
-			docstring filedest, tmp;
-			tmp = split(kfile, filedest, ';');
-			//TODO howto deal with relative directories?
-			FileName f(to_utf8(filedest));
-			if (f.exists())
-				file = "file:///" + filedest;
+			docstring filelist;
+			vector<docstring> files = getVectorFromString(kfile, from_ascii(";"));
+			for (auto const & f : files) {
+				// TODO howto deal with relative directories?
+				FileName fn(to_utf8(f));
+				if (fn.exists()) {
+					if (!filelist.empty())
+						filelist += '\n';
+					filelist = "file:///" + f;
+				}
+			}
+			if (!filelist.empty())
+				file = filelist;
 		}
 
 		if (!url.empty())
diff --git a/src/frontends/qt/qt_helpers.cpp b/src/frontends/qt/qt_helpers.cpp
index 3f6e6c0..37e5ed5 100644
--- a/src/frontends/qt/qt_helpers.cpp
+++ b/src/frontends/qt/qt_helpers.cpp
@@ -299,10 +299,11 @@ void showDirectory(FileName const & directory)
 
 void showTarget(string const & target_in, Buffer const & buf)
 {
-	LYXERR(Debug::INSETS, "Showtarget:" << target_in << "\n");
+	LYXERR(Debug::INSETS, "Showtarget: " << target_in << "\n");
 
 	string target = target_in;
 	string const & docpath = buf.absFileName();
+	vector<string> targets;
 
 	bool const is_external = prefixIs(target, "EXTERNAL ");
 	if (is_external) {
@@ -320,13 +321,19 @@ void showTarget(string const & target_in, Buffer const & buf)
 			return;
 		}
 		// lyxpaperview returns a \n-separated list of paths
-		vector<string> targets = getVectorFromString(rtrim(ret.result, "\n"), "\n");
+		targets = getVectorFromString(rtrim(ret.result, "\n"), "\n");
 		if (targets.empty()) {
 			frontend::Alert::error(_("Could not open file"),
 				bformat(_("No file was found using the pattern `%1$s'."),
 					from_utf8(tar)));
 			return;
 		}
+	}
+	if (prefixIs(target, "file://")) {
+		// file might have a \n-separated list of paths
+		targets = getVectorFromString(target, "\n");
+	}
+	if (!targets.empty()) {
 		if (targets.size() > 1) {
 			QStringList files;
 			for (auto const & t : targets)
diff --git a/src/support/filetools.cpp b/src/support/filetools.cpp
index d2191cf..e8f3aa1 100644
--- a/src/support/filetools.cpp
+++ b/src/support/filetools.cpp
@@ -946,6 +946,8 @@ string const getExtension(string const & name)
 
 docstring const provideScheme(docstring const & name, docstring const & scheme)
 {
+	if (prefixIs(name, scheme + "://"))
+		return name;
 	QUrl url(toqstr(name));
 	if (!url.scheme().isEmpty())
 		// Has a scheme. Return as is.


More information about the lyx-cvs mailing list