You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

45 lines
1.7 KiB
JavaScript

(function () {
'use strict';
// Utility function: Base64 Decoding.
function decodeBase64(encodedString) {
try {
// Can't use atob() directly because it doesn't support non-ascii characters.
// And non-ascii characters are allowed in email addresses and domains.
// See https://en.wikipedia.org/wiki/Email_address#Internationalization
// Code below adapted from Jackie Han: https://stackoverflow.com/a/64752311
const byteString = atob(encodedString);
// Convert byteString to an array of char codes.
const charCodes = [...byteString].map((char) => char.charCodeAt(0));
// Use TypedArray.prototype.set() to copy the char codes into a Uint8Array.
const bytes = new Uint8Array(charCodes.length);
bytes.set(charCodes);
const decoder = new TextDecoder('utf-8');
return decoder.decode(bytes);
} catch (e) {
console.error('Failed to decode Base64 string: ', e);
return null;
}
}
// Utility function: Update href of an element with a decoded email.
function updateEmailHref(element) {
const encodedEmail = element.getAttribute('data-encoded-email');
const decodedEmail = decodeBase64(encodedEmail);
if (decodedEmail) {
element.setAttribute('href', `mailto:${decodedEmail}`);
} else {
// If the decoding fails, hide the email link.
element.style.display = 'none';
}
}
// Fetch and process email elements with the "data-encoded-email" attribute.
const encodedEmailElements = document.querySelectorAll('[data-encoded-email]');
encodedEmailElements.forEach(updateEmailHref);
})();