MediaWiki:Common.js: Porovnání verzí

Z Wiki JU
Ofara (diskuse | příspěvky)
Bez shrnutí editace
značka: revertováno
Ofara (diskuse | příspěvky)
Bez shrnutí editace
značka: revertováno
Řádek 63: Řádek 63:
//Vyhledávání
//Vyhledávání


/* Special:Search — profil=advanced, whitelist NS (remove z DOM), přejmenování, default check, nadpis */
/* Special:Search – pevné rozšířené, whitelist (remove z DOM), přejmenování, default check, nadpis */
(function () {
(function () {
   if (mw.config.get('wgCanonicalSpecialPageName') !== 'Search') return;
   if (mw.config.get('wgCanonicalSpecialPageName') !== 'Search') return;


   // 1) Vynutit profil=advanced (provedeme jednou přesměrováním)
   // 1) vynutit profil=advanced (jednou přesměrováním, žádná smyčka)
   const url = new URL(location.href);
   (function ensureAdvanced() {
  if (url.searchParams.get('profile') !== 'advanced') {
    const url = new URL(location.href);
    url.searchParams.set('profile', 'advanced');
    if (url.searchParams.get('profile') !== 'advanced') {
    location.replace(url.toString());
      url.searchParams.set('profile', 'advanced');
     return;
      location.replace(url.toString());
   }
     }
   })();


   // ===== KONFIGURACE =====
   // --- konfigurace ---
   // Standardní ID: 0 Hlavní, 6 Soubor, 10 Šablona, 14 Kategorie
   // Standardní ID: 0 Hlavní, 6 Soubor, 10 Šablona, 14 Kategorie
   const ALLOW_IDS = new Set([0, 6, 10, 14]);
   const ALLOW_IDS = new Set([0, 6, 10, 14]);
  // Povolené názvy (před/po přejmenování) – pro vlastní NS a jistotu
   const ALLOW_NAMES = new Set([
   const ALLOW_NAMES = new Set([
     '(Hlavní)', 'Hlavní', 'Stránky',
     '(Hlavní)', 'Hlavní', 'Stránky',
Řádek 88: Řádek 87:
     'Kategorie'
     'Kategorie'
   ]);
   ]);
 
   const DEFAULT_CHECK_IDS = new Set([0]); // Stránky
  // Defaultně zaškrtnout: Stránky (ID 0) + PřF (dle názvu)
   const DEFAULT_CHECK_IDS = new Set([0]);
 
  // Přejmenování zobrazených štítků
   const RENAME = new Map([
   const RENAME = new Map([
     ['(Hlavní)', 'Stránky'],
     ['(Hlavní)', 'Stránky'],
Řádek 100: Řádek 95:
     ['Šablona',  'Šablony']
     ['Šablona',  'Šablony']
   ]);
   ]);
 
   const norm = s => String(s || '').replace(/\u00A0/g,' ').replace(/\s+/g,' ').trim();
   const norm = s => String(s || '').replace(/\u00A0/g, ' ').replace(/\s+/g, ' ').trim();
   const isPrF = t => /^(PřF|Binolupa – Přírodovědecká fakulta)$/i.test(norm(t));
   const isPrF = t => /^(PřF|Binolupa – Přírodovědecká fakulta)$/i.test(norm(t));


  // Najdi „řádek“ s checkboxem (funguje napříč skiny)
   function getContainer() {
   function findRow(el) {
     return document.querySelector('#mw-searchoptions, .mw-search-nsoptions');
     let n = el;
    for (let i = 0; i < 6 && n; i++) {
      if (n.classList && (n.classList.contains('oo-ui-fieldLayout') || n.classList.contains('mw-htmlform-field-HTMLCheckMatrix'))) {
        return n;
      }
      n = n.parentElement;
    }
    // fallback: nejbližší DIV
    n = el;
    for (let i = 0; i < 6 && n; i++) {
      if (n.tagName === 'DIV') return n;
      n = n.parentElement;
    }
    return el;
   }
   }


   function process() {
   function processOnce(root) {
     // Schovat horní profilové záložky
    if (!root || root.dataset.nsTweaked === '1') return;
    root.dataset.nsTweaked = '1';
 
    // nadpis
    const heading = root.querySelector('h4, legend');
    if (heading) heading.textContent = 'Co chcete vyhledávat?';
 
     // schovat horní profilové záložky
     const tabs = document.querySelector('.mw-search-profile-tabs');
     const tabs = document.querySelector('.mw-search-profile-tabs');
     if (tabs) tabs.style.display = 'none';
     if (tabs) tabs.style.display = 'none';


     // Přepsat nadpis
     // najdi všechny checkboxy jmenných prostorů
     const container = document.querySelector('#mw-searchoptions') || document.querySelector('.mw-search-nsoptions');
     const cbs = root.querySelectorAll('input[type="checkbox"][id^="mw-search-ns"], input[type="checkbox"][name="ns[]"]');
     if (container) {
     cbs.forEach(cb => {
       const heading = container.querySelector('h4, legend');
      // najdi řádek
      if (heading) heading.textContent = 'Co chcete vyhledávat?';
       const row = cb.closest('.oo-ui-fieldLayout') || cb.closest('div');
    }
      if (!row) return;
    if (!container) return;


    // Všechny checkboxy „namespace“ (robustní výběr)
       // label
    const cbs = container.querySelectorAll('input[type="checkbox"][id^="mw-search-ns"], input[type="checkbox"][name="ns[]"]');
       const label = (cb.id && root.querySelector('label[for="'+cb.id+'"]')) || row.querySelector('label');
    cbs.forEach(cb => {
       if (!label) return;
      const row = findRow(cb);
       // Zjisti label
       const labelEl =
        (cb.id && container.querySelector('label[for="' + cb.id + '"]')) ||
        row.querySelector('label') ||
        null;
       if (!labelEl) return;


       // Zjisti NS id
       // zjisti ID NS
       let nsId = NaN;
       let nsId = NaN;
       const m = cb.id && cb.id.match(/mw-search-ns(\d+)/);
       const m = cb.id && cb.id.match(/mw-search-ns(\d+)/);
Řádek 155: Řádek 134:
       }
       }


       // Původní text (ulož 1×), případné přejmenování
       // původní text a přejmenování
       if (!row.dataset.origLabel) row.dataset.origLabel = norm(labelEl.textContent);
       const orig = norm(label.textContent);
      const orig = row.dataset.origLabel;
       if (RENAME.has(orig)) label.textContent = RENAME.get(orig);
       if (!row.dataset.renamed && RENAME.has(orig)) {
       const current = norm(label.textContent);
        labelEl.textContent = RENAME.get(orig);
        row.dataset.renamed = '1';
      }
       const current = norm(labelEl.textContent);


       // Whitelist: pokud neprojde, odstranit z DOM
       // whitelist → nechtěné rovnou odstraníme z DOM
       const keep = ALLOW_IDS.has(nsId) || ALLOW_NAMES.has(orig) || ALLOW_NAMES.has(current);
       const keep = ALLOW_IDS.has(nsId) || ALLOW_NAMES.has(orig) || ALLOW_NAMES.has(current);
       if (!keep) { row.remove(); return; }
       if (!keep) { row.remove(); return; }


       // Defaultně zaškrtnout Stránky + PřF
       // default: Stránky + PřF
       if (DEFAULT_CHECK_IDS.has(nsId) || isPrF(orig) || isPrF(current)) cb.checked = true;
       if (DEFAULT_CHECK_IDS.has(nsId) || isPrF(orig) || isPrF(current)) cb.checked = true;
     });
     });
   }
   }


   // Spusť po načtení obsahu
   // počkej, až se kontejner i checkboxy opravdu objeví, pak to jednou zpracuj
   mw.hook('wikipage.content').add(process);
   function waitAndRun(tries=0) {
    const root = getContainer();
    const ready = root && root.querySelector('input[type="checkbox"][id^="mw-search-ns"], input[type="checkbox"][name="ns[]"]');
    if (ready) { processOnce(root); return; }
    if (tries < 60) setTimeout(() => waitAndRun(tries+1), 100); // max ~6s, bez zacyklení
  }


   // Znovu aplikuj, když se konkrétní kontejner překreslí (OOUI/klik na „Všechno/Nic“ ap.)
   // spustit po načtení stránky i obsahu
   (function observe() {
   document.addEventListener('DOMContentLoaded', () => waitAndRun());
    const root = document.querySelector('#mw-searchoptions') || document.querySelector('.mw-search-nsoptions');
  mw.hook('wikipage.content').add(() => waitAndRun());
    if (!root) { setTimeout(observe, 120); return; }
    new MutationObserver(() => process()).observe(root, { childList: true, subtree: true });
  })();
})();
})();

