// ==UserScript== // @id pastebin-linkize // @name pastebin link formatter // @version 1.0 // @namespace hax // @author // @description Turns URL patterns in pastebin pages into actual links. (see code for examples) // @include http://pastebin.com/* // @run-at document-end // @downloadURL none // ==/UserScript== /* syntax: link (on one line) => contents ommitting [] will make => link - link (to leave the text plain) => link contents may not include right angle brackets or % by itself. (is unescaped though so %3e will become > and %25 will become %) (and %51 will become Q if you don't want to type Q for some reason) examples: ---https://reddit.com/ => -- https://reddit.com/ => - https://reddit.com/ => https://reddit.com/ - http://4chan.us/ => http://4chan.us/ --https://github.com/ => -https://github.com/ - http://meetup.com => http://meetup.com - https://pastebin.com => https://pastebin.com/ */ var urlpatt = new RegExp('(-)?(?:<([^>]*)>\\s*)?(https?://[^ ]+)','g'); function reformatOne(t) { var pieces = t.nodeValue.split(urlpatt); if(pieces.length == 1) { return 0; } var lastTextNode = null; function addtext(text) { console.log('add '+text); if(!text) return; if(lastTextNode==null) { lastTextNode = document.createTextNode(text); t.parentNode.insertBefore(lastTextNode,t); } else { lastTextNode.nodeValue += text; } } var islink = false; var i; console.log('pieces'); console.log(t.nodeValue); console.log(pieces); for(i=0; i < pieces.length; ++i) { var piece = pieces[i]; if(islink) { // a ()? capture returns undefined instead of omitting the capture var skip = piece; var contents = pieces[++i]; var href = pieces[++i]; if(skip) { if(contents == undefined) contents = href; else contents = '<' + contents + '> ' + href; addtext(contents); islink = false; continue; } if(contents == undefined) { contents = href; } else { contents = unescape(contents); } var link = document.createElement('a'); link.setAttribute('href',href); link.appendChild(document.createTextNode(contents)); t.parentNode.insertBefore(link,t); lastTextNode = null; islink = false; } else { addtext(piece); islink = true; } } t.parentNode.removeChild(t); return i + 1; } function reformat(e) { if (e.nodeValue) { reformatOne(e); } else if(e.childNodes.length > 0) { // do NOT iterate and SAVE the next step // otherwise we descend into the links we created! var cur = e.childNodes[0]; while(cur) { var next = cur.nextSibling; reformat(cur); cur = next; } } } var div = document.getElementById('selectable'); if(div) reformat(div);