criker / sudoku-knacker.de exporter

// ==UserScript==
// @name         sudoku-knacker.de exporter
// @namespace    https://www.sudoku-knacker.de
// @version      0.26
// @description  You can export Sudokus from sudoku-knacker.de
// @author       Ingo
// @match        *://*.sudoku-knacker.de/*
// @grant        none
// @run-at       document-idle
// @license MIT
// ==/UserScript==

(function() {
    'use strict';

    // 1. Text-Feld erstellen und komplett unter die Button-Leiste setzen
    function ensureUIBox() {
        let resultBox = document.getElementById("bitte-kopieren");
        
        if (!resultBox) {
            let buttons = document.querySelectorAll('button');
            let targetButton = null;
            
            for (let btn of buttons) {
                if (btn.textContent.toLowerCase().includes('sudoku prüfen')) {
                    targetButton = btn;
                    break;
                }
            }

            if (!targetButton) return null;

            resultBox = document.createElement("p");
            resultBox.id = "bitte-kopieren";
            
            // Layout-Anpassungen
            resultBox.style.display = "block";
            resultBox.style.width = "100%";
            resultBox.style.fontSize = "18px";
            resultBox.style.fontFamily = "monospace";
            resultBox.style.textAlign = "center";
            resultBox.style.marginTop = "30px"; 
            resultBox.style.marginBottom = "20px";
            resultBox.style.fontWeight = "bold";
            resultBox.style.wordBreak = "break-all";
            resultBox.textContent = "Warte auf Daten...";
            
            // WICHTIG: Wir suchen die äußere Aktionsleiste und fügen den Text DANACH ein.
            // Falls die Klasse nicht gefunden wird, gehen wir zur Sicherheit zwei Ebenen nach oben.
            let actionContainer = targetButton.closest('.sudoku-board__actions') || targetButton.parentElement.parentElement;
            
            actionContainer.insertAdjacentElement('afterend', resultBox);
        }
        return resultBox;
    }

    // 2. Sudoku-Zellen finden
    function getGridCells() {
        let cells = document.querySelectorAll('sudoku-cell');
        if (cells.length === 81) {
            return cells;
        }
        return null;
    }

    // 3. Felder auslesen
    function lookup() {
        let resultBox = ensureUIBox();
        if (!resultBox) return;

        let cells = getGridCells();
        if (!cells) {
            resultBox.textContent = "Feld nicht gefunden!";
            return;
        }

        let sudokuStr = "";
        for (let i = 0; i < 81; i++) {
            let cell = cells[i];
            
            let txt = cell.innerText || cell.textContent || "";
            let cleaned = txt.replace(/Zelle\s*\d+/gi, '').replace(/\s/g, '');

            if (cleaned.length === 1 && /^[1-9]$/.test(cleaned)) {
                sudokuStr += cleaned;
            } else {
                sudokuStr += ".";
            }
        }
        
        if (sudokuStr.length === 81) {
            resultBox.textContent = sudokuStr;
        }
    }

    setInterval(lookup, 2000);

})();