2007-10-23 07:11:59 +00:00
|
|
|
/*
|
|
|
|
***** BEGIN LICENSE BLOCK *****
|
|
|
|
|
2009-12-28 09:47:49 +00:00
|
|
|
Copyright © 2009 Center for History and New Media
|
|
|
|
George Mason University, Fairfax, Virginia, USA
|
|
|
|
http://zotero.org
|
2007-10-23 07:11:59 +00:00
|
|
|
|
2009-12-28 09:47:49 +00:00
|
|
|
This file is part of Zotero.
|
2007-10-23 07:11:59 +00:00
|
|
|
|
2009-12-28 09:47:49 +00:00
|
|
|
Zotero is free software: you can redistribute it and/or modify
|
2011-05-18 18:34:22 +00:00
|
|
|
it under the terms of the GNU Affero General Public License as published by
|
2009-12-28 09:47:49 +00:00
|
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
|
|
(at your option) any later version.
|
|
|
|
|
|
|
|
Zotero is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
2011-05-18 18:34:22 +00:00
|
|
|
GNU Affero General Public License for more details.
|
2009-12-28 09:47:49 +00:00
|
|
|
|
2011-05-18 18:34:22 +00:00
|
|
|
You should have received a copy of the GNU Affero General Public License
|
2009-12-28 09:47:49 +00:00
|
|
|
along with Zotero. If not, see <http://www.gnu.org/licenses/>.
|
2007-10-23 07:11:59 +00:00
|
|
|
|
|
|
|
|
|
|
|
Based on nsChromeExtensionHandler example code by Ed Anuff at
|
|
|
|
http://kb.mozillazine.org/Dev_:_Extending_the_Chrome_Protocol
|
|
|
|
|
|
|
|
***** END LICENSE BLOCK *****
|
|
|
|
*/
|
|
|
|
|
|
|
|
const ZOTERO_SCHEME = "zotero";
|
|
|
|
const ZOTERO_PROTOCOL_CID = Components.ID("{9BC3D762-9038-486A-9D70-C997AF848A7C}");
|
|
|
|
const ZOTERO_PROTOCOL_CONTRACTID = "@mozilla.org/network/protocol;1?name=" + ZOTERO_SCHEME;
|
|
|
|
const ZOTERO_PROTOCOL_NAME = "Zotero Chrome Extension Protocol";
|
|
|
|
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
const Cc = Components.classes;
|
|
|
|
const Ci = Components.interfaces;
|
|
|
|
const Cr = Components.results;
|
|
|
|
|
2010-07-06 09:02:35 +00:00
|
|
|
Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
|
|
|
|
|
2007-10-23 07:11:59 +00:00
|
|
|
// Dummy chrome URL used to obtain a valid chrome channel
|
|
|
|
// This one was chosen at random and should be able to be substituted
|
|
|
|
// for any other well known chrome URL in the browser installation
|
|
|
|
const DUMMY_CHROME_URL = "chrome://mozapps/content/xpinstall/xpinstallConfirm.xul";
|
|
|
|
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
var Zotero = Components.classes["@zotero.org/Zotero;1"]
|
|
|
|
.getService(Components.interfaces.nsISupports)
|
|
|
|
.wrappedJSObject;
|
|
|
|
|
|
|
|
var ioService = Components.classes["@mozilla.org/network/io-service;1"]
|
|
|
|
.getService(Components.interfaces.nsIIOService);
|
2007-10-23 07:11:59 +00:00
|
|
|
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
function ZoteroProtocolHandler() {
|
2007-10-23 07:11:59 +00:00
|
|
|
this.wrappedJSObject = this;
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
this._principal = null;
|
2007-10-23 07:11:59 +00:00
|
|
|
this._extensions = {};
|
|
|
|
|
|
|
|
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
/**
|
|
|
|
* zotero://data/library/collection/ABCD1234/items?sort=itemType&direction=desc
|
|
|
|
* zotero://data/groups/12345/collection/ABCD1234/items?sort=title&direction=asc
|
|
|
|
*/
|
|
|
|
var DataExtension = {
|
|
|
|
loadAsChrome: false,
|
|
|
|
|
|
|
|
newChannel: function (uri) {
|
|
|
|
return new AsyncChannel(uri, function* () {
|
|
|
|
this.contentType = 'text/plain';
|
|
|
|
|
|
|
|
path = uri.spec.match(/zotero:\/\/[^/]+(.*)/)[1];
|
|
|
|
|
|
|
|
try {
|
|
|
|
return Zotero.Utilities.Internal.getAsyncInputStream(
|
|
|
|
Zotero.API.Data.getGenerator(path)
|
|
|
|
);
|
|
|
|
}
|
|
|
|
catch (e if e instanceof Zotero.Router.InvalidPathException) {
|
|
|
|
return "URL could not be parsed";
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2007-10-23 07:11:59 +00:00
|
|
|
/*
|
|
|
|
* Report generation extension for Zotero protocol
|
|
|
|
*/
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
var ReportExtension = {
|
|
|
|
loadAsChrome: false,
|
2007-10-23 07:11:59 +00:00
|
|
|
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
newChannel: function (uri) {
|
|
|
|
return new AsyncChannel(uri, function* () {
|
2015-03-10 06:27:56 +00:00
|
|
|
var userLibraryID = Zotero.Libraries.userLibraryID;
|
|
|
|
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
var path = uri.path;
|
|
|
|
if (!path) {
|
|
|
|
return 'Invalid URL';
|
|
|
|
}
|
|
|
|
// Strip leading '/'
|
|
|
|
path = path.substr(1);
|
2007-10-23 07:11:59 +00:00
|
|
|
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
// Proxy CSS files
|
|
|
|
if (path.endsWith('.css')) {
|
|
|
|
var chromeURL = 'chrome://zotero/skin/report/' + path;
|
|
|
|
Zotero.debug(chromeURL);
|
|
|
|
var ios = Components.classes["@mozilla.org/network/io-service;1"]
|
|
|
|
.getService(Components.interfaces.nsIIOService);
|
|
|
|
let uri = ios.newURI(chromeURL, null, null);
|
|
|
|
var chromeReg = Components.classes["@mozilla.org/chrome/chrome-registry;1"]
|
|
|
|
.getService(Components.interfaces.nsIChromeRegistry);
|
|
|
|
return chromeReg.convertChromeURL(uri);
|
|
|
|
}
|
2007-10-23 07:11:59 +00:00
|
|
|
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
var params = {
|
2014-09-23 05:11:41 +00:00
|
|
|
objectType: 'item',
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
format: 'html',
|
|
|
|
sort: 'title'
|
|
|
|
};
|
|
|
|
var router = new Zotero.Router(params);
|
|
|
|
|
|
|
|
// Items within a collection or search
|
|
|
|
router.add('library/:scopeObject/:scopeObjectKey/items/report.html', function () {
|
2015-03-10 06:27:56 +00:00
|
|
|
params.libraryID = userLibraryID;
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
});
|
|
|
|
router.add('groups/:groupID/:scopeObject/:scopeObjectKey/items/report.html');
|
|
|
|
|
|
|
|
// All items
|
|
|
|
router.add('library/items/report.html', function () {
|
2015-03-10 06:27:56 +00:00
|
|
|
params.libraryID = userLibraryID;
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
});
|
|
|
|
router.add('groups/:groupID/items/report.html');
|
|
|
|
|
|
|
|
// Old-style URLs
|
|
|
|
router.add('collection/:id/html/report.html', function () {
|
|
|
|
params.scopeObject = 'collections';
|
|
|
|
var lkh = Zotero.Collections.parseLibraryKeyHash(params.id);
|
|
|
|
if (lkh) {
|
|
|
|
params.libraryID = lkh.libraryID;
|
|
|
|
params.scopeObjectKey = lkh.key;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
params.scopeObjectID = params.id;
|
2007-10-23 07:11:59 +00:00
|
|
|
}
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
delete params.id;
|
|
|
|
});
|
|
|
|
router.add('search/:id/html/report.html', function () {
|
|
|
|
params.scopeObject = 'searches';
|
|
|
|
var lkh = Zotero.Searches.parseLibraryKeyHash(this.id);
|
|
|
|
if (lkh) {
|
|
|
|
params.libraryID = lkh.libraryID;
|
|
|
|
params.scopeObjectKey = lkh.key;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
params.scopeObjectID = this.id;
|
|
|
|
}
|
|
|
|
delete params.id;
|
|
|
|
});
|
|
|
|
router.add('items/:ids/html/report.html', function () {
|
|
|
|
var ids = this.ids.split('-');
|
|
|
|
params.libraryID = ids[0].split('_')[0];
|
|
|
|
params.itemKey = ids.map(x => x.split('_')[1]);
|
|
|
|
delete params.ids;
|
|
|
|
});
|
|
|
|
|
|
|
|
var parsed = router.run(path);
|
|
|
|
if (!parsed) {
|
|
|
|
return "URL could not be parsed";
|
2007-10-23 07:11:59 +00:00
|
|
|
}
|
|
|
|
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
// TODO: support old URLs
|
|
|
|
// collection
|
|
|
|
// search
|
|
|
|
// items
|
|
|
|
// item
|
|
|
|
if (params.sort.contains('/')) {
|
|
|
|
let parts = params.sort.split('/');
|
|
|
|
params.sort = parts[0];
|
|
|
|
params.direction = parts[1] == 'd' ? 'desc' : 'asc';
|
|
|
|
}
|
|
|
|
|
|
|
|
try {
|
|
|
|
Zotero.API.parseParams(params);
|
|
|
|
var results = yield Zotero.API.getResultsFromParams(params);
|
|
|
|
}
|
|
|
|
catch (e) {
|
|
|
|
Zotero.debug(e, 1);
|
|
|
|
return e.toString();
|
2007-10-23 07:11:59 +00:00
|
|
|
}
|
|
|
|
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
var mimeType, content = '';
|
2007-10-23 07:11:59 +00:00
|
|
|
var items = [];
|
|
|
|
var itemsHash = {}; // key = itemID, val = position in |items|
|
|
|
|
var searchItemIDs = {}; // hash of all selected items
|
|
|
|
var searchParentIDs = {}; // hash of parents of selected child items
|
|
|
|
var searchChildIDs = {}; // hash of selected chlid items
|
|
|
|
|
|
|
|
var includeAllChildItems = Zotero.Prefs.get('report.includeAllChildItems');
|
|
|
|
var combineChildItems = Zotero.Prefs.get('report.combineChildItems');
|
|
|
|
|
Merged revisions 2710-2712,2714-2716,2718-2728,2730-2731,2734,2736-2738,2740-2750,2752-2753,2755,2758-2768,2770-2779,2782,2789-2790,2794,2797-2802,2804,2808-2810,2812,2814-2824,2826-2832,2834-2835 via svnmerge from 1.0 branch
2008-06-11 08:55:59 +00:00
|
|
|
var unhandledParents = {};
|
2007-10-23 07:11:59 +00:00
|
|
|
for (var i=0; i<results.length; i++) {
|
|
|
|
// Don't add child items directly
|
|
|
|
// (instead mark their parents for inclusion below)
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
var parentItemID = results[i].parentItemID;
|
Async DB megacommit
Promise-based rewrite of most of the codebase, with asynchronous database and file access -- see https://github.com/zotero/zotero/issues/518 for details.
WARNING: This includes backwards-incompatible schema changes.
An incomplete list of other changes:
- Schema overhaul
- Replace main tables with new versions with updated schema
- Enable real foreign key support and remove previous triggers
- Don't use NULLs for local libraryID, which broke the UNIQUE index
preventing object key duplication. All code (Zotero and third-party)
using NULL for the local library will need to be updated to use 0
instead (already done for Zotero code)
- Add 'compatibility' DB version that can be incremented manually to break DB
compatibility with previous versions. 'userdata' upgrades will no longer
automatically break compatibility.
- Demote creators and tags from first-class objects to item properties
- New API syncing properties
- 'synced'/'version' properties to data objects
- 'etag' to groups
- 'version' to libraries
- Create Zotero.DataObject that other objects inherit from
- Consolidate data object loading into Zotero.DataObjects
- Change object reloading so that only the loaded and changed parts of objects are reloaded, instead of reloading all data from the database (with some exceptions, including item primary data)
- Items and collections now have .parentItem and .parentKey properties, replacing item.getSource() and item.getSourceKey()
- New function Zotero.serial(fn), to wrap an async function such that all calls are run serially
- New function Zotero.Utilities.Internal.forEachChunkAsync(arr, chunkSize, func)
- Add tag selector loading message
- Various API and name changes, since everything was breaking anyway
Known broken things:
- Syncing (will be completely rewritten for API syncing)
- Translation architecture (needs promise-based rewrite)
- Duplicates view
- DB integrity check (from schema changes)
- Dragging (may be difficult to fix)
Lots of other big and little things are certainly broken, particularly with the UI, which can be affected by async code in all sorts of subtle ways.
2014-08-06 21:38:05 +00:00
|
|
|
if (parentItemID) {
|
|
|
|
searchParentIDs[parentItemID] = true;
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
searchChildIDs[results[i].id] = true;
|
2007-10-23 07:11:59 +00:00
|
|
|
|
|
|
|
// Don't include all child items if any child
|
|
|
|
// items were selected
|
|
|
|
includeAllChildItems = false;
|
|
|
|
}
|
Merged revisions 1986,1988-1990,1996,1998,2000-2004,2006,2008-2010,2013,2020-2028,2032-2034,2037,2039,2044-2049,2052-2056,2059,2065-2066,2068-2072,2075,2077-2079,2081,2083-2084,2086,2088-2094,2096,2099,2101,2103-2104,2107-2110,2115,2118,2120-2122,2126-2128,2131,2140,2142-2145,2149-2153,2155-2159,2165,2167-2168,2170-2171,2173-2176,2179-2183,2185-2186 via svnmerge from
https://www.zotero.org/svn/extension/branches/1.0
2008-01-30 09:53:19 +00:00
|
|
|
// If combining children or standalone note/attachment, add matching parents
|
Merged revisions 2710-2712,2714-2716,2718-2728,2730-2731,2734,2736-2738,2740-2750,2752-2753,2755,2758-2768,2770-2779,2782,2789-2790,2794,2797-2802,2804,2808-2810,2812,2814-2824,2826-2832,2834-2835 via svnmerge from 1.0 branch
2008-06-11 08:55:59 +00:00
|
|
|
else if (combineChildItems || !results[i].isRegularItem()
|
|
|
|
|| results[i].numChildren() == 0) {
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
itemsHash[results[i].id] = [items.length];
|
|
|
|
items.push(yield results[i].toJSON({ mode: 'full' }));
|
2007-10-23 07:11:59 +00:00
|
|
|
// Flag item as a search match
|
|
|
|
items[items.length - 1].reportSearchMatch = true;
|
|
|
|
}
|
Merged revisions 2710-2712,2714-2716,2718-2728,2730-2731,2734,2736-2738,2740-2750,2752-2753,2755,2758-2768,2770-2779,2782,2789-2790,2794,2797-2802,2804,2808-2810,2812,2814-2824,2826-2832,2834-2835 via svnmerge from 1.0 branch
2008-06-11 08:55:59 +00:00
|
|
|
else {
|
|
|
|
unhandledParents[i] = true;
|
|
|
|
}
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
searchItemIDs[results[i].id] = true;
|
2007-10-23 07:11:59 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// If including all child items, add children of all matched
|
|
|
|
// parents to the child array
|
|
|
|
if (includeAllChildItems) {
|
|
|
|
for (var id in searchItemIDs) {
|
|
|
|
if (!searchChildIDs[id]) {
|
|
|
|
var children = [];
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
var item = yield Zotero.Items.getAsync(id);
|
2007-10-23 07:11:59 +00:00
|
|
|
if (!item.isRegularItem()) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
var func = function (ids) {
|
|
|
|
if (ids) {
|
|
|
|
for (var i=0; i<ids.length; i++) {
|
|
|
|
searchChildIDs[ids[i]] = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
yield item.loadChildItems();
|
2007-10-23 07:11:59 +00:00
|
|
|
func(item.getNotes());
|
|
|
|
func(item.getAttachments());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
Merged revisions 2710-2712,2714-2716,2718-2728,2730-2731,2734,2736-2738,2740-2750,2752-2753,2755,2758-2768,2770-2779,2782,2789-2790,2794,2797-2802,2804,2808-2810,2812,2814-2824,2826-2832,2834-2835 via svnmerge from 1.0 branch
2008-06-11 08:55:59 +00:00
|
|
|
// If not including all children, add matching parents,
|
|
|
|
// in case they don't have any matching children below
|
|
|
|
else {
|
|
|
|
for (var i in unhandledParents) {
|
|
|
|
itemsHash[results[i].id] = [items.length];
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
items.push(yield results[i].toJSON({ mode: 'full' }));
|
Merged revisions 2710-2712,2714-2716,2718-2728,2730-2731,2734,2736-2738,2740-2750,2752-2753,2755,2758-2768,2770-2779,2782,2789-2790,2794,2797-2802,2804,2808-2810,2812,2814-2824,2826-2832,2834-2835 via svnmerge from 1.0 branch
2008-06-11 08:55:59 +00:00
|
|
|
// Flag item as a search match
|
|
|
|
items[items.length - 1].reportSearchMatch = true;
|
|
|
|
}
|
|
|
|
}
|
2007-10-23 07:11:59 +00:00
|
|
|
|
|
|
|
if (combineChildItems) {
|
|
|
|
// Add parents of matches if parents aren't matches themselves
|
|
|
|
for (var id in searchParentIDs) {
|
Merged revisions 2710-2712,2714-2716,2718-2728,2730-2731,2734,2736-2738,2740-2750,2752-2753,2755,2758-2768,2770-2779,2782,2789-2790,2794,2797-2802,2804,2808-2810,2812,2814-2824,2826-2832,2834-2835 via svnmerge from 1.0 branch
2008-06-11 08:55:59 +00:00
|
|
|
if (!searchItemIDs[id] && !itemsHash[id]) {
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
var item = yield Zotero.Items.getAsync(id);
|
2007-10-23 07:11:59 +00:00
|
|
|
itemsHash[id] = items.length;
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
items.push(yield item.toJSON({ mode: 'full' }));
|
2007-10-23 07:11:59 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Add children to reportChildren property of parents
|
|
|
|
for (var id in searchChildIDs) {
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
var item = yield Zotero.Items.getAsync(id);
|
|
|
|
var parentID = item.parentID;
|
|
|
|
if (!items[itemsHash[parentID]].reportChildren) {
|
|
|
|
items[itemsHash[parentID]].reportChildren = {
|
2007-10-23 07:11:59 +00:00
|
|
|
notes: [],
|
|
|
|
attachments: []
|
|
|
|
};
|
|
|
|
}
|
|
|
|
if (item.isNote()) {
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
items[itemsHash[parentID]].reportChildren.notes.push(yield item.toJSON({ mode: 'full' }));
|
2007-10-23 07:11:59 +00:00
|
|
|
}
|
|
|
|
if (item.isAttachment()) {
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
items[itemsHash[parentID]].reportChildren.attachments.push(yield item.toJSON({ mode: 'full' }));
|
2007-10-23 07:11:59 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// If not combining children, add a parent/child pair
|
|
|
|
// for each matching child
|
|
|
|
else {
|
|
|
|
for (var id in searchChildIDs) {
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
var item = yield Zotero.Items.getAsync(id);
|
|
|
|
var parentID = item.parentID;
|
2007-10-23 07:11:59 +00:00
|
|
|
var parentItem = Zotero.Items.get(parentID);
|
|
|
|
|
|
|
|
if (!itemsHash[parentID]) {
|
|
|
|
// If parent is a search match and not yet added,
|
|
|
|
// add on its own
|
|
|
|
if (searchItemIDs[parentID]) {
|
|
|
|
itemsHash[parentID] = [items.length];
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
items.push(yield parentItem.toJSON({ mode: 'full' }));
|
2007-10-23 07:11:59 +00:00
|
|
|
items[items.length - 1].reportSearchMatch = true;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
itemsHash[parentID] = [];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Now add parent and child
|
|
|
|
itemsHash[parentID].push(items.length);
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
items.push(parentItem.toJSON({ mode: 'full' }));
|
2007-10-23 07:11:59 +00:00
|
|
|
if (item.isNote()) {
|
|
|
|
items[items.length - 1].reportChildren = {
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
notes: [yield item.toJSON({ mode: 'full' })],
|
2007-10-23 07:11:59 +00:00
|
|
|
attachments: []
|
|
|
|
};
|
|
|
|
}
|
|
|
|
else if (item.isAttachment()) {
|
|
|
|
items[items.length - 1].reportChildren = {
|
|
|
|
notes: [],
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
attachments: [yield item.toJSON({ mode: 'full' })]
|
2007-10-23 07:11:59 +00:00
|
|
|
};
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Sort items
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
// TODO: restore multiple sort fields
|
|
|
|
var sorts = [{
|
|
|
|
field: params.sort,
|
|
|
|
order: params.direction != 'desc' ? 1 : -1
|
|
|
|
}];
|
2007-10-23 07:11:59 +00:00
|
|
|
|
|
|
|
|
|
|
|
var collation = Zotero.getLocaleCollation();
|
|
|
|
var compareFunction = function(a, b) {
|
|
|
|
var index = 0;
|
|
|
|
|
|
|
|
// Multidimensional sort
|
|
|
|
do {
|
Merged revisions 2710-2712,2714-2716,2718-2728,2730-2731,2734,2736-2738,2740-2750,2752-2753,2755,2758-2768,2770-2779,2782,2789-2790,2794,2797-2802,2804,2808-2810,2812,2814-2824,2826-2832,2834-2835 via svnmerge from 1.0 branch
2008-06-11 08:55:59 +00:00
|
|
|
// In combineChildItems, use note or attachment as item
|
|
|
|
if (!combineChildItems) {
|
|
|
|
if (a.reportChildren) {
|
|
|
|
if (a.reportChildren.notes.length) {
|
|
|
|
a = a.reportChildren.notes[0];
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
a = a.reportChildren.attachments[0];
|
|
|
|
}
|
Merged revisions 1986,1988-1990,1996,1998,2000-2004,2006,2008-2010,2013,2020-2028,2032-2034,2037,2039,2044-2049,2052-2056,2059,2065-2066,2068-2072,2075,2077-2079,2081,2083-2084,2086,2088-2094,2096,2099,2101,2103-2104,2107-2110,2115,2118,2120-2122,2126-2128,2131,2140,2142-2145,2149-2153,2155-2159,2165,2167-2168,2170-2171,2173-2176,2179-2183,2185-2186 via svnmerge from
https://www.zotero.org/svn/extension/branches/1.0
2008-01-30 09:53:19 +00:00
|
|
|
}
|
|
|
|
|
Merged revisions 2710-2712,2714-2716,2718-2728,2730-2731,2734,2736-2738,2740-2750,2752-2753,2755,2758-2768,2770-2779,2782,2789-2790,2794,2797-2802,2804,2808-2810,2812,2814-2824,2826-2832,2834-2835 via svnmerge from 1.0 branch
2008-06-11 08:55:59 +00:00
|
|
|
if (b.reportChildren) {
|
|
|
|
if (b.reportChildren.notes.length) {
|
|
|
|
b = b.reportChildren.notes[0];
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
b = b.reportChildren.attachments[0];
|
|
|
|
}
|
Merged revisions 1986,1988-1990,1996,1998,2000-2004,2006,2008-2010,2013,2020-2028,2032-2034,2037,2039,2044-2049,2052-2056,2059,2065-2066,2068-2072,2075,2077-2079,2081,2083-2084,2086,2088-2094,2096,2099,2101,2103-2104,2107-2110,2115,2118,2120-2122,2126-2128,2131,2140,2142-2145,2149-2153,2155-2159,2165,2167-2168,2170-2171,2173-2176,2179-2183,2185-2186 via svnmerge from
https://www.zotero.org/svn/extension/branches/1.0
2008-01-30 09:53:19 +00:00
|
|
|
}
|
Merged revisions 2710-2712,2714-2716,2718-2728,2730-2731,2734,2736-2738,2740-2750,2752-2753,2755,2758-2768,2770-2779,2782,2789-2790,2794,2797-2802,2804,2808-2810,2812,2814-2824,2826-2832,2834-2835 via svnmerge from 1.0 branch
2008-06-11 08:55:59 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
var valA, valB;
|
|
|
|
|
|
|
|
if (sorts[index].field == 'title') {
|
|
|
|
// For notes, use content for 'title'
|
|
|
|
if (a.itemType == 'note') {
|
|
|
|
valA = a.note;
|
Merged revisions 1986,1988-1990,1996,1998,2000-2004,2006,2008-2010,2013,2020-2028,2032-2034,2037,2039,2044-2049,2052-2056,2059,2065-2066,2068-2072,2075,2077-2079,2081,2083-2084,2086,2088-2094,2096,2099,2101,2103-2104,2107-2110,2115,2118,2120-2122,2126-2128,2131,2140,2142-2145,2149-2153,2155-2159,2165,2167-2168,2170-2171,2173-2176,2179-2183,2185-2186 via svnmerge from
https://www.zotero.org/svn/extension/branches/1.0
2008-01-30 09:53:19 +00:00
|
|
|
}
|
|
|
|
else {
|
Merged revisions 2710-2712,2714-2716,2718-2728,2730-2731,2734,2736-2738,2740-2750,2752-2753,2755,2758-2768,2770-2779,2782,2789-2790,2794,2797-2802,2804,2808-2810,2812,2814-2824,2826-2832,2834-2835 via svnmerge from 1.0 branch
2008-06-11 08:55:59 +00:00
|
|
|
valA = a.title;
|
Merged revisions 1986,1988-1990,1996,1998,2000-2004,2006,2008-2010,2013,2020-2028,2032-2034,2037,2039,2044-2049,2052-2056,2059,2065-2066,2068-2072,2075,2077-2079,2081,2083-2084,2086,2088-2094,2096,2099,2101,2103-2104,2107-2110,2115,2118,2120-2122,2126-2128,2131,2140,2142-2145,2149-2153,2155-2159,2165,2167-2168,2170-2171,2173-2176,2179-2183,2185-2186 via svnmerge from
https://www.zotero.org/svn/extension/branches/1.0
2008-01-30 09:53:19 +00:00
|
|
|
}
|
|
|
|
|
Merged revisions 2710-2712,2714-2716,2718-2728,2730-2731,2734,2736-2738,2740-2750,2752-2753,2755,2758-2768,2770-2779,2782,2789-2790,2794,2797-2802,2804,2808-2810,2812,2814-2824,2826-2832,2834-2835 via svnmerge from 1.0 branch
2008-06-11 08:55:59 +00:00
|
|
|
if (b.itemType == 'note') {
|
|
|
|
valB = b.note;
|
Merged revisions 1986,1988-1990,1996,1998,2000-2004,2006,2008-2010,2013,2020-2028,2032-2034,2037,2039,2044-2049,2052-2056,2059,2065-2066,2068-2072,2075,2077-2079,2081,2083-2084,2086,2088-2094,2096,2099,2101,2103-2104,2107-2110,2115,2118,2120-2122,2126-2128,2131,2140,2142-2145,2149-2153,2155-2159,2165,2167-2168,2170-2171,2173-2176,2179-2183,2185-2186 via svnmerge from
https://www.zotero.org/svn/extension/branches/1.0
2008-01-30 09:53:19 +00:00
|
|
|
}
|
|
|
|
else {
|
Merged revisions 2710-2712,2714-2716,2718-2728,2730-2731,2734,2736-2738,2740-2750,2752-2753,2755,2758-2768,2770-2779,2782,2789-2790,2794,2797-2802,2804,2808-2810,2812,2814-2824,2826-2832,2834-2835 via svnmerge from 1.0 branch
2008-06-11 08:55:59 +00:00
|
|
|
valB = b.title;
|
Merged revisions 1986,1988-1990,1996,1998,2000-2004,2006,2008-2010,2013,2020-2028,2032-2034,2037,2039,2044-2049,2052-2056,2059,2065-2066,2068-2072,2075,2077-2079,2081,2083-2084,2086,2088-2094,2096,2099,2101,2103-2104,2107-2110,2115,2118,2120-2122,2126-2128,2131,2140,2142-2145,2149-2153,2155-2159,2165,2167-2168,2170-2171,2173-2176,2179-2183,2185-2186 via svnmerge from
https://www.zotero.org/svn/extension/branches/1.0
2008-01-30 09:53:19 +00:00
|
|
|
}
|
Merged revisions 2710-2712,2714-2716,2718-2728,2730-2731,2734,2736-2738,2740-2750,2752-2753,2755,2758-2768,2770-2779,2782,2789-2790,2794,2797-2802,2804,2808-2810,2812,2814-2824,2826-2832,2834-2835 via svnmerge from 1.0 branch
2008-06-11 08:55:59 +00:00
|
|
|
|
|
|
|
valA = Zotero.Items.getSortTitle(valA);
|
|
|
|
valB = Zotero.Items.getSortTitle(valB);
|
Merged revisions 1986,1988-1990,1996,1998,2000-2004,2006,2008-2010,2013,2020-2028,2032-2034,2037,2039,2044-2049,2052-2056,2059,2065-2066,2068-2072,2075,2077-2079,2081,2083-2084,2086,2088-2094,2096,2099,2101,2103-2104,2107-2110,2115,2118,2120-2122,2126-2128,2131,2140,2142-2145,2149-2153,2155-2159,2165,2167-2168,2170-2171,2173-2176,2179-2183,2185-2186 via svnmerge from
https://www.zotero.org/svn/extension/branches/1.0
2008-01-30 09:53:19 +00:00
|
|
|
}
|
2011-04-12 14:47:44 +00:00
|
|
|
else if (sorts[index].field == 'date') {
|
2012-04-26 20:28:55 +00:00
|
|
|
var itemA = Zotero.Items.getByLibraryAndKey(a.libraryID, a.key);
|
|
|
|
var itemB = Zotero.Items.getByLibraryAndKey(b.libraryID, b.key);
|
|
|
|
valA = itemA.getField('date', true, true);
|
|
|
|
valB = itemB.getField('date', true, true);
|
2011-04-12 14:47:44 +00:00
|
|
|
}
|
2012-01-12 00:02:57 +00:00
|
|
|
// TEMP: This is an ugly hack to make creator sorting
|
|
|
|
// slightly less broken. To do this right, real creator
|
|
|
|
// sorting needs to be abstracted from itemTreeView.js.
|
|
|
|
else if (sorts[index].field == 'firstCreator') {
|
|
|
|
var itemA = Zotero.Items.getByLibraryAndKey(a.libraryID, a.key);
|
|
|
|
var itemB = Zotero.Items.getByLibraryAndKey(b.libraryID, b.key);
|
|
|
|
valA = itemA.getField('firstCreator');
|
|
|
|
valB = itemB.getField('firstCreator');
|
|
|
|
}
|
Merged revisions 1986,1988-1990,1996,1998,2000-2004,2006,2008-2010,2013,2020-2028,2032-2034,2037,2039,2044-2049,2052-2056,2059,2065-2066,2068-2072,2075,2077-2079,2081,2083-2084,2086,2088-2094,2096,2099,2101,2103-2104,2107-2110,2115,2118,2120-2122,2126-2128,2131,2140,2142-2145,2149-2153,2155-2159,2165,2167-2168,2170-2171,2173-2176,2179-2183,2185-2186 via svnmerge from
https://www.zotero.org/svn/extension/branches/1.0
2008-01-30 09:53:19 +00:00
|
|
|
else {
|
2011-04-12 14:47:44 +00:00
|
|
|
valA = a[sorts[index].field];
|
|
|
|
valB = b[sorts[index].field];
|
Merged revisions 1986,1988-1990,1996,1998,2000-2004,2006,2008-2010,2013,2020-2028,2032-2034,2037,2039,2044-2049,2052-2056,2059,2065-2066,2068-2072,2075,2077-2079,2081,2083-2084,2086,2088-2094,2096,2099,2101,2103-2104,2107-2110,2115,2118,2120-2122,2126-2128,2131,2140,2142-2145,2149-2153,2155-2159,2165,2167-2168,2170-2171,2173-2176,2179-2183,2185-2186 via svnmerge from
https://www.zotero.org/svn/extension/branches/1.0
2008-01-30 09:53:19 +00:00
|
|
|
}
|
2007-10-23 07:11:59 +00:00
|
|
|
|
Merged revisions 2710-2712,2714-2716,2718-2728,2730-2731,2734,2736-2738,2740-2750,2752-2753,2755,2758-2768,2770-2779,2782,2789-2790,2794,2797-2802,2804,2808-2810,2812,2814-2824,2826-2832,2834-2835 via svnmerge from 1.0 branch
2008-06-11 08:55:59 +00:00
|
|
|
// Put empty values last
|
|
|
|
if (!valA && valB) {
|
|
|
|
var cmp = 1;
|
|
|
|
}
|
|
|
|
else if (valA && !valB) {
|
|
|
|
var cmp = -1;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
var cmp = collation.compareString(0, valA, valB);
|
2007-10-23 07:11:59 +00:00
|
|
|
}
|
|
|
|
|
Merged revisions 2710-2712,2714-2716,2718-2728,2730-2731,2734,2736-2738,2740-2750,2752-2753,2755,2758-2768,2770-2779,2782,2789-2790,2794,2797-2802,2804,2808-2810,2812,2814-2824,2826-2832,2834-2835 via svnmerge from 1.0 branch
2008-06-11 08:55:59 +00:00
|
|
|
var result = 0;
|
|
|
|
if (cmp != 0) {
|
|
|
|
result = cmp * sorts[index].order;
|
|
|
|
}
|
2007-10-23 07:11:59 +00:00
|
|
|
index++;
|
|
|
|
}
|
|
|
|
while (result == 0 && sorts[index]);
|
|
|
|
|
|
|
|
return result;
|
|
|
|
};
|
|
|
|
|
|
|
|
items.sort(compareFunction);
|
|
|
|
for (var i in items) {
|
|
|
|
if (items[i].reportChildren) {
|
|
|
|
items[i].reportChildren.notes.sort(compareFunction);
|
|
|
|
items[i].reportChildren.attachments.sort(compareFunction);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Pass off to the appropriate handler
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
switch (params.format) {
|
2007-10-23 07:11:59 +00:00
|
|
|
case 'rtf':
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
this.contentType = 'text/rtf';
|
|
|
|
return '';
|
2007-10-23 07:11:59 +00:00
|
|
|
|
|
|
|
case 'csv':
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
this.contentType = 'text/plain';
|
|
|
|
return '';
|
2007-10-23 07:11:59 +00:00
|
|
|
|
|
|
|
default:
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
this.contentType = 'text/html';
|
|
|
|
return Zotero.Utilities.Internal.getAsyncInputStream(
|
|
|
|
Zotero.Report.HTML.listGenerator(items, combineChildItems),
|
|
|
|
function () {
|
|
|
|
return '<span style="color: red; font-weight: bold">Error generating report</span>';
|
|
|
|
}
|
|
|
|
);
|
2007-10-23 07:11:59 +00:00
|
|
|
}
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
});
|
2007-10-23 07:11:59 +00:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
/**
|
|
|
|
* Generate MIT SIMILE Timeline
|
|
|
|
*
|
|
|
|
* Query string key abbreviations: intervals = i
|
|
|
|
* dateType = t
|
|
|
|
* timelineDate = d
|
|
|
|
*
|
|
|
|
* interval abbreviations: day = d | month = m | year = y | decade = e | century = c | millennium = i
|
|
|
|
* dateType abbreviations: date = d | dateAdded = da | dateModified = dm
|
|
|
|
* timelineDate format: shortMonthName.day.year (year is positive for A.D. and negative for B.C.)
|
|
|
|
*
|
|
|
|
* Defaults: intervals = month, year, decade
|
|
|
|
* dateType = date
|
|
|
|
* timelineDate = today's date
|
|
|
|
*/
|
|
|
|
var TimelineExtension = {
|
|
|
|
loadAsChrome: true,
|
|
|
|
|
|
|
|
newChannel: function (uri) {
|
|
|
|
return new AsyncChannel(uri, function* () {
|
2015-03-10 06:27:56 +00:00
|
|
|
var userLibraryID = Zotero.Libraries.userLibraryID;
|
|
|
|
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
path = uri.spec.match(/zotero:\/\/[^/]+(.*)/)[1];
|
|
|
|
if (!path) {
|
|
|
|
this.contentType = 'text/html';
|
|
|
|
return 'Invalid URL';
|
|
|
|
}
|
2007-10-23 07:11:59 +00:00
|
|
|
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
var params = {};
|
|
|
|
var router = new Zotero.Router(params);
|
|
|
|
|
|
|
|
// HTML
|
|
|
|
router.add('library/:scopeObject/:scopeObjectKey', function () {
|
2015-03-10 06:27:56 +00:00
|
|
|
params.libraryID = userLibraryID;
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
params.controller = 'html';
|
|
|
|
});
|
|
|
|
router.add('groups/:groupID/:scopeObject/:scopeObjectKey', function () {
|
|
|
|
params.controller = 'html';
|
|
|
|
});
|
|
|
|
router.add('library', function () {
|
2015-03-10 06:27:56 +00:00
|
|
|
params.libraryID = userLibraryID;
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
params.controller = 'html';
|
|
|
|
});
|
|
|
|
router.add('groups/:groupID', function () {
|
|
|
|
params.controller = 'html';
|
|
|
|
});
|
|
|
|
|
|
|
|
// Data
|
|
|
|
router.add('data/library/:scopeObject/:scopeObjectKey', function () {
|
2015-03-10 06:27:56 +00:00
|
|
|
params.libraryID = userLibraryID;
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
params.controller = 'data';
|
|
|
|
});
|
|
|
|
router.add('data/groups/:groupID/:scopeObject/:scopeObjectKey', function () {
|
|
|
|
params.controller = 'data';
|
|
|
|
});
|
|
|
|
router.add('data/library', function () {
|
2015-03-10 06:27:56 +00:00
|
|
|
params.libraryID = userLibraryID;
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
params.controller = 'data';
|
|
|
|
});
|
|
|
|
router.add('data/groups/:groupID', function () {
|
|
|
|
params.controller = 'data';
|
|
|
|
});
|
|
|
|
|
|
|
|
// Old-style HTML URLs
|
|
|
|
router.add('collection/:id', function () {
|
|
|
|
params.controller = 'html';
|
|
|
|
params.scopeObject = 'collections';
|
|
|
|
var lkh = Zotero.Collections.parseLibraryKeyHash(params.id);
|
|
|
|
if (lkh) {
|
|
|
|
params.libraryID = lkh.libraryID;
|
|
|
|
params.scopeObjectKey = lkh.key;
|
2007-10-23 07:11:59 +00:00
|
|
|
}
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
else {
|
|
|
|
params.scopeObjectID = params.id;
|
|
|
|
}
|
|
|
|
delete params.id;
|
|
|
|
});
|
|
|
|
router.add('search/:id', function () {
|
|
|
|
params.controller = 'html';
|
|
|
|
params.scopeObject = 'searches';
|
|
|
|
var lkh = Zotero.Searches.parseLibraryKeyHash(params.id);
|
|
|
|
if (lkh) {
|
|
|
|
params.libraryID = lkh.libraryID;
|
|
|
|
params.scopeObjectKey = lkh.key;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
params.scopeObjectID = params.id;
|
|
|
|
}
|
|
|
|
delete params.id;
|
|
|
|
});
|
|
|
|
router.add('/', function () {
|
|
|
|
params.controller = 'html';
|
2015-03-10 06:27:56 +00:00
|
|
|
params.libraryID = userLibraryID;
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
});
|
2007-10-23 07:11:59 +00:00
|
|
|
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
var parsed = router.run(path);
|
|
|
|
if (!parsed) {
|
|
|
|
this.contentType = 'text/html';
|
|
|
|
return "URL could not be parsed";
|
2009-12-05 20:16:42 +00:00
|
|
|
}
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
if (params.groupID) {
|
|
|
|
params.libraryID = Zotero.Groups.getLibraryIDFromGroupID(params.groupID);
|
2009-12-05 20:16:42 +00:00
|
|
|
}
|
|
|
|
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
var intervals = params.i ? params.i : '';
|
|
|
|
var timelineDate = params.d ? params.d : '';
|
|
|
|
var dateType = params.t ? params.t : '';
|
|
|
|
|
2009-12-05 20:16:42 +00:00
|
|
|
// Get the collection or search object
|
|
|
|
var collection, search;
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
switch (params.scopeObject) {
|
|
|
|
case 'collections':
|
|
|
|
if (params.scopeObjectKey) {
|
|
|
|
collection = yield Zotero.Collections.getByLibraryAndKeyAsync(
|
|
|
|
params.libraryID, params.scopeObjectKey
|
|
|
|
);
|
2009-12-05 20:16:42 +00:00
|
|
|
}
|
|
|
|
else {
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
collection = yield Zotero.Collections.getAsync(params.scopeObjectID);
|
2009-12-05 20:16:42 +00:00
|
|
|
}
|
|
|
|
if (!collection) {
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
this.contentType = 'text/html';
|
|
|
|
return 'Invalid collection ID or key';
|
2009-12-05 20:16:42 +00:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
case 'searches':
|
|
|
|
if (params.scopeObjectKey) {
|
|
|
|
var s = yield Zotero.Searches.getByLibraryAndKeyAsync(
|
|
|
|
params.libraryID, params.scopeObjectKey
|
|
|
|
);
|
2009-12-05 20:16:42 +00:00
|
|
|
}
|
|
|
|
else {
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
var s = yield Zotero.Searches.getAsync(params.scopeObjectID);
|
2009-12-05 20:16:42 +00:00
|
|
|
}
|
|
|
|
if (!s) {
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
return 'Invalid search ID or key';
|
2009-12-05 20:16:42 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// FIXME: Hack to exclude group libraries for now
|
|
|
|
var search = new Zotero.Search();
|
|
|
|
search.setScope(s);
|
2015-05-22 08:49:02 +00:00
|
|
|
var groups = Zotero.Groups.getAll();
|
2009-12-05 20:16:42 +00:00
|
|
|
for each(var group in groups) {
|
2015-04-16 18:02:36 +00:00
|
|
|
search.addCondition('libraryID', 'isNot', group.libraryID);
|
2009-12-05 20:16:42 +00:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
2007-10-23 07:11:59 +00:00
|
|
|
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
//
|
2009-12-05 20:16:42 +00:00
|
|
|
// Create XML file
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
//
|
|
|
|
if (params.controller == 'data') {
|
|
|
|
switch (params.scopeObject) {
|
|
|
|
case 'collections':
|
|
|
|
yield collection.loadChildItems();
|
2009-12-05 20:16:42 +00:00
|
|
|
var results = collection.getChildItems();
|
2007-10-23 07:11:59 +00:00
|
|
|
break;
|
2009-12-05 20:16:42 +00:00
|
|
|
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
case 'searches':
|
|
|
|
var ids = yield search.search();
|
|
|
|
var results = yield Zotero.Items.getAsync(ids);
|
2007-10-23 07:11:59 +00:00
|
|
|
break;
|
2009-12-05 20:16:42 +00:00
|
|
|
|
2007-10-23 07:11:59 +00:00
|
|
|
default:
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
if (params.scopeObject) {
|
|
|
|
return "Invalid scope object '" + params.scopeObject + "'";
|
|
|
|
}
|
|
|
|
|
|
|
|
let s = new Zotero.Search();
|
2015-04-16 18:02:36 +00:00
|
|
|
s.addCondition('libraryID', 'is', params.libraryID);
|
|
|
|
s.addCondition('noChildren', 'true');
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
var ids = yield s.search();
|
|
|
|
var results = yield Zotero.Items.getAsync(ids);
|
2007-10-23 07:11:59 +00:00
|
|
|
}
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
|
2007-10-23 07:11:59 +00:00
|
|
|
var items = [];
|
|
|
|
// Only include parent items
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
for (let i=0; i<results.length; i++) {
|
|
|
|
if (!results[i].parentItemID) {
|
2007-10-23 07:11:59 +00:00
|
|
|
items.push(results[i]);
|
|
|
|
}
|
|
|
|
}
|
2009-12-05 20:16:42 +00:00
|
|
|
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
var dateTypes = {
|
|
|
|
d: 'date',
|
|
|
|
da: 'dateAdded',
|
|
|
|
dm: 'dateModified'
|
|
|
|
};
|
2007-10-23 07:11:59 +00:00
|
|
|
|
|
|
|
//default dateType = date
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
if (!dateType || !dateTypes[dateType]) {
|
2007-10-23 07:11:59 +00:00
|
|
|
dateType = 'd';
|
|
|
|
}
|
2009-12-05 20:16:42 +00:00
|
|
|
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
this.contentType = 'application/xml';
|
|
|
|
return Zotero.Utilities.Internal.getAsyncInputStream(
|
|
|
|
Zotero.Timeline.generateXMLDetails(items, dateTypes[dateType])
|
|
|
|
);
|
2007-10-23 07:11:59 +00:00
|
|
|
}
|
|
|
|
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
//
|
|
|
|
// Generate main HTML page
|
|
|
|
//
|
|
|
|
content = Zotero.File.getContentsFromURL('chrome://zotero/skin/timeline/timeline.html');
|
|
|
|
this.contentType = 'text/html';
|
2009-12-05 20:16:42 +00:00
|
|
|
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
if(!timelineDate){
|
|
|
|
timelineDate=Date();
|
|
|
|
var dateParts=timelineDate.toString().split(' ');
|
|
|
|
timelineDate=dateParts[1]+'.'+dateParts[2]+'.'+dateParts[3];
|
|
|
|
}
|
|
|
|
Zotero.debug('=');
|
|
|
|
Zotero.debug(params.i);
|
|
|
|
Zotero.debug(intervals);
|
|
|
|
if (!intervals || intervals.length < 3) {
|
|
|
|
intervals += "mye".substr(intervals.length);
|
|
|
|
}
|
|
|
|
|
|
|
|
var theIntervals = {
|
|
|
|
d: 'Timeline.DateTime.DAY',
|
|
|
|
m: 'Timeline.DateTime.MONTH',
|
|
|
|
y: 'Timeline.DateTime.YEAR',
|
|
|
|
e: 'Timeline.DateTime.DECADE',
|
|
|
|
c: 'Timeline.DateTime.CENTURY',
|
|
|
|
i: 'Timeline.DateTime.MILLENNIUM'
|
|
|
|
};
|
|
|
|
|
|
|
|
//sets the intervals of the timeline bands
|
|
|
|
var tempStr = '<body onload="onLoad(';
|
|
|
|
var a = (theIntervals[intervals[0]]) ? theIntervals[intervals[0]] : 'Timeline.DateTime.MONTH';
|
|
|
|
var b = (theIntervals[intervals[1]]) ? theIntervals[intervals[1]] : 'Timeline.DateTime.YEAR';
|
|
|
|
var c = (theIntervals[intervals[2]]) ? theIntervals[intervals[2]] : 'Timeline.DateTime.DECADE';
|
|
|
|
content = content.replace(tempStr, tempStr + a + ',' + b + ',' + c + ',\'' + timelineDate + '\'');
|
|
|
|
|
|
|
|
tempStr = 'document.write("<title>';
|
|
|
|
if (params.scopeObject == 'collections') {
|
|
|
|
content = content.replace(tempStr, tempStr + collection.name + ' - ');
|
|
|
|
}
|
|
|
|
else if (params.scopeObject == 'searches') {
|
|
|
|
content = content.replace(tempStr, tempStr + search.name + ' - ');
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
content = content.replace(tempStr, tempStr + Zotero.getString('pane.collections.library') + ' - ');
|
|
|
|
}
|
|
|
|
|
|
|
|
tempStr = 'Timeline.loadXML("zotero://timeline/data/';
|
|
|
|
var d = '';
|
|
|
|
if (params.groupID) {
|
|
|
|
d += 'groups/' + params.groupID + '/';
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
d += 'library/';
|
|
|
|
}
|
|
|
|
if (params.scopeObject) {
|
|
|
|
d += params.scopeObject + "/" + params.scopeObjectKey;
|
|
|
|
}
|
|
|
|
if (dateType) {
|
|
|
|
d += '?t=' + dateType;
|
|
|
|
}
|
|
|
|
return content.replace(tempStr, tempStr + d);
|
|
|
|
});
|
2007-10-23 07:11:59 +00:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
Merged revisions 2989,2994,2996-2999,3001,3003-3004,3007,3010,3012,3015-3016,3026-3029,3036-3038,3040-3041,3046,3048,3050,3052,3054-3055,3057-3058,3066,3069-3073 from 1.0 branch via svnmerge
2008-07-22 05:45:32 +00:00
|
|
|
zotero://attachment/[id]/
|
2007-10-23 07:11:59 +00:00
|
|
|
*/
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
var AttachmentExtension = {
|
|
|
|
loadAsChrome: false,
|
Merged revisions 3080-3081,3084,3087-3088,3090,3092,3099-3103,3113-3114,3132,3134-3143,3145,3148-3151,3154-3159,3165,3174,3194,3234-3235,3239-3240,3244,3246-3254,3258-3262,3268,3270,3274,3279,3286-3288,3294-3295 from 1.0 branch via svnmerge
2008-09-01 01:54:00 +00:00
|
|
|
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
newChannel: function (uri) {
|
|
|
|
var self = this;
|
Merged revisions 2989,2994,2996-2999,3001,3003-3004,3007,3010,3012,3015-3016,3026-3029,3036-3038,3040-3041,3046,3048,3050,3052,3054-3055,3057-3058,3066,3069-3073 from 1.0 branch via svnmerge
2008-07-22 05:45:32 +00:00
|
|
|
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
return new AsyncChannel(uri, function* () {
|
|
|
|
try {
|
|
|
|
var errorMsg;
|
|
|
|
var [id, fileName] = uri.path.substr(1).split('/');
|
|
|
|
|
|
|
|
if (parseInt(id) != id) {
|
|
|
|
// Proxy annotation icons
|
|
|
|
if (id.match(/^annotation.*\.(png|html|css|gif)$/)) {
|
|
|
|
var chromeURL = 'chrome://zotero/skin/' + id;
|
|
|
|
var ios = Components.classes["@mozilla.org/network/io-service;1"].
|
|
|
|
getService(Components.interfaces.nsIIOService);
|
|
|
|
let uri = ios.newURI(chromeURL, null, null);
|
|
|
|
var chromeReg = Components.classes["@mozilla.org/chrome/chrome-registry;1"]
|
|
|
|
.getService(Components.interfaces.nsIChromeRegistry);
|
|
|
|
var fileURI = chromeReg.convertChromeURL(uri);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
return self._errorChannel("Attachment id not an integer");
|
|
|
|
}
|
Merged revisions 2989,2994,2996-2999,3001,3003-3004,3007,3010,3012,3015-3016,3026-3029,3036-3038,3040-3041,3046,3048,3050,3052,3054-3055,3057-3058,3066,3069-3073 from 1.0 branch via svnmerge
2008-07-22 05:45:32 +00:00
|
|
|
}
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
|
|
|
|
if (!fileURI) {
|
|
|
|
var item = yield Zotero.Items.getAsync(id);
|
|
|
|
if (!item) {
|
|
|
|
return self._errorChannel("Item not found");
|
|
|
|
}
|
|
|
|
var file = item.getFile();
|
|
|
|
if (!file) {
|
|
|
|
return self._errorChannel("File not found");
|
|
|
|
}
|
|
|
|
if (fileName) {
|
|
|
|
file = file.parent;
|
|
|
|
file.append(fileName);
|
|
|
|
if (!file.exists()) {
|
|
|
|
return self._errorChannel("File not found");
|
|
|
|
}
|
2008-09-01 06:09:56 +00:00
|
|
|
}
|
|
|
|
}
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
|
|
|
|
//set originalURI so that it seems like we're serving from zotero:// protocol
|
|
|
|
//this is necessary to allow url() links to work from within css files
|
|
|
|
//otherwise they try to link to files on the file:// protocol, which is not allowed
|
|
|
|
this.originalURI = uri;
|
|
|
|
|
|
|
|
return file;
|
Merged revisions 2989,2994,2996-2999,3001,3003-3004,3007,3010,3012,3015-3016,3026-3029,3036-3038,3040-3041,3046,3048,3050,3052,3054-3055,3057-3058,3066,3069-3073 from 1.0 branch via svnmerge
2008-07-22 05:45:32 +00:00
|
|
|
}
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
catch (e) {
|
|
|
|
Zotero.debug(e);
|
|
|
|
throw (e);
|
2008-09-01 06:09:56 +00:00
|
|
|
}
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
});
|
|
|
|
},
|
Merged revisions 2989,2994,2996-2999,3001,3003-3004,3007,3010,3012,3015-3016,3026-3029,3036-3038,3040-3041,3046,3048,3050,3052,3054-3055,3057-3058,3066,3069-3073 from 1.0 branch via svnmerge
2008-07-22 05:45:32 +00:00
|
|
|
|
|
|
|
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
_errorChannel: function (msg) {
|
|
|
|
this.status = Components.results.NS_ERROR_FAILURE;
|
|
|
|
this.contentType = 'text/plain';
|
|
|
|
return msg;
|
Merged revisions 2989,2994,2996-2999,3001,3003-3004,3007,3010,3012,3015-3016,3026-3029,3036-3038,3040-3041,3046,3048,3050,3052,3054-3055,3057-3058,3066,3069-3073 from 1.0 branch via svnmerge
2008-07-22 05:45:32 +00:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2007-10-23 07:11:59 +00:00
|
|
|
|
2009-12-05 20:16:42 +00:00
|
|
|
/**
|
|
|
|
* zotero://select/[type]/0_ABCD1234
|
|
|
|
* zotero://select/[type]/1234 (not consistent across synced machines)
|
|
|
|
*/
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
var SelectExtension = {
|
|
|
|
newChannel: function (uri) {
|
|
|
|
return new AsyncChannel(uri, function* () {
|
2015-03-10 06:27:56 +00:00
|
|
|
var userLibraryID = Zotero.Libraries.userLibraryID;
|
|
|
|
|
2014-09-23 05:11:41 +00:00
|
|
|
var path = uri.path;
|
|
|
|
if (!path) {
|
|
|
|
return 'Invalid URL';
|
|
|
|
}
|
|
|
|
// Strip leading '/'
|
|
|
|
path = path.substr(1);
|
|
|
|
var mimeType, content = '';
|
|
|
|
|
|
|
|
var params = {
|
|
|
|
objectType: 'item'
|
|
|
|
};
|
|
|
|
var router = new Zotero.Router(params);
|
|
|
|
|
|
|
|
// Item within a collection or search
|
|
|
|
router.add('library/:scopeObject/:scopeObjectKey/items/:objectKey', function () {
|
2015-03-10 06:27:56 +00:00
|
|
|
params.libraryID = userLibraryID;
|
2014-09-23 05:11:41 +00:00
|
|
|
});
|
|
|
|
router.add('groups/:groupID/:scopeObject/:scopeObjectKey/items/:objectKey');
|
|
|
|
|
|
|
|
// All items
|
|
|
|
router.add('library/items/:objectKey', function () {
|
2015-03-10 06:27:56 +00:00
|
|
|
params.libraryID = userLibraryID;
|
2014-09-23 05:11:41 +00:00
|
|
|
});
|
|
|
|
router.add('groups/:groupID/items/:objectKey');
|
|
|
|
|
|
|
|
// Old-style URLs
|
|
|
|
router.add('item/:id', function () {
|
|
|
|
var lkh = Zotero.Items.parseLibraryKeyHash(params.id);
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
if (lkh) {
|
2014-09-23 05:11:41 +00:00
|
|
|
params.libraryID = lkh.libraryID;
|
|
|
|
params.objectKey = lkh.key;
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
}
|
|
|
|
else {
|
2014-09-23 05:11:41 +00:00
|
|
|
params.objectID = params.id;
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
}
|
2014-09-23 05:11:41 +00:00
|
|
|
delete params.id;
|
|
|
|
});
|
|
|
|
router.run(path);
|
|
|
|
|
|
|
|
try {
|
|
|
|
Zotero.API.parseParams(params);
|
|
|
|
var results = yield Zotero.API.getResultsFromParams(params);
|
2009-12-05 20:16:42 +00:00
|
|
|
}
|
2014-09-23 05:11:41 +00:00
|
|
|
catch (e) {
|
|
|
|
Zotero.debug(e, 1);
|
|
|
|
return e.toString();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (!results.length) {
|
|
|
|
var msg = "Selected items not found";
|
|
|
|
Zotero.debug(msg, 2);
|
|
|
|
Components.utils.reportError(msg);
|
|
|
|
return;
|
2009-12-05 20:16:42 +00:00
|
|
|
}
|
2014-09-23 05:11:41 +00:00
|
|
|
|
|
|
|
var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
|
|
|
|
.getService(Components.interfaces.nsIWindowMediator);
|
|
|
|
var win = wm.getMostRecentWindow("navigator:browser");
|
|
|
|
|
|
|
|
// TODO: Currently only able to select one item
|
|
|
|
yield win.ZoteroPane.selectItem(results[0].id);
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
});
|
2007-10-23 07:11:59 +00:00
|
|
|
}
|
|
|
|
};
|
2009-07-27 11:12:42 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
zotero://fullscreen
|
|
|
|
*/
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
var FullscreenExtension = {
|
|
|
|
loadAsChrome: false,
|
2009-07-27 11:12:42 +00:00
|
|
|
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
newChannel: function (uri) {
|
|
|
|
return new AsyncChannel(uri, function* () {
|
|
|
|
try {
|
|
|
|
var window = Components.classes["@mozilla.org/embedcomp/window-watcher;1"]
|
|
|
|
.getService(Components.interfaces.nsIWindowWatcher)
|
|
|
|
.openWindow(null, 'chrome://zotero/content/standalone/standalone.xul', '',
|
|
|
|
'chrome,centerscreen,resizable', null);
|
|
|
|
}
|
|
|
|
catch (e) {
|
|
|
|
Zotero.debug(e, 1);
|
|
|
|
throw e;
|
|
|
|
}
|
|
|
|
});
|
2009-07-27 11:12:42 +00:00
|
|
|
}
|
|
|
|
};
|
2009-08-10 16:44:15 +00:00
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
zotero://debug/
|
|
|
|
*/
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
var DebugExtension = {
|
|
|
|
loadAsChrome: false,
|
2009-08-10 16:44:15 +00:00
|
|
|
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
newChannel: function () {
|
|
|
|
return new AsyncChannel(uri, function* () {
|
|
|
|
var ioService = Components.classes["@mozilla.org/network/io-service;1"]
|
|
|
|
.getService(Components.interfaces.nsIIOService);
|
2009-08-10 16:44:15 +00:00
|
|
|
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
try {
|
|
|
|
return Zotero.Debug.get();
|
|
|
|
}
|
|
|
|
catch (e) {
|
|
|
|
Zotero.debug(e, 1);
|
|
|
|
throw e;
|
|
|
|
}
|
|
|
|
});
|
2009-08-10 16:44:15 +00:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2010-09-23 04:14:19 +00:00
|
|
|
var ConnectorChannel = function(uri, data) {
|
|
|
|
var secMan = Components.classes["@mozilla.org/scriptsecuritymanager;1"]
|
|
|
|
.getService(Components.interfaces.nsIScriptSecurityManager);
|
|
|
|
var ioService = Components.classes["@mozilla.org/network/io-service;1"]
|
|
|
|
.getService(Components.interfaces.nsIIOService);
|
|
|
|
|
|
|
|
this.name = uri;
|
|
|
|
this.URI = ioService.newURI(uri, "UTF-8", null);
|
2012-11-11 22:14:05 +00:00
|
|
|
this.owner = (secMan.getCodebasePrincipal || secMan.getSimpleCodebasePrincipal)(this.URI);
|
2010-09-23 04:14:19 +00:00
|
|
|
this._isPending = true;
|
|
|
|
|
|
|
|
var converter = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"].
|
|
|
|
createInstance(Components.interfaces.nsIScriptableUnicodeConverter);
|
|
|
|
converter.charset = "UTF-8";
|
|
|
|
this._stream = converter.convertToInputStream(data);
|
|
|
|
this.contentLength = this._stream.available();
|
|
|
|
}
|
|
|
|
|
|
|
|
ConnectorChannel.prototype.contentCharset = "UTF-8";
|
|
|
|
ConnectorChannel.prototype.contentType = "text/html";
|
2011-08-12 18:10:53 +00:00
|
|
|
ConnectorChannel.prototype.notificationCallbacks = null;
|
2010-09-23 04:14:19 +00:00
|
|
|
ConnectorChannel.prototype.securityInfo = null;
|
|
|
|
ConnectorChannel.prototype.status = 0;
|
|
|
|
ConnectorChannel.prototype.loadGroup = null;
|
|
|
|
ConnectorChannel.prototype.loadFlags = 393216;
|
|
|
|
|
|
|
|
ConnectorChannel.prototype.__defineGetter__("originalURI", function() { return this.URI });
|
|
|
|
ConnectorChannel.prototype.__defineSetter__("originalURI", function() { });
|
|
|
|
|
|
|
|
ConnectorChannel.prototype.asyncOpen = function(streamListener, context) {
|
2011-08-12 18:10:53 +00:00
|
|
|
if(this.loadGroup) this.loadGroup.addRequest(this, null);
|
2010-09-23 04:14:19 +00:00
|
|
|
streamListener.onStartRequest(this, context);
|
|
|
|
streamListener.onDataAvailable(this, context, this._stream, 0, this.contentLength);
|
|
|
|
streamListener.onStopRequest(this, context, this.status);
|
|
|
|
this._isPending = false;
|
2011-08-12 18:10:53 +00:00
|
|
|
if(this.loadGroup) this.loadGroup.removeRequest(this, null, 0);
|
2010-09-23 04:14:19 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
ConnectorChannel.prototype.isPending = function() {
|
|
|
|
return this._isPending;
|
|
|
|
}
|
|
|
|
|
|
|
|
ConnectorChannel.prototype.cancel = function(status) {
|
|
|
|
this.status = status;
|
|
|
|
this._isPending = false;
|
|
|
|
if(this._stream) this._stream.close();
|
|
|
|
}
|
|
|
|
|
2011-08-12 18:10:53 +00:00
|
|
|
ConnectorChannel.prototype.suspend = function() {}
|
2010-09-23 04:14:19 +00:00
|
|
|
|
2011-08-12 18:10:53 +00:00
|
|
|
ConnectorChannel.prototype.resume = function() {}
|
2010-09-23 04:14:19 +00:00
|
|
|
|
|
|
|
ConnectorChannel.prototype.open = function() {
|
|
|
|
return this._stream;
|
|
|
|
}
|
|
|
|
|
|
|
|
ConnectorChannel.prototype.QueryInterface = function(iid) {
|
|
|
|
if (!iid.equals(Components.interfaces.nsIChannel) && !iid.equals(Components.interfaces.nsIRequest) &&
|
|
|
|
!iid.equals(Components.interfaces.nsISupports)) {
|
|
|
|
throw Components.results.NS_ERROR_NO_INTERFACE;
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* zotero://connector/
|
|
|
|
*
|
|
|
|
* URI spoofing for transferring page data across boundaries
|
|
|
|
*/
|
|
|
|
var ConnectorExtension = new function() {
|
|
|
|
this.loadAsChrome = false;
|
|
|
|
|
|
|
|
this.newChannel = function(uri) {
|
|
|
|
var ioService = Components.classes["@mozilla.org/network/io-service;1"]
|
|
|
|
.getService(Components.interfaces.nsIIOService);
|
|
|
|
var secMan = Components.classes["@mozilla.org/scriptsecuritymanager;1"]
|
|
|
|
.getService(Components.interfaces.nsIScriptSecurityManager);
|
|
|
|
var Zotero = Components.classes["@zotero.org/Zotero;1"]
|
|
|
|
.getService(Components.interfaces.nsISupports)
|
|
|
|
.wrappedJSObject;
|
|
|
|
|
|
|
|
try {
|
|
|
|
var originalURI = uri.path;
|
|
|
|
originalURI = decodeURIComponent(originalURI.substr(originalURI.indexOf("/")+1));
|
2011-06-14 00:36:21 +00:00
|
|
|
if(!Zotero.Server.Connector.Data[originalURI]) {
|
2010-09-23 04:14:19 +00:00
|
|
|
return null;
|
|
|
|
} else {
|
2011-06-14 00:36:21 +00:00
|
|
|
return new ConnectorChannel(originalURI, Zotero.Server.Connector.Data[originalURI]);
|
2010-09-23 04:14:19 +00:00
|
|
|
}
|
|
|
|
} catch(e) {
|
|
|
|
Zotero.debug(e);
|
|
|
|
throw e;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
this._extensions[ZOTERO_SCHEME + "://data"] = DataExtension;
|
|
|
|
this._extensions[ZOTERO_SCHEME + "://report"] = ReportExtension;
|
|
|
|
this._extensions[ZOTERO_SCHEME + "://timeline"] = TimelineExtension;
|
|
|
|
this._extensions[ZOTERO_SCHEME + "://attachment"] = AttachmentExtension;
|
|
|
|
this._extensions[ZOTERO_SCHEME + "://select"] = SelectExtension;
|
|
|
|
this._extensions[ZOTERO_SCHEME + "://fullscreen"] = FullscreenExtension;
|
|
|
|
this._extensions[ZOTERO_SCHEME + "://debug"] = DebugExtension;
|
|
|
|
this._extensions[ZOTERO_SCHEME + "://connector"] = ConnectorExtension;
|
2007-10-23 07:11:59 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Implements nsIProtocolHandler
|
|
|
|
*/
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
ZoteroProtocolHandler.prototype = {
|
2007-10-23 07:11:59 +00:00
|
|
|
scheme: ZOTERO_SCHEME,
|
|
|
|
|
|
|
|
defaultPort : -1,
|
|
|
|
|
Merged revisions 3080-3081,3084,3087-3088,3090,3092,3099-3103,3113-3114,3132,3134-3143,3145,3148-3151,3154-3159,3165,3174,3194,3234-3235,3239-3240,3244,3246-3254,3258-3262,3268,3270,3274,3279,3286-3288,3294-3295 from 1.0 branch via svnmerge
2008-09-01 01:54:00 +00:00
|
|
|
protocolFlags :
|
|
|
|
Components.interfaces.nsIProtocolHandler.URI_NORELATIVE |
|
|
|
|
Components.interfaces.nsIProtocolHandler.URI_NOAUTH |
|
2008-11-30 20:18:48 +00:00
|
|
|
// DEBUG: This should be URI_IS_LOCAL_FILE, and MUST be if any
|
|
|
|
// extensions that modify data are added
|
|
|
|
// - https://www.zotero.org/trac/ticket/1156
|
|
|
|
//
|
2011-03-05 04:10:29 +00:00
|
|
|
Components.interfaces.nsIProtocolHandler.URI_IS_LOCAL_FILE,
|
|
|
|
//Components.interfaces.nsIProtocolHandler.URI_LOADABLE_BY_ANYONE,
|
Merged revisions 3080-3081,3084,3087-3088,3090,3092,3099-3103,3113-3114,3132,3134-3143,3145,3148-3151,3154-3159,3165,3174,3194,3234-3235,3239-3240,3244,3246-3254,3258-3262,3268,3270,3274,3279,3286-3288,3294-3295 from 1.0 branch via svnmerge
2008-09-01 01:54:00 +00:00
|
|
|
|
2007-10-23 07:11:59 +00:00
|
|
|
allowPort : function(port, scheme) {
|
|
|
|
return false;
|
|
|
|
},
|
|
|
|
|
|
|
|
newURI : function(spec, charset, baseURI) {
|
|
|
|
var newURL = Components.classes["@mozilla.org/network/standard-url;1"]
|
|
|
|
.createInstance(Components.interfaces.nsIStandardURL);
|
|
|
|
newURL.init(1, -1, spec, charset, baseURI);
|
|
|
|
return newURL.QueryInterface(Components.interfaces.nsIURI);
|
|
|
|
},
|
|
|
|
|
|
|
|
newChannel : function(uri) {
|
|
|
|
var ioService = Components.classes["@mozilla.org/network/io-service;1"]
|
|
|
|
.getService(Components.interfaces.nsIIOService);
|
|
|
|
|
|
|
|
var chromeService = Components.classes["@mozilla.org/network/protocol;1?name=chrome"]
|
|
|
|
.getService(Components.interfaces.nsIProtocolHandler);
|
|
|
|
|
|
|
|
var newChannel = null;
|
|
|
|
|
|
|
|
try {
|
|
|
|
var uriString = uri.spec.toLowerCase();
|
|
|
|
|
Merged revisions 3080-3081,3084,3087-3088,3090,3092,3099-3103,3113-3114,3132,3134-3143,3145,3148-3151,3154-3159,3165,3174,3194,3234-3235,3239-3240,3244,3246-3254,3258-3262,3268,3270,3274,3279,3286-3288,3294-3295 from 1.0 branch via svnmerge
2008-09-01 01:54:00 +00:00
|
|
|
for (var extSpec in this._extensions) {
|
2007-10-23 07:11:59 +00:00
|
|
|
var ext = this._extensions[extSpec];
|
|
|
|
|
|
|
|
if (uriString.indexOf(extSpec) == 0) {
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
if (!this._principal) {
|
|
|
|
if (ext.loadAsChrome) {
|
|
|
|
var chromeURI = chromeService.newURI(DUMMY_CHROME_URL, null, null);
|
|
|
|
var chromeChannel = chromeService.newChannel(chromeURI);
|
|
|
|
|
|
|
|
// Cache System Principal from chrome request
|
|
|
|
// so proxied pages load with chrome privileges
|
|
|
|
this._principal = chromeChannel.owner;
|
|
|
|
|
|
|
|
var chromeRequest = chromeChannel.QueryInterface(Components.interfaces.nsIRequest);
|
|
|
|
chromeRequest.cancel(0x804b0002); // BINDING_ABORTED
|
|
|
|
}
|
2007-10-23 07:11:59 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
var extChannel = ext.newChannel(uri);
|
|
|
|
// Extension returned null, so cancel request
|
|
|
|
if (!extChannel) {
|
|
|
|
var chromeURI = chromeService.newURI(DUMMY_CHROME_URL, null, null);
|
|
|
|
var extChannel = chromeService.newChannel(chromeURI);
|
|
|
|
var chromeRequest = extChannel.QueryInterface(Components.interfaces.nsIRequest);
|
|
|
|
chromeRequest.cancel(0x804b0002); // BINDING_ABORTED
|
|
|
|
}
|
|
|
|
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
// Apply cached principal to extension channel
|
|
|
|
if (this._principal) {
|
|
|
|
extChannel.owner = this._principal;
|
2007-10-23 07:11:59 +00:00
|
|
|
}
|
|
|
|
|
2010-07-06 09:02:35 +00:00
|
|
|
if(!extChannel.originalURI) extChannel.originalURI = uri;
|
2007-10-23 07:11:59 +00:00
|
|
|
|
|
|
|
return extChannel;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
// pass request through to ZoteroProtocolHandler::newChannel
|
2007-10-23 07:11:59 +00:00
|
|
|
if (uriString.indexOf("chrome") != 0) {
|
|
|
|
uriString = uri.spec;
|
|
|
|
uriString = "chrome" + uriString.substring(uriString.indexOf(":"));
|
|
|
|
uri = chromeService.newURI(uriString, null, null);
|
|
|
|
}
|
|
|
|
|
|
|
|
newChannel = chromeService.newChannel(uri);
|
|
|
|
}
|
|
|
|
catch (e) {
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
Components.utils.reportError(e);
|
|
|
|
Zotero.debug(e, 1);
|
2007-10-23 07:11:59 +00:00
|
|
|
throw Components.results.NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
|
|
|
|
return newChannel;
|
|
|
|
},
|
|
|
|
|
2010-07-06 09:02:35 +00:00
|
|
|
contractID: ZOTERO_PROTOCOL_CONTRACTID,
|
|
|
|
classDescription: ZOTERO_PROTOCOL_NAME,
|
|
|
|
classID: ZOTERO_PROTOCOL_CID,
|
|
|
|
QueryInterface: XPCOMUtils.generateQI([Components.interfaces.nsISupports,
|
|
|
|
Components.interfaces.nsIProtocolHandler])
|
2007-10-23 07:11:59 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
|
2010-07-06 09:02:35 +00:00
|
|
|
/**
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
* nsIChannel implementation that takes a promise-yielding generator that returns a
|
|
|
|
* string, nsIAsyncInputStream, or file
|
|
|
|
*/
|
|
|
|
function AsyncChannel(uri, gen) {
|
|
|
|
this._generator = gen;
|
|
|
|
this._isPending = true;
|
|
|
|
|
|
|
|
// nsIRequest
|
|
|
|
this.name = uri;
|
|
|
|
this.loadFlags = 0;
|
|
|
|
this.loadGroup = null;
|
|
|
|
this.status = 0;
|
|
|
|
|
|
|
|
// nsIChannel
|
|
|
|
this.contentLength = -1;
|
|
|
|
this.contentType = "text/html";
|
|
|
|
this.contentCharset = "utf-8";
|
|
|
|
this.URI = uri;
|
|
|
|
this.originalURI = uri;
|
|
|
|
this.owner = null;
|
|
|
|
this.notificationCallbacks = null;
|
|
|
|
this.securityInfo = null;
|
|
|
|
}
|
|
|
|
|
|
|
|
AsyncChannel.prototype = {
|
|
|
|
asyncOpen: function (streamListener, context) {
|
|
|
|
if (this.loadGroup) this.loadGroup.addRequest(this, null);
|
|
|
|
|
|
|
|
var channel = this;
|
|
|
|
|
|
|
|
var resolve;
|
|
|
|
var reject;
|
|
|
|
var promise = new Zotero.Promise(function () {
|
|
|
|
resolve = arguments[0];
|
|
|
|
reject = arguments[1];
|
|
|
|
});
|
|
|
|
|
|
|
|
var listenerWrapper = {
|
|
|
|
onStartRequest: function (request, context) {
|
|
|
|
Zotero.debug("Starting request");
|
|
|
|
streamListener.onStartRequest(channel, context);
|
|
|
|
},
|
|
|
|
onDataAvailable: function (request, context, inputStream, offset, count) {
|
|
|
|
//Zotero.debug("onDataAvailable");
|
|
|
|
streamListener.onDataAvailable(channel, context, inputStream, offset, count);
|
|
|
|
},
|
|
|
|
onStopRequest: function (request, context, status) {
|
|
|
|
Zotero.debug("Stopping request");
|
|
|
|
streamListener.onStopRequest(channel, context, status);
|
|
|
|
channel._isPending = false;
|
|
|
|
if (status == 0) {
|
|
|
|
resolve();
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
reject(new Error("AsyncChannel request failed with status " + status));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
Zotero.debug("AsyncChannel's asyncOpen called");
|
|
|
|
var t = new Date;
|
|
|
|
|
|
|
|
// Proxy requests to other zotero:// URIs
|
|
|
|
let uri2 = this.URI.clone();
|
|
|
|
if (uri2.path.startsWith('/proxy/')) {
|
|
|
|
let re = new RegExp(uri2.scheme + '://' + uri2.host + '/proxy/([^/]+)(.*)');
|
|
|
|
let matches = uri2.spec.match(re);
|
|
|
|
uri2.spec = uri2.scheme + '://' + matches[1] + '/' + (matches[2] ? matches[2] : '');
|
|
|
|
var data = Zotero.File.getContentsFromURL(uri2.spec);
|
|
|
|
}
|
|
|
|
Zotero.Promise.try(function () {
|
|
|
|
return data ? data : Zotero.spawn(channel._generator, channel);
|
|
|
|
})
|
|
|
|
.then(function (data) {
|
|
|
|
if (typeof data == 'string') {
|
|
|
|
Zotero.debug("AsyncChannel: Got string from generator");
|
|
|
|
|
|
|
|
listenerWrapper.onStartRequest(this, context);
|
|
|
|
|
|
|
|
let converter = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"]
|
|
|
|
.createInstance(Components.interfaces.nsIScriptableUnicodeConverter);
|
|
|
|
converter.charset = "UTF-8";
|
|
|
|
let inputStream = converter.convertToInputStream(data);
|
|
|
|
listenerWrapper.onDataAvailable(this, context, inputStream, 0, data.length);
|
|
|
|
|
|
|
|
listenerWrapper.onStopRequest(this, context, this.status);
|
|
|
|
return promise;
|
|
|
|
}
|
|
|
|
// If an async input stream is given, pass the data asynchronously to the stream listener
|
|
|
|
else if (data instanceof Ci.nsIAsyncInputStream) {
|
|
|
|
Zotero.debug("AsyncChannel: Got input stream from generator");
|
|
|
|
|
|
|
|
var pump = Cc["@mozilla.org/network/input-stream-pump;1"].createInstance(Ci.nsIInputStreamPump);
|
|
|
|
pump.init(data, -1, -1, 0, 0, true);
|
|
|
|
pump.asyncRead(listenerWrapper, context);
|
|
|
|
return promise;
|
|
|
|
}
|
|
|
|
else if (data instanceof Ci.nsIFile || data instanceof Ci.nsIURI) {
|
|
|
|
if (data instanceof Ci.nsIFile) {
|
|
|
|
Zotero.debug("AsyncChannel: Got file from generator");
|
|
|
|
data = ioService.newFileURI(data);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
Zotero.debug("AsyncChannel: Got URI from generator");
|
|
|
|
}
|
|
|
|
|
|
|
|
let uri = data;
|
|
|
|
uri.QueryInterface(Ci.nsIURL);
|
|
|
|
this.contentType = Zotero.MIME.getMIMETypeFromExtension(uri.fileExtension);
|
|
|
|
|
|
|
|
Components.utils.import("resource://gre/modules/NetUtil.jsm");
|
|
|
|
NetUtil.asyncFetch(data, function (inputStream, status) {
|
|
|
|
if (!Components.isSuccessCode(status)) {
|
|
|
|
reject();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
listenerWrapper.onStartRequest(channel, context);
|
|
|
|
try {
|
|
|
|
listenerWrapper.onDataAvailable(channel, context, inputStream, 0, inputStream.available());
|
|
|
|
}
|
|
|
|
catch (e) {
|
|
|
|
reject(e);
|
|
|
|
}
|
|
|
|
listenerWrapper.onStopRequest(channel, context, status);
|
|
|
|
});
|
|
|
|
return promise;
|
|
|
|
}
|
2014-09-23 05:11:41 +00:00
|
|
|
else if (data === undefined) {
|
|
|
|
this.cancel(0x804b0002); // BINDING_ABORTED
|
|
|
|
}
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
else {
|
|
|
|
throw new Error("Invalid return type (" + typeof data + ") from generator passed to AsyncChannel");
|
|
|
|
}
|
|
|
|
}.bind(this))
|
|
|
|
.then(function () {
|
2014-09-23 05:11:41 +00:00
|
|
|
if (this._isPending) {
|
|
|
|
Zotero.debug("AsyncChannel request succeeded in " + (new Date - t) + " ms");
|
|
|
|
channel._isPending = false;
|
|
|
|
}
|
Update zotero:// extensions (report, timeline, etc.) for async DB, and more
- Protocol handler extensions can now handle promises and can also make
data available as it's ready instead of all at once (e.g., reports now
output one entry at a time)
- zotero:// URL syntaxes are now more consistent and closer to the web
API (old URLs should work, but some may currently be broken)
Also:
- Code to generate server API, currently available for testing via
zotero://data URLs but eventually moving to HTTP -- zotero://data URLs match
web API URLs, with a different prefix for the personal library (/library vs.
/users/12345)
- Miscellaneous fixes to data objects
Under the hood:
- Extensions now return an AsyncChannel, which is an nsIChannel implementation
that takes a promise-yielding generator that returns a string,
nsIAsyncInputStream, or file that will be used for the channel's data
- New function Zotero.Utilities.Internal.getAsyncInputStream() takes a
generator that yields either promises or strings and returns an async input
stream filled with the yielded strings
- Zotero.Router parsers URLs and extract parameters
- Zotero.Item.toResponseJSON()
2014-09-08 20:51:05 +00:00
|
|
|
})
|
|
|
|
.catch(function (e) {
|
|
|
|
Zotero.debug(e, 1);
|
|
|
|
if (channel._isPending) {
|
|
|
|
streamListener.onStopRequest(channel, context, Components.results.NS_ERROR_FAILURE);
|
|
|
|
channel._isPending = false;
|
|
|
|
}
|
|
|
|
throw e;
|
|
|
|
})
|
|
|
|
.finally(function () {
|
|
|
|
if (channel.loadGroup) channel.loadGroup.removeRequest(channel, null, 0);
|
|
|
|
});
|
|
|
|
},
|
|
|
|
|
|
|
|
// nsIRequest
|
|
|
|
isPending: function () {
|
|
|
|
return this._isPending;
|
|
|
|
},
|
|
|
|
|
|
|
|
cancel: function (status) {
|
|
|
|
Zotero.debug("Cancelling");
|
|
|
|
this.status = status;
|
|
|
|
this._isPending = false;
|
|
|
|
},
|
|
|
|
|
|
|
|
resume: function () {
|
|
|
|
Zotero.debug("Resuming");
|
|
|
|
},
|
|
|
|
|
|
|
|
suspend: function () {
|
|
|
|
Zotero.debug("Suspending");
|
|
|
|
},
|
|
|
|
|
|
|
|
// nsIWritablePropertyBag
|
|
|
|
setProperty: function (prop, val) {
|
|
|
|
this[prop] = val;
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
deleteProperty: function (prop) {
|
|
|
|
delete this[prop];
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
QueryInterface: function (iid) {
|
|
|
|
if (iid.equals(Components.interfaces.nsISupports)
|
|
|
|
|| iid.equals(Components.interfaces.nsIRequest)
|
|
|
|
|| iid.equals(Components.interfaces.nsIChannel)
|
|
|
|
// pdf.js wants this
|
|
|
|
|| iid.equals(Components.interfaces.nsIWritablePropertyBag)) {
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
throw Components.results.NS_ERROR_NO_INTERFACE;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
var NSGetFactory = XPCOMUtils.generateNSGetFactory([ZoteroProtocolHandler]);
|