From 1b6ad68252353ea6300e62861aadb4716c4ccb74 Mon Sep 17 00:00:00 2001 From: RealRaven2000 Date: Mon, 4 Mar 2024 14:56:38 +0000 Subject: [PATCH] issue #274 - %preheader% improvements Added support for clipboard and *selection* (in fragments) Added documentation Moved gMsgCompose.editor.rootElement to wrapper object ST4.composer --- _locales/ca/messages.json | 22 ++++++++++ _locales/cs/messages.json | 22 ++++++++++ _locales/de/messages.json | 22 ++++++++++ _locales/el/messages.json | 22 ++++++++++ _locales/en/messages.json | 13 ++++++ _locales/es/messages.json | 22 ++++++++++ _locales/fi/messages.json | 22 ++++++++++ _locales/fr/messages.json | 22 ++++++++++ _locales/id_ID/messages.json | 22 ++++++++++ _locales/it/messages.json | 22 ++++++++++ _locales/ja/messages.json | 22 ++++++++++ _locales/nl/messages.json | 22 ++++++++++ _locales/pl/messages.json | 22 ++++++++++ _locales/pt/messages.json | 22 ++++++++++ _locales/pt_BR/messages.json | 22 ++++++++++ _locales/ru/messages.json | 22 ++++++++++ _locales/sl/messages.json | 22 ++++++++++ _locales/sr/messages.json | 13 ++++++ _locales/sv/messages.json | 13 ++++++ _locales/uk/messages.json | 13 ++++++ _locales/zh_CN/messages.json | 23 ++++++++++ _locales/zh_TW/messages.json | 22 ++++++++++ chrome/content/help.xhtml | 2 + chrome/content/smartTemplate-compose.js | 38 ++++++---------- chrome/content/smartTemplate-composer.js | 29 +++++++++++++ chrome/content/smartTemplate-fileTemplates.js | 2 +- chrome/content/smartTemplate-help.js | 7 +++ chrome/content/smartTemplate-main.js | 6 ++- chrome/content/smartTemplate-overlay.js | 43 +++++++++++++------ chrome/content/smartTemplate-util.js | 3 +- manifest.json | 2 +- 31 files changed, 539 insertions(+), 42 deletions(-) diff --git a/_locales/ca/messages.json b/_locales/ca/messages.json index f8d5611fe..f9faf3e38 100644 --- a/_locales/ca/messages.json +++ b/_locales/ca/messages.json @@ -1123,6 +1123,28 @@ "pref_variables.tab": { "message": "Variablas" }, + "preheader": { + "message": "Un text de visualització prèvia només visible pels clients de correu electrònic mòbils, que s'inserirà al principi del cos del correu electrònic." + }, + "preheader.className": { + "message": "[opcional] Podeu afegir una classe CSS per canviar la disposició." + }, + "preheader.inlineStyles": { + "message": "[opcional] Afegiu els vostres propis atributs d'estil, separats per punt i coma. Sense aquest paràmetre, SmartTemplates inserirà 'display:none' per fer automàticament la secció invisible." + }, + "preheader.text": { + "message": "El text previ ha d'estar contingut dins de cometes dobles, que també poden contenir la paraula clau *clipboard*. Alternativament, podeu utilitzar $clipboardLiteral$ o $selectionLiteral$ (aquest últim només funciona quan s'utilitza des d'una Smart Snippet)", + "placeholders": { + "clipboardLiteral": { + "content": "$1", + "example": "clipboard" + }, + "selectionLiteral": { + "content": "$2", + "example": "\"*selection*\"" + } + } + }, "premiumConfig": { "message": "Funcions premium" }, diff --git a/_locales/cs/messages.json b/_locales/cs/messages.json index c951d0fb3..f58c54b60 100644 --- a/_locales/cs/messages.json +++ b/_locales/cs/messages.json @@ -1117,6 +1117,28 @@ "pref_variables.tab": { "message": "Proměnné" }, + "preheader": { + "message": "Un text de visualització prèvia només visible pels clients de correu electrònic mòbils, que s'inserirà al principi del cos del correu electrònic." + }, + "preheader.className": { + "message": "[opcional] Podeu afegir una classe CSS per canviar la disposició." + }, + "preheader.inlineStyles": { + "message": "[opcional] Afegiu els vostres propis atributs d'estil, separats per punt i coma. Sense aquest paràmetre, SmartTemplates inserirà 'display:none' per fer automàticament la secció invisible." + }, + "preheader.text": { + "message": "Náhledový text musí být obsažen v uvozovkách, které mohou také obsahovat klíčové slovo *clipboard*. Alternativně můžete použít $clipboardLiteral$ nebo $selectionLiteral$ (poslední funguje pouze při použití ze Smart Snippet)", + "placeholders": { + "clipboardLiteral": { + "content": "$1", + "example": "clipboard" + }, + "selectionLiteral": { + "content": "$2", + "example": "\"*selection*\"" + } + } + }, "premiumConfig": { "message": "Šifrovaná e-mailová adresa neodpovídá čitelné adrese." }, diff --git a/_locales/de/messages.json b/_locales/de/messages.json index 57e27d7cd..f0d98ce05 100644 --- a/_locales/de/messages.json +++ b/_locales/de/messages.json @@ -1069,6 +1069,28 @@ "pref_variables.tab": { "message": "Variablen" }, + "preheader": { + "message": "Ein Vorschautext, der nur für mobile E-Mail-Clients sichtbar ist und am Anfang des E-Mail-Körpers eingefügt wird." + }, + "preheader.className": { + "message": "[optional] Sie können eine CSS-Klasse hinzufügen, um das Layout zu ändern." + }, + "preheader.inlineStyles": { + "message": "[optional] Fügen Sie Ihre eigenen Style-Attribute hinzu, getrennt durch Semikolon. Ohne diesen Parameter fügt SmartTemplates 'display:none' ein, um den Abschnitt automatisch unsichtbar zu machen." + }, + "preheader.text": { + "message": "Der Vorschautext muss in doppelten Anführungszeichen enthalten sein, die auch das Schlüsselwort *clipboard* enthalten können. Alternativ können Sie auch $clipboardLiteral$ oder $selectionLiteral$ verwenden (das letztere funktioniert nur, wenn es in einem Smart Snippet verwendet wird)", + "placeholders": { + "clipboardLiteral": { + "content": "$1", + "example": "clipboard" + }, + "selectionLiteral": { + "content": "$2", + "example": "\"*selection*\"" + } + } + }, "premiumConfig": { "message": "Premium Funktionen" }, diff --git a/_locales/el/messages.json b/_locales/el/messages.json index c38fcda6c..bc29432cb 100644 --- a/_locales/el/messages.json +++ b/_locales/el/messages.json @@ -1126,6 +1126,28 @@ "pref_variables.tab": { "message": "Μεταβλητές" }, + "preheader": { + "message": "Ένα προεπισκοπήσιμο κείμενο που είναι ορατό μόνο στους φορητούς πελάτες email, το οποίο θα εισαχθεί στην αρχή του σώματος του email." + }, + "preheader.className": { + "message": "[προαιρετικό] Μπορείτε να προσθέσετε ένα CSS class για να αλλάξετε τη διάταξη." + }, + "preheader.inlineStyles": { + "message": "[προαιρετικό] Προσθέστε τα δικά σας χαρακτηριστικά στιλ, χωρισμένα με ερωτηματικό. Χωρίς αυτή την παράμετρο, το SmartTemplates θα εισάγει αυτόματα 'display:none' για να καθιστά αόρατο το τμήμα." + }, + "preheader.text": { + "message": "Ο προεπισκοπήσιμος κείμενος πρέπει να περιέχεται μέσα σε διπλά εισαγωγικά, τα οποία μπορούν επίσης να περιέχουν τη λέξη-κλειδί *clipboard*. Εναλλακτικά, μπορείτε να χρησιμοποιήσετε $clipboardLiteral$ ή $selectionLiteral$ (αυτό το τελευταίο λειτουργεί μόνο όταν χρησιμοποιείται από ένα Smart Snippet)", + "placeholders": { + "clipboardLiteral": { + "content": "$1", + "example": "clipboard" + }, + "selectionLiteral": { + "content": "$2", + "example": "\"*selection*\"" + } + } + }, "premiumConfig": { "message": "Λειτουργίες Premium" }, diff --git a/_locales/en/messages.json b/_locales/en/messages.json index f8782ff37..5b1ef5e72 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -1157,6 +1157,19 @@ "preheader.inlineStyles": { "message": "[optional] Add your own style attributes, separated by semicolon. Without this parameter, SmartTemplates will insert 'display:none' to automatically make the section invisible." }, + "preheader.text": { + "message": "The preview text must be contained within double quotes, which also may contain the *clipboard* keyword. Alternatively you can use $clipboardLiteral$ directly or $selectionLiteral$ (that last one only works when used from a Smart Snippet)", + "placeholders": { + "clipboardLiteral": { + "content": "$1", + "example": "clipboard" + }, + "selectionLiteral": { + "content": "$2", + "example": "\"*selection*\"" + } + } + }, "premiumConfig": { "message": "Premium Features" }, diff --git a/_locales/es/messages.json b/_locales/es/messages.json index b4ede0639..04b856ef5 100644 --- a/_locales/es/messages.json +++ b/_locales/es/messages.json @@ -1084,6 +1084,28 @@ "pref_template_tip": { "message": "Puede cambiar el encabezado de respuesta por 'variables'. Consulte la Ayuda para más detalles." }, + "preheader": { + "message": "Un texto de vista previa solo visible para clientes de correo móvil, que se insertará al principio del cuerpo del correo electrónico." + }, + "preheader.className": { + "message": "[opcional] Puede agregar una clase CSS para cambiar el diseño." + }, + "preheader.inlineStyles": { + "message": "[opcional] Agregue sus propios atributos de estilo, separados por punto y coma. Sin este parámetro, SmartTemplates insertará 'display:none' para hacer automáticamente la sección invisible." + }, + "preheader.text": { + "message": "El texto de vista previa debe estar contenido dentro de comillas dobles, que también pueden contener la palabra clave *clipboard*. Alternativamente, puede utilizar $clipboardLiteral$ o $selectionLiteral$ (este último solo funciona cuando se usa desde un Smart Snippet)", + "placeholders": { + "clipboardLiteral": { + "content": "$1", + "example": "clipboard" + }, + "selectionLiteral": { + "content": "$2", + "example": "\"*selection*\"" + } + } + }, "premiumConfig": { "message": "Funcionalidades premium" }, diff --git a/_locales/fi/messages.json b/_locales/fi/messages.json index 2bd154cb5..9a6b00149 100644 --- a/_locales/fi/messages.json +++ b/_locales/fi/messages.json @@ -1126,6 +1126,28 @@ "pref_variables.tab": { "message": "Muuttujat" }, + "preheader": { + "message": "Esikatseluteksti, joka näkyy vain mobiilisähköpostiasiakkaille ja joka lisätään sähköpostin rungon alkuun." + }, + "preheader.className": { + "message": "[valinnainen] Voit lisätä CSS-luokan muuttaaksesi ulkoasua." + }, + "preheader.inlineStyles": { + "message": "[valinnainen] Lisää omat tyylisi, erotettuina puolipisteellä. Ilman tätä parametria SmartTemplates lisää 'display:none', jotta osa olisi automaattisesti näkymätön." + }, + "preheader.text": { + "message": "Esikatselutekstin on oltava kaksoislainausmerkkien sisällä, jotka voivat myös sisältää avainsanan *leikepöytä*. Vaihtoehtoisesti voit käyttää $clipboardLiteral$ tai $selectionLiteral$ (jälkimmäinen toimii vain, kun sitä käytetään Smart Snippetistä)", + "placeholders": { + "clipboardLiteral": { + "content": "$1", + "example": "clipboard" + }, + "selectionLiteral": { + "content": "$2", + "example": "\"*selection*\"" + } + } + }, "premiumConfig": { "message": "Maksulliset lisätoiminnot" }, diff --git a/_locales/fr/messages.json b/_locales/fr/messages.json index 4ec365aef..4b7fb9823 100644 --- a/_locales/fr/messages.json +++ b/_locales/fr/messages.json @@ -1123,6 +1123,28 @@ "pref_variables.tab": { "message": "Variables" }, + "preheader": { + "message": "Un texte de prévisualisation uniquement visible pour les clients de messagerie mobile, qui sera inséré au début du corps de l'email." + }, + "preheader.className": { + "message": "[facultatif] Vous pouvez ajouter une classe CSS pour changer la mise en page." + }, + "preheader.inlineStyles": { + "message": "[facultatif] Ajoutez vos propres attributs de style, séparés par un point-virgule. Sans ce paramètre, SmartTemplates insérera 'display:none' pour rendre automatiquement la section invisible." + }, + "preheader.text": { + "message": "Le texte de prévisualisation doit être contenu entre guillemets doubles, qui peuvent également contenir le mot clé *clipboard*. En alternative, vous pouvez utiliser $clipboardLiteral$ ou $selectionLiteral$ (ce dernier ne fonctionne que lorsqu'il est utilisé depuis un Smart Snippet)", + "placeholders": { + "clipboardLiteral": { + "content": "$1", + "example": "clipboard" + }, + "selectionLiteral": { + "content": "$2", + "example": "\"*selection*\"" + } + } + }, "premiumConfig": { "message": "Fonctionnalités Premium" }, diff --git a/_locales/id_ID/messages.json b/_locales/id_ID/messages.json index baf735d6f..43e452ee7 100644 --- a/_locales/id_ID/messages.json +++ b/_locales/id_ID/messages.json @@ -822,6 +822,28 @@ "pref_variables.tab": { "message": "Variabel" }, + "preheader": { + "message": "Sebuah teks pratinjau hanya terlihat untuk klien email mobile, yang akan dimasukkan di awal badan email." + }, + "preheader.className": { + "message": "[opsional] Anda dapat menambahkan kelas CSS untuk mengubah tata letak." + }, + "preheader.inlineStyles": { + "message": "[opsional] Tambahkan gaya atribut Anda sendiri, dipisahkan oleh titik koma. Tanpa parameter ini, SmartTemplates akan memasukkan 'display:none' secara otomatis untuk membuat bagian tersebut tidak terlihat." + }, + "preheader.text": { + "message": "Teks pratinjau harus berada dalam tanda kutip ganda, yang juga dapat berisi kata kunci *clipboard*. Sebagai alternatif, Anda dapat menggunakan $clipboardLiteral$ atau $selectionLiteral$ (yang terakhir hanya berfungsi ketika digunakan dari Smart Snippet)", + "placeholders": { + "clipboardLiteral": { + "content": "$1", + "example": "clipboard" + }, + "selectionLiteral": { + "content": "$2", + "example": "\"*selection*\"" + } + } + }, "premiumConfig": { "message": "Fitur Premium" }, diff --git a/_locales/it/messages.json b/_locales/it/messages.json index 8078665ed..c663f438d 100644 --- a/_locales/it/messages.json +++ b/_locales/it/messages.json @@ -1036,6 +1036,28 @@ "pref_variables.tab": { "message": "Variabili" }, + "preheader": { + "message": "Un testo di anteprima visibile solo ai client di posta elettronica mobile, che verrà inserito all'inizio del corpo dell'email." + }, + "preheader.className": { + "message": "[opzionale] È possibile aggiungere una classe CSS per cambiare la formattazione." + }, + "preheader.inlineStyles": { + "message": "[opzionale] Aggiungi i tuoi attributi di stile, separati da punto e virgola. Senza questo parametro, SmartTemplates inserirà 'display:none' per rendere automaticamente la sezione invisibile." + }, + "preheader.text": { + "message": "Il testo di anteprima deve essere contenuto tra virgolette doppie, che possono anche contenere la parola chiave *clipboard*. In alternativa, è possibile utilizzare $clipboardLiteral$ o $selectionLiteral$ (quest'ultimo funziona solo quando viene utilizzato da un Smart Snippet)", + "placeholders": { + "clipboardLiteral": { + "content": "$1", + "example": "clipboard" + }, + "selectionLiteral": { + "content": "$2", + "example": "\"*selection*\"" + } + } + }, "premiumConfig": { "message": "Caratteristiche Premium" }, diff --git a/_locales/ja/messages.json b/_locales/ja/messages.json index 45f869edc..134acda73 100644 --- a/_locales/ja/messages.json +++ b/_locales/ja/messages.json @@ -1105,6 +1105,28 @@ "pref_variables.tab": { "message": "変数" }, + "preheader": { + "message": "モバイルメールクライアントのみに表示されるプレビューテキストで、電子メールの本文の先頭に挿入されます。" + }, + "preheader.className": { + "message": "[オプション] レイアウトを変更するための CSS クラスを追加できます。" + }, + "preheader.inlineStyles": { + "message": "[オプション] セミコロンで区切られた独自のスタイル属性を追加します。このパラメーターがない場合、SmartTemplates はセクションを自動的に非表示にするために 'display:none' を挿入します。" + }, + "preheader.text": { + "message": "プレビューテキストは二重引用符内に含まれている必要があります。これには *clipboard* キーワードも含まれる場合があります。代替として、$clipboardLiteral$ または $selectionLiteral$ を使用することもできます(後者は Smart Snippet から使用される場合のみ機能します)", + "placeholders": { + "clipboardLiteral": { + "content": "$1", + "example": "clipboard" + }, + "selectionLiteral": { + "content": "$2", + "example": "\"*selection*\"" + } + } + }, "premiumConfig": { "message": "プレミアム機能" }, diff --git a/_locales/nl/messages.json b/_locales/nl/messages.json index e84fc6b45..a005a8257 100644 --- a/_locales/nl/messages.json +++ b/_locales/nl/messages.json @@ -1066,6 +1066,28 @@ "pref_variables.tab": { "message": "Variabelen" }, + "preheader": { + "message": "Een voorbeeldtekst die alleen zichtbaar is voor mobiele e-mailclients, die aan het begin van het e-maillichaam zal worden ingevoegd." + }, + "preheader.className": { + "message": "[optioneel] U kunt een CSS-klasse toevoegen om het lay-out te wijzigen." + }, + "preheader.inlineStyles": { + "message": "[optioneel] Voeg uw eigen stijlattributen toe, gescheiden door puntkomma. Zonder deze parameter zal SmartTemplates automatisch 'display:none' invoegen om het gedeelte onzichtbaar te maken." + }, + "preheader.text": { + "message": "De voorbeeldtekst moet tussen dubbele aanhalingstekens staan, die ook het sleutelwoord *clipboard* kunnen bevatten. Als alternatief kunt u $clipboardLiteral$ of $selectionLiteral$ gebruiken (de laatste werkt alleen wanneer deze wordt gebruikt vanuit een Smart Snippet)", + "placeholders": { + "clipboardLiteral": { + "content": "$1", + "example": "clipboard" + }, + "selectionLiteral": { + "content": "$2", + "example": "\"*selection*\"" + } + } + }, "premiumConfig": { "message": "Premium-functies" }, diff --git a/_locales/pl/messages.json b/_locales/pl/messages.json index 6f9ee1b9a..415fa189a 100644 --- a/_locales/pl/messages.json +++ b/_locales/pl/messages.json @@ -1069,6 +1069,28 @@ "pref_variables.tab": { "message": "Zmienne" }, + "preheader": { + "message": "Tekst podglądu widoczny tylko dla mobilnych klientów poczty elektronicznej, który zostanie wstawiony na początku treści wiadomości e-mail." + }, + "preheader.className": { + "message": "[opcjonalnie] Możesz dodać klasę CSS, aby zmienić układ." + }, + "preheader.inlineStyles": { + "message": "[opcjonalnie] Dodaj własne style, oddzielone średnikiem. Bez tego parametru SmartTemplates automatycznie wstawi 'display:none', aby automatycznie ukryć sekcję." + }, + "preheader.text": { + "message": "Tekst podglądu musi być zawarty w podwójnych cudzysłowach, które mogą również zawierać słowo kluczowe *clipboard*. W alternatywie można użyć $clipboardLiteral$ lub $selectionLiteral$ (ten ostatni działa tylko wtedy, gdy jest używany z elementu Smart Snippet)", + "placeholders": { + "clipboardLiteral": { + "content": "$1", + "example": "clipboard" + }, + "selectionLiteral": { + "content": "$2", + "example": "\"*selection*\"" + } + } + }, "premiumConfig": { "message": "Funkcje premium" }, diff --git a/_locales/pt/messages.json b/_locales/pt/messages.json index 152540886..c40cfad93 100644 --- a/_locales/pt/messages.json +++ b/_locales/pt/messages.json @@ -1084,6 +1084,28 @@ "pref_variables.tab": { "message": "Variáveis" }, + "preheader": { + "message": "Um texto de pré-visualização apenas visível para clientes de correio móvel, que será inserido no início do corpo do e-mail." + }, + "preheader.className": { + "message": "[opcional] Você pode adicionar uma classe CSS para alterar o layout." + }, + "preheader.inlineStyles": { + "message": "[opcional] Adicione seus próprios atributos de estilo, separados por ponto e vírgula. Sem este parâmetro, o SmartTemplates inserirá 'display:none' para tornar a seção automaticamente invisível." + }, + "preheader.text": { + "message": "O texto de pré-visualização deve estar contido entre aspas duplas, que também podem conter a palavra-chave *clipboard*. Como alternativa, pode usar $clipboardLiteral$ ou $selectionLiteral$ (este último só funciona quando utilizado a partir de um Smart Snippet)", + "placeholders": { + "clipboardLiteral": { + "content": "$1", + "example": "clipboard" + }, + "selectionLiteral": { + "content": "$2", + "example": "\"*selection*\"" + } + } + }, "premiumConfig": { "message": "Recursos Premium" }, diff --git a/_locales/pt_BR/messages.json b/_locales/pt_BR/messages.json index c9bce3f3f..1aa20933a 100644 --- a/_locales/pt_BR/messages.json +++ b/_locales/pt_BR/messages.json @@ -1051,6 +1051,28 @@ "pref_variables.tab": { "message": "Variáveis" }, + "preheader": { + "message": "Um texto de pré-visualização apenas visível para clientes de correio móvel, que será inserido no início do corpo do e-mail." + }, + "preheader.className": { + "message": "[opcional] Você pode adicionar uma classe CSS para alterar o layout." + }, + "preheader.inlineStyles": { + "message": "[opcional] Adicione seus próprios atributos de estilo, separados por ponto e vírgula. Sem este parâmetro, o SmartTemplates inserirá 'display:none' para tornar a seção automaticamente invisível." + }, + "preheader.text": { + "message": "O texto de visualização deve ser contido entre aspas duplas, que também podem conter a palavra-chave *clipboard*. Como alternativa, você pode usar $clipboardLiteral$ ou $selectionLiteral$ (este último só funciona quando usado de um Smart Snippet)", + "placeholders": { + "clipboardLiteral": { + "content": "$1", + "example": "clipboard" + }, + "selectionLiteral": { + "content": "$2", + "example": "\"*selection*\"" + } + } + }, "premiumConfig": { "message": "Recursos Premium" }, diff --git a/_locales/ru/messages.json b/_locales/ru/messages.json index 5970b772a..bde8254f7 100644 --- a/_locales/ru/messages.json +++ b/_locales/ru/messages.json @@ -1084,6 +1084,28 @@ "pref_variables.tab": { "message": "Переменные" }, + "preheader": { + "message": "Текст предварительного просмотра, видимый только для мобильных почтовых клиентов, который будет вставлен в начале тела электронного письма." + }, + "preheader.className": { + "message": "[необязательно] Вы можете добавить CSS-класс для изменения макета." + }, + "preheader.inlineStyles": { + "message": "[необязательно] Добавьте свои собственные атрибуты стиля, разделенные точкой с запятой. Без этого параметра SmartTemplates вставит 'display:none', чтобы автоматически сделать раздел невидимым." + }, + "preheader.text": { + "message": "Текст предварительного просмотра должен находиться в двойных кавычках, которые также могут содержать ключевое слово *clipboard*. В качестве альтернативы, вы можете использовать $clipboardLiteral$ или $selectionLiteral$ (последнее работает только при использовании из Smart Snippet)", + "placeholders": { + "clipboardLiteral": { + "content": "$1", + "example": "clipboard" + }, + "selectionLiteral": { + "content": "$2", + "example": "\"*selection*\"" + } + } + }, "premiumConfig": { "message": "Премиум-функции" }, diff --git a/_locales/sl/messages.json b/_locales/sl/messages.json index db3f81331..678a84d4e 100644 --- a/_locales/sl/messages.json +++ b/_locales/sl/messages.json @@ -1075,6 +1075,28 @@ "pref_variables.tab": { "message": "Spremenljivke" }, + "preheader": { + "message": "Predogledni besedilo, ki je vidno le za mobilne poštne odjemalce, bo vstavljeno na začetek telesa e-pošte." + }, + "preheader.className": { + "message": "[neobvezno] Lahko dodate CSS razred za spremembo postavitve." + }, + "preheader.inlineStyles": { + "message": "[neobvezno] Dodajte svoje slogovne atribute, ločene s podpičjem. Brez tega parametra bo SmartTemplates samodejno vstavil 'display:none', da bo del samodejno neviden." + }, + "preheader.text": { + "message": "Predogled besedila mora biti v dvojnih narekovajih, ki lahko vsebujejo tudi ključno besedo *clipboard*. Kot alternativo lahko uporabite $clipboardLiteral$ ali $selectionLiteral$ (ta zadnji deluje samo, ko se uporablja iz pametnega odlomka)", + "placeholders": { + "clipboardLiteral": { + "content": "$1", + "example": "clipboard" + }, + "selectionLiteral": { + "content": "$2", + "example": "\"*selection*\"" + } + } + }, "premiumConfig": { "message": "Lastnosti premium" }, diff --git a/_locales/sr/messages.json b/_locales/sr/messages.json index 10b331d59..c1012a07a 100644 --- a/_locales/sr/messages.json +++ b/_locales/sr/messages.json @@ -1057,6 +1057,19 @@ "pref_variables.tab": { "message": "Променљиве" }, + "preheader.text": { + "message": "Tekst za pregled mora biti sadržan unutar dvostrukih navodnika, koji takođe mogu sadržati ključnu reč *clipboard*. Kao alternativu, možete koristiti $clipboardLiteral$ ili $selectionLiteral$ (poslednje funkcioniše samo kada se koristi iz Smart Snippet)", + "placeholders": { + "clipboardLiteral": { + "content": "$1", + "example": "clipboard" + }, + "selectionLiteral": { + "content": "$2", + "example": "\"*selection*\"" + } + } + }, "premiumConfig": { "message": "Премијум могућности" }, diff --git a/_locales/sv/messages.json b/_locales/sv/messages.json index 5e14c0b8e..aeff3657f 100644 --- a/_locales/sv/messages.json +++ b/_locales/sv/messages.json @@ -1123,6 +1123,19 @@ "pref_variables.tab": { "message": "Variabler" }, + "preheader.text": { + "message": "Förhandsvisningstexten måste vara innesluten i dubbla citat, som också kan innehålla nyckelordet *clipboard*. Som ett alternativ kan du använda $clipboardLiteral$ eller $selectionLiteral$ (det senare fungerar bara när det används från en Smart Snippet)", + "placeholders": { + "clipboardLiteral": { + "content": "$1", + "example": "clipboard" + }, + "selectionLiteral": { + "content": "$2", + "example": "\"*selection*\"" + } + } + }, "premiumConfig": { "message": "Premiumfunktioner" }, diff --git a/_locales/uk/messages.json b/_locales/uk/messages.json index c88c31e3a..b1fd10b85 100644 --- a/_locales/uk/messages.json +++ b/_locales/uk/messages.json @@ -1133,6 +1133,19 @@ "pref_variables.tab": { "message": "Змінні" }, + "preheader.text": { + "message": "Текст попереднього перегляду повинен бути у подвійних лапках, які також можуть містити ключове слово *clipboard*. Як альтернативу, ви можете використовувати $clipboardLiteral$ або $selectionLiteral$ (останнє працює лише при використанні з Smart Snippet)", + "placeholders": { + "clipboardLiteral": { + "content": "$1", + "example": "clipboard" + }, + "selectionLiteral": { + "content": "$2", + "example": "\"*selection*\"" + } + } + }, "premiumConfig": { "message": "Преміальні функції" }, diff --git a/_locales/zh_CN/messages.json b/_locales/zh_CN/messages.json index c02fd9cef..c4a1c271b 100644 --- a/_locales/zh_CN/messages.json +++ b/_locales/zh_CN/messages.json @@ -1117,6 +1117,29 @@ "pref_variables.tab": { "message": "变量" }, + "preheader": { + "message": "仅在移动邮件客户端可见的预览文本,将插入到电子邮件正文的开头。" + }, + "preheader.className": { + "message": "[可选] 您可以添加一个 CSS 类来更改布局。" + }, + "preheader.inlineStyles": { + "message": "[可选] 添加您自己的样式属性,以分号分隔。没有这个参数,SmartTemplates 将插入 'display:none' 来自动使该部分不可见。" + }, + + "preheader.text": { + "message": "预览文本必须包含在双引号内,双引号也可以包含 *clipboard* 关键字。或者您可以使用 $clipboardLiteral$ 或 $selectionLiteral$(后者仅在从智能片段使用时有效)", + "placeholders": { + "clipboardLiteral": { + "content": "$1", + "example": "clipboard" + }, + "selectionLiteral": { + "content": "$2", + "example": "\"*selection*\"" + } + } + }, "premiumConfig": { "message": "高级功能" }, diff --git a/_locales/zh_TW/messages.json b/_locales/zh_TW/messages.json index a7bd8fab2..f39161a9d 100644 --- a/_locales/zh_TW/messages.json +++ b/_locales/zh_TW/messages.json @@ -1123,6 +1123,28 @@ "pref_variables.tab": { "message": "變數" }, + "preheader": { + "message": "僅在移動郵件客戶端可見的預覽文本,將插入到電子郵件正文的開頭。" + }, + "preheader.className": { + "message": "[可選] 您可以添加一個 CSS 類來更改佈局。" + }, + "preheader.inlineStyles": { + "message": "[可選] 添加您自己的樣式屬性,以分號分隔。沒有這個參數,SmartTemplates 將插入 'display:none' 來自動使該部分不可見。" + }, + "preheader.text": { + "message": "預覽文本必須包含在雙引號內,雙引號也可以包含 *clipboard* 關鍵字。或者您可以使用 $clipboardLiteral$ 或 $selectionLiteral$(後者僅在從智能片段使用時有效)", + "placeholders": { + "clipboardLiteral": { + "content": "$1", + "example": "clipboard" + }, + "selectionLiteral": { + "content": "$2", + "example": "\"*selection*\"" + } + } + }, "premiumConfig": { "message": "高級功能" }, diff --git a/chrome/content/help.xhtml b/chrome/content/help.xhtml index 9a9ec3f19..8bb5b881e 100644 --- a/chrome/content/help.xhtml +++ b/chrome/content/help.xhtml @@ -67,6 +67,8 @@ __MSG_parameter.escapeCommas__ \,

