Skip to content

Instantly share code, notes, and snippets.

@dajare
Created April 12, 2013 13:20
Show Gist options
  • Star 7 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dajare/5371948 to your computer and use it in GitHub Desktop.
Save dajare/5371948 to your computer and use it in GitHub Desktop.
Make.text bookarklet: place JS code between quotes in <a href="">make.text</a> to create the bookmarklet; converts webpage to markdown.
javascript:(function(){/**%20Make.text%201.5.%20Trevor%20Jim.%20License:%20GPL%20v2%20(www.fsf.org/copyleft/gpl.html).%20**/%20var%20logging%20=%20false;%20var%20logString%20=%20'';%20var%20unhandled%20=%20{};%20%20function%20log(exn,msg)%20{%20if%20(!logging)%20return;%20logString%20+=%20msg%20+%20':%20'%20+%20exn%20+%20'%5cn';%20}%20var%20w%20=%20window.open('');%20%20var%20d%20=%20w.document;%20var%20last%20=%20null;%20function%20addText(s)%20{%20if%20(last%20!=%20null)%20d.write(last);%20last%20=%20s;%20}%20function%20llapLast(s)%20{%20if%20(last)%20last%20=%20last.replace(/%20%20%20%20$/,s);%20}%20function%20finishOutput()%20{%20addText(%22%22);%20}%20var%20links%20=%20new%20Array(window.location);%20%20var%20rlinks%20=%20{};%20rlinks[window.location]%20=%200;%20var%20linkTitles%20=%20new%20Array();%20var%20atP%20=%20true;%20var%20atLeft%20=%20true;%20var%20atNoWS%20=%20true;%20%20var%20left%20=%20'%5cn';%20function%20pushLeft(s)%20{%20var%20oldLeft%20=%20left;%20left%20+=%20s;%20if%20(atP)%20addText(s);%20else%20p();%20function%20r()%20{%20left%20=%20oldLeft;%20atP%20=%20atLeft%20=%20false;%20p();%20}%20return%20r;%20}%20function%20p()%20{%20if%20(atP)%20%20return;%20if%20(!atLeft)%20{%20addText(left);%20atLeft%20=%20true;%20}%20addText(left);%20atP%20=%20atNoWS%20=%20true;%20}%20function%20llap(s)%20{%20if%20(!atLeft)%20{%20addText(left.replace(/%20%20%20%20$/,s));%20atLeft%20=%20atP%20=%20atNoWS%20=%20true;%20return;%20}%20else%20{%20llapLast(s);%20return;%20}%20}%20function%20br(s)%20{%20addText('%20%20'%20+%20left);%20atLeft%20=%20atNoWS%20=%20true;%20}%20function%20o(s)%20{%20if%20(!s)%20return;%20if%20(!inPRE)%20{%20if%20(atNoWS)%20s%20=%20s.replace(/^[%20%5ct%5cn]+/,'');%20else%20if%20(/^[%20%5ct]*%5cn/.test(s))%20s%20=%20s.replace(/^[%20%5ct%5cn]+/,'%5cn');%20else%20s%20=%20s.replace(/^[%20%5ct]+/,'%20');%20}%20if%20(s%20==%20'')%20return;%20atP%20=%20/%5cn%5cn$/.test(s);%20atLeft%20=%20/%5cn$/.test(s);%20atNoWS%20=%20/[%20%5ct%5cn]$/.test(s);%20addText(s.replace(/%5cn/g,left));%20}%20function%20oThunk(s)%20{%20function%20r()%20{%20o(s);%20}%20return%20r;%20}%20var%20inPRE%20=%20false;%20function%20pre()%20{%20var%20old%20=%20inPRE;%20inPRE%20=%20true;%20function%20r()%20{%20inPRE%20=%20old;%20}%20return%20r;%20}%20var%20inCODE%20=%20false;%20function%20code()%20{%20var%20old%20=%20inCODE;%20inCODE%20=%20true;%20function%20r()%20{%20inCODE%20=%20old;%20}%20return%20r;%20}%20var%20inOL%20=%20false;%20function%20ol()%20{%20var%20old%20=%20inOL;%20inOL%20=%20true;%20function%20r()%20{%20inOL%20=%20old;%20}%20return%20r;%20}%20function%20ul()%20{%20var%20old%20=%20inOL;%20inOL%20=%20false;%20function%20r()%20{%20inOL%20=%20old;%20}%20return%20r;%20}%20var%20replacements%20=%20{%20'%5c%5c%5c%5c':%20'%5c%5c%5c%5c',%20'%5c%5c[':%20'%5c%5c[',%20'%5c%5c]':%20'%5c%5c]',%20'>':%20'%5c%5c>',%20'_':%20'%5c%5c_',%20'%5c%5c*':%20'%5c%5c*',%20'`':%20'%5c%5c`',%20'#':%20'%5c%5c#',%20'([0-9])%5c%5c.(%5c%5cs|$)':%20'$1%5c%5c.$2',%20%20'%5cu00a9':%20'(c)',%20'%5cu00ae':%20'(r)',%20'%5cu2122':%20'(tm)',%20'%5cu00a0':%20'%20',%20%20%20%20'%5cu00b7':%20'%5c%5c*',%20%20'%5cu2002':%20'%20',%20%20'%5cu2003':%20'%20',%20%20'%5cu2009':%20'%20',%20%20'%5cu2018':%20%22'%22,%20'%5cu2019':%20%22'%22,%20'%5cu201c':%20'%22',%20'%5cu201d':%20'%22',%20'%5cu2026':%20'...',%20'%5cu2013':%20'--',%20%20'%5cu2014':%20'---'%20%20};%20var%20regex%20=%20{};%20for%20(var%20key%20in%20replacements)%20{%20regex[key]%20=%20new%20RegExp(key,%20'g');%20}%20function%20nonPREproc(s)%20{%20s%20=%20s.replace(/%5cn([%20%5ct]*%5cn)+/g,'%5cn');%20%20s%20=%20s.replace(/%5cn[%20%5ct]+/g,'%5cn');%20%20%20%20%20%20%20s%20=%20s.replace(/[%20%5ct]+/g,'%20');%20%20%20%20%20%20%20%20%20%20for%20(var%20key%20in%20replacements)%20{%20s%20=%20s.replace(regex[key],%20replacements[key]);%20}%20return%20s;%20}%20function%20inCODEproc(s)%20{%20s%20=%20s.replace(/`/g,'%5c%5c`');%20return%20s;%20}%20function%20isAbsolute(s)%20{%20%20%20%20%20%20return%20/^[a-zA-Z]([a-zA-Z0-9+-.])*:/.test(s);%20}%20function%20isSiteRelative(s)%20{%20%20return%20/^%5cx2f/.test(s);%20%20%20}%20function%20isPageRelative(s)%20{%20%20return%20/^#/.test(s);%20}%20var%20urlBase%20=%20location.href;%20var%20urlDir%20=%20urlBase.replace(/%5c/[^%5c/]*$/,'/');%20var%20urlPage%20=%20urlBase.replace(/#[^%5c/#]*$/,'');%20var%20urlSite%20=%20urlBase;%20if%20(isAbsolute(urlBase))%20{%20urlSite%20=%20urlBase.replace(/^([a-zA-Z]([a-zA-Z0-9+-.])*:%5c/%5c/[^%5c/]*).*/,'$1');%20}%20function%20makeAbsolute(s)%20{%20if%20(isAbsolute(s))%20return%20s;%20else%20if%20(isSiteRelative(s))%20return%20urlSite%20+%20s;%20else%20if%20(isPageRelative(s))%20return%20urlPage%20+%20s;%20else%20return%20urlDir%20+%20s;%20}%20function%20urlEscape(s)%20{%20s%20=%20makeAbsolute(s);%20s%20=%20s.replace(/%5cx22/g,'%2522');%20%20s%20=%20s.replace(/%5cx27/g,'%2527');%20%20s%20=%20s.replace(/%5cx20/g,'%2520');%20%20s%20=%20s.replace(/%5cx09/g,'%2509');%20%20s%20=%20s.replace(/%5cx0a/g,'%250a');%20%20s%20=%20s.replace(/%5cx0d/g,'%250d');%20%20s%20=%20s.replace(/%5cx28/g,'%2528');%20%20s%20=%20s.replace(/%5cx29/g,'%2529');%20%20s%20=%20s.replace(/%5cx5b/g,'%255b');%20%20s%20=%20s.replace(/%5cx5d/g,'%255d');%20%20s%20=%20s.replace(/%5cx5c/g,'%255c');%20%20return%20s;%20}%20if%20(!window.Node)%20Node%20=%20{};%20if%20(!Node.ELEMENT_NODE)%20Node.ELEMENT_NODE%20=%201;%20if%20(!Node.TEXT_NODE)%20Node.TEXT_NODE%20=%203;%20function%20dfs(e)%20{%20if%20(window.getComputedStyle)%20{%20try%20{%20%20var%20style%20=%20window.getComputedStyle(e,null);%20if%20(style.getPropertyValue%20%26%26%20style.getPropertyValue('display')%20==%20'none')%20return;%20}%20catch%20(exn)%20{%20log(exn,'computedStyle');%20}%20}%20if%20(e.nodeType%20==%20Node.ELEMENT_NODE)%20{%20var%20after%20=%20null;%20var%20skipChildren%20=%20false;%20try%20{%20switch%20(e.tagName)%20{%20case%20'HEAD':%20case%20'STYLE':%20case%20'SCRIPT':%20case%20'SELECT':%20case%20'OPTION':%20case%20'NOSCRIPT':%20case%20'NOFRAMES':%20case%20'INPUT':%20%20%20%20case%20'BUTTON':%20%20%20case%20'SELECT':%20%20%20case%20'TEXTAREA':%20case%20'LABEL':%20skipChildren%20=%20true;%20break;%20case%20'BODY':%20case%20'FORM':%20%20break;%20case%20'H1':%20p();%20o('#%20');%20break;%20%20case%20'H2':%20p();%20o('##%20');%20break;%20case%20'H3':%20p();%20o('###%20');%20break;%20case%20'H4':%20p();%20o('####%20');%20break;%20case%20'H5':%20p();%20o('#####%20');%20break;%20case%20'H6':%20p();%20o('######%20');%20break;%20case%20'P':%20%20p();%20break;%20case%20'DIV':%20p();%20break;%20case%20'BR':%20br();%20break;%20case%20'HR':%20p();%20o('--------------------------------');%20p();%20break;%20case%20'EM':%20case%20'I':%20case%20'U':%20o('_');%20atNoWS%20=%20true;%20after%20=%20oThunk('_');%20%20break;%20case%20'DT':%20p();%20case%20'STRONG':%20case%20'B':%20o('**');%20atNoWS%20=%20true;%20after%20=%20oThunk('**');%20%20break;%20case%20'OL':%20var%20r1%20=%20pushLeft('%20%20%20%20');%20var%20r2%20=%20ol();%20after%20=%20function()%20{%20r1();%20r2();%20};%20break;%20case%20'UL':%20var%20r1%20=%20pushLeft('%20%20%20%20');%20var%20r2%20=%20ul();%20after%20=%20function()%20{%20r1();%20r2();%20};%20break;%20case%20'LI':%20if%20(inOL)%20llap('1.%20%20');%20else%20llap('*%20%20%20');%20break;%20case%20'PRE':%20var%20r1%20=%20pushLeft('%20%20%20%20');%20var%20r2%20=%20pre();%20after%20=%20function()%20{%20r1();%20r2();%20};%20break;%20case%20'CODE':%20if%20(!inPRE)%20{%20o('`');%20var%20r1%20=%20code();%20var%20r2%20=%20oThunk('`');%20after%20=%20function()%20{%20r1();%20r2();%20};%20}%20break;%20case%20'DD':%20case%20'BLOCKQUOTE':%20after%20=%20pushLeft('>%20');%20break;%20case%20'A':%20var%20href%20=%20e.getAttribute('href');%20if%20(!href)%20break;%20href%20=%20urlEscape(href);%20var%20n;%20if%20(rlinks[href])%20{%20n%20=%20rlinks[href];%20}%20else%20{%20n%20=%20links.length;%20links[n]%20=%20href;%20rlinks[href]%20=%20n;%20if%20(e.getAttribute('title'))%20linkTitles[n]%20=%20e.getAttribute('title');%20}%20o('[');%20atNoWS%20=%20true;%20after%20=%20oThunk(']['%20+%20n%20+%20']');%20break;%20case%20'IMG':%20skipChildren%20=%20true;%20var%20src%20=%20e.getAttribute('src');%20if%20(!src)%20break;%20src%20=%20urlEscape(src);%20var%20alt%20=%20e.getAttribute('alt');%20if%20(!alt)%20alt%20=%20'';%20o('!['%20+%20alt%20+%20']('%20+%20src%20+%20')');%20break;%20case%20'IFRAME':%20case%20'FRAME':%20skipChildren%20=%20true;%20try%20{%20%20if%20(e.contentDocument%20%26%26%20e.contentDocument.documentElement)%20{%20dfs(e.contentDocument.documentElement);%20}%20}%20catch%20(exn)%20{%20log(exn,'contentDocument');%20}%20break;%20case%20'TR':%20after%20=%20p;%20break;%20default:%20if%20(logging)%20unhandled[e.tagName]%20=%20null;%20break;%20}%20}%20catch%20(exn)%20{%20log(exn,e.tagName);%20}%20if%20(!skipChildren)%20{%20var%20c%20=%20e.childNodes;%20for%20(var%20i%20=%200;%20i%20<%20c.length;%20i++)%20{%20dfs(c[i]);%20}%20}%20if%20(after)%20after();%20}%20else%20if%20(e.nodeType%20==%20Node.TEXT_NODE)%20{%20if%20(inPRE)%20o(e.nodeValue);%20else%20if%20(inCODE)%20o(inCODEproc(e.nodeValue));%20else%20o(nonPREproc(e.nodeValue));%20}%20}%20addText('<pre>');%20addText('%26lt;!--%20['%20+%20window.document.title%20+%20'][0]%20--%26gt;%5cn%5cn');%20dfs(window.document.body);%20addText('%5cn%5cn');%20for%20(var%20i%20=%200;%20i%20<%20links.length;%20i++)%20{%20var%20title%20=%20'%5cn';%20if%20(linkTitles[i])%20title%20=%20'%20%22'%20+%20linkTitles[i]%20+%20'%22%5cn';%20if%20(links[i])%20addText('['%20+%20i%20+%20']:%20'%20+%20links[i]%20+%20title);%20}%20if%20(logging)%20{%20addText('%5cn%5cn%26lt;!--%20Make.text%20debugging:%5cn');%20for%20(var%20i%20in%20unhandled)%20addText('Not%20handled:%20'%20+%20i%20+%20'%5cn');%20addText('%5cn');%20addText(logString);%20addText('--%26gt;%5cn');%20}%20addText('</pre>');%20finishOutput();%20d.close();%20})();void(0);
@dajare
Copy link
Author

dajare commented Apr 13, 2013

Original from: Trevor Jim


Repeating the instructions from above: Make.text bookarklet: place JS code between quotes in <a href="">make.text</a> to create the bookmarklet; click the <> button at the top right-hand corner to see the raw js to copy/paste. Save on a webpage, then drag the link to your browser's bookmarks.

Very handy to use in conjunction with something like the HackTheWeb Firefox extension, or the Karmatics Aardvark bookmarklet on which HTW was based: isolate the text on the page you want markdowned using HTW, or whatever, click the make.text bookmarlet -- presto! Instant markdown text.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment