commit 894ad70eba5bf6abc523bf9c10df2b2ca4bd876f
Author: Pavel Sanda <[email protected]>
Date:   Sun Aug 23 22:19:34 2020 +0200

    Enable Open Citation menu item iff citation contain locator information or 
external search script is available.
    
    Per Juergen's request.
---
 lib/RELEASE-NOTES                |    3 +++
 lib/configure.py                 |    4 +++-
 lib/scripts/prefs2prefs_prefs.py |    8 +++++++-
 src/LyXRC.cpp                    |   17 ++++++++++++++++-
 src/LyXRC.h                      |    8 ++++++++
 src/insets/InsetCitation.cpp     |   36 +++++++++++++++++++++++++++++-------
 src/insets/InsetCitation.h       |    5 ++++-
 7 files changed, 70 insertions(+), 11 deletions(-)

diff --git a/lib/RELEASE-NOTES b/lib/RELEASE-NOTES
index 40abf2a..6cfec8a 100644
--- a/lib/RELEASE-NOTES
+++ b/lib/RELEASE-NOTES
@@ -49,6 +49,9 @@
 * \ct_markup_copied true|false: determines whether change tracking markup 
should be
   preserved on copy/paste (default: false).
 
+* \citation_search_view lyxpaperview: determines whether external script 
"lyxpaperview"
+  should be used for looking up citation source.
+
 
 !!!The following pref variables were changed in 2.4:
 
diff --git a/lib/configure.py b/lib/configure.py
index 2b4d61f..856b82b 100644
--- a/lib/configure.py
+++ b/lib/configure.py
@@ -1310,6 +1310,8 @@ def checkOtherEntries():
         rc_entry = [ r'\nomencl_command "makeindex -s nomencl.ist"' ])
     checkProg('a python-pygments driver command', ['pygmentize'],
         rc_entry = [ r'\pygmentize_command "%%"' ])
+    checkProg('external script for searching and showing citation sources',
+        ['lyxpaperview'], rc_entry = [ r'\citation_search_view "%%"' ])
     ## FIXME: OCTAVE is not used anywhere
     # path, OCTAVE = checkProg('Octave', ['octave'])
     ## FIXME: MAPLE is not used anywhere
@@ -1875,7 +1877,7 @@ if __name__ == '__main__':
     lyx_check_config = True
     lyx_kpsewhich = True
     outfile = 'lyxrc.defaults'
-    lyxrc_fileformat = 31
+    lyxrc_fileformat = 33
     rc_entries = ''
     lyx_keep_temps = False
     version_suffix = ''
diff --git a/lib/scripts/prefs2prefs_prefs.py b/lib/scripts/prefs2prefs_prefs.py
index 6bbb8ac..d22d758 100644
--- a/lib/scripts/prefs2prefs_prefs.py
+++ b/lib/scripts/prefs2prefs_prefs.py
@@ -129,6 +129,11 @@
 #   Add ct_markup_copied.
 #   No convergence necessary.
 
+# Incremented to format 33, by sanda
+#   Add \citation_search_view.
+#   No conversion necessary.
+
+
 # NOTE: The format should also be updated in LYXRC.cpp and
 # in configure.py.
 
@@ -479,5 +484,6 @@ conversions = [
        [ 29, [remove_use_pixmap_cache]],
        [ 30, []],
        [ 31, []],
-       [ 32, []]
+       [ 32, []],
+       [ 33, []]
 ]