__MSG_parameters__

+
  • headerText : + __MSG_preheader.text__
  • className : __MSG_preheader.className__
  • inlineStyles : __MSG_preheader.inlineStyles__
  • diff --git a/chrome/content/smartTemplate-compose.js b/chrome/content/smartTemplate-compose.js index 20e257461..c8e187d88 100644 --- a/chrome/content/smartTemplate-compose.js +++ b/chrome/content/smartTemplate-compose.js @@ -111,8 +111,8 @@ SmartTemplate4.classSmartTemplate = function() { util.logDebugOptional( 'functions','extractSignature()\nSTART========== extractSignature(' + Ident + ', defined type=' + signatureDefined + ', compose type=' + composeType + ') ========'); - let bodyEl = gMsgCompose.editor.rootElement, - nodes = gMsgCompose.editor.rootElement.childNodes; + let bodyEl = SmartTemplate4.composer.body, + nodes = bodyEl.childNodes; SmartTemplate4.signature = null; SmartTemplate4.sigInTemplate = false; @@ -483,7 +483,7 @@ SmartTemplate4.classSmartTemplate = function() { function countLF(str) { return str.split("\n").length - 1; } util.logDebugOptional('functions','SmartTemplate4.delReplyHeader()'); - let rootEl = gMsgCompose.editor.rootElement, + let rootEl = SmartTemplate4.composer.body, pref = SmartTemplate4.pref, lines = 0; if (pref.getCom("mail.identity." + idKey + ".reply_on_top", 1) == 1) { @@ -659,7 +659,7 @@ SmartTemplate4.classSmartTemplate = function() { util.logDebugOptional('functions.delForwardHeader','Retrieved Delimiter Token from mime properties: ' + origMsgDelimiter); // Delete original headers - let rootEl = gMsgCompose.editor.rootElement, + let rootEl = SmartTemplate4.composer.body, node = rootEl.firstChild, firstNode = null, skipInPlainText = !gMsgCompose.composeHTML, @@ -730,7 +730,7 @@ SmartTemplate4.classSmartTemplate = function() { } function delForwardedBody() { - let rootEl = gMsgCompose.editor.rootElement; + let rootEl = SmartTemplate4.composer.body; let bdy = rootEl.querySelector("div.moz-forward-container"); if (bdy) { bdy.parentNode.removeChild(bdy); @@ -743,8 +743,8 @@ SmartTemplate4.classSmartTemplate = function() { function removePreviousTemplate() { try { util.logDebugOptional('functions','SmartTemplate4.removePreviousTemplate()'); - let curEl = gMsgCompose.editor.rootElement.firstChild, - nextEl = gMsgCompose.editor.rootElement.firstChild; + let curEl = SmartTemplate4.composer.body.firstChild, + nextEl = curEl; if (nextEl && nextEl.nodeName == "PRE") { nextEl = nextEl.firstChild; } @@ -766,7 +766,7 @@ SmartTemplate4.classSmartTemplate = function() { } // Restore original quote headers while (orgQuoteHeaders.length > 0) { - gMsgCompose.editor.insertNode(orgQuoteHeaders.pop(), gMsgCompose.editor.rootElement, 0); + gMsgCompose.editor.insertNode(orgQuoteHeaders.pop(), SmartTemplate4.composer.body, 0); } } catch(ex) { @@ -1274,7 +1274,7 @@ SmartTemplate4.classSmartTemplate = function() { templateDiv, // new global settings to deal with [Bug 25084] breaksAtTop = prefs.getMyIntPref("breaksAtTop"), - bodyEl = gMsgCompose.editor.rootElement, + bodyEl = SmartTemplate4.composer.body, preheaderEl = null, bodyContent = ''; @@ -1406,7 +1406,7 @@ SmartTemplate4.classSmartTemplate = function() { for (let i = 0; i < breaksAtTop; i++) { gMsgCompose.editor.insertNode( util.mailDocument.createElement("br"), - gMsgCompose.editor.rootElement, 0); + SmartTemplate4.composer.body, 0); } // the first Child should be BLOCKQUOTE (header is inserted afterwards) util.logDebugOptional('composer','Reply on Top - inserting template before first root child'); @@ -1414,7 +1414,7 @@ SmartTemplate4.classSmartTemplate = function() { } else { for (let i = 0; i < breaksAtTop; i++) { - gMsgCompose.editor.rootElement.appendChild(util.mailDocument.createElement("br")); + SmartTemplate4.composer.body.appendChild(util.mailDocument.createElement("br")); } util.logDebugOptional('composer','Reply at Botton - appending template to first root child'); targetNode = editor.rootElement.appendChild(templateDiv); // after BLOCKQUOTE (hopefully) @@ -1648,18 +1648,7 @@ SmartTemplate4.classSmartTemplate = function() { } if (SmartTemplate4.PreprocessingFlags.preHeader) { // [issue 274] - if (!util.hasLicense() || util.licenseInfo.keyType == 2) { - util.addUsedPremiumFunction("preheader"); - } - - let span = util.mailDocument.createElement("span"); - const preH = SmartTemplate4.PreprocessingFlags.preHeader; - span.textContent = preH.text; - span.setAttribute("style", preH.styleContent); - if (preH.classNames) { - span.setAttribute("class", preH.classNames); - } - preheaderEl = span; + preheaderEl = SmartTemplate4.composer.buildPreHeaderElement(SmartTemplate4.PreprocessingFlags.preHeader); } // PREMIUM FUNCTIONS @@ -1855,9 +1844,8 @@ SmartTemplate4.classSmartTemplate = function() { await SmartTemplate4.Util.resolveDeferredBatch(gMsgCompose.editor); if (preheaderEl) { - bodyEl.insertBefore(preheaderEl, bodyEl.firstChild); + SmartTemplate4.composer.injectPreHeaderElement(preheaderEl, bodyEl); } - resetDocument(gMsgCompose.editor, startup); diff --git a/chrome/content/smartTemplate-composer.js b/chrome/content/smartTemplate-composer.js index 0a80fa9a2..7ce8925e7 100644 --- a/chrome/content/smartTemplate-composer.js +++ b/chrome/content/smartTemplate-composer.js @@ -221,7 +221,36 @@ SmartTemplate4.composer = { // update for license changes initLicensedUI: function () { + }, + + buildPreHeaderElement: function(preHeader) { + const util = SmartTemplate4.Util; + if (!util.hasLicense() || util.licenseInfo.keyType == 2) { + util.addUsedPremiumFunction("preheader"); + } + + let span = util.mailDocument.createElement("span"); + const preH = preHeader; + span.textContent = preH.text; + span.setAttribute("style", preH.styleContent); + if (preH.classNames) { + span.setAttribute("class", preH.classNames); + } + return span; + }, + + injectPreHeaderElement: function(preheaderEl, bodyElement) { + if (!bodyElement) { + bodyElement = SmartTemplate4.composer.body; + } + bodyElement.insertBefore(preheaderEl, bodyElement.firstChild); + } , + + get body() { + return gMsgCompose.editor.rootElement; } + + }; diff --git a/chrome/content/smartTemplate-fileTemplates.js b/chrome/content/smartTemplate-fileTemplates.js index f43304fc4..33a8f44b5 100644 --- a/chrome/content/smartTemplate-fileTemplates.js +++ b/chrome/content/smartTemplate-fileTemplates.js @@ -1573,7 +1573,7 @@ SmartTemplate4.fileTemplates = { selectedText = SmartTemplate4.smartTemplate.unpackSelection(sel); } if (selectedText && selectedText.length) { - html = html.replace("*selection*", selectedText); + html = html.replace("*selection*", selectedText.replaceAll(",","\\,")); // escape all commas } else { html = html.replace("*selection*", "%cursor%"); } diff --git a/chrome/content/smartTemplate-help.js b/chrome/content/smartTemplate-help.js index 7a620422d..1bb451f1e 100644 --- a/chrome/content/smartTemplate-help.js +++ b/chrome/content/smartTemplate-help.js @@ -60,6 +60,13 @@ SmartTemplate4.Help = { SmartTemplate4.Listener.listen, false, true); + // additional localisation (with parameters) + let variablesDocument = document.getElementById("helpFrame")?.contentDocument; + let preheaderDesc = variablesDocument?.getElementById("preHeaderText"); + if (preheaderDesc) { + preheaderDesc.textContent = + SmartTemplate4.Util.getBundleString("preheader.text",["clipboard", '"*selection*"']); + } } , onUnload : function() { diff --git a/chrome/content/smartTemplate-main.js b/chrome/content/smartTemplate-main.js index a1cddac53..ec9ed8432 100644 --- a/chrome/content/smartTemplate-main.js +++ b/chrome/content/smartTemplate-main.js @@ -329,7 +329,9 @@ END LICENSE BLOCK # [issue 267] Support for extracting prefix and suffix from address book fields # [issue 276] Removed FileUtils.getFile for future compatibility (122 beta) # Removed duplicate tooltip on active fields in write new mail - # [issue 274] Add %preheader()% variable for injecting preview + # [issue 274] Add %preheader()% variable for injecting preview + # [issue 280] You can now use escaped commas within commands that search or replace strings + # %replaceText% and %deleteText% now work on the body of the email when used from the Smart Fragments menu ========================= @@ -755,7 +757,7 @@ var SmartTemplate4 = { // try replacing the (unprocessed) signature that Thunderbird has inserted. if (prefs.getMyBoolPref('parseSignature') && newSig ) { // find and replace signature node. - let sigNode = util.findChildNode(gMsgCompose.editor.rootElement, 'moz-signature'); + let sigNode = util.findChildNode(SmartTemplate4.composer.body, 'moz-signature'); if (sigNode) { sigNode.innerHTML = newSig.innerHTML; } diff --git a/chrome/content/smartTemplate-overlay.js b/chrome/content/smartTemplate-overlay.js index a422e4023..8fd08c88f 100644 --- a/chrome/content/smartTemplate-overlay.js +++ b/chrome/content/smartTemplate-overlay.js @@ -1895,7 +1895,7 @@ SmartTemplate4.parseModifier = function(msg, composeType, firstPass = false) { util.logDebugOptional('parseModifier',"Extracting " + rx + " from Subject:\n" + extractSource); break; case 'body': - let rootEl = gMsgCompose.editor.rootElement; + let rootEl = SmartTemplate4.composer.body; extractSource = rootEl.innerText; // util.popupLicenseNotification("matchTextFromBody", true, true); util.addUsedPremiumFunction('matchTextFromBody'); @@ -2087,10 +2087,10 @@ SmartTemplate4.parseModifier = function(msg, composeType, firstPass = false) { return "<" + aS + ">"; } - function replaceBody(findX, replaceX) { + function replaceInBody(findX, replaceX) { // iterate all childNodes except for blockquotes. const ELEMENT_NODE = 1, TEXT_NODE = 3; - let rootEl = gMsgCompose.editor.rootElement; + let rootEl = SmartTemplate4.composer.body; for (let i=0; i1) ? parseInt(theStrings[1]) : 1, - rootEl = gMsgCompose.editor.rootElement; + rootEl = SmartTemplate4.composer.body; const isForwardInline = (util.isComposeTypeIsForwardInline() && minQuoteLevel == 0); if (dText && dText.length) { @@ -2247,7 +2249,7 @@ SmartTemplate4.parseModifier = function(msg, composeType, firstPass = false) { let minQuoteLevel = params.p3, s = util.unquotedRegex(params.p1, true), r = util.unquotedRegex(params.p2), - rootEl = gMsgCompose.editor.rootElement; + rootEl = SmartTemplate4.composer.body; const isForwardInline = (util.isComposeTypeIsForwardInline() && minQuoteLevel == 0); if (!isHTML) { @@ -2297,7 +2299,7 @@ SmartTemplate4.parseModifier = function(msg, composeType, firstPass = false) { dText = theStrings[0].match( /(\"[^)].*\")/ ), // get argument (includes quotation marks) minQuoteLevel = (theStrings.length>1) ? parseInt(theStrings[1]) : 1, minSize = (theStrings.length>2) ? parseInt(theStrings[2]) : 0, - rootEl = gMsgCompose.editor.rootElement; + rootEl = SmartTemplate4.composer.body; const isForwardInline = (util.isComposeTypeIsForwardInline() && minQuoteLevel == 0); // [issue 172] treat forwarded text as "quote" @@ -2363,7 +2365,7 @@ SmartTemplate4.parseModifier = function(msg, composeType, firstPass = false) { minSize = params.p4 || 0, s = util.unquotedRegex(params.p1), r = util.unquotedRegex(params.p2), - rootEl = gMsgCompose.editor.rootElement; + rootEl = SmartTemplate4.composer.body; const isForwardInline = (util.isComposeTypeIsForwardInline() && minQuoteLevel == 0); // [issue 172] treat forwarded text as "quote" @@ -2792,7 +2794,7 @@ SmartTemplate4.regularize = async function regularize(msg, composeType, isStatio util.logDebugOptional('parseModifier',"Extracting " + rx + " from Subject:\n" + extractSource); break; case 'body': - let rootEl = gMsgCompose.editor.rootElement; + let rootEl = SmartTemplate4.composer.body; // we may still need to remove the div.moz-cite-prefix, let's look for a blockquote if (rootEl.childNodes.length) { for (let c=0; c