Wiki LaTeX Copier

Copy selected text from wiki with equations in LaTeX format

目前為 2024-08-19 提交的版本,檢視 最新版本

// ==UserScript==
// @name         Wiki LaTeX Copier
// @namespace    http://tampermonkey.net/
// @version      1.2
// @description  Copy selected text from wiki with equations in LaTeX format
// @author       Jie-Qiao
// @match        *://*.wikipedia.org/*
// @match        *://*.stackexchange.com/*
// @grant        none
// @license MIT
// ==/UserScript==

(function() {
    'use strict';

    // Create the button element
    const button = document.createElement('button');
    button.textContent = 'Copy';
    button.style.position = 'absolute';
    button.style.display = 'none';
    button.style.zIndex = '1000';

    // Append the button to the body
    document.body.appendChild(button);

    // Function to handle button click
    button.addEventListener('click', function() {
        const selectedText = window.getSelection();
        if (selectedText) {
            myfunction(selectedText);
        }
        button.style.display = 'none'; // Hide the button after click
    });

    // Function to show the button when text is selected
    document.addEventListener('mouseup', function(event) {
        const selectedText = window.getSelection().toString().trim();
        if (selectedText) {
            const x = event.pageX;
            const y = event.pageY;
            button.style.left = `${x}px`;
            button.style.top = `${y}px`;
            button.style.display = 'block';
        } else {
            button.style.display = 'none';
        }
    });

    // Custom function to process the selected text
    function myfunction(selection) {
        let url = window.location.href
        let range = selection.getRangeAt(0);
        //console.log('Text selected:', selection.toString()); // Log selected text
        let c=range.cloneContents();
        let text=""
        var node;
        for (var i=0;i<c.childNodes.length;i++)
            {
                node=c.childNodes[i]
                if (node.nodeType === Node.TEXT_NODE || node.nodeName.toLowerCase() === 'p' ) {
                    text+=node.textContent;
                    continue;
                }
                if (url.includes('wikipedia.org')) {
                    // If the node is a span, handle it with specific code
                    if (node.nodeType === Node.ELEMENT_NODE && node.nodeName.toLowerCase() === 'span') {
                        if(node.querySelectorAll('math').length>0){
                            text+= '$' + node.getElementsByTagName('math')[0].getAttribute('alttext') + '$';
                        }else if(node.querySelectorAll('img').length>0){
                            text+= '$' + node.querySelectorAll('img')[0].getAttribute('alt') + '$';
                        }
                        // if(node.querySelectorAll('img').length>0){
                        //     text+= '$' + node.querySelectorAll('img')[0].getAttribute('alt') + '$';
                        // }
                        // Add your specific code for span elements here
                    }
                    else if(node.nodeType === Node.ELEMENT_NODE){
                        for (var j=0;j<node.querySelectorAll('img').length;j++){
                            text+= '$' + node.querySelectorAll('img')[j].getAttribute('alt') + '$';
                        }
                    }
                }
                else if(url.includes('stackexchange.com')){
                    // If the node is a span, handle it with specific code

                    if (node.nodeType === Node.ELEMENT_NODE && node.nodeName.toLowerCase() === 'span') {
                        if (node.getElementsByTagName('script').length>0){
                            text+= '$' + node.getElementsByTagName('script')[0].textContent + '$';
                        }
                    }
                    if (node.nodeType === Node.ELEMENT_NODE && node.nodeName.toLowerCase() === 'script') {
                            text+= '$' + node.textContent + '$';
                    }
                }
            }
        // console.log(text);
        navigator.clipboard.writeText(text);
    }
})();