Copy Button For Gemini Generated Text in Box

Google Gemini

Чтобы установить этот скрипт, вы сначала должны установить расширение браузера, например Tampermonkey, Greasemonkey или Violentmonkey.

Для установки этого скрипта вам необходимо установить расширение, такое как Tampermonkey.

Чтобы установить этот скрипт, вы сначала должны установить расширение браузера, например Tampermonkey или Violentmonkey.

Чтобы установить этот скрипт, вы сначала должны установить расширение браузера, например Tampermonkey или Userscripts.

Чтобы установить этот скрипт, сначала вы должны установить расширение браузера, например Tampermonkey.

Чтобы установить этот скрипт, вы должны установить расширение — менеджер скриптов.

(у меня уже есть менеджер скриптов, дайте мне установить скрипт!)

Чтобы установить этот стиль, сначала вы должны установить расширение браузера, например Stylus.

Чтобы установить этот стиль, сначала вы должны установить расширение браузера, например Stylus.

Чтобы установить этот стиль, сначала вы должны установить расширение браузера, например Stylus.

Чтобы установить этот стиль, сначала вы должны установить расширение — менеджер стилей.

Чтобы установить этот стиль, сначала вы должны установить расширение — менеджер стилей.

Чтобы установить этот стиль, сначала вы должны установить расширение — менеджер стилей.

(у меня уже есть менеджер стилей, дайте мне установить скрипт!)

// ==UserScript==
// @name        Copy Button For Gemini Generated Text in Box
// @namespace   https://www.ufukyayla.com.tr/gemini_copy
// @match       https://gemini.google.com/*
// @grant       none
// @version     1.2
// @description Google Gemini
// @author      Ufuk Yayla
// @license GPL-3.0-or-later
// ==/UserScript==

(function() {
	function show_toast(txt) {
		var n = document.createElement("div");

		n.textContent = txt;
		n.style.position = "fixed";
		n.style.bottom = "20px";
		n.style.right = "20px";
		n.style.padding = "10px";
		n.style.color = "#ffffff";
		n.style.backgroundColor = "#55bb55";
		n.style.borderRadius = "6px";
		n.style.zIndex = "1000";

		document.body.appendChild(n);

		setTimeout(function() {
			document.body.removeChild(n);
		}, 3000);
	}

	function copy_text(txt) {
		var n = document.createElement("textarea");
		n.visibility = "hidden";
		n.value = txt;
		document.body.appendChild(n);
		
		n.select();

		try {
			var ok = document.execCommand("copy");
			var msg = ok ? "Copied" : "Copy to clipboard is not supported";
			show_toast(msg);
		} catch (err) {
			show_toast("Copy attempt failed");
		}

		document.body.removeChild(n);
	}

	function add_copy_button(elem) {
		var n = document.createElement("button");

		n.textContent = "Copy";
		n.style.padding = "8px";
		n.style.color = "#ffffff";	
		n.style.backgroundColor = "#55bb55";
		n.style.border = "none";
		n.style.borderRadius = "6px";
		n.style.cursor = "pointer";

		n.onmouseover = function() {
			n.style.backgroundColor = "#448844";
		}
		
		n.onmouseout = function() {
			n.style.backgroundColor = "#55bb55";
		}

		n.onclick = function() {
			var text_elem = elem.querySelector(".code-container");
			if (text_elem) {
				var txt = text_elem.textContent;
				copy_text(txt);
			}
		}

		elem.appendChild(n);
	}
	
	//----------observer
	var observer = new MutationObserver(function(mutations) {
		mutations.forEach(function(mutation) {
			mutation.addedNodes.forEach(function(node) {
				if (node.nodeType === 1) {
					var code_blocks = node.querySelectorAll("code-block");
					code_blocks.forEach(function(block) {
						add_copy_button(block);
					});
				}
			});
		});
	});
	observer.observe(document.body, { childList: true, subtree: true });
	
	//----------init
	function add_buttons_init() {
		var code_blocks = document.querySelectorAll("code-block");
		code_blocks.forEach(function(block) {
			if (!block.querySelector("button")) {
				add_copy_button(block);
			}
		});
	}
	add_buttons_init();
})();