Verze z 25. 9. 2025, 08:54

/* Zde uvedený JavaScript bude použit pro všechny uživatele při načtení každé stránky */

//Zpětná vazba

$(function () {
  // Zruš jQuery UI vzhled tlačítka
  $('.articleFeedbackv5-submit').button('destroy');
});

document.addEventListener('DOMContentLoaded', function () {
  document.querySelectorAll('.extern-download').forEach(el => {
    el.style.cursor = 'pointer';
    el.style.color = '#0645AD';
    el.style.textDecoration = 'underline';
    el.addEventListener('click', () => {
      const a = document.createElement('a');
      a.href = el.getAttribute('data-url');
      a.setAttribute('download', '');
      a.style.display = 'none';
      document.body.appendChild(a);
      a.click();
      document.body.removeChild(a);
    });
  });
});

(function () {
  var NOTE_ID = 'af5-note';
  var NOTE_HTML =
    '<div id="' + NOTE_ID + '" class="articleFeedbackv5-note">' +
      '<b>Tento formulář slouží pouze jako zpětná vazba pro tuto stránku.</b> ' +
      'Řešíte-li nějaký problém, napište e-mail na ' +
      '<a href="/Servicedesk/Seznam_e-mailových_adres_pro_zadávání_požadavků">službu,</a> které se Váš problém týká.' +
    '</div>';

   function injectNote(root) {
    var $title = (root ? $(root) : $(document))
      .find('.articleFeedbackv5-title-wrap')
      .first();

    if (!$title.length) return false;                 // nadpis není
    if (document.getElementById(NOTE_ID)) return true; // už vloženo

    $title.after(NOTE_HTML);                          // vložit pod nadpis
    return true;
  }

  if (injectNote()) return;

  var obs = new MutationObserver(function (mutations) {
    for (var m of mutations) {
      if (injectNote(m.target)) {
        obs.disconnect();
        break;
      }
    }
  });

  obs.observe(document.body, { childList: true, subtree: true });
  setTimeout(function () { injectNote(); obs.disconnect(); }, 5000);
})();

