Katastry - download QoL

Přejmenování stránky na základě parcelního čísla, vlastníků nebo spravujícího subjektu a čísla LV, s možností nastavení vlastního formátu. Více vlastníků se zkrátí podle pravidla: 1–2 = jména, víc než 2 = počet+sufix (3–4_vlastnici, 5+_vlastniku).

// ==UserScript==
// @name         Katastry - download QoL
// @namespace    http://tampermonkey.net/
// @version      2.2
// @description  Přejmenování stránky na základě parcelního čísla, vlastníků nebo spravujícího subjektu a čísla LV, s možností nastavení vlastního formátu. Více vlastníků se zkrátí podle pravidla: 1–2 = jména, víc než 2 = počet+sufix (3–4_vlastnici, 5+_vlastniku).
// @author       Teodor Tomáš
// @match        *://*/ZobrazObjekt.aspx*
// @license      GNU GPLv3
// @grant        GM_getValue
// @grant        GM_setValue
// @grant        GM_registerMenuCommand
// ==/UserScript==

(function () {
    'use strict';

    console.log("Tampermonkey skript spuštěn.");

    // Výchozí formát názvu – dostupné placeholdery: {cisloLV}, {jmeno}, {parcelniCislo}
    const defaultFormat = "Informace o pozemku - LV{cisloLV} - {jmeno} - {parcelniCislo}";
    let formatString = GM_getValue("formatString", defaultFormat);

    // Registrace menu příkazu pro nastavení vlastního formátu
    GM_registerMenuCommand("Nastavit formát názvu", function() {
        const newFormat = prompt("Zadejte formát názvu stránky.\nPoužijte placeholdery: {cisloLV}, {jmeno}, {parcelniCislo}", formatString);
        if (newFormat && newFormat.trim() !== "") {
            GM_setValue("formatString", newFormat);
            formatString = newFormat;
            alert("Nový formát uložen. Změny se projeví při další aktualizaci názvu stránky.");
        }
    });

    // Funkce pro vyhledání textu a extrakci hodnoty za štítkem
    function getTextAfterLabel(labelText) {
        const labelElement = [...document.querySelectorAll('td.nazev')]
            .find(el => el.textContent.includes(labelText));
        if (labelElement) {
            const valueElement = labelElement.nextElementSibling;
            return valueElement ? valueElement.textContent.trim() : null;
        }
        return null;
    }

    // Funkce pro úpravu jména (odstranění diakritiky, mezer, teček atd.)
    function processName(name) {
        if (!name) return null;
        name = name.normalize("NFD").replace(/[\u0300-\u036f]/g, ""); // odstranění diakritiky
        name = name.replace(" a ", "_a_"); // SJ edit
        name = name.replace("s.r.o.", "_sro");
        name = name.replace("a.s.", "_as");
        name = name.replace(/\b\w/g, char => char.toUpperCase());
        name = name.replace(/\s+/g, ""); // odstranění mezer
        name = name.replace(/\./g, ""); // odstranění teček
        name = name.replace("SJ", "SJ_"); // SJ edit
        return name;
    }

    // Funkce pro odstranění teček
    function removeDots(str) {
        return str ? str.replace(/\./g, "") : "";
    }

    // Upravená funkce pro získání vlastníků z tabulky (sekce "Vlastnické právo")
    // Ignoruje řádky, kde TD má class="partnerSJM"
    function getOwners() {
        let owners = [];
        const table = document.querySelector("table.vlastnici");
        if (!table) return null;
        const rows = table.querySelectorAll("tbody > tr");
        let ownersStarted = false;
        for (let row of rows) {
            // pokud buňka partnerSJM existuje, přeskočíme tento řádek
            if (row.querySelector("td.partnerSJM")) {
                continue;
            }
            // Hledáme řádek s hlavičkou "Vlastnické právo"
            if (row.querySelector("th")) {
                if (row.textContent.includes("Vlastnické právo")) {
                    ownersStarted = true;
                    continue;
                } else if (ownersStarted) {
                    // Když jsme již v sekci a narazíme na další hlavičku, sběr vlastníků končí
                    break;
                }
            }
            if (ownersStarted) {
                const td = row.querySelector("td");
                if (td) {
                    let name = td.textContent.split(",")[0].trim();
                    name = processName(name);
                    owners.push(name);
                }
            }
        }
        // Pokud je pouze jeden nebo dva vlastníci, vypíšeme jejich jména oddělená podtržítkem
        if (owners.length <= 2) {
            return owners.length > 0 ? owners.join("_") : null;
        } else {
            // Pokud je více než 2 vlastníků:
            // Pro 3-4 vlastníky použijeme formát: "3_vlastnici" (resp. "4_vlastnici")
            // Pro 5 a více vlastníků: "X_vlastniku"
            if (owners.length <= 4) {
                return owners.length + "_vlastnici";
            } else {
                return owners.length + "_vlastniku";
            }
        }
    }

    // Funkce pro získání subjektu spravujícího pozemek – hledá varianty:
    // "hospodař" (např. Právo hospodařit, Příslušnost hospodařit) a "správa nemovitostí" s "kraje"
    function getManagementSubject() {
        const thElements = document.querySelectorAll("table.vlastnici th");
        for (let th of thElements) {
            const lowerText = th.textContent.toLowerCase();
            if (
                lowerText.includes("hospodař") ||
                (lowerText.includes("správa nemovitostí") && lowerText.includes("kraje"))
            ) {
                const tr = th.closest("tr");
                if (tr && tr.nextElementSibling) {
                    const td = tr.nextElementSibling.querySelector("td");
                    if (td) return td.textContent.trim();
                }
            }
        }
        return null;
    }

    // Extrakce parcelního čísla a čísla LV
    let parcelniCislo = getTextAfterLabel('Parcelní číslo:');
    console.log("Parcelní číslo:", parcelniCislo);

    let cisloLV = getTextAfterLabel('Číslo LV:');
    console.log("Číslo LV:", cisloLV);

    // Získání subjektu spravujícího pozemek (např. pozemek ve správě nebo hospodaření)
    let subject = getManagementSubject();
    if (subject) {
        subject = subject.split(",")[0].trim();
        subject = processName(subject);
    }
    console.log("Subjekt správy/hospodaření:", subject);

    // Získání vlastníků – pokud není nalezen subjekt, použijeme vlastníky
    let owners = getOwners();
    console.log("Vlastníci:", owners);

    // Volba výsledného jména: pokud je definován subjekt (správa/hospodaření), použije se on, jinak vlastníci.
    let jmeno = subject ? subject : (owners ? owners : null);

    // Pokud máme všechny potřebné informace, sestavíme nový název stránky podle formátu
    if (parcelniCislo && cisloLV && jmeno) {
        parcelniCislo = removeDots(parcelniCislo);
        // Nahrazení lomítek podtržítky
        parcelniCislo = parcelniCislo.replace(/\//g, "_");
        jmeno = removeDots(jmeno);
        cisloLV = removeDots(cisloLV);

        let novyNazev = formatString;
        novyNazev = novyNazev.replace("{cisloLV}", cisloLV)
                             .replace("{jmeno}", jmeno)
                             .replace("{parcelniCislo}", parcelniCislo);
        console.log("Nový název stránky:", novyNazev);
        document.title = novyNazev;
    } else {
        console.warn("Nepodařilo se získat všechny potřebné informace. Název stránky nebude změněn.");
    }
})();