diff --git a/src/LyXRC.cpp b/src/LyXRC.cpp
index 328e683..e3bb0de 100644
--- a/src/LyXRC.cpp
+++ b/src/LyXRC.cpp
@@ -61,7 +61,7 @@ namespace {
 
 // The format should also be updated in configure.py, and conversion code
 // should be added to prefs2prefs_prefs.py.
-static unsigned int const LYXRC_FILEFORMAT = 32; // spitz: add 
\ct_markup_copied
+static unsigned int const LYXRC_FILEFORMAT = 33; // sanda: add 
\citation_search_view
 // when adding something to this array keep it sorted!
 LexerKeyword lyxrcTags[] = {
        { "\\accept_compound", LyXRC::RC_ACCEPT_COMPOUND },
@@ -78,6 +78,7 @@ LexerKeyword lyxrcTags[] = {
        { "\\bind_file", LyXRC::RC_BINDFILE },
        { "\\check_lastfiles", LyXRC::RC_CHECKLASTFILES },
        { "\\chktex_command", LyXRC::RC_CHKTEX_COMMAND },
+       { "\\citation_search_view", LyXRC::RC_CITATION_SEARCH_VIEW },
        { "\\close_buffer_with_last_view", 
LyXRC::RC_CLOSE_BUFFER_WITH_LAST_VIEW },
        { "\\completion_cursor_text", LyXRC::RC_COMPLETION_CURSOR_TEXT },
        { "\\completion_inline_delay", LyXRC::RC_COMPLETION_INLINE_DELAY },
@@ -679,6 +680,10 @@ LyXRC::ReturnValues LyXRC::read(Lexer & lexrc, bool 
check_format)
                        }
                        break;
 
+               case RC_CITATION_SEARCH_VIEW:
+                       lexrc >> citation_search_view;
+                       break;
+
                case RC_CT_ADDITIONS_UNDERLINED:
                        lexrc >> ct_additions_underlined;
                        break;
@@ -1602,6 +1607,15 @@ void LyXRC::write(ostream & os, bool 
ignore_system_lyxrc, string const & name) c
                if (tag != RC_LAST)
                        break;
                // fall through
+       case RC_CITATION_SEARCH_VIEW:
+               if (ignore_system_lyxrc ||
+                   citation_search_view != system_lyxrc.citation_search_view) {
+                       os << "\\citaton_search_view "
+                          << citation_search_view << '\n';
+               }
+               if (tag != RC_LAST)
+                       break;
+               // fall through
        case RC_CT_ADDITIONS_UNDERLINED:
                if (ignore_system_lyxrc ||
                    ct_additions_underlined
@@ -2774,6 +2788,7 @@ void actOnUpdatedPrefs(LyXRC const & lyxrc_orig, LyXRC 
const & lyxrc_new)
        case LyXRC::RC_BIBTEX_ALTERNATIVES:
        case LyXRC::RC_BIBTEX_COMMAND:
        case LyXRC::RC_BINDFILE:
+       case LyXRC::RC_CITATION_SEARCH_VIEW:
        case LyXRC::RC_CHECKLASTFILES:
        case LyXRC::RC_COMPLETION_CURSOR_TEXT:
        case LyXRC::RC_COMPLETION_INLINE_DELAY:
diff --git a/src/LyXRC.h b/src/LyXRC.h
index 955826b..1f32fef 100644
--- a/src/LyXRC.h
+++ b/src/LyXRC.h
@@ -53,6 +53,7 @@ public:
                RC_BINDFILE,
                RC_CHECKLASTFILES,
                RC_CHKTEX_COMMAND,
+               RC_CITATION_SEARCH_VIEW,
                RC_COMPLETION_CURSOR_TEXT,
                RC_COMPLETION_INLINE_DELAY,
                RC_COMPLETION_INLINE_MATH,
@@ -243,6 +244,13 @@ public:
        /// default paper size for local xdvi/dvips/ghostview/whatever
        /// command to run chktex incl. options
        std::string chktex_command = "chktex -n1 -n3 -n6 -n9 -n22 -n25 -n30 
-n38";
+       // Name of external script, which searches for file corresponding to a 
+       // given citation. At this moment only script "lyxpaperview" is 
supported
+       // (search for pdf based on author+year), but we can generalize if 
requested.
+       // Citation context menu item "Open Citation Content" will be always 
enabled
+       // if the name of this script in nonempty (last resort when citation 
entry
+       // does not contain neccessary info.
+       std::string citation_search_view;
        /// all available commands to run bibtex incl. options
        CommandSet bibtex_alternatives;
        /// command to run bibtex incl. options
diff --git a/src/insets/InsetCitation.cpp b/src/insets/InsetCitation.cpp
index 66db11a..7ae75b8 100644
--- a/src/insets/InsetCitation.cpp
+++ b/src/insets/InsetCitation.cpp
@@ -24,6 +24,7 @@
 #include "FuncStatus.h"
 #include "LaTeXFeatures.h"
 #include "LyX.h"
+#include "LyXRC.h"
 #include "output_xhtml.h"
 #include "output_docbook.h"
 #include "ParIterator.h"
@@ -168,20 +169,41 @@ void InsetCitation::doDispatch(Cursor & cur, FuncRequest 
& cmd)
        }
 }
 
-
-void InsetCitation::openCitation(){
+bool InsetCitation::openCitationPossible() const
+{
        Buffer const & buf = *buffer_;
-       // Only after the buffer is loaded from file...
+       // only after the buffer is loaded from file...
        if (!buf.isFullyLoaded())
-               return;
+               return false;
 
        BiblioInfo const & bi = buf.masterBibInfo();
        if (bi.empty())
-               return;
+               return false;
 
        docstring const & key = getParam("key");
        if (key.empty())
-               return;
+               return false;
+
+       // does bibtex item contains some locator?
+       vector<docstring> keys = getVectorFromString(key);
+       docstring doi, url, file;
+       for (docstring const & kvar : keys) {
+               bi.getLocators(kvar, doi, url, file);
+               if (!file.empty() || !doi.empty() || !url.empty())
+                       return true;
+       }
+
+       // last resort: is external script available?
+       if (!lyxrc.citation_search_view.empty())
+               return true;
+       return false;
+}
+
+void InsetCitation::openCitation()
+{
+       Buffer const & buf = *buffer_;
+       BiblioInfo const & bi = buf.masterBibInfo();
+       docstring const & key = getParam("key");
 
        vector<docstring> keys = getVectorFromString(key);
        docstring year, author, doi, url, file;
@@ -246,7 +268,7 @@ bool InsetCitation::getStatus(Cursor & cur, FuncRequest 
const & cmd,
                }
                return true;
        case LFUN_INSET_EDIT:
-               return true;
+               return openCitationPossible();
        default:
                return InsetCommand::getStatus(cur, cmd, status);
        }
diff --git a/src/insets/InsetCitation.h b/src/insets/InsetCitation.h
index 29e4b1f..e9f0347 100644
--- a/src/insets/InsetCitation.h
+++ b/src/insets/InsetCitation.h
@@ -94,7 +94,10 @@ public:
        QualifiedList getQualifiedLists(docstring const & p) const;
        ///
        static bool last_literal;
-       ///
+       /// Check whether citation contains necessary url/file entries
+       /// or external search script is available
+       bool openCitationPossible() const;
+       /// search and open citation source
        void openCitation();
 
 private:
-- 
lyx-cvs mailing list
[email protected]
http://lists.lyx.org/mailman/listinfo/lyx-cvs

Reply via email to