//Vyhledávání

/* Special:Search – pevné rozšířené, whitelist (remove z DOM), přejmenování, default check, nadpis */
(function () {
  if (mw.config.get('wgCanonicalSpecialPageName') !== 'Search') return;

  // 1) vynutit profil=advanced (jednou přesměrováním, žádná smyčka)
  (function ensureAdvanced() {
    const url = new URL(location.href);
    if (url.searchParams.get('profile') !== 'advanced') {
      url.searchParams.set('profile', 'advanced');
      location.replace(url.toString());
    }
  })();

  // --- konfigurace ---
  // Standardní ID: 0 Hlavní, 6 Soubor, 10 Šablona, 14 Kategorie
  const ALLOW_IDS = new Set([0, 6, 10, 14]);
  const ALLOW_NAMES = new Set([
    '(Hlavní)', 'Hlavní', 'Stránky',
    'Aktuality',
    'PřF', 'Binolupa – Přírodovědecká fakulta',
    'Soubor', 'Soubory',
    'Šablona', 'Šablony',
    'Kategorie'
  ]);
  const DEFAULT_CHECK_IDS = new Set([0]); // Stránky
  const RENAME = new Map([
    ['(Hlavní)', 'Stránky'],
    ['Hlavní',   'Stránky'],
    ['PřF',      'Binolupa – Přírodovědecká fakulta'],
    ['Soubor',   'Soubory'],
    ['Šablona',  'Šablony']
  ]);
  const norm = s => String(s || '').replace(/\u00A0/g,' ').replace(/\s+/g,' ').trim();
  const isPrF = t => /^(PřF|Binolupa  Přírodovědecká fakulta)$/i.test(norm(t));

  function getContainer() {
    return document.querySelector('#mw-searchoptions, .mw-search-nsoptions');
  }

  function processOnce(root) {
    if (!root || root.dataset.nsTweaked === '1') return;
    root.dataset.nsTweaked = '1';

    // nadpis
    const heading = root.querySelector('h4, legend');
    if (heading) heading.textContent = 'Co chcete vyhledávat?';

    // schovat horní profilové záložky
    const tabs = document.querySelector('.mw-search-profile-tabs');
    if (tabs) tabs.style.display = 'none';

    // najdi všechny checkboxy jmenných prostorů
    const cbs = root.querySelectorAll('input[type="checkbox"][id^="mw-search-ns"], input[type="checkbox"][name="ns[]"]');
    cbs.forEach(cb => {
      // najdi řádek
      const row = cb.closest('.oo-ui-fieldLayout') || cb.closest('div');
      if (!row) return;

      // label
      const label = (cb.id && root.querySelector('label[for="'+cb.id+'"]')) || row.querySelector('label');
      if (!label) return;

      // zjisti ID NS
      let nsId = NaN;
      const m = cb.id && cb.id.match(/mw-search-ns(\d+)/);
      if (m) nsId = parseInt(m[1], 10);
      if (isNaN(nsId)) {
        const v = cb.getAttribute('value');
        if (v && /^\d+$/.test(v)) nsId = parseInt(v, 10);
      }

      // původní text a přejmenování
      const orig = norm(label.textContent);
      if (RENAME.has(orig)) label.textContent = RENAME.get(orig);
      const current = norm(label.textContent);

      // whitelist → nechtěné rovnou odstraníme z DOM
      const keep = ALLOW_IDS.has(nsId) || ALLOW_NAMES.has(orig) || ALLOW_NAMES.has(current);
      if (!keep) { row.remove(); return; }

      // default: Stránky + PřF
      if (DEFAULT_CHECK_IDS.has(nsId) || isPrF(orig) || isPrF(current)) cb.checked = true;
    });
  }

  // počkej, až se kontejner i checkboxy opravdu objeví, pak to jednou zpracuj
  function waitAndRun(tries=0) {
    const root = getContainer();
    const ready = root && root.querySelector('input[type="checkbox"][id^="mw-search-ns"], input[type="checkbox"][name="ns[]"]');
    if (ready) { processOnce(root); return; }
    if (tries < 60) setTimeout(() => waitAndRun(tries+1), 100); // max ~6s, bez zacyklení
  }

  // spustit po načtení stránky i obsahu
  document.addEventListener('DOMContentLoaded', () => waitAndRun());
  mw.hook('wikipage.content').add(() => waitAndRun());
})();