From 490c4ef725b59851d2b489e8d546b92d0756fe8e Mon Sep 17 00:00:00 2001 From: Jeevanandam M Date: Thu, 2 May 2024 21:48:16 -0700 Subject: [PATCH] add date localization parsing #103 --- modules/compose.mjs | 72 ++++++++++++++++++++++++++++++++++++-------- modules/settings.mjs | 32 ++++++++++---------- options/options.html | 4 +-- 3 files changed, 77 insertions(+), 31 deletions(-) diff --git a/modules/compose.mjs b/modules/compose.mjs index afb09b9..265a9c5 100644 --- a/modules/compose.mjs +++ b/modules/compose.mjs @@ -139,12 +139,12 @@ class ReplyWithHeader { div.classList.add(targetNodeClassName); var headers = { - 'from': this._extractHeader('from', true, true), - 'to': this._extractHeader('to', true, true), - 'cc': this._extractHeader('cc', true, true), - 'date': this._extractHeader('date', false, true), - 'reply-to': this._extractHeader('reply-to', true, true), - 'subject': this._extractHeader('subject', false, true), + 'from': await this._extractHeader('from', true, true), + 'to': await this._extractHeader('to', true, true), + 'cc': await this._extractHeader('cc', true, true), + 'date': await this._extractHeader('date', false, true), + 'reply-to': await this._extractHeader('reply-to', true, true), + 'subject': await this._extractHeader('subject', false, true), } console.log(headers); @@ -178,12 +178,12 @@ class ReplyWithHeader { async _processPlainText() { var headers = { - 'from': this._extractHeader('from', true, false), - 'to': this._extractHeader('to', true, false), - 'cc': this._extractHeader('cc', true, false), - 'date': this._extractHeader('date', false, false), - 'reply-to': this._extractHeader('reply-to', true, false), - 'subject': this._extractHeader('subject', false, false), + 'from': await this._extractHeader('from', true, false), + 'to': await this._extractHeader('to', true, false), + 'cc': await this._extractHeader('cc', true, false), + 'date': await this._extractHeader('date', false, false), + 'reply-to': await this._extractHeader('reply-to', true, false), + 'subject': await this._extractHeader('subject', false, false), } console.log(headers); @@ -302,12 +302,58 @@ class ReplyWithHeader { return rwhHeaders; } - _extractHeader(key, clean, escape) { + async _parseDate(d) { + let fallback = (' ' + d).slice(1); + let locale = await rwhSettings.getHeaderLocale(); + let dateFormat = await rwhSettings.getHeaderDateFormat(); + let timeFormat = await rwhSettings.getHeaderTimeFormat(); + let includeTimezone = await rwhSettings.isHeaderTimeZone(); + + console.debug('Date format: ' + (dateFormat == 1 ? 'UTC' : 'Locale (' + locale + ')') + + ', Time format: ' + (timeFormat == 1 ? '24-hour' : '12-hour') + + (includeTimezone ? ', Include short timezone info' : '')) + + let epoch = null; + try { + epoch = Date.parse(d); + } catch (e) { + console.error(error); + return fallback; + } + + let pd = new Date(epoch); + let options = { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric', hour: 'numeric', minute: 'numeric' }; + + if (dateFormat == 1) { // Locale date format + options.timeZone = 'UTC'; + options.timeZoneName = 'short'; + } + + if (timeFormat == 1) { + options.hour12 = false; + } else { + options.hour12 = true; + } + + if (includeTimezone) { + options.timeZoneName = 'short'; + } + + let ds = new Intl.DateTimeFormat(locale, options).format(pd); + ds = ds.replace(/GMT/, 'UTC'); + return ds; + } + + async _extractHeader(key, clean, escape) { let values = this.#fullMessage.headers[key]; if (!values) { return null; } + if (key === 'date') { + return this._escapeHtml(await this._parseDate(values[0])); + } + let pv = []; for (let v of values) { pv.push((clean ? this._cleanEmail(v) : v)); diff --git a/modules/settings.mjs b/modules/settings.mjs index bd24642..fc7a58e 100755 --- a/modules/settings.mjs +++ b/modules/settings.mjs @@ -21,8 +21,9 @@ export const headerLabelSeqStyleSettings = { } let keyHeaderLabelSeqStyle = 'header.label.seq.style'; -// let keyHeaderDateFormat = 'header.date.format'; -// let keyHeaderTimeFormat = 'header.time.format'; +let keyHeaderDateFormat = 'header.date.format'; +let keyHeaderTimeFormat = 'header.time.format'; +let keyHeaderTimeZone = 'header.date.timezone'; let keyHeaderLocale = 'header.locale'; let keyHeaderPlainPrefixText = 'header.plain.prefix.text'; let keyHeaderHtmlPrefixLine = 'header.html.prefix.line'; @@ -44,20 +45,15 @@ let rwhDefaultSettings = { // Date & Time // 0 - Locale date format // 1 - International date format - UTC - // [keyHeaderDateFormat]: 0, - - // Date style - // Full - ddd, MMM d, yyyy - // ISO - yyyy-MM-dd - // "header.date.style": 0, + [keyHeaderDateFormat]: 0, // Time style // 0 - 12 hours AM/PM // 1 - 24 hours - // [keyHeaderTimeFormat]: 0, + [keyHeaderTimeFormat]: 0, // Date header include timezone info - // "header.date.timezone": false, + [keyHeaderTimeZone]: true, [keyCleanBlockQuoteColor]: true, [keyCleanQuoteCharGreaterThan]: true, @@ -97,13 +93,17 @@ export async function getHeaderLabelSeqStyle() { return await getInt(keyHeaderLabelSeqStyle); } -// export async function getHeaderDateFormat() { -// return await getInt(keyHeaderDateFormat); -// } +export async function getHeaderDateFormat() { + return await getInt(keyHeaderDateFormat); +} -// export async function getHeaderTimeFormat() { -// return await getInt(keyHeaderTimeFormat); -// } +export async function getHeaderTimeFormat() { + return await getInt(keyHeaderTimeFormat); +} + +export async function isHeaderTimeZone() { + return await get(keyHeaderTimeZone, rwhDefaultSettings[keyHeaderTimeZone]); +} export async function getHeaderLocale() { return await get(keyHeaderLocale, rwhDefaultSettings[keyHeaderLocale]); diff --git a/options/options.html b/options/options.html index 85132f3..9dcb911 100644 --- a/options/options.html +++ b/options/options.html @@ -47,7 +47,7 @@ Date, Subject) - +
Subject prefix