Select Code Block Buttons

Add select button to select code blocks in stackoverflow

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey, Greasemonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Userscripts.

За да инсталирате скрипта, трябва да инсталирате разширение като Tampermonkey.

За да инсталирате този скрипт, трябва да имате инсталиран скриптов мениджър.

(Вече имам скриптов мениджър, искам да го инсталирам!)

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

(Вече имам инсталиран мениджър на стиловете, искам да го инсталирам!)

// ==UserScript==
// @name           Select Code Block Buttons
// @namespace      stackoverflow
// @include        *stackoverflow.com*
// @include        *stackexchange.com*
// @include        *stackapps.com*
// @version        2.0
// @description    Add select button to select code blocks in stackoverflow
// ==/UserScript==

(function () {
    function with_jquery(f) {
        let script = document.createElement("script");
        script.type = "text/javascript";
        script.textContent = "(" + f.toString() + ")(jQuery)";
        document.body.appendChild(script);
    };

    with_jquery(function ($) {
        addButtons();
        function selectText(element) {
            let doc = document;
            if (doc.body.createTextRange) {
                let range = doc.body.createTextRange();
                range.moveToElementText(element);
                range.select();
            } else if (window.getSelection) {
                let selection = window.getSelection();
                let range = doc.createRange();
                range.selectNodeContents(element);
                selection.removeAllRanges();
                selection.addRange(range);
            }
        }

        function addButtons() {
            $("pre").each(function (i, codeBlock) {
                var qContainer = $("<div style='position: relative;'></div>");
                var id = "select-button-" + i;
                $(codeBlock).replaceWith(qContainer);
                qContainer.append(codeBlock);

                qContainer.mouseenter(function() {
                    var qButton = $('<div style="position: absolute; opacity: 0.6; display: inline; cursor: pointer; background-color: rgb(0, 0, 0); color: rgb(255, 255, 255); font-size: 12pt; padding: 3px; right: 0; top: 0;">Select</div>');
                    qButton.attr("id", id);
                    qContainer.append(qButton);


                    qButton.click(function() {
                        selectText(codeBlock);
                    });
                    qButton.stop(true, true).animate({ opacity: '+=0.6' });
                });

                qContainer.mouseleave(function() {
                    $("#" + id)
                    .stop(true, true)
                    .animate({ opacity: '-=0.6' }, function () { 
                        $("#" + id).remove(); 
                    });
                });
            });
        }
    });
})();