Text Saver

Saves text.

2025-04-05 या दिनांकाला. सर्वात नवीन आवृत्ती पाहा.

ही स्क्रिप्ट इंस्टॉल करण्यासाठी तुम्हाला Tampermonkey, Greasemonkey किंवा Violentmonkey यासारखे एक्स्टेंशन इंस्टॉल करावे लागेल.

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

ही स्क्रिप्ट इंस्टॉल करण्यासाठी तुम्हाला Tampermonkey किंवा Violentmonkey यासारखे एक्स्टेंशन इंस्टॉल करावे लागेल..

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

ही स्क्रिप्ट इंस्टॉल करण्यासाठी तुम्हाला Tampermonkey यासारखे एक्स्टेंशन इंस्टॉल करावे लागेल..

ही स्क्रिप्ट इंस्टॉल करण्यासाठी तुम्हाला एक युझर स्क्रिप्ट व्यवस्थापक एक्स्टेंशन इंस्टॉल करावे लागेल.

(माझ्याकडे आधीच युझर स्क्रिप्ट व्यवस्थापक आहे, मला इंस्टॉल करू द्या!)

ही स्टाईल इंस्टॉल करण्यासाठी तुम्हाला Stylus सारखे एक्स्टेंशन इंस्टॉल करावे लागेल.

ही स्टाईल इंस्टॉल करण्यासाठी तुम्हाला Stylus सारखे एक्स्टेंशन इंस्टॉल करावे लागेल.

ही स्टाईल इंस्टॉल करण्यासाठी तुम्हाला Stylus सारखे एक्स्टेंशन इंस्टॉल करावे लागेल.

ही स्टाईल इंस्टॉल करण्यासाठी तुम्हाला एक युझर स्टाईल व्यवस्थापक इंस्टॉल करावे लागेल.

ही स्टाईल इंस्टॉल करण्यासाठी तुम्हाला एक युझर स्टाईल व्यवस्थापक इंस्टॉल करावे लागेल.

ही स्टाईल इंस्टॉल करण्यासाठी तुम्हाला एक युझर स्टाईल व्यवस्थापक इंस्टॉल करावे लागेल.

(माझ्याकडे आधीच युझर स्टाईल व्यवस्थापक आहे, मला इंस्टॉल करू द्या!)

