Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions _locales/bg/messages.json
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,9 @@
"customPrompts_form_label_use_diff_viewer_title": {
"message": "Инструментът за сравнение на текст може да бъде избран, когато действието е зададено на „Замести текст“."
},
"customPrompts_form_label_clean_embedded_images": {
"message": "Премахване на вградените изображения от HTML на промпта"
},
"customPrompts_form_required_fields": {
"message": "Задължително поле"
},
Expand Down
3 changes: 3 additions & 0 deletions _locales/cs/messages.json
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,9 @@
"customPrompts_form_label_Name": {
"message": "Název"
},
"customPrompts_form_label_clean_embedded_images": {
"message": "Odebrat vložené obrázky z HTML výzvy"
},
"customPrompts_form_required_fields": {
"message": "Požadovaná pole"
},
Expand Down
3 changes: 3 additions & 0 deletions _locales/de/messages.json
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,9 @@
"customPrompts_form_label_enabled": {
"message": "Aktiviert"
},
"customPrompts_form_label_clean_embedded_images": {
"message": "Eingebettete Bilder aus dem Prompt-HTML entfernen"
},
"customPrompts_form_required_fields": {
"message": "Erforderliche Felder"
},
Expand Down
3 changes: 3 additions & 0 deletions _locales/el/messages.json
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,9 @@
"customPrompts_form_label_use_diff_viewer_title": {
"message": "Η προβολή σύγκρισης κειμένου μπορεί να επιλεγεί όταν η ενέργεια έχει οριστεί σε \"Αντικατάσταση κειμένου\"."
},
"customPrompts_form_label_clean_embedded_images": {
"message": "Αφαίρεση ενσωματωμένων εικόνων από το HTML του prompt"
},
"customPrompts_form_required_fields": {
"message": "Απαιτούμενα πεδία"
},
Expand Down
8 changes: 8 additions & 0 deletions _locales/en/messages.json
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,10 @@
"message": "The text comparison viewer can be selected when the action is set to \"Substitute text\".",
"description": ""
},
"customPrompts_form_label_clean_embedded_images": {
"message": "Remove embedded images from prompt HTML",
"description": ""
},
"customPrompts_form_required_fields": {
"message": "Required fields",
"description": ""
Expand Down Expand Up @@ -1080,6 +1084,10 @@
"message": "Typed text before the quoted mail body",
"description": ""
},
"placeholder_mail_typed_html": {
"message": "Typed HTML formatted text before the quoted mail body. Recommended system instruction: 'Return directly in HTML code when provided with HTML email text'",
"description": ""
},
"placeholder_mail_quoted_text": {
"message": "Quoted text in the mail body",
"description": ""
Expand Down
3 changes: 3 additions & 0 deletions _locales/eo/messages.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,9 @@
"customPrompts_btnCancel": {
"message": "Nuligi"
},
"customPrompts_form_label_clean_embedded_images": {
"message": "Forigi enigitajn bildojn el la prompta HTML-kodo"
},
"customPrompts_form_required_fields": {
"message": "Postulataj kampoj"
},
Expand Down
3 changes: 3 additions & 0 deletions _locales/es/messages.json
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,9 @@
"customPrompts_form_label_use_diff_viewer_title": {
"message": "El visor de comparación de texto se puede seleccionar cuando la acción se establece en \"sustituir texto\"."
},
"customPrompts_form_label_clean_embedded_images": {
"message": "Eliminar imágenes incrustadas del HTML del prompt"
},
"customPrompts_form_required_fields": {
"message": "Campos obligatorios"
},
Expand Down
3 changes: 3 additions & 0 deletions _locales/fr/messages.json
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,9 @@
"customPrompts_form_label_enabled": {
"message": "Activé"
},
"customPrompts_form_label_clean_embedded_images": {
"message": "Supprimer les images intégrées du HTML du prompt"
},
"customPrompts_form_required_fields": {
"message": "Champs obligatoires"
},
Expand Down
3 changes: 3 additions & 0 deletions _locales/hr/messages.json
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,9 @@
"customPrompts_form_label_enabled": {
"message": "Omogućeno"
},
"customPrompts_form_label_clean_embedded_images": {
"message": "Ukloni ugrađene slike iz HTML-a odziva"
},
"customPrompts_form_required_fields": {
"message": "Obavezna polja"
},
Expand Down
3 changes: 3 additions & 0 deletions _locales/hu/messages.json
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,9 @@
"customPrompts_form_label_use_diff_viewer_title": {
"message": "A szöveg-összehasonlító nézet akkor választható ki, ha a művelet \"Szöveg helyettesítése\"-re van állítva."
},
"customPrompts_form_label_clean_embedded_images": {
"message": "Beágyazott képek eltávolítása a prompt HTML-kódjából"
},
"customPrompts_form_required_fields": {
"message": "Kötelező mezők"
},
Expand Down
3 changes: 3 additions & 0 deletions _locales/id/messages.json
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,9 @@
"customPrompts_form_label_use_diff_viewer_title": {
"message": "Penampil perbandingan teks dapat dipilih ketika tindakan diatur ke \"Ganti teks\"."
},
"customPrompts_form_label_clean_embedded_images": {
"message": "Hapus gambar tersemat dari HTML prompt"
},
"customPrompts_form_required_fields": {
"message": "Kolom wajib diisi"
},
Expand Down
3 changes: 3 additions & 0 deletions _locales/it/messages.json
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,9 @@
"customPrompts_form_label_need_custom_text": {
"message": "Chiedi un testo aggiuntivo"
},
"customPrompts_form_label_clean_embedded_images": {
"message": "Rimuovi immagini incorporate dall'HTML del prompt"
},
"customPrompts_form_label_enabled": {
"message": "Attivo"
},
Expand Down
3 changes: 3 additions & 0 deletions _locales/ja/messages.json
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,9 @@
"customPrompts_form_label_use_diff_viewer_title": {
"message": "テキスト比較ビューアは、アクションが「テキストを置換」に設定されている場合に選択できます。"
},
"customPrompts_form_label_clean_embedded_images": {
"message": "プロンプトHTMLから埋め込み画像を削除"
},
"customPrompts_form_required_fields": {
"message": "必須フィールド"
},
Expand Down
6 changes: 5 additions & 1 deletion _locales/nb_NO/messages.json
Original file line number Diff line number Diff line change
@@ -1 +1,5 @@
{}
{
"customPrompts_form_label_clean_embedded_images": {
"message": "Fjern innebygde bilder fra prompt-HTML"
}
}
5 changes: 4 additions & 1 deletion _locales/nl/messages.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
{
"extensionDescription": {
"message": "Gebruik ChatGPT, Google Gemini, Claude of Ollama om uw emails te verbeteren."
},
"customPrompts_form_label_clean_embedded_images": {
"message": "Ingebedde afbeeldingen verwijderen uit prompt-HTML"
}
}
}
3 changes: 3 additions & 0 deletions _locales/pl/messages.json
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,9 @@
"customPrompts_form_label_enabled": {
"message": "Włączone"
},
"customPrompts_form_label_clean_embedded_images": {
"message": "Usuń osadzone obrazy z HTML prompta"
},
"customPrompts_form_required_fields": {
"message": "Pola wymagane"
},
Expand Down
3 changes: 3 additions & 0 deletions _locales/pt-br/messages.json
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,9 @@
"customPrompts_form_label_enabled": {
"message": "Ativado"
},
"customPrompts_form_label_clean_embedded_images": {
"message": "Remover imagens incorporadas do HTML do prompt"
},
"customPrompts_form_required_fields": {
"message": "Campos obrigatórios"
},
Expand Down
3 changes: 3 additions & 0 deletions _locales/pt/messages.json
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,9 @@
"customPrompts_form_label_enabled": {
"message": "Ativo"
},
"customPrompts_form_label_clean_embedded_images": {
"message": "Remover imagens incorporadas do HTML do prompt"
},
"customPrompts_form_required_fields": {
"message": "Campos obrigatórios"
},
Expand Down
3 changes: 3 additions & 0 deletions _locales/ro/messages.json
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,9 @@
"customPrompts_form_label_need_custom_text": {
"message": "Solicită text suplimentar"
},
"customPrompts_form_label_clean_embedded_images": {
"message": "Elimină imaginile încorporate din HTML-ul promptului"
},
"customPrompts_form_required_fields": {
"message": "Câmpuri necesare"
},
Expand Down
3 changes: 3 additions & 0 deletions _locales/ru/messages.json
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,9 @@
"customPrompts_form_label_use_diff_viewer_title": {
"message": "Средство просмотра для сравнения текста можно выбрать, если для действия установлено значение \"Заменить текст\"."
},
"customPrompts_form_label_clean_embedded_images": {
"message": "Удалять встроенные изображения из HTML промпта"
},
"customPrompts_form_required_fields": {
"message": "Обязательные поля"
},
Expand Down
6 changes: 5 additions & 1 deletion _locales/sk/messages.json
Original file line number Diff line number Diff line change
@@ -1 +1,5 @@
{}
{
"customPrompts_form_label_clean_embedded_images": {
"message": "Odstrániť vložené obrázky z HTML výzvy"
}
}
3 changes: 3 additions & 0 deletions _locales/sv/messages.json
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,9 @@
"customPrompts_reloading_menus": {
"message": "Laddar om menyer..."
},
"customPrompts_form_label_clean_embedded_images": {
"message": "Ta bort inbäddade bilder från prompt-HTML"
},
"customPrompts_form_required_fields": {
"message": "Obligatoriska fält"
},
Expand Down
5 changes: 4 additions & 1 deletion _locales/tr/messages.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,5 +16,8 @@
},
"customPrompts_start_saving": {
"message": "Promptlar kaydediliyor…"
},
"customPrompts_form_label_clean_embedded_images": {
"message": "Gömülü görselleri prompt HTML'sinden kaldır"
}
}
}
3 changes: 3 additions & 0 deletions _locales/zh_Hans/messages.json
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,9 @@
"customPrompts_form_label_need_custom_text": {
"message": "要求补充文字"
},
"customPrompts_form_label_clean_embedded_images": {
"message": "从提示词 HTML 中移除嵌入的图片"
},
"customPrompts_form_required_fields": {
"message": "必填字段"
},
Expand Down
3 changes: 3 additions & 0 deletions _locales/zh_Hant/messages.json
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,9 @@
"customPrompts_form_label_use_diff_viewer": {
"message": "啟用文字比較檢視器"
},
"customPrompts_form_label_clean_embedded_images": {
"message": "從提示詞 HTML 中移除嵌入的圖片"
},
"customPrompts_form_required_fields": {
"message": "必填欄位"
},
Expand Down
2 changes: 1 addition & 1 deletion api_webchat/streamingMessage.js
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ export class StreamingMessage {
this._thinkingAccumulator = '';

// Convert Markdown to DOM nodes using the markdown-it library
const md = window.markdownit();
const md = window.markdownit({ html: true });
const html = md.render(fullText);

this._fullTextHTML += html;
Expand Down
1 change: 1 addition & 0 deletions claude-spec/02-prompts.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ Prompts are the core user-facing feature of ThunderAI. Each prompt defines an AI
| `need_custom_text` | string | `"0"` = no custom input, `"1"` = show custom text input field |
| `define_response_lang` | string | `"0"` = no language hint, `"1"` = append response language instruction |
| `use_diff_viewer` | string | `"0"` = normal output, `"1"` = show diff viewer (ChatGPT Web only) |
| `clean_embedded_images` | string | `"0"` = keep raw embedded images, `"1"` = tokenize embedded images in HTML placeholders and restore them in AI output |

> **Note:** These numeric-looking properties are stored as **strings** (`"0"`/`"1"`/`"2"`) in the prompt objects in `js/mzta-prompts.js`, not as JS numbers. The prompt body lives in the `text` property (there is no `prompt` property).

Expand Down
3 changes: 2 additions & 1 deletion claude-spec/03-placeholders.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,8 @@ placeholders with `is_dynamic: "1"` (take a parameter after `:`).
|----|-------------|------|-----|
| `mail_text_body` | Full plain text of the email | 0 | |
| `mail_html_body` | Full HTML of the email | 0 | |
| `mail_typed_text` | Text typed so far in compose window | 2 | |
| `mail_typed_text` | Text typed so far in compose window (plain text) | 2 | |
| `mail_typed_html` | HTML formatted text typed so far in compose window. *Tip: Recommended system prompt: "Return directly in HTML code when provided with HTML code as email text"* | 2 | |
| `mail_quoted_text` | Quoted text in the compose window | 2 | |
| `mail_subject` | Email subject line | 0 | |
| `mail_folder_name` | Name of the folder containing the email | 1 | |
Expand Down
89 changes: 87 additions & 2 deletions js/mzta-compose-script.js
Original file line number Diff line number Diff line change
Expand Up @@ -302,9 +302,43 @@ switch (message.command) {
}
const r = sel.getRangeAt(0);
r.deleteContents();

let cleanText = message.text || '';
// Strip markdown code fences if response is wrapped in ```html ... ``` or ``` ... ```
const codeBlockMatch = cleanText.trim().match(/^```(?:html)?\s*\n?([\s\S]*?)\n?```$/i);
if (codeBlockMatch) {
cleanText = codeBlockMatch[1];
}

// Decode HTML entities if text contains escaped tags (e.g. <p> or <div>)
while (cleanText.includes('<') && (cleanText.includes('>') || cleanText.includes('"'))) {
const txt = document.createElement('textarea');
txt.innerHTML = cleanText;
const decoded = txt.value;
if (decoded === cleanText) break;
cleanText = decoded;
}

const parser = new DOMParser();
const doc = parser.parseFromString(message.text, 'text/html');
r.insertNode(doc.body);
let doc = parser.parseFromString(cleanText, 'text/html');

// Remove UI elements (buttons, SVGs, forms, scripts, inputs, navigation, etc.)
doc.querySelectorAll('button, svg, script, style, form, input, textarea, header, footer, nav, use').forEach(el => el.remove());

// If ChatGPT/webchat wrapper container (.markdown or [data-message-author-role]) is present, extract content directly from it
let targetContainer = doc.querySelector('.markdown') || doc.querySelector('[data-message-author-role="assistant"]') || doc.body;

// If targetContainer contains literal string HTML tags like "<p>", re-parse its textContent into real DOM elements
if (/^\s*<[a-z][^>]*>/i.test(targetContainer.textContent.trim())) {
const innerDoc = parser.parseFromString(targetContainer.textContent.trim(), 'text/html');
targetContainer = innerDoc.body;
}

const fragment = document.createDocumentFragment();
while (targetContainer.firstChild) {
fragment.appendChild(targetContainer.firstChild);
}
r.insertNode(fragment);
browser.runtime.sendMessage({command: "compose_reloadBody", tabId: message.tabId});
return Promise.resolve(true);
}
Expand Down Expand Up @@ -375,6 +409,57 @@ switch (message.command) {
return Promise.resolve(t);
}

