From 225a3b49be920888dc0b9a85cff6474b98eb7db2 Mon Sep 17 00:00:00 2001 From: Dean Jackson Date: Tue, 28 Apr 2020 11:32:54 +0200 Subject: [PATCH] Fix Better Bibtex handling and paste on Catalina --- ...edworkflow => ZotHero-1.3.0.alfredworkflow | Bin 519765 -> 523484 bytes setup.cfg | 2 + src/info.plist | 227 +++++++++++++----- src/lib/pasteboard.py | 6 +- src/lib/zothero/betterbibtex.py | 80 +++--- src/lib/zothero/index.py | 2 +- src/lib/zothero/models.py | 1 + src/lib/zothero/zotero.py | 15 ++ src/zh | 47 ++-- 9 files changed, 275 insertions(+), 105 deletions(-) rename ZotHero-1.2.2.alfredworkflow => ZotHero-1.3.0.alfredworkflow (91%) create mode 100644 setup.cfg diff --git a/ZotHero-1.2.2.alfredworkflow b/ZotHero-1.3.0.alfredworkflow similarity index 91% rename from ZotHero-1.2.2.alfredworkflow rename to ZotHero-1.3.0.alfredworkflow index 7b2532fef2b4077fd498e5add34fe004602b619d..550ff6a352c67ab2e01559dff8f1b64f761c0eeb 100644 GIT binary patch delta 26708 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%0DWJ^Tr^bIH(_Y}ER$ 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 delta 23316 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 u(Dg%Cdf&CvSmGm0` diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000..ff60d7b --- /dev/null +++ b/setup.cfg @@ -0,0 +1,2 @@ +[flake8] +builtins = unicode diff --git a/src/info.plist b/src/info.plist index c9b776d..3a5150f 100644 --- a/src/info.plist +++ b/src/info.plist @@ -6,6 +6,19 @@ net.deanishe.alfred.zothero connections + 0E02FA87-DF30-4A39-A326-003800342DDF + + + destinationuid + D84E30BC-1391-41D8-908A-D95EFCA645A4 + modifiers + 0 + modifiersubtext + + vitoclose + + + 118BDCA4-C25F-449C-93D8-877E192E22D2 @@ -163,6 +176,19 @@ + 47548F5E-0787-4D45-AFAB-B000C4218019 + + + destinationuid + 517E04B5-24AC-4071-BEC9-7FCBB8D06395 + modifiers + 0 + modifiersubtext + + vitoclose + + + 4C4E438A-90C4-463C-A31C-435EB61F8236 @@ -242,6 +268,19 @@ + 65566F30-2B84-43B7-8B3C-3F5EDDE0663F + + + destinationuid + A950947F-8EA7-4749-AF55-2C7F9D6E695E + modifiers + 0 + modifiersubtext + + vitoclose + + + 65A74884-90D6-4453-963E-454CF4C84DCB 674740C4-BFDA-44C8-A478-586EF06217BF @@ -378,7 +417,7 @@ destinationuid - D84E30BC-1391-41D8-908A-D95EFCA645A4 + D5227517-F91E-42FA-BE39-09BDB8443B0F modifiers 0 modifiersubtext @@ -401,18 +440,7 @@ A950947F-8EA7-4749-AF55-2C7F9D6E695E - - - destinationuid - 5CF4D2DC-E6C6-4E4D-BB75-9D96C7C02203 - modifiers - 0 - modifiersubtext - - vitoclose - - - + AEE6452E-9186-4609-8AD4-D74F469F1A79 @@ -512,7 +540,7 @@ destinationuid - A950947F-8EA7-4749-AF55-2C7F9D6E695E + 65566F30-2B84-43B7-8B3C-3F5EDDE0663F modifiers 0 modifiersubtext @@ -521,11 +549,11 @@ - D78E4F18-6D77-4514-A55F-8894C014AB60 + D5227517-F91E-42FA-BE39-09BDB8443B0F destinationuid - 8F85FB21-8921-402F-BF70-C7C35E769212 + 0E02FA87-DF30-4A39-A326-003800342DDF modifiers 0 modifiersubtext @@ -534,11 +562,11 @@ - D84E30BC-1391-41D8-908A-D95EFCA645A4 + D78E4F18-6D77-4514-A55F-8894C014AB60 destinationuid - 9738906C-61C6-4DE3-AB58-676023F12080 + 8F85FB21-8921-402F-BF70-C7C35E769212 modifiers 0 modifiersubtext @@ -547,6 +575,8 @@ + D84E30BC-1391-41D8-908A-D95EFCA645A4 + E1E3A9E7-0EEF-4745-A62C-79E46A2AF51F @@ -691,6 +721,40 @@ version 1 + + config + + count + 1 + keychar + v + keycode + -1 + keymod + 1048576 + overridewithargument + + + type + alfred.workflow.output.dispatchkeycombo + uid + 517E04B5-24AC-4071-BEC9-7FCBB8D06395 + version + 1 + + + config + + triggerid + paste + + type + alfred.workflow.trigger.external + uid + 47548F5E-0787-4D45-AFAB-B000C4218019 + version + 1 + config @@ -739,14 +803,15 @@ variables={allvars} escaping 102 script - test -n "$autopaste" && flags+=(--paste) -./zh citekey $flags $url + flags=() +test -n "$autopaste" && flags+=(--paste) +./zh copy $flags "$citekey" scriptargtype 1 scriptfile type - 0 + 5 type alfred.workflow.action.script @@ -862,6 +927,8 @@ variables={allvars} focusedappvariablename autopaste + keyword + zzot type alfred.workflow.trigger.snippet @@ -889,11 +956,32 @@ variables={allvars} version 1 + + config + + argument + . +/------- COPY CITEKEY IN --------\ +query={query} +variables={allvars} +\---------------------------------/ + cleardebuggertext + + processoutputs + + + type + alfred.workflow.utility.debug + uid + D5227517-F91E-42FA-BE39-09BDB8443B0F + version + 1 + type alfred.workflow.utility.hidealfred uid - 9738906C-61C6-4DE3-AB58-676023F12080 + 0E02FA87-DF30-4A39-A326-003800342DDF version 1 @@ -1275,6 +1363,14 @@ test -n "$autopaste" && flags+=(--paste) version 1 + + type + alfred.workflow.utility.hidealfred + uid + 65566F30-2B84-43B7-8B3C-3F5EDDE0663F + version + 1 + config @@ -1296,14 +1392,6 @@ variables={allvars} version 1 - - type - alfred.workflow.utility.hidealfred - uid - 5CF4D2DC-E6C6-4E4D-BB75-9D96C7C02203 - version - 1 - config @@ -1550,7 +1638,7 @@ test -n "$style" && { passinputasargument passvariables - + workflowbundleid self @@ -1907,6 +1995,15 @@ Edit the `ZOTERO_DIR` variable to point to Zotero 5's data directory if you aren ypos 1435 + 0E02FA87-DF30-4A39-A326-003800342DDF + + colorindex + 12 + xpos + 1330 + ypos + 240 + 118BDCA4-C25F-449C-93D8-877E192E22D2 xpos @@ -2006,6 +2103,13 @@ Edit the `ZOTERO_DIR` variable to point to Zotero 5's data directory if you aren ypos 905 + 47548F5E-0787-4D45-AFAB-B000C4218019 + + xpos + 1050 + ypos + 55 + 49F6E2D6-5BF1-4E9A-A7CD-A4E04C30DFA8 colorindex @@ -2022,6 +2126,13 @@ Edit the `ZOTERO_DIR` variable to point to Zotero 5's data directory if you aren ypos 80 + 517E04B5-24AC-4071-BEC9-7FCBB8D06395 + + xpos + 1250 + ypos + 55 + 53172C76-0F6F-4E84-8C96-D0E81629CBA4 colorindex @@ -2033,15 +2144,6 @@ Edit the `ZOTERO_DIR` variable to point to Zotero 5's data directory if you aren ypos 50 - 5CF4D2DC-E6C6-4E4D-BB75-9D96C7C02203 - - colorindex - 4 - xpos - 1690 - ypos - 735 - 5CFF0FD7-987C-4910-AD1E-0C40BF66585A colorindex @@ -2073,6 +2175,15 @@ Edit the `ZOTERO_DIR` variable to point to Zotero 5's data directory if you aren ypos 1695 + 65566F30-2B84-43B7-8B3C-3F5EDDE0663F + + colorindex + 4 + xpos + 1330 + ypos + 735 + 65A74884-90D6-4453-963E-454CF4C84DCB colorindex @@ -2114,7 +2225,7 @@ Edit the `ZOTERO_DIR` variable to point to Zotero 5's data directory if you aren 768ECE7D-BB80-47A0-AE4A-4AA679468977 note - $action = open-in-zotero + $action = copy-citekey xpos 730 ypos @@ -2223,15 +2334,6 @@ Edit the `ZOTERO_DIR` variable to point to Zotero 5's data directory if you aren ypos 210 - 9738906C-61C6-4DE3-AB58-676023F12080 - - colorindex - 12 - xpos - 1450 - ypos - 240 - 9A384EEE-AA82-4FC5-8B13-1F7319613854 note @@ -2326,10 +2428,19 @@ Edit the `ZOTERO_DIR` variable to point to Zotero 5's data directory if you aren colorindex 4 xpos - 1290 + 1250 ypos 735 + D5227517-F91E-42FA-BE39-09BDB8443B0F + + colorindex + 12 + xpos + 1250 + ypos + 240 + D78E4F18-6D77-4514-A55F-8894C014AB60 note @@ -2344,7 +2455,7 @@ Edit the `ZOTERO_DIR` variable to point to Zotero 5's data directory if you aren colorindex 12 xpos - 1250 + 1450 ypos 210 @@ -2408,7 +2519,7 @@ Edit the `ZOTERO_DIR` variable to point to Zotero 5's data directory if you aren ATTACHMENTS_DIR CITE_STYLE - http://www.zotero.org/styles/ieee + COPY_CITEKEY_MOD LOCALE @@ -2416,8 +2527,16 @@ Edit the `ZOTERO_DIR` variable to point to Zotero 5's data directory if you aren ZOTERO_DIR + variablesdontexport + + LOCALE + ATTACHMENTS_DIR + ZOTERO_DIR + COPY_CITEKEY_MOD + CITE_STYLE + version - 1.2.3 + 1.3.0 webaddress https://github.com/deanishe/zothero diff --git a/src/lib/pasteboard.py b/src/lib/pasteboard.py index 20263c8..dbd26ab 100644 --- a/src/lib/pasteboard.py +++ b/src/lib/pasteboard.py @@ -14,7 +14,7 @@ from AppKit import NSPasteboard from Foundation import NSData -from workflow.util import run_jxa +from workflow.util import run_trigger # Some common UTIs UTI_HTML = 'public.html' @@ -75,4 +75,6 @@ def set(contents): def paste(): """Simulate CMD+V to paste clipboard.""" - run_jxa(PASTE_SCRIPT) + run_trigger('paste') + # This doesn't appear to work on Catalina :( + # run_jxa(PASTE_SCRIPT) diff --git a/src/lib/zothero/betterbibtex.py b/src/lib/zothero/betterbibtex.py index d4901b6..22845e8 100644 --- a/src/lib/zothero/betterbibtex.py +++ b/src/lib/zothero/betterbibtex.py @@ -1,44 +1,66 @@ +# encoding: utf-8 +# +# Copyright (c) 2020 @yarray +# Copyright (c) 2020 Dean Jackson +# +# MIT Licence. See http://opensource.org/licenses/MIT +# + import json import logging import os -import sys import sqlite3 -from .config import read as read_config +from .util import timed log = logging.getLogger(__name__) -datadir, _ = config = read_config() + SQL = "SELECT data FROM `better-bibtex` WHERE name = 'better-bibtex.citekey';" -class BetterBibTex: - def __init__(self, zot_data_dir=None): - dbpath = os.path.join(zot_data_dir or datadir, 'better-bibtex.sqlite') - self.conn = None +class BetterBibTex(object): + """Read citkeys from BetterBibTex database. + + Attributes: + refkeys (dict): ``(library ID, item Key): citekey`` mapping. + + """ + + def __init__(self, datadir): + """Load Better Bibtex database from Zotero data directory. + + Args: + datadir (unicode, optional): Zotero's data directory. - if os.path.exists(dbpath): - try: - self.conn = sqlite3.connect(dbpath) - except Exception as e: - log.warn('Open Better Bibtex database error: ' + str(e)) - return - else: - log.warn('Better Bibtex database not found') + Raises: + RuntimeError: Raised if Better Bibtex database doesn't exist. + + """ + self._refkeys = {} + self.exists = False + dbpath = os.path.join(datadir, 'better-bibtex.sqlite') + if not os.path.exists(dbpath): return - try: - row = self.conn.execute(SQL).fetchone() + conn = sqlite3.connect(dbpath) + with timed('load Better Bibtex data'): + row = conn.execute(SQL).fetchone() data = json.loads(row[0])['data'] - self.refkeys = {(str(ck['libraryID']), ck['itemKey']): - ck['citekey'] - for ck in data} - except Exception: - log.warn('Better Bibtex database corrupted') - - def search(self, url): - ''' given alfred item ''' - if self.conn is None or len(url) == 0: - return [] - lib_id, key = url.split('/')[-1].split('_') - return self.refkeys[(lib_id, key)] + self._refkeys = { + unicode(ck['libraryID']) + '_' + ck['itemKey']: ck['citekey'] + for ck in data + } + self.exists = True + + def citekey(self, key): + """Return Better Bibtex citekey for Zotero item. + + Args: + key (unicode): ``libraryID_itemKey`` Better Bibtex key. + + Returns: + unicode: Citekey + + """ + return self._refkeys.get(key) diff --git a/src/lib/zothero/index.py b/src/lib/zothero/index.py index e241480..2a76b7a 100644 --- a/src/lib/zothero/index.py +++ b/src/lib/zothero/index.py @@ -25,7 +25,7 @@ # Version of the database schema/data format. # Increment this every time the schema or JSON format changes to # invalidate the existing cache. -DB_VERSION = 7 +DB_VERSION = 8 # SQL schema for the search database. The Entry is also stored in the # database as JSON for speed (it takes 7 SQL queries to retrieve an diff --git a/src/lib/zothero/models.py b/src/lib/zothero/models.py index 677b516..9e62f5c 100644 --- a/src/lib/zothero/models.py +++ b/src/lib/zothero/models.py @@ -83,6 +83,7 @@ class Entry(AttrDict): attachments (list): Sequence of `Attachment` objects. notes (list): Plaintext (Unicode) Entry notes. abstract (unicode): Entry abstract. + citekey (unicode or None): Better Bibtex citekey. """ diff --git a/src/lib/zothero/zotero.py b/src/lib/zothero/zotero.py index 023cbc5..4a1e1cd 100644 --- a/src/lib/zothero/zotero.py +++ b/src/lib/zothero/zotero.py @@ -175,6 +175,7 @@ def __init__(self, datadir, dbpath=None, attachments_base_dir=None): self._attachments_dir = attachments_base_dir self.dbpath = dbpath or os.path.join(datadir, 'zotero.sqlite') self._conn = None + self._bbt = None # BetterBibTex @property def conn(self): @@ -186,6 +187,17 @@ def conn(self): return self._conn + @property + def bbt(self): + """Return BetterBibTex.""" + if not self._bbt: + from .betterbibtex import BetterBibTex + self._bbt = BetterBibTex(self.datadir) + if self._bbt.exists: + log.debug('[zotero] loaded BetterBibTex data') + + return self._bbt + @property def last_updated(self): """Return modified time of database file.""" @@ -304,6 +316,9 @@ def _load_entry(self, row): e.notes = self._entry_notes(e.id) e.tags = self._entry_tags(e.id) + # Better Bibtex citekey + e.citekey = self.bbt.citekey('{}_{}'.format(e.library, e.key)) + return e def _entry_attachments(self, entry_id): diff --git a/src/zh b/src/zh index f4d3f70..188f730 100755 --- a/src/zh +++ b/src/zh @@ -18,6 +18,7 @@ Usage: zh clear zh config [] zh copy [--bibliography] [--paste]