Merge branch '3.0'
This commit is contained in:
commit
575fd30e62
8 changed files with 132 additions and 73 deletions
|
@ -79,7 +79,7 @@ Zotero_TranslatorTesters = new function() {
|
||||||
};
|
};
|
||||||
} else {
|
} else {
|
||||||
strcmp = function (a, b) {
|
strcmp = function (a, b) {
|
||||||
return a.localeCompare(b);
|
return a.toLowerCase().localeCompare(b.toLowerCase());
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -213,12 +213,35 @@ Zotero_TranslatorTester._sanitizeItem = function(item, forSave) {
|
||||||
item = JSON.parse(JSON.stringify(item));
|
item = JSON.parse(JSON.stringify(item));
|
||||||
} catch(e) {};
|
} catch(e) {};
|
||||||
|
|
||||||
// remove fields to be ignored
|
// remove fields that don't exist or aren't valid for this item type, and normalize base fields
|
||||||
const IGNORE_FIELDS = ["complete", "accessDate", "checkFields"];
|
// to fields specific to this item
|
||||||
for(var j=0, n=IGNORE_FIELDS.length; j<n; j++) {
|
var fieldID, itemFieldID,
|
||||||
delete item[IGNORE_FIELDS[j]];
|
typeID = Zotero.ItemTypes.getID(item.itemType);
|
||||||
|
const skipFields = ["note", "notes", "itemID", "attachments", "tags", "seeAlso",
|
||||||
|
"itemType", "complete", "creators"];
|
||||||
|
for(var field in item) {
|
||||||
|
if(skipFields.indexOf(field) !== -1) continue;
|
||||||
|
|
||||||
|
if(!item[field] || !(fieldID = Zotero.ItemFields.getID(field))) {
|
||||||
|
delete item[field];
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(itemFieldID = Zotero.ItemFields.getFieldIDFromTypeAndBase(typeID, fieldID)) {
|
||||||
|
var value = item[field];
|
||||||
|
delete item[field];
|
||||||
|
item[Zotero.ItemFields.getName(itemFieldID)] = value;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!Zotero.ItemFields.isValidForType(fieldID, typeID)) {
|
||||||
|
delete item[field];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// remove fields to be ignored
|
||||||
|
if("accessDate" in item) delete item.accessDate;
|
||||||
|
|
||||||
return item;
|
return item;
|
||||||
};
|
};
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -130,7 +130,8 @@ Zotero.Connector_Types = new function() {
|
||||||
// mimics itemFields.js
|
// mimics itemFields.js
|
||||||
if(!field || !itemType) return false;
|
if(!field || !itemType) return false;
|
||||||
|
|
||||||
return itemType[4]/* fields */.indexOf(field[0]/* id */) !== -1;
|
/* fields */ /* id */
|
||||||
|
return itemType[4].indexOf(field[0]) !== -1;
|
||||||
};
|
};
|
||||||
|
|
||||||
this.getFieldIDFromTypeAndBase = function(typeIdOrName, fieldIdOrName) {
|
this.getFieldIDFromTypeAndBase = function(typeIdOrName, fieldIdOrName) {
|
||||||
|
|
|
@ -662,73 +662,47 @@ Zotero.Date = new function(){
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Figure out the date order from the output of toLocaleDateString()
|
* Get the order of the date components based on the current locale
|
||||||
*
|
*
|
||||||
* Returns a string with y, m, and d (e.g. 'ymd', 'mdy')
|
* Returns a string with y, m, and d (e.g. 'ymd', 'mdy')
|
||||||
*/
|
*/
|
||||||
function getLocaleDateOrder(){
|
function getLocaleDateOrder(){
|
||||||
if (_localeDateOrder) {
|
if (!_localeDateOrder) {
|
||||||
return _localeDateOrder;
|
switch (Zotero.locale.substr(-2)) {
|
||||||
|
// middle-endian
|
||||||
|
case 'US': // The United States
|
||||||
|
case 'BZ': // Belize
|
||||||
|
case 'FM': // The Federated States of Micronesia
|
||||||
|
case 'PA': // Panama
|
||||||
|
case 'PH': // The Philippines
|
||||||
|
case 'PW': // Palau
|
||||||
|
case 'ZW': // Zimbabwe
|
||||||
|
_localeDateOrder = 'mdy';
|
||||||
|
break;
|
||||||
|
|
||||||
|
// big-endian
|
||||||
|
case 'fa': // Persian
|
||||||
|
case 'AL': // Albania
|
||||||
|
case 'CA': // Canada
|
||||||
|
case 'CN': // China
|
||||||
|
case 'HU': // Hungary
|
||||||
|
case 'JP': // Japan
|
||||||
|
case 'KE': // Kenya
|
||||||
|
case 'KR': // Korea
|
||||||
|
case 'LT': // Lithuania
|
||||||
|
case 'LV': // Latvia
|
||||||
|
case 'MN': // Mongolia
|
||||||
|
case 'SE': // Sweden
|
||||||
|
case 'TW': // Taiwan
|
||||||
|
case 'ZA': // South Africa
|
||||||
|
_localeDateOrder = 'ymd';
|
||||||
|
break;
|
||||||
|
|
||||||
|
// little-endian
|
||||||
|
default:
|
||||||
|
_localeDateOrder = 'dmy';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
return _localeDateOrder;
|
||||||
var date = new Date("October 5, 2006");
|
|
||||||
var parts = date.toLocaleDateString().match(/([0-9]+)[^0-9]+([0-9]+)[^0-9]+([0-9]+)/);
|
|
||||||
|
|
||||||
// The above only works on OS X and Linux,
|
|
||||||
// where toLocaleDateString() produces "10/05/2006"
|
|
||||||
if (!parts) {
|
|
||||||
var country = Zotero.locale.substr(3);
|
|
||||||
switch (country) {
|
|
||||||
// I don't know where this country list came from, but these
|
|
||||||
// are little-endian in Zotero.strToDate()
|
|
||||||
case 'US': // The United States
|
|
||||||
case 'FM': // The Federated States of Micronesia
|
|
||||||
case 'PW': // Palau
|
|
||||||
case 'PH': // The Philippines
|
|
||||||
return 'mdy';
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
return 'dmy';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (parseInt(parts[1])){
|
|
||||||
case 2006:
|
|
||||||
var order = 'y';
|
|
||||||
break;
|
|
||||||
case 10:
|
|
||||||
var order = 'm';
|
|
||||||
break;
|
|
||||||
case 5:
|
|
||||||
var order = 'd';
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
switch (parseInt(parts[2])){
|
|
||||||
case 2006:
|
|
||||||
order += 'y';
|
|
||||||
break;
|
|
||||||
case 10:
|
|
||||||
order += 'm';
|
|
||||||
break;
|
|
||||||
case 5:
|
|
||||||
order += 'd';
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
switch (parseInt(parts[3])){
|
|
||||||
case 2006:
|
|
||||||
order += 'y';
|
|
||||||
break;
|
|
||||||
case 10:
|
|
||||||
order += 'm';
|
|
||||||
break;
|
|
||||||
case 5:
|
|
||||||
order += 'd';
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
_localeDateOrder = order;
|
|
||||||
|
|
||||||
return order;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -469,6 +469,11 @@ Zotero.HTTP = new function() {
|
||||||
* @return {browser} Hidden browser used for loading
|
* @return {browser} Hidden browser used for loading
|
||||||
*/
|
*/
|
||||||
this.processDocuments = function(urls, processor, done, exception, dontDelete, cookieSandbox) {
|
this.processDocuments = function(urls, processor, done, exception, dontDelete, cookieSandbox) {
|
||||||
|
// (Approximately) how many seconds to wait if the document is left in the loading state and
|
||||||
|
// pageshow is called before we call pageshow with an incomplete document
|
||||||
|
const LOADING_STATE_TIMEOUT = 120;
|
||||||
|
|
||||||
|
var firedLoadEvent;
|
||||||
/**
|
/**
|
||||||
* Removes event listener for the load event and deletes the hidden browser
|
* Removes event listener for the load event and deletes the hidden browser
|
||||||
*/
|
*/
|
||||||
|
@ -484,6 +489,7 @@ Zotero.HTTP = new function() {
|
||||||
var doLoad = function() {
|
var doLoad = function() {
|
||||||
if(urls.length) {
|
if(urls.length) {
|
||||||
var url = urls.shift();
|
var url = urls.shift();
|
||||||
|
firedLoadEvent = 0;
|
||||||
try {
|
try {
|
||||||
Zotero.debug("loading "+url);
|
Zotero.debug("loading "+url);
|
||||||
hiddenBrowser.loadURI(url);
|
hiddenBrowser.loadURI(url);
|
||||||
|
@ -509,7 +515,13 @@ Zotero.HTTP = new function() {
|
||||||
var onLoad = function() {
|
var onLoad = function() {
|
||||||
var doc = hiddenBrowser.contentDocument,
|
var doc = hiddenBrowser.contentDocument,
|
||||||
url = doc.location.href.toString();
|
url = doc.location.href.toString();
|
||||||
if(url == "about:blank" || doc.readyState === "loading") return;
|
if(url == "about:blank") return;
|
||||||
|
if(doc.readyState === "loading" && firedLoadEvent < 120) {
|
||||||
|
// Try again in a second
|
||||||
|
firedLoadEvent++;
|
||||||
|
Zotero.setTimeout(onLoad, 1000);
|
||||||
|
return;
|
||||||
|
}
|
||||||
if(url !== prevUrl) { // Just in case it fires too many times
|
if(url !== prevUrl) { // Just in case it fires too many times
|
||||||
prevUrl = url;
|
prevUrl = url;
|
||||||
try {
|
try {
|
||||||
|
|
|
@ -761,6 +761,18 @@ Zotero.ItemTreeView.prototype.getCellText = function(row, column)
|
||||||
case 'zotero-items-column-accessDate':
|
case 'zotero-items-column-accessDate':
|
||||||
if (val) {
|
if (val) {
|
||||||
var order = Zotero.Date.getLocaleDateOrder();
|
var order = Zotero.Date.getLocaleDateOrder();
|
||||||
|
if (order == 'mdy') {
|
||||||
|
order = 'mdy';
|
||||||
|
var join = '/';
|
||||||
|
}
|
||||||
|
else if (order == 'dmy') {
|
||||||
|
order = 'dmy';
|
||||||
|
var join = '.';
|
||||||
|
}
|
||||||
|
else if (order == 'ymd') {
|
||||||
|
order = 'YMD';
|
||||||
|
var join = '-';
|
||||||
|
}
|
||||||
var date = Zotero.Date.sqlToDate(val, true);
|
var date = Zotero.Date.sqlToDate(val, true);
|
||||||
var parts = [];
|
var parts = [];
|
||||||
for (var i=0; i<3; i++) {
|
for (var i=0; i<3; i++) {
|
||||||
|
@ -769,16 +781,28 @@ Zotero.ItemTreeView.prototype.getCellText = function(row, column)
|
||||||
parts.push(date.getFullYear().toString().substr(2));
|
parts.push(date.getFullYear().toString().substr(2));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 'Y':
|
||||||
|
parts.push(date.getFullYear());
|
||||||
|
break;
|
||||||
|
|
||||||
case 'm':
|
case 'm':
|
||||||
parts.push((date.getMonth() + 1));
|
parts.push((date.getMonth() + 1));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 'M':
|
||||||
|
parts.push(Zotero.Utilities.lpad((date.getMonth() + 1).toString(), '0', 2));
|
||||||
|
break;
|
||||||
|
|
||||||
case 'd':
|
case 'd':
|
||||||
parts.push(date.getDate());
|
parts.push(date.getDate());
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 'D':
|
||||||
|
parts.push(Zotero.Utilities.lpad(date.getDate().toString(), '0', 2));
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
val = parts.join('/');
|
val = parts.join(join);
|
||||||
val += ' ' + date.toLocaleTimeString();
|
val += ' ' + date.toLocaleTimeString();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1296,6 +1296,7 @@ Zotero.Sync.Storage = new function () {
|
||||||
Components.utils.reportError(msg + " in " + funcName);
|
Components.utils.reportError(msg + " in " + funcName);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
destFile.create(Components.interfaces.nsIFile.NORMAL_FILE_TYPE, 0644);
|
destFile.create(Components.interfaces.nsIFile.NORMAL_FILE_TYPE, 0644);
|
||||||
}
|
}
|
||||||
|
@ -1419,6 +1420,20 @@ Zotero.Sync.Storage = new function () {
|
||||||
}
|
}
|
||||||
catch (e) {
|
catch (e) {
|
||||||
Zotero.debug(destFile.path);
|
Zotero.debug(destFile.path);
|
||||||
|
|
||||||
|
// For advertising junk files, ignore a bug on Windows where
|
||||||
|
// destFile.create() works but zipReader.extract() doesn't
|
||||||
|
// when the path length is close to 255.
|
||||||
|
if (destFile.leafName.match(/[a-zA-Z0-9]{130,}/)) {
|
||||||
|
var msg = "Ignoring error extracting '" + destFile.path + "'";
|
||||||
|
Zotero.debug(msg, 2);
|
||||||
|
Zotero.debug(e, 2);
|
||||||
|
Components.utils.reportError(msg + " in " + funcName);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
zipReader.close();
|
||||||
|
|
||||||
Zotero.File.checkFileAccessError(e, destFile, 'create');
|
Zotero.File.checkFileAccessError(e, destFile, 'create');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1421,7 +1421,13 @@ Zotero.Translate.Web.prototype._getTranslatorsGetPotentialTranslators = function
|
||||||
* Bind sandbox to document being translated
|
* Bind sandbox to document being translated
|
||||||
*/
|
*/
|
||||||
Zotero.Translate.Web.prototype._getSandboxLocation = function() {
|
Zotero.Translate.Web.prototype._getSandboxLocation = function() {
|
||||||
return ("defaultView" in this.document ? this.document.defaultView : this.document.location.toString());
|
if(this._parentTranslator) {
|
||||||
|
return this._parentTranslator._sandboxLocation;
|
||||||
|
} else if("defaultView" in this.document) {
|
||||||
|
return this.document.defaultView;
|
||||||
|
} else {
|
||||||
|
return this.document.location.toString();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -310,6 +310,10 @@ Zotero.Translate.ItemSaver.prototype = {
|
||||||
|| downloadAssociatedFiles;
|
|| downloadAssociatedFiles;
|
||||||
if(!shouldAttach) return;
|
if(!shouldAttach) return;
|
||||||
|
|
||||||
|
if(attachment.document && "__wrappedDOMObject" in attachment.document) {
|
||||||
|
attachment.document = attachment.document.__wrappedDOMObject;
|
||||||
|
}
|
||||||
|
|
||||||
if(attachment.snapshot === false || !this._saveFiles) {
|
if(attachment.snapshot === false || !this._saveFiles) {
|
||||||
// if snapshot is explicitly set to false, attach as link
|
// if snapshot is explicitly set to false, attach as link
|
||||||
if(attachment.document) {
|
if(attachment.document) {
|
||||||
|
|
Loading…
Reference in a new issue