From 7519287fa8510cfff6a7243250a537aae75d0dbe Mon Sep 17 00:00:00 2001 From: Dan Stillman <dstillman@zotero.org> Date: Tue, 24 Mar 2015 02:26:56 -0400 Subject: [PATCH 01/44] Fix JS version declaration for test support scripts --- test/content/runtests.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/content/runtests.html b/test/content/runtests.html index 85294a22d..a2291f173 100644 --- a/test/content/runtests.html +++ b/test/content/runtests.html @@ -8,7 +8,7 @@ <script src="chrome://zotero/content/include.js"></script> <script src="resource://zotero-unit/chai/chai.js"></script> <script src="resource://zotero-unit/mocha/mocha.js"></script> - <script src="support.js" version="application/javascript;version=1.8"></script> - <script src="runtests.js" version="application/javascript;version=1.8"></script> + <script src="support.js" type="application/javascript;version=1.8"></script> + <script src="runtests.js" type="application/javascript;version=1.8"></script> </body> </html> \ No newline at end of file From 9624f6fac36ff0bd98db450b1a043dd9d978b4a9 Mon Sep 17 00:00:00 2001 From: Aurimas Vinckevicius <aurimas.dev@gmail.com> Date: Tue, 24 Mar 2015 01:58:43 -0500 Subject: [PATCH 02/44] Fix runtests.sh to work with cygwin --- test/runtests.sh | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/test/runtests.sh b/test/runtests.sh index 7ef72c07c..90f831001 100755 --- a/test/runtests.sh +++ b/test/runtests.sh @@ -1,6 +1,19 @@ #!/bin/bash CWD="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +case "$(uname -s)" in + CYGWIN*) IS_CYGWIN=1 ;; +esac + +function makePath { + local __assignTo=$1 + local __path=$2 + if [ ! -z $IS_CYGWIN ]; then + __path="`cygpath -aw \"$__path\"`" + fi + eval $__assignTo="'$__path'" +} + DEBUG=false if [ "`uname`" == "Darwin" ]; then FX_EXECUTABLE="/Applications/Firefox.app/Contents/MacOS/firefox" @@ -50,8 +63,13 @@ fi # Set up profile directory PROFILE="`mktemp -d 2>/dev/null || mktemp -d -t 'zotero-unit'`" mkdir "$PROFILE/extensions" -echo "$CWD" > "$PROFILE/extensions/zotero-unit@zotero.org" -echo "`dirname "$CWD"`" > "$PROFILE/extensions/zotero@chnm.gmu.edu" + +makePath ZOTERO_UNIT_PATH "$CWD" +echo "$ZOTERO_UNIT_PATH" > "$PROFILE/extensions/zotero-unit@zotero.org" + +makePath ZOTERO_PATH "`dirname "$CWD"`" +echo "$ZOTERO_PATH" > "$PROFILE/extensions/zotero@chnm.gmu.edu" + cat <<EOF > "$PROFILE/prefs.js" user_pref("extensions.autoDisableScopes", 0); user_pref("extensions.zotero.debug.log", $DEBUG); @@ -59,7 +77,8 @@ user_pref("extensions.zotero.firstRunGuidance", false); user_pref("extensions.zotero.firstRun2", false); EOF -MOZ_NO_REMOTE=1 NO_EM_RESTART=1 "$FX_EXECUTABLE" -profile "$PROFILE" \ +makePath FX_PROFILE "$PROFILE" +MOZ_NO_REMOTE=1 NO_EM_RESTART=1 "$FX_EXECUTABLE" -profile "$FX_PROFILE" \ -chrome chrome://zotero-unit/content/runtests.html -test "$TESTS" $FX_ARGS # Check for success From e732d6350be6a8d0589878113163b09b2ec5442c Mon Sep 17 00:00:00 2001 From: Aurimas Vinckevicius <aurimas.dev@gmail.com> Date: Tue, 24 Mar 2015 02:04:54 -0500 Subject: [PATCH 03/44] Allow setting item field value via base field --- chrome/content/zotero/xpcom/data/item.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/chrome/content/zotero/xpcom/data/item.js b/chrome/content/zotero/xpcom/data/item.js index 2563840a9..68e488bc5 100644 --- a/chrome/content/zotero/xpcom/data/item.js +++ b/chrome/content/zotero/xpcom/data/item.js @@ -804,6 +804,9 @@ Zotero.Item.prototype.setField = function(field, value, loadIn) { value = false; } + // Make sure to use type-specific field ID if available + fieldID = Zotero.ItemFields.getFieldIDFromTypeAndBase(this.itemTypeID, fieldID) || fieldID; + if (value !== false && !Zotero.ItemFields.isValidForType(fieldID, this.itemTypeID)) { var msg = "'" + field + "' is not a valid field for type " + this.itemTypeID; From 827eb9b32ea2d8dc200b4ea021c8040a96917ae1 Mon Sep 17 00:00:00 2001 From: Dan Stillman <dstillman@zotero.org> Date: Tue, 24 Mar 2015 03:38:11 -0400 Subject: [PATCH 04/44] Change command-line debug flag to -ZoteroDebug for consistency From -zoterodebug --- components/zotero-service.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/zotero-service.js b/components/zotero-service.js index 736a35db1..389185bc5 100644 --- a/components/zotero-service.js +++ b/components/zotero-service.js @@ -364,7 +364,7 @@ ZoteroCommandLineHandler.prototype = { /* nsICommandLineHandler */ handle : function(cmdLine) { // Force debug output - if (cmdLine.handleFlag("zoterodebug", false)) { + if (cmdLine.handleFlag("ZoteroDebug", false)) { zInitOptions.forceDebugLog = true; } From d1ca5e272940b24804bb8fa3e70a6359b82dc3ec Mon Sep 17 00:00:00 2001 From: Dan Stillman <dstillman@zotero.org> Date: Tue, 24 Mar 2015 03:40:07 -0400 Subject: [PATCH 05/44] Restore use of dump() on Windows if debug pref is enabled It turns out that the Cygwin console, unlike -console, is actually usable, so developers on Windows can use that. Since we sometimes need real-time debug output from end users (who won't have Cygwin installed), keep logging to the Browser Console if only the -ZoteroDebug flag is passed. --- chrome/content/zotero/xpcom/debug.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/chrome/content/zotero/xpcom/debug.js b/chrome/content/zotero/xpcom/debug.js index a635045c2..7b506e32b 100644 --- a/chrome/content/zotero/xpcom/debug.js +++ b/chrome/content/zotero/xpcom/debug.js @@ -25,10 +25,11 @@ Zotero.Debug = new function () { - var _console, _stackTrace, _store, _level, _time, _lastTime, _output = []; + var _console, _consolePref, _stackTrace, _store, _level, _time, _lastTime, _output = []; this.init = function (forceDebugLog) { - _console = forceDebugLog || Zotero.Prefs.get('debug.log'); + _consolePref = Zotero.Prefs.get('debug.log'); + _console = _consolePref || forceDebugLog; _store = Zotero.Prefs.get('debug.store'); if (_store) { Zotero.Prefs.set('debug.store', false); @@ -89,11 +90,12 @@ Zotero.Debug = new function () { if (_console) { var output = 'zotero(' + level + ')' + (_time ? deltaStr : '') + ': ' + message; if(Zotero.isFx && !Zotero.isBookmarklet) { - // On Windows, where the text console is inexplicably glacial, - // log to the Browser Console instead + // On Windows, where the text console (-console) is inexplicably glacial, + // log to the Browser Console instead if only the -ZoteroDebug flag is used. + // Developers can use the debug.log/debug.time prefs and the Cygwin text console. // // TODO: Get rid of the filename and line number - if (Zotero.isWin && !Zotero.isStandalone) { + if (!_consolePref && Zotero.isWin && !Zotero.isStandalone) { var console = Components.utils.import("resource://gre/modules/devtools/Console.jsm", {}).console; console.log(output); } From a6e9f0aea0143a6b51f741b37d57c5feb1c8a240 Mon Sep 17 00:00:00 2001 From: Aurimas Vinckevicius <aurimas.dev@gmail.com> Date: Tue, 24 Mar 2015 17:54:32 -0500 Subject: [PATCH 06/44] Add tests for ISSN/ISBN-related Zotero.Utilities functions --- test/tests/utilities.js | 155 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 155 insertions(+) diff --git a/test/tests/utilities.js b/test/tests/utilities.js index b71dcb517..e21aa6b9a 100644 --- a/test/tests/utilities.js +++ b/test/tests/utilities.js @@ -17,4 +17,159 @@ describe("Zotero.Utilities", function() { } }); }); + describe("cleanISBN", function() { + let cleanISBN = Zotero.Utilities.cleanISBN; + it("should return false for non-ISBN string", function() { + assert.isFalse(cleanISBN(''), 'returned false for empty string'); + assert.isFalse(cleanISBN('Random String 123'), 'returned false for non-ISBN string'); + assert.isFalse(cleanISBN('1234X67890'), 'returned false for ISBN10-looking string with X in the middle'); + assert.isFalse(cleanISBN('987123456789X'), 'returned false for ISBN13-looking string with X as check-digit'); + }); + it("should return false for invalid ISBN string", function() { + assert.isFalse(cleanISBN('1234567890'), 'returned false for invalid ISBN10'); + assert.isFalse(cleanISBN('9871234567890'), 'returned false for invalid ISBN13'); + }); + it("should return valid ISBN string given clean, valid ISBN string", function() { + assert.equal(cleanISBN('123456789X'), '123456789X', 'passed through valid ISBN10'); + assert.equal(cleanISBN('123456789x'), '123456789X', 'passed through valid ISBN10 with lower case input'); + assert.equal(cleanISBN('9781234567897'), '9781234567897', 'passed through valid ISBN13'); + assert.equal(cleanISBN('9791843123391'), '9791843123391', 'passed through valid ISBN13 in 979 range'); + }); + it("should strip off internal characters in ISBN string", function() { + let ignoredChars = '\x2D\xAD\u2010\u2011\u2012\u2013\u2014\u2015\u2043\u2212' // Dashes + + ' \xA0\r\n\t\x0B\x0C\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005' // Spaces + + '\u2006\u2007\u2008\u2009\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF'; + for (let i=0; i<ignoredChars.length; i++) { + let charCode = '\\u' + Zotero.Utilities.lpad(ignoredChars.charCodeAt(i).toString(16).toUpperCase(), '0', 4); + assert.equal(cleanISBN('9781' + ignoredChars.charAt(i) + '234567897'), '9781234567897', 'stripped off ' + charCode); + } + assert.equal(cleanISBN('9781' + ignoredChars + '234567897'), '9781234567897', 'stripped off all ignored characters'); + + let isbnChars = ignoredChars + '1234567890'; + for (let i=1; i<65536; i++) { + let c = String.fromCharCode(i); + if (isbnChars.indexOf(c) != -1) continue; + + let charCode = '\\u' + Zotero.Utilities.lpad(i.toString(16).toUpperCase(), '0', 4); + assert.isFalse(cleanISBN('9781' + c + '234567897'), 'did not ignore internal character ' + charCode); + } + }); + it("should strip off surrounding non-ISBN string", function() { + assert.equal(cleanISBN('ISBN 9781234567897'), '9781234567897', 'stripped off preceding string (with space)'); + assert.equal(cleanISBN('ISBN:9781234567897'), '9781234567897', 'stripped off preceding string (without space)'); + assert.equal(cleanISBN('9781234567897 ISBN13'), '9781234567897', 'stripped off trailing string (with space)'); + assert.equal(cleanISBN('9781234567897(ISBN13)'), '9781234567897', 'stripped off trailing string (without space)'); + assert.equal(cleanISBN('ISBN13:9781234567897 (print)'), '9781234567897', 'stripped off surrounding string'); + assert.equal(cleanISBN('978 9781234567 897'), '9781234567897', 'stripped off pseudo-ISBN prefix'); + }); + it("should return the first valid ISBN from a string with multiple ISBNs", function() { + assert.equal(cleanISBN('9781234567897, 9791843123391'), '9781234567897', 'returned first valid ISBN13 from list of valid ISBN13s'); + assert.equal(cleanISBN('123456789X, 0199535922'), '123456789X', 'returned first valid ISBN13 from list of valid ISBN13s'); + assert.equal(cleanISBN('123456789X 9781234567897'), '123456789X', 'returned first valid ISBN (10) from a list of mixed-length ISBNs'); + assert.equal(cleanISBN('9781234567897 123456789X'), '9781234567897', 'returned first valid ISBN (13) from a list of mixed-length ISBNs'); + assert.equal(cleanISBN('1234567890 9781234567897'), '9781234567897', 'returned first valid ISBN in the list with valid and invalid ISBNs'); + }); + it("should not return an ISBN from a middle of a longer number string", function() { + assert.isFalse(cleanISBN('1239781234567897'), 'did not ignore number prefix'); + assert.isFalse(cleanISBN('9781234567897123'), 'did not ignore number suffix'); + assert.isFalse(cleanISBN('1239781234567897123'), 'did not ignore surrounding numbers'); + }); + it("should return valid ISBN from a dirty string", function() { + assert.equal(cleanISBN('<b>ISBN</b>:978-1 234\xA056789 - 7(print)\n<b>ISBN-10</b>:123\x2D456789X (print)'), '9781234567897'); + }); + it("should not validate check digit when dontValidate is set", function() { + assert.equal(cleanISBN('9781234567890', true), '9781234567890', 'plain ISBN13 with wrong check digit'); + assert.equal(cleanISBN('1234567890', true), '1234567890', 'plain ISBN10 with wrong check digit'); + assert.equal(cleanISBN('1234567890 9781234567897', true), '1234567890', 'returned first ISBN10 (invalid) in the list with valid and invalid ISBNs'); + assert.equal(cleanISBN('9781234567890 123456789X', true), '9781234567890', 'returned first ISBN13 (invalid) in the list with valid and invalid ISBNs'); + }); + it("should not pass non-ISBN strings if dontValidate is set", function() { + assert.isFalse(cleanISBN('', true), 'returned false for empty string'); + assert.isFalse(cleanISBN('Random String 123', true), 'returned false for non-ISBN string'); + assert.isFalse(cleanISBN('1234X67890', true), 'returned false for ISBN10-looking string with X in the middle'); + assert.isFalse(cleanISBN('123456789Y', true), 'returned false for ISBN10-looking string with Y as check digit'); + assert.isFalse(cleanISBN('987123456789X', true), 'returned false for ISBN13-looking string with X as check-digit'); + assert.isFalse(cleanISBN('1239781234567897', true), 'did not ignore number prefix'); + assert.isFalse(cleanISBN('9781234567897123', true), 'did not ignore number suffix'); + assert.isFalse(cleanISBN('1239781234567897123', true), 'did not ignore surrounding numbers'); + }); + }); + describe("toISBN13", function() { + let toISBN13 = Zotero.Utilities.toISBN13; + it("should throw on invalid ISBN", function() { + let errorMsg = 'ISBN not found in "', + invalidStrings = ['', 'random string', '1234567890123']; + for (let i=0; i<invalidStrings.length; i++) { + assert.throws(toISBN13.bind(null,invalidStrings[i]), errorMsg + invalidStrings[i] + '"'); + } + }); + it("should convert to ISBN13", function() { + assert.equal(toISBN13('123456789X'), '9781234567897', 'converts ISBN10 to ISBN13'); + assert.equal(toISBN13('9781234567897'), '9781234567897', 'ISBN13 stays the same'); + assert.equal(toISBN13('9791843123391'), '9791843123391', '979 ISBN13 stays the same'); + assert.equal(toISBN13('978-1234567897'), '9781234567897', 'accepts hyphenated ISBN'); + }); + it("should ignore invalid check digit", function() { + assert.equal(toISBN13('1234567890'), '9781234567897', 'converts ISBN10 with invalid check digit to ISBN13'); + assert.equal(toISBN13('9781234567890'), '9781234567897', 'corrects invalid ISBN13 check digit'); + }); + }); + describe("cleanISSN", function() { + let cleanISSN = Zotero.Utilities.cleanISSN; + it("should return false for non-ISSN string", function() { + assert.isFalse(cleanISSN(''), 'returned false for empty string'); + assert.isFalse(cleanISSN('Random String 123'), 'returned false for non-ISSN string'); + assert.isFalse(cleanISSN('123X-5679'), 'returned false for ISSN-looking string with X in the middle'); + }); + it("should return false for invalid ISSN string", function() { + assert.isFalse(cleanISSN('12345678'), 'returned false for invalid ISSN'); + assert.isFalse(cleanISSN('1234-5678'), 'returned false for invalid ISSN with hyphen'); + }); + it("should return valid ISSN string given clean, valid ISSN string", function() { + assert.equal(cleanISSN('1234-5679'), '1234-5679', 'passed through valid ISSN'); + assert.equal(cleanISSN('2090-424X'), '2090-424X', 'passed through valid ISSN with X check digit'); + }); + it("should hyphenate valid ISSN", function() { + assert.equal(cleanISSN('12345679'), '1234-5679', 'hyphenated valid ISSN'); + }); + it("should strip off internal characters in ISSN string", function() { + let ignoredChars = '\x2D\xAD\u2010\u2011\u2012\u2013\u2014\u2015\u2043\u2212' // Dashes + + ' \xA0\r\n\t\x0B\x0C\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005' // Spaces + + '\u2006\u2007\u2008\u2009\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF'; + for (let i=0; i<ignoredChars.length; i++) { + let charCode = '\\u' + Zotero.Utilities.lpad(ignoredChars.charCodeAt(i).toString(16).toUpperCase(), '0', 4); + assert.equal(cleanISSN('1' + ignoredChars.charAt(i) + '2345679'), '1234-5679', 'stripped off ' + charCode); + } + assert.equal(cleanISSN('1' + ignoredChars + '2345679'), '1234-5679', 'stripped off all ignored characters'); + + let isbnChars = ignoredChars + '1234567890'; + for (let i=1; i<65536; i++) { + let c = String.fromCharCode(i); + if (isbnChars.indexOf(c) != -1) continue; + + let charCode = '\\u' + Zotero.Utilities.lpad(i.toString(16).toUpperCase(), '0', 4); + assert.isFalse(cleanISSN('1' + c + '2345679'), 'did not ignore internal character ' + charCode); + } + }); + it("should strip off surrounding non-ISSN string", function() { + assert.equal(cleanISSN('ISSN 1234-5679'), '1234-5679', 'stripped off preceding string (with space)'); + assert.equal(cleanISSN('ISSN:1234-5679'), '1234-5679', 'stripped off preceding string (without space)'); + assert.equal(cleanISSN('1234-5679 ISSN'), '1234-5679', 'stripped off trailing string (with space)'); + assert.equal(cleanISSN('1234-5679(ISSN)'), '1234-5679', 'stripped off trailing string (without space)'); + assert.equal(cleanISSN('ISSN:1234-5679 (print)'), '1234-5679', 'stripped off surrounding string'); + assert.equal(cleanISSN('123 12345 679'), '1234-5679', 'stripped off pseudo-ISSN prefix'); + }); + it("should return the first valid ISSN from a string with multiple ISSNs", function() { + assert.equal(cleanISSN('1234-5679, 0028-0836'), '1234-5679', 'returned first valid ISSN from list of valid ISSNs'); + assert.equal(cleanISSN('1234-5678, 0028-0836'), '0028-0836', 'returned first valid ISSN in the list with valid and invalid ISSNs'); + }); + it("should not return an ISSN from a middle of a longer number string", function() { + assert.isFalse(cleanISSN('12312345679'), 'did not ignore number prefix'); + assert.isFalse(cleanISSN('12345679123'), 'did not ignore number suffix'); + assert.isFalse(cleanISSN('12312345679123'), 'did not ignore surrounding numbers'); + }); + it("should return valid ISSN from a dirty string", function() { + assert.equal(cleanISSN('<b>ISSN</b>:1234\xA0-\t5679(print)\n<b>eISSN (electronic)</b>:0028-0836'), '1234-5679'); + }); + }); }); From 48810f23e04229ace477713a4023ac3ccad49283 Mon Sep 17 00:00:00 2001 From: Aurimas Vinckevicius <aurimas.dev@gmail.com> Date: Mon, 2 Mar 2015 01:05:15 -0600 Subject: [PATCH 07/44] Tweak cleanISBN, cleanISSN, toISBN13 to match tests Fixes regression from 37921b09100cd35697173be39f272837ec7c1f95 cleanISBN/ISSN now return first valid ISBN/ISSN from a list of valid/invalid ISBNs/ISSNs, even if invalid ISBN/ISSN comes first toISBN13 now corrects the check digit for ISBN13 input --- chrome/content/zotero/xpcom/utilities.js | 119 +++++++++++++---------- 1 file changed, 65 insertions(+), 54 deletions(-) diff --git a/chrome/content/zotero/xpcom/utilities.js b/chrome/content/zotero/xpcom/utilities.js index acc5f2006..eec16d1bb 100644 --- a/chrome/content/zotero/xpcom/utilities.js +++ b/chrome/content/zotero/xpcom/utilities.js @@ -282,39 +282,41 @@ Zotero.Utilities = { * @param {Boolean} [dontValidate=false] Do not validate check digit * @return {String|Boolean} Valid ISBN or false */ - "cleanISBN":function(isbn, dontValidate) { - isbn = isbn.replace(/[^0-9a-z]+/ig, '').toUpperCase() //we only want to ignore punctuation, spaces - .match(/\b(?:97[89][0-9]{10}|[0-9]{9}[0-9X])\b/); //13 digit or 10 digit - if(!isbn) return false; - isbn = isbn[0]; - - if (dontValidate && (isbn.length == 10 || isbn.length == 13)) { - return isbn; - } - - if(isbn.length == 10) { - // Verify ISBN-10 checksum - var sum = 0; - for (var i = 0; i < 9; i++) { - if(isbn[i] == 'X') return false; //X can only be a check digit - sum += isbn[i] * (10-i); + "cleanISBN":function(isbnStr, dontValidate) { + isbnStr = isbnStr.toUpperCase() + .replace(/[\x2D\xAD\u2010-\u2015\u2043\u2212]+/g, ''); // Ignore dashes + var isbnRE = /\b(?:97[89]\s*(?:\d\s*){9}\d|(?:\d\s*){9}[\dX])\b/g, + isbnMatch; + while(isbnMatch = isbnRE.exec(isbnStr)) { + var isbn = isbnMatch[0].replace(/\s+/g, ''); + + if (dontValidate) { + return isbn; } - //check digit might be 'X' - sum += (isbn[9] == 'X')? 10 : isbn[9]*1; - - return (sum % 11 == 0) ? isbn : false; + + if(isbn.length == 10) { + // Verify ISBN-10 checksum + var sum = 0; + for (var i = 0; i < 9; i++) { + sum += isbn[i] * (10-i); + } + //check digit might be 'X' + sum += (isbn[9] == 'X')? 10 : isbn[9]*1; + + if (sum % 11 == 0) return isbn; + } else { + // Verify ISBN 13 checksum + var sum = 0; + for (var i = 0; i < 12; i+=2) sum += isbn[i]*1; //to make sure it's int + for (var i = 1; i < 12; i+=2) sum += isbn[i]*3; + sum += isbn[12]*1; //add the check digit + + if (sum % 10 == 0 ) return isbn; + } + + isbnRE.lastIndex = isbnMatch.index + 1; // Retry the same spot + 1 } - - if(isbn.length == 13) { - // Verify checksum - var sum = 0; - for (var i = 0; i < 12; i+=2) sum += isbn[i]*1; //to make sure it's int - for (var i = 1; i < 12; i+=2) sum += isbn[i]*3; - sum += isbn[12]*1; //add the check digit - - return (sum % 10 == 0 )? isbn : false; - } - + return false; }, @@ -324,16 +326,17 @@ Zotero.Utilities = { * cleanISBN * @return {String} ISBN-13 */ - "toISBN13": function(isbn) { - if (!/^(?:97[89])?\d{9}[\dxX]$/.test(isbn) - && !(isbn = Zotero.Utilities.cleanISBN(isbn)) - ) { - throw new Error('Invalid ISBN: ' + isbn); + "toISBN13": function(isbnStr) { + var isbn; + if (!(isbn = Zotero.Utilities.cleanISBN(isbnStr, true))) { + throw new Error('ISBN not found in "' + isbnStr + '"'); } - if (isbn.length == 13) return isbn; // Recalculate check digit? - - isbn = '978' + isbn.substr(0,9); + if (isbn.length == 13) { + isbn = isbn.substr(0,12); // Strip off check digit and re-calculate it + } else { + isbn = '978' + isbn.substr(0,9); + } var sum = 0; for (var i = 0; i < 12; i++) { @@ -350,22 +353,30 @@ Zotero.Utilities = { * Clean and validate ISSN. * Return issn if valid, otherwise return false */ - "cleanISSN":function(/**String*/ issn) { - issn = issn.replace(/[^0-9a-z]+/ig, '').toUpperCase() //we only want to ignore punctuation, spaces - .match(/[0-9]{7}[0-9X]/); - if(!issn) return false; - issn = issn[0]; - - // Verify ISSN checksum - var sum = 0; - for (var i = 0; i < 7; i++) { - if(issn[i] == 'X') return false; //X can only be a check digit - sum += issn[i] * (8-i); + "cleanISSN":function(/**String*/ issnStr) { + issnStr = issnStr.toUpperCase() + .replace(/[\x2D\xAD\u2010-\u2015\u2043\u2212]+/g, ''); // Ignore dashes + var issnRE = /\b(?:\d\s*){7}[\dX]\b/g, + issnMatch; + while (issnMatch = issnRE.exec(issnStr)) { + var issn = issnMatch[0].replace(/\s+/g, ''); + + // Verify ISSN checksum + var sum = 0; + for (var i = 0; i < 7; i++) { + sum += issn[i] * (8-i); + } + //check digit might be 'X' + sum += (issn[7] == 'X')? 10 : issn[7]*1; + + if (sum % 11 == 0) { + return issn.substring(0,4) + '-' + issn.substring(4); + } + + issnRE.lastIndex = issnMatch.index + 1; // Retry same spot + 1 } - //check digit might be 'X' - sum += (issn[7] == 'X')? 10 : issn[7]*1; - - return (sum % 11 == 0) ? issn.substring(0,4) + '-' + issn.substring(4) : false; + + return false; }, /** From 4625b7081e11afae6c55b76cc0d933e2b593905d Mon Sep 17 00:00:00 2001 From: Dan Stillman <dstillman@zotero.org> Date: Thu, 26 Mar 2015 18:53:56 -0400 Subject: [PATCH 08/44] Add checkbox to use one side for all remaining conflicts This should be rewritten in a way that allows it to be unit tested, but it seems to work. --- chrome/content/zotero/bindings/merge.xml | 6 + chrome/content/zotero/merge.js | 148 +++++++++++++------ chrome/content/zotero/merge.xul | 16 +- chrome/locale/en-US/zotero/zotero.properties | 3 + chrome/skin/default/zotero/merge.css | 5 +- 5 files changed, 129 insertions(+), 49 deletions(-) diff --git a/chrome/content/zotero/bindings/merge.xml b/chrome/content/zotero/bindings/merge.xml index 2fe1e3020..4483e49d4 100644 --- a/chrome/content/zotero/bindings/merge.xml +++ b/chrome/content/zotero/bindings/merge.xml @@ -124,6 +124,8 @@ <property name="rightpane" onget="return this._rightpane"/> <property name="mergepane" onget="return this._mergepane"/> + <property name="onSelectionChange"/> + <field name="_leftpane"/> <field name="_rightpane"/> <field name="_mergepane"/> @@ -397,6 +399,10 @@ else { mergepane.ref = pane.original; } + + if (mergegroup.onSelectionChange) { + mergegroup.onSelectionChange(); + } ]]> </body> </method> diff --git a/chrome/content/zotero/merge.js b/chrome/content/zotero/merge.js index 1939454a8..5af038222 100644 --- a/chrome/content/zotero/merge.js +++ b/chrome/content/zotero/merge.js @@ -62,6 +62,7 @@ var Zotero_Merge_Window = new function () { } _mergeGroup.type = _io.dataIn.type; + _mergeGroup.onSelectionChange = _updateResolveAllCheckbox; switch (_mergeGroup.type) { case 'item': @@ -78,6 +79,8 @@ var Zotero_Merge_Window = new function () { _mergeGroup.rightCaption = _io.dataIn.captions[1]; _mergeGroup.mergeCaption = _io.dataIn.captions[2]; + _resolveAllCheckbox = document.getElementById('resolve-all'); + _numObjects = document.getElementById('zotero-merge-num-objects'); document.getElementById('zotero-merge-total-objects').value = _objects.length; @@ -101,8 +104,15 @@ var Zotero_Merge_Window = new function () { // Restore previously merged object into merge pane _mergeGroup.merge = _merged[_pos].ref; - _mergeGroup.leftpane.removeAttribute("selected"); - _mergeGroup.rightpane.removeAttribute("selected"); + if (_merged[_pos].id == _mergeGroup.left.id) { + _mergeGroup.leftpane.setAttribute("selected", "true"); + _mergeGroup.rightpane.removeAttribute("selected"); + } + else { + _mergeGroup.leftpane.removeAttribute("selected"); + _mergeGroup.rightpane.setAttribute("selected", "true"); + } + _updateResolveAllCheckbox(); if (_mergeGroup.type == 'item') { _updateChangedCreators(); @@ -125,7 +135,7 @@ var Zotero_Merge_Window = new function () { function onNext() { - if (_pos + 1 == _objects.length) { + if (_pos + 1 == _objects.length || _resolveAllCheckbox.checked) { return true; } @@ -160,43 +170,17 @@ var Zotero_Merge_Window = new function () { return; } + _updateResolveAllCheckbox(); + if (_mergeGroup.type == 'item') { _updateChangedCreators(); } - // On Windows the buttons don't move when one is hidden - if ((_pos + 1) != _objects.length) { - var nextButton = _wizard.getButton("next"); - - if (Zotero.isMac) { - nextButton.setAttribute("hidden", "false"); - _wizard.getButton("finish").setAttribute("hidden", "true"); - } - else { - var buttons = document.getAnonymousElementByAttribute(_wizard, "anonid", "Buttons"); - var deck = document.getAnonymousElementByAttribute(buttons, "anonid", "WizardButtonDeck"); - deck.selectedIndex = 1; - } - - _setInstructionsString(nextButton.label); + if (_isLastConflict()) { + _showFinishButton(); } - // Last object else { - var finishButton = _wizard.getButton("finish"); - - if (Zotero.isMac) { - _wizard.getButton("next").setAttribute("hidden", "true"); - finishButton.setAttribute("hidden", "false"); - } - // Windows uses a deck to switch between the Next and Finish buttons - // TODO: check Linux - else { - var buttons = document.getAnonymousElementByAttribute(_wizard, "anonid", "Buttons"); - var deck = document.getAnonymousElementByAttribute(buttons, "anonid", "WizardButtonDeck"); - deck.selectedIndex = 0; - } - - _setInstructionsString(finishButton.label); + _showNextButton(); } return false; @@ -204,7 +188,20 @@ var Zotero_Merge_Window = new function () { function onFinish() { - _merged[_pos] = _getCurrentMergeObject(); + // If using one side for all remaining, update merge object + if (!_isLastConflict() && _resolveAllCheckbox.checked) { + let useRemote = _mergeGroup.rightpane.getAttribute("selected") == "true"; + for (let i = _pos; i < _objects.length; i++) { + _merged[i] = _getMergeObject( + _objects[i][useRemote ? 1 : 0], + _objects[i][0], + _objects[i][1] + ); + } + } + else { + _merged[_pos] = _getCurrentMergeObject(); + } _io.dataOut = _merged; return true; @@ -216,21 +213,86 @@ var Zotero_Merge_Window = new function () { } - function _getCurrentMergeObject() { - var id = _mergeGroup.merge == 'deleted' ? - (_mergeGroup.left == 'deleted' - ? _mergeGroup.right.id : _mergeGroup.left.id) - : _mergeGroup.merge.id; + this.onResolveAllChange = function (resolveAll) { + if (resolveAll || _isLastConflict()) { + _showFinishButton(); + } + else { + _showNextButton(); + } + } + + function _updateResolveAllCheckbox() { + if (_mergeGroup.rightpane.getAttribute("selected") == 'true') { + var label = 'sync.merge.resolveAllRemote'; + } + else { + var label = 'sync.merge.resolveAllLocal'; + } + _resolveAllCheckbox.label = Zotero.getString(label); + } + + + function _isLastConflict() { + return (_pos + 1) == _objects.length; + } + + + function _showNextButton() { + var nextButton = _wizard.getButton("next"); + + if (Zotero.isMac) { + nextButton.setAttribute("hidden", "false"); + _wizard.getButton("finish").setAttribute("hidden", "true"); + } + else { + var buttons = document.getAnonymousElementByAttribute(_wizard, "anonid", "Buttons"); + var deck = document.getAnonymousElementByAttribute(buttons, "anonid", "WizardButtonDeck"); + deck.selectedIndex = 1; + } + + _setInstructionsString(nextButton.label); + } + + + function _showFinishButton() { + var finishButton = _wizard.getButton("finish"); + + if (Zotero.isMac) { + _wizard.getButton("next").setAttribute("hidden", "true"); + finishButton.setAttribute("hidden", "false"); + } + // Windows uses a deck to switch between the Next and Finish buttons + // TODO: check Linux + else { + var buttons = document.getAnonymousElementByAttribute(_wizard, "anonid", "Buttons"); + var deck = document.getAnonymousElementByAttribute(buttons, "anonid", "WizardButtonDeck"); + deck.selectedIndex = 0; + } + + _setInstructionsString(finishButton.label); + } + + + function _getMergeObject(ref, left, right) { + var id = ref == 'deleted' + ? (left == 'deleted' ? right.id : left.id) + : ref.id; return { id: id, - ref: _mergeGroup.merge, - left: _mergeGroup.left, - right: _mergeGroup.right + ref: ref, + left: left, + right: right }; } + function _getCurrentMergeObject() { + return _getMergeObject(_mergeGroup.merge, _mergeGroup.left, _mergeGroup.right); + } + + // Hack to support creator reconciliation via item view function _updateChangedCreators() { if (_mergeGroup.type != 'item') { diff --git a/chrome/content/zotero/merge.xul b/chrome/content/zotero/merge.xul index 608f33fba..f15dffb64 100644 --- a/chrome/content/zotero/merge.xul +++ b/chrome/content/zotero/merge.xul @@ -48,10 +48,18 @@ <description id="zotero-merge-instructions"/> <zoteromergegroup flex="1"/> <separator class="thin"/> - <hbox id="zotero-step-count"> - <label id="zotero-merge-num-objects"/> - <label value="&zotero.merge.of;"/> - <label id="zotero-merge-total-objects"/> + <hbox align="center"> + <separator orient="vertical" flex="1"/> + <hbox> + <checkbox id="resolve-all" + oncommand="Zotero_Merge_Window.onResolveAllChange(this.checked)"/> + </hbox> + <separator orient="vertical"/> + <hbox id="zotero-step-count"> + <label id="zotero-merge-num-objects"/> + <label value="&zotero.merge.of;"/> + <label id="zotero-merge-total-objects"/> + </hbox> </hbox> </wizardpage> </wizard> diff --git a/chrome/locale/en-US/zotero/zotero.properties b/chrome/locale/en-US/zotero/zotero.properties index b18704d1d..670bc5e82 100644 --- a/chrome/locale/en-US/zotero/zotero.properties +++ b/chrome/locale/en-US/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync = Remove Groups and Sync sync.localObject = Local Object sync.remoteObject = Remote Object sync.mergedObject = Merged Object +sync.merge.resolveAllLocal = Use the local version for all remaining conflicts +sync.merge.resolveAllRemote = Use the remote version for all remaining conflicts + sync.error.usernameNotSet = Username not set sync.error.usernameNotSet.text = You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server. diff --git a/chrome/skin/default/zotero/merge.css b/chrome/skin/default/zotero/merge.css index ff0e7efed..b54fb52a4 100644 --- a/chrome/skin/default/zotero/merge.css +++ b/chrome/skin/default/zotero/merge.css @@ -40,8 +40,9 @@ wizard > deck { padding: 0; } -#zotero-step-count { - -moz-box-pack: end; + +#resolve-all { + font-size: 1.1em; } #zotero-step-count label:first-child { From 52e735b0355ccf6f4eeac867f99f106cc6135118 Mon Sep 17 00:00:00 2001 From: Dan Stillman <dstillman@zotero.org> Date: Thu, 26 Mar 2015 20:29:33 -0400 Subject: [PATCH 09/44] Merge locales from Transifex --- chrome/locale/af-ZA/zotero/zotero.properties | 3 ++ chrome/locale/ar/zotero/zotero.properties | 3 ++ chrome/locale/bg-BG/zotero/zotero.properties | 3 ++ chrome/locale/ca-AD/zotero/zotero.properties | 3 ++ chrome/locale/cs-CZ/zotero/zotero.properties | 3 ++ chrome/locale/da-DK/zotero/zotero.properties | 3 ++ chrome/locale/de/zotero/zotero.properties | 3 ++ chrome/locale/el-GR/zotero/zotero.properties | 3 ++ chrome/locale/es-ES/zotero/preferences.dtd | 10 ++-- chrome/locale/es-ES/zotero/zotero.properties | 35 ++++++++------ chrome/locale/et-EE/zotero/zotero.properties | 3 ++ chrome/locale/eu-ES/zotero/zotero.properties | 3 ++ chrome/locale/fa/zotero/zotero.properties | 3 ++ chrome/locale/fi-FI/zotero/zotero.properties | 3 ++ chrome/locale/fr-FR/zotero/zotero.properties | 3 ++ chrome/locale/gl-ES/zotero/zotero.properties | 3 ++ chrome/locale/he-IL/zotero/zotero.properties | 3 ++ chrome/locale/hr-HR/zotero/zotero.properties | 3 ++ chrome/locale/hu-HU/zotero/zotero.properties | 31 ++++++------ chrome/locale/id-ID/zotero/zotero.properties | 3 ++ chrome/locale/is-IS/zotero/zotero.properties | 3 ++ chrome/locale/it-IT/zotero/zotero.properties | 3 ++ chrome/locale/ja-JP/zotero/zotero.properties | 3 ++ chrome/locale/km/zotero/zotero.properties | 3 ++ chrome/locale/ko-KR/zotero/zotero.properties | 3 ++ chrome/locale/lt-LT/zotero/zotero.properties | 3 ++ chrome/locale/mn-MN/zotero/zotero.properties | 3 ++ chrome/locale/nb-NO/zotero/zotero.properties | 3 ++ chrome/locale/nl-NL/zotero/zotero.properties | 3 ++ chrome/locale/nn-NO/zotero/zotero.properties | 3 ++ chrome/locale/pl-PL/zotero/zotero.properties | 3 ++ chrome/locale/pt-BR/zotero/zotero.properties | 3 ++ chrome/locale/pt-PT/zotero/zotero.properties | 3 ++ chrome/locale/ro-RO/zotero/zotero.properties | 3 ++ chrome/locale/ru-RU/zotero/zotero.properties | 3 ++ chrome/locale/sk-SK/zotero/zotero.properties | 3 ++ chrome/locale/sl-SI/zotero/zotero.properties | 3 ++ chrome/locale/sr-RS/zotero/zotero.properties | 3 ++ chrome/locale/sv-SE/zotero/zotero.properties | 3 ++ chrome/locale/th-TH/zotero/zotero.properties | 3 ++ chrome/locale/tr-TR/zotero/preferences.dtd | 4 +- chrome/locale/tr-TR/zotero/zotero.dtd | 2 +- chrome/locale/tr-TR/zotero/zotero.properties | 51 +++++++++++--------- chrome/locale/uk-UA/zotero/zotero.properties | 3 ++ chrome/locale/vi-VN/zotero/zotero.properties | 3 ++ chrome/locale/zh-CN/zotero/zotero.properties | 3 ++ chrome/locale/zh-TW/zotero/zotero.properties | 3 ++ 47 files changed, 194 insertions(+), 62 deletions(-) diff --git a/chrome/locale/af-ZA/zotero/zotero.properties b/chrome/locale/af-ZA/zotero/zotero.properties index f42d73143..184cd38e5 100644 --- a/chrome/locale/af-ZA/zotero/zotero.properties +++ b/chrome/locale/af-ZA/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Remove Groups and Sync sync.localObject=Local Object sync.remoteObject=Remote Object sync.mergedObject=Merged Object +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=Username not set sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server. diff --git a/chrome/locale/ar/zotero/zotero.properties b/chrome/locale/ar/zotero/zotero.properties index 4aef0e044..ad9810662 100644 --- a/chrome/locale/ar/zotero/zotero.properties +++ b/chrome/locale/ar/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=حذف مجموعات المشاركة و المزام sync.localObject=كائن محلي sync.remoteObject=كائن عن بعد sync.mergedObject=كائن مدمج +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=لم يتم تعيين اسم المستخدم sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server. diff --git a/chrome/locale/bg-BG/zotero/zotero.properties b/chrome/locale/bg-BG/zotero/zotero.properties index 15ad29293..b89861172 100644 --- a/chrome/locale/bg-BG/zotero/zotero.properties +++ b/chrome/locale/bg-BG/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Отстранява групите и синхрони sync.localObject=Локален запис sync.remoteObject=Делечен запис sync.mergedObject=Слят запис +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=Потребителското име не е въведено sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server. diff --git a/chrome/locale/ca-AD/zotero/zotero.properties b/chrome/locale/ca-AD/zotero/zotero.properties index 0a7bfaede..3c3a0b974 100644 --- a/chrome/locale/ca-AD/zotero/zotero.properties +++ b/chrome/locale/ca-AD/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Elimina el grup i sincronitza sync.localObject=Objecte local sync.remoteObject=Objecte remot sync.mergedObject=Objecte fusionat +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=No s'ha establit un nom d'usuari sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server. diff --git a/chrome/locale/cs-CZ/zotero/zotero.properties b/chrome/locale/cs-CZ/zotero/zotero.properties index a5bfc99c8..2ebde2695 100644 --- a/chrome/locale/cs-CZ/zotero/zotero.properties +++ b/chrome/locale/cs-CZ/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Odstranit skupinu a synchronizovat sync.localObject=Lokální objekt sync.remoteObject=Vzdálený objekt sync.mergedObject=Sloučený objekt +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=Uživatelské jméno není nastaveno sync.error.usernameNotSet.text=Musíte zadat své uživatelské jméno a heslo ze zotero.org v Nastavení Zotera, pokud chcete provést synchronizaci s Zotero serverem. diff --git a/chrome/locale/da-DK/zotero/zotero.properties b/chrome/locale/da-DK/zotero/zotero.properties index 0b160efbf..111ea0a2d 100644 --- a/chrome/locale/da-DK/zotero/zotero.properties +++ b/chrome/locale/da-DK/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Fjern grupper og synkronisering sync.localObject=Lokalt objekt sync.remoteObject=Eksternt objekt sync.mergedObject=Sammenflettet objekt +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=Brugernavn ikke angivet sync.error.usernameNotSet.text=Du skal indtaste dit zotero.org brugernavn og adgangskode i Zotero-indstillingerne for at synkronisere med Zotero-serveren. diff --git a/chrome/locale/de/zotero/zotero.properties b/chrome/locale/de/zotero/zotero.properties index 7ebe46d60..f119d92f1 100644 --- a/chrome/locale/de/zotero/zotero.properties +++ b/chrome/locale/de/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Gruppen entfernen und synchronisieren sync.localObject=Lokales Objekt sync.remoteObject=Remote-Objekt sync.mergedObject=Zusammengeführtes Objekt +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=Benutzername nicht definiert sync.error.usernameNotSet.text=Sie müssen Ihren zotero.org Benutzernamen und Passwort in den Zotero Einstellungen eingeben, um mit dem Zotero Server zu synchronisieren. diff --git a/chrome/locale/el-GR/zotero/zotero.properties b/chrome/locale/el-GR/zotero/zotero.properties index ecc153f89..0e7ba7a0c 100644 --- a/chrome/locale/el-GR/zotero/zotero.properties +++ b/chrome/locale/el-GR/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Remove Groups and Sync sync.localObject=Local Object sync.remoteObject=Remote Object sync.mergedObject=Merged Object +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=Username not set sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server. diff --git a/chrome/locale/es-ES/zotero/preferences.dtd b/chrome/locale/es-ES/zotero/preferences.dtd index bb0ca42f2..0f0b6c5f7 100644 --- a/chrome/locale/es-ES/zotero/preferences.dtd +++ b/chrome/locale/es-ES/zotero/preferences.dtd @@ -1,6 +1,6 @@ <!ENTITY zotero.preferences.title "Preferencias de Zotero"> -<!ENTITY zotero.preferences.default "Inicial:"> +<!ENTITY zotero.preferences.default "Predeterminado:"> <!ENTITY zotero.preferences.items "elementos"> <!ENTITY zotero.preferences.period ","> <!ENTITY zotero.preferences.settings "Preferencias"> @@ -48,7 +48,7 @@ <!ENTITY zotero.preferences.prefpane.sync "Sincronizar"> <!ENTITY zotero.preferences.sync.username "Usuario:"> -<!ENTITY zotero.preferences.sync.password "Clave:"> +<!ENTITY zotero.preferences.sync.password "Contraseña:"> <!ENTITY zotero.preferences.sync.syncServer "Servidor de sincronización Zotero"> <!ENTITY zotero.preferences.sync.createAccount "Crear cuenta"> <!ENTITY zotero.preferences.sync.lostPassword "¿Olvidó su contraseña?"> @@ -130,7 +130,7 @@ <!ENTITY zotero.preferences.keys.quicksearch "Búsqueda rápida"> <!ENTITY zotero.preferences.keys.newItem "Crear un nuevo elemento"> <!ENTITY zotero.preferences.keys.newNote "Crear una Nueva nota"> -<!ENTITY zotero.preferences.keys.toggleTagSelector "Conmutar el selector de marcas"> +<!ENTITY zotero.preferences.keys.toggleTagSelector "Conmutar el selector de etiquetas"> <!ENTITY zotero.preferences.keys.copySelectedItemCitationsToClipboard "Copiar las citas para los elementos seleccionados al portapapeles"> <!ENTITY zotero.preferences.keys.copySelectedItemsToClipboard "Copiar los elementos seleccionados al portapapeles"> <!ENTITY zotero.preferences.keys.importFromClipboard "Importar desde el portapapeles"> @@ -160,7 +160,7 @@ <!ENTITY zotero.preferences.prefpane.advanced "Avanzadas"> <!ENTITY zotero.preferences.advanced.filesAndFolders "Archivos y carpetas"> -<!ENTITY zotero.preferences.advanced.keys "Shortcuts"> +<!ENTITY zotero.preferences.advanced.keys "Atajos"> <!ENTITY zotero.preferences.prefpane.locate "Localizar"> <!ENTITY zotero.preferences.locate.locateEngineManager "Administrador de motor de búsqueda de artículo"> @@ -194,7 +194,7 @@ <!ENTITY zotero.preferences.debugOutputLogging "Registro de emisión de depuración"> <!ENTITY zotero.preferences.debugOutputLogging.message "La emisión de depuración puede ayudar a los desarrolladores de Zotero a diagnosticar problemas. Como el registro de depuración enlentece a Zotero, deberías dejarlo desactivado normalmente a menos que algún desarrollador de Zotero te pida la salida de depuración."> -<!ENTITY zotero.preferences.debugOutputLogging.linesLogged "líneas en el registro"> +<!ENTITY zotero.preferences.debugOutputLogging.linesLogged "líneas registradas"> <!ENTITY zotero.preferences.debugOutputLogging.enableAfterRestart "Activar tras el reinicio"> <!ENTITY zotero.preferences.debugOutputLogging.viewOutput "Ver salida"> <!ENTITY zotero.preferences.debugOutputLogging.clearOutput "Limpiar salida"> diff --git a/chrome/locale/es-ES/zotero/zotero.properties b/chrome/locale/es-ES/zotero/zotero.properties index 5e9876446..4bb73516f 100644 --- a/chrome/locale/es-ES/zotero/zotero.properties +++ b/chrome/locale/es-ES/zotero/zotero.properties @@ -42,7 +42,7 @@ general.create=Crear general.delete=Borrar general.moreInformation=Más información general.seeForMoreInformation=Mira en %S para más información -general.open=Open %S +general.open=Abrir %S general.enable=Activar general.disable=Desactivar general.remove=Eliminar @@ -204,11 +204,11 @@ pane.items.trash.multiple=¿Seguro que quieres enviar los ítems a la papelera? pane.items.delete.title=Borrar pane.items.delete=¿Seguro que quieres borrar el ítem asociado? pane.items.delete.multiple=¿Seguro que quieres borrar los ítems seleccionados? -pane.items.remove.title=Remove from Collection -pane.items.remove=Are you sure you want to remove the selected item from this collection? -pane.items.remove.multiple=Are you sure you want to remove the selected items from this collection? -pane.items.menu.remove=Remove Item from Collection… -pane.items.menu.remove.multiple=Remove Items from Collection… +pane.items.remove.title=Quitar de la colección +pane.items.remove=¿Seguro que quiere eliminar el elemento seleccionado de esta colección? +pane.items.remove.multiple=¿Está seguro que quiere eliminar estos elementos seleccionados de esta colección? +pane.items.menu.remove=Quitar ítem de la colección... +pane.items.menu.remove.multiple=Quitar ítems de la colección... pane.items.menu.moveToTrash=Mover ítem a la papelera... pane.items.menu.moveToTrash.multiple=Mover ítems a la papelera... pane.items.menu.export=Exportar el ítem seleccionado... @@ -566,15 +566,15 @@ zotero.preferences.export.quickCopy.exportFormats=Formatos de exportación zotero.preferences.export.quickCopy.instructions=La copia rápida te permite copiar referencias seleccionadas al portapapeles pulsando un atajo (%S) o arrastrando ítems a una casilla de texto en una página web. zotero.preferences.export.quickCopy.citationInstructions=Para estilos bibliográficos, puedes copiar las citas o pies de página presionando %S o manteniendo pulsada la tecla Mayúsculas antes de arrastrar los ítems. -zotero.preferences.wordProcessors.installationSuccess=Installation was successful. -zotero.preferences.wordProcessors.installationError=Installation could not be completed because an error occurred. Please ensure that %1$S is closed, and then restart %2$S. -zotero.preferences.wordProcessors.installed=The %S add-in is currently installed. -zotero.preferences.wordProcessors.notInstalled=The %S add-in is not currently installed. -zotero.preferences.wordProcessors.install=Install %S Add-in -zotero.preferences.wordProcessors.reinstall=Reinstall %S Add-in -zotero.preferences.wordProcessors.installing=Installing %S… -zotero.preferences.wordProcessors.incompatibleVersions1=%1$S %2$S is incompatible with versions of %3$S before %4$S. Please remove %3$S, or download the latest version from %5$S. -zotero.preferences.wordProcessors.incompatibleVersions2=%1$S %2$S requires %3$S %4$S or later to run. Please download the latest version of %3$S from %5$S. +zotero.preferences.wordProcessors.installationSuccess=Instalación fue exitosa. +zotero.preferences.wordProcessors.installationError=Instalación no pudo ser completada debido a que un error ocurrió. Por favor asegúrese que %1$S está cerrado, posteriormente reinicie %2$S. +zotero.preferences.wordProcessors.installed=El complemento %S está actualmente instalado. +zotero.preferences.wordProcessors.notInstalled=El complemento %S no está actualmente instalado. +zotero.preferences.wordProcessors.install=Instalar complemento %S +zotero.preferences.wordProcessors.reinstall=Reinstalar complemento %S +zotero.preferences.wordProcessors.installing=Instalado %S... +zotero.preferences.wordProcessors.incompatibleVersions1=%1$S %2$S es incompatible con las versiones de %3$S anteriores %4$S. Por favor quite %3$S, o descargue la última versión desde %5$S. +zotero.preferences.wordProcessors.incompatibleVersions2=%1$S %2$S requiere %3$S %4$S o posteriores para funcionar. Por favor descargue la última versión de %3$S desde %5$S. zotero.preferences.styles.addStyle=Agregar estilo @@ -738,7 +738,7 @@ integration.missingItem.multiple=El ítem %1$S en esta cita ya no existe en tu b integration.missingItem.description=Al pulsar "No" borrarás los códigos de campo para citas conteniendo este ítem, manteniendo el texto de la cita pero borrándolo de tu bibliografía. integration.removeCodesWarning=Quitando los códigos de campo impedirás que Zotero de actualice citas y bibliografías en este documento. ¿Estás seguro de que deseas continuar? integration.upgradeWarning=Tu documento debe ser actualizado de versión de manera permanente para poder funcionar con Zotero 2.1 o posterior. Se recomienda hacer una copia de seguridad antes de proceder. ¿Seguro que quieres continuar? -integration.error.newerDocumentVersion=Your document was created with a newer version of Zotero (%1$S) than the currently installed version (%2$S). Please upgrade Zotero before editing this document. +integration.error.newerDocumentVersion=Su documento fue creado con una versión más reciente de Zotero (%1$S) que la actual versión instalada (%2$S). Por favor actualice Zotero antes de editar este documento. integration.corruptField=El código de campo Zotero correspondiente a esta cita, el cual señala a Zotero qué ítem en su biblioteca esta cita representa, se ha dañado. ¿Te gustaría volver a seleccionar este ítem? integration.corruptField.description=Al pulsar "No" borrarás los códigos de campo para las citas conteniendo este ítem, preservando este texto de cita pero potencialmente borrándolo de tu bibliografía. integration.corruptBibliography=El código de campo Zotero en tu bibliografía está corrupto. ¿Debería Zotero borrar este código de campo y generar una nueva bibliografía? @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Quitar grupos y sincronizar sync.localObject=Objeto local sync.remoteObject=Objeto remoto sync.mergedObject=Unir objeto +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=Nombre de usuario no provisto sync.error.usernameNotSet.text=Debes introducir tu usuario y contraseña de zotero.org en las preferencias de Zotero para sincronizar con el servidor de Zotero. diff --git a/chrome/locale/et-EE/zotero/zotero.properties b/chrome/locale/et-EE/zotero/zotero.properties index 7dd48ee29..6feae0d6f 100644 --- a/chrome/locale/et-EE/zotero/zotero.properties +++ b/chrome/locale/et-EE/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Eemalda Grupid ja Sync sync.localObject=Kohalik objekt sync.remoteObject=Serveri objekt sync.mergedObject=Liidetud objekt +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=Kasutajanimi ei ole määratud sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server. diff --git a/chrome/locale/eu-ES/zotero/zotero.properties b/chrome/locale/eu-ES/zotero/zotero.properties index 73c763c17..daab73d9e 100644 --- a/chrome/locale/eu-ES/zotero/zotero.properties +++ b/chrome/locale/eu-ES/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Ezabatu Groups eta Sync sync.localObject=item lokala sync.remoteObject=serbidoreko itema sync.mergedObject=proposamen automatikoa +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=Erabiltzaile izena ezarri gabe sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server. diff --git a/chrome/locale/fa/zotero/zotero.properties b/chrome/locale/fa/zotero/zotero.properties index 11a0a78ed..817b1eae0 100644 --- a/chrome/locale/fa/zotero/zotero.properties +++ b/chrome/locale/fa/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=حذف گروهها و همزمانسازی sync.localObject=شیء محلی sync.remoteObject=شیء دور sync.mergedObject=شیء تلفیقی +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=نام کاربری وارد نشده است sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server. diff --git a/chrome/locale/fi-FI/zotero/zotero.properties b/chrome/locale/fi-FI/zotero/zotero.properties index b5e8b0475..969febb14 100644 --- a/chrome/locale/fi-FI/zotero/zotero.properties +++ b/chrome/locale/fi-FI/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Poista ryhmät ja synkronointi sync.localObject=Paikallinen objekti sync.remoteObject=Etäobjekti sync.mergedObject=Yhdistetty objekti +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=Käyttäjänimeä ei määritetty sync.error.usernameNotSet.text=Syötä zotero.orgin käyttäjätunnus ja salasana Zoteron asetuksissa, jotta voit synkronoida tiedot Zotero-palvelimen kanssa. diff --git a/chrome/locale/fr-FR/zotero/zotero.properties b/chrome/locale/fr-FR/zotero/zotero.properties index 6d9bf15b4..481126775 100644 --- a/chrome/locale/fr-FR/zotero/zotero.properties +++ b/chrome/locale/fr-FR/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Retirer les groupes et synchroniser sync.localObject=Objet local sync.remoteObject=Objet distant sync.mergedObject=Objet fusionné +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=Identifiant non défini sync.error.usernameNotSet.text=Vous devez saisir vos nom d'utilisateur et mot de passe, propres à zotero.org, dans les Préférences de Zotero pour synchroniser avec le serveur Zotero. diff --git a/chrome/locale/gl-ES/zotero/zotero.properties b/chrome/locale/gl-ES/zotero/zotero.properties index ac2e4724e..bd97e6c81 100644 --- a/chrome/locale/gl-ES/zotero/zotero.properties +++ b/chrome/locale/gl-ES/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Borrar o grupo e a sincronización sync.localObject=Obxecto local sync.remoteObject=Obxecto remoto sync.mergedObject=Obxecto unido +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=Nome de usuario sen definir sync.error.usernameNotSet.text=Tes que introducir o teu nome de usuario de zotero.org e o contrasinal nas preferencias de Zotero e con iso poder sincronizar co servidor de Zotero. diff --git a/chrome/locale/he-IL/zotero/zotero.properties b/chrome/locale/he-IL/zotero/zotero.properties index 030378a8d..7fb3d6752 100644 --- a/chrome/locale/he-IL/zotero/zotero.properties +++ b/chrome/locale/he-IL/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Remove Groups and Sync sync.localObject=Local Object sync.remoteObject=Remote Object sync.mergedObject=Merged Object +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=Username not set sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server. diff --git a/chrome/locale/hr-HR/zotero/zotero.properties b/chrome/locale/hr-HR/zotero/zotero.properties index f42d73143..184cd38e5 100644 --- a/chrome/locale/hr-HR/zotero/zotero.properties +++ b/chrome/locale/hr-HR/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Remove Groups and Sync sync.localObject=Local Object sync.remoteObject=Remote Object sync.mergedObject=Merged Object +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=Username not set sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server. diff --git a/chrome/locale/hu-HU/zotero/zotero.properties b/chrome/locale/hu-HU/zotero/zotero.properties index cb5d9b460..c113c7392 100644 --- a/chrome/locale/hu-HU/zotero/zotero.properties +++ b/chrome/locale/hu-HU/zotero/zotero.properties @@ -42,7 +42,7 @@ general.create=Új general.delete=Törlés general.moreInformation=További információ general.seeForMoreInformation=A %S bővebb információkat tartalmaz. -general.open=Open %S +general.open=Megnyitás %S general.enable=Bekapcsolás general.disable=Kikapcsolás general.remove=Eltávolítás @@ -194,7 +194,7 @@ tagColorChooser.numberKeyInstructions=You can add this tag to selected items by tagColorChooser.maxTags=Up to %S tags in each library can have colors assigned. pane.items.loading=Elemek listájának betöltése... -pane.items.columnChooser.moreColumns=More Columns +pane.items.columnChooser.moreColumns=Több oszlop pane.items.columnChooser.secondarySort=Másodlagos adatrendezés (%S) pane.items.attach.link.uri.unrecognized=A Zotero nem ismerte fel a beírt URI-t. Kérem ellenőrizze a címet és próbálja újra. pane.items.attach.link.uri.file=Ha linket szeretne csatolni egy fájlhoz, kérem használja a “%S”-t. @@ -204,11 +204,11 @@ pane.items.trash.multiple=A Kukába helyezés megerősítése? pane.items.delete.title=Törlés pane.items.delete=A kijelölt elem törlésének megerősítése? pane.items.delete.multiple=A kijelölt elemek törlésének megerősítése? -pane.items.remove.title=Remove from Collection -pane.items.remove=Are you sure you want to remove the selected item from this collection? -pane.items.remove.multiple=Are you sure you want to remove the selected items from this collection? -pane.items.menu.remove=Remove Item from Collection… -pane.items.menu.remove.multiple=Remove Items from Collection… +pane.items.remove.title=Gyűjtemény törlése... +pane.items.remove=Biztos, hogy el akarja távolítani a kijelölt elemet a gyűjteményből? +pane.items.remove.multiple=Biztos, hogy el akarja távolítani a kijelölt elemeket a gyűjteményből? +pane.items.menu.remove=Kijelölt elem törlése +pane.items.menu.remove.multiple=Kijelölt elemek törlése pane.items.menu.moveToTrash=Elem mozgatása a Kukába… pane.items.menu.moveToTrash.multiple=Elem mozgatása a Kukába… pane.items.menu.export=Kiválasztott elem exportálása... @@ -225,7 +225,7 @@ pane.items.menu.createParent=Szülőelem létrehozása a kijelölt elem alapján pane.items.menu.createParent.multiple=Szülőelemek létrehozása a kijelölt elemek alapján pane.items.menu.renameAttachments=A fájl átnevezése a szülő metaadata alapján pane.items.menu.renameAttachments.multiple=A fájlok átnevezése a szülők metaadata alapján -pane.items.showItemInLibrary=Show Item in Library +pane.items.showItemInLibrary=Az elem megjelenítése könyvtárban pane.items.letter.oneParticipant=Levél (címzett: %S) pane.items.letter.twoParticipants=Levél (címzett: %S és %S) @@ -566,13 +566,13 @@ zotero.preferences.export.quickCopy.exportFormats=Exportálási formátumok zotero.preferences.export.quickCopy.instructions=A Gyorsmásolás segítségével a kiválasztott hivatkozásokat a vágólapra lehet másolni a %S gyorsbillentyű lenyomásával. A hivatkozást egy tetszőleges weboldal szövegmezőjébe is be lehet másolni, ha a kijelölt hivatkozást a szövegmezőbe húzzuk. zotero.preferences.export.quickCopy.citationInstructions=Bibliográfia-stílusokhoz, %S megnyomásával másolhat hivatkozásokat vagy lábjegyzeteket, vagy tartsa lenyomva a Shift-et az elemek áthúzáshoz. -zotero.preferences.wordProcessors.installationSuccess=Installation was successful. +zotero.preferences.wordProcessors.installationSuccess=A telepítés sikeresen befejeződött. zotero.preferences.wordProcessors.installationError=Installation could not be completed because an error occurred. Please ensure that %1$S is closed, and then restart %2$S. zotero.preferences.wordProcessors.installed=The %S add-in is currently installed. zotero.preferences.wordProcessors.notInstalled=The %S add-in is not currently installed. zotero.preferences.wordProcessors.install=Install %S Add-in zotero.preferences.wordProcessors.reinstall=Reinstall %S Add-in -zotero.preferences.wordProcessors.installing=Installing %S… +zotero.preferences.wordProcessors.installing=Telepítés %S… zotero.preferences.wordProcessors.incompatibleVersions1=%1$S %2$S is incompatible with versions of %3$S before %4$S. Please remove %3$S, or download the latest version from %5$S. zotero.preferences.wordProcessors.incompatibleVersions2=%1$S %2$S requires %3$S %4$S or later to run. Please download the latest version of %3$S from %5$S. @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Csoport és szinkronizáció eltávolítása sync.localObject=Helyi objektum sync.remoteObject=Távoli objektum sync.mergedObject=Összefésült objektum +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=Felhasználónév nincs megadva sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server. @@ -985,11 +988,11 @@ firstRunGuidance.quickFormatMac=Type a title or author to search for a reference firstRunGuidance.toolbarButton.new=A Zotero megnyitásához kattintásához kattintson ide, vagy használja a %S billentyűparancsot. firstRunGuidance.toolbarButton.upgrade=A Zotero ikon mostantól a Firefox eszköztárán található. A Zotero megnyitásához kattintson az ikonra, vagy használja a %S gyorsbillentyűt. -styles.bibliography=Bibliography -styles.editor.save=Save Citation Style -styles.editor.warning.noItems=No items selected in Zotero. +styles.bibliography=Bibliográfia +styles.editor.save=Hivatkozási stílus mentése +styles.editor.warning.noItems=Nincs kiválasztott elem a Zoteroban. styles.editor.warning.parseError=Error parsing style: -styles.editor.warning.renderError=Error generating citations and bibliography: +styles.editor.warning.renderError=Hiba a hivatkozások és a bibliográfia generálása közben: styles.editor.output.individualCitations=Individual Citations styles.editor.output.singleCitation=Single Citation (with position "first") styles.preview.instructions=Select one or more items in Zotero and click the "Refresh" button to see how these items are rendered by the installed CSL citation styles. diff --git a/chrome/locale/id-ID/zotero/zotero.properties b/chrome/locale/id-ID/zotero/zotero.properties index 7fc8cfca7..c32b67e5d 100644 --- a/chrome/locale/id-ID/zotero/zotero.properties +++ b/chrome/locale/id-ID/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Hapus Grup dan Sinkronisasi sync.localObject=Objek Lokal sync.remoteObject=Objek Jauh sync.mergedObject=Objek Gabungan +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=Nama pengguna belum diset sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server. diff --git a/chrome/locale/is-IS/zotero/zotero.properties b/chrome/locale/is-IS/zotero/zotero.properties index cbfb0fff2..b78819e7f 100644 --- a/chrome/locale/is-IS/zotero/zotero.properties +++ b/chrome/locale/is-IS/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Fjarlægja hópa og samhæfa sync.localObject=Staðbundinn hlutur sync.remoteObject=Fjartengdur hlutur sync.mergedObject=Sameinaður hlutur +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=Notandanafn ekki tilgreint sync.error.usernameNotSet.text=Þú verður að færa inn zotero.org notandanafn og lykilorð í Zotero kjörstillingum til að samhæfa Zotero þjóni. diff --git a/chrome/locale/it-IT/zotero/zotero.properties b/chrome/locale/it-IT/zotero/zotero.properties index 8a3317d6a..5bf41139e 100644 --- a/chrome/locale/it-IT/zotero/zotero.properties +++ b/chrome/locale/it-IT/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Rimuovere i Gruppi e la Sincronizzazione sync.localObject=Oggetto locale sync.remoteObject=Oggetto remoto sync.mergedObject=Oggetto unificato +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=Nome utente non impostato sync.error.usernameNotSet.text=È necessario inserire le proprie credenziali di zotero.org nelle impostazioni di Zotero per attivare la sincronizzazione con il server Zotero. diff --git a/chrome/locale/ja-JP/zotero/zotero.properties b/chrome/locale/ja-JP/zotero/zotero.properties index c1657a4e6..4f0ddc86f 100644 --- a/chrome/locale/ja-JP/zotero/zotero.properties +++ b/chrome/locale/ja-JP/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=グループと同期を取り除く sync.localObject=ローカル(手元)のオブジェクト sync.remoteObject=リモート(サーバ側)のオブジェクト sync.mergedObject=統合されたオブジェクト +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=ユーザーネームが指定されていません sync.error.usernameNotSet.text=Zotero サーバーと同期するためには、Zotero 環境設定において、zotero.org のユーザー名とパスワードを入力する必要があります。 diff --git a/chrome/locale/km/zotero/zotero.properties b/chrome/locale/km/zotero/zotero.properties index fb05361ed..fd6a8005e 100644 --- a/chrome/locale/km/zotero/zotero.properties +++ b/chrome/locale/km/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=លុបក្រុម និង សមកាលក sync.localObject=វត្ថុមូលដ្ឋាន sync.remoteObject=វត្ថុឆ្ងាយ sync.mergedObject=វត្ថុរួម +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=មិនបានដាក់ឈ្មោះអ្នកប្រើ sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server. diff --git a/chrome/locale/ko-KR/zotero/zotero.properties b/chrome/locale/ko-KR/zotero/zotero.properties index d2f2f10f3..3b5e3b8f9 100644 --- a/chrome/locale/ko-KR/zotero/zotero.properties +++ b/chrome/locale/ko-KR/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=그룹 및 동기화 제거 sync.localObject=지역 개체 sync.remoteObject=원격 개체 sync.mergedObject=병합된 개체 +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=사용자명 설정되지 않음 sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server. diff --git a/chrome/locale/lt-LT/zotero/zotero.properties b/chrome/locale/lt-LT/zotero/zotero.properties index 0bc7421d1..c3c2be77e 100644 --- a/chrome/locale/lt-LT/zotero/zotero.properties +++ b/chrome/locale/lt-LT/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Pašalinti grupes ir sinchronizuoti sync.localObject=Vietinis objektas sync.remoteObject=Nutolęs objektas sync.mergedObject=Apjungtas objektas +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=Nenurodytas naudotojo vardas sync.error.usernameNotSet.text=Norėdami duomenis sinchronizuoti su Zotero serveriu, įveskite savo zotero.org naudotojo vardą ir slaptažodį. diff --git a/chrome/locale/mn-MN/zotero/zotero.properties b/chrome/locale/mn-MN/zotero/zotero.properties index 2cf0f811a..44bfb24b1 100644 --- a/chrome/locale/mn-MN/zotero/zotero.properties +++ b/chrome/locale/mn-MN/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Remove Groups and Sync sync.localObject=Local Object sync.remoteObject=Remote Object sync.mergedObject=Merged Object +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=Username not set sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server. diff --git a/chrome/locale/nb-NO/zotero/zotero.properties b/chrome/locale/nb-NO/zotero/zotero.properties index 15c3cb60e..c3bf28fae 100644 --- a/chrome/locale/nb-NO/zotero/zotero.properties +++ b/chrome/locale/nb-NO/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Remove Groups and Sync sync.localObject=Local Object sync.remoteObject=Remote Object sync.mergedObject=Merged Object +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=Username not set sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server. diff --git a/chrome/locale/nl-NL/zotero/zotero.properties b/chrome/locale/nl-NL/zotero/zotero.properties index 74fd49f43..19caf1d7d 100644 --- a/chrome/locale/nl-NL/zotero/zotero.properties +++ b/chrome/locale/nl-NL/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Groepen en synchronisatie verwijderen sync.localObject=Lokaal item sync.remoteObject=Item van server sync.mergedObject=Samengevoegd item +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=Gebruikersnaam niet ingesteld sync.error.usernameNotSet.text=U moet uw zotero.org gebruikersnaam en wachtwoord in de Zotero-voorkeuren invoeren om te kunnen synchroniseren met de Zotero-server. diff --git a/chrome/locale/nn-NO/zotero/zotero.properties b/chrome/locale/nn-NO/zotero/zotero.properties index cfa7f47b8..511a5f796 100644 --- a/chrome/locale/nn-NO/zotero/zotero.properties +++ b/chrome/locale/nn-NO/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Remove Groups and Sync sync.localObject=Local Object sync.remoteObject=Remote Object sync.mergedObject=Merged Object +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=Username not set sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server. diff --git a/chrome/locale/pl-PL/zotero/zotero.properties b/chrome/locale/pl-PL/zotero/zotero.properties index 7c6e337b5..a00ee0f13 100644 --- a/chrome/locale/pl-PL/zotero/zotero.properties +++ b/chrome/locale/pl-PL/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Usuń grupy i synchronizuj sync.localObject=Obiekt lokalny sync.remoteObject=Obiekt zdalny sync.mergedObject=Złączony obiekt +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=Nie podano nazwy użytkownika sync.error.usernameNotSet.text=W celu synchronizacji z serwerem Zotero musisz podać w ustawieniach Zotero swoją nazwę użytkownika i hasło używane w serwisie zotero.org. diff --git a/chrome/locale/pt-BR/zotero/zotero.properties b/chrome/locale/pt-BR/zotero/zotero.properties index b8e45a449..356a132e2 100644 --- a/chrome/locale/pt-BR/zotero/zotero.properties +++ b/chrome/locale/pt-BR/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Remover grupos e sincronização sync.localObject=Objeto local sync.remoteObject=Objeto remoto sync.mergedObject=Objeto mesclado +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=Nome de usuário não configurado sync.error.usernameNotSet.text=Você deve inserir seu nome de usuário e senha do zotero.org nas preferências do Zotero para sincronizar os dados com o servidor Zotero. diff --git a/chrome/locale/pt-PT/zotero/zotero.properties b/chrome/locale/pt-PT/zotero/zotero.properties index 5f8dd5e6c..1c416af7a 100644 --- a/chrome/locale/pt-PT/zotero/zotero.properties +++ b/chrome/locale/pt-PT/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Remover Grupos e Sincronização sync.localObject=Objecto Local sync.remoteObject=Objecto Remoto sync.mergedObject=Objecto Integrado +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=Nome de utilizador por indicar sync.error.usernameNotSet.text=Tem de introduzir o seu nome de utilizador e a sua palavra-passe do zotero.org nas preferências Zotero para sincronizar com o servidor Zotero. diff --git a/chrome/locale/ro-RO/zotero/zotero.properties b/chrome/locale/ro-RO/zotero/zotero.properties index bbe895dae..ae949aec2 100644 --- a/chrome/locale/ro-RO/zotero/zotero.properties +++ b/chrome/locale/ro-RO/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Șterge Grupuri și Sincronizare sync.localObject=Obiect local sync.remoteObject=Obiect la distanță sync.mergedObject=Obiect unificat +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=Nume de utilizator neconfigurat sync.error.usernameNotSet.text=Trebuie să introduci numele de utilizator zotero.org și parola în preferințele Zotero pentru a sincroniza cu serverul Zotero. diff --git a/chrome/locale/ru-RU/zotero/zotero.properties b/chrome/locale/ru-RU/zotero/zotero.properties index 878a22c73..bf01e5e0e 100644 --- a/chrome/locale/ru-RU/zotero/zotero.properties +++ b/chrome/locale/ru-RU/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Обнулить группы и синхронизир sync.localObject=Локальный объект sync.remoteObject=Удаленный объект sync.mergedObject=Объединенный объект +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=Имя пользователя не установлено sync.error.usernameNotSet.text=Для выполнения синхронизации с сервером Zotero необходимо указать имя и пароль пользователя для zotero.org в настройках Zotero. diff --git a/chrome/locale/sk-SK/zotero/zotero.properties b/chrome/locale/sk-SK/zotero/zotero.properties index b13606bcc..480a019c8 100644 --- a/chrome/locale/sk-SK/zotero/zotero.properties +++ b/chrome/locale/sk-SK/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Odstrániť skupiny a synchronizovať sync.localObject=Miestny objekt sync.remoteObject=Vzdialený objekt sync.mergedObject=Zlúčený objekt +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=Nie je nastavené meno používateľa sync.error.usernameNotSet.text=Pre synchronizáciu so serverom Zotero musíte zadať vaše užívateľské meno a heslo pre zotero.org v predvoľbách Zotera. diff --git a/chrome/locale/sl-SI/zotero/zotero.properties b/chrome/locale/sl-SI/zotero/zotero.properties index 542ba7c59..8f3f640ba 100644 --- a/chrome/locale/sl-SI/zotero/zotero.properties +++ b/chrome/locale/sl-SI/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Odstrani skupine in usklajevanje sync.localObject=Krajevni predmet sync.remoteObject=Oddaljeni predmet sync.mergedObject=Spojeni predmet +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=Uporabniško ime ni določeno sync.error.usernameNotSet.text=Za usklajevanje s strežnikom Zotero morate v nastavitvah Zotero vnesti svoje uporabniško ime in geslo za zotero.org. diff --git a/chrome/locale/sr-RS/zotero/zotero.properties b/chrome/locale/sr-RS/zotero/zotero.properties index ea801d86b..b44d57ef7 100644 --- a/chrome/locale/sr-RS/zotero/zotero.properties +++ b/chrome/locale/sr-RS/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Remove Groups and Sync sync.localObject=Local Object sync.remoteObject=Remote Object sync.mergedObject=Merged Object +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=Username not set sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server. diff --git a/chrome/locale/sv-SE/zotero/zotero.properties b/chrome/locale/sv-SE/zotero/zotero.properties index 4c73f4ea3..015a16c87 100644 --- a/chrome/locale/sv-SE/zotero/zotero.properties +++ b/chrome/locale/sv-SE/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Ta bort grupp och synkronisering sync.localObject=Lokalt objekt sync.remoteObject=Fjärrobjekt sync.mergedObject=Ihopsatt objekt +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=Användarnamn är inte valt sync.error.usernameNotSet.text=Du måste ange ditt zotero.org-användarnamn och lösenord i Zoteros egenskaper för att synkronisera med Zotero-servern. diff --git a/chrome/locale/th-TH/zotero/zotero.properties b/chrome/locale/th-TH/zotero/zotero.properties index 791710cdc..491942eb9 100644 --- a/chrome/locale/th-TH/zotero/zotero.properties +++ b/chrome/locale/th-TH/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=ลบกลุ่มและการเชื่อ sync.localObject=อ็อบเจกต์ในเครื่อง sync.remoteObject=อ็อบเจกต์ทางไกล sync.mergedObject=รวมอ็อบเจกต์ +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=ไม่ได้ตั้งชื่อผู้ใช้ั sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server. diff --git a/chrome/locale/tr-TR/zotero/preferences.dtd b/chrome/locale/tr-TR/zotero/preferences.dtd index c16f9c7b6..7223e057f 100644 --- a/chrome/locale/tr-TR/zotero/preferences.dtd +++ b/chrome/locale/tr-TR/zotero/preferences.dtd @@ -29,7 +29,7 @@ <!ENTITY zotero.preferences.automaticSnapshots "Web sayfalarından eserler yaratılırken sayfa görünümü otomatik olarak kaydet"> <!ENTITY zotero.preferences.downloadAssociatedFiles "Eserleri kaydederken ilişkilendirilen PDF ve diğer dosyaları da otomatik olarak ekle"> <!ENTITY zotero.preferences.automaticTags "Anahtar kelimeler ve konu başlıkları ile eserleri otomatik olarak etiketle"> -<!ENTITY zotero.preferences.trashAutoEmptyDaysPre "Bu kadar zaman önce çöpe gönderilmiş eserleri otomatik olarak sil:"> +<!ENTITY zotero.preferences.trashAutoEmptyDaysPre "Bu kadar zaman önce Çöp Sepetine gönderilmiş eserleri otomatik olarak sil:"> <!ENTITY zotero.preferences.trashAutoEmptyDaysPost "gün"> <!ENTITY zotero.preferences.groups "Gruplar"> @@ -160,7 +160,7 @@ <!ENTITY zotero.preferences.prefpane.advanced "Gelişmiş"> <!ENTITY zotero.preferences.advanced.filesAndFolders "Dosyalar ve Klasörler"> -<!ENTITY zotero.preferences.advanced.keys "Shortcuts"> +<!ENTITY zotero.preferences.advanced.keys "Kısayollar"> <!ENTITY zotero.preferences.prefpane.locate "Yerini Belirle"> <!ENTITY zotero.preferences.locate.locateEngineManager "Makale Bakma Motoru Yöneticisi"> diff --git a/chrome/locale/tr-TR/zotero/zotero.dtd b/chrome/locale/tr-TR/zotero/zotero.dtd index 26a5b93f8..3d11fe53d 100644 --- a/chrome/locale/tr-TR/zotero/zotero.dtd +++ b/chrome/locale/tr-TR/zotero/zotero.dtd @@ -104,7 +104,7 @@ <!ENTITY zotero.toolbar.newGroup "Yeni Grup..."> <!ENTITY zotero.toolbar.newSubcollection.label "Yeni Alt Derme..."> <!ENTITY zotero.toolbar.newSavedSearch.label "Yeni Kaydedilen Arama..."> -<!ENTITY zotero.toolbar.emptyTrash.label "Çöpü Boşalt"> +<!ENTITY zotero.toolbar.emptyTrash.label "Çöp Sepetini Boşalt"> <!ENTITY zotero.toolbar.tagSelector.label "Etiket Seçiciyi Göster/Gizle"> <!ENTITY zotero.toolbar.actions.label "Eylemler"> <!ENTITY zotero.toolbar.import.label "İçeri Aktar..."> diff --git a/chrome/locale/tr-TR/zotero/zotero.properties b/chrome/locale/tr-TR/zotero/zotero.properties index 804cd8087..644e8d8e4 100644 --- a/chrome/locale/tr-TR/zotero/zotero.properties +++ b/chrome/locale/tr-TR/zotero/zotero.properties @@ -42,7 +42,7 @@ general.create=Oluştur general.delete=Sil general.moreInformation=Daha Bilgi general.seeForMoreInformation=Daha fazla bilgi için bakınız: %S -general.open=Open %S +general.open=%S'u aç general.enable=Etkinleştir: general.disable=Seçilemez Kıl general.remove=Kaldır @@ -151,11 +151,11 @@ pane.collections.delete.title=Dermeyi Sil pane.collections.delete=Seçili dermeyi silmek istediğinize emin misiniz? pane.collections.delete.keepItems=Derme içerisindeki eserler silinmeyecektir. pane.collections.deleteWithItems.title=Dermeyi ve Eserleri Sil -pane.collections.deleteWithItems=Seçili derme ile birlikte tüm eserleri silmek istediğinizden emin misiniz? +pane.collections.deleteWithItems=Seçili dermeyi silip, içindeki tüm eserleri Çöp Sepetine taşımak istediğinize emin misiniz? pane.collections.deleteSearch.title=Aramayı Sil pane.collections.deleteSearch=Seçili aramayı silmek istediğinize emin misiniz? -pane.collections.emptyTrash=Çöp kutusundaki tüm eserleri kalıcı olarak silmek istediğinize emin misiniz? +pane.collections.emptyTrash=Çöp Sepetindeki tüm eserleri kalıcı olarak silmek istediğinize emin misiniz? pane.collections.newCollection=Yeni Derme pane.collections.name=Bu derme için bir isim girin: pane.collections.newSavedSeach=Yeni Kaydedilen Arama @@ -163,7 +163,7 @@ pane.collections.savedSearchName=Bu kayıtlı arama için bir isim giriniz: pane.collections.rename=Dermeyi yeniden adlandır: pane.collections.library=Kitaplığım pane.collections.groupLibraries=Grup Kitaplıkları -pane.collections.trash=Çöp +pane.collections.trash=Çöp Sepeti pane.collections.untitled=İsimsiz pane.collections.unfiled=Dosyalanmamış Eserler pane.collections.duplicate=Yinelenen Öğeler @@ -198,19 +198,19 @@ pane.items.columnChooser.moreColumns=Başka Sütun pane.items.columnChooser.secondarySort=İkincil Sıralama (%S) pane.items.attach.link.uri.unrecognized=Zotero girdiğiniz URI'yi tanımadı. Adresi kontrol edip tekrar deneyiniz. pane.items.attach.link.uri.file=Bir dosyaya bağlantı iliştirmek için lütfen “%S”'u kullanınız. -pane.items.trash.title=Çöpe Gönder -pane.items.trash=Seçili eseri çöpe göndermeyi istediğinize emin misiniz? -pane.items.trash.multiple=Seçili eserleri çöpe göndermeyi istediğinize emin misiniz? +pane.items.trash.title=Çöp Sepetine Gönder +pane.items.trash=Seçili eseri Çöp Sepetine göndermeyi istediğinize emin misiniz? +pane.items.trash.multiple=Seçili eserleri Çöp Sepetine göndermeyi istediğinize emin misiniz? pane.items.delete.title=Sil pane.items.delete=Seçili olan bu eseri silmek istediğinize emin misiniz? pane.items.delete.multiple=Seçili olan bu eserleri silmek istediğinize emin misiniz? -pane.items.remove.title=Remove from Collection -pane.items.remove=Are you sure you want to remove the selected item from this collection? -pane.items.remove.multiple=Are you sure you want to remove the selected items from this collection? -pane.items.menu.remove=Remove Item from Collection… -pane.items.menu.remove.multiple=Remove Items from Collection… -pane.items.menu.moveToTrash=Eseri sil... -pane.items.menu.moveToTrash.multiple=Eserleri sil +pane.items.remove.title=Dermeden Sil +pane.items.remove=Seçili eseri, bu dermeden kaldırmak istediğinize emin misiniz? +pane.items.remove.multiple=Seçili eserleri bu dermeden kaldırmak istediğinize emin misiniz? +pane.items.menu.remove=Eseri Dermeden Sil... +pane.items.menu.remove.multiple=Eserleri Dermeden Sil... +pane.items.menu.moveToTrash=Eseri Çöp Sepetine Gönder... +pane.items.menu.moveToTrash.multiple=Eserleri Çöp Sepetine Gönder... pane.items.menu.export=Seçili Eseri Dışarı Aktar... pane.items.menu.export.multiple=Seçili Eserleri Dışarı Aktar... pane.items.menu.createBib=Seçili Eserden Bibliyografya Yarat... @@ -566,15 +566,15 @@ zotero.preferences.export.quickCopy.exportFormats=Dışarı Aktarım Biçimleri zotero.preferences.export.quickCopy.instructions=Çabuk Kopyala, bir kısayol tuşuna (%S) basarak seçilen kaynakların panoya kopyalanmasını ya da eserlerin bir web sayfasındaki bir metin kutusuna sürüklenebilmesini sağlar. zotero.preferences.export.quickCopy.citationInstructions=Bibliyografik stiller için, gönderme ve dipnotları, %S tuşuna basarak veya Shift/ÜstKarakter tuşuna basarken eserleri sürükleyerek kopyalayabilirsiniz. -zotero.preferences.wordProcessors.installationSuccess=Installation was successful. -zotero.preferences.wordProcessors.installationError=Installation could not be completed because an error occurred. Please ensure that %1$S is closed, and then restart %2$S. -zotero.preferences.wordProcessors.installed=The %S add-in is currently installed. -zotero.preferences.wordProcessors.notInstalled=The %S add-in is not currently installed. -zotero.preferences.wordProcessors.install=Install %S Add-in -zotero.preferences.wordProcessors.reinstall=Reinstall %S Add-in -zotero.preferences.wordProcessors.installing=Installing %S… -zotero.preferences.wordProcessors.incompatibleVersions1=%1$S %2$S is incompatible with versions of %3$S before %4$S. Please remove %3$S, or download the latest version from %5$S. -zotero.preferences.wordProcessors.incompatibleVersions2=%1$S %2$S requires %3$S %4$S or later to run. Please download the latest version of %3$S from %5$S. +zotero.preferences.wordProcessors.installationSuccess=Kurulum başarıyla sonuçlandı. +zotero.preferences.wordProcessors.installationError=Bir hata oluştuğu için kurulum tamamlanamadı. %1$S'ün kapalı olduğuna emin olduktan sonra %2$S'u yeniden başlatın. +zotero.preferences.wordProcessors.installed=%S eklentisi kurulu. +zotero.preferences.wordProcessors.notInstalled=%S eklentisi kurulu değil. +zotero.preferences.wordProcessors.install=%S Eklentisini Kur +zotero.preferences.wordProcessors.reinstall=%S Eklentisini Tekrar Kur +zotero.preferences.wordProcessors.installing=%S Kuruluyor... +zotero.preferences.wordProcessors.incompatibleVersions1=%1$S %2$S, %3$S uygulamasının %4$S sürümünden önceki sürümleri ile uyumsuz. Lütfen %3$S uygulamasını kaldırınız, ya da en yeni sürümü %5$S adresinden indiriniz. +zotero.preferences.wordProcessors.incompatibleVersions2=%1$S %2$S doğru çalışabilmek için, %3$S uygulamasının %4$S sürümünü ya da sonraki sürümlerini gerektirmektedir. Lütfen %3$S uygulamasının en yeni sürümünü %5$S adresinden indiriniz. zotero.preferences.styles.addStyle=Stil Ekle @@ -738,7 +738,7 @@ integration.missingItem.multiple=Zotero veritabanınızda, bu göndermedeki %1$S integration.missingItem.description="Hayır"ı tıklamak bu eseri içeren göndermelerin alan kodlarını silecek, gönderme metnini koruyacak, ama kaynakçanızdan silecektir. integration.removeCodesWarning=Alan kodlarının silinmesi Zotero'nun bu belgedeki göndermeleri ve kaynakçaları güncellemesini engelleyecektir. Devam etmek istediğinize emin misiniz? integration.upgradeWarning=Belgeniz Zotero 2.0b7 ve sonrası ile birlikte çalışabilmesi için kalıcı olarak yükseltilmelidir. İşlemi gerçekleştirmeden önce yedek almanız önerilir. Devam etmek istediğinize emin misiniz? -integration.error.newerDocumentVersion=Your document was created with a newer version of Zotero (%1$S) than the currently installed version (%2$S). Please upgrade Zotero before editing this document. +integration.error.newerDocumentVersion=Belgeniz şu an kurulu olan Zotero sürümünden (%2$S) daha yeni bir sürümle (%1$S) yaratılmış. Lütfen bu belgeyi değiştirmeden önce Zotero'yu yükseltiniz. integration.corruptField=Kitaplığınızdaki hangi eserde bu göndermenin temsil edildiğini Zotero'ya söyleyen bu göndermeye ilişkin Zotero alan kodu bozulmuştur. Eseri tekrar seçmek ister misiniz? integration.corruptField.description="Hayır"ı tıklamak bu eseri içeren göndermelerin alan kodlarını silecek, gönderme metnini koruyacak, ama bir olasılıkla kaynakçanızdan silecektir. integration.corruptBibliography=Kaynakçanızın Zotero alan kodu bozulmuştur. Zotero bu alan kodunu silerek yeni bir kaynakça oluştursun mu? @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Grubu Kaldır ve Eşitle sync.localObject=Yerel Nesne sync.remoteObject=Uzak Nesne sync.mergedObject=Nesneyi Birleştir +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=Kullanıcı adı yok sync.error.usernameNotSet.text=Zotero sunucusu ile eşitlenebilmek için Zotero tercihleri altında zotero.org kullanıcı adı ve parolanızı girmelisiniz. diff --git a/chrome/locale/uk-UA/zotero/zotero.properties b/chrome/locale/uk-UA/zotero/zotero.properties index 1f8e0c16b..ce3eb44e4 100644 --- a/chrome/locale/uk-UA/zotero/zotero.properties +++ b/chrome/locale/uk-UA/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Обнулити групи і синхронізува sync.localObject=Локальний об'єкт sync.remoteObject=Видалений об'єкт sync.mergedObject=Об'єднаний об'єкт +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=Ім'я користувача не встановлено sync.error.usernameNotSet.text=Для синхронізації з сервером Zotero ви повинні ввести ім'я користувача та пароль для zotero.org в налаштуваннях Zotero. diff --git a/chrome/locale/vi-VN/zotero/zotero.properties b/chrome/locale/vi-VN/zotero/zotero.properties index f00b5df7d..0f7bb9b75 100644 --- a/chrome/locale/vi-VN/zotero/zotero.properties +++ b/chrome/locale/vi-VN/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Remove Groups and Sync sync.localObject=Local Object sync.remoteObject=Remote Object sync.mergedObject=Merged Object +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=Username not set sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server. diff --git a/chrome/locale/zh-CN/zotero/zotero.properties b/chrome/locale/zh-CN/zotero/zotero.properties index 9b7002d84..6a178b798 100644 --- a/chrome/locale/zh-CN/zotero/zotero.properties +++ b/chrome/locale/zh-CN/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=移除群组和同步 sync.localObject=本地对象 sync.remoteObject=远程对象 sync.mergedObject=合并的对象 +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=未设置用户名 sync.error.usernameNotSet.text=要与Zotero服务器同步, 您需要在Zotero首选项面板中输入zotero.org的用户名及密码. diff --git a/chrome/locale/zh-TW/zotero/zotero.properties b/chrome/locale/zh-TW/zotero/zotero.properties index bb70b4e3b..583cb0145 100644 --- a/chrome/locale/zh-TW/zotero/zotero.properties +++ b/chrome/locale/zh-TW/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=移除群組與同步 sync.localObject=本機的物件 sync.remoteObject=遠端的物件 sync.mergedObject=合併的物件 +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=沒有設定使用者名稱 sync.error.usernameNotSet.text=於 Zotero 偏好設定中一定得輸入 zotero.org 使用者名稱與密碼才能與 Zotero 伺服器同步。 From c9a787c7bdd9a1a14833fe9c220ffdd86fa3808b Mon Sep 17 00:00:00 2001 From: Dan Stillman <dstillman@zotero.org> Date: Thu, 26 Mar 2015 20:34:31 -0400 Subject: [PATCH 10/44] Maybe show some sync errors that weren't being shown (This might end up showing some twice, but better than not at all.) --- chrome/content/zotero/xpcom/sync.js | 1 + 1 file changed, 1 insertion(+) diff --git a/chrome/content/zotero/xpcom/sync.js b/chrome/content/zotero/xpcom/sync.js index 4b2e301d3..eb2f59751 100644 --- a/chrome/content/zotero/xpcom/sync.js +++ b/chrome/content/zotero/xpcom/sync.js @@ -2558,6 +2558,7 @@ Zotero.Sync.Server = new function () { } Zotero.debug(e, 1); + Components.utils.reportError(e); _syncInProgress = false; Zotero.DB.rollbackAllTransactions(); From 40b349edcae23fc816bab8bf0e350861c96ccd76 Mon Sep 17 00:00:00 2001 From: Dan Stillman <dstillman@zotero.org> Date: Fri, 27 Mar 2015 18:43:39 -0400 Subject: [PATCH 11/44] Handle gzip encoding via saveURI() --- chrome/content/zotero/xpcom/utilities_internal.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/chrome/content/zotero/xpcom/utilities_internal.js b/chrome/content/zotero/xpcom/utilities_internal.js index 2b9014399..8ca85b457 100644 --- a/chrome/content/zotero/xpcom/utilities_internal.js +++ b/chrome/content/zotero/xpcom/utilities_internal.js @@ -274,6 +274,9 @@ Zotero.Utilities.Internal = { * @param {nsISupports} target file */ saveURI: function (wbp, source, target) { + // Handle gzip encoding + wbp.persistFlags |= Ci.nsIWebBrowserPersist.PERSIST_FLAGS_AUTODETECT_APPLY_CONVERSION; + // Firefox 35 and below try { wbp.saveURI(source, null, null, null, null, target, null); From 4b83b1a6304d2a2b95558d0a126f9652ba12a910 Mon Sep 17 00:00:00 2001 From: Dan Stillman <dstillman@zotero.org> Date: Fri, 27 Mar 2015 19:00:25 -0400 Subject: [PATCH 12/44] Bump version and maxVersion --- install.rdf | 4 ++-- resource/config.js | 2 +- update.rdf | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/install.rdf b/install.rdf index e31cba70e..4ad3e2cbb 100644 --- a/install.rdf +++ b/install.rdf @@ -6,7 +6,7 @@ <em:id>zotero@chnm.gmu.edu</em:id> <em:name>Zotero</em:name> - <em:version>4.0.26.1.SOURCE</em:version> + <em:version>4.0.27.SOURCE</em:version> <em:creator>Center for History and New Media<br/>George Mason University</em:creator> <em:contributor>Dan Cohen</em:contributor> <em:contributor>Sean Takats</em:contributor> @@ -25,7 +25,7 @@ <Description> <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id> <em:minVersion>31.0</em:minVersion> - <em:maxVersion>36.*</em:maxVersion> + <em:maxVersion>37.*</em:maxVersion> </Description> </em:targetApplication> diff --git a/resource/config.js b/resource/config.js index 19b8fc88a..795b91236 100644 --- a/resource/config.js +++ b/resource/config.js @@ -14,7 +14,7 @@ var ZOTERO_CONFIG = { BOOKMARKLET_ORIGIN: 'https://www.zotero.org', HTTP_BOOKMARKLET_ORIGIN: 'http://www.zotero.org', BOOKMARKLET_URL: 'https://www.zotero.org/bookmarklet/', - VERSION: '4.0.26.1.SOURCE' + VERSION: '4.0.27.SOURCE' }; EXPORTED_SYMBOLS = ["ZOTERO_CONFIG"]; diff --git a/update.rdf b/update.rdf index 7bb8ebefc..96fa57ff3 100644 --- a/update.rdf +++ b/update.rdf @@ -7,12 +7,12 @@ <RDF:Seq> <RDF:li> <RDF:Description> - <version>4.0.26.1.SOURCE</version> + <version>4.0.27.SOURCE</version> <targetApplication> <RDF:Description> <id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</id> <minVersion>31.0</minVersion> - <maxVersion>36.*</maxVersion> + <maxVersion>37.*</maxVersion> <updateLink>http://download.zotero.org/extension/zotero.xpi</updateLink> <updateHash>sha1:</updateHash> </RDF:Description> From d6e19a9f25cb779dd486d0c6c1a69d545dde5712 Mon Sep 17 00:00:00 2001 From: Dan Stillman <dstillman@zotero.org> Date: Sat, 28 Mar 2015 18:37:55 -0400 Subject: [PATCH 13/44] Automatic PDF tool upgrading If automatic translator/style updates are enabled, at least one of the PDF tools is installed, and the repo returns a more recent version number than what's installed, automatically upgrade the tools. (Version 3.02 counts as lower, since Poppler's version numbers are lower.) If an error occurs, wait increasing amounts of time to try the downloads again, up to one week. --- .../zotero/preferences/preferences_search.js | 180 +++++------------- chrome/content/zotero/xpcom/fulltext.js | 72 +++++++ chrome/content/zotero/xpcom/schema.js | 82 ++++++++ 3 files changed, 200 insertions(+), 134 deletions(-) diff --git a/chrome/content/zotero/preferences/preferences_search.js b/chrome/content/zotero/preferences/preferences_search.js index 5f7743c05..591cec7ac 100644 --- a/chrome/content/zotero/preferences/preferences_search.js +++ b/chrome/content/zotero/preferences/preferences_search.js @@ -177,14 +177,18 @@ Zotero_Preferences.Search = { var converterVersion = xmlhttp.responseText.split(/\s/)[0]; var infoVersion = xmlhttp.responseText.split(/\s/)[1]; + // Install if not installed, version unknown, Xpdf 3.02 (to upgrade to Poppler), + // or outdated var converterVersionAvailable = converterVersion && (!converterIsRegistered || - Zotero.Fulltext.pdfConverterVersion == 'UNKNOWN' || - converterVersion > Zotero.Fulltext.pdfConverterVersion); + Zotero.Fulltext.pdfConverterVersion == 'UNKNOWN' + || (converterVersion != '3.02' && Zotero.Fulltext.pdfConverterVersion == '3.02') + || converterVersion > Zotero.Fulltext.pdfConverterVersion); var infoVersionAvailable = infoVersion && (!infoIsRegistered || - Zotero.Fulltext.pdfInfoVersion == 'UNKNOWN' || - infoVersion > Zotero.Fulltext.pdfInfoVersion); + Zotero.Fulltext.pdfInfoVersion == 'UNKNOWN' + || (infoVersion != '3.02' && Zotero.Fulltext.pdfInfoVersion == '3.02') + || infoVersion > Zotero.Fulltext.pdfInfoVersion); var bothAvailable = converterVersionAvailable && infoVersionAvailable; /* @@ -246,7 +250,44 @@ Zotero_Preferences.Search = { info: infoVersionAvailable ? infoVersion : null }; - self.installPDFTools(installVersions); + + document.getElementById('pdftools-update-button').disabled = true; + var str = Zotero.getString('zotero.preferences.search.pdf.downloading'); + document.getElementById('pdftools-update-button').setAttribute('label', str); + + if (converterVersionAvailable && infoVersionAvailable) { + Zotero.Fulltext.downloadPDFTool('converter', converterVersion, function (success) { + if (!success) { + self.onPDFToolsDownloadError("Error downloading pdftotext"); + return; + } + Zotero.Fulltext.downloadPDFTool('info', infoVersion, function (success) { + if (!success) { + self.onPDFToolsDownloadError("Error downloading pdfinfo"); + return; + } + self.updatePDFToolsStatus(); + }); + }); + } + else if (converterVersionAvailable) { + Zotero.Fulltext.downloadPDFTool('converter', converterVersion, function (success) { + if (!success) { + self.onPDFToolsDownloadError("Error downloading pdftotext"); + return; + } + self.updatePDFToolsStatus(); + }); + } + else { + Zotero.Fulltext.downloadPDFTool('info', infoVersion, function (success) { + if (!success) { + self.onPDFToolsDownloadError("Error downloading pdfinfo"); + return; + } + self.updatePDFToolsStatus(); + }); + } } } } @@ -267,135 +308,6 @@ Zotero_Preferences.Search = { }, - /* - * Begin installation of specified PDF tools from server -- does a HEAD call to - * make sure file exists and then calls downloadPDFTool() if so - */ - installPDFTools: function (installVersions) { - if (!installVersions) { - installVersions = { - converter: true, - info: true - }; - } - - // We install the converter first if it's available - var url = Zotero.Fulltext.pdfToolsDownloadBaseURL; - if (installVersions.converter) { - var tool = 'converter'; - var version = installVersions.converter; - url += Zotero.Fulltext.pdfConverterFileName + '-' + installVersions.converter; - } - else if (installVersions.info) { - var tool = 'info'; - var version = installVersions.info; - url += Zotero.Fulltext.pdfInfoFileName + '-' + installVersions.info; - } - else { - return; - } - - // Find latest version for this platform - var self = this; - var sent = Zotero.HTTP.doHead(url, function (xmlhttp) { - try { - if (xmlhttp.status == 200) { - // If doing both and on converter, chain pdfinfo - if (installVersions.converter && installVersions.info) { - self.downloadPDFTool(tool, version, function () { - return self.installPDFTools({ info: installVersions.info }); - }); - } - else { - self.downloadPDFTool(tool, version); - } - } - // Version not found for platform - else if (xmlhttp.status == 404) { - self.onPDFToolsDownloadError(404); - } - } - catch (e) { - self.onPDFToolsDownloadError(e); - } - }); - - // Browser is offline - if (!sent) { - self.onPDFToolsDownloadError(); - } - }, - - - /* - * Download and install specified PDF tool - */ - downloadPDFTool: function (tool, version, callback) { - var ioService = Components.classes["@mozilla.org/network/io-service;1"] - .getService(Components.interfaces.nsIIOService); - - if (tool == 'converter') { - var fileName = Zotero.Fulltext.pdfConverterFileName; - } - else { - var fileName = Zotero.Fulltext.pdfInfoFileName; - } - - - var url = Zotero.Fulltext.pdfToolsDownloadBaseURL + fileName + '-' + version; - var uri = ioService.newURI(url, null, null); - - var file = Zotero.getZoteroDirectory(); - file.append(fileName); - var fileURL = ioService.newFileURI(file); - - const nsIWBP = Components.interfaces.nsIWebBrowserPersist; - var wbp = Components.classes["@mozilla.org/embedding/browser/nsWebBrowserPersist;1"] - .createInstance(nsIWBP); - - var self = this; - var progressListener = new Zotero.WebProgressFinishListener(function () { - // Set permissions to 755 - if (Zotero.isMac) { - file.permissions = 33261; - } - else if (Zotero.isLinux) { - file.permissions = 493; - } - - // Write the version number to a file - var versionFile = Zotero.getZoteroDirectory(); - versionFile.append(fileName + '.version'); - Zotero.File.putContents(versionFile, version + ''); - - Zotero.Fulltext.registerPDFTool(tool); - - // Used to install info tool after converter - if (callback) { - callback(); - } - // If done - else { - self.updatePDFToolsStatus(); - } - }); - - /* - var tr = Components.classes["@mozilla.org/transfer;1"]. - createInstance(Components.interfaces.nsITransfer); - tr.init(uri, fileURL, "", null, null, null, wbp); - */ - - document.getElementById('pdftools-update-button').disabled = true; - var str = Zotero.getString('zotero.preferences.search.pdf.downloading'); - document.getElementById('pdftools-update-button').setAttribute('label', str); - - wbp.progressListener = progressListener; - Zotero.debug("Saving " + uri.spec + " to " + fileURL.spec); - Zotero.Utilities.Internal.saveURI(wbp, uri, fileURL); - }, - - onPDFToolsDownloadError: function (e) { if (e == 404) { var str = Zotero.getString('zotero.preferences.search.pdf.toolDownloadsNotAvailable', diff --git a/chrome/content/zotero/xpcom/fulltext.js b/chrome/content/zotero/xpcom/fulltext.js index 7be7f087a..ea1d5b359 100644 --- a/chrome/content/zotero/xpcom/fulltext.js +++ b/chrome/content/zotero/xpcom/fulltext.js @@ -164,6 +164,78 @@ Zotero.Fulltext = new function(){ } + /* + * Download and install latest PDF tool + */ + this.downloadPDFTool = function (tool, version, callback) { + try { + var ioService = Components.classes["@mozilla.org/network/io-service;1"] + .getService(Components.interfaces.nsIIOService); + + if (tool == 'converter') { + var fileName = this.pdfConverterFileName; + } + else { + var fileName = this.pdfInfoFileName; + } + + var spec = this.pdfToolsDownloadBaseURL + fileName + '-' + version; + var uri = ioService.newURI(spec, null, null); + + var file = Zotero.getTempDirectory(); + file.append(fileName); + + Components.utils.import("resource://gre/modules/NetUtil.jsm"); + Components.utils.import("resource://gre/modules/FileUtils.jsm"); + + Zotero.debug("Saving " + uri.spec + " to " + file.path); + var output = FileUtils.openSafeFileOutputStream(file); + NetUtil.asyncFetch(uri, function (is, status) { + if (!Components.isSuccessCode(status)) { + Zotero.debug(status, 1); + Components.utils.reportError(status); + if (callback) { + callback(false); + } + return; + } + + Zotero.File.putContentsAsync(file, is) + .then(function () { + // Set permissions to 755 + if (Zotero.isMac) { + file.permissions = 33261; + } + else if (Zotero.isLinux) { + file.permissions = 493; + } + + var destDir = Zotero.getZoteroDirectory() + file.moveTo(destDir, null); + + // Write the version number to a file + var versionFile = destDir.clone(); + versionFile.append(fileName + '.version'); + Zotero.File.putContents(versionFile, version + ''); + + Zotero.Fulltext.registerPDFTool(tool); + + if (callback) { + callback(true); + } + }); + }); + } + catch (e) { + Zotero.debug(e, 1); + Components.utils.reportError(e); + if (callback) { + callback(false); + } + } + }; + + /* * Looks for pdftotext-{platform}[.exe] in the Zotero data directory * diff --git a/chrome/content/zotero/xpcom/schema.js b/chrome/content/zotero/xpcom/schema.js index b46a0bfc0..8376e733d 100644 --- a/chrome/content/zotero/xpcom/schema.js +++ b/chrome/content/zotero/xpcom/schema.js @@ -1589,6 +1589,78 @@ Zotero.Schema = new function(){ var translatorUpdates = xmlhttp.responseXML.getElementsByTagName('translator'); var styleUpdates = xmlhttp.responseXML.getElementsByTagName('style'); + var updatePDFTools = function () { + let pdfToolsUpdates = xmlhttp.responseXML.getElementsByTagName('pdftools'); + if (pdfToolsUpdates.length) { + let availableVersion = pdfToolsUpdates[0].getAttribute('version'); + let installInfo = false; + let installConverter = false; + + // Don't auto-install if not installed + if (!Zotero.Fulltext.pdfInfoIsRegistered() && !Zotero.Fulltext.pdfConverterIsRegistered()) { + return; + } + + if (Zotero.Fulltext.pdfInfoIsRegistered()) { + let currentVersion = Zotero.Fulltext.pdfInfoVersion; + if (currentVersion < availableVersion || currentVersion == '3.02' + || currentVersion == 'UNKNOWN') { + installInfo = true; + } + } + if (Zotero.Fulltext.pdfConverterIsRegistered()) { + let currentVersion = Zotero.Fulltext.pdfConverterVersion; + if (currentVersion < availableVersion || currentVersion == '3.02' + || currentVersion == 'UNKNOWN') { + installConverter = true; + } + } + + let prefKey = 'pdfToolsInstallError'; + let lastTry = 0, delay = 43200000; // half a day, so doubles to a day initially + try { + [lastTry, delay] = Zotero.Prefs.get(prefKey).split(';'); + } + catch (e) {} + + // Allow an additional minute, since repo updates might not be exact + if (Date.now() < (parseInt(lastTry) + parseInt(delay) - 60000)) { + Zotero.debug("Now enough time since last PDF tools installation failure -- skipping", 2); + return; + } + + var checkResult = function (success) { + if (success) { + try { + Zotero.Prefs.clear(prefKey); + } + catch (e) {} + } + else { + // Keep doubling delay, to a max of 1 week + Zotero.Prefs.set(prefKey, Date.now() + ";" + Math.min(delay * 2, 7*24*60*60*1000)); + + let msg = "Error downloading PDF tool"; + Zotero.debug(msg, 1); + throw new Error(msg); + } + }; + + if (installConverter && installInfo) { + Zotero.Fulltext.downloadPDFTool('converter', availableVersion, function (success) { + checkResult(success); + Zotero.Fulltext.downloadPDFTool('info', availableVersion, checkResult); + }); + } + else if (installConverter) { + Zotero.Fulltext.downloadPDFTool('converter', availableVersion, checkResult); + } + else { + Zotero.Fulltext.downloadPDFTool('info', availableVersion, checkResult); + } + } + }; + Zotero.DB.beginTransaction(); // TODO: clear DB version 'sync' from removed _updateDBVersion() @@ -1609,6 +1681,11 @@ Zotero.Schema = new function(){ _setRepositoryTimer(ZOTERO_CONFIG['REPOSITORY_CHECK_INTERVAL']); } _remoteUpdateInProgress = false; + + setTimeout(function () { + updatePDFTools(); + }); + return -1; } @@ -1640,6 +1717,11 @@ Zotero.Schema = new function(){ _setRepositoryTimer(ZOTERO_CONFIG['REPOSITORY_CHECK_INTERVAL']); } _remoteUpdateInProgress = false; + + setTimeout(function () { + updatePDFTools(); + }); + return true; } From aab21f68ad8e15556ea6bff050919c8445ffe500 Mon Sep 17 00:00:00 2001 From: Dan Stillman <dstillman@zotero.org> Date: Sun, 29 Mar 2015 15:22:07 -0400 Subject: [PATCH 14/44] Blacklist "bad script XDR magic number" message --- chrome/content/zotero/xpcom/zotero.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/chrome/content/zotero/xpcom/zotero.js b/chrome/content/zotero/xpcom/zotero.js index 431fdd5aa..f352a0af4 100644 --- a/chrome/content/zotero/xpcom/zotero.js +++ b/chrome/content/zotero/xpcom/zotero.js @@ -2083,7 +2083,8 @@ Components.utils.import("resource://gre/modules/Services.jsm"); 'nsLivemarkService.js', 'Sync.Engine.Tabs', 'content-sessionStore.js', - 'org.mozilla.appSessions' + 'org.mozilla.appSessions', + 'bad script XDR magic number' ]; for (var i=0; i<blacklist.length; i++) { From e1c1803ce2307e1a8da88a6856cad75303a07574 Mon Sep 17 00:00:00 2001 From: Dan Stillman <dstillman@zotero.org> Date: Mon, 30 Mar 2015 14:45:53 -0400 Subject: [PATCH 15/44] Add DB version info to newer-DB-version error --- chrome/content/zotero/xpcom/schema.js | 3 ++- chrome/content/zotero/xpcom/zotero.js | 14 +++++++------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/chrome/content/zotero/xpcom/schema.js b/chrome/content/zotero/xpcom/schema.js index 8376e733d..1ea3154b3 100644 --- a/chrome/content/zotero/xpcom/schema.js +++ b/chrome/content/zotero/xpcom/schema.js @@ -1899,7 +1899,8 @@ Zotero.Schema = new function(){ return false; } else if (fromVersion > toVersion) { - throw("Zotero user data DB version is newer than SQL file"); + throw new Error("Zotero user data DB version is newer than SQL file " + + "(" + toVersion + " < " + fromVersion + ")"); } Zotero.debug('Updating user data tables from version ' + fromVersion + ' to ' + toVersion); diff --git a/chrome/content/zotero/xpcom/zotero.js b/chrome/content/zotero/xpcom/zotero.js index f352a0af4..799156335 100644 --- a/chrome/content/zotero/xpcom/zotero.js +++ b/chrome/content/zotero/xpcom/zotero.js @@ -608,13 +608,13 @@ Components.utils.import("resource://gre/modules/Services.jsm"); var updated = Zotero.Schema.updateSchema(); } catch (e) { - if (typeof e == 'string' && e.match('newer than SQL file')) { - var kbURL = "http://zotero.org/support/kb/newer_db_version"; - var msg = Zotero.localeJoin([ - Zotero.getString('startupError.zoteroVersionIsOlder'), - Zotero.getString('startupError.zoteroVersionIsOlder.upgrade') - ]) + "\n\n" - + Zotero.getString('startupError.zoteroVersionIsOlder.current', Zotero.version) + "\n\n" + if (e.toString().match('newer than SQL file')) { + let versions = e.toString().match(/\((\d+) < \d+\)/); + let kbURL = "https://www.zotero.org/support/kb/newer_db_version"; + let msg = Zotero.getString('startupError.zoteroVersionIsOlder') + " " + + Zotero.getString('startupError.zoteroVersionIsOlder.upgrade') + "\n\n" + + Zotero.getString('startupError.zoteroVersionIsOlder.current', Zotero.version) + "\n" + + (versions ? "DB: " + versions[1] + "\n\n" : "\n") + Zotero.getString('general.seeForMoreInformation', kbURL); Zotero.startupError = msg; _startupErrorHandler = function() { From cc173ff1e51a4009bf5646354d6a36078e731d1c Mon Sep 17 00:00:00 2001 From: Aurimas Vinckevicius <aurimas.dev@gmail.com> Date: Mon, 30 Mar 2015 16:28:12 -0500 Subject: [PATCH 16/44] Trim down ISSN/ISBN test for characters that should not be ignored --- test/tests/utilities.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/tests/utilities.js b/test/tests/utilities.js index e21aa6b9a..a779b1a9b 100644 --- a/test/tests/utilities.js +++ b/test/tests/utilities.js @@ -46,7 +46,7 @@ describe("Zotero.Utilities", function() { assert.equal(cleanISBN('9781' + ignoredChars + '234567897'), '9781234567897', 'stripped off all ignored characters'); let isbnChars = ignoredChars + '1234567890'; - for (let i=1; i<65536; i++) { + for (let i=1; i<1327; i++) { // More common characters through Cyrillic letters let c = String.fromCharCode(i); if (isbnChars.indexOf(c) != -1) continue; @@ -143,7 +143,7 @@ describe("Zotero.Utilities", function() { assert.equal(cleanISSN('1' + ignoredChars + '2345679'), '1234-5679', 'stripped off all ignored characters'); let isbnChars = ignoredChars + '1234567890'; - for (let i=1; i<65536; i++) { + for (let i=1; i<1327; i++) { // More common characters through Cyrillic letters let c = String.fromCharCode(i); if (isbnChars.indexOf(c) != -1) continue; From c05025f4b18b5fe3cfcff2c357941441f423465b Mon Sep 17 00:00:00 2001 From: Aurimas Vinckevicius <aurimas.dev@gmail.com> Date: Tue, 31 Mar 2015 13:30:05 -0500 Subject: [PATCH 17/44] Log translatorID and lastUpdated timestamp when parsing translators --- chrome/content/zotero/xpcom/translation/translate.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/chrome/content/zotero/xpcom/translation/translate.js b/chrome/content/zotero/xpcom/translation/translate.js index 0608d549f..78e18b3ac 100644 --- a/chrome/content/zotero/xpcom/translation/translate.js +++ b/chrome/content/zotero/xpcom/translation/translate.js @@ -1528,7 +1528,8 @@ Zotero.Translate.Base.prototype = { this._aborted = false; this.saveQueue = []; - Zotero.debug("Translate: Parsing code for "+translator.label, 4); + Zotero.debug("Translate: Parsing code for " + translator.label + " " + + "(" + translator.translatorID + ", " + translator.lastUpdated + ")", 4); try { this._sandboxManager.eval("var exports = {}, ZOTERO_TRANSLATOR_INFO = "+translator.code, From 49a0b02b060b38a739c1ddab2bc41867d2eb4f67 Mon Sep 17 00:00:00 2001 From: Aurimas Vinckevicius <aurimas.dev@gmail.com> Date: Tue, 31 Mar 2015 13:40:43 -0500 Subject: [PATCH 18/44] Log a list of translators that were found during detect* --- chrome/content/zotero/xpcom/translation/translate.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/chrome/content/zotero/xpcom/translation/translate.js b/chrome/content/zotero/xpcom/translation/translate.js index 78e18b3ac..88027e9ab 100644 --- a/chrome/content/zotero/xpcom/translation/translate.js +++ b/chrome/content/zotero/xpcom/translation/translate.js @@ -1505,8 +1505,15 @@ Zotero.Translate.Base.prototype = { * Called when all translators have been collected for detection */ "_detectTranslatorsCollected":function() { - Zotero.debug("Translate: All translator detect calls and RPC calls complete"); + Zotero.debug("Translate: All translator detect calls and RPC calls complete:"); this._foundTranslators.sort(function(a, b) { return a.priority-b.priority }); + if (this._foundTranslators.length) { + this._foundTranslators.forEach(function(t) { + Zotero.debug("\t" + t.label + ": " + t.priority); + }); + } else { + Zotero.debug("\tNo suitable translators found"); + } this._runHandler("translators", this._foundTranslators); }, From a9ca6e0857928d8d2fe9de451567e5ff3027f64d Mon Sep 17 00:00:00 2001 From: Dan Stillman <dstillman@zotero.org> Date: Wed, 1 Apr 2015 02:03:57 -0400 Subject: [PATCH 19/44] Support unmodified Xpdf binaries Use stdout redirection scripts for pdfinfo and, on Windows, a script to run pdftotext hidden, which together allow for all unmodified binaries (including, probably, symlinked system ones, though I didn't test that). On Windows, using a .vbs does cause a brief wait cursor. The stock pdfinfo needs the redirection script anyway, so that's unavoidable, but on the async branch I think we'll be able to switch to pdf.js for the page count, at which point maybe I'll try to remember how I modified the Windows binaries to be hidden and use a modified version of pdftotext to avoid VBScript. (We use the stock pdftotext elsewhere already.) --- .../zotero/preferences/preferences_search.js | 212 ++++++++---------- chrome/content/zotero/xpcom/fulltext.js | 122 ++++++++-- chrome/content/zotero/xpcom/schema.js | 3 + resource/hide.vbs | 24 ++ resource/redirect.sh | 6 + resource/redirect.vbs | 33 +++ 6 files changed, 267 insertions(+), 133 deletions(-) create mode 100644 resource/hide.vbs create mode 100644 resource/redirect.sh create mode 100644 resource/redirect.vbs diff --git a/chrome/content/zotero/preferences/preferences_search.js b/chrome/content/zotero/preferences/preferences_search.js index 591cec7ac..6dfe00021 100644 --- a/chrome/content/zotero/preferences/preferences_search.js +++ b/chrome/content/zotero/preferences/preferences_search.js @@ -162,139 +162,121 @@ Zotero_Preferences.Search = { * if a newer version is available */ checkPDFToolsDownloadVersion: function () { - var url = Zotero.Fulltext.pdfToolsDownloadBaseURL - + Zotero.platform.replace(' ', '-') + '.latest'; + var url = Zotero.Fulltext.pdfToolsDownloadBaseURL + 'latest.json'; // Find latest version for this platform var self = this; var sent = Zotero.HTTP.doGet(url, function (xmlhttp) { try { - if (xmlhttp.status == 200) { - var converterIsRegistered = Zotero.Fulltext.pdfConverterIsRegistered(); - var infoIsRegistered = Zotero.Fulltext.pdfInfoIsRegistered(); - var bothRegistered = converterIsRegistered && infoIsRegistered; + if (xmlhttp.status != 200) { + throw new Error("Unexpected response code " + xmlhttp.status); + } + + var platform = Zotero.platform.replace(/\s/g, '-'); + var json = JSON.parse(xmlhttp.responseText); + var latestVersion = json[platform] || json['default']; + + Zotero.debug("Latest PDF tools version for " + platform + " is " + latestVersion); + + var converterIsRegistered = Zotero.Fulltext.pdfConverterIsRegistered(); + var infoIsRegistered = Zotero.Fulltext.pdfInfoIsRegistered(); + var bothRegistered = converterIsRegistered && infoIsRegistered; + + // Install if not installed, version unknown, outdated, or + // Xpdf 3.02/3.04 (to upgrade to Poppler), + var converterVersionAvailable = (!converterIsRegistered || + Zotero.Fulltext.pdfConverterVersion == 'UNKNOWN' + || latestVersion > Zotero.Fulltext.pdfConverterVersion + || (latestVersion != '3.02' && Zotero.Fulltext.pdfConverterVersion == '3.02') + || (latestVersion != '3.02' && latestVersion != '3.04' && Zotero.Fulltext.pdfConverterVersion == '3.04')); + var infoVersionAvailable = (!infoIsRegistered || + Zotero.Fulltext.pdfInfoVersion == 'UNKNOWN' + || latestVersion > Zotero.Fulltext.pdfInfoVersion + || (latestVersion != '3.02' && Zotero.Fulltext.pdfInfoVersion == '3.02') + || (latestVersion != '3.02' && latestVersion != '3.04' && Zotero.Fulltext.pdfInfoVersion == '3.04')); + var bothAvailable = converterVersionAvailable && infoVersionAvailable; + + // Up to date -- disable update button + if (!converterVersionAvailable && !infoVersionAvailable) { + var button = document.getElementById('pdftools-update-button'); + button.setAttribute('label', Zotero.getString('zotero.preferences.update.upToDate')); + button.setAttribute('disabled', true); + } + // New version available -- display update prompt + else { + var ps = Components.classes["@mozilla.org/embedcomp/prompt-service;1"]. + createInstance(Components.interfaces.nsIPromptService); + var buttonFlags = (ps.BUTTON_POS_0) * (ps.BUTTON_TITLE_IS_STRING) + + (ps.BUTTON_POS_1) * (ps.BUTTON_TITLE_CANCEL); - var converterVersion = xmlhttp.responseText.split(/\s/)[0]; - var infoVersion = xmlhttp.responseText.split(/\s/)[1]; + var msg = Zotero.getString('zotero.preferences.search.pdf.available' + + ((converterIsRegistered || infoIsRegistered) ? 'Updates' : 'Downloads'), + [Zotero.platform, 'zotero.org']) + '\n\n'; - // Install if not installed, version unknown, Xpdf 3.02 (to upgrade to Poppler), - // or outdated - var converterVersionAvailable = converterVersion && - (!converterIsRegistered || - Zotero.Fulltext.pdfConverterVersion == 'UNKNOWN' - || (converterVersion != '3.02' && Zotero.Fulltext.pdfConverterVersion == '3.02') - || converterVersion > Zotero.Fulltext.pdfConverterVersion); - var infoVersionAvailable = infoVersion && - (!infoIsRegistered || - Zotero.Fulltext.pdfInfoVersion == 'UNKNOWN' - || (infoVersion != '3.02' && Zotero.Fulltext.pdfInfoVersion == '3.02') - || infoVersion > Zotero.Fulltext.pdfInfoVersion); - var bothAvailable = converterVersionAvailable && infoVersionAvailable; - - /* - Zotero.debug(converterIsRegistered); - Zotero.debug(infoIsRegistered); - Zotero.debug(converterVersion); - Zotero.debug(infoVersion); - Zotero.debug(Zotero.Fulltext.pdfConverterVersion); - Zotero.debug(Zotero.Fulltext.pdfInfoVersion); - Zotero.debug(converterVersionAvailable); - Zotero.debug(infoVersionAvailable); - */ - - // Up to date -- disable update button - if (!converterVersionAvailable && !infoVersionAvailable) { - var button = document.getElementById('pdftools-update-button'); - button.setAttribute('label', Zotero.getString('zotero.preferences.update.upToDate')); - button.setAttribute('disabled', true); + if (converterVersionAvailable) { + let tvp = Zotero.getString('zotero.preferences.search.pdf.toolVersionPlatform', + [Zotero.Fulltext.pdfConverterName, latestVersion]); + msg += '- ' + tvp + '\n'; } - // New version available -- display update prompt - else { - var ps = Components.classes["@mozilla.org/embedcomp/prompt-service;1"]. - createInstance(Components.interfaces.nsIPromptService); - var buttonFlags = (ps.BUTTON_POS_0) * (ps.BUTTON_TITLE_IS_STRING) - + (ps.BUTTON_POS_1) * (ps.BUTTON_TITLE_CANCEL); + if (infoVersionAvailable) { + let tvp = Zotero.getString('zotero.preferences.search.pdf.toolVersionPlatform', + [Zotero.Fulltext.pdfInfoName, latestVersion]); + msg += '- ' + tvp + '\n'; + } + msg += '\n'; + msg += Zotero.getString('zotero.preferences.search.pdf.zoteroCanInstallVersion' + + (bothAvailable ? 's' : '')); + + var index = ps.confirmEx(null, + converterIsRegistered ? + Zotero.getString('general.updateAvailable') : '', + msg, + buttonFlags, + converterIsRegistered ? + Zotero.getString('general.upgrade') : + Zotero.getString('general.install'), + null, null, null, {}); + + if (index == 0) { + document.getElementById('pdftools-update-button').disabled = true; + var str = Zotero.getString('zotero.preferences.search.pdf.downloading'); + document.getElementById('pdftools-update-button').setAttribute('label', str); - var msg = Zotero.getString('zotero.preferences.search.pdf.available' - + ((converterIsRegistered || infoIsRegistered) ? 'Updates' : 'Downloads'), - [Zotero.platform, 'zotero.org']) + '\n\n'; - - if (converterVersionAvailable) { - let tvp = Zotero.getString('zotero.preferences.search.pdf.toolVersionPlatform', - [Zotero.Fulltext.pdfConverterName, converterVersion]); - msg += '- ' + tvp + '\n'; - } - if (infoVersionAvailable) { - let tvp = Zotero.getString('zotero.preferences.search.pdf.toolVersionPlatform', - [Zotero.Fulltext.pdfInfoName, infoVersion]); - msg += '- ' + tvp + '\n'; - } - msg += '\n'; - msg += Zotero.getString('zotero.preferences.search.pdf.zoteroCanInstallVersion' - + (bothAvailable ? 's' : '')); - - var index = ps.confirmEx(null, - converterIsRegistered ? - Zotero.getString('general.updateAvailable') : '', - msg, - buttonFlags, - converterIsRegistered ? - Zotero.getString('general.upgrade') : - Zotero.getString('general.install'), - null, null, null, {}); - - if (index == 0) { - var installVersions = { - converter: converterVersionAvailable ? - converterVersion : null, - info: infoVersionAvailable ? - infoVersion : null - }; - - document.getElementById('pdftools-update-button').disabled = true; - var str = Zotero.getString('zotero.preferences.search.pdf.downloading'); - document.getElementById('pdftools-update-button').setAttribute('label', str); - - if (converterVersionAvailable && infoVersionAvailable) { - Zotero.Fulltext.downloadPDFTool('converter', converterVersion, function (success) { - if (!success) { - self.onPDFToolsDownloadError("Error downloading pdftotext"); - return; - } - Zotero.Fulltext.downloadPDFTool('info', infoVersion, function (success) { - if (!success) { - self.onPDFToolsDownloadError("Error downloading pdfinfo"); - return; - } - self.updatePDFToolsStatus(); - }); - }); - } - else if (converterVersionAvailable) { - Zotero.Fulltext.downloadPDFTool('converter', converterVersion, function (success) { - if (!success) { - self.onPDFToolsDownloadError("Error downloading pdftotext"); - return; - } - self.updatePDFToolsStatus(); - }); - } - else { - Zotero.Fulltext.downloadPDFTool('info', infoVersion, function (success) { + if (converterVersionAvailable && infoVersionAvailable) { + Zotero.Fulltext.downloadPDFTool('converter', latestVersion, function (success) { + if (!success) { + self.onPDFToolsDownloadError("Error downloading pdftotext"); + return; + } + Zotero.Fulltext.downloadPDFTool('info', latestVersion, function (success) { if (!success) { self.onPDFToolsDownloadError("Error downloading pdfinfo"); return; } self.updatePDFToolsStatus(); }); - } + }); + } + else if (converterVersionAvailable) { + Zotero.Fulltext.downloadPDFTool('converter', latestVersion, function (success) { + if (!success) { + self.onPDFToolsDownloadError("Error downloading pdftotext"); + return; + } + self.updatePDFToolsStatus(); + }); + } + else { + Zotero.Fulltext.downloadPDFTool('info', latestVersion, function (success) { + if (!success) { + self.onPDFToolsDownloadError("Error downloading pdfinfo"); + return; + } + self.updatePDFToolsStatus(); + }); } } } - // Version not found for platform - else if (xmlhttp.status == 404) { - self.onPDFToolsDownloadError(404); - } } catch (e) { self.onPDFToolsDownloadError(e); diff --git a/chrome/content/zotero/xpcom/fulltext.js b/chrome/content/zotero/xpcom/fulltext.js index ea1d5b359..ee433cb8a 100644 --- a/chrome/content/zotero/xpcom/fulltext.js +++ b/chrome/content/zotero/xpcom/fulltext.js @@ -55,7 +55,7 @@ Zotero.Fulltext = new function(){ //this.clearItemContent = clearItemContent; this.purgeUnusedWords = purgeUnusedWords; - this.__defineGetter__("pdfToolsDownloadBaseURL", function() { return 'http://www.zotero.org/download/xpdf/'; }); + this.__defineGetter__("pdfToolsDownloadBaseURL", function() { return 'https://www.zotero.org/download/xpdf/'; }); this.__defineGetter__("pdfToolsName", function() { return 'Xpdf'; }); this.__defineGetter__("pdfToolsURL", function() { return 'http://www.foolabs.com/xpdf/'; }); this.__defineGetter__("pdfConverterName", function() { return 'pdftotext'; }); @@ -82,9 +82,11 @@ Zotero.Fulltext = new function(){ var _pdfConverterVersion = null; var _pdfConverterFileName = null; + var _pdfConverterScript = null; // nsIFile of hidden window script on Windows var _pdfConverter = null; // nsIFile to executable var _pdfInfoVersion = null; var _pdfInfoFileName = null; + var _pdfInfoScript = null; // nsIFile of redirection script var _pdfInfo = null; // nsIFile to executable var _idleObserverIsRegistered = false; @@ -179,7 +181,7 @@ Zotero.Fulltext = new function(){ var fileName = this.pdfInfoFileName; } - var spec = this.pdfToolsDownloadBaseURL + fileName + '-' + version; + var spec = this.pdfToolsDownloadBaseURL + version + "/" + fileName; var uri = ioService.newURI(spec, null, null); var file = Zotero.getTempDirectory(); @@ -202,15 +204,43 @@ Zotero.Fulltext = new function(){ Zotero.File.putContentsAsync(file, is) .then(function () { + var scriptExt = _getScriptExtension(); + // On Windows, write out script to hide pdftotext console window + if (tool == 'converter') { + if (Zotero.isWin) { + var content = Zotero.File.getContentsFromURL('resource://zotero/hide.' + scriptExt); + var scriptFile = Zotero.getTempDirectory(); + scriptFile.append('pdftotext.' + scriptExt); + Zotero.File.putContents(scriptFile, content); + } + } + // Write out output redirection script for pdfinfo + else if (tool == 'info') { + var content = Zotero.File.getContentsFromURL('resource://zotero/redirect.' + scriptExt); + var scriptFile = Zotero.getTempDirectory(); + scriptFile.append('pdfinfo.' + scriptExt); + Zotero.File.putContents(scriptFile, content); + } + // Set permissions to 755 if (Zotero.isMac) { file.permissions = 33261; + if (scriptFile) { + scriptFile.permissions = 33261; + } } else if (Zotero.isLinux) { file.permissions = 493; + if (scriptFile) { + scriptFile.permissions = 493; + } } var destDir = Zotero.getZoteroDirectory() + // Move redirect script and executable into data dir + if (scriptFile) { + scriptFile.moveTo(destDir, null); + } file.moveTo(destDir, null); // Write the version number to a file @@ -223,6 +253,11 @@ Zotero.Fulltext = new function(){ if (callback) { callback(true); } + }) + .catch(function (e) { + Zotero.debug(e, 1); + Components.utils.reportError(e); + callback(false); }); }); } @@ -274,10 +309,42 @@ Zotero.Fulltext = new function(){ return false; } + // If scripts exist, use those instead + switch (tool) { + case 'converter': + if (Zotero.isWin) { + var script = Zotero.getZoteroDirectory(); + script.append('pdftotext.' + _getScriptExtension()) + if (script.exists()) { + Zotero.debug(script.leafName + " registered"); + _pdfConverterScript = script; + } + } + break; + + case 'info': + var script = Zotero.getZoteroDirectory(); + script.append('pdfinfo.' + _getScriptExtension()) + // The redirection script is necessary to run pdfinfo + if (!script.exists()) { + Zotero.debug(script.leafName + " not found -- PDF statistics disabled"); + return false; + } + Zotero.debug(toolName + " redirection script registered"); + _pdfInfoScript = script; + break; + } + var versionFile = exec.parent; versionFile.append(fileName + '.version'); if (versionFile.exists()) { - var version = Zotero.File.getSample(versionFile).split(/[\r\n\s]/)[0]; + try { + var version = Zotero.File.getSample(versionFile).split(/[\r\n\s]/)[0]; + } + catch (e) { + Zotero.debug(e, 1); + Components.utils.reportError(e); + } } if (!version) { var version = 'UNKNOWN'; @@ -295,7 +362,7 @@ Zotero.Fulltext = new function(){ break; } - Zotero.debug(toolName + ' version ' + version + ' registered at ' + exec.path); + Zotero.debug(toolName + ' version ' + version + ' registered'); return true; } @@ -529,16 +596,19 @@ Zotero.Fulltext = new function(){ } cacheFile.append(this.pdfConverterCacheFile); - if (_pdfInfo) { + if (_pdfInfoScript) { var infoFile = cacheFile.parent; infoFile.append(this.pdfInfoCacheFile); - Zotero.debug('Running pdfinfo "' + file.path + '" "' + infoFile.path + '"'); - var proc = Components.classes["@mozilla.org/process/util;1"]. - createInstance(Components.interfaces.nsIProcess); - proc.init(_pdfInfo); + var args = [_pdfInfo.path, file.path, infoFile.path]; + + Zotero.debug("Running " + _pdfInfoScript.path + ' ' + + args.map(arg => "'" + arg + "'").join(' ')); + + var proc = Components.classes["@mozilla.org/process/util;1"] + .createInstance(Components.interfaces.nsIProcess); + proc.init(_pdfInfoScript); - var args = [file.path, infoFile.path]; try { proc.runw(true, args, args.length); var totalPages = this.getTotalPagesFromFile(itemID); @@ -551,15 +621,12 @@ Zotero.Fulltext = new function(){ Zotero.debug(this.pdfInfoName + " is not available"); } - Zotero.debug('Running pdftotext -enc UTF-8 -nopgbrk ' - + (allPages ? '' : '-l ' + maxPages) + ' "' + file.path + '" "' - + cacheFile.path + '"'); + var args = [] + if (_pdfConverterScript) { + args.push(_pdfConverter.path); + } + args.push('-enc', 'UTF-8', '-nopgbrk'); - var proc = Components.classes["@mozilla.org/process/util;1"]. - createInstance(Components.interfaces.nsIProcess); - proc.init(_pdfConverter); - - var args = ['-enc', 'UTF-8', '-nopgbrk']; if (allPages) { if (totalPages) { var pagesIndexed = totalPages; @@ -570,6 +637,20 @@ Zotero.Fulltext = new function(){ var pagesIndexed = Math.min(maxPages, totalPages); } args.push(file.path, cacheFile.path); + + var proc = Components.classes["@mozilla.org/process/util;1"] + .createInstance(Components.interfaces.nsIProcess); + if (_pdfConverterScript) { + Zotero.debug("Running " + _pdfConverterScript.path + ' ' + + args.map(arg => "'" + arg + "'").join(' ')); + proc.init(_pdfConverterScript); + } + else { + Zotero.debug("Running " + _pdfConverter.path + ' ' + + args.map(arg => "'" + arg + "'").join(' ')); + proc.init(_pdfConverter); + } + try { proc.runw(true, args, args.length); } @@ -1679,4 +1760,9 @@ Zotero.Fulltext = new function(){ return w; }); } + + function _getScriptExtension() { + return Zotero.isWin ? 'vbs' : 'sh'; + } + } diff --git a/chrome/content/zotero/xpcom/schema.js b/chrome/content/zotero/xpcom/schema.js index 1ea3154b3..c512936e2 100644 --- a/chrome/content/zotero/xpcom/schema.js +++ b/chrome/content/zotero/xpcom/schema.js @@ -1590,6 +1590,9 @@ Zotero.Schema = new function(){ var styleUpdates = xmlhttp.responseXML.getElementsByTagName('style'); var updatePDFTools = function () { + // No updates for PPC + if (Zotero.platform == 'MacPPC') return; + let pdfToolsUpdates = xmlhttp.responseXML.getElementsByTagName('pdftools'); if (pdfToolsUpdates.length) { let availableVersion = pdfToolsUpdates[0].getAttribute('version'); diff --git a/resource/hide.vbs b/resource/hide.vbs new file mode 100644 index 000000000..9f233e2bd --- /dev/null +++ b/resource/hide.vbs @@ -0,0 +1,24 @@ +Option Explicit + +Dim WshShell, fso, exe, args, I + +Set WshShell = Wscript.CreateObject("Wscript.Shell") +Set fso = WScript.CreateObject("Scripting.FileSystemObject") + +If WScript.Arguments.Count = 0 Then + WScript.Echo "Usage: hidden.vbs program.exe [args...]" + WScript.Quit 1 +End If + +exe = WScript.Arguments(0) +If Not(fso.FileExists(exe)) Then + WScript.Echo "Executable not found: " & exe + WScript.Quit 1 +End If + +args = "" +For I = 1 to WScript.Arguments.Count - 1 + args = args & " " & chr(34) & WScript.Arguments(I) & chr(34) +Next + +WshShell.Run exe & args, 0, true diff --git a/resource/redirect.sh b/resource/redirect.sh new file mode 100644 index 000000000..05342e273 --- /dev/null +++ b/resource/redirect.sh @@ -0,0 +1,6 @@ +#!/bin/sh +if [ -z "$1" ] || [ -z "$2" ] || [ -z "$3" ]; then + echo "Usage: $0 cmd source output.txt" + exit 1 +fi +"$1" "$2" > "$3" diff --git a/resource/redirect.vbs b/resource/redirect.vbs new file mode 100644 index 000000000..4f1e7a3f2 --- /dev/null +++ b/resource/redirect.vbs @@ -0,0 +1,33 @@ +Option Explicit + +Dim WshShell +Dim fso +Dim exe, src, dest + +Set WshShell = Wscript.CreateObject("Wscript.Shell") +Set fso = WScript.CreateObject("Scripting.FileSystemObject") + +If Not(Wscript.Arguments.Count = 3) Then + Wscript.Echo "Usage: redirect.vbs <.exe file> <source file> <text file>" + WScript.Quit 1 +End If + +exe = WScript.Arguments(0) +src = WScript.Arguments(1) +dest = WScript.Arguments(2) +If Not(fso.FileExists(exe)) Then + WScript.Echo "Executable not found: " & exe + WScript.Quit 1 +End If + +If Not(fso.FileExists(src)) Then + WScript.Echo "Source file not found: " & src + WScript.Quit 1 +End If + +If Not(fso.FolderExists(Left(dest, InstrRev(dest, "\")))) Then + WScript.Echo "Destination folder not found: " & Left(dest, InstrRev(dest, "\")) + WScript.Quit 1 +End If + +WshShell.Run "%comspec% /c " & exe & " " & chr(34) & src & chr(34) & " > " & chr(34) & dest & chr(34), 0, true From 1a47d79716db73f114fa844a9caaa14227d35a85 Mon Sep 17 00:00:00 2001 From: Dan Stillman <dstillman@zotero.org> Date: Wed, 1 Apr 2015 13:20:34 -0400 Subject: [PATCH 20/44] Restore support for modified pdfinfo 3.02 --- chrome/content/zotero/xpcom/fulltext.js | 58 ++++++++++++++++++------- 1 file changed, 42 insertions(+), 16 deletions(-) diff --git a/chrome/content/zotero/xpcom/fulltext.js b/chrome/content/zotero/xpcom/fulltext.js index ee433cb8a..a58247b8c 100644 --- a/chrome/content/zotero/xpcom/fulltext.js +++ b/chrome/content/zotero/xpcom/fulltext.js @@ -309,6 +309,21 @@ Zotero.Fulltext = new function(){ return false; } + var versionFile = exec.parent; + versionFile.append(fileName + '.version'); + if (versionFile.exists()) { + try { + var version = Zotero.File.getSample(versionFile).split(/[\r\n\s]/)[0]; + } + catch (e) { + Zotero.debug(e, 1); + Components.utils.reportError(e); + } + } + if (!version) { + var version = 'UNKNOWN'; + } + // If scripts exist, use those instead switch (tool) { case 'converter': @@ -323,6 +338,9 @@ Zotero.Fulltext = new function(){ break; case 'info': + // Modified 3.02 version doesn't use redirection script + if (version == '3.02') break; + var script = Zotero.getZoteroDirectory(); script.append('pdfinfo.' + _getScriptExtension()) // The redirection script is necessary to run pdfinfo @@ -335,21 +353,6 @@ Zotero.Fulltext = new function(){ break; } - var versionFile = exec.parent; - versionFile.append(fileName + '.version'); - if (versionFile.exists()) { - try { - var version = Zotero.File.getSample(versionFile).split(/[\r\n\s]/)[0]; - } - catch (e) { - Zotero.debug(e, 1); - Components.utils.reportError(e); - } - } - if (!version) { - var version = 'UNKNOWN'; - } - switch (tool) { case 'converter': _pdfConverter = exec; @@ -596,7 +599,30 @@ Zotero.Fulltext = new function(){ } cacheFile.append(this.pdfConverterCacheFile); - if (_pdfInfoScript) { + // Modified 3.02 version that can output a text file directly + if (_pdfInfo && _pdfInfoVersion == '3.02') { + var infoFile = cacheFile.parent; + infoFile.append(this.pdfInfoCacheFile); + + var args = [file.path, infoFile.path]; + + Zotero.debug("Running " + _pdfInfo.path + ' ' + + args.map(arg => "'" + arg + "'").join(' ')); + + var proc = Components.classes["@mozilla.org/process/util;1"] + .createInstance(Components.interfaces.nsIProcess); + proc.init(_pdfInfo); + + try { + proc.runw(true, args, args.length); + var totalPages = this.getTotalPagesFromFile(itemID); + } + catch (e) { + Zotero.debug("Error running pdfinfo"); + } + } + // Use redirection script + else if (_pdfInfoScript) { var infoFile = cacheFile.parent; infoFile.append(this.pdfInfoCacheFile); From e567ad25aa1d32ede8f752f24dcbeaece905fedd Mon Sep 17 00:00:00 2001 From: Dan Stillman <dstillman@zotero.org> Date: Wed, 1 Apr 2015 16:23:12 -0400 Subject: [PATCH 21/44] More PDF tools tweaks - If one tool is missing, reinstall it automatically during translator update check - Account for pdfinfo 3.02pl1 on Linux --- .../content/zotero/preferences/preferences_search.js | 12 ++++++++---- chrome/content/zotero/xpcom/fulltext.js | 4 ++-- chrome/content/zotero/xpcom/schema.js | 12 ++++++++++-- 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/chrome/content/zotero/preferences/preferences_search.js b/chrome/content/zotero/preferences/preferences_search.js index 6dfe00021..51930fd72 100644 --- a/chrome/content/zotero/preferences/preferences_search.js +++ b/chrome/content/zotero/preferences/preferences_search.js @@ -187,13 +187,17 @@ Zotero_Preferences.Search = { var converterVersionAvailable = (!converterIsRegistered || Zotero.Fulltext.pdfConverterVersion == 'UNKNOWN' || latestVersion > Zotero.Fulltext.pdfConverterVersion - || (latestVersion != '3.02' && Zotero.Fulltext.pdfConverterVersion == '3.02') - || (latestVersion != '3.02' && latestVersion != '3.04' && Zotero.Fulltext.pdfConverterVersion == '3.04')); + || (!latestVersion.startsWith('3.02') + && Zotero.Fulltext.pdfConverterVersion.startsWith('3.02')) + || (!latestVersion.startsWith('3.02') && latestVersion != '3.04' + && Zotero.Fulltext.pdfConverterVersion == '3.04')); var infoVersionAvailable = (!infoIsRegistered || Zotero.Fulltext.pdfInfoVersion == 'UNKNOWN' || latestVersion > Zotero.Fulltext.pdfInfoVersion - || (latestVersion != '3.02' && Zotero.Fulltext.pdfInfoVersion == '3.02') - || (latestVersion != '3.02' && latestVersion != '3.04' && Zotero.Fulltext.pdfInfoVersion == '3.04')); + || (!latestVersion.startsWith('3.02') + && Zotero.Fulltext.pdfInfoVersion.startsWith('3.02')) + || (!latestVersion.startsWith('3.02') && latestVersion != '3.04' + && Zotero.Fulltext.pdfInfoVersion == '3.04')); var bothAvailable = converterVersionAvailable && infoVersionAvailable; // Up to date -- disable update button diff --git a/chrome/content/zotero/xpcom/fulltext.js b/chrome/content/zotero/xpcom/fulltext.js index a58247b8c..fc7976ecf 100644 --- a/chrome/content/zotero/xpcom/fulltext.js +++ b/chrome/content/zotero/xpcom/fulltext.js @@ -339,7 +339,7 @@ Zotero.Fulltext = new function(){ case 'info': // Modified 3.02 version doesn't use redirection script - if (version == '3.02') break; + if (version.startsWith('3.02')) break; var script = Zotero.getZoteroDirectory(); script.append('pdfinfo.' + _getScriptExtension()) @@ -600,7 +600,7 @@ Zotero.Fulltext = new function(){ cacheFile.append(this.pdfConverterCacheFile); // Modified 3.02 version that can output a text file directly - if (_pdfInfo && _pdfInfoVersion == '3.02') { + if (_pdfInfo && _pdfInfoVersion.startsWith('3.02')) { var infoFile = cacheFile.parent; infoFile.append(this.pdfInfoCacheFile); diff --git a/chrome/content/zotero/xpcom/schema.js b/chrome/content/zotero/xpcom/schema.js index c512936e2..a9917aea8 100644 --- a/chrome/content/zotero/xpcom/schema.js +++ b/chrome/content/zotero/xpcom/schema.js @@ -1606,18 +1606,26 @@ Zotero.Schema = new function(){ if (Zotero.Fulltext.pdfInfoIsRegistered()) { let currentVersion = Zotero.Fulltext.pdfInfoVersion; - if (currentVersion < availableVersion || currentVersion == '3.02' + if (currentVersion < availableVersion || currentVersion.startsWith('3.02') || currentVersion == 'UNKNOWN') { installInfo = true; } } + // Install missing component if one is installed + else if (Zotero.Fulltext.pdfConverterIsRegistered()) { + installInfo = true; + } if (Zotero.Fulltext.pdfConverterIsRegistered()) { let currentVersion = Zotero.Fulltext.pdfConverterVersion; - if (currentVersion < availableVersion || currentVersion == '3.02' + if (currentVersion < availableVersion || currentVersion.startsWith('3.02') || currentVersion == 'UNKNOWN') { installConverter = true; } } + // Install missing component if one is installed + else if (Zotero.Fulltext.pdfInfoIsRegistered()) { + installConverter = true; + } let prefKey = 'pdfToolsInstallError'; let lastTry = 0, delay = 43200000; // half a day, so doubles to a day initially From 4613f9593c340dc65b23b28ca247e5116c520419 Mon Sep 17 00:00:00 2001 From: Dan Stillman <dstillman@zotero.org> Date: Wed, 1 Apr 2015 16:43:37 -0400 Subject: [PATCH 22/44] Don't update pdfinfo unnecesarily --- chrome/content/zotero/xpcom/schema.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/chrome/content/zotero/xpcom/schema.js b/chrome/content/zotero/xpcom/schema.js index a9917aea8..1ec995ecc 100644 --- a/chrome/content/zotero/xpcom/schema.js +++ b/chrome/content/zotero/xpcom/schema.js @@ -1666,9 +1666,12 @@ Zotero.Schema = new function(){ else if (installConverter) { Zotero.Fulltext.downloadPDFTool('converter', availableVersion, checkResult); } - else { + else if (installInfo) { Zotero.Fulltext.downloadPDFTool('info', availableVersion, checkResult); } + else { + Zotero.debug("PDF tools are up to date"); + } } }; From 788f92bc8b85d9d5b4ebc8e4cc5863ea93f57885 Mon Sep 17 00:00:00 2001 From: Dan Stillman <dstillman@zotero.org> Date: Fri, 3 Apr 2015 23:54:37 -0400 Subject: [PATCH 23/44] Fix sync error panel positioning (at least on OS X) After 88be88661 --- chrome/content/zotero/xpcom/sync.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chrome/content/zotero/xpcom/sync.js b/chrome/content/zotero/xpcom/sync.js index eb2f59751..c5c264d98 100644 --- a/chrome/content/zotero/xpcom/sync.js +++ b/chrome/content/zotero/xpcom/sync.js @@ -956,7 +956,7 @@ Zotero.Sync.Runner = new function () { var panel = Zotero.Sync.Runner.updateErrorPanel(doc, errors); - panel.openPopup(this, "after_end", 4, 0, false, false); + panel.openPopup(this, "after_end", 15, 0, false, false); } } From 58b56abbc7c2e7d11861164c5be439fe08966c12 Mon Sep 17 00:00:00 2001 From: Dan Stillman <dstillman@zotero.org> Date: Fri, 3 Apr 2015 23:59:32 -0400 Subject: [PATCH 24/44] Fix file sync errors with symlinked files/directories nsIFile seems to have figured out symlinks since Firefox 3.0.1 --- chrome/content/zotero/xpcom/storage.js | 23 +---------------------- 1 file changed, 1 insertion(+), 22 deletions(-) diff --git a/chrome/content/zotero/xpcom/storage.js b/chrome/content/zotero/xpcom/storage.js index 24a6a4c18..eb259f84e 100644 --- a/chrome/content/zotero/xpcom/storage.js +++ b/chrome/content/zotero/xpcom/storage.js @@ -1734,16 +1734,6 @@ Zotero.Sync.Storage = new function () { Zotero.File.checkFileAccessError(e, destFile, 'create'); } - var origPath = destFile.path; - var origFileName = destFile.leafName; - destFile.normalize(); - if (origPath != destFile.path) { - var msg = "ZIP file " + zipFile.leafName + " contained symlink '" - + origFileName + "'"; - Zotero.debug(msg, 1); - Components.utils.reportError(msg + " in " + funcName); - continue; - } destFile.permissions = 0644; // If we're renaming the main file, processDownload() needs to know @@ -1773,18 +1763,7 @@ Zotero.Sync.Storage = new function () { continue; } - // Firefox (as of 3.0.1) can't detect symlinks (at least on OS X), - // so use pre/post-normalized path to check - var origPath = file.path; - var origFileName = file.leafName; - file.normalize(); - if (origPath != file.path) { - var msg = "Not deleting symlink '" + origFileName + "'"; - Zotero.debug(msg, 2); - Components.utils.reportError(msg + " in " + funcName); - continue; - } - // This should be redundant with above check, but let's do it anyway + // Check symlink awareness, just to be safe if (!parentDir.contains(file, false)) { var msg = "Storage directory doesn't contain '" + file.leafName + "'"; Zotero.debug(msg, 2); From af871a3fd53a47561ed590f044bb82176faecf9f Mon Sep 17 00:00:00 2001 From: Dan Stillman <dstillman@zotero.org> Date: Mon, 6 Apr 2015 16:40:52 -0400 Subject: [PATCH 25/44] Add 2x versions of many icons Courtesy of Pastel SVG (2x famfamfam) I didn't add 2x versions for any composite icons or any Fugue icons. Also: - Removed some unused/redundant images - Switched to shadowless versions for a couple Fugue icons --- .../content/zotero-platform/mac/overlay.css | 16 +++++++ .../content/zotero-platform/unix/overlay.css | 10 +++++ .../unix/treesource-collection.png | Bin 537 -> 0 bytes .../unix/treesource-search.png | Bin 679 -> 0 bytes .../content/zotero-platform/win/overlay.css | 10 +++++ .../win/treesource-collection.png | Bin 537 -> 0 bytes .../zotero-platform/win/treesource-search.png | Bin 679 -> 0 bytes chrome/content/zotero/about.xul | 1 + chrome/content/zotero/browser.js | 2 +- .../zotero/xpcom/collectionTreeView.js | 9 +++- .../content/zotero/xpcom/data/cachedTypes.js | 41 +++++++++++------- chrome/content/zotero/xpcom/data/tags.js | 14 +++--- .../skin/default/zotero/arrow_refresh@2x.png | Bin 0 -> 1234 bytes .../default/zotero/arrow_rotate_error.png | Bin 843 -> 0 bytes chrome/skin/default/zotero/attach@2x.png | Bin 0 -> 884 bytes .../default/zotero/bindings/attachmentbox.css | 7 +++ chrome/skin/default/zotero/cog@2x.png | Bin 0 -> 1341 bytes .../default/zotero/control_stop_blue@2x.png | Bin 0 -> 1962 bytes chrome/skin/default/zotero/error@2x.png | Bin 0 -> 1254 bytes chrome/skin/default/zotero/exclamation@2x.png | Bin 0 -> 1366 bytes .../zotero/locate-external-viewer@2x.png | Bin 0 -> 901 bytes .../default/zotero/locate-view-online@2x.png | Bin 0 -> 2340 bytes .../zotero/mac/toolbar-advanced-search@2x.png | Bin 0 -> 2573 bytes .../zotero/mac/toolbar-note-add@2x.png | Bin 0 -> 2664 bytes chrome/skin/default/zotero/overlay.css | 40 ++++++++++++++--- .../skin/default/zotero/page-white-add@2x.png | Bin 0 -> 896 bytes .../skin/default/zotero/tag-automatic@2x.png | Bin 0 -> 832 bytes .../default/zotero/tag-selector-menu@2x.png | Bin 0 -> 171 bytes chrome/skin/default/zotero/tag-selector.png | Bin 877 -> 0 bytes chrome/skin/default/zotero/tag@2x.png | Bin 0 -> 821 bytes .../zotero/toolbar-advanced-search@2x.png | Bin 0 -> 1247 bytes .../zotero/toolbar-collection-add@2x.png | Bin 0 -> 999 bytes .../zotero/toolbar-collection-delete@2x.png | Bin 0 -> 985 bytes .../zotero/toolbar-collection-edit@2x.png | Bin 0 -> 1251 bytes .../zotero/toolbar-fullscreen-top@2x.png | Bin 0 -> 911 bytes .../default/zotero/toolbar-go-arrow@2x.png | Bin 0 -> 591 bytes .../default/zotero/toolbar-item-add@2x.png | Bin 0 -> 1506 bytes .../default/zotero/toolbar-item-from-page.png | Bin 739 -> 0 bytes .../default/zotero/toolbar-link-add@2x.png | Bin 0 -> 1224 bytes .../default/zotero/toolbar-note-add@2x.png | Bin 0 -> 1062 bytes .../default/zotero/treeitem-artwork@2x.png | Bin 0 -> 1031 bytes .../zotero/treeitem-attachment-file.png | Bin 294 -> 0 bytes .../zotero/treeitem-attachment-link@2x.png | Bin 0 -> 944 bytes .../treeitem-attachment-web-link@2x.png | Bin 0 -> 1471 bytes .../zotero/treeitem-audioRecording.png | Bin 738 -> 685 bytes .../zotero/treeitem-audioRecording@2x.png | Bin 0 -> 1016 bytes .../skin/default/zotero/treeitem-bill@2x.png | Bin 0 -> 1295 bytes .../skin/default/zotero/treeitem-book@2x.png | Bin 0 -> 828 bytes .../zotero/treeitem-bookSection@2x.png | Bin 0 -> 861 bytes chrome/skin/default/zotero/treeitem-case.png | Bin 753 -> 723 bytes .../zotero/treeitem-computerProgram@2x.png | Bin 0 -> 886 bytes .../skin/default/zotero/treeitem-document.png | Bin 373 -> 0 bytes .../skin/default/zotero/treeitem-film@2x.png | Bin 0 -> 830 bytes .../zotero/treeitem-instantMessage@2x.png | Bin 0 -> 667 bytes .../default/zotero/treeitem-interview@2x.png | Bin 0 -> 786 bytes .../zotero/treeitem-journalArticle@2x.png | Bin 0 -> 560 bytes .../default/zotero/treeitem-letter@2x.png | Bin 0 -> 1338 bytes .../zotero/treeitem-magazineArticle@2x.png | Bin 0 -> 589 bytes .../zotero/treeitem-newspaperArticle@2x.png | Bin 0 -> 1456 bytes .../skin/default/zotero/treeitem-note@2x.png | Bin 0 -> 714 bytes .../default/zotero/treeitem-report@2x.png | Bin 0 -> 1005 bytes .../default/zotero/treeitem-webpage@2x.png | Bin 2058 -> 965 bytes chrome/skin/default/zotero/treeitem@2x.png | Bin 0 -> 390 bytes .../zotero/treesource-collection@2x.png | Bin 0 -> 628 bytes .../zotero/treesource-duplicates@2x.png | Bin 0 -> 520 bytes .../default/zotero/treesource-library@2x.png | Bin 0 -> 792 bytes .../default/zotero/treesource-search@2x.png | Bin 0 -> 1128 bytes .../zotero/treesource-trash-full@2x.png | Bin 0 -> 1069 bytes .../default/zotero/treesource-trash@2x.png | Bin 0 -> 1150 bytes .../default/zotero/treesource-unfiled@2x.png | Bin 0 -> 429 bytes chrome/skin/default/zotero/zotero.css | 18 ++++---- 71 files changed, 128 insertions(+), 40 deletions(-) delete mode 100644 chrome/content/zotero-platform/unix/treesource-collection.png delete mode 100644 chrome/content/zotero-platform/unix/treesource-search.png delete mode 100644 chrome/content/zotero-platform/win/treesource-collection.png delete mode 100644 chrome/content/zotero-platform/win/treesource-search.png create mode 100644 chrome/skin/default/zotero/arrow_refresh@2x.png delete mode 100644 chrome/skin/default/zotero/arrow_rotate_error.png create mode 100644 chrome/skin/default/zotero/attach@2x.png create mode 100644 chrome/skin/default/zotero/cog@2x.png create mode 100644 chrome/skin/default/zotero/control_stop_blue@2x.png create mode 100644 chrome/skin/default/zotero/error@2x.png create mode 100644 chrome/skin/default/zotero/exclamation@2x.png create mode 100644 chrome/skin/default/zotero/locate-external-viewer@2x.png create mode 100644 chrome/skin/default/zotero/locate-view-online@2x.png create mode 100644 chrome/skin/default/zotero/mac/toolbar-advanced-search@2x.png create mode 100644 chrome/skin/default/zotero/mac/toolbar-note-add@2x.png create mode 100644 chrome/skin/default/zotero/page-white-add@2x.png create mode 100644 chrome/skin/default/zotero/tag-automatic@2x.png create mode 100644 chrome/skin/default/zotero/tag-selector-menu@2x.png delete mode 100644 chrome/skin/default/zotero/tag-selector.png create mode 100644 chrome/skin/default/zotero/tag@2x.png create mode 100644 chrome/skin/default/zotero/toolbar-advanced-search@2x.png create mode 100644 chrome/skin/default/zotero/toolbar-collection-add@2x.png create mode 100644 chrome/skin/default/zotero/toolbar-collection-delete@2x.png create mode 100644 chrome/skin/default/zotero/toolbar-collection-edit@2x.png create mode 100644 chrome/skin/default/zotero/toolbar-fullscreen-top@2x.png create mode 100644 chrome/skin/default/zotero/toolbar-go-arrow@2x.png create mode 100644 chrome/skin/default/zotero/toolbar-item-add@2x.png delete mode 100644 chrome/skin/default/zotero/toolbar-item-from-page.png create mode 100644 chrome/skin/default/zotero/toolbar-link-add@2x.png create mode 100644 chrome/skin/default/zotero/toolbar-note-add@2x.png create mode 100644 chrome/skin/default/zotero/treeitem-artwork@2x.png delete mode 100755 chrome/skin/default/zotero/treeitem-attachment-file.png create mode 100644 chrome/skin/default/zotero/treeitem-attachment-link@2x.png create mode 100644 chrome/skin/default/zotero/treeitem-attachment-web-link@2x.png mode change 100644 => 100755 chrome/skin/default/zotero/treeitem-audioRecording.png create mode 100755 chrome/skin/default/zotero/treeitem-audioRecording@2x.png create mode 100644 chrome/skin/default/zotero/treeitem-bill@2x.png create mode 100644 chrome/skin/default/zotero/treeitem-book@2x.png create mode 100644 chrome/skin/default/zotero/treeitem-bookSection@2x.png mode change 100644 => 100755 chrome/skin/default/zotero/treeitem-case.png create mode 100644 chrome/skin/default/zotero/treeitem-computerProgram@2x.png delete mode 100644 chrome/skin/default/zotero/treeitem-document.png create mode 100644 chrome/skin/default/zotero/treeitem-film@2x.png create mode 100644 chrome/skin/default/zotero/treeitem-instantMessage@2x.png create mode 100644 chrome/skin/default/zotero/treeitem-interview@2x.png create mode 100644 chrome/skin/default/zotero/treeitem-journalArticle@2x.png create mode 100644 chrome/skin/default/zotero/treeitem-letter@2x.png create mode 100644 chrome/skin/default/zotero/treeitem-magazineArticle@2x.png create mode 100644 chrome/skin/default/zotero/treeitem-newspaperArticle@2x.png create mode 100644 chrome/skin/default/zotero/treeitem-note@2x.png create mode 100644 chrome/skin/default/zotero/treeitem-report@2x.png create mode 100644 chrome/skin/default/zotero/treeitem@2x.png create mode 100644 chrome/skin/default/zotero/treesource-collection@2x.png create mode 100644 chrome/skin/default/zotero/treesource-duplicates@2x.png create mode 100644 chrome/skin/default/zotero/treesource-library@2x.png create mode 100644 chrome/skin/default/zotero/treesource-search@2x.png create mode 100644 chrome/skin/default/zotero/treesource-trash-full@2x.png create mode 100644 chrome/skin/default/zotero/treesource-trash@2x.png create mode 100644 chrome/skin/default/zotero/treesource-unfiled@2x.png diff --git a/chrome/content/zotero-platform/mac/overlay.css b/chrome/content/zotero-platform/mac/overlay.css index ee9a7839d..fc2911e58 100644 --- a/chrome/content/zotero-platform/mac/overlay.css +++ b/chrome/content/zotero-platform/mac/overlay.css @@ -107,6 +107,12 @@ margin-left: 7px; } +@media (min-resolution: 1.5dppx) { + .zotero-tb-button > .toolbarbutton-icon { + max-width: 28px; + } +} + .zotero-tb-button, .zotero-tb-button:first-child, .zotero-tb-button:last-child { -moz-margin-start: 0 !important; -moz-margin-end: 3px !important; @@ -467,6 +473,16 @@ treechildren::-moz-tree-image { list-style-image: url('chrome://zotero/skin/mac/toolbar-note-add.png'); } +@media (min-resolution: 1.5dppx) { + #zotero-tb-advanced-search { + list-style-image: url('chrome://zotero/skin/mac/toolbar-advanced-search@2x.png'); + } + + #zotero-tb-note-add { + list-style-image: url('chrome://zotero/skin/mac/toolbar-note-add@2x.png'); + } +} + #zotero-tb-actions-menu { list-style-image: url('chrome://zotero/skin/mac/cog.png'); diff --git a/chrome/content/zotero-platform/unix/overlay.css b/chrome/content/zotero-platform/unix/overlay.css index 5518adfb4..25561b683 100644 --- a/chrome/content/zotero-platform/unix/overlay.css +++ b/chrome/content/zotero-platform/unix/overlay.css @@ -93,6 +93,16 @@ /* End toolbar buttons */ +@media (min-resolution: 1dppx) { + #zotero-toolbar .toolbarbutton-icon { + width: 16px; + } + + #zotero-tb-sync > .toolbarbutton-icon { + width: 20px; + } +} + .zotero-tb-button:not([type=menu]) { margin-right: 4px; } diff --git a/chrome/content/zotero-platform/unix/treesource-collection.png b/chrome/content/zotero-platform/unix/treesource-collection.png deleted file mode 100644 index 784e8fa48234f4f64b6922a6758f254ee0ca08ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 537 zcmV+!0_OdRP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUzt4TybR5;7U zle>x(K@^6+>g^d@v4;gkbWsEoXE%32*i1tcpTNXd5CcIl)ECgqz|2rE6EW}s7R?kl za1q`0GCkMruC6-2LANtwVlsgzsp4?{@7$`KBv!G66>Vie3h?3OmEEkjwdLG0PgLVi z`!N((f$A@n17Ldj#`};0I3@iHJ5M{#IZz|UIYRm4(!uV7eYIYIwQf&}_2J~}>pQ^n z6o8--^T(=hkBNQ_k{-_GWE<Dm*nZeW0t{q;aLLKDA7AX;UjS;C$UM<^kqJBcOg%kd za`=W$b`Dg7d87aY^8Vc}vWxQ>;FMW7!p}f{N<AKt_ivG%+H4#CQ-PWa(shVQx&YJ( z>G3nHZ{D5<3d8&tLh%a4AqqnjMkr3m&fkMdECD3N5}Unig5wy40;>lo4j~k+e}v)` zR6)J8Mk*u=SpB`p6o)7j?S0T@9?bz#m@l>gc*zk__|*!FMcHwP!gwLJvS~9c0px8E zW<O8VlWvaXiPQnhL8noy0FRR9bV($ZrR1$z0Ltpo-jkc#i0e4=f4*G-?ybl4tXbgy b{*Au@zK9=x;oF){00000NkvXXu0mjfJ%;Z& diff --git a/chrome/content/zotero-platform/unix/treesource-search.png b/chrome/content/zotero-platform/unix/treesource-search.png deleted file mode 100644 index 0ba939184d5e2257e380004ed799f00f66a49277..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 679 zcmV;Y0$BZtP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!IY~r8R2Uhh z!97S-VF1VB-+S(Rk5}`Uq1M$1(Z$;rv?K@)K|xS0ZB5lsEzZ%_$5?YvQxP;Z1`!cO zGzNjxU>|B!lwB?F)%&66ocFx{jBe!85I&EQ#75Y65B5(Mx_0d{Cg3j-*JeIvt~v(9 ztY`S8F>>s+V~sTmN;}4H=Z!HS)(DKjt$rUaPhR;f5G}c|OUlyu`rOm=z&+MjoL2Ek zTm0<?S(1aG3u7V*0|yxxy&56`9^?UGg3jXm`{NgZd#tgfCXi3ak`Q^}S3Z$8%GBqd zkuUUvQt%0q0~}H5LWukzEf%AKcPk`KP|_f+EfbYaQRvwT7(jpr2@uA1Ll#(CENOsk z-%9t+Gk^yP;ql2AT=fali@khU9%NyqNPAnJo=tTI+!jNNC6$z|;+wBfwuG`8a#eg< zVY*V}V|swnP$zrxIp&uVDz%u|&eL``zXild-r>^)e6oN~%J`&=(gmjK2N~YhK_xcK zEoV5BWBb;K=H{^+EtW(wWXLTdS4FOhvL)n}sIMf1VICJdydZX>U~@QG{;*1X#WjC) zr1dbuM}d?FAAx%5Xv>qN8EFR2i(h1**=X>G)oOfg_U7?X#32k3>qH~N`C9QvE@}^n zGhqY6++vD;yw#&i6Q>Sed3?u6;$N;m{5aHRIk}}XyzB+bjo7>Llo{{)Y8o@oYqL`? z&lySlkNcO8o-Otluk{V>>wfd%Vbe(Bf8CuZo#-Fld&_&*ZX~f0KLJ#yHcZ$RnzjG{ N002ovPDHLkV1g<!GM4}V diff --git a/chrome/content/zotero-platform/win/overlay.css b/chrome/content/zotero-platform/win/overlay.css index 73eb1ff8b..ea5c06a21 100644 --- a/chrome/content/zotero-platform/win/overlay.css +++ b/chrome/content/zotero-platform/win/overlay.css @@ -100,6 +100,16 @@ } /* End toolbar buttons */ +@media (min-resolution: 1dppx) { + #zotero-toolbar .toolbarbutton-icon { + width: 16px; + } + + #zotero-tb-sync > .toolbarbutton-icon { + width: 20px; + } +} + #zotero-tb-search-menu-button { margin: 0 -1px 0 -4px; border: 0; diff --git a/chrome/content/zotero-platform/win/treesource-collection.png b/chrome/content/zotero-platform/win/treesource-collection.png deleted file mode 100644 index 784e8fa48234f4f64b6922a6758f254ee0ca08ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 537 zcmV+!0_OdRP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUzt4TybR5;7U zle>x(K@^6+>g^d@v4;gkbWsEoXE%32*i1tcpTNXd5CcIl)ECgqz|2rE6EW}s7R?kl za1q`0GCkMruC6-2LANtwVlsgzsp4?{@7$`KBv!G66>Vie3h?3OmEEkjwdLG0PgLVi z`!N((f$A@n17Ldj#`};0I3@iHJ5M{#IZz|UIYRm4(!uV7eYIYIwQf&}_2J~}>pQ^n z6o8--^T(=hkBNQ_k{-_GWE<Dm*nZeW0t{q;aLLKDA7AX;UjS;C$UM<^kqJBcOg%kd za`=W$b`Dg7d87aY^8Vc}vWxQ>;FMW7!p}f{N<AKt_ivG%+H4#CQ-PWa(shVQx&YJ( z>G3nHZ{D5<3d8&tLh%a4AqqnjMkr3m&fkMdECD3N5}Unig5wy40;>lo4j~k+e}v)` zR6)J8Mk*u=SpB`p6o)7j?S0T@9?bz#m@l>gc*zk__|*!FMcHwP!gwLJvS~9c0px8E zW<O8VlWvaXiPQnhL8noy0FRR9bV($ZrR1$z0Ltpo-jkc#i0e4=f4*G-?ybl4tXbgy b{*Au@zK9=x;oF){00000NkvXXu0mjfJ%;Z& diff --git a/chrome/content/zotero-platform/win/treesource-search.png b/chrome/content/zotero-platform/win/treesource-search.png deleted file mode 100644 index 0ba939184d5e2257e380004ed799f00f66a49277..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 679 zcmV;Y0$BZtP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!IY~r8R2Uhh z!97S-VF1VB-+S(Rk5}`Uq1M$1(Z$;rv?K@)K|xS0ZB5lsEzZ%_$5?YvQxP;Z1`!cO zGzNjxU>|B!lwB?F)%&66ocFx{jBe!85I&EQ#75Y65B5(Mx_0d{Cg3j-*JeIvt~v(9 ztY`S8F>>s+V~sTmN;}4H=Z!HS)(DKjt$rUaPhR;f5G}c|OUlyu`rOm=z&+MjoL2Ek zTm0<?S(1aG3u7V*0|yxxy&56`9^?UGg3jXm`{NgZd#tgfCXi3ak`Q^}S3Z$8%GBqd zkuUUvQt%0q0~}H5LWukzEf%AKcPk`KP|_f+EfbYaQRvwT7(jpr2@uA1Ll#(CENOsk z-%9t+Gk^yP;ql2AT=fali@khU9%NyqNPAnJo=tTI+!jNNC6$z|;+wBfwuG`8a#eg< zVY*V}V|swnP$zrxIp&uVDz%u|&eL``zXild-r>^)e6oN~%J`&=(gmjK2N~YhK_xcK zEoV5BWBb;K=H{^+EtW(wWXLTdS4FOhvL)n}sIMf1VICJdydZX>U~@QG{;*1X#WjC) zr1dbuM}d?FAAx%5Xv>qN8EFR2i(h1**=X>G)oOfg_U7?X#32k3>qH~N`C9QvE@}^n zGhqY6++vD;yw#&i6Q>Sed3?u6;$N;m{5aHRIk}}XyzB+bjo7>Llo{{)Y8o@oYqL`? z&lySlkNcO8o-Otluk{V>>wfd%Vbe(Bf8CuZo#-Fld&_&*ZX~f0KLJ#yHcZ$RnzjG{ N002ovPDHLkV1g<!GM4}V diff --git a/chrome/content/zotero/about.xul b/chrome/content/zotero/about.xul index 08906ccd8..6f63f2e12 100644 --- a/chrome/content/zotero/about.xul +++ b/chrome/content/zotero/about.xul @@ -61,6 +61,7 @@ <label class="zotero-text-link" href="http://p.yusukekamiyamane.com/" value="Fugue icons (by Yusuke Kamiyamane)"/> <label class="zotero-text-link" href="http://www.davidashen.net/rnv.html" value="RNV (CSL validation)"/> <label class="zotero-text-link" href="http://documentup.com/kriskowal/q/" value="Q (by Kristopher Michael Kowal)"/> + <label class="zotero-text-link" href="https://codefisher.org/pastel-svg/" value="Pastel SVG icons (by Michael Buckley)"/> <label class="zotero-text-link" href="http://www.famfamfam.com/lab/icons/silk/" value="Silk icons (by Mark James)"/> <label class="zotero-text-link" href="http://simile.mit.edu/timeline/" value="SIMILE Project (Timeline)"/> <label class="zotero-text-link" href="http://www.w3.org/2005/ajar/tab" value="Tabulator (RDF parser)"/> diff --git a/chrome/content/zotero/browser.js b/chrome/content/zotero/browser.js index 59e3859ea..518f21b0d 100644 --- a/chrome/content/zotero/browser.js +++ b/chrome/content/zotero/browser.js @@ -907,7 +907,7 @@ Zotero_Browser.Tab.prototype.getCaptureIcon = function (hiDPI) { case this.CAPTURE_STATE_TRANSLATABLE: var itemType = this.page.translators[0].itemType; return (itemType === "multiple" - ? "chrome://zotero/skin/treesource-collection.png" + ? "chrome://zotero/skin/treesource-collection" + suffix + ".png" : Zotero.ItemTypes.getImageSrc(itemType)); // TODO: Show icons for images, PDFs, etc.? diff --git a/chrome/content/zotero/xpcom/collectionTreeView.js b/chrome/content/zotero/xpcom/collectionTreeView.js index 860a1b154..6e26a863e 100644 --- a/chrome/content/zotero/xpcom/collectionTreeView.js +++ b/chrome/content/zotero/xpcom/collectionTreeView.js @@ -421,6 +421,8 @@ Zotero.CollectionTreeView.prototype.getCellText = function(row, column) Zotero.CollectionTreeView.prototype.getImageSrc = function(row, col) { + var suffix = Zotero.hiDPI ? "@2x" : ""; + var itemGroup = this._getItemAtRow(row); var collectionType = itemGroup.type; @@ -458,10 +460,13 @@ Zotero.CollectionTreeView.prototype.getImageSrc = function(row, col) case 'collection': case 'search': - return "chrome://zotero-platform/content/treesource-" + collectionType + ".png"; + if (Zotero.isMac) { + return "chrome://zotero-platform/content/treesource-" + collectionType + ".png"; + } + break; } - return "chrome://zotero/skin/treesource-" + collectionType + ".png"; + return "chrome://zotero/skin/treesource-" + collectionType + suffix + ".png"; } Zotero.CollectionTreeView.prototype.isContainer = function(row) diff --git a/chrome/content/zotero/xpcom/data/cachedTypes.js b/chrome/content/zotero/xpcom/data/cachedTypes.js index 43c1f7f06..774ec6019 100644 --- a/chrome/content/zotero/xpcom/data/cachedTypes.js +++ b/chrome/content/zotero/xpcom/data/cachedTypes.js @@ -323,6 +323,8 @@ Zotero.ItemTypes = new function() { } function getImageSrc(itemType) { + var suffix = Zotero.hiDPI ? "@2x" : ""; + if (this.isCustom(itemType)) { var id = this.getID(itemType) - this.customIDOffset; if (_customImages[id]) { @@ -337,50 +339,57 @@ Zotero.ItemTypes = new function() { } switch (itemType) { + // Use treeitem.png case 'attachment-file': + case 'document': + break; + + // HiDPI images available case 'attachment-link': - case 'attachment-snapshot': case 'attachment-web-link': - case 'attachment-pdf': case 'artwork': case 'audioRecording': case 'bill': - case 'blogPost': case 'book': case 'bookSection': - case 'case': case 'computerProgram': - case 'conferencePaper': - case 'dictionaryEntry': - case 'document': - case 'email': - case 'encyclopediaArticle': case 'film': - case 'forumPost': - case 'hearing': case 'instantMessage': case 'interview': case 'journalArticle': case 'letter': case 'magazineArticle': - case 'manuscript': - case 'map': case 'newspaperArticle': case 'note': + case 'report': + case 'webpage': + return "chrome://zotero/skin/treeitem-" + itemType + suffix + ".png"; + + // No HiDPI images available + case 'attachment-snapshot': + case 'attachment-pdf': + case 'blogPost': + case 'case': + case 'conferencePaper': + case 'dictionaryEntry': + case 'email': + case 'encyclopediaArticle': + case 'forumPost': + case 'hearing': + case 'manuscript': + case 'map': case 'patent': case 'podcast': case 'presentation': case 'radioBroadcast': - case 'report': case 'statute': case 'thesis': case 'tvBroadcast': case 'videoRecording': - case 'webpage': return "chrome://zotero/skin/treeitem-" + itemType + ".png"; } - return "chrome://zotero/skin/treeitem.png"; + return "chrome://zotero/skin/treeitem" + suffix + ".png"; } } diff --git a/chrome/content/zotero/xpcom/data/tags.js b/chrome/content/zotero/xpcom/data/tags.js index a8b8949cc..790b4b880 100644 --- a/chrome/content/zotero/xpcom/data/tags.js +++ b/chrome/content/zotero/xpcom/data/tags.js @@ -667,12 +667,14 @@ Zotero.Tags = new function() { * @return {Q Promise} A Q promise for a data: URL for a PNG */ this.generateItemsListImage = function (colors, extraImage) { - var swatchWidth = 8; - var separator = 3; - var extraImageSeparator = 1; - var extraImageWidth = 16; - var canvasHeight = 16; - var swatchHeight = 8; + var multiplier = (extraImage && extraImage.indexOf('2x') != -1) ? 2 : 1; + + var swatchWidth = 8 * multiplier; + var separator = 3 * multiplier; + var extraImageSeparator = 1 * multiplier; + var extraImageWidth = 16 * multiplier; + var canvasHeight = 16 * multiplier; + var swatchHeight = 8 * multiplier; var prependExtraImage = true; var hash = colors.join("") + (extraImage ? extraImage : ""); diff --git a/chrome/skin/default/zotero/arrow_refresh@2x.png b/chrome/skin/default/zotero/arrow_refresh@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..b1a811509c5279a907f870ebb490e0c9273c2caa GIT binary patch literal 1234 zcmV;@1TFiCP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800006VoOIv0RI60 z0RN!9r;`8x1cymPK~z|U#g<=8TXhu2zxUn_h6vaWCM<Miqf=*O?tw_Q_+a=mgKo@a zi`nKhChGhXUobJ?gQL7S79C>Z_Fy!|7-M`eZo>_?MMjo5WQJskn`D$0vhin=4ip$L z%I|!AfLq(r-WG!Kmo(|U_jk|dd(J(-a}KafYyUU9YL@bzzFYzbHthYn%JcsT5CO@$ z=fB*(C=tsifP{0E3j)^d`Qn+RMQBzJ4}O0jPZ_~oN@OPqCxtl_W|M>nLDKXbB1CCX z8GN^V@DKW+h}x3}TaGMAz$+&YxB>M6DZ44ug#=~(7Y9xfrJKq?5WYb_d;>ioS%2!y zbC%IqAmFuA`*sWQ6)EXD4CJJ*h9lj9jFlMx0mHD(!9joofzUNUkN`pS^moHQ;D=CZ zPruz7Hxfn!ym{X{LVOM~B|p=Njk%8@`~GaCtw@8e8PIh7Ul<95!$Tqfkg#Vupp?Ss z*l4-?Y1eemPkq0{5?~93y?NhrBKT0(H0{v`Hz6x6E6mF%PZPk+dp5%c3L%8u@)Nvz z=7oF)<qwb<MR|`SbEP$W?im)q=Y-AO>mBUH^}g#6^2pihw%T|CYyiNZ93~~hWiJT9 zO=Hu+d*~bP!^rp@+`TsumVli1&P+~0d2vMqoMipk>NZb2H~`pQ{$XzcDf?56RODwl zBjCg10bConirHW=D*G40%@Y#kxg{I`Y=+LAqNwND*8rLp3hCI?7_Q#@9ZJoD<PD{y zdc}->@!Qvb48$_@?5AZ+HtZ1sL|7>#9QS2M953JPo)FwHWb=0~ogTF^MB$?0rhxSn zqQl=Fv&bkV)rsJyfW^WAK&LR*s>02PaXuMCOMwFkdO^Ik<9J0)^IPW=*7-_LN#>+Y z`#V;`&R>r&x*P5|UQr_=4aw}CGO*184hjctiOnp8Q<!k?7S9%kP#T4VJ<EZT;wM6d zZQ||(S}$AxNq^D;Ot>r8h2H+&xce$SC7IJUR49>;g>>qghK&zB98sc&hHjZTb|$GD z2#33!8*uK@*|;q^yhs_kfz3smk-aJ#W{FlZi=SIBU~+Ow8Nzi5BT#j$+@nP5Ot{rN zV8T;UQ?Ytg4hq*5A|)j?1Sbfu*N4f;DG>bZx5leCEh7-^d3dv#{};bGh3zrJKO6|) zQhPfn9MhG0q_e4ODDEk!I#%w9hDRG-(2lL(!^7z4xC{zs3ALxQscQ%bn+KwoB34oe zn;v5Vih=?0XM>s9AiBG|(c|-hLLt?=R~oxQ#m({)R5q11kW%Ab>qfzvf{2kT+|%$3 z7Yb%(f*AR01b^PXjsE@t%*=Ju2`csCm8Px};f#c*VB68BJfzfZSnEbX{yGpuOIu6a zmK<Y%ou<eqx)%JX^Jw>iPHM!0hA-c_zP9xh&a}X2;7O9OKVXN~@3n&8qwogE%On~N zP2T7{dhNte`<=;H_LJ@frH8jR2w79;DumbP#l=G%OX?%hE9qX)`rf5lDAs#@UI-JH w;$;^A0B!I8>JhR&nO^XpuC0fPJ<Db5A3ei!<_lBf(EtDd07*qoM6N<$f>-EEod5s; literal 0 HcmV?d00001 diff --git a/chrome/skin/default/zotero/arrow_rotate_error.png b/chrome/skin/default/zotero/arrow_rotate_error.png deleted file mode 100644 index dce1f80083beb75965b03fdbe50b5401b21c14bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 843 zcmV-R1GM~!P)<h;3K|Lk000e1NJLTq000yK000yS1^@s6jfou%00001b5ch_0Itp) z=>Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iOK4 z5g#jYJ>Pc#00PTNL_t(I%k7lOOVn`~#-H!|UB=0AoT(;DMaL~S%yv6SBt;ukL`BhZ zsGy>tg$P=RJoFzFM9`r_K?|Z1deSZi9ik$Tq;<5hanyb_mCg2BzFjgRY^F=Mp6mNQ zA6|H$_XYkdo0guL|7FS9M&F<6lnu~utcDhxYWUg5B{y?&T%VR*Sm2(jpJjp-uba&S z^)vT#;)l4Tc|^oYN=ivdfl*^rM?z86fBA*=SHOnjwMBySwqRMXsXQ2j*P9Ox0uhHK zj@RKgh{i@zVjB0i?deWT`ovVQ{Q5j5h3KfQtyxrEH5X|+4MhS(9K<*j7m!Lq2<~!w zT+XlFDS_qdN{>}klrO5Ts%D%Bx!i+Sp_dr>5J72SDU_6m#-adYGjD8ePi0+-l;TKb zStTrOLfa1RKkT(fjL7ZbrxEUoM;ta01{3hM?dvjr_f9#XP@>Z3^?@;9aClHlB`<a# z?QI?JX%4<~RZ!5SdeUPLJ$HexS!1*Q`bv^YLJ)@}2_>Z#ivJiru)D5mn|2kfSk>he z4({#T{`o-nZX+YmjHO8_`8<(Kz|jtZbIM2vajx~&+RK)w?v!K47~>XJ2Wr&Hf;unf z^f4n)YiOy&rT62*@Tgqms%co$*dm%|6&>*vFZUV)9WVykF{8K%fzKiBCVe#{u;)ad z?Jvu_7X38xXlQ&0oH%CNF)S`z0^;8Q$AFVIKomx!zg{04?0=GV%QrW6TGB1IgvQ@K z36BjpmF7p}7B<12c!0bDFLHctIPu5GFR3B$=_enZ_xZEl@|`{R!aH_tSiCS9>MSa1 z(N6Liv^fSdo&aMS+Wrb8`Y?Uo))poMJ2J**Qk&R*9qrj!E6B~Pgn||u;4T0h%ZBCH zFyk6v%uUjN7{HaRKmbS?{U;OA)3Y4QhHcug(-zE$B+~H|tZylpNfUP39Q$Yg@;kMl V0B0o*;p6}S002ovPDHLkV1j)Ld#C^a diff --git a/chrome/skin/default/zotero/attach@2x.png b/chrome/skin/default/zotero/attach@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a54f95b4ec6b34204ed59d571dcfbd6987bcbad8 GIT binary patch literal 884 zcmX|9Ye<t}7@ZBlM)Q)HON~rH10hmNGB9sjHC;n=7u@Ey=KSVmx_O!A<;PH`csEVL zKX#j#5JG~OA)!c4Q*cfcOQ)2iGEl3{(wx@GfiHZ|_q^vh=RD8*eqUV@`!1E@Lm`n! zROUT;GT#3G9~UwrU0**=B004su{aED3knKSQ&SO<bGh8SygZRel$n_+kw_dRjYgA| zl?9GaC{!wyz){W3%@rRn&hbi5PnSxi1VMmMTwKiK@sNWLRd#l^OeTW^2rvhZDq6_p zav<pF=!Gquv4tO>&j$z<2x)0)kRV4y4lQ!{pd%tiKm@4OYB8-!rGf)yfIku-s3O7* zOgO03>YSV$hanu$6k2c~$<NOR4jP2uC=`m5888M6F_;4f`NRZ$1p)zlFcs#99H#~! zIZgp{xFJDAYvAz2g#f|L;5cXvA>=1_`@MkJ!j~v5N@k~!F77Wok&oDV``7z{PwaxD zy>6X|`KYql#f|INaly29O&9*zMyb*C->kO=?rpg>yzOl=)*O~OCsb7)RKMp>w73{e z?D^DI^@{nUz%(Ae;8W+<wtl&Fk>0)->EE+H67#rIza4VWa;k{1|1$lInfk=@3iIWM zOorkYp)u*PoQL8MMh2f8damY6qBD(CKcJ&nwvSg^BWHhgxyH;2imIjV1T`prm_7G| zj3u*d@NDhGT=IleH{$tPz9_MHl<w;TN_ge0C>qyt-Zw7eYN1LqT6R!U+Z(*(QA`&1 z1&0|dfw!N>cPs?hI1RTv3?Y$SUe-RJ^#Re$oA^t)$~aZTQS^4t(z7OFBZGM5Oo(Z# z<;L>egF^k&Ew`ksE0ZspH!F%78ztkz)d?w^a}nl|Go6|c>$JDgy6c)4`@4U*|J|K# zk&Rk4MifmAdAc6{>6(2YiPVn0Tx(CUg*T54Rg8*lvaYdt&EELw!IJ4AbF|UWqi8bE l?0mc7KD)9KYcy<l+xgM<>nyXoMEn;Yio|5F>3wn1%6}9pgVg{4 literal 0 HcmV?d00001 diff --git a/chrome/skin/default/zotero/bindings/attachmentbox.css b/chrome/skin/default/zotero/bindings/attachmentbox.css index 71cbe9a98..22093505b 100644 --- a/chrome/skin/default/zotero/bindings/attachmentbox.css +++ b/chrome/skin/default/zotero/bindings/attachmentbox.css @@ -24,6 +24,13 @@ list-style-image: url(chrome://zotero/skin/arrow_refresh.png); } +@media (min-resolution: 1.5dppx) { + #reindex { + list-style-image: url(chrome://zotero/skin/arrow_refresh@2x.png); + width: 20px; + } +} + #index-box > button { font-size: .95em; diff --git a/chrome/skin/default/zotero/cog@2x.png b/chrome/skin/default/zotero/cog@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9c07e6cdc552ceff7b100b3893b26212093bcfcc GIT binary patch literal 1341 zcmV-D1;YA?P)<h;3K|Lk000e1NJLTq000;O000;W1^@s6;CDUv0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU$-$_J4RCwC7Rb5P*WfVUBhgQ0l(lQ7m z8Ot<_*)&mRf{JE9iZonI9b8N!;ci5#(W?<6fsp8hQ7ndRSF%kBXmlYY9UUz(M!4EC zm={ZdVa8Zk_-QMD?bkx<dEW2)x{he#jbC#5o}QoQyzhC>Ij<&@$<Y7#>G9Lp*hm_U zhIBfepxjTZ)na*z$<Aa}#JfyUrW@&W`YHSU{e3~$_}JK(9N@tBGSf>;lWaJz$jS!? z2YbzCvrVAy?#5bLS~^ug-qdks&oJF)y7kls4}e#)L*?-B@FiYr`Ty}$Dg_X2JRUDv zSXj`5z(WQdY+$SSR08AQ0-T1y(9qC8I2<Od{J)Nm+QzE}V7UaDqN_XLg8-*hP#94| zLj(8^2L=ZEqtR$KVnsy-_48L>U;k!FNy$k`l7!r3GSSM)${*w7<G;4^x45{N^|9OS z)YjJ4&g{2-zh4gEcDtc_mdV}U@AIiaj7AeV9EE~67>wBhK;BcSq~JF;B9u%@S@8CD zub0^X(_A1BkT02Y%3#Jhoan-ZwvYSzzV6%E*<nyUp-MJ4H)&~UiPXRVDlac5tJNxO zBq>1_i-q9J)p!%&$z<}$9biWY!YK%IezjMxUK@aeMx&+s_ZR8Tof#3RxVTslc*vlG z4Q$~9Utj<WnAtwyG`-EsQB_!7{rVf*+uI@y%gYa`pr9Z*Iy(B>#6<8O^mTQ$Cp;cc zHS3H9gHEImK2uXuxQtJg>-dxD7ZG4@Z?DMb`{p9=#G$4P7rL_YSnSU4zcDd5c;!3v z2K3CI;hjtM^==PrN=r*|vga>fzVs#ZoZbzu_oI$%iuh<&-i2*$Zk|Bv>+7Nv<M9OF zO&*0pAv8}=>0VF}GU#9fTllE{zyfAAMSKD+@~XCdI-MbmD2xe{$;_*6|KQAmOx8t( zEqtE%rv+y23Ap=r|FYW)36!62VMjf$W^q|fP3K==vnmc^1%ZbQI@rjz7E=9z1<dRT z_)ny@wY5*(U3Yiy`6EZlpK~}|w6?ZN&CTz5I31ahk!vTRZ*G3S^6c4nJ>l>yIh`(? zh8{gy3U_sN{*ZIXNVb#Fv1+;U*Hu;Z+EK6flMnLp%oK^N)7I7&9Xob{3JYDbXJnO2 z^d72<Wkr-o?2^y-)s^Y#-%&Z;YD1#KMS!xhGD2hM_4-rXDDU|F!Ou_~Hk(5^@(!Qm zF^(=Ad8+cx5A$l_=8I4)wm~H&hk4}G_AuVhod3JrxLo4Pasa2(iTB_X`<@GhraRTy zVm3cRE|-fhI$wb5^#+oQA|--JQk+&-SDD|=&aRr8s$OP)V%)oHYisf)<JLJnP1mpA z?0oRxA<rCxAb|GtbbLQMdwV_>iwZChc*vlGjcN~HU;s<4C~*RtO}ryD%+~}0(-$#w zFmK%Ms?XIMQ|0O``X`+#=WK*n9E!za@(IwjoVO51ovf{W<%^;sCt>CPKXT9x%zm9t zPr0PL2OY3E;4=v<b+n5zO(YWH58r-}FIrPw{i2qgN7!&i9@PeIA|b^N9kLh5_R<z! zG{tX*eMs>Ecu<{b*%WCo5{WEKXrcn;ao4Cu9N<;9u_`uV+_2v!_s>*L-6QEcOq&YD z*(Rd~0GJVvm9iRg1N_GivjmTTq|hD${4Kx$$#4lKJWhri00000NkvXXu0mjfQ|Xk6 literal 0 HcmV?d00001 diff --git a/chrome/skin/default/zotero/control_stop_blue@2x.png b/chrome/skin/default/zotero/control_stop_blue@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..6e7409a4ace02da5114adbb5908c0c565089860b GIT binary patch literal 1962 zcmV;b2UYlqP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F8000MZNkl<ZcwU{C zU2I%O703TGckajT-Sw`$j@OP|f8<L}8@WnC+9FDEOP>f;Kzs-Zo)HqXJR$K=spbLk z5Kv3is)z?(kw6p?3RSBFMFi3+#7XKTBzE088{6^sZoD6N_kPR_JEN>ti{nk>k*<#J zow@TnGjq<Fa|j;Pq$J}%gW-3;3<6m3I4nV65&_06PymPm2uTr9iO};9SQY}ii16$y z;2=b{1GG_~4xWIKcVVYe_P0Ugpnk{ED7;6Q@in<auoO>$HyP~-$f>Z6pGsCHH0 zpPc{)i2UpdOh`HmSUufv;{=@|LJu>LJ<`2#^iXE=$!@E<&muw6W;`xsog7lH%8k-$ z)tS9n%6vFg*fkjmtPp}VPol88j>;_{zyuKwR^SiP7|X$N4Wu0hy@tfl@!`c2N4hp% zaLuq&0fi7ya=WJ-vizld&tK21?mdMFxf;iEh2!qj5Nh}~;oB*o;p1zF)dF-|CI%nR zY(D+<k%gC1rk_;+#u!qm6goRQVObVT)6~EyicqW7u(7d$wY4?)zOTO*d~5l=wb5Ts zmoxtk1#Vje8)tW+s+73zwvU~Z?)a;6_)BlfXHUMf{F@6GF9(y8lk)1-t1_R@%g@q; z5OQT@MV>!@UY<UETE6@Knc$V*&%QPOmK=ZX4LPJ3iq*OUkYsoQc3%fFriH!F53GIT z_~7D?AO%gQ(-<Be2Bj1dfFE$wLV+;4x8-^g0>%hpmI242dQ#3gu3fu^)zwvS0dZ!1 z|LYewhyN4`e7d-S{H+Q20FgxVzc0<B2at-H7<!`j?pMCEFZZ$mZuRu^U|?VX05r5* zjlhKhLpLp?lFdd5kaC$)Mk_coGlRLgIfR1xr&b@In66~s_krAnDHQQr5)wd?v6F~* z#nH!rv7a8k{zj+m_o;Ip85z-_QXTC1901zEHL%f_a2V1q)9+WVT)~|?cTfmpi@#fV z_Qfi})ryCush_~3%GXmN;xs}}-P*sV;L5lL2M2cyhlJj(yOmJ)9XfPK8*R#{^go@x zal(?=Wz?Cdv#E-3B#8uN=sl9jA6FCY-n|=!VZaZ?j^GVZ@;Iu2(B3mTI;zKwy7ONp z6xn2*IZ$U)6<#St>R5K;n9G7LrD-OUQ9!l&9m1RA3guA$-{0R4$8ivYmwD95ea?{R z=w~pQj_viAgQ>z(QcCUT0MzR5Yj8h!^&bs%i%9o8qUF!OyB`ouCBsOd8gRsI1HHYy zn4O))h;!%j*K0%XSrKd+MX(r!+wIi$2qDl^fVWwB3%unk1yQo4yK#)ltJEUXq_`Ix z2|-{oVu4ACm_x!2)oI(dMg)<3Xt<WGN7L9%E#vVxG=qj6AaIDO%tL|#V73vts#AG@ zYC_8Uz_ATnZr81QIM@A%#bR0kCjA5`7!#lrO^x*fv^BW4@aCAUySE*OMg#%`kr&d6 z0t7*z0R|yk;b;$Ul3L-0K{TvdtwJ-TRfa$mQ3xgjM8v80aaxKSGOcbkwN=a@2)W$i zY7J{|MK@vcJ}b8js%5!c)^k<4Q6vOa#iooQ;6QoVi_IudKA+bB$1>Xc`Br$tc3R-- z)phh-IvgucEAZ5e%AQOM0Sf>>9-(-1v-^XC9qV6SUth<bJ$v-6rWB8OEBqJVJJ1BQ zDyZR7w8FKIJBA*&u&|)zTsUx^0!7b9z*dq72FoaZRM>Ut`Rr^y&Z}KZOG`Q&r{WCj zr4W!U7To}}HQGj3SCT2A15l+>fhU}ePyFG_DsNm#AfUH$h$=ox99X`1xA)Il!?`(d z&h;@Q9o7PP7<f9tbOa2;P~`^tpBw(Zw<X1jVk$Pp1UQoLLV?wPu8zD@2<#<gh*MKj z3Zn1!M9gRf01txe|GE;UhMqfj4xZ<sB;19Mg0a5`5!O(Kr`QxAa&ifQj8F&(a_=sW z{;I}}s<H)@Oz4%kCNdqS@{BfquHkx2Hf<r3)NowBd>QIUePLG4)xPk{FhWkTCV`-t z5kZoDufxg`WK4lQPj=t>=6Gi2MMy!j*(}D!#`N_prH<?Ra`7YO$l4w>)MgYh+kjht z2!T#i>v<vO=jU}wcA<9owg38$z8yvQbjd(|_NAr*&7{;tEJ4t1*%&#Jo<IIf=kyOv z62wf?RGy(TBuXjTG;KT6)6=+d<A%<Z17Ujq@ejXwGu;2TFvMKd!TRJ9YN|%qnwEb{ z8jn4OSgIQti{O#{?#dUR>%9Ks1og6wi%RWCUtb?w*VO^55#dUu5*8O1ar^e|M#Mvj z$Cp2-9(!#*9QapgVZK<z#?%GW@JGV8D@?Q!V^7>GObqmbVd$Ck^%Do<3oqEHcD5@> z8U>3doWjTc$f=9r;lF?*=SwV?YS?VRcU+nsaB@dSoTaC_*ycW)1St!CQUQHol`5QV z7I^C8T-5*JC$*7F%B^*2wu!=Ou%$HHd2vcjbVwla|HY|_?GUI)fz6Pk#5jsOEKb{( w=e7Y`CSb-mSR_FKfDwqQfry0&9=1IH9|aBh>iaitp#T5?07*qoM6N<$f>9&5X8-^I literal 0 HcmV?d00001 diff --git a/chrome/skin/default/zotero/error@2x.png b/chrome/skin/default/zotero/error@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..354aa99b264cb30ea83cbb2a707ee6803886a221 GIT binary patch literal 1254 zcmV<C1R48@P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800006VoOIv0RI60 z0RN!9r;`8x1e-}jK~z|U)t75*6jc<*fA`MpgLbyC+m`JX3lz$$1zJiBk5Xu(Mhuz& znh1$XjX+{bq={NV6KFyufJ7ylXd)j3P4Ek-NqJ}>)h`lIi6DsD@KPhMSo+xFPIu;B zKWr`3cIgXH&zG4w^S}S|J0~-9Gw^?oAGVF!bMlRx-GlLv11|p7=!L){VDX8q*$eL~ zKz&V_i4Yrw=|`G=1oGAT8qB)}5DEXXLcpX@;gh5nJq76e;E>4jfq04jE;zn(YO24j ztwDIwBDqWJKnognJb)9uc2P@rT;YqC+xp|z?+N(r*lHjWDta2}wJ>}Z8Pk`e(GeV; z>#twG08a0im@c%gHmxj%O<vNOPcM7|PauNUymVyai1a%KU^;3oFf>%W5@Gl{^TPBo zd{!mEP_JXJxg!8)b{32TQRy8vhO}{y0HEv(DEk5c!Ggv3Lt_y_tU6j7%DL?TXtf^j zhl-yCVF2JXenPzQV*rFO2$xo&!7m-T{<Z=%yq{lyW|=>83aO*Y0Z`XZq3p9L`z-GD zQveJdKcCd>A_ThPSWPIuFW!Cnct|O0QLYgzuI$KY4!^VNCPgK4p05W4S!LC<ez3$) zidtZCuim{0&hMH$Tc8*EBQqHiE(XAje$!3oM2`VrjhsQ+m{LG5I<ht}YtR5%i%keg zXj(_d+QDhs+Z~{(4zvS6q`Vr0KuEc1PypvYn(~m)l&0jA;|=Bk;6}efJB{5zokpDK zVE|IHCKJqG05JFHnzZ=?0?;)`f!Hjh$*`#_6FFt$G#yB4<}`f<$_602>;;73L8CY8 zn&fqo-uSJcXelryHTPjWR^qjGTfacN(WC&{ZN+K%5&&O%E*aAv2gKB)(bOf$*7OL_ zurJT21+~KTlQyZM!@Lc*<xtY%e}~(A2<;~JqwKOOq{ojI)Sjxr+h>3jJ8cD;(bm|< zFot9R;Ite>t5~l9TE%di4+7u`gbB}n1`xT;Eh#H{(s$dAuYOt*u-!k;U|5;q`*$Hd z7TRqh_WK5ej)P9NG;u97AUybTUO|{a+*k|8Uz<sLYvWaAULQMW3$3@DfK99l$PDBy zMS3g%;>`y@$9wJm#u(zbO`ii`_|wRmTM3XUZ2#(8PT<m>*~49<{fzXaTbbn_A`CAo zehK^HCO{>`9TWI=_xD|lraxMEV*(w$`R-YR@P<)NjPJITVE^%JE4G<e@^17>&l51? zYXQp|zYJj{o*AckFQEF~eP<|~Yx@&LOg|&;s{#mUZ`bX*a{`y^?j57FI4x6hycu)0 zgODiuJoe?+yNdhr40MLXJE98d8--Rb$G6U-?c$H^O3R7!-j1D1C_1&qI>2j<s{oNm z$D8YJt~h|uIF0)fVA3Gx!D;}nQ1NwLu&?efnc!;oq#2lC24`&Rp}U?_iFDE%J@9Bw zyg8qib6-0m?i7^1$IlW#OEv(el~<9x((MQ#7`fnO0MnIn1Aw?vKP!)R@so0u)UHA) zg?1InO&qnW6X)vY+>P_@di4*zPNrAdQ4^$a%yI_ti#CXmLQ?)O)cudeUnIZSy1(>> QzW@LL07*qoM6N<$f@hOhL;wH) literal 0 HcmV?d00001 diff --git a/chrome/skin/default/zotero/exclamation@2x.png b/chrome/skin/default/zotero/exclamation@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..e0574d61b7e25f992058c110998fe88bfe41e007 GIT binary patch literal 1366 zcmV-c1*!UpP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F8000FYNkl<ZcwX(7 zOKeot8^C|(&hybh3w=H)Ev6NbqC6^KK|%~GqA50w2#IThV)$?Vi7tS!aAyJ=*2aht zArgoyBNz#URuFBWDAGcqkC{?RaY|>}>AmN(oV2mc?X^Q#>X%Hu#mPOt-+9bA-{D^$ ziX1~g-T&W?H6qd|N^b#G04%};L%<-4vzC%m1)m<jqCj#I$OW9-+uWq!An*dYMTbK6 z6&*Tp(nBOSf#e6x)#BqANIigxL<p5t5-2Ih7mK4pApm5296g#Mo9JUa(Su|%Ohqfo zzoYcfSKUu6(6^`Q4W&2=#I0zI=(0M(OKQOSM`uK9#=AR7|K5(yqybWvQoBkHpZGRs zfyAEen>Fe?AQ-A#N__POl+OoR<J{}V8R$ok3?o?^1SH_Y%6k@naT)&73a~81aTvLB zk@35?0J6$rYuVv%&dn>(^I=nsa&#+@AE{kV-paKA=t;1Bv%`!E5k$bi5lj}7Ard3B zY{jHVIRKB^E|IzU8^8k*XWil>r#n3b1XS<t##W#{Tv^S6wG9B+UDt7XZW-t_{FzTa zV`dEh|J_;bfvV>SFRue2_0xIAdb<H>sW@`#)tMX9Vn+17_vTI!skb6g;xDfQV50My z3y$E5+3mu_?M}uz+5w2KT89cp5n+AL?#3MeE&(}kz|zQm5l!rcm1fQLU;^FS?ShNT zU^bkol)c@Bo$N>X{p2mLLqsFm+5ed361dZMX}yTlSm6kfiYl-j?9S_R!@Xx<_H1Y& zbF~ezZNlZ%Q?nq?cMtshic3H%wuuO#vc&-Cp#*v?<FVnq4BSiMjHa=Z36z3xX@&V# z*|N<gfXF5zP*i3B&ftJI+|75vXNqSN{RSK?Dm7W-Y-B3@GX%;7@I~XG1^wtxPq;|# za5I?UhoA+2G;Rcd3YUP06boPlLm2z9tS8)U;0;H>nOaIK9GVs=aS3QWy@=ZUKs@1Y zKAvzvP^L|TqY*6z=l&aNNt*Q;OJg9xpeNjI;0;GGmlh&8W9jL(q+0-;5D_L)DbRuy ziRTUnPq+y9<IjK=>{JRdqPidVCghADo6?D1!bPQ63kzT{>4s0G`+IkJPdl^4{l&!w zoKEzZEXY}xfDNZDkpt=eyX4oc!k1rwIXKdza~?7UhmJBc2Ht;XPPi4zBUn_3Xq(YQ zuMx0BpLQ+5^3T8jRkU<WOae!`Zh}By@lqGuV-wB^7Zj12S`bKe-M}`3k*l>|{Lt<a zP#~h@V-d~pjdpZ)9AEw-0%euJy!*fn7l>3<5iBe)eLcK!4G|5<M+(IAI_}uHxdnJ7 zQdmOihSyOFvfW)|`+IU-bCW}rmBeamjY#6+88U-O6kJ^X<&O=X*RcZeYkRwh^ri15 zxPR?3h$gsXDdE}|%^@`(T!kaV>*|Qr)PQJ)u3qMGUyu7#mTofe`AV|(=1rTiFeO>E zsFafWjaY#oqBZu=5ccp8dSnF0R7V)7FE5UN;X(q1g(%BHPh?46I&a`W7ExPQetqs- z&P8e4+YRdxbrLA?M`J9iT|s=wQk1ghDM}quce;4+M+bH$je>+IdF!QP7h0aUEN^Rm zty*x70rdd>aD-S%1$o8g1mX(_gku0qWJZ~Il;Y7qAEU`$?6JSga`8DkR(;jd{ZtQ= zUz%TSQksLPCwZ8teJ`E3@Kg^Iw@6dN8ih0pvIVFFiZH=F;10rB@##~mkGJOhH2W|9 Y0y}xiCs@v8;s5{u07*qoM6N<$f`}u9aR2}S literal 0 HcmV?d00001 diff --git a/chrome/skin/default/zotero/locate-external-viewer@2x.png b/chrome/skin/default/zotero/locate-external-viewer@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..26d913b0ac63038ac3c8d00f744a19c872014bc4 GIT binary patch literal 901 zcmV;01A6?4P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800006VoOIv0RI60 z0RN!9r;`8x13F1WK~z|UwU*6m6iFDyf88<TpcunMjUREnEwaldfy5yJ^(=T0FP>yq zBvDuJBCPA)_NE8Dh@z4p9z3Wh;z9fa{7PcRL;{h$?3y?s!bpfZiD=UAyNBuO^vrb6 zN6+{SMSXTXPd)Wk)mW^c8Q1}=rha$_%$6F^;4AN}GdaL|K!9u|gOfl~>x6VVooQ-n z>T&1Y5=Ls*Wt{=AENjE$<mBT-BC!hC4r~h?=PM@xRCU-is460omxq;2o=7AB$Ye4s zEiIv{^X={J`{(B7mVp^Jc_`_CWm#UbZ9A`Cm`uMxEEXdci(%V#^Tfo&BiD&-g-(>+ zf>LBb$)K^Z(My(Pg^GwIpp=*(0U;s)SXEAd5dmP^HX@SOR@h%Cpa9KoEO@9$fS;tC zm}*h607Dc+>~G6vvw<h4rKP2I0fw}iEiwIJs9HcJWI_GkT|gyb>L#ERS^upbM3sXb zzq9YB!)3RjrneyIP7qZb74D8*=HbL((fv?}$PV~L_*dzuAS#F`_s6awA{^{E7W#c% zUPHeNhWy9Y4n&o^V^_I1em(TtsvYRRnaq*6R*R}v7g?$Q(v}3v;&pn2JFl*=Ccc(K z-6v`nASyV1(g1Qt6-D`ZYZs0<jHgE!czTX6ON&MGmHa;tgd;b)5ETw|9z_+D+)d~G z3fmN3O+VvxdK6J5JNs=gbulvlj6j4KFe_dm@Z|;M3tvB@D4pATX>Z$ws1R>$=<7V4 z=r{94*aG*C&$-3S{C_3KD@wd^Egfx192HViFIc^)p|AVghMCd7KKxz101+?vK+BF- zaXd$C%l6_&MdA>_0Yh%A-n{+?mw=*eS^WBmcx)YtlA0P~box1>%EIjO;G0Vy&qfkp zBHd3$NbnVri?Z;3dGO7pj{|1DNXJlAx&88L&Q6iyBdNk~y{AxB#%EqKI+a^_-|jy+ zvG?qNf4)ekz)`^w2_<*jQ<9n<V))-D9{KS-e-_PGwF3`M{!_Al&xNgs3aRNKZ{@%C zoC+k5B%mD3TaY6c`gWfQC5QZ*uoH;YDxl~5#$oeLEWUU00?vnTz&PZ`z+1PYCR9lN b)>QrnyGg&&oa#+%00000NkvXXu0mjf8%(L6 literal 0 HcmV?d00001 diff --git a/chrome/skin/default/zotero/locate-view-online@2x.png b/chrome/skin/default/zotero/locate-view-online@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..850172c0766429e70884a1c7d9a2f40f9775b73b GIT binary patch literal 2340 zcmV+<3ETFGP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F8000Q<Nkl<ZcwU{C zdyHLG6~=%2oO|!wnLE>Yc3yU-kLdtIAGRQo#0LeN))WzhwxBeM#Yfbj;U7eU3C4t= z{-KHS4-z7Y#8(LxB^0D3L?u;-H3boD2RfZjJDtw^b?-g*Joe|g=hS8*RT{GMWv!ii z_Wr)L_S*aIZQ#<{UHk89a&z8ILR*CfWYsH?lNAy^vcnd=X{`>0Hv9AwyPueYcW>`1 z;ET_FdL7a?t=J_gFNqY8k}n0RwepO#&k{ZSn>(I)^F0ap>WjPT126NC&{ri~Nwn9s z(BIO_iiQpfnOf>{c_dNv%gk3woSHq$v5AwMTbLvjL@4Q}WNW__XQX^F9_M1@UwL-V z<v}I$iqJjCxC5<g_|oQ`e15~N477ffAiRq4;zo{7UCH3oy4Zg|R#&sW<2vsCz)rq$ z?QRCz*MP`K`iAw2f4uea?Om6YfiFL|=lz!Gc}eZf`9^MDyM^Zba*mHTF}l!%>t@Kf z4zA<i7!VLeHiq!RkkI$(YM7?KW0uL{7*D=-kg4K4l12!l9s9rV{OkWS19v~SXRRgr zLzR4OQxAJL-ppdLo8KK>&fs`G)*4(O;}~)=vaUn6Y7H2K6IsGg96M8B|I2OUV&Px- z;7<D6dXdy)9dlsEV>>!8D&U?2cP?{?4oK?gUDnO5mv3b_SY+7D6GkBlBaF2;K*ks{ z4rEP&BpWW^R3Tw7)HXy6M>9-XpIw``(c9dWh;XCmz_y=nE4)L1XY`<?{?>dmx5eax zm1#~^=E>Ghvu53KRt+4dt$iBDK*lJBlL&DWC_y5?7;5scx^Em~4WoXU(MplqH*cq< zwh>voIp^8?mkMBSTy(-#3yvH6KFnlPW+*0iFbUEYkuRL1r6m?Ynt@D`ev=4sFsV2f z`ufjejCW!D*`Q2O5jStV9t76v-tCX1Md<*zCcIA~Gtj!4*7_D+E1$!lrFEK$0CKex zWZf|Fvra0+0gMr@3q7kQFs8V)xR4bmyg9lWmow0{8i|4v1>XU1swbSad<MaXdNy&~ zn<TIihy+WU04XAq_ppL6vN1$tEv^&M)iV;?IZ%O8shjb!K92o!J+J<4BY*$<I$j^m zv!(wUkdSoO)<?EBX55^&LsGu0zKxcA6Mvb118}ei07<0HCWsJzkU@%l3)Wiv*lBK^ z!m7gbY&WB$HB<tN7le3~kT8fS2k@tV)bX`#O>{16V{~S`*7f}Dj?fK~=x<)hSU8{T zWl11mWl;*OL?nxB4W&vAL8OGZ5=MA_gxq-+7n&J8ox}G6Dit5E9NXCUD<RhU6dFBd zf`BVJRv`&1=Y|Z@CP}=np`EeHJfNgmosT(fL_`=I=H|NzEm$LLvhO2&Ka8!z=-C`W zSfQ=ENTGfKIg3P;32lIHt2T@U)YH@2i3AwC*@>i;5;WxMC|WOBPiv!;RuNH*Fow03 zQgH=~<pQBBL6ta-p0Xcu?07Tvjf-5qeu(Dg)0oT@mRLYk!OBNU=PgG*%W4W~2CP;& zh-I>(kgcUu{g^0Cx2;-BB%Ao2*Tu|id(scA@MBcMWC@b>ZfGvi(0GP0CJYs(<82bg z1z)OuA5h5GA*qT+M^+~7h)6;<O}7%FbfPe5V|-!-kwhTyBT<RrTbuZPXlZDgNKzf9 zV~DC&skLeJsURXGkpdja&PigyFHvLM3(*HLY%)PTXHNAIR*4d%83?L2f<O=gk@YSJ z2%~^VVFH_oiAcqWoXId>UPJ<GHJ3r0kkmHs6{*YS64eIMlEdZfiOX;V#<9p4go9&5 zTE$=iISwVifa}a(sGS&T_EMWhuaKN^nJ<-)6-aNp8+Q*}D{)n0zMfUhT@04TF#>}j zEO&BtWI4hBAOjLe1}h;_5s}2)Y%L8<(?lvSiP$dj)Bf7}<-9R6$k4<YgbuhHZXc+Z zbX(c4@R1dpc%w8*B#Qy&COVlMuT4oYsZE6dV5^W4>)Q<DlWk<O;AAUUTS?cyN*<*m zvVzMRyLjg4pIP)uApOwY^ogDmk(>E?sZ!3Z>*ynw$uj28fuOG7QCh5}Ty%)6gB*h~ z1`JpXs#-w`5y@d{rh!u<ZM=1&gZ7RE&_WWBjUraX(FdN-3;+Bpk`_u{@TJV-pMAb~ z$FDxQ&!WAD-g=o&ZTJ|+N@G-_0GOxuilewVxF(OSbaUq9I;>;J3f$O&NteOI79}Ea zUC6o&4t3MF@+?+SQhdFIR(^T-0Fn^=`pAPvN)ABe@&k$R*!W4t=O?+QVKqQ{2t{Fn zAS^-V1j|<p;wSrG_~}+8kO*xIz#4<xRK&TNCS)=g3j=ZLPfw5WuQNkP_%?9950C+P zV)yTl?fk`!KSA8P@907He(+OlD)jK`;s`>C5XoXOWV5I7qbsmRME`ZG3?)Jgava>8 zOP(x2*v^&90%~yi+2Log5{Mrk{?6gIF9-lI*}D59uXxpLdEvSzUp>g4t8XN<mNyp9 zfItW(1QCI?$QrB+7=r)+iKOpjTylow*3_Ntq`R=dV}E>#xl$2HFM6%v1Mj$!#rJk! zs<}<l+e1@l_}R-(u`1ilwT*q`O$G!;5Jt^OAy%7~kOP=1oU}F?a$?67<E&XW!J{w! zmZ9-cB)t`&T}QrrB)I6Uc>m}2PZ379NIEq#Gsa_o{T*(_^6|C}3>3PlF&SoN*WftL z#h*0BP?rh0rh9@<uYZdgj`PS1PjYH<3`xU;_Lf(^{mRt4zKnJ~y1k_={RU|(f-AfG zxW4}bwA3{+vQWqHT!F<(mQs`fpf(f45eM`%EYMjfGPN+n!Fa2^ergaaA?cto+1p?G z)=M*&{50FOZ&$83J#(KSc^B3r(b>?(WgWe&Z0k<`QXA_Uki=|hf!X2$LldWYb99K& znF%Bz;aTj%m6qtCB<=6zaaz5-x{?1qEAEt4e(59h|2$MZ!LMxSeE0AJhlk(u>v$=) z{Af#4jiZ}n*lMi?B-<;|CV?VN3JptoQ?iF@2%kQ5|B*|2p8p%e#7HV@ZW-MG0000< KMNUMnLSTYJH*qEa literal 0 HcmV?d00001 diff --git a/chrome/skin/default/zotero/mac/toolbar-advanced-search@2x.png b/chrome/skin/default/zotero/mac/toolbar-advanced-search@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..8a0791b68b9681b2314a450b106875e4335aa6ea GIT binary patch literal 2573 zcmZ`*3piBi8=pijB|<jkUt^fE*36k1q?yJDGZ>o;p{XQ;LsK(z#>~iQ*^pb>T$AJy zNv#UGmi%4HTCpLjMXXfRvhq)^m9l3>m-&0@JkPm&@B90GzxVfk=R40i&e&n6s<KuE zfk3Fz?Wr#C9Vt1Lmcduykt37vZHdsu&KgnFraKG|l==3%g$TrQP06_gaW-=e0wHg} zc4dl~j@wB-5Eskxg}gzmn9GOJ2n1P7f*-k{h=mk$IXodrY=M#@Nbs{H44{xwi0F_7 zis{He+CTyjX@)h$;!qS7Boav$`1+AtsJ0*J@W=vnKqTUm03awR2peRAg#`Wpo=7AD zI08T*U|<AB7|au~#2B7Xe_@hO^H4#dkATe=u^}E(GB3*;3KUtOP!gff$3mSVw%->e zp75hB*dQRu0C+48_!<oqv%f);WWGuB_4(|IA1L5RJ^A_oAP3}vJdqIQ;lC;e_x3aK z|B4i|_zPmvCN6j*ODZS1fI^59C~1Kkk1e7Q$WlX#!(TeGz_Nk3d;usF!ZeE6M~ZB0 zF`oHFhGPCnLpHdW;3QzfPFa$=DEN;8va!YZ-Cq-s4ayKCttT<qVvxh6vf+kGU6{aC zeKoO|XajK|!A?HQ2b2^hrO1R9qop#tza=A+kRkf|kc5HW2SFc^%xb}FCVls<S^j`b zm<)UsO@`kDk|X5H_6w%6L?DHL!<%7nrWo92SG)-cXG${1k%2`RnF=Hs8v)1?K>}9@ z;!vb6xRN2#1Z#qYeJ@6QB$ENjK9bp23!7FNg?BAQ1!jKw0#H<1Zxi1j5DF1=s+B8K z`K9~b10J+BAKC)j{mOb;d7a%S*cta6GA;uS-`BbpBBSi{x%U*g`kstyw2@;8!Hf{b zDlMbff&B9~*cE09xk^@s7|-<wdkghaPjB2fe6hM`bZWFJem=96XU;yXSrVJmKqxbr zXb*WDGBH1|J5c8tX)Cv4KltduZ{3ux)rZ4#n*#gP<-@DC-%&a*-f{X=UV+Ev!(K0z z<#kX_J|EH8LI@e^aVeOMb|bjk$Ei3cKOrpZ0=@1kyhp}r7(6sDYN@q(uU4$Xk#~j0 zwB?pAZFv2A%uP#?ZgpMaAJ&m41FyK}<XNn6(};~c5y3+duRKfeT^V&=neLu5I~S8z zRkSoTG-9V3rz9Zw$-us?H!TIamF)yoQE_}u*|9LQbN;q+V%mLEs<jnL`&R04E!!qP zuQShoL{FKguE_pjFQz#AQhm~fBC_hPS*^L-T@`v7lSzGHylTTe29{YTh3f3ojmuyC zaK7tYW_F{Ke#$jWMnUQHU~X-7-JbR2eLjt^%Jvs4{#H&onEvNw%sTfx3&Vzu<=Z>L zX)|p}Tf{Vl{uU9M<%rtvb%T`NSk<A-yhsFl8;im}DE^pQv#!D$>~t8M&WJ8C>K?UQ z7oL)!m)E8E!q+&4WqZ9D2&)JxG)`A=ZJld7e2Pf$Un!!|7@F!L%k$qzcoBdB?m zqzL(*Yntone{WP%9%zf#j&oUcnmdNwYrJol^1W8x^U~<EtD)6(Gx_zzRkgO)TPiye zZRHIZ@_&_?ih9mRhpDgj)%n?NdUN2NB}Rz8Q%lDwz}#Sk@U*@-w9Y9Sd7QkfJQb5x z1Zk+tYb0s67ZxZSkf%Ux`b|Pw)X0A1z)gExoJq><lR%pIs&l&Hwyeh3W-Wyf4}f@$ zJ9cU``np)h&27n}rxEn#P3igNJF3~_-wTG;O_VaGNBS}`=9vydthMOcG4J4qol}l- za<u`?c}<$TfvcvpFb_A@c#4owq~&DqG5xqHc`$6H0d4nmH3L0Rc{sF<$}&!E^FrnS zWT*BHjdFGmKX)eWQOX4M!P><Cj{otDZQ$R@DAcJrG}u~Pa|?8JlLPuTF()tA*y=@2 zq-{!SN%xFC#7$P8q%)MR3O1-@-Hf_JW5=H`&B8uSn>BNIxbjZ}r?(AfDB3@P8Ao+y z&36Vg&c1&(J|oJTB-G5@NOKWvLVwpDr*%d%x6dWUzy8WjojKhNb_IzIrw2@}^<#z| z2Yw#N6mY>^kE{LZZEy2ON6aQl)}&l4?`UWYnGP<yps&HE1^FwwN4~#TE{HeO!gx3h z@iETZl8f#dJ}<#1*2hnwyWbi=y_C@KU}Cbhen)tLD!tD-=l0M`pS0|jHiQ0-DeJ9i z?#ZE(#^zQRu3K(3c}dI|QM1<krSt5t=AIa{h-}3ptCT8o&p1BoOxMIs>dvI=;eE%3 z*TrU})*R}+toC5#>-plb{tyG**M$$y+9<kVW-U}5N20D~wO_>abeZ<+@+|wcR{ZZD zS7y15<vd!rUGBa1n{@fPaO7rguQF{)bIJ9tv#Vo9-ca``XlopNkf1vGt9S0O;ZU5X zvwI2qpFE}Va;x@B0poYozfXF>A`PB+s*N5ox~If{qMO#Gsx`x};_kGY8>J84S3clq zHOWDvL&!*GaX>?8=#xji)?v`dU*p|xo9Iyhr{&l24RtnpDJYHBZqdBHr&1Mv|1U3T z#DKf_Dy}?P<JhtIHKlKx-^Cc`#V)@<#R`v==2H`NL+K{5X-6vCtEYprh%QH~pHNsA zarVk{_-s=$|H#YOTTSmQZ_I7S)N|c(O7V3o&EjeXgQ2Rs%_d!#B%^a%qQ%#|ClV?e omi7*H_pkp@_2KB7Afs2C+#~NdmlO_GO8(L4v>ntUYp;lZ0s8P4iU0rr literal 0 HcmV?d00001 diff --git a/chrome/skin/default/zotero/mac/toolbar-note-add@2x.png b/chrome/skin/default/zotero/mac/toolbar-note-add@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..b128af16760240799a5d8d80675686b838b8b87c GIT binary patch literal 2664 zcmZ`*2UJtp7JUhcQbf8)afqP_l8!(^2rUQ+9Ya%8LI@fONq%0Cz>MgqAc%_MAY!9@ zR762xXo^aa^5L^6j-r4-MsP$BMDeQ#jFW&RpQUfDSME7`-+lJE@4od?{e0Y2mGzYY z08piQPy?iQgzQvYCcT0Q32&u02pHh*0+e(ZzK{--1RkLv0H|omP6%-3+-d-TnQ#~( zq7ZK{5{n;$W=8TO*l2N#K#B$cvX~@&jA4tI2yqOT2a?1N$OQyR`Ya1$kcb6{DB1xT z;_ZiU<qO$}4QOjL7D-V?AP{6>WE3fYy74nzI&whn6o~{R3??ov4jo58^MyMwI3kgV z!QwG^JW7f{f$=;MQ;gz)#*34DnTN^-SwfCL#NqQ0vU!;i{8*6#5-Ah<dMwr{;zWH@ z;(?!SNeyCT84M1M#e9#(7IS_;lVyHLi)4LuC5RPr7d%C>Fl;V6hRqX!QXcNRa?;*@ zCH`NLVy0kGY@vyZ-pI1bNdat-&yAI}AdtrqQSjsiLrcToI<m-e<;MtwY!H;vC>uUg z<YP<mA>U*uwqG>lgG&j%LXOlaQ&txR_gO$bwiF-wJpuWk96{E4k{?IR=7vx?(uOX$ zAV{nFZel6XmCxl1Hwl<5wydxPid<+ZdO;@iM>28=IbtM>1ja_}VzWeYt0i5tg?HbD zxdS5?CS$&fCQIK0k~cq+6BSQoir5r97PkR~wMJoW7&rn6YfZvilQBy$auvuju0l3b z#1}I7d@g0dMT~5SAfO3osqdwT&tx)2wvXiY)#9dIh)Q=YMOn)H@&%wMr#9`r008g- z8r7K*qBIfY%?)(Zrhv19SKrmHI^5M4)X&(m{;>ycr$^%rtXXq7*Cl16cbASQD?d4< zJ6Gl3xI&fv>veZxR|nrx&kRyL0V}_x{n0ZOS>abY@$<xZjbq}_%{cn(WZH=W`}4a8 zv$O39LveS(s7alf+POzM*coWG`OwO__VN$CdJp22gws!-g(=-OEHeL9Z9L)W^1F(& zbJJnCWj+6Dgh4K(uC52k_kf;*r{*`*_@eK5jc6&>JBOo-VRK1vF5t8e_UqN$yDi=j zAI%$13U-MeEB0AIQdSSArCXS2y_@c)K81}E>-dS>TAm@gw4k`cATP&J+o-Em%ZTT% zx%*-TT(SM?bAi83xt81Et`&D`D61+WOx{F|f+a_<r)z|_TiBO(^q<F>rWX3Wd7PZo zoIj&TQ%`E)IU5*Do*j=o!smkSjio=$DRkW*$f_*u!Rk%Zj{t--O6HUaqcZGk;%RgB zQ1SI`27WB@4ZViOZB7-|k&IM?e?vrvcXW>K<!YZpDi%Q1DP2v8zrt2>-CvJ=GykxQ zAX&BAHEXm$ELdI7b8KE~m8i75jA&CUGszBqs$8Ao*ijX*veU2nccjxsk_Sd_Q(!}a zcbWf|hq;#Bl+!dppk=xf1TNU^z-<(xdXGOpUA<Yc<RI49A*utg+Qq_MVzwWL^}#OB z+Y%)NNHO%cvuSD7YpJG6As<T+Z~bh|iN{Kfdi+!?i5<_Abk?au)g@-({L!ZT_Q+w0 zo(;=Tygt7e4BVyC0i*V3_-`l#n#Iw7W!gck6xC<9JNB*h!CUxPnwn+1*e68;^GGw~ zE)kMW8h6E;c&Zm8bTx7{>1Wz3OP{TXfc+-}c{MBLO8Qa5jE3$AC9z>P;QSkf;Zn~; zLEz~hZHs`lZ;O+?>9*X=H^<zal5G)p%nGA&y!OnS^{qpw4=TK+m=Nq=wW$s3y{J8x zd9}A{$^{=V*+YxQq6TL5gN+g|#^J-lBxVKW$$a~{i?hd|ohQp`Xiy2ovcsVjR$Umv z&>JVdeBr4#Q;tDRi<71^CuXbrn3v}Yj=&$<t^0fD`*F2N(p=x`&T7g}&_dt(qX*Iy zB-wwnB#{LLF$R|or54)Mv77QGc~2ZaQOtABW$UOh!#35>^?6&&pP8B>B&`+M9KD|m zvOKfQ+m7oVs(dxkwx{&{1C3p`u3>MBD!KDE>P+Yi-d^B!UtuWs{838^BX?g>?&bQE zy<DG__2B-Y*d4!%2LC`;F@ik&8=O%YV@32{G5=6`g^jCDr{wI@;Ry`CC{-i3kj&B9 z+DQ*>3Hos4`kDtfr-xdfNUFriYTArnEZs5(Ywm+gAG}IQ!XRV&A!2U&t>L@D?B~r6 zY4iOC;{}zK%S`5qu7y5cW1OqeOx&@W{>ag?>1fqh=}7Vm(18wnHO^L^^1Py^<nGkQ ztM9E!in%iqepY`h7Cm??y#?Ioj`^5OXw|>+i^Prgey^$C!F}$0-VI$K@6nUn;sKQp zs*(8Vm3K1Q%I>>$qU<IJ?`!i04zz5~I4m52yTAibIA}um3-1=jz2QcEi~cD?bY6fu z5o)EN=^*wf4$p{w_@>Ms^JiYSZqmw@#FvJf)ehd<ddlnUhj4=SNM<TE+|)QRWy)x5 zv<8x<p+IgRw_n`TS)Ap$&BZ1zmL3=gZ*DLQ8M_J3xt$Q0;Cl}Gr^L%@d5Sh^Iko(M z#?ZCQAjt~%+@6h()_ar>XRNK0j3&7W+PG<O^V0e}-1+gD$t)cF<$i;Tf!WGyHYF<* z3iB&&(l$@-toAVpI3U^4srui#E-WZHbJDwf>e$v3!gr%hUj44B#z4IAO`Fd2qqj#2 z0%){Lnkg0QH*MNW-~K6HZ%wVo6!3cQ*zCOP<zO$!c$3!8HWSoDqq@{}fxQ~ZUCBhq zR49xW+*xCspmY5+^i-WwC%?Ab@%C7F$4TpqY?C5qv*oiVU&SvE3%)S9XYYu+{U`pa WV;VWeLKa2#`$u#0p_aIW@BatWULza; literal 0 HcmV?d00001 diff --git a/chrome/skin/default/zotero/overlay.css b/chrome/skin/default/zotero/overlay.css index 5f730f8a1..faf9df941 100644 --- a/chrome/skin/default/zotero/overlay.css +++ b/chrome/skin/default/zotero/overlay.css @@ -287,11 +287,6 @@ } -#zotero-tb-tag-selector -{ - list-style-image: url(chrome://zotero/skin/tag-selector.png); -} - #zotero-collections-tree, #zotero-items-tree, #zotero-item-pane > groupbox { margin: 0; @@ -408,7 +403,7 @@ .zotero-menuitem-attachments-file { - list-style-image: url('chrome://zotero/skin/treeitem-attachment-file.png'); + list-style-image: url('chrome://zotero/skin/treeitem.png'); } .zotero-menuitem-attachments-link @@ -668,4 +663,35 @@ .zotero-box-label { margin-left: 3px !important; -} \ No newline at end of file +} + + +/* BEGIN 2X BLOCK -- DO NOT EDIT MANUALLY -- USE 2XIZE */ +@media (min-resolution: 1.5dppx) { + #zotero-tb-collection-add { list-style-image: url('chrome://zotero/skin/toolbar-collection-add@2x.png'); } + #zotero-tb-actions-menu { list-style-image: url('chrome://zotero/skin/cog@2x.png'); } + #zotero-tb-add { list-style-image: url('chrome://zotero/skin/toolbar-item-add@2x.png'); } + #zotero-tb-attachment-add { list-style-image: url('chrome://zotero/skin/attach@2x.png'); } + #zotero-tb-note-add { list-style-image: url('chrome://zotero/skin/toolbar-note-add@2x.png'); } + #zotero-menuitem-note { list-style-image: url('chrome://zotero/skin/treeitem-note@2x.png'); } + .zotero-menuitem-new-saved-search { list-style-image: url('chrome://zotero/skin/treesource-search@2x.png'); } + .zotero-menuitem-show-duplicates { list-style-image: url('chrome://zotero/skin/treesource-duplicates@2x.png'); } + .zotero-menuitem-show-unfiled { list-style-image: url('chrome://zotero/skin/treesource-unfiled@2x.png'); } + .zotero-menuitem-new-collection { list-style-image: url('chrome://zotero/skin/toolbar-collection-add@2x.png'); } + .zotero-menuitem-edit-collection { list-style-image: url('chrome://zotero/skin/toolbar-collection-edit@2x.png'); } + .zotero-menuitem-delete-collection { list-style-image: url('chrome://zotero/skin/toolbar-collection-delete@2x.png'); } + .zotero-menuitem-show-in-library { list-style-image: url('chrome://zotero/skin/treesource-library@2x.png'); } + .zotero-menuitem-move-to-trash { list-style-image: url('chrome://zotero/skin/treesource-trash-full@2x.png'); } + .zotero-menuitem-attach-note { list-style-image: url('chrome://zotero/skin/toolbar-note-add@2x.png'); } + .zotero-menuitem-attach { list-style-image: url('chrome://zotero/skin/attach@2x.png'); } + .zotero-menuitem-attachments-file { list-style-image: url('chrome://zotero/skin/treeitem@2x.png'); } + .zotero-menuitem-attachments-link { list-style-image: url('chrome://zotero/skin/treeitem-attachment-link@2x.png'); } + .zotero-menuitem-attachments-web-link { list-style-image: url('chrome://zotero/skin/treeitem-attachment-web-link@2x.png'); } + .zotero-menuitem-create-report { list-style-image: url('chrome://zotero/skin/treeitem-report@2x.png'); } + #zotero-tb-advanced-search { list-style-image: url('chrome://zotero/skin/toolbar-advanced-search@2x.png'); } + #zotero-tb-locate { list-style-image: url('chrome://zotero/skin/toolbar-go-arrow@2x.png'); } + #zotero-tb-sync-storage-cancel { list-style-image: url(chrome://zotero/skin/control_stop_blue@2x.png); margin-right: 0; } + #zotero-tb-sync-error, #zotero-tb-sync-error[mode=warning] { list-style-image: url(chrome://zotero/skin/error@2x.png); } + #zotero-tb-sync-error[mode=error] { list-style-image: url(chrome://zotero/skin/exclamation@2x.png); } + #zotero-pane-stack[fullscreenmode="true"] #zotero-tb-fullscreen { list-style-image: url('chrome://zotero/skin/toolbar-fullscreen-top@2x.png'); } +} diff --git a/chrome/skin/default/zotero/page-white-add@2x.png b/chrome/skin/default/zotero/page-white-add@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d7dfbb3008af88cad93efd6338de3f819edd008d GIT binary patch literal 896 zcmV-`1AqL9P)<h;3K|Lk000e1NJLTq001BW001Be0{{R3M5Kzw0004@P)t-s00000 z000sa5&!@I0002x<>deX00000<mBWI4i4nx<UCs`87L9}0032iJW+r(N_sF)eKb*d zHc5CbM|UezfH_2UDMNH9KyoBOawJ1*C_!>0K5!yCS|?9@G(d49EmRsAC=NYkC`EEB zMs_MhbSOV=B{f|h6eA4(|Nr{>`tb1ZVv9;cbSG_-S6+xlT7^NK#dlzeNJVuiNq8+( zfjdWcD|w+_QGPa9gg;GtGW`7f^z`)o{r&g%_ww@c@$vDOzIg8L?x)OzqRD=KplhDS zc}sdQpvZig!*liZ_3iELrOSf&`1t$#`|t1Xo5XdO!g2HS^IV5S`T6<&{{Hs%_M^&x zWsOdizi*1NZLPzhW{yv!$${$X>XW{0ufwD5@auV<W|O*dhq7gYuU_oz?0u(RtHGXa zm{NkGZ(NE!Ymrr?$b#|p?_Y^XdZb%ynM<O_f0DX!XOL0I*1&6$Ri?^==H}*Slu4@2 zi1POF<>lq;>+7k_hRoT-u*IZqnNpU)Z-cL1RDe2YluC%QWtPEl#?`)*z;0fRKiT^j zZvX%QDRfd!Q#JrP8!+z>8Sgmjdq*$!Qh)Cg&hq~9&VTO{{!)GR_IF2`)%W++nL)Dg zVTJ$z0cA-<K~#8NebZHQ-7pY<Q8{qK%*<_NxXjGV7-nW>PWe|yj$=<EYqGC8JG0+| z07WSpfPAW`_d%cn0HTlp08loyHAs8~ZmY{c`6p1YCG!bq)Sh)S-WY`QqL2V|@S+&C zyO4m8xx1_sgair>8_kQX%bkKSDhUZ7k)-oZUN8{S??MEUNH~l3tV?VGAAxWv{dOoB z;3?}kz*Ay4z*D?9z*AB<z*86;;3;k#$Wm}1OCbO$WodC+xf__NmjEWt&RMN0r?xcK zk-@_xYx3+JpF9~lnn>VA$xdJ2`{E`4hPkDc03KNrdWX;-4qjQC2_T^LpnV9#LCtEY zjQ~zn7e0Zer}XUvFq@l;3m~#!>?D9?^-9SfM*ES>ny!lgHZ5D|KD3{C-r>3lVE@2y z7}TWE`w`dEO91fiPxG(efBwDv=lc4|pLbx;8qyne+|V$^1BG0SjE;>@eEa@GK~b;X WWSYW<d=?=90000<MNUMnLSTZC`ms;| literal 0 HcmV?d00001 diff --git a/chrome/skin/default/zotero/tag-automatic@2x.png b/chrome/skin/default/zotero/tag-automatic@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..e355ab21452460d7156814e272ba7dc7e6e72edf GIT binary patch literal 832 zcmV-G1Hb%<P)<h;3K|Lk000e1NJLTq001BW001Be0{{R3M5Kzw0003~P)t-s00021 ztE;oKv%S5&!^6YJ$H%+7ySKNuzrVk=wY9mqxv#IU#l^*~t*x@MvcbW@zrVl9$;rXN z!K<sQ$H&L9v9bUE|NX&}&CSio$jH*t($Ue;(9qD#%*^8A;>*j+{lb&s;o-{4%KqHK z&d$#Lyo&wZ#Lv&q$;rvw+}!2m<=5BO+1c6s-NWDC-?Ou`{I!0ywYB})zx~0Ix3{<Z zx`_O}jIFJ${I`PG*x3ENi`LfGyu7@<y}kY1!^FhI{Iq?zxVXW=!N0%1{Jo9)xP-2* zuCTDM!^6YI#>V`%fc(CV{oBB-tgQRFh2GxY{I-AN<Kx@g+x)nL{oKOZ+S;<RvirJ+ zy1Kgl{{H*BiTu5b$H&Li)YSgn#NgoI{k@F++rj<WzWlz9`@D+%*}eV3l>Oeu{JV$! zyNUd~iv7EY)6>)a*Sh?>h~3@Y`@4t)6o%gb000(rQchC<fPjF2fPjF2fPjF2fOm*@ zh=7Q9fK?63&j0`chDk(0RCr!>&(*TrFc3vi55mQu%rMN%OqZFN8I$}!#_k?h?6`bh z_fkosE<ZSq7vd3y5#><g2W6S5v#iGgIF1+=T%EB1o){<f-TwhzAmlW~@w=xeax34= zK!_8P((acCZhPc6fp~-vUZyCPA(LH?zZgM84MNBWNV4lP07ebF>i;f+Y6^!@bi4*2 zs*jWyF{nQBZcr$J*gKh`^ocUTY5nEb4vOT^rvo{p_weAoOh?zQP*egF5K8<zU#4mL zt+9c(6rBhXtlri0+FJX!AP(~=zOpF*pM_T%rkpQ6gJ>Vkf$*$KAWAz?=!#O?IsnmJ zo(3_~529F8g`#cYxCbJ=Gz-GLf?}i5QgG|lEQ-1V#QaD?v3~>o>Hg1IOaqzC?-a~G z&VhJbtWElZ_LcUggPP3M-3D>6wSYZl=qNhBQ5>&ZI?j8N1ktNnJ8o)-B5UdTe3d;A zF}+(BC?0~)yLHZd#=fICYT9<(&*e0B+f6T}q1$h^j@^C^bN>tOnOu1nk2i4u0000< KMNUMnLSTYz!{m_w literal 0 HcmV?d00001 diff --git a/chrome/skin/default/zotero/tag-selector-menu@2x.png b/chrome/skin/default/zotero/tag-selector-menu@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..138de1e6e753d1024b1e83767c218c7b8abce482 GIT binary patch literal 171 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvxd5LKS0Mc_Kl}fx;tyBTFTCCq za3(il!|RBu4L4`s{a?N@;)Kn9pbEy4AirP+hi5m^fE;U27srr_xV<MXGB6l$I2>F) z!HG+A350kn@NIM1{NvI}O{<d9x(lDbb77geQ=&Z7wcOa)`r~OvKRMIW9L2@fKw}s@ MUHx3vIVCg!01SpbTL1t6 literal 0 HcmV?d00001 diff --git a/chrome/skin/default/zotero/tag-selector.png b/chrome/skin/default/zotero/tag-selector.png deleted file mode 100644 index d4c1613e955a0edee60147adcd92d5660b1cb644..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 877 zcmV-z1CsoSP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU#4@pEpRCwBCQ%!HvSQI_)+1QEmO&Vy` z&=d$I%7{%_j98#*7EBAOSd28%tU5^j18i6h<>$Zx*dcX+5DSDDXer6ik2smqOlhkU zH@1`5v19wqb3h2nl`QMsci%nd-g_=#jNx0`+1X*aTn?V+K@bF(ris11y=B*R=Lds< z7y9`h{5*`IIA)S0q2KSb?d|R7wrx9OV`C`f$7d;}k2#ofJpP9SAtT3em|++%HLaz2 zJ_AdQqHrcZ&lx>Do`f7Pq1kM*d_Ip3r%tHgztH2tmQL{7Ss>E+59_u1vTgV0z0dX| z1CHEwT?eUj8n2AFu+}0t!K0ou0VjC|rQ*3+Q53$GLpC-xTCyxh2_XoA0Nrj^U_l^F zO<f?W9mBJa3{jEaeIYtG0SN66c)z~6Y+2SV${)ujCMJ|vET-^=DdlommSmZ1ZPidx zdbnNy>_GrZ0Mi9t9x&uaa)?GFvmCHMIdY(B8a6jK?=%{Xswh$@ih^V+h1Io+Tab8? zNeaUWFvdyGWV?7*sXCf=^am&Onud)?BofGGvv=Z&=%{w+z;!%?<Ks-EmDLIx7drU8 zNb$=l3w!E6_|$6M=jabYaLNV2<79B^rxKCz+|x&ga0d=T-}Lk}&X13fwKsnwX&>M~ zt>9$#BnoHG{~3?RZ-+e*78VvxaAnP;GbyaEn!`_y@|xuylIaYTRuz%mSE%k=$lEF= zMID*qW%RvZuGj18!s6oMvv#{py@59~RUSp)1NDl}S@b}q4l<KJAre?n^g2e95{S7E zYJSAXr5WhDIVXnW<1$_1J3s>F|8?bBaX7B^6$Z=F;q&<wOTXeY<#TMVARt^6(G0Ys zHoxyx#jlbi<Zh$>FY`U`?v-mL_*}w*kcMOLVymX2ba58M4;M_t{>aa$ti6428v2cI z6AYQCYJ+*czjXC_IqWtnmBX5C^`H2@f4f|s$Kj_|__${1M>i-HcE#@&<8zXGb+v(R zr?<paS=HOdO|FX%jk;>|x}BlV(Azf&q0KP<e*p#nguR;6(p5|i00000NkvXXu0mjf D#5kV< diff --git a/chrome/skin/default/zotero/tag@2x.png b/chrome/skin/default/zotero/tag@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..8e66dde3c564741814bf3695acae2ca52e212875 GIT binary patch literal 821 zcmV-51Iqk~P)<h;3K|Lk000e1NJLTq001BW001Be0{{R3M5Kzw0003>P)t-s00021 ztE;oKv%S5&zrVl7$H%p`wZ+B7xw*N+!^69~yRWaWx3{;gt*ybq!LqWl!NI}F$;rRJ zzpJaO$H&L9v9bUE|IpCT;^N|!(*4cN&C=4+$jHdi(b3Gz%!thU{{H^T%F2bz{maYC z&(F`v$;svA<(1R@mec*0)c(W6!-mZLwY9a0%=)3&|FW{Oip=?k%>2&I&ezx1;o;%N z#>U0v{JOfj#Kgp|uCBeky|c5kquKwZ+W*19!Q<oO*x1;ut*yMgyu#)Fu&}V)+}x<! z|G2ogtgNis+S=aU-rL*TzrVlP+1bYD|BKA|-{0TE<^96t{kONbsoej><@}b^{-@jj z*4Ea?=l-PH|Gwn@#O3{&)c&H`|J~i)#^?UQ<on>@;Kk+p$H&Li)YO&I{GizX$mjj0 z+W(f*{-4+X)6>(y<ozYn)iwYC02XvoPE!DYfPjF2fPjF2fPjF2fOm+9cZhd@&EOb* z0004mNkl<ZcwTkR)pp!K5Jgc9nJH9a7-nW>Gc!BP`Ttj2RZ^l!FWuL(8@MmOWm)AT zB}vl4!RT9#*-TfI00U$h9II648K8o5LSykipz;7lOji2_iR0ATEZ`#mG4p)^XuCcC z42YBf)G)^>5?K4V|Jn&kFM$s_0Zdyy2asMuKdLC7D*$l#p2TR$0W<(ZkhF>cFb;*r zDE8_Le}NVTn%OTe)2DRD)`|_nLAxJ@lINSr;th$jIST}%|IVLpUR}kDC-h3jOCYM) zJ!$qI-GokJr%mFO5<_qodcfYj74`2ZuJh|C0#$*oNGGv(I`QlUios+V#eAcJ;<We^ z`(sYDM7g<&VlhSHq?o{-`z97FG4!C==m{kB1omHF3r95*9BjYgaQ^*c6o2%%)sH@y z-`w_a)_kp96!%$?`X@&xF?vFAkrkOvTdGe<6xdE%*s=uE?X8^cp{UuN*<5A^h27bC z+XwEQM1J7fY40Xw>aJUEma)5Ubx7TPp4t8kp$1|MQ`<_+00000NkvXXu0mjf19IRr literal 0 HcmV?d00001 diff --git a/chrome/skin/default/zotero/toolbar-advanced-search@2x.png b/chrome/skin/default/zotero/toolbar-advanced-search@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9d8b23d95be90de10b6062751d64983ada98a2bf GIT binary patch literal 1247 zcmV<51R(o~P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800006VoOIv0RI60 z0RN!9r;`8x1e8fcK~z|U?UqewTxAr7pL_58Cux#Sg#HL^!D?$ZLX}e76hV++YYI)! zU3DW;s0xa>%R<~#sxHKh;15_~+S2Nj7K+e~w79U<wuwcni8gK8hRh_BnYo#{bI<Ey zGNFH|GbOsw!-aeA`Ofe@-?`^IbKt*j&b=0o{i=9SDh!x8J0yEdrtT17q4G#)!%&B( z3eyMo^sTQfIY9QO*_|fsm1(U>n2E++vif`7H>#Swx$CJ_hn55&laZHvq`1$dJu(rG zI;2w`?MauY=O9Ei5cyJ#iRlU@zlJ12vky9_R=+Vg=!C5RL~eH^HxxfK({3bIcSq@I z_ZBdvI<pstWXxklSDdT4IWA3<ka%sXYup81z3&WU&lUR3IE=))o*2uLE)w`PqZ|ke zL4fN(BI1yYx(LY4R{3#snlLoUcy4#!nrzDeCr6bi%*_5Q)7l4@*LPkM%#=d{6V$Ky zEY$B2&!H>f;ke@Rq|e36Gni>qPHkheh3PgP3WZ|7Ol#v&hjhD#0W<#M;sSzD<op^Y zSe;Iiig}o{&H`_Hvl&<bP-y)ok#6$<@T(#S7Z<NT*JJ#ufdi}3Da=Huu)k%1P}*cB z+7oq`U$egzZ>;%2J$CuB*!(forq(lHT456Lh=T-SO-+dd1fhd~M9gdSh*d2EnB<rV zYlt){e#;sxG_2MEOjjhM8q@_m*J)Zj;@18CT-fNAS6T*;?5vr{6$20?qHc3LpN~aw zJzuUDq1l=H$N)#o#I<|{6C|Pzk%cTQF7CPYhGY_B*Jd#Z2adE1P>lB+GTAT1xf)k< zb0FwSdPLks>S4YSb<ZE$->wuWl&eH5lf{QG4jpe9;N{1iz(TzxiAxhDa>W4072PS1 zj<`qEa~8fw)OA>v^hl>XTnBFC%Ul@Cq0m@y`K$JbKYl3l`j%uf0C)Twe)8@3y9RGd z;-QsotWKxuQMXk)0uzi*%y91a92Odn#z%>rd5>z<M+#3^E!sc${%OA@fJ{c-RM+@E zneCB8Djs1~I!U@CMj{bGg0f%Z#<b7awOM9L6=Y(4Y>X#YOi?N382;`ERlkT#Cs6F3 z5Q`2ZA07K+r(}CWX>DWpSQtcZ8c@8-bb00Ym#Oa3c{Xf$mbT6w%7r{5r@p4*&mxg^ zJF7bfhlZ<n({b<S1lZlT=Ab#X4Pj_6nCT12M$9y4(wvz_O!^$-`Q`r91D*LF_Sb?6 zBd5Nhn7dB0t%HqQ`iRDoNVYAQcC(As#64%iW-T++8*@vkgOawnkr*2{KSSHH9{ggS z3#YPF{30f0<7w{5#G)B!#Ri9ltJYTDDUq#JeTGjTrI^1?BGp0f=02kFB%p1TNqgt^ z-!2J21A;%-?U1y;R;@7n{c%b&QzTODY<%MB`l-QQ$qeBABLDz{2M&a8XYis-*`QM9 z{OP02&P?LD9)=;|j`VK5<+CqI4cu;-q25?^iUUI1=XZ|GK>Bpo$G^UGbL^64pkaeU z!_`=t0Ze;MVNqstGJO_S+?FQhC9#u3TO*l)-q^n`{J%A8e*u&tJ7h-Awb}px002ov JPDHLkV1oYWTfhJS literal 0 HcmV?d00001 diff --git a/chrome/skin/default/zotero/toolbar-collection-add@2x.png b/chrome/skin/default/zotero/toolbar-collection-add@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..7df8496c430fbf07488670acee02a3b1aa6bab93 GIT binary patch literal 999 zcmV<D0~q{?P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F8000B7Nkl<ZcwX&Q zOK6-`6#niQqBhASnszLinvQ8qT9gv#^o0#n1UFLK)D)x}Hwp?$T?tZ(6~Tpqh=PLH zjV?4Br9|8aifP^0lpv&S>`X?b=0UB^q)FzLx!=*=`Jepr$i&&%Z#bNDnEUg6=W+iZ z|9jlQ9Vk1vIvW2$fP-~D{(b+U3r{pez^`X_3D$!U2Kx_PJpbPXd|eXIcjN*f0zd%J zcrm%hJb7aDany+vlzOHA$oRJa&;%Q_ywD~JlAD<RoTwK)fP4fX<`+OQ&L+!U`v5{h zD8@UnF2&&;ubOiYKmDB}T6{vw3r~&?0l-#R2zCI3h()Ry6roEoK!;4qj)$H&*s-7h zZJg6`>XHCB)q6z=ZjQeLbyo-~6!Lgw=K<fm@tKk+4G)4Na2HQ&2qn-3SR(2NArObB z(g@tPYH!Q^BJPgFu^~FRww6PjAB4UURJ{eR0RIl$vw1)6?b_#@Lyg4~|9?IKRc}Gt z_7iqoam$&T1~Zo+QUolk6gO{v0jM?t3BCuaZaK44(3#8CiQU{SVyzu0-a22Vl2vbB zF<#E)aW3^YCg+xLV<iugxWD~f?2PR|PZ4MdNv$O$z+An=#x7n<<I9Qb$gZw}LXb3m zA(KL4Hi;%_#o@LrY=oSMmI+JKW)5K1m@sGMxk|CIi9c`Rv+;RD{y=0S_QnVB<iP{~ z+GE(adjOG5oybuzl5WP(>D@=mjlh~W4RP&?-F!J;z!wuYpsBIFe;Z<3q7W%nuLQWS zqaE>qN0CUiV)DuqC~{`#^*ukj9ni+?`&^^qU_LgTMy6mY_mMxl>m-iHPdWKRTce0X zIzh4{uL>^*MqqDwZDN1?%Us3~bU)Z-lNqyNa%v+a*1g5#LVY+ef~BQfMnGX{5hB{O z*l)VbNHngm6hRX0tu0RFUOcz=E#p7^={1DgHW)D!_EvrsGrtyM=az_et5%{=2^2b} zN#ECS1`5&nGs9R9+N2XJR9IMCL`O#$pa1*@DD+lt6Pq(6AtFg<2ZZt>h*?mu9_wS) z5L`|D?(P6}pmMo=Ch?oqf#O+(2I1J-gPT+lNeaV#+hXYL>9&RV$S+SNaV3!isnel+ zQ?Eh;G5qF%V<LKl)XH4P?kK|Tt)OTuEToZ0{ehXed5~H(IXw1$>MMl?<LIe9$2Ir~ z$rgJICGU)7Swo&5dvAIK02CSz44vK?$rnN|3H4JHK4OtyqSoIOi}?85hsnQS;UB_C VJDczXKTZGu002ovPDHLkV1lpN&42&^ literal 0 HcmV?d00001 diff --git a/chrome/skin/default/zotero/toolbar-collection-delete@2x.png b/chrome/skin/default/zotero/toolbar-collection-delete@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..302015f217aacf42fc44b05f86ab3a7d32d98c55 GIT binary patch literal 985 zcmV;~119{5P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F8000A^Nkl<ZcwX(4 z&2N-t6vcnf*mMe|Uqh*dN(57=1W5#m)CI<m7!r_=B5X7<E--3>(Z9eyz{HIUjVA2e zus}m<M5ESdFf3X_noz9Ls!`CU(9+JdGt-%Q?=jB2nI}`;8Qa>OoXO2SH?uhBempP# zd)&ocI70l~zxNx#6D$jEpy%-5)2m|Or}K}9l_19cp2I&}{O<-nDH+&)Y!D<sfB{0K z+J~>X*8e2S#4kAade5<;&j9KOfrVLCAto&rw#wRAE*=2A2W(knKmcX2>>uwUGh_;L z$b%AZ-ti_NwjKGhY+4mYqm7UC_W|4w5Iq45DHILtP7^_igO$Y;xgPVp#>BjV0D$ty zEhrhlcaJwErib3f-4nybV)*QQy(rhWKL;2DctotgA6^jnk$VFWnpi#zA+J+?1p<Y_ ze&iJ<;vIWg+qHjbBS+;QGB7-9y#jBb@&+0@A7jm?UjJHZA0Ar#pW#vK6*N8gMwwT; za?6fm=@Fy?gi(#xcfJg@R-lOQK&>mc%qT(nYHeX(`zDq;fkN_PL?`(gVxAXLb4*?u zWoGmS3)6Feh;JAs@o+De4T#mp{_O}2EV~S0&!;Yr^ZU6$3c0*LLWz9xDyi`iTnt(s zN)Q5X#lnywge(h|DTXW?*4bzt#`N$wzn;BR6i;;TWXJIr+4ItAcE50nZ3mvEwQDn0 zFm4auV&F*Y@yHbj0ag-LVaYo#%+2%Lxglg?%i{;>*tHwwGgvNzb7Ea<3v2g1%9`dz z{=71Rq%&XjHGS(R5QKq&RJ-Gddh+{g1le4%b1z;B{gd;h+`hS!rVVW%wYt1cN31}A zmMHA`?H~UFiF<eLsVZ){bdj&$*p3i_qj#(zl}Z94mzqTiK!rsSM64uWVJZ!XHEpd$ z;l@L65rxTjo+2K1AR(!{`lr|ymL%+7i6IGF$lz3<3c|@`kpvjtK)?+gT@z<cuoAdB z2Mc0;;yR6OEzErMO2ycVJd8|o77&QBvH_W1b<TYN+QbUb&=My#pJU?6Ww!S2t17O1 zhN+1ekU%=`SS5USvU7vwb7LkoclK<jW9xm9;y15PaceS-%w}SR`fkT6;_D-clg{ZZ zl56Tnuzq8LhIp*F^Ym<z>4_Oq$ps|IVJDvXJom9<l`(L%?RlAfh}0-Vc<tc%oSdCH za3OaVz_I$^i@tRob$MQsxkJKshT<bapBAWl|KNqWn}qlqTJQ*DstHhV00000NkvXX Hu0mjfLmbW+ literal 0 HcmV?d00001 diff --git a/chrome/skin/default/zotero/toolbar-collection-edit@2x.png b/chrome/skin/default/zotero/toolbar-collection-edit@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c69654396a6f8906d97fa728e618376bd092079b GIT binary patch literal 1251 zcmV<91RVQ`P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F8000E4Nkl<ZcwX(6 zUu=`r8^=HAZM&{r%YF=g0|wh*hHWrFKp0>`fEfP~K*Ehz##_7~8e`(EF)<;UXkv^B z7v8BiTo45zN(9Vsu)l1;{<N?^Y%FDCtnJ!$E$w@b?Q7rEwrMxOJNYJ0p6A^3^F7aV z&Uwp!UeEPh!YsUJcU)GmpC^*I)Nr`tm4C&6=cktxPa}=J4Trm~KD&W4h5_o2c7RfV z0;G|Zxi%xS=FZszJfVgW;zYyI&hr3POv!XsG7F|uE?8!-CB>y%k;xE3A*?YF)PedI zSes)&0hlnN<6onsOomG3OsyL=OE!D}DApgjXqralbZDyQ6psd5P|}8!DH9qt#}u0N zaV<cOflQ%P8mh~D6S`4nI-yK(HvCclclhu8fzT{e?|cu7wG97AD-VaS<8aTAZ$QV8 z*>b5H20-SR(2bgz&d(7R4WVgdvM_Qq;9=G`glk0;A>T+6?m!c;tac|d5yL;$P3xC? z94~)(ZC=Y7fi!2F0_g@&>RFLCp;Jh)kcX(hpCvW>sNA{_i;x8GT?IXkN=8N1=42MQ z?9Pu0j3C`sJ*(weU9eZ~z`1&F&W(_SMt>kWbDOeNuTs9g8GUYm^6E1DLoLX7jQ>?_ zBM}XNP{@R~vFI(x7|1>Yr7QQ~sM?)(Tf$?f2@U^<b43ciCk0Q&AnwX2BwPeWIth$+ zqm)3C0*g}ZMQ?$-@qM!{c*<pT2pQ>P?qMf$6CHVQ8S|mpS5dL4k)>N|nCiSp;O+yg zmIzHJTE5CMpz_~=qNiNW528o<iA;7d_n-&os)Lljup<v{DQir|1|HqGK=|$$HftPF zG6z7>4kTu;f=U>n(is)cT1Te3lJJ`g!e?&$LZD|b*@-s^+&v8vQ)rlyMr2wpqo{Ns z=Z(m$qXZ|e6ZZ8k5<Wo1*264sKAPbG1rMP@8KB%9oAvZ)JK;$$73&Ty3hr9Bgr(aL z0m|eQ9DxA`335IcY~%?~8$sV)R@5J1S^dt1;cH#E*ICV%)8rI>2|<D~I*_;fp__m5 zaD0rlTi#-2Q}ZI=&Lmtjx@mscOirOQV4m{Kywka_?FvJEBUqB4>KAtvg!^y)iUF@J zO&TEc8!8PjQjrmaLbHJ4aVUsVy0P<t_EyI3KA^U48<FrR@lYRX-kS%X?!7>;>o)c( z8~i^`IF#vNA{@@*02F_UWz2y0w_V5EKgp);Z?L{`H&@P`<WAcq>KZIr@CV)JneOPt zRc)iBDvpu{7|;z9h5kPXvlu+N`96Zx<mj?*79rs6cfWu{j1f-@Ue9GVZmXt#*8!~V zCdNC?;cM@q424}JScJwKKfYCy^Af7#LWonKs>leb6dD5gID(3WSmUrE>Y5qs?&7}p zXB?#$hzG+|STyWf0u&2rLMU-O(}4x_&50T%G}yoUAj?YxT8R^3FGsgI85-)rH`0mQ zX8-=RPkP_sDWtK0Jolq03A4kk`2CYm;zl^ixi>M4ci<X!i}lRY!p#vB)pRfcM1cTe zvI}vm3k?AXDqW?&9s2b4F@R?>uvilfYf1ru1S-o)e?Ruw!0SAt{sIApl^6uzhNA!g N002ovPDHLkV1kl~NxJ|5 literal 0 HcmV?d00001 diff --git a/chrome/skin/default/zotero/toolbar-fullscreen-top@2x.png b/chrome/skin/default/zotero/toolbar-fullscreen-top@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..b2b090b20d5317c9fa8b26dac8bd73594d38817f GIT binary patch literal 911 zcmV;A191F_P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800006VoOIv0RI60 z0RN!9r;`8x14KzgK~z|U<(AKH3}G0@zwhjpR4GkJ)6lXUBoZM~Bo&m##hnWmanQt# zL_{RE;z#137wLb%p%ND^M1nZzg-RsoY*kbUx^yEXy50BrI?OvWZ+B*QXX(0llG&a2 z$GqR~`+1&uGr<2I3IMXhZ@L`lK?-+)SWXgg7l_#YB;z3SLOvF8P7R&t84nC(hu?HL z)Xzz_)n4Rp445%+nj)KqPVRmW0BHw$kYrm^I*sN<%}Ax3hM=A;&f@c@FZl8OXPb~$ z0UQ7Thr)d%(cIEFaR6vq(1iAmcAv&Rzdudk5|WtyS|~@=m=t)|($K)4E>fq#^0A14 z^M^My48I-6t~`i0@UMbWfq)-{A4P)~AOJAD_omrx?>VpS^}`x7(?Jkx+LxHQH4G>P zfC^BAB0!~l?@-n+04OL=)SC#UJTZi$!OVa_Z3DiHG7mGd9H5M5B{AD<fUbf8i4us2 z`MA9;La8cZAQTm-jIi=oNKC+=sm%H`1Vi+Z`ydVe0`@#u?F0rK826RX!_RX<8gtt9 z5Qr%vMH;lGNF!oa-O#Hi1_Touu(4T16q^Phl9nJ1Wo!67wax)Qg>&7Pp$9@bhQ{ef zM<H56Yk_Dn{~EgFwQnA|lbk>VecUVN7pXz7wT6@|;W8t2q@V&`pN1uDqnDB=x@Y}f zXbOY^5y8EuccHaZF;JEhN16SaT!sfubsF02-WJ!?(1u2G0wIPfr<>_z_{#c1wzyCN zV|ApUf>@1n-zzpfM_edDZPa1F)Vy^b#KrK7>$v^$R<!7Bago5-p36Pn_(DNTaeHM0 zN#o$gLr5Wo;n5pd*S-#2D^^Fug@V4GK8Og$-%Vi5eT9~p9cV4>1aK`d@PXvY<Aaau z{;VRGA=TQA*TpCJRh&VlBQr-_(@Tl_HV1dy#bP5);=R8ShhRU!kJUalt6k|rH`0Zz z$W6L%C*7#{L=JAw7Uu_0_g7EwAH@E_z1foJb8A;+u%<H;ijR*$gaacNo@L{nOU;*o z+}*biGku+E>RY~7G?AaqV=U)_ngb&j<HhII002zfpM2QWyHe%9PW4XZ^PtuPBbP=i liZ?8J&Th$WJF_{F@NfNthcXks2d)4B002ovPDHLkV1nbRsdxYY literal 0 HcmV?d00001 diff --git a/chrome/skin/default/zotero/toolbar-go-arrow@2x.png b/chrome/skin/default/zotero/toolbar-go-arrow@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..e22b0cd26e279cf7efe3174dbedf4b8a39d9fac8 GIT binary patch literal 591 zcmV-V0<iswP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800006VoOIv0RI60 z0RN!9r;`8x0t87!K~z|U?Uu1?6hRop-yKm7B-n_?a}^5-qA_<6FA@<88^J~qOF<Be zG=hx~xngsbIf9@BVqszHzhJ8nquvFBy?P<B3W+F25}fxeZf;$Z>}>WH(zvhLompmn zZ{9b<ERZQvrvF{JZU^3cRuUzU8hbJNvEJ=G`ECbNf)QcBi5pK(jqkbvBZ4AG!qE8F zruw@wks<+t6#5U9KncG=|H_jSiB0rGeYo?yB8oxOl+bCDZ8$}o@rHq14)creK+wPZ z`1r4v_rC0SPedj_5he<5+eU&QoGuPwpg7bqJ8|ieH=a5HV<A_|w;=(7APa22|Jyfk zq=F5zf%(M-DESvBi+FYaYpfAx0#pbZer|&QT>k+<C?6fcpjWZ!&_7>47;7Lhflk~4 zAPGy~K07B8gu<SED0#y$BATr?pyZ!@cmRzD%aKN+4Uj?o0mUr@q6reo=kh@bMHXD+ z9DBf)z((D-|Cj|}OIg;|zoW3X7lP1i&7!d|V-r+uuDTkzdZ&TTP7lMd&E}J^6;6Rt zZLYfFgaeMd;QI7Qg^yeN_-#6pB5sY`g(Q4fdXKlCUfcei!DA8#gS9Q(*i+J6m_?&C zlNjzyAWj!14~rto-njrSvEHn%jwP8V^<B`06O?L6;eewAu?G0}o{*3z_OMd_52S%- d%9IHJ{s8(t_#(h|xDNmT002ovPDHLkV1k4C1up;q literal 0 HcmV?d00001 diff --git a/chrome/skin/default/zotero/toolbar-item-add@2x.png b/chrome/skin/default/zotero/toolbar-item-add@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..6813812f30c51c4f9b72e1c02936e6ba8ff1f3ff GIT binary patch literal 1506 zcmV<81s(c{P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F8000H4Nkl<ZcwX&S zT}+&18a*Gw2m>=PLkn0~ED<`wfKU*sZBf$;qq|KL6-!&=&1NrF_rl%mURb@T(L_y6 z%x<>b3*&_sW@%QJrJK?;rrRId%J!E^Ed!O(v;#v6BW0Lj`03319Q6&<uYThQ+PmG8 zJbAzOX3m*&p6`3!7yt7xumm(8Y^W1*6GfUR#tKnVKmsBhqu{zI92X|`9c=0S{O$=L zjOUIvY@zTCQS?$YAt;3TSrnjGy~iaH>^Snm#ZO>>KUu(*<7>R4WRED;iz1xqZdBzq zz~@<woD2^fHWx@iWG;-Gv*YL;>&6$O-H6PFwGfhL<8!vHUBA6JxMTq>M;kW@*-D`^ z&t8D1inpN3^N^M-6bK3GRToG?AP`BQXY?EnTxv%sItB`(O5yqczSQ4=BuGn6{?G;? z+bDEa=QQFE)$gD>uMq-;Yg1RyHP(s!!)<5_w4(i++CTg+bcK!}5WRu~1=R)hc=?gn zP+3p|5x79Mt=qlou|+x1e7Ld7NMjcjbD9c%g^eZKKoY^}Yv`Fchsdo-C@LhF07#IW zU!m75TQ;iPt5KL$1SJX`{x%%Hd>A5_FqnAw)bFnhSOu6HuCw7J71z|b*J4}Q?;s+$ z5bnl6#E*m|Qj*go=zf<M6`mR$OY4~r(KFNyrP$T|$IDGHz@!m0cQ$POmfU5_Lv!hG zG{J?5bBiX2sRk$e(L3I)_s`U}AlvQ&1nX*dmT!g$>E?fr!`vZ?_~m^qu&3RFk(nV3 zMEjDGzumYSW^C_z(IiT*xEi?(PsVcOI|}inZzKM3x)mT_2k^1QfoBgjHi%+{+n$fw zWse|%I6l95<_B&69xUVpKnnch=aCSF+LAitX6AwdU(H)9>n#E(>S+q#bJy$62*v`b z8_p`=yE5&k<1viJf|{eUs0t#4O5o`v0=Q0u@a9%SC>V-eOPRR^W@kuqVQe}GfnZgk z7t{ib^_CtGK{18M%gBe27@rMUGEaqfAN>Gk{OQQAZwrsiPUzL0?SUvQusE3mD=0vg zJx6CZm6)<*zDQVHm`TiNSF<ym3-hAL;=saS0jMJY#ccahVT$a#-z0AjD_9&5;RuBY z&)(DmGHnh^=1YOuy?fF!wX5M+Sd&vpFo^@aE(+ez^q78k-RT}g<|c2)@JiQ<=15Xy zZfRPl-38rO(VNf_5F^$eP&i5<{Gsy@2=2}Lg^AEoDKfXthh<rX+SR^*e?9`^s6~LH z+ABizjrHh}y24S6Y(4L3t>l@5Nyr`PPIw#zP?CT@(61wilY1=!4sP!45kdd>^jA0; zJORLf&r@Tub%D%+B;+7a>hS^waq7|;grk!X1^@7$hrh7S0s}NYQm-m8+W#}K4-e+o zq0mu;@|+3`g#CAtlPNP_*q7v%!IQNdGjlUIeEtYT5fpC!!2`*m7yAB9!Rd+E1U~A1 zUq|6}SEJNbZpm3!3i9Hdl_+tS=~?pkLwhh8je^3iz^;)FivY6=am5x2NBc+n(Ba<; zfuJ(47OR)9(XS>+Q(4I~Y?-LcuS02G1%!eFr#{7(LxZ4VkhE<Ez#lymu7Cf54WjTV zg?3-zYCKoB4R%|)o@zH@!w5}Z*Pqwv_>?BiOwWeP?t<HquN%%VfZ1EK__*_*xOk-x z6yBoniJ`w;Kep&Y>AKzJYZH>zPGO<LmW8JB4Om;Y9=0@_c7>$rKq`>=eO%qbiQdm} z?80Z5ip4<T4F%(w;I81wB_GSzyjS5>NbI4YUW9OFxZqn+g^D5{JlP&NGhOpvxJiU2 zL+}UuxOlY}k=WEi!<{8;TZeWH4gRc)N!`w}EkeFQfj9X@<j!YNyhLJ0;IF|?0PwC| z&3tdJtTSM2QgJ*EqC`aQn<ozl8K5#cDYEbCUxJIin*ASN17(*5!ZHpq=Kufz07*qo IM6N<$g6Hwpa{vGU literal 0 HcmV?d00001 diff --git a/chrome/skin/default/zotero/toolbar-item-from-page.png b/chrome/skin/default/zotero/toolbar-item-from-page.png deleted file mode 100644 index d5bfa0719bc3a2ce4fc529403f0acd6b6057c956..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 739 zcmV<90v!E`P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!bxA})R2Ufr z!A*#jRTu!^=RMz<JELQhSp)+?Az2yNpGYc3MHr-Rf?BmHs+G2is8zIz7A;GmjgS#k zn{udySz>BG67=JY6c|L1R-#TR>fC$3^Y%QEnYO<A)ziynCZ8%{J*E&KkU=)%)_z+& zmtVwx7hXEDXU7mAGSjx#j~&_f!uqwP#LA?T0AxZsduinT?-%{`$I|7K^S`V*x@X4{ zR485CKB(Qwg@1G<f*>1xHsf)+GU`3F<{J0kR(;pbF3)zyg$H+idfnl-wl5Wkh!vUH z4Z32YP=l_}1rZd1W_D&^$A($A+&a0e&P?xx0!ctY2}*<#p+qPVN*B(YzvAW<BX_O} z&u_Y3H_<%_6(Ez^5kf|2eNsa07-VtkTpG5q)`lKfJt=A#LxoHdHHwrHQ9>Xa*%bzq z7Fz41LKILT(GWohi9|LgIzSZBhb*Zf6R6O}WYQ4GOi&71s9lmll0x6;8&ILOl$j(c z0Z1T(6Tg09{?wd{moFHNN6PS?$|e>1MxSJ(0Z7o2<MSUneerV-Z`t6cRcjnt_}Jz7 zxw>)J-Zv|>acY@f`(Y@g7GwsEj5NLQo+q|HsxQ5}XSX_d@*^A9ZT9=A{W~j+$GyI1 zc4oqTHx@1FlRjw4XWyPN5i2~l_F3@aBk!0yu^aoRDvXy}8@HCjUVQUsuSH4$T5|r< zzZOn^?Wfa6y|Q($Hx4{ws+)wX6-HP4zo!S?4KJ@7PG@G3G{CjXs(p*kIrj6rHs7_y z+=<-=Q62s9FuWa^X~WKgJIAAZJR<H*xg0=}NNJ+`pw{kC<the!YpV|&-~Hvb{{bf< VF=qYo>&XBB002ovPDHLkV1jCMPILeO diff --git a/chrome/skin/default/zotero/toolbar-link-add@2x.png b/chrome/skin/default/zotero/toolbar-link-add@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..b7c2b3e4815fbf9f4864ecad702b2010ec6ae28e GIT binary patch literal 1224 zcmWks2~bm46pdC<K&K20YHMAPSYZ%Lse&7j!~p(~?S}*ihOejr0wkC;0TM9FPY5x{ zSb?$>D@u`oEI}+YG{_bpfe5jbDs+@eTem7pC5WYt(C3|b@11w%zI)HT?_Qu&BR9Hy z>Vm;wHbTdV3~=uJu-1PBc4Cd*g2Aj#q?4K9;7TTwWipvSAP|einVFetwHh!G1j*&{ zsHiA_fsteZfR{?86bc0Zkw^r?aJ2Fec$k`+s!%AjS}ovd=lAF2<OqdAfPsN%u<}4! zS{j{BPf1AuZm={+sZ@d|z@J8=0UpZsKUr`*Jv|+eky(C-E+P#@h!S5;J`qGXCiaQX z!{bC)mNp~?4Z(}B$I^V5s-pmep4-JZ9|SUfz#?y0xetT_5yB<D$HaT^LTm^ho0OCU z@XE>xNCXN50!|l@fOsyK3v?0)grT7!JRV;?Bp)0c%*e=?n3%X~kxC>IAj4v@bai!I z8_Wg5+S}Xv`}<8MlhJ4dCEvMo$1tqv>FI&xK_DH-n~;#eX0t2%C1$g^qVH=Uqs%NE z8yf>vWM^lWb!DH@A1^L09vK;FX=%9u>@FIo2}?{&B#}rz*p&Qo#z_?!w2P@a!eX(a zWC4ABebVd5_XAn^`T3v&91cgNQt@~^(Ds;^7z9B;$9R{b^{xDxAr&Pju(*qFwOY^U zDUFSdHG?Qu%0`VywN+7M5|-6mN+}@~n?&gqQMpQ)tmZ^%ZwB~<fq{Xu8kow7IB!5Q zFQ#(zAz%RFP@K(XOAx^*iq_TD)sJYCOQ5{GJYpn4*UByJ6_)e})J6m;3=>o^nwpxp zh1BFiIJ5jrek)g_(VW(i4F*H4O?}g@`?foSFHHZ%F|`{E8A;5bMq_4|ZJQR*X>V3b z^PFPd)61?HU5@|zwTELaR{na_!3h1CFz3NI>N!4Pci`U4I~wLk6?RnN`FhTSwakcL zaKvu1y?JAkdw$;RRe-^)8it5?W;QZ&nH9~!yG5+i;mk$5-LN=aM@I)zCdu0TXmWDW ze|C0uiAAQ|pDp@xzSMeUd`?Vx8$4AtUls1>?cOdj8U>vP1Doy7{hzz<V#I3ZSp{sH zZjERu(A_ygPoX(Kf&Vy=dttIZnC&a#ZGqSnnW0l-bbh?S?Su#aiyPs3r_TB~NE=?v zyaheJ=2IlU%_kGg?%$0+jeD^eL#`Nq@aR#gp+Ej%23sU>Ea0(?*IikR!ppCw%_erC zcE(~leCV$}>rKMpP0n8~e04vd&6O!WTP|_QvtJp7R|U~`u)<#K$6~z`UB7`=qeQ0% zUS7|Pd(L_xg}*N?FWr6r>XvHv$T?_l$>VLOU4Hz@pL=O>tv&bf`g<D|1C}oEhIf2Y z^)G#EcP16?-M+jK(Aj<U2+8m1TTVl;GxNQMr#XZl-1u_y`|7FWnFw=`@X6v!H1{CQ z%}Fvg{@=D!p-0-nwyiO*JiHx=o2YykOWGN@u65CM{kr&Czo$+It13dCg<^Mpwyyzw z*Sj=b`SCyAtIeZl+Jb+j$jk3dS!tM6R7*!K(k*>A8zO(X-|flpZ_6@T>DI8U?R$IH hjt)eX89AL!YIajX>y|d$#b_`s7$}@dY$lvS{|9Q=K8^qY literal 0 HcmV?d00001 diff --git a/chrome/skin/default/zotero/toolbar-note-add@2x.png b/chrome/skin/default/zotero/toolbar-note-add@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9b296d2a30a2ec92bfeb334ebf894473e5273c2d GIT binary patch literal 1062 zcmV+>1ljwEP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F8000B+Nkl<ZcwX&R zO=w(I6#m|H`ZJmQEt+bRG>Pq)iWQ;6D%z%-A}(A=YXd5RP>LXk;Kqd_t*8}2RB$1P z3!#e|BJ~Hs=%Ut%bz#9`F{a6kX|ga$jWIu_lfIdI&u4PE?+)*!k7Qt6=?9m?_vXQO z&Nt`0bMc?Y|L_oj&VNR#BB*`P#G;Gw&wW4?NC8BHq5-Z%u~EC&bnIM6Gl2;HO>s~V zMKZ#j$i};#L^bi}M-PFb*G#}w1`<_-bztoToV|dcst^sb0tX19nlR!b6*xcv^*q#k z7Gz+bi69kFe&&962jzD*-+By*P0dEU0tbBi7f6g)l$YNjqR9vVD=vEdQveX4R3yg0 zrBKo|r{W#}#U2$e1{LO^cNFNjRNezFb0;1rW_dIr#{&nXLI)tOnPS8uyj(dQue=A` z=XK_b=dm8t>}@ro;RY=yO=Ev0J>V9L!aCr@qSFG)D|Wyw7AmAV4<WVl0o)9K^}p&8 zAi|X|-ca~{ynw+eA2a?N5b;o_TF}V_^qgvM>U(iuI(8k;_B~FBMv=bZsoT4e${bvs zz*n!EnC{vUnvS0)3i$Z)b=)W^2n8ZyqYn5YDaZRxT<DE)z^+b|3|$&I2S^F2OgBPc z$;PtXKTj^<^rb~;(YR&XR<!MCMqNz}gc@^yFCc$)91~O5YDqbB_~gFQrzbC-^;T7O z=23zg$<Bi)4EG~IDsy1jjr}M)@TQ5i_p}@FMZbjC&d;MzRJddJE_AfEfD}mi7@iv) z!!JWuR`^^(B{ES5++`xY=Lkq2OT*v5IFb7nKoMIq`@;^{>a$}@Mtr&QkoaR=FByT; zKb|oBw)PhMF*A*c$!m=zPd%GJ1nwpSqGtCYY--sKiZZ7#{2i7?&I3{mp4quqxIE<> zfo0o6m0P$zAO#(5t%g(dBQXw`@qw3YKwZ~!*pTi=Vd!hy6IoD7w&Q`#%})a$rVDSG zhHI!zhbj;7)O}`Z@Zp6QP+wOQG-W0kdvhTHY=D>CiuB6$%-e$NgP+*HBZ~mu#_cAO zbX9xw5Q9)pXc2g;?`{t=xImgH+AR_?p1-47F`<*Vf8Sm-Hr59{5UM;7o}QV(zz-K8 z<fQ~62#Iq|aTo98f)N-Q9RpdOeT&c}jO4Cb2h`^ts)U|X-A$fCUMTgQyE>5B*>=-0 z{Pjv6L%BRe^jyMEW;|38M_)P6L+V};?U`|GYe9WOErc4gvvbIej^p>qDTrulk)zpn zN6&hwGLF1_?-LsGfrz9dpI}(NsKMjew}0!kyP*0weDdyXelhV3ML#T*Jyv{BwEj{l gyg%?>-Yuhl0FhUI?Z>o$Bme*a07*qoM6N<$f_*&fi~s-t literal 0 HcmV?d00001 diff --git a/chrome/skin/default/zotero/treeitem-artwork@2x.png b/chrome/skin/default/zotero/treeitem-artwork@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..1f61cc722a009c311729c6e03647327620064d8f GIT binary patch literal 1031 zcmV+i1o-=jP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800006VoOIv0RI60 z0RN!9r;`8x1H4H@K~z|U?Up@k990m<fAe<lBe`>8*+~onCkjM>5FZf|4G0OSC@APq zM1v?$Bt(^-jus(`l(cjdAn0f)D3FL;fdmqUIDtq8+ws@!-n}<Nv3vV*duLlnb_26o z>FwK@_y52Dycs?CubYeqpMJ6Ox~P4ka2W$5d$Y08oXgCtK3Ds1Hf4@q)%5)vZ$1At zfGen|-aG+t3?312H^;E?cwopf2JgIa^<T?*6#MwITOeE-f0qhWc6O{LmAq3^pibbU z&wtA#9!qJ48HjjJ&#!W-_a{-50^og@y`3fQZ(Kq{l>3)4hVkLsPmJ+vRwGbjP%ss8 zWLlj~=9g{}MG0kGAa(=h&)w(D{2KS}JV!d1%Y!9b)atNO`J70BRh%*gBH6gr+F{{= z?+b9R1JbZX;x|ab21(c?xOJ8u{*HEMAEAt`0?LF06$R>tKyq)x5MXZcN5px+80roq z-NS2w+7QEV5)ny<SW@OMtgwFP#ay|j@Kevg<RKI(rH@+Mw7P!*Fw#ASVTY0KGO|5_ z4lxubF|l+}H=^BLrPX<sQQEJNsBUbk0+R%CPcvGbO#swJcpczvKUZNuP{jZz9(AKU zHm2QO#}E6(8dU}}tDu$wDI=U476gK&cunw{FbV;$0W~9XE+;Y|vMw&#&s4-}Tb@}3 zjT9gt*^F5`BS6SskD3uo(R_D7l}HqI9y5<>r#MHG9Y$uQpy6a037?)TNEMIdBr7|U zVr3yD50=;!#F<r)?X*gutYOnWK0S}L6P(02Y2(BZJD0~9&N(7+MAE^MD`=R@!I~|0 z`Wa|c!Pqq;G1z{F-r@$4>=VnW{J`zvMDsFq#I8lmB7W=DN($>KDAO`Y0BH7sl7#s_ zgUuJ{_P#{p9$+|$32q3ch{SY85$X1un9kKwSg%8wuE6X*P?8A41=>G+!<ok(Cs{np zZo7p_;B=bM-`b`7`)z)@c)paLDv7524FzWPfm&bpBj(mtxxCe*9Y+B8pzI71c0#B% zuo{W#+Or5$8T_*GF4OF=+rqu{y%~SLD#53f;baQ-_6LVRO}9hi4(@~{g=?>TFg1R6 zbp?L@w)vyeqx;lrTw8wnF#MWT6tG4!nr8jWSK;E5q<`PWr`rH%_be<d(~8<hSmA(9 zc;qWt)W%=9f<LPN3~;DiNE$byW3(gnftMbA`S`%6UCB;Nfmv06ao6CX{N7$TjdLaw z!S(sFy&mjW%&(1M3k6iUF7U?*fZxT*b^f>9{sH*-+{~CWXvY8m002ovPDHLkV1l3T B=uZFu literal 0 HcmV?d00001 diff --git a/chrome/skin/default/zotero/treeitem-attachment-file.png b/chrome/skin/default/zotero/treeitem-attachment-file.png deleted file mode 100755 index 8b8b1ca0000bc8fa8d0379926736029f8fabe364..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 294 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^zbpD<_bdI{u9mbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-&H;pyTSqH(@-Vl>|&1p(LP>kg~E zYiz5X^`c$+%8#zC{u)<aJH%g`Hs@ixWul%W)5U2lC+*9&Fj~fNPMviv$?4$+d6Do- zTUfo$OY6r(?tE}V+eOf`TWXenuZ(7%PKZW9QmV+7<<H#Oep_^HcG;Wor}g2>yfe-5 zmgid={Z3k(ERKCKrE7DF;=x4^O+<x7did8|V|kn@Au2X&;sJfNy4LeHuKwPeZo4k> pzO8rLO8p|Ip=x)jHOtWj`bJBmKdh_V<`47(gQu&X%Q~loCIFbEay|e6 diff --git a/chrome/skin/default/zotero/treeitem-attachment-link@2x.png b/chrome/skin/default/zotero/treeitem-attachment-link@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..821bfbde3a7614db66fc015a547431ebe55555ea GIT binary patch literal 944 zcmV;h15f;kP)<h;3K|Lk000e1NJLTq001BW001Be0{{R3M5Kzw0004uP)t-s00000 z000C81ONa400000000000OaK4MMXt)baZEDXXWMPdU|?*fPjXEh9o2;KtMo)gM(*h zXM=--etv!u5)xEYQ~&?~4h|0F<m7{cgIHKtb8~ZAT3TIQT~}9EgM))zU0o+9C;$Kd zbaZsp)zyA}e!#%MQBhG^T3Y)0`k9%T!^6XRdU|YZY;|>Y^Yiod_4RLWZ$UvpUS3{Z zU0wP4`TYF+^z`)o{ry!{RrmMzw6wJH^75ddplNAoYHDin@$vBR@Mvgg(9qEM`1pK$ ze8t7ZV`F3O?d^+;i;9Yh_V)J1#>VgO@0**O`}_Ou?(U<bqfSmv*4Ea9goL)Xw#UcE zdwY9fVPU(wyPlq&qN1W=Vq*UO{>#hDf`Wq1&dzahagdOZ>+9=<g@u=wmsnU>mX?;L zrlzE%q>qn}Qc_aF!otYN$Yo_^)YR0Nn3#x&h^eWm+uPf7b91@5x!T&=>gwv*+1a6? zp{lB?iHV6{UtgM<n&su?+}zyk?CiL>xaQ{OUvFqE0000ZbW%=JHUK&s5E(G<p!U`8 z{!$Z1pw9Py?>g=;IP39!_IH|l@|i&^2?xRe00FQ`L_t(|UVYPLQyf7MfZ<&@0vt&W zNl=N*x}3YaAMWn%7WY3+FU)0k=P3H~Q#Ji|)lf8T>7yE_g~kKm1w}n008kWan1Ox} z&w*d9Z>eSzSPM+}a}ih2nMzNV5c-UT4p2xFRaY<u0-^NIzYY*auoenPnsCNaV+gsh zFaQt}l0Tw}G(r*<I=~_qsRo@fgoiQ%SQLb|=+l5q`9lISr9=WUWs(GB$`}dAlr#y* zloSaXQb^E{LIUUCvZLq~lT(s^B_Vo?O!>}c1lffxdj>#Q_!<|&05bNi;deT?Sa57d zd46e57JhhzpL0t*AKiAmd{qaoUG-aby#`=h@cM*t0JZh(wfg2Y20SOToAUW$lF83r z&E}cpqVHDTWG}fM3}jAWm+d}rHQ{C)j61O^iW&Pdd&+fT@SU4s)lXB?6{RqLHeXOG z(<^~5D$8<%M({iC*}!1K6A#^J;JxXIut%R0^AkL`2TSf7fg6@Q;Cl4TL&!AV0Wyyu z({w1scn2kV42RM`?@)XF)SaFGPd!3w!15?;qt<Q!y=_fRZM^`xtsg#GX!;%q(wzUz SpSQ{Y0000<MNUMnLSTZLu+MY= literal 0 HcmV?d00001 diff --git a/chrome/skin/default/zotero/treeitem-attachment-web-link@2x.png b/chrome/skin/default/zotero/treeitem-attachment-web-link@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..aca80be95fda162339f0d1b54e8ac4d35a700878 GIT binary patch literal 1471 zcmV;w1wi_VP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F8000GsNkl<ZcwUuP zZ){Ul6#u=~fAUYt8i7PMA}j;8bu5F$5RJ@iAO;DEnEey<gNe~-MpRI;FWUzt12I8E zj9->z8V4F+agGlbw{ApO6f-t9G2j%-CT7z@UE9&Feee0sNt^r1quu&@yYJk4&pG$~ z&bjxVW)c$Eb@a#QBuV{5)9@HHK$ieClGOM`0zBq<0{4^ltWWBAtR3oof9nxsfQ$t6 zkAIr|#{pq)`Z&p!ipKu;kO5W*-(2!JwZ9w;iT@ZZc`TWA+z~pfg(bSK2JrFMBSfmD z;!r>OS|}44GQfmcXvQ%^NTCzNh0chWCgZJYH)NS~M8eygIRj!fCgJm2plVv80jmB| zG|e<8#;nKo4U0jr+hj!Jz}wX&_~_JCD5}=<)Vp3>IQn$6iGbKY5+bcKb&R=EIrZEC zjSN^og$WL;h3z77;GNnM96LFjAkm|fsBAW8z?4=a2~tW-LVPeuMvzM-AR}qTB<eTf z*q1s9MQVETKo5R6MkE9QLBb3sAtHx?NP-x>WxWZ1-U8!cos9zrUfhTezZim|pb3DH zK<agqV1~pAkmiV7U`wtI4?>HofgaNqq}+AEz)XT(s$ovnAZa`|Cq&^&dke%M9f+GO zn?H!e77Y9zHQW|}rQWG1SjYizfMx=s%F)9+j?5%1vTl_;kYeLZx5Zd(jKOEV1tzof zhcg+uL`2dYQV9@&B?2{P0H!)He-hl`!;^-H2#h|SJ_DNQ&ktD^ES|`82I!R)=3lT_ z!x=`pTR>VtbPi-+u&65nO?L}K9mpP;3s!2N8E=8P4n$@`xHfbVH-8(&UH=rO19uRM z#So9jv1o}Cg{50ixw8g@o^xO6wgU(U1F%}Hu-R;Qcxev2E0?3#?S>sHqM8kiRBoaU z81d(gVVrI|g2783Ox^b3UN{IN0(btw1<zTW|Mnz2T^-ctIV0}P1aa$@59dAKq1<r+ zD{WJPfVo79JsSVx7hL-OG~%&YtX{nuJ9g|qZEY>~?c2v~@7}$rs;UBEaG;kPVcWKC zq)Xb75Bc&MR!M<-;WacjH$QLAfMF}5kr`a>?_y%*<>jcTsKAO9D`2<VVT3HprtC?n zg@k;_m)F?5c{7Kos%q=u!-rjRx;pTA|4)d`MwxX{Q4u*{aBvW9ZEa|8Z%1cmCwhB( z;q&>hY11Z@xC>FVVIA9EzkVIv-QDQu=s;_0E6$ubL%zI5ad9#7^6~({sVK^uNdl%4 zx%lo4mW73dEQf}MFfuZNNF;)2G|Dm@4kH*0A`l3`@As3WG0!LM^pDV(e0dGACS$kA z06*da*rNZjbh%tC$HvC6W_JTzW!n)7g|L48deqm~qq@2pd-m)}HX74B>Dexnza9Qv z$MNdxZ}1voO~zV72DoJ`MiyCyrYIC8N0<SmXFF9@s6gpWh8d6yb%2^66LTzu6bW-` zb8>Q!pP!Gx&f}PzoCLw^^>UjF_G{;`?BC1y%xXnhSs4hlW&&gP(Gn*);#$XYbaa$u zX=y3kZZ|9z3$lg7;UHgLL#)a8##jgRCTQ$`wiI@|1LNc47#<#`>&6i@G&G>8sR@mZ zjW~GlAm4GP(}~>NT&!BPiu-kSb)+L3wy&wFAzxnO%9Sgan3&)irU!GvKp<5*7A!#J zGdt-{vr}JRAElp8b(%WB?Ll>be8`u!jDrCr@_R)m=(j@PFFgy7zVN|-fsBSnq#~@r zRl4tVimCq7?*O-CpPkjUZ12P{JRT4K1|)wAjD1)f_;tF#-+kicvmAh6sl5hGx_$q@ z-BZd+{H$!n1PU-CErSY6YIO2L2rel@aOvaRrWcj*oB`|;(ww+Cn~#grPy9U*S^g3d Z_#ca;NRR>a<_Z7+002ovPDHLkV1gc?vjhMD literal 0 HcmV?d00001 diff --git a/chrome/skin/default/zotero/treeitem-audioRecording.png b/chrome/skin/default/zotero/treeitem-audioRecording.png old mode 100644 new mode 100755 index 3f23ad9ec4b65a544a3802c692c6b28008d37b88..6b02f1a39586ef49129f44517f4f7f8a1d710817 GIT binary patch delta 623 zcmV-#0+9XU1+4{;Nq<jCL_t(|+H_OTYZ_4y9<#gFsFCQpN+k3Uq%DFX6q14>#6nAv zf|p)$spe90_0Q-nr;>{{B?qB5L7|nBLjsn97mLt}k_u`qt1T+x&)x0J!Uj<@FueEX z``*l(nKwE`QGg^8iKr{XFre4#ALw*CA0BzsE^<oK>9itAl7Gs{X0xCP3rm9JhZc+F zRU(mi-D<VmPN%badU|>;isDCve=hSkw9RBPQFSyLJ&s1B@k*uQ4hDlztJU22x;WW2 z&RPc?$H8zoB;DzBI(t5!57Oy0csw5H^?G|`C!Ba|9hl8#u-om>@AvPyTrS9DG7t`j zA(zYD+G!=;T7L&9FAWC6n|8ZxDijLf_xmB0N`cqwg<`P?WG9?>%SBTa^FG0Rm3%(0 z)a!KxBPy~iEBI`s(P*f4!ilHdA!Qee$lTogf@CrYp->30`d~B~)w+mc2d=NLAQp?O zyu}CHIv9_~49Dr!{qF94u-U9&G8wTeW7yoJysv<8;(y)cfSpby(cy3k&E{{l+OjO6 zg9$X7Ef53;5Kg?i9Q-Sn%ij+Ug5grBh`*78tt}G_21EP{71-Yo0O7=2+l9ekP`bD{ z|7Nuc^*|tu(Pij%J20EgfX>_7_B!FjTXdk)W&wN5%;)pxg5Z35e0=ic@bK9qo)>K0 zuK4%z@@VsqWb)ltQT+3TW!X>o(WI3&@;r}4Gg0nt)EE-qo}GPAXr(jR2`AoS8#iE8 zstCNNjn%rN1)+0w4R>`KNiY?_an2qcy#O5HEJa$L0Zsl3FaVD}Odww(dME$@002ov JPDHLkV1g@KGrIr) delta 677 zcmV;W0$Tm81>yyeNq>Y%L_t(|+H_ORYZ_4ypN*?EnuM&n+DPa@#1=sj0!hUW&_a8V zf|s6aaw+XG-ufpLJa}ozMM=p)=*@#rq2!Q&rQpRPv=U8o(578AeqiHARy(s@#Wdu> z?D*#Qo1bsy&0{8$3Ao*E(CKtQOQBGJN~N+f4CBPD9<70#!hdi$EQz8hahlC0<Z?Ob zH%p&sGA$(EUs+jsw!6FgyjH7OO(xSxJRaW{1mOe1-~Z<?&}T3h%<S^=aw8lLZ<k6X ztJmv=a=B~`g+kjDpXXf@U|ANFN+tAqJ+ifWy>4+josdeUz;3rgyWO@>oN(e1|C+$k z(voBbg8@37&VL=V*$nA)8iK(fWHOmqocxq~O+a2x)oS&N^Ye2pHOS?1K{A;Hhr<E+ zd>$xHIPvCk{xwnV?s_a1dt0egz-F@n$8it{1gIxc89txywZ&qAXf*ojhJf4@#p&q} zNF);A_xl064;qa|>Wd)M;rRFnB9U$4DsBk$`+Z43see>S!S(ffcvT!|wHiD@9~Kv> z<|7~+xwi_i!=We`jV8WY{V8>OJQh)40M%*@c-{zvBbU8R;G$S8e%;#g1`CBePNNc* zm$lIC_HY(Tu(|00!jXG1FCg6l)!FTK3kL`LUpS6G^LT>z?_+2*>M$COfcC4ahBLy6 zNBrqx=zlHH{ZbFEuCAW&yy?--&dY~^z~cvcJ+Estgy!L4_FE$H?z15L`h-LD5qV;( z)tb$|<f&$SMC7e#5hT9Z+j~DDPkV~X_$-fX+K>f2ss_Cl?GIWO6YU(gCV_}$W!_yG zry9gr3HWqLi0UxXVI+WItoXDyaLDq=Igte@NghD^jj<60{t7SvWxYQ^ORw=&00000 LNkvXXu0mjfFfdIo diff --git a/chrome/skin/default/zotero/treeitem-audioRecording@2x.png b/chrome/skin/default/zotero/treeitem-audioRecording@2x.png new file mode 100755 index 0000000000000000000000000000000000000000..b37179fd5c2365a4170e069925808a133bcee13e GIT binary patch literal 1016 zcmV<U0|)$xP)<h;3K|Lk000e1NJLTq000;O000;W1^@s6;CDUv0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU#nn^@KRCwC7R!d7;K@>i@i8Y$sNQ_oe z5Zh`HEfQlDOoi5{h>v!mo1zPMVmJK(?%WCe2jb4+qZ^B0OoD<NUldGqQD_OqpthJq zlbVO-#-z9BOpKM7;_bqLkI9_*&U`a-&Y2sTD2i~OO_6Qr?d`q(otKvf3WY)|lgW%Y ze1uRTVu+u(vE5`c8M?f@yyjc2*1H9=+EbqAdrT%%&%nSygVX8MH8eDw&d$y{T`t#B zC=^;kj_1ElkV>UkkGs|?mCD!c?d|VdTU)EPwzi<Fs|)OQds%;fe|K?lv0-s>krM>r zBc3MoF99ywkVqsL(6O<$wzjvXrlx9reI3kZGtAG=v!2Fer+MOKd?X3P<M9k0*VWaT zc6N5aXf(pY!UEuFSWjcJ(>(DqK9U4fDivH@ToAMe2M0QX!2k}211uH`Oixd<p2lRS zdEybD{3HozwOY{Y^?(6XmY0`vYin!J)YJrXb92zy*~xkulbz;?M||>=B!KOWTCE-l z27^k>6sWGQ2Aj<WEiElDGc&__8k3#oiAQ|$%c($xb`yPleed@6_Qd7oWpRIhUpziO z79){}h&eA(!(fWxaG2S>UN7SjpZv1dBHTIwF2rmek4I9aW_TIDJL`amxN}%tUB%20 zK%?OSi;V?QE|;@(jKyMrr-EoS2Ai83P+3_iT>wj;<G8dLa~%o_l!yYrqN8Vn7Gf!x z&a^laAU^p?7EmbiM66_)ASBS4L&&kRIacM#WD3ZhhQQ{DFIfPuAf8J74)eUGC>RWZ zPN$=1BTZJwnLxU*5|}~1@cJ}BeDaej5DWxPe^gXFDLOhj!n;?))%rIC1ct-I13(@S zpZui0MPKc9>t=KFOY!6+0Diw81DX!%U&O%Y^WnmNARh6_PtpmZ(WrZ6#qq^#er2>+ zx*DC%O^izd)M^!eALRHu1!reryq;5NYwMvj-6lR}m^+t%Ec=UAT3Sj4@{s3?Mn*@+ z`s(W&O<wOeI6sfz;sOhHVW9?7^BL^!Zo9_E$390QXA>AFe;^Q$CP3MOX;_AHZ#z1= zUknWmKQ|bv%hYOK6^%w>ZufWJ)YK&I+_r%Wf5J5OQH|shxK-LEB_-_P%FoZIPv!&6 zeG_6B@nK?ON~Hd3Y@&JM5uf}dJr&t8N4OA^>6ccYu}@yv6aW3u&()}U@hYr?gWYs} mR@xa=wUj2i@4qd71Q-C9`csg4;^eCU0000<MNUMnLSTYd&D?bW literal 0 HcmV?d00001 diff --git a/chrome/skin/default/zotero/treeitem-bill@2x.png b/chrome/skin/default/zotero/treeitem-bill@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c0856a9bfcfd2770f522dfa39ad5b78692cdd8c7 GIT binary patch literal 1295 zcmV+q1@QWbP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F8000EmNkl<ZcwViR zUuaxa7sY?)&Sa99gcP)>&;*M`Y(WsDQc&9>2vzV!>Vqv*5$&T7^+6H!O%X)f?}HZe zp?=^Wu!=}YA8J7eZ4uN|3)-Y5)FxJ&r2jIROlBrC_wHp$@8vMLGwGCe!C_zaxtG0I zd!2o*qX~9=eWssU@VZQo0Cytg5FnvACcu(hvMle!oJ3Jl5iyQ5BF9Kr?K$?%uD&uc z8WPz4#n`G0*<Xb2$_0*$gG$Yi)fZ0@s*9i`hu@PZA`L3iYhS(kz`2G5p8xXf|4n)! zgX8TjceDETc3MHHYLu(SLd_Nl&z3_9rI4BVkckTwPEVG|7i%#&n+h!4kRq^i;QVdn zuF4dmXY-nFUfi&fTLlS@oyzms(0S%cH6$CzvILc`>Lx@F5)but0WdXZT%I=~1Lxue z1kT~Omdgg$Rwm=fWgMMt(B1BEcsK`-tzEJB-tNJ(nAyf4O*2}HgcGb;*+ID`CJRO_ z^6ezCfRwbB&|o2ga#a*6#)Ua?sVIo|x9vH}`v)cfSl8E$%s{p(MZn-b1YNmcam`j# zXF9ROYfW=vzA6ArLNb0IF8~lmhGdwTQUn6A3W*h+82~CZ#f8+gP&x+)B8v$a$c$<j zaiv&e;QR4Jfx{^RGWAL%1XzfKFX*3rtZPL|DS$}AWJFQK&b=o%J~o47S4_2CX#%1b ziH^1afH1tC)c!;2-t#aMvP5<(Abo49J$T^FP3N+t8T0~+P6mh)3pig0=Wssf_kGSk zdk-Kp`|gbmy?79iMhAlSm_TUty$8Tcp7uk1uFeCJg#gPF5CIa|n1E^N(W6CEdIf5+ z>t!tva8e-ojb??G&j|o00H{<WWQMh(fW-><R)V;m`x_4_7kC2Jsscy>!V@qrZDR$R z52*kLK)D*-kOwke0kCC{-tuh<0woG09;n>70=}rXwa+a(qym?;AWRgPZNY>D2oL$_ z3$<p-wwS@}d^H|IEfA0hw4?>;LQ3aIkL0!t0L&B@Ff&Y6Xn{c70td8u^aN6RBq!4} zKevEnxTpmM5COyrq$E!dBHym`UT4k$aHUv5W*BynCCCEo7&zG<hQV&cMv$vBp#Ue4 zOOpN`kWeDklKY@N>&V9XUYse#gGdu81>)i-5YK?_NHjftzQo}0B`kIHTJVElMTb}A zuj#qOged}U+uqS{<Khi}vvX|@nJxBHGIDJJn32mloat%|kVI!LgCshxMkH3RZ0EVn ztGSpjv+bS3i3!&a?cO?E-vaSOv*MCbsTd}sWXXl%qs37^VsY$$d<_79P8O0}t!KV{ zB;|pm=L0X@M|Veto5lX2GkkjJRC1g0>(~V(!y@}_@PAL2QXWA18;Q|>=D8Kvvc8X( zpSqtXAMOX>=g}!-2G}vuAduWq2|oE@lAp#3+$?&#a%|mr?_wN2J<a%J9?5WF^m$_f zk$V?ux=;$)b8v!JJ|1P?p$QHSPjhtSG9%~aI6FPhbiP8d5+czO#-|E=u>W}Ck0V3- zwx1vk9Kf^xIoY2HqxU3x+GO3jLBq)!<b0eZ(E20)-9FZYfXA~R{@6*a?NO7~DYA8v z-6KWahPoA5kFXVrQiVEY*3qDN9<w1AhHnjhwBrw&;9nBB;CwfqFtPvu002ovPDHLk FV1m(kRT}^R literal 0 HcmV?d00001 diff --git a/chrome/skin/default/zotero/treeitem-book@2x.png b/chrome/skin/default/zotero/treeitem-book@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..b5556a44bb7ee3cbb9b2c32106a2e1e7ac2a69f0 GIT binary patch literal 828 zcmV-C1H=4@P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800096Nkl<ZcwUuP zy^0h;7_43l6f{-*LD{=RFfkF<Q#cGv_RK^CO*C6P+&AzgJP=_uJWc}<lT9uVLBTgL zQIlf@BT;t4u21HsXX=_}W_lWy>Ytge-KzSUUWd5h&h~6fxE%m%1_P{|ulfd*7#6Gm zt%bR;Rt^H<C*0ua$5)d%)G&Y=#@n;obnabmax{}`fHgD!0&&B!fY_S8zGdVG7>-wL zSJuybdUAhb(>Vv{fJ21CzyWYE9<Jy)A<F*stw*5erN%D++6?ASRN`K}eD2Hi!OhL~ zjWstY1_i=ZUrNuzNx3Ek%&=bIbTS4Fc>Z#J<MFe%sh5&Ip!(2SYFA30X28NmW)^#E zXe3Xp7P*@GEeZq{T1oQo?lmm`{=?ae!!TzhvOt3wgw!~G4%mCMFMexNzyj2p0t72^ zAyBC#)O+cin41-l3fkcJpCwky6>xF|AAU7ieNc?c`Faf?t$ucR`jl)6*p>kWP4dEf z$!aw*0%4F_<g$Q4F_^;JQ3Z-nMc_S1UvGAAG(=9@nSYBd0y3+>0C@??9zvGeq=ZgI zS<zMnLdobQ^X}&#ASJ*2hO$vxqCl!9(R~gm?SQ9;4;C0@jflcrN*q^?$h#~sl_8Y) z9-*t%FeVl#gsoKo)Y8$j{6x~0YZ^-li)=_jm}>zPLJ~9<<Fx!FwMcb<#UZr%kZ(H) zb;iqU!h8K1V=A>QF^E`7XwMu46hwuK%nlu6VyT&LLHwfk9wd8&&cMV1g)3mI1yVqM zXNQhNWQoC41rT;wpc?iB>2pITV%ep0K-g6Ul8$8G&`AlJ{1<7L1r}Q%ne#%&R2^B+ zs|plCPiBWM4X6$xb#e|On7k&lLq|rXDg`V<0m-BnjReWe(8U3@`V$*qu!Cj=;(HuO z_6nVzg;a}gLkkd-<UY_;h8v?%AQZ7=&%Gt<qVxUh`wQI`n5uvYYAwO$wO+U4g~876 z?(M@2vLz`~$kC2JubRL?cL*IP2K+)BIeL(*zW_KvL;DZB;?hfBH&%-P0000<MNUMn GLSTYgc5eOv literal 0 HcmV?d00001 diff --git a/chrome/skin/default/zotero/treeitem-bookSection@2x.png b/chrome/skin/default/zotero/treeitem-bookSection@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..70dcd528c0bd008d353f51ce5d6f75ec60202d31 GIT binary patch literal 861 zcmV-j1ETziP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F80009dNkl<ZcwX&S z%}Z2K6hH6HI7u~yF&mo?C2$c$Rw7O=q+l9!Vd6d_i$Ii!7DecyR<-F1F|_`H=nKN2 z$Ts4H4bngaZA3Bp79<MiiSzWFlfCYn%k{mP$BSC!4=!`gz4zR6_?_RqGXwuU)}h(P z@mnvMh=7TJ#3=gw%jVxc(mXL{cm>XlT<n;JRirN7OK2ut2cQ;0iio|=vsl`>+o!DD zK@cEBJCQR`JtRUzodk3s-T$bbDojl`=`|5mDSKIob(~v7*U$?-c5|GM4vzDYfid>N z52L{EzkcI0!_T?3@9zCWeRm%A3_Rg?U*`FHeu=%X_rwjZ@4ChfCkJ@ns;%1<q4@N| zmW?6UwmAf+Tk9YmsqCn&syuwQeJ4c1m9TZw2Jix+%5G57#7Y6VTn?Doc8hjnW1~0- zp>uatg{FZLm(6CC{fmo>mYqtaET0IiT)KwVe2~yGWC3bIM-d841C$x(en*VdmS(M~ z46rPqy1E*?V44NTTr3t-{CqyI_++<0Ct$k;<kEs@Gzx!$cs#E73kwTt7(kIvR|`PF zgpJ9`Nmojf$t0A+#KeRWV;F{Iq|<4k9l?0O7NK?j*`}ssFTLQc9hHFq>OevRmO(_G zEnsF}EnsHBfGR>cWD6t%ikSQ(kw}!+016ER0<r)(l>6*TV{>yeltU(yaeW8c+S<x9 zfP}!l-T?t$?|>Ac(4G{bdkg%Fu%@QQaSPn9q1pm_q11i$Q-FsC2#7sI_%{&_hus+v zLw7LnZy}Q-st=JR4kk$U4i`5uafx3?1no_AQu(tvcrf+`$llKcyf)713lWxFRDI{y zwkl36nTTaUE+c3M*41tYKN!uu1rS%40N`NDe(-~lk*BH#{2~^Qf>Bro!(0){_XiYt zwPerGM`n)79<xoCMX_UE*bRGjK`2yVC0Ht$kj=jGik0)y{-6_KHz9qtCOrm98>VMw z!8DhlP%vR?YDQ6ZIU9>Me<EDz*1#urbY8ejOy^zMVY)Q;>}tQyKPLVWZ}0B_qFx4W nB4R+sED#LNjb3>SKCzCUc=Wl}k4ei}00000NkvXXu0mjfAIFH~ literal 0 HcmV?d00001 diff --git a/chrome/skin/default/zotero/treeitem-case.png b/chrome/skin/default/zotero/treeitem-case.png old mode 100644 new mode 100755 index e213cd5b4af378b1e85f28f678e5d979cf4a258d..a7d1a2f4a8fc36541916a02813a9cb1d9806c86a GIT binary patch delta 662 zcmV;H0%`s61=9tPNq==oL_t(|+H_MpOjJP>J@a-RZ(+gZFA@zOD@7BPSZgc{g@uJ3 ziCSq$h{m8X7GgqSLyWO7#KsUM6c)z9R$Hy?6bdAuWDx}R$9~?t&v@o7@{x6toBPh4 zGiUC*_l}slWx=c(SuwL3Y6XPAkN}Qq;JenC$d`1qr~HbUHGlXlK;`s5tLOqv-DfYJ zA9^+7dgwFwe@pKAJ{*L&On)W_H5Pw|T_;=@3#(yIds4jI;(VdKqb+R<FtJgl*jM%< z{MizCM8DZttKSB`k3?K-mJ~)9tEcW2`X`3SU;IipCV6;FdHNv13)*yzEmr&h@O*7+ zZgS7DERmKmq<{H6P0l&mO~W%nmMM-3Fz5xCG2UR;)A0RJdddakw!zhSkpQ#opq=Ke z4<b+OnM%8EEVHr9Okf*ajaLx}F;MG>4=1}U7;i9dfl^AA@@pmoX>c`ORK&&vj`9C` zS;T(MK?m`?*$4t(O5yRKwp$y730378_2btbPF`C5F@KAA_!Dm?r{0&?cc)2P@tTlA zkhvmw>waD&kS*xN@w-<){p~B;xX5-vL&xHd24^EyW)V4k`*@K6$-^vCC;cG?ms=V{ zYAt6Jv~X-73}LAdXgwf?*YkRtXG^4ZPhzUh5vlHW3++iDQvmWpgT01n)~TKt_|I6) zBE`u}m4B7q8Rf==fUyX~aBs7WUV5ZAa_Za6!unQxf^p;LkF<($&LJ<Uh{&=6er+r2 zf!mKKFK`B6hG=DJ7T0fdw<POze}XUc`P0`QNgChtn6ky4bc#jHjo!K6*4)<NB%7KY w3EvL9LRc*1R5p`!vuQn7SGV^y{t;jR=LllI+7F+rdjJ3c07*qoM6N<$f`7h1PXGV_ delta 692 zcmV;l0!#hV1@Q%tNq>_`L_t(|+H_M(NR&|&{_a2j?~M7Fw8_*8AGI+HdJwcLT11N$ zE!-Ko3_%L9s1_BtXd@vlLfV9txQK`rEwioCA_%FGDABYLZG6m(<M=;s-}%QZ(k>j% zJ@<b1yXT(sT{U#ofQ%BeXfi5F6_i4!0uE^4o7Nb}6?C}gcz;Ec(f-g!@$^4q%?7F( zPo6u|`K-rw(JJx(hWXcgpC8~N{c%6gnEn|w9JXytEd)(9arI;a^MUr7HoHl{#O^Z1 z)^#_G#|(vg^sDuy`jzi_D2u7pf`cBem6NxP{(%7b#7}g+CJ*;IuHM7oF>ScSQuCe< zxSqB&H@O!z41cw3MzGBJFfpfTR|F?Sh7`x~(eC<4ikH}SH9RjcUB?F3Es3|og#^s9 zmUfJ{-VQxuS1N7Wk(H%6W&%s%?Qlhc0Ow1iYUD_R0r3*^7C4S$7IJCHz?679Tv)`N zWoY61npwmX)IlxdN!jpy&oq_GgW5_|C|TMTC+vqh?tctkSol7HSTKVZgF|l$?0d9I z8?lmrL@={!;H_J6Awedur~9s79{t@{wsD&6f`*R7q8ijjWSvE%`nKRg0)o3(q<Z=~ zF3#<$P^olQ7_^F7KoG!i0w7VTx)yVK6K9!7g#;tx!2SeMEqhg}vBp4699YQ%Ii<l~ zLz;E8DSraK84DStsLWLIhsI1AxFrN{$BQYoodOQl;l}DZnprF?FJ+z2$*INgmIwy8 zE`IX;SM<Fc`=fs;Z$xBD+tJ^lhOXToJWCBgL^MA;L9OQyFV`sJ4}H}C{9X4`eM$bC z$el{{<ul2TtfVDIlX`x!`{sD{?%HU)syb@Ivn_l#AFSoGPG%)zfBd3FzIC+p28sVm afB^s>?r!9PztaW)0000<MNUMnLSTYWA6J0@ diff --git a/chrome/skin/default/zotero/treeitem-computerProgram@2x.png b/chrome/skin/default/zotero/treeitem-computerProgram@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a24d7edd17b38395557f56b76edf3b755ccc0d9a GIT binary patch literal 886 zcmV-+1Bv{JP)<h;3K|Lk000e1NJLTq001BW001Be0{{R3M5Kzw0004oP)t-s00000 z0000001^@s00000000000OjT7<mBW=mE+{(<T`!4N0#FN002dj;|>lEM3Lb-d%Q%C z;W>D|HgmZD|NlUT-b9h&L5kl*lHx#!-$s?=MU><4@bE#2-}?Ic?d|PGmg7W_;raRb z`1tss#P33k;6aPvLyzG<h2EgX@BaS&K!)D;_xEI{=tY&|W~}RCrswnX^Zfk$^z`&U zhTih>^6~NUMU&$7_4V%V?(gsKLyqB@zU}?}{rmg-gu(D<tm|Q<=47bpW2for>gq#~ z;pOG!p2F>Ct?Q}I^7i)jpTX{i!tp|l;AN=kh{W<ji{R_)>tUnjrpWMz!}4IG=VGMi zW2NU|r00Ua?w`W$Wvc0)#qNQ>?qQ<lr^@l6#_;Cm=7z)ZWU1+$!tIL2^oqvwi^ue1 zsp@B}>YK#xg~IS+rRRgd?}5JVsLSz-#`J2h>zl;zn!)a5rs$x>@1e->rN{4Ps_JR3 z>xsqlXszpIsp*@=@TSV|?Ck7<zwaq(xl{lE02OpnPE$4jFghC<5by7R>zj8kh&X_o zfT5dEoLmh600D|gL_t(|UaitaliV;A1Ypf1nay(O8DW^2nHQOv8N$r;&(|Q?v*mK- zlD@w0psp6O$#D!La~{~#sKAbpg}?wIFlAs=71m(#;XQQ!4v1!(USGVN%M`_m3t$`z z13*I&v*lbt769VPNuMlwL9~%|Dk4)TRsqUb5TJ>s(;HWW2;jtm0A2Xvv$;$Ga8NJM z9_mydY63HEJ_%4_>EAt7{up4;%?knmOM50FMirM19=lUlLJ5HOEREIn^(qwthWOOm zccotd&qFus>A)9KrHVm6|Kp;~eg-+mweEZ(IEAZ-8t6~zcYsLXV=FD4YgLLG5T-BN z?0dlZz`T65$>Ay*D1G~WO}`;vP1^XoMd4L6Fv5Oa+6x_#`}WRitd3W~EgpG(o}Mj4 z6yR6x`CYOKsre+-eUS)!lJ8vS;84DkRrD>ME-bc!3;;*H?u6^cDmp;VmV=B0KvDVd zoUxnN0Lafs96*fR@dq={O@cp|B_P5Q5b-Yn{}I@cW$Y?&SPHx27CM<~pWSq+N&o-= M07*qoM6N<$f|Uc{X8-^I literal 0 HcmV?d00001 diff --git a/chrome/skin/default/zotero/treeitem-document.png b/chrome/skin/default/zotero/treeitem-document.png deleted file mode 100644 index 0212ba5627a631112c6257b8fb49b44652e7fb0a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 373 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8gaDrq*Kgmxef|3N{{8#kzkmPx_wT1qpFV&7{OZ-Kj~_q2 zfB*i`qerJtpZ@aY%i+U^U%q_#`t|EKZ{9q9{P_9v=SPnoefI3xhYug#zI}V>(4ikc ze*F6N>*vp(zkmNedGh3$GiUz%`Sbt(|C5`Xnt^sHlmz(&1G)GBLrjeHTcFx{PZ!6K zid!M)ZVDY%;BW}+F|GdY>-g~hf1?*mdheN^?_oG$dvxzR6(xm}!qfklb9*egDq-v= zUN<LH<i?_{f2$KB=EpL+Y<aNmXSB`&;}f$#n(Zk&v2w@D;6|=5>)7}>E-)zmV(!pj yx$kh|YP8o`o`1629(+8u#6bUJ{H#>r1cnrMi5q5X0-ge$!r<xZ=d#Wzp$P!jAJRww diff --git a/chrome/skin/default/zotero/treeitem-film@2x.png b/chrome/skin/default/zotero/treeitem-film@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d763fc5c4629ab0d766483eccf06d115685a7774 GIT binary patch literal 830 zcmV-E1Ht@>P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800006VoOIv0RI60 z0RN!9r;`8x0`o~kK~z|U<(EBZ6hRn<pV`eNQ8-UD3h@U?EDkNTurr;FjUtMmD2Ro| zsOfA}kRaFu6aoQj5er2@L99eOJIh=W1o7vTLnBD`ayL8kS-5L<?{;r@5p4Wm*qOO+ zo_Y73Wxrea-$QjyOioT7R7%|zk&$5Po$I=nr>Cc%7Xjzx^mQ(@*3O8?_Q=$zwRQ&B zSwuiyPL}}R_rpaGg6nZ$$N2cTUqpcK|4EN=I`fhoNLu(e(Ua39z!(#DpG4=^pSkN= z0SOzceJgNt+c^eQ3ujFgC~@I>%_MO;!$}g5)NEukD`4$vUj!DKy8)2)XAnP?lj%U@ z2x3upC-96xnLP}13`Z(4H=ZsXWpr?!wfscP94VMW4x9`c#u)mY66;HYnEsc{Ij31+ zG3G|SJ<P3-H+Z|emlYXI<zzY#CMl&31BeI!Zt#1>*?{NNsXJHL(w@b!n|~h-@J(;z zZhZm)j5(3W$rKPdf+I-_6wt50QA_+7xI(!(g=4qH9?F)<=43jM7Aq`KaulutrQXwA zcZ!k><1Syqw)Ww*!E3|X3{D;auY&6sfEAyXd`I(zl7c=3t`l6<7u@n48b9u{90(Xl z;baPkSob=*aMy-LFx-@KFP72D>bvI6!(>jTfXKsgEjnNBtE6n493o#6Ihg{|-UBZ# z*7F@|!RY0{KZ)D|c3*u~s1_VP`!bhfU2j5bE!J9$F;m8vsc>Ah7Nl{CIIurDE?NuH zIJq6L){X@YYi;3Lkj5$EKw{*r1tJG}a#9@-k+3}qT1?cRTHySy1zLS1_HYWc{A^CD z1EEbysmFn!STV_43$i$=0z#D{axW&VU@hoR;baPEx7&${MQg#c*<?<p0MGLh6N}aY z&zsMc*Y#yotyX;irPLt+5$XA_HgkgxPOVmp-E@}&&1N&~{_XcbE>4#NLqkLFfvvG5 zr9LzojgijWUXhpM(j5z0>oKi$S!<2f`jgiByw-ZLh=9DDUocm|kuveGi2wiq07*qo IM6N<$g3v5@JOBUy literal 0 HcmV?d00001 diff --git a/chrome/skin/default/zotero/treeitem-instantMessage@2x.png b/chrome/skin/default/zotero/treeitem-instantMessage@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..cb22703d2790b8dd2956079e474b17f6ad16d396 GIT binary patch literal 667 zcmV;M0%ZM(P)<h;3K|Lk000e1NJLTq001BW001Be0{{R3M5Kzw0003XP)t-s00013 zhqzdWxLAa_Scte)h`U*Zyjh31SckY+h__dWxK)R^SckY+hqzdWxmkv}ScbS*hqzaV zxLJm|SckV*g|}FTxmbs}SBkb-hq+jXw^xU^SckYyiLqFRxL1g{Re-8lh`9j&|5%5( z|NsBu?*8BG{^9NZ=J5XK@&4NB{nzOI*y#P>?f&HN{@LjL?eh2I?*88F{{8;{-s}F` z>iym8{^jug?D6;d`~BDF{fev2>F@T8t<L%T|KsoeXOh0w=l%Qq|FOs3Wsttx>HYQj z{><9x{QdsC&*N*A!0z?_+3Ef6^Z1gn(Z|>4a+<^7?EdKT{^jrf{{H`RnZw-c{rCF+ zh^o!<_W9`X{@m*R>+tsc{r|Pf;AWA&R;Gb>0000ZbW%=J0PF4@tsWQh@vCnn^RTWc z?eMHnxkL7mBdUN^;|<ha22BB)Ie)<b009R{L_t(|Ufq$^asn{`MY9V93e?@@CRtzH zsk^(||NlidOdA$b`rPSxJ?Bm`3HdYhMKyGx4W>d~hYIwF45DZ>X&22$^vfWQDph#J zhztNqub(Z`toZ&$jv0o>Ii)~HU|D7*@Hxf|&*S-`5(M*`ulW@(mS5DMH5Z->Us8hB zoQZk99C%v^gqL&M&M1Mro$#lwqXhDHr9C_2*0(x>G_v%Y!rMM`>&^+SA|ZnTG|p(7 zTj&0PX2VZCq$9-Ix?iZhe_%Kg{_eQ+n@`)don0hGg;yEF!Qs&{Fg`(kB&MBTTw-!+ zn)F}>chF~Jq!)9*d~%^J)B_fmmdP(9S60dY<P#uDLXcitt!)4R002ovPDHLkV1ns! Bdout4 literal 0 HcmV?d00001 diff --git a/chrome/skin/default/zotero/treeitem-interview@2x.png b/chrome/skin/default/zotero/treeitem-interview@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..654d4c119709cb2a719b2cd0cd8a85c253b05f28 GIT binary patch literal 786 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabRA=0U~~!a32_B-BieWT|NsB~n}5$f z{Co2L-@VuWo`3q+wffwv_uqh0f!#a9+jmB`?F6zTT6TtZ?7sEtACMi{zVi;4@!;LR z+pqpTeg_oXp3tyAqGLNy{iApPLV@brLAoN_cf9!YFR%f~-d?@v^qWuLPu=@mv*`4v zZ@*%@cOSq0Jay8(cb|X6_3Y_bbq=ULynPo$V?yuV(3Z`S?b|{dR-L@_IihVxL<h*U z*B?L*3kR7GLmfNbefka(>;Q=Xy#sUr#5-N9&jP)6<Hg^%pT0kQ`|tV3e{Vj1fBF7f z$Evew6Zc(t_6KMh&?C2B{RO%K=$J3xe@)$d>DJ4?SD*d8`SS164<N5Sc>C|;*Pj#C zUjPQq_2++IeEfIq`QN**|6P9i=hD+ZGalaD1`J2Hk|4iehW#+mB(_OogRI>CcU$*= z1d7e%Sbb@~%DUGr`^6ew?LYo%{~w^>@BQ1|=6?PqUCeg;?b=WKx2*Y|@nPHkFL4E1 zz7+#w$lTM#F{C1H>qXb%!v+Fv52qeFlbV*67Sq1+%$fiH<JKF6DOrDA`~GXS%J~xv zjP)~Sa{Zp}D8{i#jg?*XgYo+Q*`LmCQsflMX^Fm-bX&;a*w2RJk4vm#*KNz&E7smz zd`x7)xxDSHD~dN=Wx8T1wwb}OzfX7J%6<3dNiDdXZG2-%g$u*38j0f2vmswutXUW2 z`zN?=F6sMSaDdOUbw#H9(;~IcGtSyAy}a~NvEBO2jtl4aTxJV+zFnVj(WCUM4Oa0n zLJRKCHE6K9Z!2JMFKJGLl{gn~LQz+P)&BZxjdF~o`|PtBia)bl`T2V}pV*=e9j<4C zSc93?tYK;~EKg-~t;$*)AoG>u&YeX$woIE|99zb4eR+}JTNejUcK!7`cC&kNUFa`w tJ;0{0t-L|j!isJ8i>ljSUjJVhzw|}j1J8@oc!80^;OXk;vd$@?2>`6R#v}j$ literal 0 HcmV?d00001 diff --git a/chrome/skin/default/zotero/treeitem-journalArticle@2x.png b/chrome/skin/default/zotero/treeitem-journalArticle@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c07b11a327f723619511bbf53bdae3f434cbd02f GIT binary patch literal 560 zcmV-00?+-4P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800006VoOIv0RI60 z0RN!9r;`8x0p&?VK~z|U#g{RU+AtV~AG=3xDn+47bvkuns2C7a+65t4Z{o*R-I?gZ zf?#2(RH_b0r~^ZFRCbp*=cG=YINbG>toVyR<$LVci50<<dcb?&mh0&|@Utr6mDT@n z<>CNu00o@uBqu<kucX7_aO`%wpVH^PD=R9mGEawu5N~(8-Iq9yZ-9H?&Y5TR69BFC zS93#ajZ!LiE$f?W9LE40k4G+-3tH=6qtWQ$bUOV3exxl^<q8NPvL>a>#l>dEjiM+b ziXx<xz0GFxIbDgn;!1ces4C`aMx9P4YeI-ph#-I}7#BbZ1OPWafaP+DQYz<lRlHa% zasUPO(!G$$3t(mmpp^2)P2~lcOeVS5_hy{WXXkjo-wy*Q%Jy1Hna$ev-!)z)FTiTG zs_nlkp3mp)0GjykitUvN0!Wgibgb-a=;{XpRLRV)?w$w&Sg+T?{wt-J&1RV`K>%h} zA^sQ7haiCQc<f67p7ui%|7!u%Rhj3lS75u{2K%p+Vmh6+1F%m$X#PF$eGR<;!{N}E z;*`A?TD^v$DxMj^0Q>zu*nh3{Kc{J9fHwY{xD~))Fz}_c(zE>+*s5BE7Xhf!e+RJl yz#|X|AwIr9-AB{0|BinHuM78{tN6FH9)AG^{WoOepS02d0000<MNUMnLSTZeCkZG3 literal 0 HcmV?d00001 diff --git a/chrome/skin/default/zotero/treeitem-letter@2x.png b/chrome/skin/default/zotero/treeitem-letter@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..412bdfbac8220fabb249e5ca560596a088175be7 GIT binary patch literal 1338 zcmV-A1;zS_P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F8000F6Nkl<ZcwWVp zeQZ-z7{;G-@9l>xZ0*KiFxHLnQO4YKP7zU@iTpvLf1n1HU^0{_#1Q|%NKDiaG>9KC z{1$`&#uxz=!iOd#kZ6L75sXfUAe6SS@-YT$CxdnLp2xN~<>ubGISS}6IXQ3A^PcxP z=Xvk#MXoI094vTi>#+^Xw+7dzW8{c}9C&+2Xr|&6e@d_s#9XQJ@UkzD&O{CfTm`T1 zjQAWnS4+xSngZNkI}9YT`_~R6E=z#iqFwHp|Kgn5&g(9qX<Kl*6v{fC^p_U8@L>IL z<mYKf6Tg_mwjWO;a`qx5c$`u^wRCo1&vg;-!RGcM33vAjNjwb!anD3ACXe$%*fL3A z-{JGv`&$Q+x}=2s#Gzu*l1HmA<Sbz2_D}<X^(4j=<Y{=Iz8E8YE(}E5xgKn3j-sQh z7bHVch`Ddfne_ct33&ILBd(;by-8vr38iYZ2h(ed;M5chf=oYb-+u}Rf-#Vg0N=k9 zbHDK3bK?{LDq!WV<F|uyBPA!fGzHUdDMDbB2f5G^>B3jdQFJGgAaRgVG&aqv+5e9M zmTYcydh>=XmE<ClT6eq~Bp^x9IEFDZJJa|bw5}sS^j(+daf4(M#0p=&<CRoz^j;Cr zv@3M0fY>M{YJ~u%2E6#T`GmcgF~d^KoMEoB%rN4|8^&PQfz!CGOOR|KMB|6g)cun3 zJ3MFA&d7z8JHlMIr;Vr1_b|=N8(R3%`W9X*^WJIZldGDUCfwf5C114i*)>0N!RiBl z&HwnP*@~26tt35Fr5-$S??{wny4+B&lekuN!v>@&FV4f_hXR;9-UpIHNUYT)=_ZL8 zb;GQQk|0bz`UCxvlt5QPBHklYGc)n$Gt7fXnh9>FipKjY@WY`FNFq<8;g=12V(#d& zzx@G{(6Y^v<<-wxk?+liZWA`Utk=G=Idnp1Vsil28(8*r2;r0MShMg>0A_P**^bWQ za5-`ATnqvNNh#4Esv^?ED5w}k6`fEG0T!W}svy+X4qv{<a>FE`*e#eip$v+uLQ@0= z#uVbz6k|9PIMO2(XAuH$stQ~#2d37ILlznqK(SenNv@vg2O%=b&&Cru2}yIhvj=WX zg(4J8s~c|$8^D6h$@4uf1S(6=a<~mm+YaIRhpRBS3o)(f=t^MerWPb6aaWBW-l1-o zm=<WXb-QYaMA=9mI=e0+812Aon|{Y*)BG4)G8CFRu#%)s9Ex^f!`>jedy=S09c1ii z^AWdOph?1Z1GvI%Ri(I;=tbmA3~P4>LEC$tu)c~(TGmt)7hq~lIV{*Mpv?mN2^;Dw z@!kGo2)D<O)b+kauZS_P)v2lol=|S&oH%tRj<Qi+Sg~6G*lxfi5{<zjRLp9qLQ%m@ z)>HKJpRN;-G;$*+<C*>`FZK3g0gS-f0|wzXV}tst5hyHhW3VW~5Kvj>&BURoA);cm zcMujB?T%w7VwuFr)g`IoE?g}t08(I_-v>nq1lwYn`3`@PX#uhp*qZR@@mMBd%FRac zoDqZyfeGctO&m!bYG13s-PMI4vKH9hgyCpBvv5ky2o!tWxE>Hdpu!6YV&B0|Lx5?4 zwFd$zwE=$tZUi-zg?MDjFw+9EuLTo^E4cBPkFsJ~@Lytn4~WH|wzf&iQp<;=J%$<g w`7$0%jBISpCwW4VlnW$z@_#5EO-d~I8@?1apz(+5O8@`>07*qoM6N<$f~t#qN&o-= literal 0 HcmV?d00001 diff --git a/chrome/skin/default/zotero/treeitem-magazineArticle@2x.png b/chrome/skin/default/zotero/treeitem-magazineArticle@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..f637971bcfa913b975e9bc4555f9710e644ac97c GIT binary patch literal 589 zcmV-T0<!&yP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800006VoOIv0RI60 z0RN!9r;`8x0s=`yK~z|U<yXH;!$25)k%GH}i;5_Uu7aDJLkDpX9IA_p4n+|E0S62I z1tP`8!ATKZD|YB6PGUg^i{hYG(80a7z0V={BbQt*O-u{o8`|%3mwR8|`|{-q{C7Aa zSUb2`1fzWr#y|uD0R)(1J_dmTF#$kGOaS4Th_=plvn2rNlc_KiyG`ycr*Q`;3fhcJ zfM^6nINqL3Q{ez|g)$gnRE(7Z;um%q#1#{e3P`Crj;_AaA>`j1a|7xM84?gar%7s_ z<n<Cvz-+<fV1F!f$I-{NkA{z5=Lof+Q-VZ@W5MHRLtBytc`OUkel8*`P?PJjYP$dr zkJblz&<1Q4$PWO(!cN(Ee`zlZ09ZX;j>UVja?be)#zrLjIY+a_tQ#_xR4!d<RRcZ? znr%0M`I%t=K;`yL--g`z>8S}T-9zmu$lr+t-z_(8^TlE;z!+1BTOih{#A8~};!^u9 z5f((fz=Bp;E$}43Ef5Nbv0BgMem2N;9{!L{sPEL~nKOR9&HNT5RKVBpGWuNSm7P=p zf5Qv4APT=xz*qxu&jLxG0=EWZSa5OuV%%6rTdm$lXRGn2Y(Z?;El@LehfCIdE;lO) z6VNT_^UkDnB#ht>wE%U1hH{0nIy!q_oyM3vz1{o=#vIeD;FStE#PT3|?*Vz85zD76 b>>tJtptk$cJ$h7p00000NkvXXu0mjf*5>~$ literal 0 HcmV?d00001 diff --git a/chrome/skin/default/zotero/treeitem-newspaperArticle@2x.png b/chrome/skin/default/zotero/treeitem-newspaperArticle@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..46b372441b4d74df2e9f9305a2c6937e72c4fa8a GIT binary patch literal 1456 zcmX|A2~5*x6z}GA9s_m8Eny<=Ff?-k6X$_jL=XgKsd#RpL$@GcBG)u91?SYM6GW~e zN7Dm23Y4-QAgmN8Q0~*lgIESFEl|)NwxvS*|Cjy5WH0UeUVrcV-ur#O_w`m7J;-Ib z+j0tp;t~=Za1iT;H{Yd;-~&q2+9{NG8^UOZ1M#z^rKPN_ti8Rxy1F_mD~rWq)hrmB z&6dmM3<jgEt?k~udpS8dOeV9UqCz5(WMpKtwzg(wX5PJfH#ax8pr8QTDl04V7fdV` zS5;LtH8qJuBB@l`*Vl(qd3kxgy}czRC1`<zC@2&PIUG)7W1~PIK#U{B#l_%&puWDo zyu2KZkWwfV0MQqukOGK;$O7!?=>Y=Y-Q8VVTZ`h@gA}gA<MB`v@!M2gT^%}t4^r5P zMlkRM=jP^S!~nTmE{+Tg41g8tfOBbSDPpuh3|T-1WkCQspcH&jQPG_{ci{PaK0FK{ z)PRRF;8R#wi2a?Noe&1S0K(809=bs^umVY$OokW|0mL?R1c*30I~%h1_xHm?H{fcu z`t6LMA)3O20LJmZ-Ci(&Skuzd($mv58VycOPEKmITBp;A%aSBHHa4bGsdPHs#KeTr zXdE9OpPHJA5@>K=P%@cJBO@cDqoW3c0fIo`>FH^V5_5q{QB|YAh&5oPP^#l4lb|s( zGt<z}@K~v898`5aRbfEShez~!z1?od<6$+A#8f<YI2;(+8U84w9vT{o66y$ofUx3$ zaR{r?YCE23qD4B$_3G6t>40i@c$h6$V|<DCU(C+VN(Qvi0!>#}7v=>$w<|8F@OF#O zAEY0mkOYZZ1Z^kjLx#SI2-0U^@h52hNID5Wk_aM*@VEO;m_7Y%bIv)-+~H92g^m2g zNfNf>p|(A97UyTDY;*C}=eA>3(qgjMoJO0H*gb31+laXYn{nqd9gQ&io7Y)i61$yd z^O0H795UlelEz>wTEIJv)@4qE(MlTjS`G9W!sJUm_36g7(**u-OF{zt4*wc)>5(O6 zogbw`?Nk5kh3MuNE=pnIA?5v8e9kpRcT~nIiS0X^`V0}`d<S9gPi9|Wztdu0Nqz58 zxQ|qsm2^Osm`&#~ePnSQ)(&wQH8Cv8JtF=rJ*BZ{s~2y7R3wKR^W91BR$*iybA5K| z#ck)kj~Qx{yW+CFO^e;jSXuQE3XA=(HAc_aBaVPnzqs!kZbnSVS4SQ(Fz#=?6ngs) z3x8=w+RuB>yILj$bzio}kIj~J)F0rVtopYr#rU8xulgTH__4W{=N@|N6aKWYo8(L4 z=AHRUeU0>W;8*K=FSZ&gKm1xdzJva`udhs&<QYsom@nD2`Pyq=4}p$p9OT4oxpCAX z{C4f+%8>n{tqGfg!*XN?n0t0zpdG!cpSpb6^>ryv?q(YGq@I2{Yv1r#&IqYdY>Jrp zO+4nMxxuJ>;#%Gn&5)km$aeF}@i^_?tB4`CeXz+jIWMaJ#KUdz4+_jbC3&WvY>U^K zE_Gi||7cOo4-#UH`r5q3#jq!Cv-hpVsr&NV1Vi)PS2kEzv<D{gnZKK!)@*TmHlHv^ z)hugwxowFZjuf5!dv#<g|Mc-iVU7B4XyreyTvw3EEh@C_{<t=o6V3`)HTdLxZV*+^ zr6m<`b0UM>u5^~U@7wO_vER2@D$M0sFOp|QuCshn48-D9g7kc^6>1Ncj^)j)q3RoW PzLbzadO(f;sjL41M@E1T literal 0 HcmV?d00001 diff --git a/chrome/skin/default/zotero/treeitem-note@2x.png b/chrome/skin/default/zotero/treeitem-note@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..1998973787b65dd642e61138224e2ca90fdbeef2 GIT binary patch literal 714 zcmV;*0yX`KP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800006VoOIv0RI60 z0RN!9r;`8x0)I(FK~z|U?N+;P6G0R`o7hPl3(<feAq7GP3euo-AZP-jr%siE5-HyR zACeECKvW5Z1O5jDS@?v2l!CR^p1Fr&9_!s1$GgN-_*$#+%+AiabMCow2UytuZb@}O z|9DTT5vX&Rc2sF&<2fJ-qyVBp(Ev3lVq5Lo>-+r@=2F#xe+dpsz(6Z-z=E{5_by3p z+0G7M7$;^rV0Q*`t`0aRW;<Z%1wy(mWun1a4!GE2&J0ikQcDAt0Sc(kq0R^9V`>0a zP*kRG$Nc-!n3=PBb0149n}A3Y26C7X$i-m3U(6w@&bW0nP)me13jmt5X#hsg(xlTg zPg4yTaPf=9!Bhm?J!;|``3ns=&pr5butFo%Im)Ipn`*$Np%v2wU{!&Fs_bBM4VdHg z=ZAw}a?I8rZW(q;0xg^-1!N-)xU*f=a-aY&XNwP6QwDrtp+e{0E;@G}MR9)}z3~nZ z;m!*k2z(aQ5}~VVRLH&^gE~W}_cYwN7=}0@Jg1HF!DO<@RmU0(*wTqH0AQH*0U4vy zds6XWY}-k?V>+-5xRPA4@IGLxR_E?BP!uQ%S$cvj?SssV$G$7l)9S`OP6ti{b*rJf zOmrW-1es%a`q41){RF@WYrV%62C4^DnGHG?7}r3A0XrGQ`u$z3+}bFZIQ@)a`U#Lx ziGkA2y$&1`G{4#!@Uapkt*f}Q^BT+DBV=EX4HM}Al(AhLSlxUDxYBJ;J<~J)llBc0 zhAA2dv%tlQ1h9;xbq(F^Js?@b?=SCcI0k-x(%uLb4Q{&RR1E}k&kmo{T_7pCIKiYi wOyd36MKtW+emk0RE1m@Be8FQ3ENo$a0I?v%1{C>;*8l(j07*qoM6N<$g54fCZvX%Q literal 0 HcmV?d00001 diff --git a/chrome/skin/default/zotero/treeitem-report@2x.png b/chrome/skin/default/zotero/treeitem-report@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9653b35523492b1d51c4dc599f4892f05fd7ed2f GIT binary patch literal 1005 zcmV<J0}}j+P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800006VoOIv0RI60 z0RN!9r;`8x1ENVpK~z|UwU^IpBt;a*Kh@o{yBelrf)Wv;8x$`FFBuX<5D`SslOpI@ z7)21lKVU%@|AO4at0#pW{DB^$EdJQV;6cH|9vmeB!5n(JV^3yws>(xmS66q}OwVHW z3qwuURQ3D5_rC8<m7s=iUPLPiT7o^k{5^a1wf_?n;7`x_lP*8H_<sJl2s{!193CFN zskQ#dwd&}-UdBo58|P_V2(brTbVtBO5rw;iARm7RJ_Z>7Jm_l$eiyVVQ!t%QGd^0I z&%EaXLWqhnAp|QcE7iF=qpx4cM0n{k$Qh)!G9kY7-K5oUn{mJp$WuV82GVzXXkGQJ zZfsfOF0^aFLYvojY8+e|xH;%+oom1<!@98#2mfUA=zL8!>TEJ!50LG<`uaoj3GD3b zTnDZLeDyqiE#cBurh$4Dlu;;No~NflMrZBAtaV4DRRe#$WBNcf+_`}#9$s;6Gx+6J zgw}d)Dgx)M1v>>c5#wR&{>6=?p@H;f)(3(x>jO}B;)($C=U@Lw8sXMCYdbv)3D_F= z@;UlS!aa|c8n7c!A>t65(EwD|EF`c<1H-p_#sfP7S6+FbwdC4L&=6P#%hbD+5-DY4 zZ?V?*eP**6p6Ai+cKswtWJ3f0-Wc@J5OhJ=f5|lx?|=HYBi!?Q!If9<M+kxM`vgJ2 z#>U2lBuT~%4Sexzu7Sru&D;?XLd+H0yvCHKDM1hr1Ob!DgoA^FZ#OqL_gXb@`c|m{ zJDeZ9_Mmy5PNz&J6UO5)TU%SM*BB&8!e}%?sjS4>HDIM+k;s%%&iq%LIXz`G8X=`* zI2>NH36vW6DenWTWgj>X6rM{d3B!>6{ryi20b2u~KVxY?mYr~!5}Q}=Ns<sn5lSh- zFl23Q4bSt0A+S&b{a&My&8u(MyvsO%QcA-z=YiU(c$wx>AdX|AC^BI$j00$$CAg`9 zAG7m7p#fcxm;)h%Ar%CrrsFs^IbU5}tr!P5J3A{0*cuo-ot+2neH^4DuWh&Y_OtK% zbUK}i=k>7LNYiv?2rSgV8@*N$dY*^x`v@T##@E-^U9TmM<EbIA2+REEd!9$9(=kTF zFl^m(a&mIpCSWvh`oo})s-6eYaD0565po<zi|<M)j*gDZ2}mhr#$sL8#x+qC-3G_K z;M!B@;zDXJr!#o+v)>w*k2@LbbGy5{<-MSSn&(9hwzs#>`*sX4brtn}z-8dVT`*WN b4h;VT3|$C^aUAdy00000NkvXXu0mjf7Fy3) literal 0 HcmV?d00001 diff --git a/chrome/skin/default/zotero/treeitem-webpage@2x.png b/chrome/skin/default/zotero/treeitem-webpage@2x.png index ba7bc2ef7ec2fb2da60cff2e720c0dd1a09cd73a..87c1f8cff4668a55f023c21c63e9cacd6bd8c09c 100644 GIT binary patch delta 943 zcmV;g15o^m5XA?OB!32COGiWi{{a60|De66lK=n%dPzh<R9J<rS3PS~K@>grzTGT{ z|3EEl1PhZ!3sGWhQfVha^be#HHN;@E76xO$LJR+bVrj35f&|-WD=3n5f~C>yI~H#~ z?#!FFY@!2i-|XC(chCJgGb3>A>iWkkBK0#8CqaM&0D`_x!ha2cq?0#&KfjSX83BST zZy#QIj4@4pN2Gp!aOFUp-%<_`YjgMC-5Uo$q6fAJ0xxf!3lg!D1Q0)BWnrl4^s46l zdiy7yzWRi^CP1ugu9ZCzJOJlHXKVQHy6(+%0MUBdK>&ZKxV>-&ssO>Yxs{CvB>+96 zKYWcKzWu0BlYj03>Y5mZ|8cA~V<Qstr;h>vruvG#ec;Z*G@iWN#;E3Sc6kHu*DohP zj0a52y-*}RDySqrDu8M;?&nkzB8ow;!l0-41;yR#(@+tR7|t%gDFa}^tq}wQ2(K^! zV?aazim6_OL9c2++?au?psr<jaVdg`9>^3YC=<&q5Pu`n=J9Q+uNd?dgPvm0tMHqO zrJFO2Cu$k`c`*k}xe3}$1W+dtKSu%7WzgqO^o!$bHIsx50FqiSA@CqX5~ZSqP&$F+ z%@bD(0K*S}j!*!N<*EgR3J8I%FMFn1(7bD6?$nWnGqOZC9&juNM#32bqEdkn4u}by z3yZ*nQh&YmZQIfu2w29rz#82o284iEkEp{`H^9VwQy{_6768lrGTs4g5CEV}@|1x@ z!<dy?Rt2VifM)Bz9RdO>NtC*CU_#e-gK%0h%Y%fep$P!DeRlG|q##<!7jhw1S_co9 z{r#{AFov*#nl2u&-amXKB8ZHzLUMQV04C>wiGM(#O;~ZaErh^Q<i8|i4#E?bH7wa} z?E+@P|J8h%1|I0l0mB22KJSNqJaf|YbI?o-uo+JPFXsE99<7b7y`YFXObOHyMk8)X z&W?7CpCev*iHiLq&jbE!ap8DBT2y$K4zISq`E@THGspUt2mC{c9;n1D?gB9epk^CO zo_}LW4$!Qw9DRS-9R({bTZT2EU(OFT{4Zno0=LAMi;6_0!J-(?kaS^XSAIkf*qc_t z1Ln#FV)blO1=fT4EvQ>2=6~}O&jTsTw2tNZO{a8RFUfKeOLD=;G9pYuutW0LwbiZU z=9^tMof{2+?6Mke%ZM_2*>&Ie-txd`#3)5jcJpg@t{jPS99%hMM}&)B?_d9?fEX$x R%Gv+`002ovPDHLkV1lPst~>w$ literal 2058 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}oCO|{#S9GG z!XV7ZFl&wk0|SdnW=KRygs+cPa(=E}VoH8es$NBI0Z=sqgH44MkeQoWlBiITo0C^; zRbi_HR$&EXgM{^!6u?SKvTc<jd;=7m^NUgyO!Z9k43zA+6ciL}ic-?7f?V97+JQV< zrHqo20xNy}^73-Ma$~*xqI7*jOG`_A10#JSBVC{h-Qvo;lEez#ykcdDAuw}XQj3#| zG7CyF^Yauy<|ZcPmzLNnDS<441Bg3IGSd(?<rPD{1@xdkNJigK&p;oWw$zGD9NIuK zIJKoD!+ljyT9gC!Q%bUaYEEiyYF<e(P@f@I>wsYk*NEcCio^nlW#B-B_{|37a;u=! z;{2RaP!NRXWtP|(*?>KSE{q5fh%V>++=8Oi;$omSJ5#6@WHEI05eRGS%wcvQ3!-cA zFUkb^G!f)3J42`i$YSW~Be7Y4EQq856!caBnH8xy5iXg)00sNP80adj66hM8^K<fx zf(sIpQ$Y>`Ye5o1R}Ho%5|=ed5=a_TlC6qMld@8iOORp<7-!(L@06IXk0flPk5#n| zFeO;|=BH$)Rk|dWq}mx77@F!D80i{XgculD85mg^0o{(K2FV2=8Rw$Z#FG4?ko^1{ zJFqWuL0ko6J!3tnUSt(e%{Ka=e1w#*Aej~{3e2^3TtHi4C4e0lr`nan3=GWmo-U3d z5u8WEZ8Jn1Md~(h-o0~z_l5w@XDUtt^&DNEi*H0|8cw@5tK&w;(zR22OQjrn!*AT^ z=un7Qy1CbdL&Hmo+f~t!v&w$=<L_zt-}Q=(cb6+pI<C9h`u*PbweQc)o@u+NRxI(z z_vfp!*K4dgA9Tee<mY;xB{y8Ex~9~`?ydb}b?+B*<KYi?Hv6xN?^Iek%QvR5Xm4a> z|8x2Ed*;mBCv33X<|A*a=Gi|-+j)h&CJLlYEUVfO7vSTl@bXosQKi$xr<0XK!XFzO z?fCxZ!>0qi+qt>7&W(F(KG{L6SNkQi6wj?|>(o^<E`)Ch?Ows7bbtHolDa)Ap*3Gl zSr?Z7ys`9baklr>{buEp9nyro_-}p@lMgd_P#x0Wk)>d#(E1~`|F5w-+i5MiwJs(9 zA75VjO0&Uy6T@2e^D-XyRpnG9eynh~c(klhMC9lUBLNP_G=mQ<>aBY$0_A4SUDb2H zX45ax39+_`D;wUWeyVkpYcO2ex+vXKLHy4HSH&C3HXfR{*10~qm2#8+NrbCT-OsSS zriN?>)(D;BQm}ie^<nRWOTALeW@1ZraBbjstWyy&DN|sObTnRm`hq#%!K@X=%HFI( zrqic37HUsf;*sHG(#VqC8JA$bZUKLis!!)3FG0i2OEw5!@H~(&_(E~tvE&!=(T2Hy z7&-mVvkD!U$6|CQt!PUN`<iU$IV=(_j8&=&3KQiOU0Qr9^DNDTt_PpE%oHj<XL7@N zUWVUs%NlfZ52;)bvs%S{+;_p#i>^1tG}Co>&-7+YmSKu9x|g<l+1a+qJuh=^H(p>| zD}3thBbA1;KJ95-dpjJ?7fhR%=kU$3LdWwRyG))RhkD}@_BnN8t#L^ltD^NUf0jFB zX|lsw_mRp1SzW%}vPD}M_-xug+{=4D$3n%m%p$t&a+*n~AJZPLsoiEJf7VV|ZqEF5 zKUc-?C(j;+=pJhKTW8l^qdsRdlf~tUie-oA@abJDXDhO`_II9sIIjP_HRE#;o2aS3 zsu#@f`RRN_mH*r=Q!ysb>kHXU8LxlZc+m3K)wEf?ksK;kHMb_VpY^rSHR^feDEg20 z<+6-J@;(>87@kt$at!95^MCgXjmZbji})#4vmH_YAIGi!Q<>G2GvU$Xh3&yBPtLo) zSw-@uN`SilojLJ;Y<vu}=9f!+Iq7}$wF;B%;jez-n-Bas{?KXp!TO3i{xfgt588W$ V^Lu%uZtwtA(4MY-F6*2UngA(i@sR)k diff --git a/chrome/skin/default/zotero/treeitem@2x.png b/chrome/skin/default/zotero/treeitem@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..b57a3361822cec7e607425911cc0d11a78e32b2f GIT binary patch literal 390 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyIRQQ)u0R?BgoK1(OopdVpFVl= zgpZF8C<0{s|NsBPhY!Dg{rdj>`=?KzK7Rc8`Sa(0|Ni~{{rl_JuRnhLc>DJ4-@kvq zeEIV8=g)87zP*3{{?DI3@7}$8{rdH*SFfHudj>S{&6_v1Y5^cScuIo&g3TBVtfVCc z-oLldf33sAECCeX>*?YcQW3ZIygMJWqJYaqw%d=d7+A6||9$@=o8rQiV%FDx>AspA zbhGz~pVk|8lRzgHha*YfSBqzU*eCO12lLlkKC$=uLNm9``zh(dVq;;rJ^7>XnP(rZ zss$Zw*Iesdr6K;ztb=1t#+xbDi8FEq1X(UV{Tv}G<7WM!KdRn@QQ>JbLvR(#j7^FM zrm!+DlVF(<q$Hrp;ljl<vB_bH0t%C134;PF!%ll9-;<gAo0eRd85IBIocdBn?RW8@ OK=gF=b6Mw<&;$U^8?RCT literal 0 HcmV?d00001 diff --git a/chrome/skin/default/zotero/treesource-collection@2x.png b/chrome/skin/default/zotero/treesource-collection@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..5bc379d1342f5f7710f3763ab34570e71da842ca GIT binary patch literal 628 zcmV-)0*n2LP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800006VoOIv0RI60 z0RN!9r;`8x0x3yEK~z|U?Uqez6hRP%pV>(K06mEWbBG8UJtqeRg{Wskg8l^|Afms+ zqX%#P1`i8f1ic6zlB<$v;w3~p3CS+Ws@qi_`eQ!Zongm=xCKR5&Cvb6{Z@6)z{Do@ zzgyyiPu<103QG;AznQ<gerFs49UrLZ5~4J7xxLk0xG@fapupD41qHagvJR?%0s<%+ za_5=+bN5zL%r7L#qxqGMR{+PtV{xNO4lD<*DXEYPP3<D+bKpXOfO-aiGT42FilCxy zbg{AVnX69#<<j!&Kw2vlDiYuBt^&+?*s=l$st(jhnS`-%P(m}nIdG{aQcx@<VBG%Q zBr%o%QXpY${C(po$yA4=)5(lUAy3EYv-d116C)5x;N&zWC%GqpBhlQ%Div@_1bpCR zHF?RiB#xh3<kaj<YDw;TLs8o+(GnC+K}sOs11Dy#bMpMP(rJk`o)+K53FJ?~=_`*j zi&b~I40e#i52y~oc`TludEf{{N}!Q@AlBt_w23+VI1)I`-6rZPFg$oyvEZ*if>i@M z4<)G8gaR^X1vtdMN$WJBqNoho0S<A^CRBf<<ftWJr=Y(%qa_G8l$FXV&;qc}{f8}n z6Z#Uk%fk^E8#ui43XCX0uXg|_KYRPAnjEloQ?a-y0Gkr2VZWcli7VjGzWitf7)&U^ zsITE33A5i`+^2n;qW}J3_Q9?Xvj2o@2w$837dH02#IW`kb~&+s)P4h&^_@MnCzZqi O0000<MNUMnLSTX%=^2{< literal 0 HcmV?d00001 diff --git a/chrome/skin/default/zotero/treesource-duplicates@2x.png b/chrome/skin/default/zotero/treesource-duplicates@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..61730634f17779f1eba5d228cec2d5e849e79e93 GIT binary patch literal 520 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dydjotzT!AzkT)lb~&IU3rT)2SD zg|I6tE32!ki;9XCE?l@`#fs(2mw)~G^~;wp-@bkO@#Dw$@83Uv{`~*{|M&0TfBN)k z{`~n}U0pRbHC0tr6%`d79UZf0&u(jLtE;P9x^yYfgkQgYm6es1l$3n<@S&%tXYu02 zO-)TRXU^>J?{8^oX=rGeIB{ZDR#r+%N>WnN^y$;5PMtb=^5mSHoHuXY%$+;8_g}vQ z&{<+7L4Lsu#xW8z`So;lCRs^^yG3|--F@)L=idEo6<>iWo_M-AhE&AOy>#90u!Bg; z!#{0z9h~&bvKD^7_xiWJn3M`%Xa8QOGgm!+&)qxgSpFd<uHxQVCW^WV3v|4e97vG6 zwRM60l!mAY{a@UfO1irHRbD*(n<!LL{ZoU}Z}(g!&ME(!Ib`DJ_B5ucatPY-=fx?s z3EjALZK)iqzWVR>^6TH-UuUzK?U#?gFPF#qWyj{-<z@R49j4p8?++_|`T0xCtw7h= zcLPIb-@LdfUuc{1rqKHt{%<u-*EFw`<(wjYqmQMA`S!$y`~+*E54<_<Oi$As1Pk8! pD}0(fRrUIowF!%^e$s8zS5eXVJ16JaW}tr=JYD@<);T3K0RT;A>d62A literal 0 HcmV?d00001 diff --git a/chrome/skin/default/zotero/treesource-library@2x.png b/chrome/skin/default/zotero/treesource-library@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..3955181a3882cac4e6356aff8bb02f9d8415116e GIT binary patch literal 792 zcmV+z1LypSP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800006VoOIv0RI60 z0RN!9r;`8x0?kQ8K~z|U?NvQ*6G0GtOI$^Spx6-k0!E1)A%#eE(1wo+BpM1@m-z<) zQQ$~OK#8EHNP!UlfsY?Sgn|G^u@lQ+M~-7U?+nH6?CqV;#F2beIN7@0*_nBBZ{N-W z|DTios3ha-a$${u=gel#VAx;y2Ef)~(C(r_yHXF=-qv5lu_oe%SLH&58BfE+!$6J! zZtS;jEl;TrUk*PHWx#?zk;K{A0?uDpbn84ABK1X5`liOt7JltkO;HR$Vg1p&y~+Rs zQE)~szkqXdixyDX#0rt@VvGDe7gjhuodW>$4)$ej<>r+s^>NcMp@xCyf+BjYU36R9 zU^bL9iyk<%A-Wd#%?2f$ot;Os_8raoH-B5!AHUzLOuQ@?DiCmHWP=6d@<nui@1WDH zLTiTB1WgQ0WagASCmmbYgu_l74A`wy=yhA7kChwCXVk=<tJ9xEY}ufQY`%m}a~u1O z>al<Z<`m9*ofa4hvllM|0R9}bT@e{MVlzPzGx;LgjVjuWA4V|$pf+g>z&zBq_Hz?` zA_SL~z^u@$ZGiz~WKZtizh{#yxn!`3;1wgKC;1He#_SST3h-uQ3jibI&MS#?ECEJH z>@zTOoMA8Hx*eHHX#cCBj~F2HW{!@TC^k>>rNp(#`D^YZm@ROu8VAyp3b30C3l=!z zz{%3mr*wdQU;Fu1grSnb0BcGGILsyO&V0BNp;Shi(g9{K-WQ=0gq(uDP6b%joXuVr z8SiL25vBngWxyAqGzedWDF92ZK@nO(Fd1uj495%X7@#-<B0}lieVq!h^K~6@hzR42 zXl%fC91)=~z+PXMMl^2Vh_75q@I(kQMNAg2Ctn^w#D3JJG(1iOkR(EJ#0ZI#)?M7u zH>S9&XAgopfH^NdLeXgU@N46C5t|)G-{9IQhFWD{Z|vaq>pjuCv0<He6=M}A{`m`> WAS~3p0<}K?0000<MNUMnLSTZIw`6Ys literal 0 HcmV?d00001 diff --git a/chrome/skin/default/zotero/treesource-search@2x.png b/chrome/skin/default/zotero/treesource-search@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c36e3d27eff4426fd0cf868235c45ea3d003366e GIT binary patch literal 1128 zcmV-u1eg1XP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F8000CpNkl<ZcwX(6 z+iz556vcn%%%w9^+9I}=O9ewfu8APT76b9ZlX!^|eb5A76#^RL|6uf0j1d!4jSnU~ z7?tRQHy$982qXgK)^ICQN=v3pXF4-yrsvyRvNP!kZHK04`XVb?*?XTenYF%e?Ma6J zJ?`T^ymJRO90Z<bX83*Oi^sSAHwM1jp!eil*s@~#@x%Y#z_(_AM_>LEP$Oz}idn|z z-UH7vLtOI2+q2@;V?PmrIHCX(#AL!8^;+u@WrkR)=%>IV6AWNLO_bo;UJyY=P^VTS zDov~2H6zPk`eka9$oQ<$doCP!1z-ul)CN$aI%h%}nTQO@RPo4^ap}b9ga}hdAT<M# zm{pr2L&L{E!t;H+m_J_qXr5FPZQCbBRwn`_GEm>d3=zdM{S7D}h!dz|prL&unT4At zU3ta9mEj~e@;=3q;uIQUAq$#9mW35kahd)GKtLz&fb~vDFX+0>O_Q?j&nGxJkfIt2 zB7zfeP8b!Rp?sX4>mHqpD<Di4fuKZN4qA81rF;=rI>TV4gTHcHa3Zv%ecGCnq~bmb z6oZidY`|d7aj-YR>f|O`gCq4LP!yPc%U$U_QaVf3#poI7GVzYN3EEoX=2L6AH)rBB zrRR`o@agR@aC+`;o*Xzeg#l-ET-@akfjU$}&@rsH8s5?OmDf{oF*~`53yh8lK~>C1 zGVals^yz5LkS$cXk#$^2Zvze!0el3EY7HtCRLUR$YAl0Pi249D;6||6GH+|Plbd+4 zB7_2CqKsCA!fh(h@n8lg%3xw66X7F@5#zMNs`j2@waLCTowUp;*G?{~sA4SEo;77+ zW;XA)PyZ`0vFNIe5Te!_t#>LoX99pu5*Gyzt-Zs{`k?^Si$DRbdt&T))HjetL@Aa- z6ljQhk+@YQmGEsIDUKmdNQVP=i$IKb7moV*@sl_au4V&Nv4zVde85g_+uu}+=fdA3 z_SyNRqxB;w<O_gO86B|*(C`kbJ&S%BZSpg|baFG7;&Q@c$wQ4arhF5IS`@(ft2wR@ z7a=UsI{53|Z$J@SJR}&WO2vqjiROT$W?7x+M#OP(V3ZS=bKELaZ8t(uviS-}&kb?5 z@0R7?)p(9v;IaR`b#L7HkLbg-*YH@xJ!0^Ir#Q1{4`Z4%ArZl<6N^a0fG1KttZJ=N zDr7l*_<OCCio0I__{3*s;Oqx$U+_F{ALv5v5!HALee<4UDDybE#KVYF8Y_LY7mv}N z{f(ibu(I=c8k^@)$`8}?#}68m3p;o0J+sea7O?;Q^*dtmRQIZ`ZL!Rp7DjV7IeFwq z7nVy~J!T2tyz|(OSVOXVP3N{)`nHMwOFdjXb?9@CS;W_S*1Q={Cc8V9uJebk^^(gC u?q;^})vguKe7SSkCttj^{O$d(5&H)mh_ANJv@3o90000<MNUMnLSTYKt{F7| literal 0 HcmV?d00001 diff --git a/chrome/skin/default/zotero/treesource-trash-full@2x.png b/chrome/skin/default/zotero/treesource-trash-full@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..081ac96f263e90f31699d5a957d517ac4d373685 GIT binary patch literal 1069 zcmV+|1k(G7P)<h;3K|Lk000e1NJLTq001BW001Be1ONa4*>kdg000B@Nkl<ZcwV)Y zeN0tl9LGP;bI!eRxx9^OP12YmI#91fEfDLrAT_nEX0w;so3&=vvbRlgwKiATU#^Wx zTiTi|6(h-(rZB9WBcm-dQ2_-Sq8K7_fqUVc%RT4m?yS2z#>@Dp&u_myJAXW%efN9L zo`<QUma1aLpfhExj{rYY$I)j~%G10_*~VRAD{OtZg*;qSOW<Y!KD@Ya<3@jNxh>$) z4ez)ap@Dh~90cQ&fuD3&;@X9GF80k$PIc*dZULY^t9$!YL=m8hs}l>nEF<}+7xIcd zE={<BFbWNTplZ0euXcYc!+cKPM1s4S^IpkA>*s5U0*43+Pzd0XJ*2)qva^xDr~=7& z+=?t+6A|ZaQ`tldf#s|UL5|E6&)tt?{=`G{AccSt+EtFgL7;FzBU27(2)q*uB(mnv z>SqwQ2%8u-AOJ-`mH&){$pqq9)AilYKH*J|3p#B<mh4qmf_qQabjAd7q6FI>`Ld~W z+n$=1?q1VS78VKC>1zj?Uq0yHwX=ESJxJu(1Sw3zjS0y7qF+)r|FG!<zoO&Dg+$?y zoA&yBGiOr=qXlzWOa?K+_1_de{N3i(wv(;D-?$L^JA%wg%t`f4FPMGXEK?XDNB@a_ z^5EW#m2*-PdqP#0E(D>#Q@$o^i4G{I!NlMOT};Pd^$rBD#uE5gl;Ns=%vYp@jm-wT z`Rw)|k97I>f6~5iT{_9Q5kQDGF5_W3fJ8V8;HFsWN7pZ2;%vu8$(;O8%f48J>y<x# ztL~#86NSRS7&YjaAP3K;ym>wwlOO^586u3*N>)`qDfM?xbu};^@lzlZZN(y+FvA!` zoB|IC6cp|lc&T>Fp>G%B9V>`0$!KXAHY0RX$3Kq7pq~(e<)tfTcF6j}6DN>>jW%T3 z1ZiN14rjZGg~<p~zVQIs?u(NPdeK_CZMrc@BAYM<HVQD1<mTR<e9rFgnoQ7%R@q{a zhD9G;C?vvZu+Zh|EVRpGGl;mLgPSJ<jV&4YuxX-~1lkFqqdA&sDQF>MvIJ0%R(9Ml zbMc{Zkw&gXTjFvQePJ}09>48o0fWOxf^orVuAB|N|9!;H=Pq;xNTkp?NF8M#??%hc z76`n|BcBu$2hSmCj0+Td2<+|LS{)AiSV>W|XOV;l!Kw32!*^(zvju|0XhC0Sdwtbq z2B{o<E6-p9X$w+5@E6RLA~wb|t!s}BL@IJhRwxF|tD&aA(XQI-7WD8jZH$I=-lClH z1z&AFQQds_QpK6a4-)-mD;4acGFk_ms$d;SFy6x=SjsY{5oefIW<)C$!7x3vafUxJ nnFPT+9^`pm<SB|t;Q!`dX9Ie#O0>zm00000NkvXXu0mjf-Np94 literal 0 HcmV?d00001 diff --git a/chrome/skin/default/zotero/treesource-trash@2x.png b/chrome/skin/default/zotero/treesource-trash@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d7eca38b00a554ac2eceb698ec69a0cbc24c9503 GIT binary patch literal 1150 zcmV-^1cCdBP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800006VoOIv0RI60 z0RN!9r;`8x1T#rQK~z|U?UzqT99JC2Kkv=V&Q5o;iq<Bn5z(*{DH@AHuBjo^Lr$@$ z+CzyTQ7<JB$Tg?jN{I(c;w9*<f>nCS77sR+79(jlU_HcWCAe63Ev|0%Uw3w=hnd~3 zB+!g{C^TPK9=zS(?|pv1_j_-D5B~2GN3d0aW}pRlA7}tHKms<f3&emmU==7F7l03F z2hIZlcTu1FsRp2G{0mqF7J%GQ0P28?K&`Ip{^8-_4%0L*#N+X1Ddh<%r4&M7+jbF1 zheDyvXf(P!F){JGWm)B{e1nr2&j117V<33@_U#J;0|TELhEYE~Jxw~DcEYu7gb*l- zf}$t{0s(q^d)eRLPmYd`M#jd*o&y=+YZnH^13(whaR2`Op25Mv>zby$Q!15s`t&J6 z2(DheifNjdrb$~{8|&-q*tU&nniz)R@9F7j_xt_(j~+cry21Pg&VIeAP6D#8ukRD8 zGAE@(QC^LsoQ1N45DW|qTy)nwSDsfr02r?Efo<#S>%+1vipAoAANTh5BIUvOgb>2D z4^{&303ZQ5H8u4u|5W!I%eHOC$H#vx`zg<Rsew*F+1lF5Y;SLGw70jnXqsk}N+n9A z61HtqDwP~kDUnhlgg{D3GMU`FbLY;(nVFfbWHMR6$-?(u0X_uO2M->6HZ(LeKQ=b@ z^WNTGOjXr_Tm6cZQnPKFY&M&T$K!uSqtW$y_wM~PGBWbRlP6D-w{G3KG&eW5?gB)> z+cEqc(6+a?$DciWwtVyE&F>Z$7hmFBKq{}lhyZA7YYW}DapR*iXU?=-xpHOHo&Ey6 z6=7xX!r^fH%*@OOtE;PP3kwUYOG`^T%gf8@jg1Wpkj>4_e$zBV9UUDFU0q$Rjg5^> z`FvjFa=Egfio5`bYGcc?WJ^m+I2;a#uU)%_Z974i$9z6dE|+6xXNS$rO&S^+s{K?l zf2a%q6pKX?i3FKUhT7U%g25m@pAYAxK{}mgZEcMgFJ536Mm4~JqkL$9vU0f`ySuv- zi$y}A5W22c=G~OP&d>1y976vIfQsG%cm+603wJC4$B}{Kxd)D*1DW*VFb{}SD)kaT z(=;?q`&XktAV5=769B1HD(kNKvi!Z5f5Vf&>AJeQLU(ufIVmN<V33-c8gyMp(=>cO zABv*jHm20n)Ntz5DHKJaP$)1tIr;0#%E}(F1U&W%@CR^yetv#GlgaFKc6K%zhM}vf zieVV&x{j(kJ1T^zT*;PYkw_%cckkYPJUcrZ1NMQhfGl{g>PDa+cu&(bt-rs&_44J* zXIooa->t8&KM@QD{kCnBN~Q9#SS-D=vXYEMBC$v$5_em+1n?!!V}-*2fYTdZ!g(JA zae4r?YAn}PweLLe5SYek%PTs{xvqX8odr$<A=hUXC)(#g6!^u3c&k_RHv)chZ;=N8 Qs{jB107*qoM6N<$f<Ac~WB>pF literal 0 HcmV?d00001 diff --git a/chrome/skin/default/zotero/treesource-unfiled@2x.png b/chrome/skin/default/zotero/treesource-unfiled@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..887c69985bcf9e6d381ac6d4e05ae0927ec2bd2d GIT binary patch literal 429 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyT>(BJu0R?Mynp{5D6(nOrdO|C zL8MNeJo*3s|8L*E{rmUt^XJch{`@&`;J}wJUp{^M^x?yYU%!6+`0?ZS@893Qe?NNk z=&@tRPMtb+@Zdq9IY1N6o;~~V<HzI2kN^Dn^Y7okZ{ECl_wL=EJ$v@<-FxWJp|4-R z9zJ~d#EBF8_U&V}pWy(skEbNaFW8JB(Lhq*tn`gz-ufxYFMk2Wk9oQ{hE&8Yz2v^h zNl~Enq1cfx51yr*ySe@U+swcq_N9`Q$Kp%>HmiMg|MzR}`iUw%!Y(O$dKD`Y*j$|1 zp1eM~^@siI>uydyF`N#&X5O8C)OA0rWn<g%Il7D&toN}v9QR`QA=D7T$q>)fFlm|Z zrnjd$1(sAA?@ishTaamT+3(CqNo%ng&ezpaWfUHtU{0A+(a<xC{lp3-21&sN9_}Ts zP7Df%nN;^P8tD||GdA>aIJB_`JmThG@FbZ*<0r2NmzsS8S4)Wh<yER%YVzfMK_Tnu L>gTe~DWM4fZ34}v literal 0 HcmV?d00001 diff --git a/chrome/skin/default/zotero/zotero.css b/chrome/skin/default/zotero/zotero.css index 146af6ea9..9d496e9cb 100644 --- a/chrome/skin/default/zotero/zotero.css +++ b/chrome/skin/default/zotero/zotero.css @@ -43,13 +43,6 @@ toolbarpaletteitem[place="palette"] #zotero-toolbar-save-button-single { list-style-image: url("chrome://zotero/skin/treeitem-webpage@2x.png"); } -@media (min-resolution: 1.5dppx) { - #zotero-toolbar-save-button[cui-areatype="toolbar"], - #zotero-toolbar-save-button-single[cui-areatype="toolbar"] { - list-style-image: url("chrome://zotero/skin/treeitem-webpage@2x.png"); - } -} - /* Show single icon for combo buttons in palette */ toolbarpaletteitem[place="palette"] #zotero-toolbar-main-button { list-style-image: url("chrome://zotero/skin/zotero-z-32px-australis.svg"); @@ -369,4 +362,13 @@ label.zotero-text-link { { width: 29.5em; max-width: 29.5em; -} \ No newline at end of file +} + + +/* BEGIN 2X BLOCK -- DO NOT EDIT MANUALLY -- USE 2XIZE */ +@media (min-resolution: 1.5dppx) { + #zotero-toolbar-save-button,#zotero-toolbar-save-button-single { list-style-image: url("chrome://zotero/skin/treeitem-webpage@2x.png"); } + #zotero-toolbar-save-button[cui-areatype="menu-panel"],#zotero-toolbar-save-button-single[cui-areatype="menu-panel"],toolbarpaletteitem[place="palette"] #zotero-toolbar-save-button,toolbarpaletteitem[place="palette"] #zotero-toolbar-save-button-single { list-style-image: url("chrome://zotero/skin/treeitem-webpage@2x.png"); } + .zotero-scrape-popup-library { list-style-image: url('chrome://zotero/skin/treesource-library@2x.png'); } + .zotero-scrape-popup-collection { list-style-image: url('chrome://zotero/skin/treesource-collection@2x.png'); } +} From bfbf3d871c4373f5263d99e6957bf62acfb6044c Mon Sep 17 00:00:00 2001 From: Dan Stillman <dstillman@zotero.org> Date: Mon, 6 Apr 2015 17:39:21 -0400 Subject: [PATCH 26/44] Fix display of sync error icon (2x and spacing) --- chrome/content/zotero-platform/mac/overlay.css | 6 +++++- chrome/content/zotero-platform/unix/overlay.css | 2 +- chrome/content/zotero-platform/win/overlay.css | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/chrome/content/zotero-platform/mac/overlay.css b/chrome/content/zotero-platform/mac/overlay.css index fc2911e58..0d3ef0981 100644 --- a/chrome/content/zotero-platform/mac/overlay.css +++ b/chrome/content/zotero-platform/mac/overlay.css @@ -108,9 +108,13 @@ } @media (min-resolution: 1.5dppx) { - .zotero-tb-button > .toolbarbutton-icon { + #zotero-pane .toolbarbutton-icon { max-width: 28px; } + + #zotero-tb-sync-error .toolbarbutton-icon { + width: 16px; + } } .zotero-tb-button, .zotero-tb-button:first-child, .zotero-tb-button:last-child { diff --git a/chrome/content/zotero-platform/unix/overlay.css b/chrome/content/zotero-platform/unix/overlay.css index 25561b683..5dad77db1 100644 --- a/chrome/content/zotero-platform/unix/overlay.css +++ b/chrome/content/zotero-platform/unix/overlay.css @@ -93,7 +93,7 @@ /* End toolbar buttons */ -@media (min-resolution: 1dppx) { +@media (min-resolution: 1.5dppx) { #zotero-toolbar .toolbarbutton-icon { width: 16px; } diff --git a/chrome/content/zotero-platform/win/overlay.css b/chrome/content/zotero-platform/win/overlay.css index ea5c06a21..19fa5e9e9 100644 --- a/chrome/content/zotero-platform/win/overlay.css +++ b/chrome/content/zotero-platform/win/overlay.css @@ -100,7 +100,7 @@ } /* End toolbar buttons */ -@media (min-resolution: 1dppx) { +@media (min-resolution: 1.5dppx) { #zotero-toolbar .toolbarbutton-icon { width: 16px; } From 2f3d865f11a5db3dd77f355bcda88a86e287108d Mon Sep 17 00:00:00 2001 From: Dan Stillman <dstillman@zotero.org> Date: Mon, 6 Apr 2015 23:14:32 -0400 Subject: [PATCH 27/44] Favor left-bound name matches in QuickFormat bar https://forums.zotero.org/discussion/48047/ --- .../content/zotero/integration/quickFormat.js | 28 +++++++++++++++---- 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/chrome/content/zotero/integration/quickFormat.js b/chrome/content/zotero/integration/quickFormat.js index f3c0962a1..430036761 100644 --- a/chrome/content/zotero/integration/quickFormat.js +++ b/chrome/content/zotero/integration/quickFormat.js @@ -318,21 +318,21 @@ var Zotero_QuickFormat = new function () { Zotero.debug("Searched cited items"); } - _updateItemList(citedItems, citedItemsMatchingSearch, searchResultIDs, isAsync); + _updateItemList(citedItems, citedItemsMatchingSearch, str, searchResultIDs, isAsync); }).done(); if(!completed) { // We are going to have to wait until items have been retrieved from the document. // Until then, show item list without cited items. Zotero.debug("Getting cited items asynchronously"); - _updateItemList(false, false, searchResultIDs); + _updateItemList(false, false, str, searchResultIDs); isAsync = true; } else { Zotero.debug("Got cited items synchronously"); } } else { // No search conditions, so just clear the box - _updateItemList([], [], []); + _updateItemList([], [], "", []); } } @@ -353,7 +353,7 @@ var Zotero_QuickFormat = new function () { /** * Updates the item list */ - function _updateItemList(citedItems, citedItemsMatchingSearch, searchResultIDs, preserveSelection) { + function _updateItemList(citedItems, citedItemsMatchingSearch, searchString, searchResultIDs, preserveSelection) { var selectedIndex = 1, previousItemID; // Do this so we can preserve the selected item after cited items have been loaded @@ -411,7 +411,25 @@ var Zotero_QuickFormat = new function () { if(searchResultIDs.length && (!citedItemsMatchingSearch || citedItemsMatchingSearch.length < 50)) { var items = Zotero.Items.get(searchResultIDs); + searchString = searchString.toLowerCase(); + items.sort(function _itemSort(a, b) { + var creatorsA = a.getCreators(), creatorsB = b.getCreators(), + caExists = creatorsA.length ? 1 : 0, cbExists = creatorsB.length ? 1 : 0; + + // Favor left-bound name matches (e.g., "Baum" < "Appelbaum"), + // using last name of first author + if (caExists && cbExists) { + let caStartsWith = creatorsA[0].ref.lastName.toLowerCase().indexOf(searchString) == 0; + let cbStartsWith = creatorsB[0].ref.lastName.toLowerCase().indexOf(searchString) == 0; + if (caStartsWith && !cbStartsWith) { + return -1; + } + else if (!caStartsWith && cbStartsWith) { + return 1; + } + } + var libA = a.libraryID ? a.libraryID : 0, libB = b.libraryID ? b.libraryID : 0; if(libA !== libB) { // Sort by number of cites for library @@ -430,8 +448,6 @@ var Zotero_QuickFormat = new function () { } // Sort by last name of first author - var creatorsA = a.getCreators(), creatorsB = b.getCreators(), - caExists = creatorsA.length ? 1 : 0, cbExists = creatorsB.length ? 1 : 0; if(caExists !== cbExists) { return cbExists-caExists; } else if(caExists) { From 796a1a2898d52617b3841468fd63934b31078663 Mon Sep 17 00:00:00 2001 From: Dan Stillman <dstillman@zotero.org> Date: Mon, 6 Apr 2015 23:32:15 -0400 Subject: [PATCH 28/44] Use firstCreator instead of creators[0] for QuickFormat sort Previously, if an editor was entered before an author, it would sort by the editor. Now, as long as there's an author, it will sort by that first (and, with 2f3d865f, favor left-bound matches). Addresses the second issue on https://forums.zotero.org/discussion/48047/ --- .../content/zotero/integration/quickFormat.js | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/chrome/content/zotero/integration/quickFormat.js b/chrome/content/zotero/integration/quickFormat.js index 430036761..1272d4e5f 100644 --- a/chrome/content/zotero/integration/quickFormat.js +++ b/chrome/content/zotero/integration/quickFormat.js @@ -412,16 +412,16 @@ var Zotero_QuickFormat = new function () { var items = Zotero.Items.get(searchResultIDs); searchString = searchString.toLowerCase(); + var collation = Zotero.getLocaleCollation(); items.sort(function _itemSort(a, b) { - var creatorsA = a.getCreators(), creatorsB = b.getCreators(), - caExists = creatorsA.length ? 1 : 0, cbExists = creatorsB.length ? 1 : 0; + var firstCreatorA = a.firstCreator, firstCreatorB = b.firstCreator; // Favor left-bound name matches (e.g., "Baum" < "Appelbaum"), // using last name of first author - if (caExists && cbExists) { - let caStartsWith = creatorsA[0].ref.lastName.toLowerCase().indexOf(searchString) == 0; - let cbStartsWith = creatorsB[0].ref.lastName.toLowerCase().indexOf(searchString) == 0; + if (firstCreatorA && firstCreatorB) { + let caStartsWith = firstCreatorA.toLowerCase().indexOf(searchString) == 0; + let cbStartsWith = firstCreatorB.toLowerCase().indexOf(searchString) == 0; if (caStartsWith && !cbStartsWith) { return -1; } @@ -448,10 +448,12 @@ var Zotero_QuickFormat = new function () { } // Sort by last name of first author - if(caExists !== cbExists) { - return cbExists-caExists; - } else if(caExists) { - return creatorsA[0].ref.lastName.localeCompare(creatorsB[0].ref.lastName); + if (firstCreatorA !== "" && firstCreatorB === "") { + return -1; + } else if (firstCreatorA === "" && firstCreatorB !== "") { + return 1 + } else if (firstCreatorA) { + return collation.compareString(1, firstCreatorA, firstCreatorB); } // Sort by date From ac363101fc0f3d1cc600197fe3909827d0a7dc02 Mon Sep 17 00:00:00 2001 From: Aurimas Vinckevicius <aurimas.dev@gmail.com> Date: Mon, 30 Mar 2015 23:09:14 -0500 Subject: [PATCH 29/44] Always use latest Firefox version and echo it for tests Don't echo version on Windows, because it hangs Firefox Also add testing with Firefox Beta (and prior ESR, but commented out for now, since we don't support it and we know it breaks) --- .travis.yml | 19 +++++++++++++------ test/runtests.sh | 5 +++++ 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index 4e0365777..84c005e71 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,15 +2,22 @@ language: cpp compiler: - gcc env: - matrix: - - FIREFOXVERSION="36.0.1" - - FIREFOXVERSION="31.5.0esr" + - FX_PATH_SUFFIX="" + - FX_PATH_SUFFIX="-esr" + - FX_PATH_SUFFIX="-beta" +# - FX_PATH_SUFFIX="-prior-esr" +matrix: + fast_finish: true + allow_failures: + - env: FX_PATH_SUFFIX="-beta" + - env: FX_PATH_SUFFIX="-prior-esr" notifications: email: false -before_install: +install: + - wget -r -l1 -np -nd -R "index.html*" "http://ftp.mozilla.org/pub/mozilla.org/firefox/releases/latest${FX_PATH_SUFFIX}/linux-x86_64/en-US/?F=0&P=*.tar.*" + - tar -xf firefox-*.tar.* +before_script: - export DISPLAY=:99.0 - sh -e /etc/init.d/xvfb start - - wget http://ftp.mozilla.org/pub/firefox/releases/${FIREFOXVERSION}/linux-x86_64/en-US/firefox-${FIREFOXVERSION}.tar.bz2 - - tar -xjf firefox-${FIREFOXVERSION}.tar.bz2 script: - test/runtests.sh -x firefox/firefox diff --git a/test/runtests.sh b/test/runtests.sh index 90f831001..27cf5b633 100755 --- a/test/runtests.sh +++ b/test/runtests.sh @@ -77,6 +77,11 @@ user_pref("extensions.zotero.firstRunGuidance", false); user_pref("extensions.zotero.firstRun2", false); EOF + +if [ -z $IS_CYGWIN ]; then + echo "`MOZ_NO_REMOTE=1 NO_EM_RESTART=1 \"$FX_EXECUTABLE\" -v`" +fi + makePath FX_PROFILE "$PROFILE" MOZ_NO_REMOTE=1 NO_EM_RESTART=1 "$FX_EXECUTABLE" -profile "$FX_PROFILE" \ -chrome chrome://zotero-unit/content/runtests.html -test "$TESTS" $FX_ARGS From f6510419cbe32832a76a556564deb0457199d53c Mon Sep 17 00:00:00 2001 From: Aurimas Vinckevicius <aurimas.dev@gmail.com> Date: Mon, 30 Mar 2015 23:52:38 -0500 Subject: [PATCH 30/44] Skip test for "recognizePDF without DOI" on Travis-CI Breaks due to CAPTCHA when tests are run frequently --- chrome/content/zotero/xpcom/zotero.js | 1 + components/zotero-service.js | 4 ++++ test/runtests.sh | 6 +++++- test/tests/recognizePDF.js | 2 ++ 4 files changed, 12 insertions(+), 1 deletion(-) diff --git a/chrome/content/zotero/xpcom/zotero.js b/chrome/content/zotero/xpcom/zotero.js index 799156335..221765c0a 100644 --- a/chrome/content/zotero/xpcom/zotero.js +++ b/chrome/content/zotero/xpcom/zotero.js @@ -210,6 +210,7 @@ Components.utils.import("resource://gre/modules/Services.jsm"); if (options) { if (options.openPane) this.openPane = true; + if (options.noUserInput) this.noUserInput = true; } this.mainThread = Components.classes["@mozilla.org/thread-manager;1"].getService().mainThread; diff --git a/components/zotero-service.js b/components/zotero-service.js index 389185bc5..111005c64 100644 --- a/components/zotero-service.js +++ b/components/zotero-service.js @@ -447,6 +447,10 @@ ZoteroCommandLineHandler.prototype = { } } } + + if (cmdLine.handleFlag("ZoteroNoUserInput", false)) { + zInitOptions.noUserInput = true; + } }, contractID: "@mozilla.org/commandlinehandler/general-startup;1?type=zotero", diff --git a/test/runtests.sh b/test/runtests.sh index 27cf5b633..6da6f8796 100755 --- a/test/runtests.sh +++ b/test/runtests.sh @@ -77,11 +77,15 @@ user_pref("extensions.zotero.firstRunGuidance", false); user_pref("extensions.zotero.firstRun2", false); EOF - +# -v flag on Windows makes Firefox process hang if [ -z $IS_CYGWIN ]; then echo "`MOZ_NO_REMOTE=1 NO_EM_RESTART=1 \"$FX_EXECUTABLE\" -v`" fi +if [ "$TRAVIS" = true ]; then + FX_ARGS="$FX_ARGS --ZoteroNoUserInput" +fi + makePath FX_PROFILE "$PROFILE" MOZ_NO_REMOTE=1 NO_EM_RESTART=1 "$FX_EXECUTABLE" -profile "$FX_PROFILE" \ -chrome chrome://zotero-unit/content/runtests.html -test "$TESTS" $FX_ARGS diff --git a/test/tests/recognizePDF.js b/test/tests/recognizePDF.js index 670422748..2bbb07368 100644 --- a/test/tests/recognizePDF.js +++ b/test/tests/recognizePDF.js @@ -38,6 +38,8 @@ describe("PDF Recognition", function() { }); it("should recognize a PDF without a DOI", function() { + if (Zotero.noUserInput) this.skip(); // CAPTCHAs make this fail + this.timeout(30000); // Import the PDF var testdir = getTestDataDirectory(); From 31941c079871af1eeae717105e9da343c8af70d8 Mon Sep 17 00:00:00 2001 From: Dan Stillman <dstillman@zotero.org> Date: Tue, 7 Apr 2015 01:14:18 -0400 Subject: [PATCH 31/44] Fix flashing console window for Retrieve Metadata on Windows --- chrome/content/zotero/recognizePDF.js | 9 ++--- chrome/content/zotero/xpcom/fulltext.js | 48 +++++++++++++++---------- 2 files changed, 33 insertions(+), 24 deletions(-) diff --git a/chrome/content/zotero/recognizePDF.js b/chrome/content/zotero/recognizePDF.js index 71bab85e4..2dc988449 100644 --- a/chrome/content/zotero/recognizePDF.js +++ b/chrome/content/zotero/recognizePDF.js @@ -139,13 +139,10 @@ var Zotero_RecognizePDF = new function() { cacheFile.remove(false); } - var exec = Zotero.getZoteroDirectory(); - exec.append(Zotero.Fulltext.pdfConverterFileName); + var {exec, args} = Zotero.Fulltext.getPDFConverterExecAndArgs(); + args.push('-enc', 'UTF-8', '-nopgbrk', '-layout', '-l', pages, file.path, cacheFile.path); - var args = ['-enc', 'UTF-8', '-nopgbrk', '-layout', '-l', pages]; - args.push(file.path, cacheFile.path); - - Zotero.debug('RecognizePDF: Running pdftotext '+args.join(" ")); + Zotero.debug("RecognizePDF: Running " + exec + " " + args.map(arg => "'" + arg + "'").join(" ")); return Zotero.Utilities.Internal.exec(exec, args).then(function() { if(!cacheFile.exists()) { diff --git a/chrome/content/zotero/xpcom/fulltext.js b/chrome/content/zotero/xpcom/fulltext.js index fc7976ecf..3da6d83a3 100644 --- a/chrome/content/zotero/xpcom/fulltext.js +++ b/chrome/content/zotero/xpcom/fulltext.js @@ -381,6 +381,25 @@ Zotero.Fulltext = new function(){ } + this.getPDFConverterExecAndArgs = function () { + if (!this.pdfConverterIsRegistered()) { + throw new Error("PDF converter is not registered"); + } + + if (_pdfConverterScript) { + return { + exec: _pdfConverterScript, + args: [_pdfConverter.path] + } + } + + return { + exec: _pdfConverter, + args: [] + } + } + + /* * Returns true if MIME type is converted to text and cached before indexing * (e.g. application/pdf is run through pdftotext) @@ -640,17 +659,18 @@ Zotero.Fulltext = new function(){ var totalPages = this.getTotalPagesFromFile(itemID); } catch (e) { - Zotero.debug("Error running pdfinfo"); + Components.utils.reportError(e); + Zotero.debug("Error running pdfinfo", 1); + Zotero.debug(e, 1); } } else { Zotero.debug(this.pdfInfoName + " is not available"); } - var args = [] - if (_pdfConverterScript) { - args.push(_pdfConverter.path); - } + var proc = Components.classes["@mozilla.org/process/util;1"] + .createInstance(Components.interfaces.nsIProcess); + var {exec, args} = this.getPDFConverterExecAndArgs(); args.push('-enc', 'UTF-8', '-nopgbrk'); if (allPages) { @@ -664,24 +684,16 @@ Zotero.Fulltext = new function(){ } args.push(file.path, cacheFile.path); - var proc = Components.classes["@mozilla.org/process/util;1"] - .createInstance(Components.interfaces.nsIProcess); - if (_pdfConverterScript) { - Zotero.debug("Running " + _pdfConverterScript.path + ' ' - + args.map(arg => "'" + arg + "'").join(' ')); - proc.init(_pdfConverterScript); - } - else { - Zotero.debug("Running " + _pdfConverter.path + ' ' - + args.map(arg => "'" + arg + "'").join(' ')); - proc.init(_pdfConverter); - } + Zotero.debug("Running " + exec.path + " " + args.map(arg => "'" + arg + "'").join(" ")); try { + proc.init(exec); proc.runw(true, args, args.length); } catch (e) { - Zotero.debug("Error running pdftotext"); + Components.utils.reportError(e); + Zotero.debug("Error running pdftotext", 1); + Zotero.debug(e, 1); return false; } From adadc9e03a061ab7c4be8492680a8414c5805f0b Mon Sep 17 00:00:00 2001 From: Dan Stillman <dstillman@zotero.org> Date: Tue, 7 Apr 2015 01:15:13 -0400 Subject: [PATCH 32/44] Accept a string path in Zotero.Utilities.Internal.exec() --- chrome/content/zotero/xpcom/utilities_internal.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/chrome/content/zotero/xpcom/utilities_internal.js b/chrome/content/zotero/xpcom/utilities_internal.js index 8ca85b457..eab37ea3d 100644 --- a/chrome/content/zotero/xpcom/utilities_internal.js +++ b/chrome/content/zotero/xpcom/utilities_internal.js @@ -290,11 +290,16 @@ Zotero.Utilities.Internal = { /** * Launch a process - * @param {nsIFile} cmd Path to command to launch + * @param {nsIFile|String} cmd Path to command to launch * @param {String[]} args Arguments given * @return {Promise} Promise resolved to true if command succeeds, or an error otherwise */ "exec":function(cmd, args) { + if (typeof cmd == 'string') { + Components.utils.import("resource://gre/modules/FileUtils.jsm"); + cmd = new FileUtils.File(cmd); + } + if(!cmd.isExecutable()) { return Q.reject(cmd.path+" is not an executable"); } From 61e11f9afa476a93c96b527867e54a0a6d8b1136 Mon Sep 17 00:00:00 2001 From: Dan Stillman <dstillman@zotero.org> Date: Tue, 7 Apr 2015 03:03:52 -0400 Subject: [PATCH 33/44] Fix main toolbar icons in 2x mode on Win/Linux --- .../content/zotero-platform/mac/overlay.css | 2 +- .../content/zotero-platform/unix/overlay.css | 37 +++++++++++-------- .../content/zotero-platform/win/overlay.css | 20 +++++++--- 3 files changed, 36 insertions(+), 23 deletions(-) diff --git a/chrome/content/zotero-platform/mac/overlay.css b/chrome/content/zotero-platform/mac/overlay.css index 0d3ef0981..ace263648 100644 --- a/chrome/content/zotero-platform/mac/overlay.css +++ b/chrome/content/zotero-platform/mac/overlay.css @@ -179,7 +179,7 @@ background-size: 14px; } -@media (min-resolution: 2dppx) { +@media (min-resolution: 1.5dppx) { #zotero-pane-stack[oldsearchfield] textbox[type=search] > .textbox-input-box { background: url("chrome://zotero/skin/mac/moz/Search@2x.png") left no-repeat; background-size: 14px; diff --git a/chrome/content/zotero-platform/unix/overlay.css b/chrome/content/zotero-platform/unix/overlay.css index 5dad77db1..3500fe859 100644 --- a/chrome/content/zotero-platform/unix/overlay.css +++ b/chrome/content/zotero-platform/unix/overlay.css @@ -1,12 +1,21 @@ -/* +/* As of Fx36, the built-in styles don't properly handle a menu-button within combined buttons. */ +#zotero-toolbar-main-button-single[cui-areatype="toolbar"] .toolbarbutton-icon, +#zotero-toolbar-save-button-single[cui-areatype="toolbar"] .toolbarbutton-icon { + width: 32px; +} + +#zotero-toolbar-main-button[cui-areatype="toolbar"] .toolbarbutton-icon, +#zotero-toolbar-save-button[cui-areatype="toolbar"] .toolbarbutton-icon { + width: 28px; +} + #zotero-toolbar-main-button[cui-areatype="toolbar"] { margin-right: -1px; } #zotero-toolbar-main-button[cui-areatype="toolbar"] .toolbarbutton-icon { - width: 28px !important; margin-left: 2px; margin-right: -3px; padding-left: 5px !important; @@ -26,16 +35,6 @@ padding-right: 6px !important; } -#zotero-toolbar-save-button[cui-areatype="toolbar"] > .toolbarbutton-menubutton-dropmarker { - margin-top: 2px; - margin-bottom: 2px; -} - -#zotero-toolbar-save-button[cui-areatype="toolbar"] > .toolbarbutton-menubutton-dropmarker .dropmarker-icon { - padding-left: 14px !important; - padding-right: 3px !important; -} - #zotero-toolbar-save-button[cui-areatype="toolbar"] > .toolbarbutton-menubutton-dropmarker { margin-top: 6px; margin-bottom: 6px; @@ -47,6 +46,16 @@ margin-bottom: 0; } +#zotero-toolbar-save-button[cui-areatype="toolbar"] > .toolbarbutton-menubutton-dropmarker .dropmarker-icon { + padding-left: 14px !important; + padding-right: 3px !important; +} + +#zotero-toolbar-save-button-single[cui-areatype="toolbar"] > .toolbarbutton-menubutton-dropmarker > .dropmarker-icon { + margin-top: 3px; + margin-bottom: 3px; +} + #zotero-toolbar-buttons[cui-areatype="toolbar"] > separator { /* Copied from .toolbarbutton-menubutton-dropmarker::before */ display: -moz-box; @@ -86,10 +95,6 @@ box-shadow: var(--toolbarbutton-active-boxshadow); transition-duration: 10ms; } - -#zotero-toolbar-main-button-single[cui-areatype="toolbar"] .toolbarbutton-icon { - width: 32px; -} /* End toolbar buttons */ diff --git a/chrome/content/zotero-platform/win/overlay.css b/chrome/content/zotero-platform/win/overlay.css index 19fa5e9e9..756291aee 100644 --- a/chrome/content/zotero-platform/win/overlay.css +++ b/chrome/content/zotero-platform/win/overlay.css @@ -1,12 +1,24 @@ -/* +/* As of Fx36, the built-in styles don't properly handle a menu-button within combined buttons. */ +#zotero-toolbar-main-button-single[cui-areatype="toolbar"] .toolbarbutton-icon { + width: 32px; +} + +#zotero-toolbar-save-button-single[cui-areatype="toolbar"] .toolbarbutton-icon { + width: 30px; +} + +#zotero-toolbar-main-button[cui-areatype="toolbar"] .toolbarbutton-icon, +#zotero-toolbar-save-button[cui-areatype="toolbar"] .toolbarbutton-icon { + width: 28px; +} + #zotero-toolbar-main-button[cui-areatype="toolbar"] { margin-right: -1px !important; } #zotero-toolbar-main-button[cui-areatype="toolbar"] .toolbarbutton-icon { - width: 28px; margin-left: 2px; margin-right: -1px; padding-left: 5px !important; @@ -94,10 +106,6 @@ #zotero-toolbar-save-button[cui-areatype="toolbar"] > menupopup { margin-top: -5px; } - -#zotero-toolbar-main-button-single[cui-areatype="toolbar"] .toolbarbutton-icon { - width: 32px; -} /* End toolbar buttons */ @media (min-resolution: 1.5dppx) { From fe79954b964857cf27e8aec409aed3713d44b6fa Mon Sep 17 00:00:00 2001 From: Dan Stillman <dstillman@zotero.org> Date: Tue, 7 Apr 2015 14:25:24 -0400 Subject: [PATCH 34/44] Fix HiDPI icons in trees on Linux --- chrome/content/zotero-platform/unix/overlay.css | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/chrome/content/zotero-platform/unix/overlay.css b/chrome/content/zotero-platform/unix/overlay.css index 3500fe859..ca2f342dc 100644 --- a/chrome/content/zotero-platform/unix/overlay.css +++ b/chrome/content/zotero-platform/unix/overlay.css @@ -124,4 +124,10 @@ #zotero-tb-search .textbox-search-icon { visibility: hidden; +} + +/* As of Fx37, the tree doesn't scale HiDPI images properly on Linux */ +#zotero-collections-tree treechildren::-moz-tree-image, +#zotero-items-tree treechildren::-moz-tree-image { + height: 16px; } \ No newline at end of file From c398353d5d52982b31771fccc6398bef8b693758 Mon Sep 17 00:00:00 2001 From: Dan Stillman <dstillman@zotero.org> Date: Tue, 7 Apr 2015 14:26:49 -0400 Subject: [PATCH 35/44] Remove obsolete CSS include --- chrome/content/zotero/itemPane.xul | 1 - 1 file changed, 1 deletion(-) diff --git a/chrome/content/zotero/itemPane.xul b/chrome/content/zotero/itemPane.xul index b36d50ba0..4b6c35a5a 100644 --- a/chrome/content/zotero/itemPane.xul +++ b/chrome/content/zotero/itemPane.xul @@ -24,7 +24,6 @@ ***** END LICENSE BLOCK ***** --> <?xml-stylesheet href="chrome://zotero/skin/itemPane.css" type="text/css"?> -<?xml-stylesheet href="chrome://zotero-platform/content/itemPane.css" type="text/css"?> <!DOCTYPE window SYSTEM "chrome://zotero/locale/zotero.dtd"> From 2afebc79d0da8ba655c36d37856c2f3c28506d1e Mon Sep 17 00:00:00 2001 From: Dan Stillman <dstillman@zotero.org> Date: Tue, 7 Apr 2015 14:37:13 -0400 Subject: [PATCH 36/44] Set tree image height to 16px everywhere Windows maybe also doesn't handle HiDPI tree images correctly otherwise --- chrome/content/zotero-platform/unix/overlay.css | 6 ------ chrome/skin/default/zotero/overlay.css | 6 ++++++ 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/chrome/content/zotero-platform/unix/overlay.css b/chrome/content/zotero-platform/unix/overlay.css index ca2f342dc..3500fe859 100644 --- a/chrome/content/zotero-platform/unix/overlay.css +++ b/chrome/content/zotero-platform/unix/overlay.css @@ -124,10 +124,4 @@ #zotero-tb-search .textbox-search-icon { visibility: hidden; -} - -/* As of Fx37, the tree doesn't scale HiDPI images properly on Linux */ -#zotero-collections-tree treechildren::-moz-tree-image, -#zotero-items-tree treechildren::-moz-tree-image { - height: 16px; } \ No newline at end of file diff --git a/chrome/skin/default/zotero/overlay.css b/chrome/skin/default/zotero/overlay.css index faf9df941..22e882884 100644 --- a/chrome/skin/default/zotero/overlay.css +++ b/chrome/skin/default/zotero/overlay.css @@ -24,6 +24,12 @@ min-height: 5.2em; } +/* As of Fx37, the tree doesn't scale HiDPI images properly on Windows and Linux */ +#zotero-collections-tree treechildren::-moz-tree-image, +#zotero-items-tree treechildren::-moz-tree-image { + height: 16px; +} + #zotero-collections-tree treechildren::-moz-tree-image(primary) { margin-right: 5px; From b2d561252641aad1b7aa45c13104678dc73d460f Mon Sep 17 00:00:00 2001 From: Dan Stillman <dstillman@zotero.org> Date: Tue, 7 Apr 2015 16:59:33 -0400 Subject: [PATCH 37/44] Fix sync and debug output submission in Nightly (sendAsBinary() removal) --- .../content/zotero/preferences/preferences_advanced.js | 9 ++++++++- chrome/content/zotero/xpcom/sync.js | 7 ++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/chrome/content/zotero/preferences/preferences_advanced.js b/chrome/content/zotero/preferences/preferences_advanced.js index ea54b5af6..97ccefe46 100644 --- a/chrome/content/zotero/preferences/preferences_advanced.js +++ b/chrome/content/zotero/preferences/preferences_advanced.js @@ -730,9 +730,16 @@ Zotero_Preferences.Debug_Output = { } }; try { - req.sendAsBinary(data); + // Send binary data + let numBytes = data.length, ui8Data = new Uint8Array(numBytes); + for (let i = 0; i < numBytes; i++) { + ui8Data[i] = data.charCodeAt(i) & 0xff; + } + req.send(ui8Data); } catch (e) { + Zotero.debug(e, 1); + Components.utils.reportError(e); ps.alert( null, Zotero.getString('general.error'), diff --git a/chrome/content/zotero/xpcom/sync.js b/chrome/content/zotero/xpcom/sync.js index c5c264d98..f2a9fc324 100644 --- a/chrome/content/zotero/xpcom/sync.js +++ b/chrome/content/zotero/xpcom/sync.js @@ -1804,7 +1804,12 @@ Zotero.Sync.Server = new function () { } }; try { - req.sendAsBinary(data); + // Send binary data + let numBytes = data.length, ui8Data = new Uint8Array(numBytes); + for (let i = 0; i < numBytes; i++) { + ui8Data[i] = data.charCodeAt(i) & 0xff; + } + req.send(ui8Data); } catch (e) { _error(e); From 1e2346eba14b7d818714df1555407a9207aaac4e Mon Sep 17 00:00:00 2001 From: Dan Stillman <dstillman@zotero.org> Date: Wed, 8 Apr 2015 14:40:31 -0400 Subject: [PATCH 38/44] Revert to modified 3.02 binaries on Windows To deal with issues running .vbs scripts on some systems. If the 3.02 binaries haven't been reinstalled since this version, reinstall them as 3.02a automatically or on manual upgrade to fix corrupted binaries from previous gzip issue. Other platforms unchanged --- .../zotero/preferences/preferences_search.js | 41 +++++++++----- chrome/content/zotero/recognizePDF.js | 2 +- chrome/content/zotero/xpcom/fulltext.js | 32 +++++++++-- chrome/content/zotero/xpcom/schema.js | 56 +++++++++++++------ 4 files changed, 95 insertions(+), 36 deletions(-) diff --git a/chrome/content/zotero/preferences/preferences_search.js b/chrome/content/zotero/preferences/preferences_search.js index 51930fd72..50202bbc9 100644 --- a/chrome/content/zotero/preferences/preferences_search.js +++ b/chrome/content/zotero/preferences/preferences_search.js @@ -182,23 +182,34 @@ Zotero_Preferences.Search = { var infoIsRegistered = Zotero.Fulltext.pdfInfoIsRegistered(); var bothRegistered = converterIsRegistered && infoIsRegistered; + // On Windows, install if not installed or anything other than 3.02a + if (Zotero.isWin) { + var converterVersionAvailable = !converterIsRegistered + || Zotero.Fulltext.pdfConverterVersion != '3.02a'; + var infoVersionAvailable = !infoIsRegistered + || Zotero.Fulltext.pdfInfoVersion != '3.02a'; + var bothAvailable = converterVersionAvailable && infoVersionAvailable; + latestVersion = "3.02a"; + } // Install if not installed, version unknown, outdated, or // Xpdf 3.02/3.04 (to upgrade to Poppler), - var converterVersionAvailable = (!converterIsRegistered || - Zotero.Fulltext.pdfConverterVersion == 'UNKNOWN' - || latestVersion > Zotero.Fulltext.pdfConverterVersion - || (!latestVersion.startsWith('3.02') - && Zotero.Fulltext.pdfConverterVersion.startsWith('3.02')) - || (!latestVersion.startsWith('3.02') && latestVersion != '3.04' - && Zotero.Fulltext.pdfConverterVersion == '3.04')); - var infoVersionAvailable = (!infoIsRegistered || - Zotero.Fulltext.pdfInfoVersion == 'UNKNOWN' - || latestVersion > Zotero.Fulltext.pdfInfoVersion - || (!latestVersion.startsWith('3.02') - && Zotero.Fulltext.pdfInfoVersion.startsWith('3.02')) - || (!latestVersion.startsWith('3.02') && latestVersion != '3.04' - && Zotero.Fulltext.pdfInfoVersion == '3.04')); - var bothAvailable = converterVersionAvailable && infoVersionAvailable; + else { + var converterVersionAvailable = (!converterIsRegistered || + Zotero.Fulltext.pdfConverterVersion == 'UNKNOWN' + || latestVersion > Zotero.Fulltext.pdfConverterVersion + || (!latestVersion.startsWith('3.02') + && Zotero.Fulltext.pdfConverterVersion.startsWith('3.02')) + || (!latestVersion.startsWith('3.02') && latestVersion != '3.04' + && Zotero.Fulltext.pdfConverterVersion == '3.04')); + var infoVersionAvailable = (!infoIsRegistered || + Zotero.Fulltext.pdfInfoVersion == 'UNKNOWN' + || latestVersion > Zotero.Fulltext.pdfInfoVersion + || (!latestVersion.startsWith('3.02') + && Zotero.Fulltext.pdfInfoVersion.startsWith('3.02')) + || (!latestVersion.startsWith('3.02') && latestVersion != '3.04' + && Zotero.Fulltext.pdfInfoVersion == '3.04')); + var bothAvailable = converterVersionAvailable && infoVersionAvailable; + } // Up to date -- disable update button if (!converterVersionAvailable && !infoVersionAvailable) { diff --git a/chrome/content/zotero/recognizePDF.js b/chrome/content/zotero/recognizePDF.js index 2dc988449..819761caa 100644 --- a/chrome/content/zotero/recognizePDF.js +++ b/chrome/content/zotero/recognizePDF.js @@ -142,7 +142,7 @@ var Zotero_RecognizePDF = new function() { var {exec, args} = Zotero.Fulltext.getPDFConverterExecAndArgs(); args.push('-enc', 'UTF-8', '-nopgbrk', '-layout', '-l', pages, file.path, cacheFile.path); - Zotero.debug("RecognizePDF: Running " + exec + " " + args.map(arg => "'" + arg + "'").join(" ")); + Zotero.debug("RecognizePDF: Running " + exec.path + " " + args.map(arg => "'" + arg + "'").join(" ")); return Zotero.Utilities.Internal.exec(exec, args).then(function() { if(!cacheFile.exists()) { diff --git a/chrome/content/zotero/xpcom/fulltext.js b/chrome/content/zotero/xpcom/fulltext.js index 3da6d83a3..09654e246 100644 --- a/chrome/content/zotero/xpcom/fulltext.js +++ b/chrome/content/zotero/xpcom/fulltext.js @@ -191,7 +191,6 @@ Zotero.Fulltext = new function(){ Components.utils.import("resource://gre/modules/FileUtils.jsm"); Zotero.debug("Saving " + uri.spec + " to " + file.path); - var output = FileUtils.openSafeFileOutputStream(file); NetUtil.asyncFetch(uri, function (is, status) { if (!Components.isSuccessCode(status)) { Zotero.debug(status, 1); @@ -204,9 +203,28 @@ Zotero.Fulltext = new function(){ Zotero.File.putContentsAsync(file, is) .then(function () { + // Delete if too small, since a 404 might not be detected above + if (file.fileSize < 50000) { + var msg = file.path + " is too small -- deleting"; + Zotero.debug(msg, 1); + Components.utils.reportError(msg); + try { + file.remove(false); + } + catch (e) { + Zotero.debug(e, 1); + Components.utils.reportError(e); + } + if (callback) { + callback(false); + } + return; + } + var scriptExt = _getScriptExtension(); // On Windows, write out script to hide pdftotext console window - if (tool == 'converter') { + // TEMP: disabled + if (false && tool == 'converter') { if (Zotero.isWin) { var content = Zotero.File.getContentsFromURL('resource://zotero/hide.' + scriptExt); var scriptFile = Zotero.getTempDirectory(); @@ -215,7 +233,8 @@ Zotero.Fulltext = new function(){ } } // Write out output redirection script for pdfinfo - else if (tool == 'info') { + // TEMP: disabled on Windows + else if (!Zotero.isWin && tool == 'info') { var content = Zotero.File.getContentsFromURL('resource://zotero/redirect.' + scriptExt); var scriptFile = Zotero.getTempDirectory(); scriptFile.append('pdfinfo.' + scriptExt); @@ -246,6 +265,10 @@ Zotero.Fulltext = new function(){ // Write the version number to a file var versionFile = destDir.clone(); versionFile.append(fileName + '.version'); + // TEMP + if (Zotero.isWin) { + version = '3.02a'; + } Zotero.File.putContents(versionFile, version + ''); Zotero.Fulltext.registerPDFTool(tool); @@ -327,7 +350,8 @@ Zotero.Fulltext = new function(){ // If scripts exist, use those instead switch (tool) { case 'converter': - if (Zotero.isWin) { + // TEMP: disabled + if (false && Zotero.isWin) { var script = Zotero.getZoteroDirectory(); script.append('pdftotext.' + _getScriptExtension()) if (script.exists()) { diff --git a/chrome/content/zotero/xpcom/schema.js b/chrome/content/zotero/xpcom/schema.js index 1ec995ecc..71ea7ad84 100644 --- a/chrome/content/zotero/xpcom/schema.js +++ b/chrome/content/zotero/xpcom/schema.js @@ -1604,27 +1604,51 @@ Zotero.Schema = new function(){ return; } - if (Zotero.Fulltext.pdfInfoIsRegistered()) { - let currentVersion = Zotero.Fulltext.pdfInfoVersion; - if (currentVersion < availableVersion || currentVersion.startsWith('3.02') - || currentVersion == 'UNKNOWN') { + // TEMP + if (Zotero.isWin) { + if (Zotero.Fulltext.pdfInfoIsRegistered()) { + if (Zotero.Fulltext.pdfInfoVersion != '3.02a') { + installInfo = true; + } + } + // Install missing component if one is installed + else if (Zotero.Fulltext.pdfConverterIsRegistered()) { installInfo = true; } - } - // Install missing component if one is installed - else if (Zotero.Fulltext.pdfConverterIsRegistered()) { - installInfo = true; - } - if (Zotero.Fulltext.pdfConverterIsRegistered()) { - let currentVersion = Zotero.Fulltext.pdfConverterVersion; - if (currentVersion < availableVersion || currentVersion.startsWith('3.02') - || currentVersion == 'UNKNOWN') { + if (Zotero.Fulltext.pdfConverterIsRegistered()) { + if (Zotero.Fulltext.pdfConverterVersion != '3.02a') { + installConverter = true; + } + } + // Install missing component if one is installed + else if (Zotero.Fulltext.pdfInfoIsRegistered()) { installConverter = true; } + availableVersion = '3.02'; } - // Install missing component if one is installed - else if (Zotero.Fulltext.pdfInfoIsRegistered()) { - installConverter = true; + else { + if (Zotero.Fulltext.pdfInfoIsRegistered()) { + let currentVersion = Zotero.Fulltext.pdfInfoVersion; + if (currentVersion < availableVersion || currentVersion.startsWith('3.02') + || currentVersion == 'UNKNOWN') { + installInfo = true; + } + } + // Install missing component if one is installed + else if (Zotero.Fulltext.pdfConverterIsRegistered()) { + installInfo = true; + } + if (Zotero.Fulltext.pdfConverterIsRegistered()) { + let currentVersion = Zotero.Fulltext.pdfConverterVersion; + if (currentVersion < availableVersion || currentVersion.startsWith('3.02') + || currentVersion == 'UNKNOWN') { + installConverter = true; + } + } + // Install missing component if one is installed + else if (Zotero.Fulltext.pdfInfoIsRegistered()) { + installConverter = true; + } } let prefKey = 'pdfToolsInstallError'; From c1a581168abe5f43bc7533f7d203f63a1d8aaae0 Mon Sep 17 00:00:00 2001 From: Dan Stillman <dstillman@zotero.org> Date: Thu, 9 Apr 2015 00:26:12 -0400 Subject: [PATCH 39/44] Merge locales from Transifex --- chrome/locale/cs-CZ/zotero/preferences.dtd | 6 +- chrome/locale/cs-CZ/zotero/zotero.dtd | 6 +- chrome/locale/cs-CZ/zotero/zotero.properties | 50 ++++++------- chrome/locale/el-GR/zotero/about.dtd | 4 +- chrome/locale/el-GR/zotero/zotero.dtd | 78 ++++++++++---------- chrome/locale/fa/zotero/zotero.properties | 40 +++++----- chrome/locale/sl-SI/zotero/preferences.dtd | 2 +- chrome/locale/sl-SI/zotero/zotero.properties | 32 ++++---- chrome/locale/zh-CN/zotero/preferences.dtd | 2 +- chrome/locale/zh-CN/zotero/zotero.properties | 28 +++---- 10 files changed, 124 insertions(+), 124 deletions(-) diff --git a/chrome/locale/cs-CZ/zotero/preferences.dtd b/chrome/locale/cs-CZ/zotero/preferences.dtd index 431604a0f..ab4e5c3fb 100644 --- a/chrome/locale/cs-CZ/zotero/preferences.dtd +++ b/chrome/locale/cs-CZ/zotero/preferences.dtd @@ -160,7 +160,7 @@ <!ENTITY zotero.preferences.prefpane.advanced "Pokročilé"> <!ENTITY zotero.preferences.advanced.filesAndFolders "Soubory a Složky"> -<!ENTITY zotero.preferences.advanced.keys "Shortcuts"> +<!ENTITY zotero.preferences.advanced.keys "Klávesové zkratky"> <!ENTITY zotero.preferences.prefpane.locate "Najít"> <!ENTITY zotero.preferences.locate.locateEngineManager "Správce mechanismu pro vyhledávání článků"> @@ -201,6 +201,6 @@ <!ENTITY zotero.preferences.debugOutputLogging.submitToServer "Odeslat na Zotero Server"> <!ENTITY zotero.preferences.openAboutConfig "Otevřít about:config"> -<!ENTITY zotero.preferences.openCSLEdit "Open Style Editor"> -<!ENTITY zotero.preferences.openCSLPreview "Open Style Preview"> +<!ENTITY zotero.preferences.openCSLEdit "Otevřít Editor stylů"> +<!ENTITY zotero.preferences.openCSLPreview "Otevřít Náhled stylů"> <!ENTITY zotero.preferences.openAboutMemory "Otevřít about:memory"> diff --git a/chrome/locale/cs-CZ/zotero/zotero.dtd b/chrome/locale/cs-CZ/zotero/zotero.dtd index 99c0a63a1..29e503abd 100644 --- a/chrome/locale/cs-CZ/zotero/zotero.dtd +++ b/chrome/locale/cs-CZ/zotero/zotero.dtd @@ -6,8 +6,8 @@ <!ENTITY zotero.general.delete "Smazat"> <!ENTITY zotero.general.ok "OK"> <!ENTITY zotero.general.cancel "Zrušit"> -<!ENTITY zotero.general.refresh "Refresh"> -<!ENTITY zotero.general.saveAs "Save As…"> +<!ENTITY zotero.general.refresh "Obnovit"> +<!ENTITY zotero.general.saveAs "Uložit jako..."> <!ENTITY zotero.errorReport.title "Chybová zpráva Zotera"> <!ENTITY zotero.errorReport.unrelatedMessages "Může obsahovat zprávy nesouvisející se Zoterem."> @@ -125,7 +125,7 @@ <!ENTITY zotero.item.textTransform "Převést text"> <!ENTITY zotero.item.textTransform.titlecase "Velká Písmena"> <!ENTITY zotero.item.textTransform.sentencecase "Velké první písmeno"> -<!ENTITY zotero.item.creatorTransform.nameSwap "Swap First/Last Names"> +<!ENTITY zotero.item.creatorTransform.nameSwap "Zaměnit křestní jména / přijmení"> <!ENTITY zotero.toolbar.newNote "Nová poznámka"> <!ENTITY zotero.toolbar.note.standalone "Nová samostatná poznámka"> diff --git a/chrome/locale/cs-CZ/zotero/zotero.properties b/chrome/locale/cs-CZ/zotero/zotero.properties index 2ebde2695..21d427ff7 100644 --- a/chrome/locale/cs-CZ/zotero/zotero.properties +++ b/chrome/locale/cs-CZ/zotero/zotero.properties @@ -42,7 +42,7 @@ general.create=Vytvořit general.delete=Smazat general.moreInformation=Více informací general.seeForMoreInformation=Pro více informací se podívejte na %S -general.open=Open %S +general.open=Otevřít %S general.enable=Povolit general.disable=Zakázat general.remove=Odstranit @@ -204,11 +204,11 @@ pane.items.trash.multiple=Jste si jisti, že chcete přesunout vybranou položku pane.items.delete.title=Smazat pane.items.delete=Jste si jisti, že chcete smazat zvolenou položku? pane.items.delete.multiple=Jste si jisti, že chcete smazat zvolené položky? -pane.items.remove.title=Remove from Collection -pane.items.remove=Are you sure you want to remove the selected item from this collection? -pane.items.remove.multiple=Are you sure you want to remove the selected items from this collection? -pane.items.menu.remove=Remove Item from Collection… -pane.items.menu.remove.multiple=Remove Items from Collection… +pane.items.remove.title=Odstranit z kolekce +pane.items.remove=Opravdu chcete odstranit zvolenou položku z kolekce? +pane.items.remove.multiple=Opravdu chcete odstranit vybrané položky z této kolekce? +pane.items.menu.remove=Odebrat položku z kolekce... +pane.items.menu.remove.multiple=Odebrat položky z kolekce... pane.items.menu.moveToTrash=Přesunout položku do Koše... pane.items.menu.moveToTrash.multiple=Přesunout položky do Koše... pane.items.menu.export=Exportovat vybranou položku... @@ -225,7 +225,7 @@ pane.items.menu.createParent=Vytvořit rodičovskou položku z vybrané položky pane.items.menu.createParent.multiple=Vytvořit rodičovské položky z vybraných položek pane.items.menu.renameAttachments=Přejmenovat soubor z rodičovských metadat pane.items.menu.renameAttachments.multiple=Přejmenovat soubory z rodičovských metadat -pane.items.showItemInLibrary=Show Item in Library +pane.items.showItemInLibrary=Zobrazit položku v Knihovně. pane.items.letter.oneParticipant=Dopis pro %S pane.items.letter.twoParticipants=Dopis pro %S a %S @@ -566,15 +566,15 @@ zotero.preferences.export.quickCopy.exportFormats=Formáty exportu zotero.preferences.export.quickCopy.instructions=Rychlé kopírování Vám umožňuje kopírovat vybrané reference do schránky zmáčknutím klávesové zkratky (%S) nebo přetažením položek do textového pole na webové stránce. zotero.preferences.export.quickCopy.citationInstructions=Pro citování můžete citace či poznámky pod čarou kopírovat při stisknutí %S nebo stisknutím a držením klávesy Shift při přetahování položky. -zotero.preferences.wordProcessors.installationSuccess=Installation was successful. -zotero.preferences.wordProcessors.installationError=Installation could not be completed because an error occurred. Please ensure that %1$S is closed, and then restart %2$S. -zotero.preferences.wordProcessors.installed=The %S add-in is currently installed. -zotero.preferences.wordProcessors.notInstalled=The %S add-in is not currently installed. -zotero.preferences.wordProcessors.install=Install %S Add-in -zotero.preferences.wordProcessors.reinstall=Reinstall %S Add-in -zotero.preferences.wordProcessors.installing=Installing %S… -zotero.preferences.wordProcessors.incompatibleVersions1=%1$S %2$S is incompatible with versions of %3$S before %4$S. Please remove %3$S, or download the latest version from %5$S. -zotero.preferences.wordProcessors.incompatibleVersions2=%1$S %2$S requires %3$S %4$S or later to run. Please download the latest version of %3$S from %5$S. +zotero.preferences.wordProcessors.installationSuccess=Instalace proběhla úspěšně. +zotero.preferences.wordProcessors.installationError=Instalace nemohla být dokončena, protože došlo k chybě. Prosím ujistěte se, že je %1$S zavřený a poté restartujte %2$S. +zotero.preferences.wordProcessors.installed=Add-in %S je v současnosti nainstalován. +zotero.preferences.wordProcessors.notInstalled=Add-in %S není v současnosti nainstalován. +zotero.preferences.wordProcessors.install=Nainstalovat add-in %S +zotero.preferences.wordProcessors.reinstall=Přeinstalovat add-in %S +zotero.preferences.wordProcessors.installing=Instaluje se %S... +zotero.preferences.wordProcessors.incompatibleVersions1=%1$S %2$S je nekompatibilní s verzemi %3$S před %4$S. Odstraňte prosím %3$S, nebo stáhněte nejnovější verzi z %5$S. +zotero.preferences.wordProcessors.incompatibleVersions2=%1$S %2$S vyžaduje ke svému běhu %3$S %4$S. Stáhněte prosím nejnovější verzi %3$S z %5$S. zotero.preferences.styles.addStyle=Přidat styl @@ -738,7 +738,7 @@ integration.missingItem.multiple=Položka %1$S v této citaci už dále neexistu integration.missingItem.description=Kliknutím na "Ne" smažete kódy pole pro citace obsahujících tuto položku, text citace bude zachován, ale bude smazána z vaší bibliografie. integration.removeCodesWarning=Odstranění kódů polí neumožní Zoteru aktualizaci citací a bibliografií v tomto dokumentu. Jste si jistí, že chcete pokračovat? integration.upgradeWarning=Váš dokument musí být permanentně aktualizován, abyste mohli pracovat se Zoterem 2.0b7 a vyšším. Před pokračováním je doporučeno vytvoření záložní kopie dokumentu. Jste si jisti, že chcete pokračovat? -integration.error.newerDocumentVersion=Your document was created with a newer version of Zotero (%1$S) than the currently installed version (%2$S). Please upgrade Zotero before editing this document. +integration.error.newerDocumentVersion=Váš dokument byl vytvořen v novější verzi Zotera (%1$S), než je ta současně nainstalovaná (%2$S). Před úpravami tohoto dokumentu prosím aktualizujte Zotero. integration.corruptField=Kód pole Zotera odpovídající této citaci, který označuje, které položky ve vaší knihovně tato citace reprezentuje, byl poškozen. Přejete si znovu vybrat položku? integration.corruptField.description=Kliknutím na "Ne" smažete kódy pole pro citace obsahující tuto položku, text citace bude zachován, ale citace může být smazána z vaší bibliografie. integration.corruptBibliography=Kód pole Zotera pro vaší bibliografii byl poškozen. Má Zotero vymazat tento kód pole a vygenerovat novou bibliografii? @@ -988,11 +988,11 @@ firstRunGuidance.quickFormatMac=Napište název, nebo autora k nimž hledáte ci firstRunGuidance.toolbarButton.new=Zotero otevřete kliknutím sem, nebo použitím klávesové zkratky %S firstRunGuidance.toolbarButton.upgrade=Ikona Zotero se nyní nachází v Panelu nástrojů Firefoxu. Zotero otevřete kliknutím na ikonu, nebo stisknutím %S. -styles.bibliography=Bibliography -styles.editor.save=Save Citation Style -styles.editor.warning.noItems=No items selected in Zotero. -styles.editor.warning.parseError=Error parsing style: -styles.editor.warning.renderError=Error generating citations and bibliography: -styles.editor.output.individualCitations=Individual Citations -styles.editor.output.singleCitation=Single Citation (with position "first") -styles.preview.instructions=Select one or more items in Zotero and click the "Refresh" button to see how these items are rendered by the installed CSL citation styles. +styles.bibliography=Bibliografie +styles.editor.save=Uložit citační styl. +styles.editor.warning.noItems=V Zoteru nejsou vybrány žádné položky. +styles.editor.warning.parseError=Chyba při parsovaní stylu: +styles.editor.warning.renderError=Chyba při generování citací a bibliografie: +styles.editor.output.individualCitations=Jednotlivé citace +styles.editor.output.singleCitation=Jednotlivá citace (s pozicí "první") +styles.preview.instructions=Pro náhled těchto položek pomocí nainstalovaných citačních stylů CSL vyberte v Zoteru jednu nebo více položek a klikněte tlačítko "Obnovit". diff --git a/chrome/locale/el-GR/zotero/about.dtd b/chrome/locale/el-GR/zotero/about.dtd index 40a016b3f..08cd1590e 100644 --- a/chrome/locale/el-GR/zotero/about.dtd +++ b/chrome/locale/el-GR/zotero/about.dtd @@ -9,5 +9,5 @@ <!ENTITY zotero.executiveProducer "Εκτελεστικός Παραγωγός:"> <!ENTITY zotero.thanks "Ειδικές Ευχαριστίες:"> <!ENTITY zotero.about.close "Κλείσιμο"> -<!ENTITY zotero.moreCreditsAndAcknowledgements "More Credits & Acknowledgements"> -<!ENTITY zotero.citationProcessing "Citation & Bibliography Processing"> +<!ENTITY zotero.moreCreditsAndAcknowledgements "Συντελεστές και ευχαριστίες"> +<!ENTITY zotero.citationProcessing "Παραμπομπές & Βιβλιογραφική επεξεργασία"> diff --git a/chrome/locale/el-GR/zotero/zotero.dtd b/chrome/locale/el-GR/zotero/zotero.dtd index 1a7da7d30..549fe5900 100644 --- a/chrome/locale/el-GR/zotero/zotero.dtd +++ b/chrome/locale/el-GR/zotero/zotero.dtd @@ -6,8 +6,8 @@ <!ENTITY zotero.general.delete "Διαγραφή"> <!ENTITY zotero.general.ok "ΟΚ"> <!ENTITY zotero.general.cancel "Ακύρωση"> -<!ENTITY zotero.general.refresh "Refresh"> -<!ENTITY zotero.general.saveAs "Save As…"> +<!ENTITY zotero.general.refresh "Ανανέωση"> +<!ENTITY zotero.general.saveAs "Αποθήκευση ως..."> <!ENTITY zotero.errorReport.title "Αναφορά σφάλματος Zotero"> <!ENTITY zotero.errorReport.unrelatedMessages "Πιθανόν να συμπεριληφθούν μηνύματα άσχετα με το Zotero."> @@ -15,7 +15,7 @@ <!ENTITY zotero.errorReport.submitted "Η αναφορά σας σφάλματος υποβλήθηκε."> <!ENTITY zotero.errorReport.reportID "Ταυτότητα αναφοράς:"> <!ENTITY zotero.errorReport.postToForums "Παρακαλώ, στείλτε ένα μήνυμα στο φόρουμ του Zotero (forums.zotero.org) με αυτή την Ταυτότητα Σφάλματος, μια περιγραφή του προβλήματος και τα απαραίτητα βήματα για την αναπαραγωγή του."> -<!ENTITY zotero.errorReport.notReviewed "Error reports are generally not reviewed unless referred to in the forums."> +<!ENTITY zotero.errorReport.notReviewed "Οι αναφορές σφαλμάτων δεν εξετάζονται αν πρώτα δεν αναφερθούν στα φόρα."> <!ENTITY zotero.upgrade.title "Μάγος Αναβάθμισης Zotero"> <!ENTITY zotero.upgrade.newVersionInstalled "Εγκαταστήσατε μια νέα έκδοση του Zotero."> @@ -99,20 +99,20 @@ <!ENTITY zotero.toolbar.moreItemTypes.label "Περισσότερα"> <!ENTITY zotero.toolbar.newItemFromPage.label "Δημιουργία Στοιχείου Ιστοσελίδας από την Τρέχουσα Σελίδα"> <!ENTITY zotero.toolbar.lookup.label "Προσθήκη στοιχείου/ων μέσω Ταυτότητας"> -<!ENTITY zotero.toolbar.removeItem.label "Remove Item..."> -<!ENTITY zotero.toolbar.newCollection.label "New Collection..."> -<!ENTITY zotero.toolbar.newGroup "New Group..."> -<!ENTITY zotero.toolbar.newSubcollection.label "New Subcollection..."> -<!ENTITY zotero.toolbar.newSavedSearch.label "New Saved Search..."> -<!ENTITY zotero.toolbar.emptyTrash.label "Εκκένωση κάδου απορριμάτων"> -<!ENTITY zotero.toolbar.tagSelector.label "Εμφάνιση/Απόκρυψη Επιλογέα ετικετών"> +<!ENTITY zotero.toolbar.removeItem.label "Απομάκρυνση στοιχείου..."> +<!ENTITY zotero.toolbar.newCollection.label "Νέα συλλογή..."> +<!ENTITY zotero.toolbar.newGroup "Νέα ομάδα..."> +<!ENTITY zotero.toolbar.newSubcollection.label "Νέα δευτερεύουσα συλλογή..."> +<!ENTITY zotero.toolbar.newSavedSearch.label "Νέα αποθηκευμένη αναζήτηση..."> +<!ENTITY zotero.toolbar.emptyTrash.label "Άδειασμα κάδου ανακύκλωσης..."> +<!ENTITY zotero.toolbar.tagSelector.label "Εμφάνιση/Απόκρυψη επιλογέα ετικετών"> <!ENTITY zotero.toolbar.actions.label "Ενέργειες"> -<!ENTITY zotero.toolbar.import.label "Import..."> +<!ENTITY zotero.toolbar.import.label "Εισαγωγή"> <!ENTITY zotero.toolbar.importFromClipboard "Εισαγωγή από την προσωρινή μνήμη"> <!ENTITY zotero.toolbar.export.label "Export Library..."> <!ENTITY zotero.toolbar.rtfScan.label "RTF Scan..."> <!ENTITY zotero.toolbar.timeline.label "Δημιουργία χρονοδιαγράμματος"> -<!ENTITY zotero.toolbar.preferences.label "Preferences..."> +<!ENTITY zotero.toolbar.preferences.label "Προτιμήσεις..."> <!ENTITY zotero.toolbar.supportAndDocumentation "Υποστήριξη και Τεκμηρίωση"> <!ENTITY zotero.toolbar.about.label "Σχετικά με το Zotero"> <!ENTITY zotero.toolbar.advancedSearch "Προχωρημένη αναζήτηση"> @@ -125,24 +125,24 @@ <!ENTITY zotero.item.textTransform "Μετασχηματισμός κειμένου"> <!ENTITY zotero.item.textTransform.titlecase "Μορφή γραμμάτων τίτλου"> <!ENTITY zotero.item.textTransform.sentencecase "Μορφή γραμμάτων πρότασης"> -<!ENTITY zotero.item.creatorTransform.nameSwap "Swap First/Last Names"> +<!ENTITY zotero.item.creatorTransform.nameSwap "Εναλλαγή πρώτου ονόματος/επιθέτου"> <!ENTITY zotero.toolbar.newNote "Νέα σημείωση"> <!ENTITY zotero.toolbar.note.standalone "Νέα αυτόνομη σημείωση"> <!ENTITY zotero.toolbar.note.child "Προσθήκη θυγατρικής σημείωσης"> -<!ENTITY zotero.toolbar.lookup "Lookup by Identifier..."> +<!ENTITY zotero.toolbar.lookup "Εντοπισμός μέσω ταυτοποιητή..."> <!ENTITY zotero.toolbar.attachment.linked "Link to File..."> -<!ENTITY zotero.toolbar.attachment.add "Store Copy of File..."> +<!ENTITY zotero.toolbar.attachment.add "Αποθήκευση αντιγράφου του αρχείου..."> <!ENTITY zotero.toolbar.attachment.weblink "Αποθήκευση Συνδέσμου στην Τρέχουσα Σελίδα"> <!ENTITY zotero.toolbar.attachment.snapshot "Λήψη Στιγμιότυπου της Τρέχουσας Σελίδας"> <!ENTITY zotero.tagSelector.noTagsToDisplay "Δεν υπάρχουν ετικέτες προς εμφάνιση"> <!ENTITY zotero.tagSelector.filter "Φίλτρο"> -<!ENTITY zotero.tagSelector.showAutomatic "Show automatic"> -<!ENTITY zotero.tagSelector.displayAllInLibrary "Display all tags in this library"> -<!ENTITY zotero.tagSelector.selectVisible "Select visible"> -<!ENTITY zotero.tagSelector.clearVisible "Deselect visible"> -<!ENTITY zotero.tagSelector.clearAll "Deselect all"> +<!ENTITY zotero.tagSelector.showAutomatic "Αυτόματη προβολή"> +<!ENTITY zotero.tagSelector.displayAllInLibrary "Εμφάνιση όλων των ετικετών αυτής της βιβλιοθήκης"> +<!ENTITY zotero.tagSelector.selectVisible "Επιλογή ορατών"> +<!ENTITY zotero.tagSelector.clearVisible "Αποεπιλογή ορατών"> +<!ENTITY zotero.tagSelector.clearAll "Αποεπιλογή όλων"> <!ENTITY zotero.tagSelector.assignColor "Απόδοση χρώματος..."> <!ENTITY zotero.tagSelector.renameTag "Rename Tag..."> <!ENTITY zotero.tagSelector.deleteTag "Delete Tag..."> @@ -205,7 +205,7 @@ <!ENTITY zotero.annotate.toolbar.collapse.label "Σύμπτυξη όλων των σχολιασμών"> <!ENTITY zotero.annotate.toolbar.expand.label "Ανάπτυξη όλων των σχολιασμών"> <!ENTITY zotero.annotate.toolbar.highlight.label "Υπογράμμιση κειμένου"> -<!ENTITY zotero.annotate.toolbar.unhighlight.label "Unhighlight Text"> +<!ENTITY zotero.annotate.toolbar.unhighlight.label "Αναίρεση υπογράμμισης κειμένου"> <!ENTITY zotero.integration.prefs.displayAs.label "Προβολή παραπομπών ως:"> <!ENTITY zotero.integration.prefs.footnotes.label "Σημειώσεις υποσέλιδου"> @@ -213,7 +213,7 @@ <!ENTITY zotero.integration.prefs.formatUsing.label "Χρήση μορφής:"> <!ENTITY zotero.integration.prefs.bookmarks.label "Σελιδοδείκτες"> -<!ENTITY zotero.integration.prefs.bookmarks.caption "Bookmarks are preserved across Microsoft Word and OpenOffice, but may be accidentally modified."> +<!ENTITY zotero.integration.prefs.bookmarks.caption "Στα Microsoft Word και LibreOffice οι σελιδοδείκτες διατηρούνται αλλά ίσως τροποποιηθούν κατά λάθος. Για 
λόγους συμβατότητας, όταν η λειτουργία αυτή είναι επιλεγμένη οι παραθέσεις/παραπομπές δεν μπορούν να εισαχθούν σε υποσέλιδες σημειώσεις ή σε σημειώσεις τέλους."> <!ENTITY zotero.integration.prefs.automaticJournalAbbeviations.label "Αυτόματη συντομογράφηση τίτλων περιοδικών"> @@ -253,7 +253,7 @@ <!ENTITY zotero.proxy.recognized.disable.label "Να μην γίνεται αυτόματη ανακατεύθυνση των αιτήσεων μέσω προηγουμένως αναγνωρισμένων διαμεσολαβητών."> <!ENTITY zotero.proxy.recognized.ignore.label "Αγνόηση"> -<!ENTITY zotero.recognizePDF.recognizing.label "Retrieving Metadata..."> +<!ENTITY zotero.recognizePDF.recognizing.label "Ανάκτηση μεταδεδομένων..."> <!ENTITY zotero.recognizePDF.cancel.label "Ακύρωση"> <!ENTITY zotero.recognizePDF.pdfName.label "Όνομα PDF"> <!ENTITY zotero.recognizePDF.itemName.label "Όνομα στοιχείου"> @@ -266,27 +266,27 @@ <!ENTITY zotero.rtfScan.ambiguousCitations.label "Ασαφής παραπομπή"> <!ENTITY zotero.rtfScan.mappedCitations.label "Χαρτογραφημένες παραπομπές"> <!ENTITY zotero.rtfScan.introPage.label "Εισαγωγή"> -<!ENTITY zotero.rtfScan.introPage.description "Zotero can automatically extract and reformat citations and insert a bibliography into RTF files. To get started, choose an RTF file below."> +<!ENTITY zotero.rtfScan.introPage.description "Το Zotero μπορεί αυτόματα να εξάγει και να αναδιαμορφώσει τις παραπομπές/παραθέσεις και να εισάγει βιβλιογραφία μέσα σε αρχεία τύπου RTF. Η λειτουργία Σάρωσης RTF υποστηρίζει τις παρακάτω μορφές παραπομπών/παραθέσεων: "> <!ENTITY zotero.rtfScan.introPage.description2 "Για να ξεκινήσετε, πιο κάτω επιλέξτε ένα αρχείο εισόδου RTF και ένα αρχείο εξόδου:"> <!ENTITY zotero.rtfScan.scanPage.label "Σάρωση για παραπομπές"> <!ENTITY zotero.rtfScan.scanPage.description "Το Zotero σαρώνει τα έγγραφά σας για παραπομπές. Παρακαλώ περιμένετε."> <!ENTITY zotero.rtfScan.citationsPage.label "Εξακρίβωση παρατιθέμενων στοιχείων"> <!ENTITY zotero.rtfScan.citationsPage.description "Παρακαλώ, εξετάστε τον κατάλογο των αναγνωρισμένων παραπομπών που ακολουθεί για να βεβαιωθείτε ότι το Zotero έχει επιλέξει τα αντίστοιχα στοιχεία σωστά. Κάθε αχαρτογράφητη ή ασαφής παραπομπή πρέπει να αντιμετωπιστεί πριν προχωρήσετε στο επόμενο βήμα."> -<!ENTITY zotero.rtfScan.stylePage.label "Document Formatting"> -<!ENTITY zotero.rtfScan.formatPage.label "Formatting Citations"> -<!ENTITY zotero.rtfScan.formatPage.description "Zotero is processing and formatting your RTF file. Please be patient."> -<!ENTITY zotero.rtfScan.completePage.label "RTF Scan Complete"> -<!ENTITY zotero.rtfScan.completePage.description "Your document has now been scanned and processed. Please ensure that it is formatted correctly."> -<!ENTITY zotero.rtfScan.inputFile.label "Input File"> -<!ENTITY zotero.rtfScan.outputFile.label "Output File"> +<!ENTITY zotero.rtfScan.stylePage.label "Μορφοποίηση εγγράφου"> +<!ENTITY zotero.rtfScan.formatPage.label "Μορφοποίηση παπομπών/παραθέσεων"> +<!ENTITY zotero.rtfScan.formatPage.description "Το Zotero επεξεργάζεται και μορφοποιεί τα αρχεία σας RTF. Παρακαλώ δείξτε υπομονή."> +<!ENTITY zotero.rtfScan.completePage.label "Η Σάρωση RTF ολοκληρώθηκε"> +<!ENTITY zotero.rtfScan.completePage.description "Το έγγραφό σας σαρώθηκε και επεξεργάστηκε. Παρααλώ βεβαιωθείτε ότι μοφροποιήθηκε σωστά."> +<!ENTITY zotero.rtfScan.inputFile.label "Αρχείο εισαγωγής"> +<!ENTITY zotero.rtfScan.outputFile.label "Αρχείο εξαγωγής"> -<!ENTITY zotero.file.choose.label "Choose File..."> -<!ENTITY zotero.file.noneSelected.label "No file selected"> +<!ENTITY zotero.file.choose.label "Επιλέξτε αρχείο..."> +<!ENTITY zotero.file.noneSelected.label "Δεν επιλέχθηκε αρχείο"> -<!ENTITY zotero.downloadManager.label "Save to Zotero"> -<!ENTITY zotero.downloadManager.saveToLibrary.description "Attachments cannot be saved to the currently selected library. This item will be saved to your library instead."> -<!ENTITY zotero.downloadManager.noPDFTools.description "To use this feature, you must first install the PDF tools in the Search pane of the Zotero preferences."> +<!ENTITY zotero.downloadManager.label "Αποθήκευση στο Zotero"> +<!ENTITY zotero.downloadManager.saveToLibrary.description "Στην επιλεγμένη βιβλιοθήκη δεν μπορούν να αποθηκευτούν προσαρτήματα. Αντ' αυτής, το στοιχείο θα αποθηκευτεί στην βιβλιοθήκη σας."> +<!ENTITY zotero.downloadManager.noPDFTools.description "Για να χρησιμοποιήσετε τη λειτουργία αυτή πρώτα πρέπει να εγκαταστήσετε τα εργαλεία PDF στο πλαίσιο Αναζήτησης των Προτιμήσεων του Zotero."> -<!ENTITY zotero.attachLink.title "Attach Link to URI"> -<!ENTITY zotero.attachLink.label.link "Link:"> -<!ENTITY zotero.attachLink.label.title "Title:"> +<!ENTITY zotero.attachLink.title "Προσάρτηση συνδέσμου στο URI"> +<!ENTITY zotero.attachLink.label.link "Σύνδεσμος:"> +<!ENTITY zotero.attachLink.label.title "Τίτλος:"> diff --git a/chrome/locale/fa/zotero/zotero.properties b/chrome/locale/fa/zotero/zotero.properties index 817b1eae0..3aa141d50 100644 --- a/chrome/locale/fa/zotero/zotero.properties +++ b/chrome/locale/fa/zotero/zotero.properties @@ -48,8 +48,8 @@ general.disable=غیرفعال general.remove=حذف general.reset=تنظیم مجدد general.hide=پنهانکردن -general.quit=Quit -general.useDefault=Use Default +general.quit=خروج +general.useDefault=استفاده از پیشفرض general.openDocumentation=Open Documentation general.numMore=%S more… general.openPreferences=بازکردن تنظیمات @@ -166,7 +166,7 @@ pane.collections.groupLibraries=Group Libraries pane.collections.trash=سطل بازیافت pane.collections.untitled=بدون عنوان pane.collections.unfiled=آیتمهای دستهبندی نشده -pane.collections.duplicate=Duplicate Items +pane.collections.duplicate=موارد تکراری pane.collections.menu.rename.collection=تغییر نام مجموعه... pane.collections.menu.edit.savedSearch=ویرایش جستجوی ذخیره شده @@ -204,11 +204,11 @@ pane.items.trash.multiple=آیتمهای انتخاب شده به سطل pane.items.delete.title=حذف pane.items.delete=آیتم انتخاب شده حذف شود؟ pane.items.delete.multiple=آیتمهای انتخاب شده حذف شوند؟ -pane.items.remove.title=Remove from Collection -pane.items.remove=Are you sure you want to remove the selected item from this collection? -pane.items.remove.multiple=Are you sure you want to remove the selected items from this collection? -pane.items.menu.remove=Remove Item from Collection… -pane.items.menu.remove.multiple=Remove Items from Collection… +pane.items.remove.title=حذف از مجموعه +pane.items.remove=آیا اطمینان دارید که میخواهید مورد انتخاب شده از این مجموعه را حذف کنید؟ +pane.items.remove.multiple=آیا اطمینان دارید که می خواهید موارد انتخاب شده از این مجموعه را میخواهید حذف کنید؟ +pane.items.menu.remove=حذف ایتم از مجموعه +pane.items.menu.remove.multiple=حذف آیتمها از مجموعه pane.items.menu.moveToTrash=انتقال به سطل بازیافت... pane.items.menu.moveToTrash.multiple=انتقال به سطل بازیافت... pane.items.menu.export=صدور این آیتم... @@ -225,7 +225,7 @@ pane.items.menu.createParent=ساخت آیتم مادر از این آیتم pane.items.menu.createParent.multiple=ساخت آیتمهای مادر از آیتمهای انتخاب شده pane.items.menu.renameAttachments=تغییر نام پرونده با توجه به فرادادههای مادر pane.items.menu.renameAttachments.multiple=تغییر نام پروندهها با توجه به فرادادههای مادر -pane.items.showItemInLibrary=Show Item in Library +pane.items.showItemInLibrary=نمایش آیتم در کتابخانه pane.items.letter.oneParticipant=نامه به %S pane.items.letter.twoParticipants=نامه به %S و %S @@ -255,8 +255,8 @@ pane.item.defaultLastName=نام خانوادگی pane.item.defaultFullName=نام کامل pane.item.switchFieldMode.one=تعویض به تک فیلدی pane.item.switchFieldMode.two=تعویض به دو فیلدی -pane.item.creator.moveUp=Move Up -pane.item.creator.moveDown=Move Down +pane.item.creator.moveUp=حرکت به بالا +pane.item.creator.moveDown=حرکت به پایین pane.item.notes.untitled=یادداشت بیعنوان pane.item.notes.delete.confirm=آیا واقعا میخواهید این یادداشت را حذف کنید؟ pane.item.notes.count.zero=بدون یادداشت: @@ -477,12 +477,12 @@ fileTypes.document=سند save.attachment=در حال ذخیره تصویر لحظهای... save.link=در حال ذخیره پیوند... -save.link.error=An error occurred while saving this link. -save.error.cannotMakeChangesToCollection=You cannot make changes to the currently selected collection. -save.error.cannotAddFilesToCollection=You cannot add files to the currently selected collection. +save.link.error=هنگام ذخیره لینک خطایی رخ داد. +save.error.cannotMakeChangesToCollection=شما نمیتوانید تغییراتی در مجموعه انتخابشده بدهید. +save.error.cannotAddFilesToCollection=شما نمیتوانید به مجموعه انتخابشده، فایلها را اضافه کنید. ingester.saveToZotero=ذخیره در زوترو -ingester.saveToZoteroUsing=Save to Zotero using "%S" +ingester.saveToZoteroUsing=ذخیره در زوترور از طریق "%S" ingester.scraping=در حال ذخیره... ingester.scrapingTo=Saving to ingester.scrapeComplete=ذخیره شد @@ -495,7 +495,7 @@ ingester.importReferRISDialog.title=درونبرد RIS/Refer زوترو ingester.importReferRISDialog.text=آیا میخواهید آیتمها از "%1$S" به زوترو، درونبرد شوند؟\n\nشما میتوانید درونبرد خودکار RIS/Refer را در تنظیمات زوترو، غیرفعال کنید. ingester.importReferRISDialog.checkMsg=همیشه برای این وبگاه، اجازه داده شود -ingester.importFile.title=Import File +ingester.importFile.title=واردکردن فایل ingester.importFile.text=Do you want to import the file "%S"? ingester.importFile.intoNewCollection=Import into new collection @@ -566,7 +566,7 @@ zotero.preferences.export.quickCopy.exportFormats=قالبهای صدور zotero.preferences.export.quickCopy.instructions=با استفاده از "رونوشت سریع" میتوان مرجعهای انتخاب شده را با فشردن کلید میانبر (%S) یا کشیدن آیتمها به درون جعبه متن روی صفحه وب، رونوشتبرداری کرد. zotero.preferences.export.quickCopy.citationInstructions=For bibliography styles, you can copy citations or footnotes by pressing %S or holding down Shift before dragging items. -zotero.preferences.wordProcessors.installationSuccess=Installation was successful. +zotero.preferences.wordProcessors.installationSuccess=با موفقیت نصب شد. zotero.preferences.wordProcessors.installationError=Installation could not be completed because an error occurred. Please ensure that %1$S is closed, and then restart %2$S. zotero.preferences.wordProcessors.installed=The %S add-in is currently installed. zotero.preferences.wordProcessors.notInstalled=The %S add-in is not currently installed. @@ -713,7 +713,7 @@ integration.removeBibEntry.body=آیا واقعا میخواهید آن را integration.cited=Cited integration.cited.loading=Loading Cited Items… -integration.ibid=ibid +integration.ibid=همان integration.emptyCitationWarning.title=یادکرد خالی integration.emptyCitationWarning.body=یادکرد تعیین شده در شیوه فعلی خالی خواهد بود. آیا واقعا میخواهید آن را بیفزایید؟ integration.openInLibrary=Open in %S @@ -918,7 +918,7 @@ proxies.recognized.add=افزودن پیشکار recognizePDF.noOCR=PDF دارای متن OCR نیست. recognizePDF.couldNotRead=خواندن متن از PDF امکانپذیر نبود. recognizePDF.noMatches=No matching references found -recognizePDF.fileNotFound=File not found +recognizePDF.fileNotFound=فایل پیدا نشد recognizePDF.limit=Google Scholar query limit reached. Try again later. recognizePDF.error=An unexpected error occurred. recognizePDF.stopped=لغو شده @@ -988,7 +988,7 @@ firstRunGuidance.quickFormatMac=Type a title or author to search for a reference firstRunGuidance.toolbarButton.new=Click here to open Zotero, or use the %S keyboard shortcut. firstRunGuidance.toolbarButton.upgrade=The Zotero icon can now be found in the Firefox toolbar. Click the icon to open Zotero, or use the %S keyboard shortcut. -styles.bibliography=Bibliography +styles.bibliography=کتابنامه styles.editor.save=Save Citation Style styles.editor.warning.noItems=No items selected in Zotero. styles.editor.warning.parseError=Error parsing style: diff --git a/chrome/locale/sl-SI/zotero/preferences.dtd b/chrome/locale/sl-SI/zotero/preferences.dtd index fc2610e01..701fab826 100644 --- a/chrome/locale/sl-SI/zotero/preferences.dtd +++ b/chrome/locale/sl-SI/zotero/preferences.dtd @@ -160,7 +160,7 @@ <!ENTITY zotero.preferences.prefpane.advanced "Napredno"> <!ENTITY zotero.preferences.advanced.filesAndFolders "Datoteke in mape"> -<!ENTITY zotero.preferences.advanced.keys "Shortcuts"> +<!ENTITY zotero.preferences.advanced.keys "Tipke za bližnjice"> <!ENTITY zotero.preferences.prefpane.locate "Lociraj"> <!ENTITY zotero.preferences.locate.locateEngineManager "Upravitelj pogona iskanja člankov"> diff --git a/chrome/locale/sl-SI/zotero/zotero.properties b/chrome/locale/sl-SI/zotero/zotero.properties index 8f3f640ba..284c72351 100644 --- a/chrome/locale/sl-SI/zotero/zotero.properties +++ b/chrome/locale/sl-SI/zotero/zotero.properties @@ -42,7 +42,7 @@ general.create=Ustvari general.delete=Izbriši general.moreInformation=Podrobnosti general.seeForMoreInformation=Oglejte si %S za več informacij. -general.open=Open %S +general.open=Odpri %S general.enable=Omogoči general.disable=Onemogoči general.remove=Odstrani @@ -204,11 +204,11 @@ pane.items.trash.multiple=Ste prepričani, da želite izbrane vnose vreči v ko pane.items.delete.title=Izbriši pane.items.delete=Ste prepričani, da želite izbrisati izbrani vnos? pane.items.delete.multiple=Ste prepričani, da želite izbrisati izbrane vnose? -pane.items.remove.title=Remove from Collection -pane.items.remove=Are you sure you want to remove the selected item from this collection? -pane.items.remove.multiple=Are you sure you want to remove the selected items from this collection? -pane.items.menu.remove=Remove Item from Collection… -pane.items.menu.remove.multiple=Remove Items from Collection… +pane.items.remove.title=Odstrani iz zbirke +pane.items.remove=Ste prepričani, da želite izbrani vnos izbrisati iz te zbirke? +pane.items.remove.multiple=Ste prepričani, da želite izbrane vnose izbrisati iz te zbirke? +pane.items.menu.remove=Odstrani vnos iz zbirke ... +pane.items.menu.remove.multiple=Odstrani vnose iz zbirke ... pane.items.menu.moveToTrash=Premakni vnos v koš ... pane.items.menu.moveToTrash.multiple=Premakni vnose v koš ... pane.items.menu.export=Izvozi vnos ... @@ -566,15 +566,15 @@ zotero.preferences.export.quickCopy.exportFormats=Vrste izvoza zotero.preferences.export.quickCopy.instructions=Hitro kopiranje omogoča kopiranje izbranih sklicev na odložišče s pritiskom na tipko za bližnjico (%S) ali vleko vnosov v besedilno polje na spletni strani. zotero.preferences.export.quickCopy.citationInstructions=Za sloge bibliografije lahko kopirate citate ali sprotne opombe s pritiskom %S ali s pritisnjeno dvigalko pred vleko vnosov. -zotero.preferences.wordProcessors.installationSuccess=Installation was successful. -zotero.preferences.wordProcessors.installationError=Installation could not be completed because an error occurred. Please ensure that %1$S is closed, and then restart %2$S. -zotero.preferences.wordProcessors.installed=The %S add-in is currently installed. -zotero.preferences.wordProcessors.notInstalled=The %S add-in is not currently installed. -zotero.preferences.wordProcessors.install=Install %S Add-in -zotero.preferences.wordProcessors.reinstall=Reinstall %S Add-in -zotero.preferences.wordProcessors.installing=Installing %S… -zotero.preferences.wordProcessors.incompatibleVersions1=%1$S %2$S is incompatible with versions of %3$S before %4$S. Please remove %3$S, or download the latest version from %5$S. -zotero.preferences.wordProcessors.incompatibleVersions2=%1$S %2$S requires %3$S %4$S or later to run. Please download the latest version of %3$S from %5$S. +zotero.preferences.wordProcessors.installationSuccess=Namestitev je uspela. +zotero.preferences.wordProcessors.installationError=Nameščanja ni mogoče zaključiti, ker je prišlo do napake. Zagotovite, da je %1$S zaprt, nato ponovno zaženite %2$S. +zotero.preferences.wordProcessors.installed=Dodatek %S je trenutno nameščen. +zotero.preferences.wordProcessors.notInstalled=Dodatek %S trenutno ni nameščen. +zotero.preferences.wordProcessors.install=Namesti dodatek %S +zotero.preferences.wordProcessors.reinstall=Ponovno namesti dodatek %S +zotero.preferences.wordProcessors.installing=Nameščanje %S ... +zotero.preferences.wordProcessors.incompatibleVersions1=%1$S %2$S ni združljiv z različicami %3$S pred %4$S. Odstranite %3$S ali prenesite najnovejšo različico z %5$S. +zotero.preferences.wordProcessors.incompatibleVersions2=%1$S %2$S zahteva %3$S %4$S ali novejšega. Prenesite najnovejšo različico %3$S z %5$S. zotero.preferences.styles.addStyle=Dodaj slog @@ -738,7 +738,7 @@ integration.missingItem.multiple=Vnos %1$S iz tega citata ne obstaja več v vaš integration.missingItem.description=Z »Ne« boste izbrisali kode polj za citate, ki vsebujejo ta vnos, s čimer boste obdržali besedilo citata, vendar ga boste izbrisali iz bibliografije. integration.removeCodesWarning=Odstranitev kod polj bo preprečila Zoteru posodabljanje citatov in bibliografij v tem dokumentu. Ste prepričani, da želite nadaljevati? integration.upgradeWarning=Vaš dokument mora biti trajno posodobljen, da bi deloval z Zoterom 2.1 ali novejšim. Priporočamo, da pred nadaljevanjem naredite varnostno kopijo. Ste prepričani, da želite nadaljevati? -integration.error.newerDocumentVersion=Your document was created with a newer version of Zotero (%1$S) than the currently installed version (%2$S). Please upgrade Zotero before editing this document. +integration.error.newerDocumentVersion=Vaš dokument je nastal z novejšo različico Zotera (%1$S) od trenutno nameščene (%2$S). Pred urejanjem tega dokumenta raje nadgradite Zotero. integration.corruptField=Koda polja Zotero, ki ustreza temu citatu, ki pove Zoteru, kateri vnos iz vaše knjižnice citat predstavlja, je bila okvarjena. Želite ponovno izbrati vnos? integration.corruptField.description=Z »Ne« boste izbrisali kode polj za citate, ki vsebujejo ta vnos, s čimer boste ohranili besedilo citata in ga morebiti izbrisali iz bibliografije. integration.corruptBibliography=Koda polja Zotero za bibliografijo je okvarjena. Naj Zotero pobriše to kodo polja in ustvari novo bibliografijo? diff --git a/chrome/locale/zh-CN/zotero/preferences.dtd b/chrome/locale/zh-CN/zotero/preferences.dtd index eb14d8b3a..47c9a4038 100644 --- a/chrome/locale/zh-CN/zotero/preferences.dtd +++ b/chrome/locale/zh-CN/zotero/preferences.dtd @@ -160,7 +160,7 @@ <!ENTITY zotero.preferences.prefpane.advanced "高级"> <!ENTITY zotero.preferences.advanced.filesAndFolders "文件和文件夹"> -<!ENTITY zotero.preferences.advanced.keys "Shortcuts"> +<!ENTITY zotero.preferences.advanced.keys "快捷键"> <!ENTITY zotero.preferences.prefpane.locate "定位"> <!ENTITY zotero.preferences.locate.locateEngineManager "文章检索引擎管理器"> diff --git a/chrome/locale/zh-CN/zotero/zotero.properties b/chrome/locale/zh-CN/zotero/zotero.properties index 6a178b798..edda5fd31 100644 --- a/chrome/locale/zh-CN/zotero/zotero.properties +++ b/chrome/locale/zh-CN/zotero/zotero.properties @@ -42,7 +42,7 @@ general.create=创建 general.delete=删除 general.moreInformation=更多信息 general.seeForMoreInformation=查阅 %S 获取更多信息. -general.open=Open %S +general.open=打开 %S general.enable=启用 general.disable=禁用 general.remove=移除 @@ -204,11 +204,11 @@ pane.items.trash.multiple=您确定要将选中的条目移动到回收站吗? pane.items.delete.title=删除 pane.items.delete=您确定要删除所选的条目吗? pane.items.delete.multiple=您确定要删除所选的条目吗? -pane.items.remove.title=Remove from Collection -pane.items.remove=Are you sure you want to remove the selected item from this collection? -pane.items.remove.multiple=Are you sure you want to remove the selected items from this collection? -pane.items.menu.remove=Remove Item from Collection… -pane.items.menu.remove.multiple=Remove Items from Collection… +pane.items.remove.title=从分类中移除 +pane.items.remove=您确定要从分类中移除所选的条目吗? +pane.items.remove.multiple=您确定要从分类中移除所选的多个条目吗? +pane.items.menu.remove=从分类中移除条目… +pane.items.menu.remove.multiple=从分类中移除多个条目… pane.items.menu.moveToTrash=删除条目… pane.items.menu.moveToTrash.multiple=删除条目… pane.items.menu.export=导出条目... @@ -566,13 +566,13 @@ zotero.preferences.export.quickCopy.exportFormats=导出格式 zotero.preferences.export.quickCopy.instructions=便捷复制是通过快捷键 %S 将所选的条目复制到剪贴板上或通过鼠标拖放将条目粘贴到网页上的文本框中. zotero.preferences.export.quickCopy.citationInstructions=要复制文献的引用样式, 在复制引文或脚注前按快捷键%S或按住Shift键然后拖放条目. -zotero.preferences.wordProcessors.installationSuccess=Installation was successful. -zotero.preferences.wordProcessors.installationError=Installation could not be completed because an error occurred. Please ensure that %1$S is closed, and then restart %2$S. -zotero.preferences.wordProcessors.installed=The %S add-in is currently installed. -zotero.preferences.wordProcessors.notInstalled=The %S add-in is not currently installed. -zotero.preferences.wordProcessors.install=Install %S Add-in -zotero.preferences.wordProcessors.reinstall=Reinstall %S Add-in -zotero.preferences.wordProcessors.installing=Installing %S… +zotero.preferences.wordProcessors.installationSuccess=安装成功。 +zotero.preferences.wordProcessors.installationError=由于发生错误,无法完成安装。请确保 %1$S 关闭,然后重新启动t %2$S。 +zotero.preferences.wordProcessors.installed=加载项 %S 现在已安装。 +zotero.preferences.wordProcessors.notInstalled=加载项 %S 现在未安装。 +zotero.preferences.wordProcessors.install=安装加载项 %S +zotero.preferences.wordProcessors.reinstall=重新安装加载项 %S +zotero.preferences.wordProcessors.installing=安装 %S… zotero.preferences.wordProcessors.incompatibleVersions1=%1$S %2$S is incompatible with versions of %3$S before %4$S. Please remove %3$S, or download the latest version from %5$S. zotero.preferences.wordProcessors.incompatibleVersions2=%1$S %2$S requires %3$S %4$S or later to run. Please download the latest version of %3$S from %5$S. @@ -738,7 +738,7 @@ integration.missingItem.multiple=高亮的引文中的条目 %1$S 已经不在 integration.missingItem.description=点击“取消”将删除包含此条目的引文的域代码, 保留引用文本并从引文目录中删除. integration.removeCodesWarning=移除域代码将使 Zotero 无法更新本文档的引文及引文目录, 您确定要继续吗? integration.upgradeWarning=为使您的文档可以在 Zotero 2.1 或更新的版本中工作, 我们需要您永久升级您的文档. 在继续进行前, 我们建议您做一个备份. 您确定要继续吗? -integration.error.newerDocumentVersion=Your document was created with a newer version of Zotero (%1$S) than the currently installed version (%2$S). Please upgrade Zotero before editing this document. +integration.error.newerDocumentVersion=创建本文档的 Zotero 版本 (%1$S) 比当前安装的 Zotero 版本 (%2$S)新。编辑本文档前,请先升级 Zotero。 integration.corruptField=本引文的域代码--负责通知 Zotero 本引文在文献库里所指向的条目--已经损坏. 您要重新选择该条目吗? integration.corruptField.description=点击“取消”将删除包含此条目的引文的域代码, 保留引用文本, 但可能将它从您的引文目录中删除. integration.corruptBibliography=引文目录的 Zotero 域代码已经损坏, 要 Zotero 清理域代码并重新生成引文目录吗? From f5ce2d238eb20dcf39f1d3ef8712a45a343c65d0 Mon Sep 17 00:00:00 2001 From: Dan Stillman <dstillman@zotero.org> Date: Thu, 9 Apr 2015 02:57:29 -0400 Subject: [PATCH 40/44] Fixes #546, Advanced search : match "any" is broken --- chrome/content/zotero/advancedSearch.js | 20 +---------------- .../zotero/xpcom/collectionTreeView.js | 15 ------------- chrome/content/zotero/xpcom/search.js | 22 +++++++++++++++++-- 3 files changed, 21 insertions(+), 36 deletions(-) diff --git a/chrome/content/zotero/advancedSearch.js b/chrome/content/zotero/advancedSearch.js index 896829686..4a921b51f 100644 --- a/chrome/content/zotero/advancedSearch.js +++ b/chrome/content/zotero/advancedSearch.js @@ -62,25 +62,7 @@ var ZoteroAdvancedSearch = new function() { isSearchMode: function() { return true; }, getItems: function () { var search = _searchBox.search.clone(); - - // Hack to create a condition for the search's library -- - // this logic should really go in the search itself instead of here - // and in collectionTreeView.js - var conditions = search.getSearchConditions(); - if (!conditions.some(function (condition) condition.condition == 'libraryID')) { - let libraryID = _searchBox.search.libraryID; - // TEMP: libraryIDInt - if (libraryID) { - search.addCondition('libraryID', 'is', libraryID); - } - else { - let groups = Zotero.Groups.getAll(); - for (let i=0; i<groups.length; i++) { - search.addCondition('libraryID', 'isNot', groups[i].libraryID); - } - } - } - + search.libraryID = _libraryID; return Zotero.Items.get(search.search()); }, isLibrary: function () { return false; }, diff --git a/chrome/content/zotero/xpcom/collectionTreeView.js b/chrome/content/zotero/xpcom/collectionTreeView.js index 6e26a863e..b84447934 100644 --- a/chrome/content/zotero/xpcom/collectionTreeView.js +++ b/chrome/content/zotero/xpcom/collectionTreeView.js @@ -2148,21 +2148,6 @@ Zotero.ItemGroup.prototype.getSearchResults = function(asTempTable) { if(!Zotero.ItemGroupCache.lastResults) { var s = this.getSearchObject(); - - // FIXME: Hack to exclude group libraries for now - if (this.isSearch()) { - var currentLibraryID = this.ref.libraryID; - if (currentLibraryID) { - s.addCondition('libraryID', 'is', currentLibraryID); - } - else { - var groups = Zotero.Groups.getAll(); - for each(var group in groups) { - s.addCondition('libraryID', 'isNot', group.libraryID); - } - } - } - Zotero.ItemGroupCache.lastResults = s.search(); Zotero.ItemGroupCache.lastItemGroup = this; } diff --git a/chrome/content/zotero/xpcom/search.js b/chrome/content/zotero/xpcom/search.js index 03c24fdeb..7eb233364 100644 --- a/chrome/content/zotero/xpcom/search.js +++ b/chrome/content/zotero/xpcom/search.js @@ -36,7 +36,7 @@ Zotero.Search = function() { Zotero.Search.prototype._init = function () { // Public members for access by public methods -- do not access directly this._id = null; - this._libraryID = null; + this._libraryID; // TEMP: libraryIDInt this._key = null; this._name = null; this._dateAdded = null; @@ -290,7 +290,7 @@ Zotero.Search.prototype.save = function(fixGaps) { this._changed.dateModified ? this.dateModified : Zotero.DB.transactionDateTime, Zotero.DB.transactionDateTime, - this.libraryID ? this.libraryID : this.libraryID, + this.libraryID ? this.libraryID : null, key ]; @@ -1139,6 +1139,23 @@ Zotero.Search.prototype._buildQuery = function(){ + ")"; } + // Limit to library search belongs to + // + // This is equivalent to adding libraryID as a search condition, + // but it works with ANY + if (this.libraryID !== undefined) { + sql += " AND (itemID IN (SELECT itemID FROM items WHERE libraryID"; + // TEMP: libraryIDInt + if (this.libraryID) { + sql += "=?"; + sqlParams.push(this.libraryID); + } + else { + sql += " IS NULL"; + } + sql += "))"; + } + if (this._hasPrimaryConditions) { sql += " AND "; @@ -1755,6 +1772,7 @@ Zotero.Searches = new function(){ for each(var row in rows) { var search = new Zotero.Search; search.id = row.id; + search.libraryID = libraryID; searches.push(search); } return searches; From 1c2b2575f744226639652767cc39acddcd3a7afd Mon Sep 17 00:00:00 2001 From: Dan Stillman <dstillman@zotero.org> Date: Thu, 9 Apr 2015 03:47:43 -0400 Subject: [PATCH 41/44] Fix excessive file sync mtime updates/checks (probably?) --- chrome/content/zotero/xpcom/storage.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/chrome/content/zotero/xpcom/storage.js b/chrome/content/zotero/xpcom/storage.js index eb259f84e..ac1940457 100644 --- a/chrome/content/zotero/xpcom/storage.js +++ b/chrome/content/zotero/xpcom/storage.js @@ -864,13 +864,14 @@ Zotero.Sync.Storage = new function () { Zotero.debug("Remote mod time for item " + lk + " is " + itemModTimes[item.id]); // Ignore attachments whose stored mod times haven't changed - if (row.storageModTime == itemModTimes[id]) { + if (row.storageModTime == itemModTimes[item.id]) { Zotero.debug("Storage mod time (" + row.storageModTime + ") " + "hasn't changed for item " + lk); continue; } - Zotero.debug("Marking attachment " + lk + " for download"); + Zotero.debug("Marking attachment " + lk + " for download " + + "(stored mtime: " + itemModTimes[item.id] + ")"); updatedStates[item.id] = Zotero.Sync.Storage.SYNC_STATE_FORCE_DOWNLOAD; } From b599aed8eda595ee5c7f4cc54df4c11f2eed886c Mon Sep 17 00:00:00 2001 From: Dan Stillman <dstillman@zotero.org> Date: Fri, 10 Apr 2015 12:58:46 -0400 Subject: [PATCH 42/44] Fix pasting of non-HTTP URLs into notes from non-note sources Copying zotero:// and other non-HTTP links from a note itself was fixed in #452, but copying such links from other sources still stripped the hrefs. This removes the patch in #452 and just gets the HTML directly from the clipboard. I'm not sure why TinyMCE doesn't try to do this by default (it only tries for plaintext), so maybe there's a problem with this approach, but it seems to work for me (strips bad HTML, etc.). Fixes #697 --- resource/tinymce/plugins/paste/editor_plugin.js | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/resource/tinymce/plugins/paste/editor_plugin.js b/resource/tinymce/plugins/paste/editor_plugin.js index 848abfdd8..36b85c2af 100644 --- a/resource/tinymce/plugins/paste/editor_plugin.js +++ b/resource/tinymce/plugins/paste/editor_plugin.js @@ -152,6 +152,15 @@ // Check if browser supports direct plaintext access if (e.clipboardData || dom.doc.dataTransfer) { + // Added by Zotero + // Get HTML from the clipboard directly + var html = e.clipboardData && e.clipboardData.getData('text/html'); + if (html) { + e.preventDefault(); + process({content : html}); + return; + } + textContent = (e.clipboardData || dom.doc.dataTransfer).getData('Text'); if (ed.pasteAsPlainText) { @@ -248,14 +257,6 @@ each(nl, function(n) { var child = n.firstChild; - // Added by Zotero - // fix copy/paste of non-http links - var links = n.querySelectorAll('a'); - for (var i = 0; i < links.length; i++) { - if (!links[i].href && links[i].getAttribute('data-mce-href')) - links[i].setAttribute('href', links[i].getAttribute('data-mce-href')); - } - // WebKit inserts a DIV container with lots of odd styles if (child && child.nodeName == 'DIV' && child.style.marginTop && child.style.backgroundColor) { dom.remove(child, 1); From 164f4e4321c57609f3c3aba3408abfe0c3531189 Mon Sep 17 00:00:00 2001 From: Aurimas Vinckevicius <aurimas.dev@gmail.com> Date: Fri, 10 Apr 2015 19:46:57 -0500 Subject: [PATCH 43/44] More informative error messages for failed file loads --- components/zotero-service.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/components/zotero-service.js b/components/zotero-service.js index 111005c64..6671661f5 100644 --- a/components/zotero-service.js +++ b/components/zotero-service.js @@ -328,8 +328,10 @@ function ZoteroService() { zContext.Zotero.debug("Initialized in "+(Date.now() - start)+" ms"); } catch(e) { - var msg = typeof e == 'string' ? e : e.name; - dump(e + "\n\n"); + var msg = e instanceof Error + ? e.name + ': ' + e.message + '\n' + e.fileName + ':' + e.lineNumber + '\n' + e.stack + : '' + e; + dump(msg + '\n'); Components.utils.reportError(e); throw e; } @@ -475,4 +477,4 @@ if (XPCOMUtils.generateNSGetFactory) { var NSGetFactory = XPCOMUtils.generateNSGetFactory([ZoteroService, ZoteroCommandLineHandler]); } else { var NSGetModule = XPCOMUtils.generateNSGetModule([ZoteroService, ZoteroCommandLineHandler]); -} \ No newline at end of file +} From 9511c434329645cc44ae2ca37efbdd0b757d6377 Mon Sep 17 00:00:00 2001 From: Dan Stillman <dstillman@zotero.org> Date: Sun, 12 Apr 2015 20:28:50 -0400 Subject: [PATCH 44/44] Create empty data directory in test profile This prevents the data directory migration prompt from showing up if there's an existing data directory inside the Standalone profile. --- test/runtests.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/test/runtests.sh b/test/runtests.sh index 6da6f8796..ee9ee850a 100755 --- a/test/runtests.sh +++ b/test/runtests.sh @@ -70,6 +70,9 @@ echo "$ZOTERO_UNIT_PATH" > "$PROFILE/extensions/zotero-unit@zotero.org" makePath ZOTERO_PATH "`dirname "$CWD"`" echo "$ZOTERO_PATH" > "$PROFILE/extensions/zotero@chnm.gmu.edu" +# Create data directory +mkdir "$PROFILE/zotero" + cat <<EOF > "$PROFILE/prefs.js" user_pref("extensions.autoDisableScopes", 0); user_pref("extensions.zotero.debug.log", $DEBUG);