NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name Export kontaktů z Email.cz // @namespace cz.Velda.Emailcz.exportKontaktu // @description Export kontaktů z Email.cz do formátu vCard. // @include https://email.seznam.cz/* // @include http://email.seznam.cz/* // @version 0.4 // @updateURL https://openuserjs.org/install/vvelda/Export_kontakt%C5%AF_z_Email.cz.user.js // @grant none // @copyright 2014–2016, Jan Velecký // ==/UserScript== window.export_loaded = window.export_loaded || false // kvůli TrixIE, které spustí skript znovu při změně kotvy function starter(e) { //alert(location.hash) var el = document.getElementById("wm-top-abook"), tl if(el) { window.JAK.Events.removeListener(hashchangeID) tl = document.createElement("a") tl.className = "wm-popup-button wm-button" tl.textContent = "Export kontaktů" tl.onclick = exportUI el.insertBefore(tl, el.lastElementChild) el.insertBefore(document.createTextNode(" "), tl) } } if(window.export_loaded) throw "Already runs" // jakmile uživatel najede na seznam kontaktů, tak se spustit window.export_loaded = true hashchangeID = window.JAK.Events.addListener(window, "hashchange", starter) // Tlačítko pro spuštění exportu var TL_TEXT = "Exportovat kontakty" function exportovatTlListener(e) { // po kliknutí provedeme samotný export if(e.target.textContent != TL_TEXT) return false e.stopPropagation() export_vCard(document.getElementById("export-nezarazene").checked, document.getElementById("export-blokovane").checked) } // zobrazíme UI pro konfiguraci exportu function exportUI() { // znemožníme uživateli nechtěně něco změnit with(document.getElementById("wm-person-operations")) children[0].className = "disabled", children[2].className = "disabled" // upravíme tlačítka v patičce with(document.getElementById("wm-window-footer").getElementsByTagName("a")) if(item(1).textContent != TL_TEXT) item(0).style.display = "none", tlacitko = item(1), item(1).textContent = TL_TEXT, // abychom zabránily duplicitním listenerům item(1).parentElement.removeEventListener("click", exportovatTlListener, true), item(1).parentElement.addEventListener("click", exportovatTlListener, true) document.getElementById("wm-detail-abook").innerHTML = "<div class='group-edit'>\ Exportují se veškerá data kontaktů uložená v adresáři, včetně skupin. Export je proveden do standardního formátu vCard s příponou .vcf.\ <p><input id='export-nezarazene' type='checkbox' checked> Exportovat také nezařazené kontakty</p>\ <p><input id='export-blokovane' type='checkbox'> Exportovat také blokované kontakty</p>\ <em>Kontaktovat vývojáře tohoto skriptu můžete na e-mailu <a href='mailto:" + ["veleckyjan", "gmail.com"].join("@") + "'>" + ["veleckyjan", "gmail.com"].join("@") + "</a>.<br>\ Můžete také zvážit podporu vývojáře tohoto skriptu, díky.\ <form action='https://www.paypal.com/cgi-bin/webscr' method='post' target='_blank'>\ <input type='hidden' name='cmd' value='_s-xclick'>\ <input type='hidden' name='hosted_button_id' value='2HT3B37J6T6RJ'>\ <input type='image' src='https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif' border='0' name='submit' alt='PayPal - The safer, easier way to pay online!'>\ <img alt='' border='0' src='https://www.paypalobjects.com/en_US/i/scr/pixel.gif' width='1' height='1'>\ </form>\ </em>\ </div>" } function export_vCard(nezarazene, blokovane) { var AB = WM._instance._components[WM.COMPONENT_AB], // AB - Adress Book contacts = AB.getPersons(), i = 0, n = contacts.length, vCard = [], data, contact, firstO, adr, nezarazeny, kategorie, a, klik, filename for(; i < n; i++) { contact = contacts[i] kategorie = [] nezarazeny = !contact._visuals.length if(nezarazeny) { if(!nezarazene) continue; // nezařazené exportujeme pouze pokud si to uživatel žádá kategorie.push(-1) // skupina nezařazených kontaktů } // hlavička vCard vCard.push( "BEGIN:VCARD", "VERSION:2.1", "KIND:individual" // popisuje osoby ) // celé jméno osoby, jméno a příjmení if(data = contact.getName()) vCard.push( "FN:" + data, "N:" + contact.getSurname() + ";" + contact.getFirstname() ) // přezdívka osoby if(data = contact.getNickname()) vCard.push( "NICKNAME:" + data ) data = contact.getData() // e-mailové adresy if(data.email.length) { firstO = true data.email.forEach(function(value) { vCard.push("EMAIL" + (firstO ? ";PREF:" : ":") + value.email) if(firstO) firstO = false // uložíme skupiny napojené na e-mailu value.groups.forEach(function(group) { if(!blokovane && group == 11) // skupina blokovaných kontaktů -> odebereme blokovaný e-mail vCard.pop() else { if(group in kategorie) return kategorie.push(group) } }) }) } // skupiny napojíme na kontakt if(kategorie.length) vCard.push("CATEGORIES:" + kategorie.map(function(value) { if(AB.getGroup(value)) return AB.getGroup(value).getName() else if(value == -1) return "nezařazené" }).join(",")) // telefonní čísla if(data.phone.length) { firstO = true data.phone.forEach(function(value) { vCard.push("TEL" + (firstO ? ";PREF:" : ":") + value.number) if(firstO) firstO = false }) } // adresa osoby if(data.address.length) { adr = data.address[0] vCard.push("ADR:;;" + adr.address + ";" + adr.city + ";;" + adr.zip + ";" + adr.country) } // poznámka u kontaktu if(data.comment) { vCard.push("NOTE:" + data.comment.replace(/\r\n|\r|\n/g, "\\n")) } // příslušnost osoby k organizaci if(data.organisation) { vCard.push("ORG:" + data.organisation) } // ICQ, JABBER, Skype, WWW if(data.icq) { vCard.push("X-ICQ:" + data.icq) } if(data.jabber) { vCard.push("X-JABBER:" + data.jabber) } if(data.skype) { vCard.push("X-SKYPE:" + data.skype) } if(data.homepage) { vCard.push("URL:" + data.homepage) } // na oddělení jednotlivých kontaktů vCard.push("END:VCARD", "") } // kompletace vCard polí do textové podoby vCard = vCard.join("\n") filename = "kontakty_" + new Date().toLocaleDateString().replace(" ", "").replace(" ", "") + ".vcf" if(window.navigator.msSaveBlob) { // kód pro uložení na IE 10/11, nižší verze nejsou pdoporovány window.navigator.msSaveBlob(new Blob([vCard], "data:text/vcard"), filename) } else { // textová podoba do base64 a = document.createElement("a") a.setAttribute("download", filename) a.href = "data:text/vcard;base64," + Base64.encode(vCard) // zobrazení výzvy k uložení souboru klik = document.createEvent('MouseEvents') klik.initEvent('click', true, true) a.dispatchEvent(klik) } } // Base64 library var Base64 = { // private property _keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", // public method for encoding encode : function (input) { var output = ""; var chr1, chr2, chr3, enc1, enc2, enc3, enc4; var i = 0; input = Base64._utf8_encode(input); while (i < input.length) { chr1 = input.charCodeAt(i++); chr2 = input.charCodeAt(i++); chr3 = input.charCodeAt(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; } }