Dlouho jsem si říkal, že by bylo dobré automatizovat přidání události do kalendáře z mailu. Často mi lidé pošlou pozvánku třeba na nějaké hudební hraní a já si to pak ručně píši do kalendáře. To mě ale nebaví. Psát ručně do kalendáře. Hrát mě baví:-)
Proto jsem si vytvořil bookmarklet (skriptík, spouštěný v prohlížeči), kterému označím kus mailu a on jej analyzuje a udělá z něj událost v Kalendáři.
Hledá výskyty času (formát HH:MM, tedy třeba 09:00; umí ale také např. 9h, 9 h) a datumu (formát DD.MM., tedy třeba 1.5., umí ale i 1. 5, 1. 5., 1. května, 1. květen, 1.květen, 1.kvě, 1. kvě).
První dva výskyty bere jako čas, respektive datum začátku/konce události. Ostatní ignoruje, pokud jsou dva časy a jedno datum, bere se, jako že událost končí ten samý den. Pokud se nenajde ani jeden čas nebo ani jedno datum, bere se aktuální.
Samozřejmě jde použít na jakýkoli text, nejen v mailu.
Nevím proč, ale když se takto přidává do kalendáře, jde vidět jen jeden (defaultní) kalendář ve výběrovém seznamu. Aby se dalo přidat automaticky do jiného kalendáře, musí se přidat adresa tohoto kalendáře (je vidět v Nastavení kalendáře - Adresa kalendáře; něco jako "...gfk9hdmb8k@group.calendar.google.com") - link. Tu napište mezi apostrofy v:
calendar = '';
(upraveno pomocí http://chriszarate.github.io/bookmarkleter/ z javascriptového zdrojáku, šikovná věc)
javascript:void%20function(){url=window.location,window.getSelection%3Fselection=window.getSelection():document.getSelection%3Fselection=document.getSelection():document.selection%26%26(selection=document.selection.createRange().text),selection+=%22%22,str=selection,str=%22fasdfa%2015.%204%20%20sd%20fasd%2018%20h%20http://mecp.cu/fas%20fasdf%20%2020.%20července%2019h%20adfa%20fa%20fadsfasd%20f%2015.5.%20a%20fa%20fasdf%22,selection=str,str=str.replace(/([0-9]{1,2})%20%3Fh/g,%22$1:00%22),str=str.replace(/([0-9]{1,2})\.%20%3F([0-9]{1,2})/g,%22$1.$2.%22),str=str.replace(/([0-9]{1,2})\.%20%3Fled[^%20]*/g,%22$1.01.%22),str=str.replace(/([0-9]{1,2})\.%20%3Fúno/g,%22$1.02.%22),str=str.replace(/([0-9]{1,2})\.%20%3Fbře/g,%22$1.03.%22),str=str.replace(/([0-9]{1,2})\.%20%3Fdub/g,%22$1.04.%22),str=str.replace(/([0-9]{1,2})\.%20%3Fkvě/g,%22$1.05.%22),str=str.replace(/([0-9]{1,2})\.%20%3Fčerven[^%20]*/g,%22$1.07.%22),str=str.replace(/([0-9]{1,2})\.%20%3Fčer/g,%22$1.06.%22),str=str.replace(/([0-9]{1,2})\.%20%3Fsrp/g,%22$1.08.%22),str=str.replace(/([0-9]{1,2})\.%20%3Fzář/g,%22$1.09.%22),str=str.replace(/([0-9]{1,2})\.%20%3Fříj/g,%22$1.10.%22),str=str.replace(/([0-9]{1,2})\.%20%3Flis/g,%22$1.11.%22),str=str.replace(/([0-9]{1,2})\.%20%3Fpro/g,%22$1.12.%22),date=str.match(/([0-9]{1,2})\.([0-9]{1,2})\./g),time=str.match(/[0-9]{1,2}:[0-9]{2}/g),map=str.match(/http:\/\/[^%20]+/g),null==map%26%26(map=%22%22),today=new%20Date,time_from=(%220%22+today.getHours()).slice(-2)+(%220%22+today.getMinutes()).slice(-2),date_from=(%220%22+(today.getMonth()+1)).slice(-2)+(%220%22+today.getDate()).slice(-2),time_to=time_from,date_to=date_from,year=today.getFullYear(),null!=time%26%26(time.length%3E=2%3F(tmp=time[0].split(%22:%22),1==tmp[0].length%26%26(tmp[0]=%220%22+tmp[0]),1==tmp[0].length%26%26(tmp[1]=%220%22+tmp[1]),time_from=tmp[0]+tmp[1],tmp=time[1].split(%22:%22),1==tmp[0].length%26%26(tmp[0]=%220%22+tmp[0]),1==tmp[1].length%26%26(tmp[1]=%220%22+tmp[1]),time_to=tmp[0]+tmp[1]):(tmp=time[0].split(%22:%22),1==tmp[0].length%26%26(tmp[0]=%220%22+tmp[0]),1==tmp[1].length%26%26(tmp[1]=%220%22+tmp[1]),time_from=tmp[0]+tmp[1],time_to=time_from)),null!=date%26%26(date.length%3E=2%3F(tmp=date[0].split(%22.%22),1==tmp[0].length%26%26(tmp[0]=%220%22+tmp[0]),1==tmp[1].length%26%26(tmp[1]=%220%22+tmp[1]),date_from=tmp[1]+tmp[0],tmp=date[1].split(%22.%22),1==tmp[0].length%26%26(tmp[0]=%220%22+tmp[0]),1==tmp[1].length%26%26(tmp[1]=%220%22+tmp[1]),date_to=tmp[1]+tmp[0]):(tmp=date[0].split(%22.%22),1==tmp[0].length%26%26(tmp[0]=%220%22+tmp[0]),1==tmp[1].length%26%26(tmp[1]=%220%22+tmp[1]),date_from=tmp[1]+tmp[0],date_to=date_from)),selection.length%3E25%3Ftext=selection.substring(0,24):text=selection,selection=selection+%22\n\n%22+str,from=year+date_from+%22T%22+time_from+%2200%22,to=year+date_to+%22T%22+time_to+%2200%22,calendar=%22%22,urlopen=%22https://www.google.com/calendar/render%3Faction=TEMPLATE%26dates=%22+from+%22/%22+to+%22%26text=%22+text+%22%26location=%22+map+%22%26details=%22+encodeURIComponent(selection+%22\n\nmail%20link\n%22+url)+%22%26src=%22+calendar,void%20window.open(urlopen)}();
url = window.location; if (window.getSelection){ selection = window.getSelection(); } else if (document.getSelection) { selection = document.getSelection(); } else if (document.selection) { selection = document.selection.createRange().text; } /* I don't know why, but without + '' it does not work */ selection = selection + ''; str = selection; /* str = 'fasdfa 15. 4 sd fasd 18 h http://mecp.cu/fas fasdf 20. července 19h adfa fa fadsfasd f 15.5. a fa fasdf'; */ /* corrects time */ str = str.replace(/([0-9]{1,2}) ?h/g,'$1:00'); /*18 h -> 18:00*/ /* corrects date */ str = str.replace(/([0-9]{1,2})\. ?([0-9]{1,2})/g,'$1.$2.'); /* 13.5., 13. 5., 13.5 */ /* corrects czech months */ str = str.replace(/([0-9]{1,2})\. ?led[^ ]*/g,'$1.01.'); /* 13. ledna */ str = str.replace(/([0-9]{1,2})\. ?úno/g,'$1.02.'); str = str.replace(/([0-9]{1,2})\. ?bře/g,'$1.03.'); str = str.replace(/([0-9]{1,2})\. ?dub/g,'$1.04.'); str = str.replace(/([0-9]{1,2})\. ?kvě/g,'$1.05.'); str = str.replace(/([0-9]{1,2})\. ?červen[^ ]*/g,'$1.07.'); /* musi byt pred cervnem, jinak by se nahradilo spatne */ str = str.replace(/([0-9]{1,2})\. ?čer/g,'$1.06.'); str = str.replace(/([0-9]{1,2})\. ?srp/g,'$1.08.'); str = str.replace(/([0-9]{1,2})\. ?zář/g,'$1.09.'); str = str.replace(/([0-9]{1,2})\. ?říj/g,'$1.10.'); str = str.replace(/([0-9]{1,2})\. ?lis/g,'$1.11.'); str = str.replace(/([0-9]{1,2})\. ?pro/g,'$1.12.'); /* parsing */ date = str.match(/([0-9]{1,2})\.([0-9]{1,2})\./g); /* 5.6.*/ time = str.match(/[0-9]{1,2}:[0-9]{2}/g); /*18:00*/ map = str.match(/http:\/\/[^ ]+/g); if (map == null) map = ''; /* initialize */ today = new Date(); time_from = ('0' + today.getHours()).slice(-2) + ('0' + today.getMinutes()).slice(-2); date_from = ('0' + (today.getMonth()+1)).slice(-2) + ('0' + today.getDate()).slice(-2); time_to = time_from; date_to = date_from; year = today.getFullYear(); /* parse time */ if (time != null) { if (time.length >= 2) { // we found two times tmp = time[0].split(':'); if (tmp[0].length==1) tmp[0] = '0' + tmp[0]; if (tmp[0].length==1) tmp[1] = '0' + tmp[1]; time_from = tmp[0]+tmp[1]; tmp = time[1].split(':'); if (tmp[0].length==1) tmp[0] = '0' + tmp[0]; if (tmp[1].length==1) tmp[1] = '0' + tmp[1]; time_to = tmp[0]+tmp[1]; } else { tmp = time[0].split(':'); if (tmp[0].length==1) tmp[0] = '0' + tmp[0]; if (tmp[1].length==1) tmp[1] = '0' + tmp[1]; time_from = tmp[0]+tmp[1]; time_to = time_from; } } /* end of parse time */ if (date != null) { if (date.length >= 2) { /* we found two dates */ tmp = date[0].split('.'); if (tmp[0].length==1) tmp[0] = '0' + tmp[0]; if (tmp[1].length==1) tmp[1] = '0' + tmp[1]; date_from = tmp[1]+tmp[0]; tmp = date[1].split('.'); if (tmp[0].length==1) tmp[0] = '0' + tmp[0]; if (tmp[1].length==1) tmp[1] = '0' + tmp[1]; date_to = tmp[1]+tmp[0]; } else { tmp = date[0].split('.'); if (tmp[0].length==1) tmp[0] = '0' + tmp[0]; if (tmp[1].length==1) tmp[1] = '0' + tmp[1]; date_from = tmp[1]+tmp[0]; date_to = date_from; } } /* end of parse time */ if (selection.length>25) { text = selection.substring(0,24); } else { text = selection; } /* ladeni */ /*selection = selection + '\n\n' + str;*/ from = year + date_from + 'T' + time_from + '00'; to = year + date_to + 'T' + time_to + '00'; calendar = ''; urlopen = 'https://www.google.com/calendar/render?action=TEMPLATE&dates='+from+'/'+to+'&text='+text+'&location='+map+'&details='+encodeURIComponent(selection+'\n\nmail link\n'+url)+'&src='+calendar; /*alert(urlopen);*/ void(window.open(urlopen));
Tento web jsem zakládal na střední, v roce 2008. Je zde hlavně archiv mé tvorby.
Aktuální věci publikuji kvůli úspoře času na Twitter.
Honza
"Všechno má svou krásu, ale ne každý ji vidí."