Dynamic RTL/LTR Direction

Dynamically set text direction for Deepseek chat elements based on content

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey, Greasemonkey of Violentmonkey.

Voor het installeren van scripts heb je een extensie nodig, zoals {tampermonkey_link:Tampermonkey}.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey of Violentmonkey.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey of Userscripts.

Voor het installeren van scripts heb je een extensie nodig, zoals {tampermonkey_link:Tampermonkey}.

Voor het installeren van scripts heb je een gebruikersscriptbeheerder nodig.

(Ik heb al een user script manager, laat me het downloaden!)

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

(Ik heb al een beheerder - laat me doorgaan met de installatie!)

// ==UserScript==
// @name          Dynamic RTL/LTR Direction
// @namespace     http://tampermonkey.net/
// @version       V1
// @description   Dynamically set text direction for Deepseek chat elements based on content
// @author        Abdo Ibrahim
// @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";
  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();
})();