Block dead keys in Overleaf to allow for typing of accented letters. It also allows typing ß. It blocks undesired key combinations.
// ==UserScript== // @name Typing Accented Characters in Oveleaf (for macOS only) // @namespace https://github.com/alberti42/ // @version 1.8 // @description Block dead keys in Overleaf to allow for typing of accented letters. It also allows typing ß. It blocks undesired key combinations. // @author Andrea Alberti // @match https://www.overleaf.com/* // @grant none // @license MIT // ==/UserScript== // // This script is designed for macOS users working in Overleaf who encounter issues // with typing accented letters due to dead keys. It blocks dead key events to allow // proper input of accented characters when using dead keys. To install this script // in Greasemonkey (for Firefox) or Violentmonkey (for Chrome/Firefox/Edge), // simply copy and paste it into a new userscript in your userscript manager. // For more information on how to use dead keys to type accented characters on a Mac, // please refer to the official Apple guide: https://support.apple.com/en-ph/guide/mac-help/mh27474/mac // (function() { 'use strict'; // Global debug variable const debug = false; // Set to true for logging, false to disable logs // Function to log messages if debug is enabled function logDebug(message, ...optionalParams) { if (debug) { console.log(message, ...optionalParams); } } // Function to insert text into a contenteditable element at the cursor position function insertTextInContentEditable(text) { // Get the active element and check if it's contenteditable var activeElement = document.activeElement; if (!activeElement || !activeElement.getAttribute('contenteditable')) { console.error("Active element is not contenteditable or not found"); return; } const selection = window.getSelection(); if (!selection.rangeCount) return; const range = selection.getRangeAt(0); // Get the range at the current cursor position range.deleteContents(); // Remove any selected text const textNode = document.createTextNode(text); // Create a text node for the 'ß' character range.insertNode(textNode); // Insert the 'ß' character at the current position range.setStartAfter(textNode); // Move the cursor after the inserted character range.setEndAfter(textNode); selection.removeAllRanges(); // Clear all current selections selection.addRange(range); // Add the new range (after the inserted character) } // Event listener to block dead keys and accented letters function handleKeydown(e) { // Log the event details for debugging if(debug) { console.log("Event Triggered:"); console.log("Key: ", e.key); console.log("Code: ", e.code); console.log("Alt Key: ", e.altKey); console.log("Key Code: ", e.keyCode); console.log("Shift Key: ", e.shiftKey); console.log("Ctrl Key: ", e.ctrlKey); console.log("Meta Key: ", e.metaKey); } // Block dead keys if (e.key === 'Dead') { e.preventDefault(); // Block the key logDebug("Blocked dead key"); } // Block Alt + ArrowDown and Alt + ArrowUp combinations else if (e.altKey && (e.key === 'ArrowDown' || e.key === 'ArrowUp')) { e.preventDefault(); // Block the key logDebug("Blocked arrow up/down keys"); } // Block <0xa0> character else if (e.altKey && e.shiftKey && e.keyCode === 32) { e.preventDefault(); // Block the key logDebug("Blocked <0xa0> character"); } // Allow Alt + S for typing the character 'ß' else if (e.altKey && e.keyCode === 83 && e.key === 'ß') { e.preventDefault(); // Prevent the default action logDebug("Alt+S Detected: allow typing 'ß'"); insertTextInContentEditable('ß'); // Insert 'ß' at the current cursor position } // Allow Alt + Shift + 2 for typing the character '€' else if (e.altKey && e.shiftKey && e.keyCode === 50 && e.key === '€') { e.preventDefault(); // Prevent the default action logDebug("Alt+Shift+2 Detected: allow typing '€'"); insertTextInContentEditable('€'); // Insert 'ß' at the current cursor position } } // Attach the event listener to the document document.addEventListener('keydown', handleKeydown, true); })();