为了纪念自杀身亡的Aaron Swartz,ArchiveTeam发布了Aaron Swartz Memorial JSTOR Liberator,
这是一个基于JavaScript的书签工具,目的是让互联网用户“解救”已属于公有领域的JSTOR论文。
用户在浏览器上运行工具访问JSTOR它就会在上面下载一篇公有领域论文然后上传到ArchiveTeam,以此抗议JSTOR的限制政策。
STOR的服务条款禁止使用聚合软件下载和传播论文,ArchiveTeam的开发者认为,JSTOR没有权力对公有论文施加额外的限制。在Swartz去世之后,美国司法部宣布放弃针对他的指控,电子前哨基金会则呼吁修改过于严厉的计算机犯罪法律。
http://aaronsw.archiveteam.org/
<a href="javascript:(function(){var s=document.createElement('script');s.type='text/javascript';s.src='http://aaronsw.archiveteam.org/js';document.getElementsByTagName('head')[0].appendChild(s);})();" title="JSTOR liberator" id="bookmarklet">JSTOR liberator</a>
s.src='http://aaronsw.archiveteam.org/js'如下:
/** * * Base64 encode / decode * http://www.webtoolkit.info/ * **/ var Base64 = { // private property _keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", // public method for encoding encode : function (byteArray) { var output = ""; var chr1, chr2, chr3, enc1, enc2, enc3, enc4; var i = 0; // input = Base64._utf8_encode(input); // var byteArray = new Uint8Array(input); while (i < byteArray.byteLength) { chr1 = byteArray[i++]; chr2 = byteArray[i++]; chr3 = byteArray[i++]; enc1 = chr1 >> 2; enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); enc4 = chr3 & 63; if (isNaN(chr2)) { enc3 = enc4 = 64; } else if (isNaN(chr3)) { enc4 = 64; } output = output + this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) + this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4); } return output; }, // public method for decoding decode : function (input) { var output = ""; var chr1, chr2, chr3; var enc1, enc2, enc3, enc4; var i = 0; input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ""); while (i < input.length) { enc1 = this._keyStr.indexOf(input.charAt(i++)); enc2 = this._keyStr.indexOf(input.charAt(i++)); enc3 = this._keyStr.indexOf(input.charAt(i++)); enc4 = this._keyStr.indexOf(input.charAt(i++)); chr1 = (enc1 << 2) | (enc2 >> 4); chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); chr3 = ((enc3 & 3) << 6) | enc4; output = output + String.fromCharCode(chr1); if (enc3 != 64) { output = output + String.fromCharCode(chr2); } if (enc4 != 64) { output = output + String.fromCharCode(chr3); } } output = Base64._utf8_decode(output); return output; }, // private method for UTF-8 encoding _utf8_encode : function (string) { string = string.replace(/\r\n/g,"\n"); var utftext = ""; for (var n = 0; n < string.length; n++) { var c = string.charCodeAt(n); if (c < 128) { utftext += String.fromCharCode(c); } else if((c > 127) && (c < 2048)) { utftext += String.fromCharCode((c >> 6) | 192); utftext += String.fromCharCode((c & 63) | 128); } else { utftext += String.fromCharCode((c >> 12) | 224); utftext += String.fromCharCode(((c >> 6) & 63) | 128); utftext += String.fromCharCode((c & 63) | 128); } } return utftext; }, // private method for UTF-8 decoding _utf8_decode : function (utftext) { var string = ""; var i = 0; var c = c1 = c2 = 0; while ( i < utftext.length ) { c = utftext.charCodeAt(i); if (c < 128) { string += String.fromCharCode(c); i++; } else if((c > 191) && (c < 224)) { c2 = utftext.charCodeAt(i+1); string += String.fromCharCode(((c & 31) << 6) | (c2 & 63)); i += 2; } else { c2 = utftext.charCodeAt(i+1); c3 = utftext.charCodeAt(i+2); string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); i += 3; } } return string; } } // www.quirksmode.org function sendRequest(url,callback,postData,progressCallback) { var req = createXMLHTTPObject(); if (!req) return; var method = (postData) ? "POST" : "GET"; req.open(method,url,true); req.responseType = 'arraybuffer'; if (progressCallback) req.addEventListener('progress', progressCallback); if (postData) req.setRequestHeader('Content-type','application/x-www-form-urlencoded'); req.onreadystatechange = function () { if (req.readyState != 4) return; if (req.status != 200 && req.status != 304) { // alert('HTTP error ' + req.status); return; } callback(req); } if (req.readyState == 4) return; req.send(postData); return req; } var XMLHttpFactories = [ function () {return new XMLHttpRequest()}, function () {return new ActiveXObject("Msxml2.XMLHTTP")}, function () {return new ActiveXObject("Msxml3.XMLHTTP")}, function () {return new ActiveXObject("Microsoft.XMLHTTP")} ]; function createXMLHTTPObject() { var xmlhttp = false; for (var i=0;i<XMLHttpFactories.length;i++) { try { xmlhttp = XMLHttpFactories[i](); } catch (e) { continue; } break; } return xmlhttp; } function createCookie(name,value,days) { if (days) { var date = new Date(); date.setTime(date.getTime()+(days*24*60*60*1000)); var expires = "; expires="+date.toGMTString(); } else var expires = ""; document.cookie = name+"="+value+expires+"; path=/"; } function readCookie(name) { var nameEQ = name + "="; var ca = document.cookie.split(';'); for(var i=0;i < ca.length;i++) { var c = ca[i]; while (c.charAt(0)==' ') c = c.substring(1,c.length); if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length); } return null; } function eraseCookie(name) { createCookie(name,"",-1); } var jstorLib_progress = (function() { var p = { init: function() { var div = window.frames.jstorLib_bottom.document.createElement('div'); div.id = 'jstorLib_progress'; window.frames.jstorLib_bottom.document.body.appendChild(div); var cssLink = window.frames.jstorLib_bottom.document.createElement('link'); cssLink.setAttribute('rel', 'stylesheet'); cssLink.setAttribute('type', 'text/css'); cssLink.setAttribute('href', 'http://aaronsw.archiveteam.org/jstor_style.css'); window.frames.jstorLib_bottom.document.getElementsByTagName('head')[0].appendChild(cssLink); }, reset: function() { var div = window.frames.jstorLib_bottom.document.getElementById('jstorLib_progress'); if (div) { $(div).empty(); div.className = ''; } }, show: function() { var div = window.frames.jstorLib_bottom.document.getElementById('jstorLib_progress'); if (div && div.className != 'visible') { div.className = 'visible'; } }, hide: function() { var div = window.frames.jstorLib_bottom.document.getElementById('jstorLib_progress'); if (div && div.className == 'visible') { div.className = ''; } }, updateProgress: function(itemId, complete, message) { jstorLib_progress.show(); var statusSpan = window.frames.jstorLib_bottom.document.getElementById('jstorLib_progress_status_' + itemId); var msgSpan = window.frames.jstorLib_bottom.document.getElementById('jstorLib_progress_msg_' + itemId); if (!msgSpan) { var div = window.frames.jstorLib_bottom.document.getElementById('jstorLib_progress'); if (!div) return; var ul = div.lastChild; if (ul && ul.nodeName!='UL') ul = null; if (!ul) { ul = window.frames.jstorLib_bottom.document.createElement('ul'); div.appendChild(ul); } var li = window.frames.jstorLib_bottom.document.createElement('li'); statusSpan = window.frames.jstorLib_bottom.document.createElement('span'); statusSpan.id = 'jstorLib_progress_status_' + itemId; statusSpan.className = 'status'; li.appendChild(statusSpan); msgSpan = window.frames.jstorLib_bottom.document.createElement('span'); msgSpan.id = 'jstorLib_progress_msg_' + itemId; li.appendChild(msgSpan); ul.appendChild(li); } statusSpan.className = complete ? 'status status-complete' : 'status'; statusSpan.innerHTML = complete ? '?' : ''; msgSpan.innerHTML = message; }, addUploadForm: function(onsubmit_handler) { var doc = window.frames.jstorLib_bottom.document; var div = doc.getElementById('jstorLib_progress'); if (div) { var form = doc.createElement('form'); form.method = 'post'; form.action = '#'; var p = doc.createElement('p'); form.appendChild(p); p.appendChild(doc.createTextNode('Add this document to the Aaron Swartz memorial:')); p.appendChild(doc.createElement('br')); var textarea = doc.createElement('textarea'); textarea.name = 'your_message'; textarea.rows = 5; textarea.cols = 30; textarea.id = 'f-memorial-message'; // textarea.placeholder = 'Your memorial message'; textarea.value = ' '; p.appendChild(textarea); var input = doc.createElement('input'); input.type = 'text'; input.name = 'your_name'; input.id = 'f-memorial-name'; input.placeholder = 'Your name or nickname'; input.value = 'Anonymous'; p.appendChild(input); p.appendChild(doc.createElement('br')); var submit = doc.createElement('input'); submit.type = 'submit'; submit.value = 'Upload to the memorial'; p.appendChild(submit); form.id = 'memorial-upload-form'; form.onsubmit = onsubmit_handler; div.appendChild(form); } }, removeUploadForm: function() { var doc = window.frames.jstorLib_bottom.document; var form = doc.getElementById('memorial-upload-form'); if (form) { form.parentNode.removeChild(form); } }, addParagraph: function(id, text) { var div = window.frames.jstorLib_bottom.document.getElementById('jstorLib_progress'); if (div) { var p = window.frames.jstorLib_bottom.document.createElement('p'); p.id = 'jstorLib_progress_para_' + id; p.innerHTML = text; div.appendChild(p); } }, removeParagraph: function(id) { var p = window.frames.jstorLib_bottom.document.getElementById('jstorLib_progress_para_' + id); if (p) { p.parentNode.removeChild(p); } } }; return p; })(); var jstorLib = (function() { var o = { incrementUploadCounter: function() { var newCount = jstorLib.getUploadCounter() + 1; createCookie('jstorLib_count', newCount, 10); return newCount; }, getUploadCounter: function() { var c = readCookie('jstorLib_count'); if (c) { return c * 1; } else { return 0; } }, buildForm: function() { var form = document.createElement('form'); form.method = 'POST'; form.action = 'http://aaronsw.archiveteam.org/data'; form.target = 'jstorLib_upload'; var input; var fields = [ 'title', 'item', 'url', 'data', 'meta', 'bibtex', 'memorial_message', 'memorial_name' ]; for (var i=0; i<fields.length; i++) { input = document.createElement('input'); input.name = fields[i]; input.type = 'hidden'; form.appendChild(input); } document.body.appendChild(form); return form; }, form: function() { if (!jstorLib._form) { jstorLib._form = jstorLib.buildForm(); } return jstorLib._form; }, receiveMessage: function(evt) { // the upload frame sends us a message var count = jstorLib.incrementUploadCounter(); count = (count==1) ? 'one document' : (count+' documents'); jstorLib_progress.updateProgress('upload', true, 'Upload complete'); jstorLib_progress.addParagraph('thanks', 'Thanks!'); // You\'ve liberated <strong>'+count+'</strong> so far.'); // var form = jstorLib.form(); // jstorLib_progress.addParagraph('message',"Message: "+form.memorial_message.value); // jstorLib_progress.addParagraph('message',"Name: "+form.memorial_name.value); }, submitData: function() { jstorLib_progress.updateProgress('upload', false, 'Uploading...'); var form = jstorLib.form(); form.submit(); }, reallyOpenPDF: function(view, href) { view.location.href = href; // if Firefox does not show the PDF inline, it will not // close the popup window view.setTimeout(function() { view.close(); }, 1000); }, askForMessage: function() { jstorLib_progress.addUploadForm(function(evt) { var doc = window.frames.jstorLib_bottom.document; var memorialMessage = doc.getElementById('f-memorial-message').value; var memorialName = doc.getElementById('f-memorial-name').value; var form = jstorLib.form(); form.memorial_message.value = memorialMessage; form.memorial_name.value = memorialName; jstorLib_progress.removeUploadForm(); jstorLib.submitData(); return false; }); }, processResponse: function(req) { var byteArray = new Uint8Array(req.response); var kilobytes = Math.round(byteArray.byteLength / 1024); jstorLib_progress.updateProgress('download', true, 'Download complete ('+kilobytes+' kB)'); if (req.view && req.view.location) { jstorLib.reallyOpenPDF(req.view, req.href); } var form = jstorLib.form(); form.url.value = req.hrefDoc; form.data.value = Base64.encode(byteArray); var viewCitation = window.frames.jstorLib_bottom.document.getElementById('viewCitation'); if (viewCitation && viewCitation.href) { var m = viewCitation.href.match(/doi=(.+)/); if (m) { jstorLib.loadBibtex(m[1]); return; } } // if not bibtex... jstorLib.askForMessage(); }, downloadProgress: function(evt) { var kilobytes = Math.round(evt.loaded / 1024); jstorLib_progress.updateProgress('download', false, 'Downloading PDF ('+kilobytes+' kB)...'); }, openPDF: function(href, liberateOnly) { var hrefDoc = href.replace(/\?acceptTC=true/, ''); jstorLib.showStatus(''); jstorLib_progress.reset(); jstorLib_progress.updateProgress('download', false, 'Requesting PDF...'); var xhr = sendRequest(href, jstorLib.processResponse, null, jstorLib.downloadProgress); xhr.href = href; xhr.hrefDoc = hrefDoc; if (!liberateOnly) { xhr.view = window.open('','_blank','width=750,height=550,top=100,left=100,resizable=1,toolbar=1,location=1,menubar=1,scrollbars=1'); var tmp = xhr.view.document tmp.write('<html><head><title>Loading PDF...</title><style type="text/css">body{background:#000;color:#fff;font-family:Arial,Helvetica,sans-serif;font-size:18px}</style></head><body><p>Loading PDF...</p></body></html>'); tmp.close(); } else { xhr.view = null; } return false; }, askForNextItem: function() { var targetWindow = top; if (window.frames.jstorLib_bottom) { targetWindow = window.frames.jstorLib_bottom; } var targetDoc = targetWindow.document; var s = targetDoc.createElement('script'); s.src = 'http://aaronsw.archiveteam.org/next-item?r='+Math.random(); s.type = 'application/javascript'; targetDoc.body.appendChild(s); targetWindow.jstorLib = jstorLib; jstorLib.showStatus('Looking for another unliberated item...'); jstorLib_progress.updateProgress('ask-for-next-item', false, 'Asking for next item...'); }, nextItem: function(itemId, title) { jstorLib_progress.updateProgress('ask-for-next-item', true, 'Asking for next item...'); jstorLib_progress.addParagraph('loading-title', 'Loading "'+title+'"...'); window.frames.jstorLib_bottom.location.href = 'http://www.jstor.org/stable/info/' + itemId; jstorLib.showStatus('Loading "'+title+'"...'); }, processBibtex: function(data) { jstorLib.form().bibtex.value = data; jstorLib_progress.updateProgress('download-meta', true, 'Metadata complete'); jstorLib.askForMessage(); }, loadBibtex: function(encodedDoi) { $.ajax({ url: 'http://www.jstor.org/action/downloadSingleCitation?userAction=export&include=abs&singleCitation=true&redirectURI=%2Faction%2FexportSingleCitation%3FsingleCitation%3Dtrue%26doi%3D'+encodedDoi+'&format=bibtex&noDoi=yesDoi&doi='+encodedDoi, success: jstorLib.processBibtex, xhrFields: { withCredentials: true } }); jstorLib_progress.updateProgress('download-meta', false, 'Grabbing metadata...'); }, showStatus: function(msg) { var s = window.frames.jstorLib_top.document.getElementById('jstorLib_status') if (s) s.innerHTML = msg; }, topOnload: function() { var topdoc = window.frames.jstorLib_top.document; var styles = topdoc.getElementsByTagName('link'); for (var i=styles.length-1; i>=0; i--) { styles[i].parentNode.removeChild(styles[i]); } topdoc.getElementsByTagName('body')[0].className = 'jstorTop'; topdoc.getElementsByTagName('body')[0].innerHTML = '<p><span id="next-item"> </span><strong>JSTOR liberator</strong> <span id="jstorLib_status"></span></p><style type="text/css"></style>'; topdoc.getElementById('next-item').onclick = jstorLib.askForNextItem; var cssLink = topdoc.createElement('link'); cssLink.setAttribute('rel', 'stylesheet'); cssLink.setAttribute('type', 'text/css'); cssLink.setAttribute('href', 'http://aaronsw.archiveteam.org/jstor_style.css'); topdoc.getElementsByTagName('head')[0].appendChild(cssLink); var m = document.location.href.match(/^http:\/\/www\.jstor\.org\/stable\/(info\/|view\/|)(.+)$/); if (m) { window.frames.jstorLib_bottom.location.href = 'http://www.jstor.org/stable/info/'+m[2]; } else { jstorLib.askForNextItem(); } }, bottomOnload: function() { var botdoc = window.frames.jstorLib_bottom.document; var titleEl = botdoc.getElementById('articleTitle'); var title = 'this document'; var meta = ''; if (titleEl) { title = titleEl.innerHTML; meta = titleEl.parentNode.innerHTML; } var form = jstorLib.form(); form.title.value = title; form.item.value = botdoc.location.href; form.meta.value = meta; form.bibtex.value = ''; jstorLib.showStatus('Click "Liberate PDF" to liberate "' + title + '"'); var botfr = window.frames.jstorLib_bottom; if (botfr.jstor) { botfr.jstor.openPDF = jstorLib.openPDF; } var pdfLink = botfr.document.getElementById('pdf'); if (pdfLink) { var pdfSaveLink = botfr.document.createElement('A'); pdfSaveLink.id = 'pdfsave'; pdfSaveLink.href = pdfLink.href; pdfSaveLink.innerHTML = 'Just Liberate PDF'; var pdfSaveLinkLI = botfr.document.createElement('LI'); pdfSaveLinkLI.className = 'pdfsave'; pdfSaveLinkLI.appendChild(pdfSaveLink); pdfLink.parentNode.parentNode.insertBefore(pdfSaveLinkLI, pdfLink.parentNode.nextSibling); pdfSaveLink.addEventListener('click', jstorLib.pdfSaveLinkClick, false); pdfLink.innerHTML = 'View & Liberate PDF'; } jstorLib_progress.init(); }, pdfSaveLinkClick: function(e) { var w = window.frames.jstorLib_bottom; e.preventDefault(); var pdfLocPath = e.target.href; var link = w.$(e.target); if (jstor.hideOverlay(pdfLocPath)) { return false; } if (!tAndCAccepted) { var offset = link.position(); var clickedId = link.attr("id"); var myX = offset.left - 475; var myY = offset.top + 12; var myClass = "middleR"; w.Boxy.load("/page/termsConfirmText.jsp", { title: "JSTOR Terms and Conditions", x: myX, y: myY, center: false, fixed: false, closeText: "<img src=\"/templates/jsp/_jstor/images/close_x.png\" border=\"0\" alt=\"close\">", draggable: false, unloadOnHide: true, afterShow: function () { jstorOverlayOpenAct = pdfLocPath; var self = this; w.$("#middle").addClass(myClass); w.$("#close").focus(); w.$("#acptTC").click(function () { tAndCAccepted = true; var newLink = pdfLocPath + "?acceptTC=true"; self.hide(); return w.jstor.openPDF(newLink, true); }) }, afterHide: function () { jstorOverlayOpenAct = ""; w.$("#" + clickedId).focus(); } }) } else { return w.jstor.openPDF(pdfLocPath, true); } }, buildFrames: function() { var f = {}; f.frameSet = document.createElement('frameset'), f.frameTop = document.createElement('frame'); f.frameSet.appendChild(f.frameTop); f.frameUpload = document.createElement('frame'); f.frameSet.appendChild(f.frameUpload); f.frameBottom = document.createElement('frame'); f.frameSet.appendChild(f.frameBottom); f.frameTop.src = 'http://www.jstor.org/'; f.frameTop.name = 'jstorLib_top'; f.frameUpload.src = 'about:blank'; f.frameUpload.name = 'jstorLib_upload'; f.frameBottom.src = 'about:blank'; f.frameBottom.name = 'jstorLib_bottom'; document.getElementsByTagName('head')[0].parentNode.appendChild(f.frameSet); f.frameSet.setAttribute('rows', '35,0,*'); f.frameSet.setAttribute('frameborder', '0'); f.frameTop.onload = jstorLib.topOnload; f.frameBottom.onload = jstorLib.bottomOnload; }, init: function() { $(document.body).remove(); jstorLib.buildFrames(); window.frames.jstorLib_top.location.href = 'http://www.jstor.org/'; window.addEventListener('message', jstorLib.receiveMessage, false); } }; return o; })(); if (! window.jstor) { window.alert('This bookmarklet can only be used on www.jstor.org.'); //} else if ($('div.lastUnit:contains("You are not currently logged in through a participating institution")').length == 0) { // window.alert('Sorry, you have full access to JSTOR. Please do not use this bookmarklet.'); } else if (jstorLib.getUploadCounter() > 0) { window.alert('You\'ve already uploaded a document. Thanks!'); top.location.href = 'http://aaronsw.archiveteam.org/'; } else { jstorLib.init(); }