// ==UserScript==
// @name Restaurar posición del cursor y scroll en CodeMirror Scriptcase
// @version 1.2
// @description Guarda y restaura posición del cursor y scroll en CodeMirror tras recargar, asegurando foco y timing
// @match *://*/scriptcase/*
// @grant none
// ==/UserScript==
(function () {
'use strict';
const content = document.querySelector('.CodeMirror')?.CodeMirror.getValue() || '';
const hash = hashString(content);
const STORAGE_KEY = 'codemirror_cursor_' + hash;
const SCROLL_KEY = 'codemirror_scroll_' + hash;
// Guarda posición de cursor y scroll al salir
window.addEventListener('beforeunload', () => {
const cm = document.querySelector('.CodeMirror')?.CodeMirror;
if (cm) {
const cursor = cm.getCursor();
const scroll = cm.getScrollInfo();
localStorage.setItem(STORAGE_KEY, JSON.stringify(cursor));
localStorage.setItem(SCROLL_KEY, JSON.stringify(scroll));
}
});
function hashString(str) {
let hash = 0;
for (let i = 0; i < str.length; i++) {
hash = (hash << 5) - hash + str.charCodeAt(i);
hash |= 0;
}
return hash;
}
function waitForEditorAndRestoreCursorAndScroll() {
const interval = setInterval(() => {
const cmElement = document.querySelector('.CodeMirror');
if (cmElement && cmElement.CodeMirror) {
const cm = cmElement.CodeMirror;
const savedCursor = localStorage.getItem(STORAGE_KEY);
const savedScroll = localStorage.getItem(SCROLL_KEY);
// Restaurar cursor
if (savedCursor) {
try {
const cursor = JSON.parse(savedCursor);
requestIdleCallback(() => {
cm.focus();
setTimeout(() => {
cm.setCursor(cursor);
}, 100);
});
let retries = 5;
const retrySetCursor = () => {
if (retries-- > 0) {
setTimeout(() => {
cm.focus();
cm.setCursor(cursor);
retrySetCursor();
}, 200);
}
};
retrySetCursor();
} catch (e) {
console.warn('Error al restaurar cursor:', e);
}
}
// Restaurar scroll
if (savedScroll) {
try {
const scroll = JSON.parse(savedScroll);
setTimeout(() => {
cm.scrollTo(scroll.left, scroll.top);
}, 200);
} catch (e) {
console.warn('Error al restaurar scroll:', e);
}
}
clearInterval(interval);
}
}, 300);
}
waitForEditorAndRestoreCursorAndScroll();
})();