From 117e259f0a756773307bbd6da553c277a359c24b Mon Sep 17 00:00:00 2001 From: Juergen Spitzmueller Date: Fri, 8 Sep 2023 14:02:23 +0200 Subject: [PATCH] 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 36509c6c7c..c5094b285f 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 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 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 3f6e6c0f23..37e5ed5ba6 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 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 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 d2191cf1fd..e8f3aa19ce 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. -- 2.39.5