// ==UserScript== // @name page_clipper // @description take a selection and log it, maybe with a category // @include * // ==/UserScript== // eek. just got: // Error: uncaught exception: Permission denied to call method HTMLDocument.evaluate // on http://www.useit.com/alertbox/wysiwyg.html // which makes no sense at all... function clip_current_selection(tag) { // post the url if (tag == undefined) { tag = "unknown"; } var txt1 = document.evaluate("//text()", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); var txt1_accum = ""; for (var txt_i = 0; txt_i < txt1.snapshotLength; txt_i++) { val = txt1.snapshotItem(txt_i).nodeValue; // possible alternative: bad-chars replacement // \u00a9 = © // \u00ae = ® // \u2014 = — — (hex vs. decimal) // also look at diveintogreasemonkey-2005-05-09/examples/dumbquotes.user.js try { btoa(val); txt1_accum += val; txt1_accum += " "; } catch (error) { alert("bad chars in segment " + txt_i + " value " + val); txt1_accum += " <badness removed> "; } } var txt2 = document.documentElement.innerHTML; GM_xmlhttpRequest( { method: 'POST', url: 'http://localhost:3382/clip_this', headers: { 'Content-type': 'application/x-www-form-urlencoded', 'ClipURL': window.location.href, // or document.URL, document.documentURI 'ClipCategory': tag, 'ClipSelection': encodeURIComponent(window.getSelection()), 'ClipTitle': document.title, 'ClipReferrer': document.referrer, }, data: btoa(txt1_accum), // full HTML onerror: function(detail) { alert(detail.statusText + ": got " + detail.responseText); }, }); } // this set up Tools->UserScriptCommands->... items. // I *want* context menu items, though. GM_registerMenuCommand("Clip This", function() { clip_current_selection() ; }); // hmmm, add categories by querying the server for them? // helper function needed to provide a scope to // hold the closure; block scope *doesn't* do it... function add_one_menu_item(thistag) { if (thistag) { GM_registerMenuCommand("Clip " + thistag, function() { clip_current_selection(thistag) ; }); } } GM_xmlhttpRequest( { method: 'GET', url: 'http://localhost:3382/tags', data: '', onerror: function(detail) { alert(detail.statusText + ": tags got " + detail.responseText); }, onload: function (detail) { if (detail.status == 200) { tags = detail.responseText.split(/\n/); for (tagno in tags) { add_one_menu_item(tags[tagno]); } } }, });