// ==UserScript== // @name Cohost dir="auto" // @version 1 // @grant none // @match https://cohost.org/* // ==/UserScript== const selectors = [ 'textarea', // Post/comment editor fields '.co-prose', // User-created non-inline content ].join(','); function applyDirAuto(tree) { if (tree.matches(selectors)) { tree.dir = 'auto'; } for (const post of tree.querySelectorAll(selectors)) { post.dir = 'auto'; } } // Apply dir="auto" to elements that are there already on page load applyDirAuto(document.documentElement); // New posts are loaded dynamically using JavaScript, so we need to react to new elements being added const observer = new MutationObserver((mutations) => { for (const mutation of mutations) { for (const node of mutation.addedNodes) { if (node.nodeType === Node.ELEMENT_NODE) { applyDirAuto(node); } } } }); // There is seemingly no good way to refer to the post list, so let's err on the side of firing too often const contentsContainer = document.getElementById('app'); observer.observe(contentsContainer, { subtree: true, childList: true, });