Убирает двойные пробелы при копировании, сохраняя при этом форматирование (курсив, жирный шрифт и т.д.)
// ==UserScript==
// @name Clean Copy GOOGLE STUDIO
// @namespace http://tampermonkey.net/
// @version 1.1
// @description Убирает двойные пробелы при копировании, сохраняя при этом форматирование (курсив, жирный шрифт и т.д.)
// @author You
// @match https://aistudio.google.com/*
// @grant none
// ==/UserScript==
(function() {
'use strict';
document.addEventListener('copy', function(e) {
let selectedText = '';
let htmlText = '';
const activeEl = document.activeElement;
// 1. Проверяем, выделен ли текст внутри полей ввода (input / textarea)
if (activeEl && (activeEl.tagName === 'TEXTAREA' || (activeEl.tagName === 'INPUT' && /text|search|tel|url|email/i.test(activeEl.type)))) {
selectedText = activeEl.value.substring(activeEl.selectionStart, activeEl.selectionEnd);
} else {
// 2. Обычное выделение текста на странице
const selection = window.getSelection();
if (selection && selection.rangeCount > 0) {
selectedText = selection.toString();
// Извлекаем HTML-код выделения, чтобы сохранить форматирование (курсив, жирный текст, списки)
const div = document.createElement('div');
for (let i = 0; i < selection.rangeCount; i++) {
div.appendChild(selection.getRangeAt(i).cloneContents());
}
htmlText = div.innerHTML;
}
}
if (selectedText) {
// Функция для очистки 2 и более пробелов/табов (исключая переносы строк)
const cleanSpaces = (text) => text.replace(/[^\S\r\n]{2,}/g, ' ');
// Очищаем обычный текст
const cleanText = cleanSpaces(selectedText);
// Записываем очищенный обычный текст в буфер
e.clipboardData.setData('text/plain', cleanText);
// 3. Если есть HTML-текст, аккуратно очищаем пробелы только в тексте (не ломая теги)
if (htmlText) {
// Разбиваем HTML на куски "тег" / "текст"
const cleanHtml = htmlText.split(/(<[^>]*>)/).map(part => {
// Если кусок является HTML-тегом, оставляем его без изменений
if (part.startsWith('<') && part.endsWith('>')) {
return part;
}
// Иначе (это обычный текст) - очищаем лишние пробелы
return cleanSpaces(part);
}).join('');
// Добавляем HTML-версию в буфер обмена
e.clipboardData.setData('text/html', cleanHtml);
}
// Блокируем стандартное поведение браузера
e.preventDefault();
}
});
})();