Benutzer:Holm/common.js

Hinweis: Leere nach dem Speichern den Browser-Cache, um die Änderungen sehen zu können.

  • Firefox/Safari: Umschalttaste drücken und gleichzeitig Aktualisieren anklicken oder entweder Strg+F5 oder Strg+R (⌘+R auf dem Mac) drücken
  • Google Chrome: Umschalttaste+Strg+R (⌘+Umschalttaste+R auf dem Mac) drücken
  • Internet Explorer: Strg+F5 drücken oder Strg drücken und gleichzeitig Aktualisieren anklicken
  • Opera: Gehe zu Menü → Einstellungen (Opera → Einstellungen auf dem Mac) und dann auf Datenschutz & Sicherheit → Browserdaten löschen → Gespeicherte Bilder und Dateien.
/* Solche / So Schicht – persönlicher Texteditor, nur für Holm und Privat:So Schicht.
   Einmalig als Benutzer:Holm/common.js im MediaWiki speichern.
   Bearbeitet bewusst nur schlichten Erzähltext in den Zellen der Fototabelle.
   Keine Formatierung hinzufügen: Wiki-Syntax außerhalb des Textfeldes bleibt unverändert. */
(function () {
  'use strict';
  if (mw.config.get('wgPageName') !== 'Privat:So_Schicht' ||
      mw.config.get('wgUserName') !== 'Holm' ||
      mw.config.get('wgAction') !== 'view') return;

  mw.loader.using(['mediawiki.api']).then(function () {
    var api = new mw.Api();
    var target = Array.from(document.querySelectorAll('h2')).find(function (h) {
      return h.textContent.indexOf('Handschriftenvergleich 2020') !== -1;
    });
    if (!target) return;
    var button = document.createElement('button');
    button.type = 'button';
    button.textContent = 'Menzel-Text visuell bearbeiten';
    button.style.cssText = 'margin:0.7em;padding:0.5em 0.9em;cursor:pointer';
    target.parentNode.insertBefore(button, target.nextSibling);

    button.addEventListener('click', function () {
      api.get({ action: 'query', prop: 'revisions', titles: 'Privat:So Schicht',
        rvprop: 'ids|content', rvslots: 'main', formatversion: 2 }).then(function (response) {
        var rev = response.query.pages[0].revisions[0];
        var source = rev.slots.main.content;
        // Capture text of a single right-hand cell, preserving its original wiki syntax.
        var re = /\|-\s*\n\|\s*'''Foto\s+(\d+)'''[^\n]*\n[\s\S]*?\n\|\s*([\s\S]*?)(?=\n\|-\s*\n\|\s*'''Foto|\n\|\})/g;
        var matches = Array.from(source.matchAll(re));
        if (!matches.length) {
          alert('Die Fototabelle wurde nicht eindeutig erkannt. Nichts geändert.'); return;
        }
        var shade = document.createElement('div');
        shade.style.cssText = 'position:fixed;z-index:999999;inset:0;background:rgba(0,0,0,.65);display:flex;justify-content:center;align-items:center;padding:10px';
        var panel = document.createElement('div');
        panel.style.cssText = 'box-sizing:border-box;width:min(940px,96vw);max-height:95vh;overflow:auto;background:white;color:black;padding:20px;display:flex;flex-direction:column;gap:12px';
        var tip = document.createElement('p');
        tip.textContent = 'Nur den Erzähltext bearbeiten; Fett/Kursiv und Tabellenformatierung bleiben in der ersten Version unverändert. Die Fußzeile bitte im Text belassen.';
        var select = document.createElement('select');
        matches.forEach(function (m, i) {
          var option = document.createElement('option'); option.value = i;
          option.textContent = 'Foto ' + m[1]; select.appendChild(option);
        });
        var editor = document.createElement('div');
        editor.contentEditable = 'true'; editor.spellcheck = true;
        editor.style.cssText = 'min-height:270px;max-height:60vh;overflow:auto;white-space:pre-wrap;border:1px solid #999;padding:16px;font:18px/1.6 Georgia,serif';
        var chosen, prefix, suffix;
        function load() {
          chosen = matches[Number(select.value)];
          var cell = chosen[2];
          var a = cell.match(/^\s*/)[0], b = cell.match(/\s*$/)[0];
          var inner = cell.slice(a.length, cell.length - b.length);
          var italics = inner.startsWith("''") && inner.endsWith("''");
          prefix = a + (italics ? "''" : '');
          suffix = (italics ? "''" : '') + b;
          if (italics) inner = inner.slice(2, -2);
          if (/<(?!br\s*\/?\s*>)[^>]+>/i.test(inner)) {
            alert('Dieser Zellentext enthält HTML; bitte den Wiki-Quelltexteditor verwenden.');
            editor.contentEditable = 'false'; return;
          }
          editor.contentEditable = 'true';
          editor.textContent = inner.replace(/<br\s*\/?\s*>/gi, '\n');
        }
        select.onchange = load; load();
        var buttons = document.createElement('div');
        buttons.style.cssText = 'display:flex;gap:12px;flex-wrap:wrap';
        var save = document.createElement('button'); save.type='button';
        save.textContent = 'Im Wiki speichern'; save.style.cssText='font-weight:bold;padding:8px';
        var cancel = document.createElement('button'); cancel.type='button'; cancel.textContent = 'Schließen';
        cancel.onclick = function () { shade.remove(); };
        save.onclick = function () {
          if (editor.contentEditable === 'false') return;
          if (!confirm('Den Text für Foto ' + chosen[1] + ' speichern?')) return;
          var plain = editor.innerText.replace(/\r/g, '').replace(/\u00a0/g, ' ');
          var newCell = prefix + plain + suffix;
          // Replace only the verified cell, using its exact source offset.
          var offset = chosen.index + chosen[0].lastIndexOf(chosen[2]);
          if (source.slice(offset, offset + chosen[2].length) !== chosen[2]) {
            alert('Sicherheitsprüfung fehlgeschlagen; keine Änderung.'); return;
          }
          var next = source.slice(0, offset) + newCell + source.slice(offset + chosen[2].length);
          save.disabled = true;
          api.postWithToken('csrf', { action: 'edit', title: 'Privat:So Schicht',
            text: next, baserevid: rev.revid, summary: 'Menzel: Foto ' + chosen[1] + ' über Texteditor geändert' })
            .then(function (result) {
              if (result.edit && result.edit.result === 'Success') location.reload();
              else { save.disabled = false; alert('Speichern nicht bestätigt.'); }
            }).catch(function (err) {
              save.disabled = false;
              alert('Nicht gespeichert – möglicherweise wurde die Seite inzwischen geändert: ' + String(err));
            });
        };
        buttons.appendChild(save); buttons.appendChild(cancel);
        panel.appendChild(tip); panel.appendChild(select); panel.appendChild(editor); panel.appendChild(buttons);
        shade.appendChild(panel); document.body.appendChild(shade);
      }).catch(function (err) { alert('Wikiseite konnte nicht geladen werden: ' + String(err)); });
    });
  });
})();