[LyX/master] Provide proper fallback if a bibliography processor is not found

Juergen Spitzmueller spitz at lyx.org
Sun Oct 17 14:52:50 UTC 2021


commit f3500725655c2a219d86f5f341195b4ae365ab4c
Author: Juergen Spitzmueller <spitz at lyx.org>
Date:   Sun Oct 17 11:29:18 2021 +0200

    Provide proper fallback if a bibliography processor is not found
    
    Check for appropriate fallbacks and warn user if the requested
    bibliography processor is unavailable.
---
 src/BufferParams.cpp |   66 +++++++++++++++++++++++++++++++++++++++++++++++--
 src/BufferParams.h   |    5 +++-
 src/Converter.cpp    |    2 +-
 src/LaTeX.cpp        |    2 +-
 4 files changed, 69 insertions(+), 6 deletions(-)

diff --git a/src/BufferParams.cpp b/src/BufferParams.cpp
index d9fb39e..a41a570 100644
--- a/src/BufferParams.cpp
+++ b/src/BufferParams.cpp
@@ -3612,11 +3612,71 @@ vector<CitationStyle> BufferParams::citeStyles() const
 }
 
 
-string const BufferParams::bibtexCommand() const
+string const BufferParams::getBibtexCommand(string const cmd, bool const warn) const
+{
+	// split from options
+	string command_in;
+	split(cmd, command_in, ' ');
+
+	// Look if the requested command is available. If so, use that.
+	for (auto const & alts : lyxrc.bibtex_alternatives) {
+		string command_prov;
+		split(alts, command_prov, ' ');
+		if (command_in == command_prov)
+			return cmd;
+	}
+
+	// If not, find the most suitable fallback for the current cite framework,
+	// and warn. Note that we omit options in any such case.
+	string fallback;
+	if (useBiblatex()) {
+		// For Biblatex, we prefer biber (also for Japanese)
+		// and try to fall back to bibtex8
+		if (lyxrc.bibtex_alternatives.find("biber") != lyxrc.bibtex_alternatives.end())
+			fallback = "biber";
+		else if (lyxrc.bibtex_alternatives.find("bibtex8") != lyxrc.bibtex_alternatives.end())
+			fallback = "bibtex8";
+	}
+	// For classic BibTeX and as last resort for biblatex, try bibtex
+	if (fallback.empty()) {
+		if (lyxrc.bibtex_alternatives.find("bibtex") != lyxrc.bibtex_alternatives.end())
+			fallback = "bibtex";
+	}
+
+	if (!warn)
+		return fallback;
+
+	if (fallback.empty()) {
+		frontend::Alert::warning(
+			_("No bibliography processor found!"),
+			support::bformat(
+			  _("The bibliography processor requested by this document "
+			    "(%1$s) is not available and no appropriate "
+			    "alternative has been found. "
+			    "No bibliography and references will be generated.\n"
+			    "Please fix your installation!"),
+			  from_utf8(cmd)));
+	} else {
+		frontend::Alert::warning(
+			_("Requested bibliography processor not found!"),
+			support::bformat(
+			  _("The bibliography processor requested by this document "
+			    "(%1$s) is not available. "
+			    "As a fallback, '%2$s' will be used, options are omitted. "
+			    "This might result in errors or unwanted changes in "
+			    "the bibliography. Please check carefully!\n"
+			    "It is suggested to install the missing processor."),
+			  from_utf8(cmd), from_utf8(fallback)));
+	}
+	return fallback;
+}
+
+
+string const BufferParams::bibtexCommand(bool const warn) const
 {
 	// Return document-specific setting if available
 	if (bibtex_command != "default")
-		return bibtex_command;
+		return getBibtexCommand(bibtex_command, warn);
 
 	// If we have "default" in document settings, consult the prefs
 	// 1. Japanese (uses a specific processor)
@@ -3636,7 +3696,7 @@ string const BufferParams::bibtexCommand() const
 	// 2. All other languages
 	else if (lyxrc.bibtex_command != "automatic")
 		// Return the specified program, if "automatic" is not set
-		return lyxrc.bibtex_command;
+		return getBibtexCommand(lyxrc.bibtex_command, warn);
 
 	// 3. Automatic: find the most suitable for the current cite framework
 	if (useBiblatex()) {
diff --git a/src/BufferParams.h b/src/BufferParams.h
index a1dfaa9..38649e7 100644
--- a/src/BufferParams.h
+++ b/src/BufferParams.h
@@ -518,7 +518,7 @@ public:
 	std::vector<CitationStyle> citeStyles() const;
 
 	/// Return the actual bibtex command (lyxrc or buffer param)
-	std::string const bibtexCommand() const;
+	std::string const bibtexCommand(bool const warn = false) const;
 
 	/// Are we using biblatex?
 	bool useBiblatex() const;
@@ -651,6 +651,9 @@ private:
 	std::map<std::string, std::string> bib_encodings;
 	/// Split bibliography?
 	bool use_bibtopic;
+	/// Return the actual or an appropriate fallback bibtex command
+	std::string const getBibtexCommand(std::string const cmd,
+					   bool const warn) const;
 	///
 	DocumentClassPtr doc_class_;
 	///
diff --git a/src/Converter.cpp b/src/Converter.cpp
index 4e9a2ad..0578026 100644
--- a/src/Converter.cpp
+++ b/src/Converter.cpp
@@ -478,7 +478,7 @@ Converters::RetVal Converters::convert(Buffer const * buffer,
 			 || suffixIs(bp.bufferFormat(), "-ja"))
 			&& bp.encoding().package() == Encoding::japanese;
 		runparams.use_indices = bp.use_indices;
-		runparams.bibtex_command = bp.bibtexCommand();
+		runparams.bibtex_command = bp.bibtexCommand(true);
 		runparams.index_command = (bp.index_command == "default") ?
 			string() : bp.index_command;
 		runparams.document_language = bp.language->lang();
diff --git a/src/LaTeX.cpp b/src/LaTeX.cpp
index a8d14b1..ce3d73e 100644
--- a/src/LaTeX.cpp
+++ b/src/LaTeX.cpp
@@ -768,7 +768,7 @@ bool LaTeX::runBibTeX(vector<AuxInfo> const & bibtex_info,
 				it->aux_file.absFileName())));
 		Systemcall one;
 		Systemcall::Starttype const starttype = 
-	        allow_cancel ? Systemcall::WaitLoop : Systemcall::Wait;
+			allow_cancel ? Systemcall::WaitLoop : Systemcall::Wait;
 		exit_code = one.startscript(starttype, tmp, path, lpath, true);
 		if (exit_code) {
 			return result;


More information about the lyx-cvs mailing list