// ==UserScript==
// @name         Text Saver
// @namespace    http://tampermonkey.net/
// @version      3.1
// @description  Saves text.
// @author       You
// @match        *://*/*
// @grant        GM_addStyle
// @grant        GM_setClipboard
// @grant        GM_notification
// @grant        GM_setValue
// @grant        GM_getValue
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    let savedTexts = GM_getValue('savedTexts', []);
    let isModalVisible = false;
    let dragOffset = { x: 0, y: 0 };
    let lastCopiedIndex = -1;
    let editingIndex = -1;

    // Check if there are saved texts and ask to restore
    if (savedTexts.length > 0) {
        const shouldRestore = confirm('Restore previous session?');
        if (!shouldRestore) {
            savedTexts = [];
            GM_setValue('savedTexts', []);
        }
    }

    const button = document.createElement('button');
    button.textContent = '<';
    button.style.position = 'fixed';
    button.style.top = '50%';
    button.style.right = '10px';
    button.style.transform = 'translateY(-50%)';
    button.style.zIndex = '1000';
    button.style.backgroundColor = 'black';
    button.style.color = 'white';
    button.style.padding = '10px 15px';
    button.style.border = 'none';
    button.style.borderRadius = '5px';
    button.style.cursor = 'pointer';
    button.style.fontSize = '16px';
    document.body.appendChild(button);

    const modal = document.createElement('div');
    modal.style.position = 'fixed';
    modal.style.top = '100px';
    modal.style.right = '50px';
    modal.style.width = '200px';
    modal.style.backgroundColor = 'white';
    modal.style.zIndex = '1001';
    modal.style.display = 'none';
    modal.style.border = '1px solid #ccc';
    modal.style.borderRadius = '5px';
    modal.style.padding = '10px';
    modal.style.transition = 'transform 0.3s ease-out';
    document.body.appendChild(modal);

    const modalHeader = document.createElement('div');
    modalHeader.style.backgroundColor = '#ddd';
    modalHeader.style.color = 'black';
    modalHeader.style.padding = '5px';
    modalHeader.style.cursor = 'move';
    modal.appendChild(modalHeader);

    // Restore window dragging functionality
    modalHeader.addEventListener('mousedown', (e) => {
        let isDragging = true;
        let dragOffset = { x: 0, y: 0 };

        dragOffset.x = e.clientX - modal.offsetLeft;
        dragOffset.y = e.clientY - modal.offsetTop;

        document.addEventListener('mousemove', (e) => {
            if (!isDragging) return;

            modal.style.right = 'auto';
            modal.style.left = (e.clientX - dragOffset.x) + 'px';
            modal.style.top = (e.clientY - dragOffset.y) + 'px';
        });

        document.addEventListener('mouseup', () => {
            isDragging = false;
        });
        document.addEventListener('mouseleave', () => {
            isDragging = false;
        });
    });

    const textContainer = document.createElement('div');
    textContainer.style.maxHeight = '300px';
    textContainer.style.overflowY = 'auto';
    modal.appendChild(modalHeader);
    modal.appendChild(textContainer);

    // Attach functions to window
    window.addTextToClipboard = function(text) {
        const trimmedText = text.trim();
        if (trimmedText !== "") {
            savedTexts.push(trimmedText);
            lastCopiedIndex = savedTexts.length - 1;
            updateTextContainer();
            GM_setValue('savedTexts', savedTexts);
        }
    };

    window.copyText = function(index) {
        if (index >= 0 && index < savedTexts.length) {
            const text = savedTexts[index];
            GM_setClipboard(text);
            lastCopiedIndex = index;
            updateTextContainer();
            showMessage(`Text copied: ${text.substring(0, 50)}${text.length > 50 ? '...' : ''}`);
        }
    };

    window.deleteText = function(index) {
        if (index >= 0 && index < savedTexts.length) {
            const deletedText = savedTexts[index];
            savedTexts.splice(index, 1);

            if (lastCopiedIndex === index) {
                lastCopiedIndex = -1;
            } else if (lastCopiedIndex > index) {
                lastCopiedIndex--;
            }
             if (editingIndex === index) {
                editingIndex = -1;
            } else if (editingIndex > index) {
                editingIndex--;
            }
            updateTextContainer();
            showMessage(`Text deleted: ${deletedText.substring(0, 50)}${deletedText.length > 50 ? '...' : ''}`, 'error');
        }
    };

    window.startEditing = function (index) {
        if (index >= 0 && index < savedTexts.length) {
            editingIndex = index;
            updateTextContainer();

            const textItem = textContainer.children[index];
            if (textItem) {
                textItem.contentEditable = 'true';
                textItem.focus();

                textItem.addEventListener('blur', () => {
                     window.stopEditing(index, textItem.textContent);
                }, { once: true });
            }
        }
    };

    window.stopEditing = function (index, newText) {
        if (index >= 0 && index < savedTexts.length) {
            savedTexts[index] = newText;
            editingIndex = -1;
            updateTextContainer();
            showMessage(`Text changed: ${newText.substring(0, 50)}${newText.length > 50 ? '...' : ''}`);
         }
      };

    GM_addStyle(`
        .saved-text-item {
            cursor: pointer;
            margin-bottom: 5px;
            padding: 5px;
            border: 1px solid #ccc;
            border-radius: 3px;
            font-size: 14px;
            word-break: break-word;
        }

        .saved-text-item:hover {
            background-color: #f0f0f0;
        }

        .selected-text-item {
            background-color: #add8e6;
        }

        @keyframes pulse {
            0% {
                transform: scale(1);
                opacity: 0.5;
            }
            50% {
                transform: scale(1.1);
                opacity: 1;
            }
            100% {
                transform: scale(1);
                opacity: 0.5;
            }
        }

        .modal-enter {
            animation: pulse 0.5s ease-in-out;
        }

        .modal-exit {
            transform: scale(0.5);
            opacity: 0;
        }

        .editing-text-item {
             background-color: yellow;
        }
    `);

    function updateTextContainer() {
        textContainer.innerHTML = '';

        savedTexts.forEach((text, index) => {
            const textItem = document.createElement('div');
            textItem.classList.add('saved-text-item');
            textItem.textContent = `${index + 1}: ${text}`;

            if (index === lastCopiedIndex) {
                textItem.classList.add('selected-text-item');
            }

             if (editingIndex === index) {
                textItem.classList.add('editing-text-item');
            }

            textItem.addEventListener('click', (event) => {
                   if (event.detail === 2) {
                        window.startEditing(index);
                    } else {
                         window.copyText(index);
                    }
            });

            textContainer.appendChild(textItem);
        });
    }

    function showMessage(message, type = 'success') {
        GM_notification({
            title: 'Text Saver',
            text: message,
            timeout: 3000
        });
    }

    button.addEventListener('click', () => {
        if (!isModalVisible) {
            modal.classList.remove('modal-exit');
            modal.classList.add('modal-enter');
            modal.style.display = 'block';
        } else {
            modal.classList.remove('modal-enter');
            modal.classList.add('modal-exit');
            setTimeout(() => {
                modal.style.display = 'none';
                modal.classList.remove('modal-exit');
            }, 300);
        }
        isModalVisible = !isModalVisible;
        updateTextContainer();
    });
    updateTextContainer();
})();