summaryrefslogtreecommitdiff
path: root/sysret.org/themes/tabi-lean/static/js/decodeMail.js
diff options
context:
space:
mode:
authorAlejandro Soto <alejandro@34project.org>2025-09-13 15:01:06 -0600
committerAlejandro Soto <alejandro@34project.org>2025-09-13 15:01:06 -0600
commitf4fcda54638685899c730b3fa90a87d80d6dbef5 (patch)
tree0737e627cce304c3a9c4e757bc5f6571a7456091 /sysret.org/themes/tabi-lean/static/js/decodeMail.js
parentd8b9cf1f61cc07d625f1c37ccc28adfd58918416 (diff)
parent2c13119932765c6d788f08fb53abc244407c0d80 (diff)
Merge commit '6a7d3111b31e73fc66af5360149d41f690fbcaa4'
Diffstat (limited to 'sysret.org/themes/tabi-lean/static/js/decodeMail.js')
-rw-r--r--sysret.org/themes/tabi-lean/static/js/decodeMail.js44
1 files changed, 44 insertions, 0 deletions
diff --git a/sysret.org/themes/tabi-lean/static/js/decodeMail.js b/sysret.org/themes/tabi-lean/static/js/decodeMail.js
new file mode 100644
index 0000000..f26ac68
--- /dev/null
+++ b/sysret.org/themes/tabi-lean/static/js/decodeMail.js
@@ -0,0 +1,44 @@
+(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);
+})();