commit 9fc190d61c55f23c8dfccf0b6a237a6d358fce24
Author: Juergen Spitzmueller <sp...@lyx.org>
Date:   Sun Dec 18 13:25:24 2022 +0100

    Improve functions for bibliography managers (#8193)
    
    - new function to list bibtex databases
    - citation-insert returns the list of undefined keys
      if the request comes from the LyX server
    
    Original patch from Benjamin Piwowarski (2012!).
    Modified and updated by Riki Heck and myself.
---
 lib/RELEASE-NOTES  |    4 ++++
 src/BufferView.cpp |   44 ++++++++++++++++++++++++++++++++++++++++++++
 src/FuncCode.h     |    1 +
 src/LyXAction.cpp  |   10 ++++++++++
 4 files changed, 59 insertions(+), 0 deletions(-)

diff --git a/lib/RELEASE-NOTES b/lib/RELEASE-NOTES
index 7a42650..c864919 100644
--- a/lib/RELEASE-NOTES
+++ b/lib/RELEASE-NOTES
@@ -128,6 +128,10 @@
 
 !!!The following new LyX functions have been introduced in 2.4:
 
+* bibtex-database-list: output a list of all bibtex files used in the current 
buffer.
+  The function outputs absolute paths in the OS style and separated by the 
os-specific
+  path separator. This function is intended for bibliography managers.
+
 * buffer-reset-export advises LyX to remove the auxiliary files before doing 
the next
   export.
 
diff --git a/src/BufferView.cpp b/src/BufferView.cpp
index 0bbf649..d3cf909 100644
--- a/src/BufferView.cpp
+++ b/src/BufferView.cpp
@@ -20,6 +20,7 @@
 #include "Buffer.h"
 #include "BufferList.h"
 #include "BufferParams.h"
+#include "BiblioInfo.h"
 #include "CoordCache.h"
 #include "Cursor.h"
 #include "CutAndPaste.h"
@@ -69,6 +70,7 @@
 #include "support/convert.h"
 #include "support/debug.h"
 #include "support/docstring.h"
+#include "support/docstring_list.h"
 #include "support/filetools.h"
 #include "support/gettext.h"
 #include "support/lassert.h"
@@ -1223,6 +1225,7 @@ bool BufferView::getStatus(FuncRequest const & cmd, 
FuncStatus & flag)
        case LFUN_SCREEN_SHOW_CURSOR:
        case LFUN_BIBTEX_DATABASE_ADD:
        case LFUN_BIBTEX_DATABASE_DEL:
+       case LFUN_BIBTEX_DATABASE_LIST:
        case LFUN_STATISTICS:
        case LFUN_KEYMAP_OFF:
        case LFUN_KEYMAP_PRIMARY:
@@ -1928,6 +1931,25 @@ void BufferView::dispatch(FuncRequest const & cmd, 
DispatchResult & dr)
                break;
        }
 
+       case LFUN_BIBTEX_DATABASE_LIST: {
+               docstring_list const & files = buffer_.getBibfiles();
+               bool first = true;
+               docstring result;
+               char const separator(os::path_separator());
+               for (auto const & file : files) {
+                       if (first)
+                               first = false;
+                       else
+                               result += separator;
+
+                       FileName const fn = buffer_.getBibfilePath(file);
+                       string const path = fn.realPath();
+                       result += from_utf8(os::external_path(path));
+               }
+               dr.setMessage(result);
+               break;
+       }
+
        case LFUN_STATISTICS: {
                DocIterator from, to;
                if (cur.selection()) {
@@ -2281,6 +2303,28 @@ void BufferView::dispatch(FuncRequest const & cmd, 
DispatchResult & dr)
                string icstr = InsetCommand::params2string(icp);
                FuncRequest fr(LFUN_INSET_INSERT, icstr);
                lyx::dispatch(fr);
+
+               // if the request comes from the LyX server, then we
+               // return a list of the undefined keys, in case some
+               // action could be taken.
+               if (cmd.origin() != FuncRequest::LYXSERVER)
+                       break;
+
+               vector<docstring> keys = getVectorFromString(from_utf8(arg));
+               vector<docstring>::iterator it = keys.begin();
+               vector<docstring>::const_iterator end = keys.end();
+
+               BiblioInfo const & bibInfo = buffer_.masterBibInfo();
+               const BiblioInfo::const_iterator bibEnd = bibInfo.end();
+               while (it != end) {
+                       if (bibInfo.find(*it) != bibEnd) {
+                               it = keys.erase(it);
+                               end = keys.end();
+                       } else
+                               ++it;
+               }
+               dr.setMessage(getStringFromVector(keys));
+
                break;
        }
 
diff --git a/src/FuncCode.h b/src/FuncCode.h
index aaa88f2..56fb5bf 100644
--- a/src/FuncCode.h
+++ b/src/FuncCode.h
@@ -507,6 +507,7 @@ enum FuncCode
        LFUN_TAB_GROUP_NEXT,            // daniel 20220130
        LFUN_TAB_GROUP_PREVIOUS,        // daniel 20220130
        // 395
+       LFUN_BIBTEX_DATABASE_LIST,      // bpiwowar, 20221218
        LFUN_LASTACTION                 // end of the table
 };
 
diff --git a/src/LyXAction.cpp b/src/LyXAction.cpp
index 96060f8..fc6886b 100644
--- a/src/LyXAction.cpp
+++ b/src/LyXAction.cpp
@@ -331,6 +331,16 @@ void LyXAction::init()
  */
                { LFUN_BIBTEX_DATABASE_DEL, "bibtex-database-del", Noop, Edit },
 
+/*!
+ * \var lyx::FuncCode lyx::LFUN_BIBTEX_DATABASE_LIST
+ * \li Action: Lists the available databases (separated by path separator 
common
+ *             on the used OS).
+ * \li Notion: Used by bibliographic managers
+ * \li Syntax: bibtex-database-list
+ * \li Origin: bpiwowar, 11 june 2012
+ * \endvar
+ */
+               { LFUN_BIBTEX_DATABASE_LIST, "bibtex-database-list", ReadOnly, 
System },
 
 /*!
  * \var lyx::FuncCode lyx::LFUN_BOOKMARK_CLEAR
-- 
lyx-cvs mailing list
lyx-cvs@lists.lyx.org
http://lists.lyx.org/mailman/listinfo/lyx-cvs

Reply via email to