Dynamic DeepSeek RTL/LTR Direction

Dynamically set text direction for Deepseek chat elements based on content

K instalaci tototo skriptu si budete muset nainstalovat rozšíření jako Tampermonkey, Greasemonkey nebo Violentmonkey.

You will need to install an extension such as Tampermonkey to install this script.

K instalaci tohoto skriptu si budete muset nainstalovat rozšíření jako Tampermonkey nebo Violentmonkey.

K instalaci tohoto skriptu si budete muset nainstalovat rozšíření jako Tampermonkey nebo Userscripts.

You will need to install an extension such as Tampermonkey to install this script.

K instalaci tohoto skriptu si budete muset nainstalovat manažer uživatelských skriptů.

(Už mám manažer uživatelských skriptů, nechte mě ho nainstalovat!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(Už mám manažer uživatelských stylů, nechte mě ho nainstalovat!)

// ==UserScript==
// @name          Dynamic DeepSeek RTL/LTR Direction
// @namespace     http://tampermonkey.net/
// @version       V4.1
// @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
// ==/UserScript==

(function () {
  "use strict";

  const textareaClass = "c92459f0";
  const targetClass = "ds-markdown ds-markdown--block";
  const codeClass = "md-code-block";

  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);

    Array.from(targetElements).forEach((element) => {
      const textContent = element.textContent.trim();
      const newDirection = isRTL(textContent) ? "rtl" : "ltr";

      if (textContent.length > 0 && element.style.direction !== newDirection) {
        element.style.direction = newDirection;
        element.style.textAlign = newDirection === "rtl" ? "right" : "left";
      }
    });

    Array.from(codeElements).forEach((element) => {
      element.style.direction = "ltr";
      element.style.textAlign = "left";
    });
  }

  function observeChanges() {
    const observer = new MutationObserver(() => {
      updateDirection();
    });

    observer.observe(document.body, { childList: true, subtree: true });
  }

  function observeTextArea() {
    const textAreaElements = document.getElementsByClassName(textareaClass);
    Array.from(textAreaElements).forEach((textArea) => {
      textArea.addEventListener("input", () => {
        const text = textArea.value.trim();
        const direction = isRTL(text) ? "rtl" : "ltr";
        textArea.style.direction = direction;
        textArea.style.textAlign = direction === "rtl" ? "right" : "left";
      });
    });
  }

  function applyToExistingMessages() {
    // Ensure all existing messages have the correct direction on load
    updateDirection();
  }

  // Initialize the script
  applyToExistingMessages();
  observeChanges();
  observeTextArea();
})();