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)); });
});
});
})();