NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==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);
})();