case "getOnlyTypedHtml": {
const children = window.document.body.childNodes;
const selection = window.getSelection();

let firstNode = null;
let lastNode = null;
const container = document.createElement('div');

for (const node of children) {
if (node instanceof Element) {
if (node.classList.contains('moz-cite-prefix') || node.classList.contains('moz-forward-container')) {
break;
}
if (MZTA_INJECTED_SELECTORS.some(sel => node.matches && node.matches(sel))) {
continue;
}
}
container.appendChild(node.cloneNode(true));

if (!firstNode) {
firstNode = node;
}
if (node.textContent && node.textContent.trim() !== '') {
lastNode = node;
}
}

if (!lastNode) {
lastNode = firstNode;
}

if (message.do_autoselect && firstNode && lastNode) {
const range = document.createRange();
range.setStartBefore(firstNode);
range.setEndAfter(lastNode);
selection.removeAllRanges();
selection.addRange(range);
}

let resultHtml = container.innerHTML;
// Un-nest ProseMirror or editor wrapper elements if present
const tempDiv = document.createElement('div');
tempDiv.innerHTML = resultHtml;
const pmWrapper = tempDiv.querySelector('.ProseMirror');
if (pmWrapper) {
resultHtml = pmWrapper.innerHTML;
}

return Promise.resolve(resultHtml);
}

case "getOnlyQuotedText": {
let t = '';
const children = window.document.body.childNodes;
Expand Down
Loading