// ==UserScript== // @name Dynamic RTL/LTR Direction // @namespace http://tampermonkey.net/ // @version V4 // @description Dynamically set text direction for Deepseek chat elements based on content // @author Reda Elsayed // @match https://chat.deepseek.com/ // @match https://chat.deepseek.com/* // @match https://chat.deepseek.com/*/chat/*/* // @icon https://www.deepseek.com/path/to/icon.png // @grant none // @downloadURL none // ==/UserScript== (function () { "use strict"; const textareaClass = "c92459f0"; const targetClass = "ds-markdown ds-markdown--block"; const codeClass = "md-code-block"; const submitButtonClass = "f6d670"; function isRTL(text) { const rtlPattern = /[\u0591-\u07FF\uFB1D-\uFDFD\uFE70-\uFEFC]/; return rtlPattern.test(text); } function updateDirection() { const targetElements = document.getElementsByClassName(targetClass); const codeElements = document.getElementsByClassName(codeClass); if (targetElements.length > 0) { const latestElement = targetElements[targetElements.length - 1]; const textContent = latestElement.textContent.trim(); const newDirection = isRTL(textContent) ? "rtl" : "ltr"; if (textContent.length > 0 && latestElement.style.direction !== newDirection) { latestElement.style.direction = newDirection; } for (let i = 0; i < codeElements.length; i++) { codeElements[i].style.direction = "ltr"; } } } function startObserving() { const observer = new MutationObserver((mutationsList) => { for (const mutation of mutationsList) { if (mutation.type === "childList" && mutation.addedNodes.length > 0) { updateDirection(); } } }); observer.observe(document.body, { childList: true, subtree: true }); } function handleSubmitButtonClick() { const submitButton = document.getElementsByClassName(submitButtonClass)[0]; if (submitButton) { submitButton.addEventListener("click", () => { setTimeout(updateDirection, 500); }); } } updateDirection(); startObserving(); handleSubmitButtonClick(); })();