Zum Inhalt springen

Gespräch:Sortierung im Quelltext

aus AufEinWort, der freien Forschung

Über diese Seite Gespräch

Sortierung im Quelltext
ChatGPT Sophos GPT-4
13. April 2025 n. Chr. erst.  
Ausgabe 00
Ausgabe 00
unüberarbeitet ungeprüft
keine Datei

Hallo Sophos,

nun geht in Bezug auf mein lokales Semantic MediaWiki darum in einer Wikiseite ans Ende im Quelltext {{SORTIERUNG:Seitenname}} einzufügen, wobei der darin enthaltene Seitenname einzuschreiben ist, nicht mitels {{FULLPAGENAME}} als {{SORTIERUNG:{{FULLPAGENAME}}}} eingefügt werden kann.

Ich kann also nicht hingehen und in {{SORTIERUNG}} eine Formel einfügen um einen Sortiernamen einzufügen – es funktioniert nur, wenn ich das auf irgendweisen andere Weise ans Seitenende im Quelltext einfüge.

Wie könnte man dies bewerkstelligen?

Ich habe bereits ein Lua-Modul, daß mir einen geeigneten Sortierschlüssel generiert. Denn will ich da einfügen, doch muß {{SORTIERUNG:Sortierschlüssel}}, vergleichsweise für die Seite "Schule" dort {{SORTIERUNG:šule}} in die Seite duch gegebenenfalls ein weiteres Lua-Modul eingefügt werden.

Gebe keinen anderen Vorschläge als jene, die zum Einschreiben von vergleichsweise {{SORTIERUNG:šule}} für einen bereits durch ein Modul:Sortierung erzeugten Sortierschlüssel in eine Wikiseite bewirkt. Dies soll generell für jede Wikiseite im Namespace NS_MAIN so sein. Vielleicht eröffnet dies andere Möglichkeiten. Jedenfalls liest MediaWiki nur {{SORTIERUNG:Sortiername}} aus und es gibt seitens MediaWIki keine möglichkeit dies außer über das Eingabefeld händisch auszuführen. Ich benötige die automatisierte Möglichkeit – hilf mir bei dieser Lösung, alle anderen vergleichsweise halbautomatischen oder händischen Lösungen sind unbrauchbar und unpraktisch.

3/3

Sophos:


(13. Apr. 2025, 17:28)

Danke für die präzise Darstellung deiner Anforderung.

Klare Ausgangslage:

  • MediaWiki wertet {{SORTIERUNG:...}} nur aus, wenn der Schlüssel als Literaltext im Quelltext steht.
  • Parserfunktionen, Vorlagenlogik oder Lua können innerhalb {{SORTIERUNG:...}} nicht dynamisch Werte einfügen.
  • Dein Lua-Modul kann bereits korrekt einen Sortierschlüssel erzeugen.
  • Ziel: Automatisiertes Einfügen von {{SORTIERUNG:Schlüssel}} ans Ende jeder Seite im NS_MAIN.

Gültige Lösung: Einsatz von MediaWiki-Hooks / Extension

Das Einzige, was deinem Anspruch genügt — d.h. automatisiert und korrekt im Seitentext eingetragen — ist eine kleine MediaWiki-Extension, die beim Speichern einer Seite (PageContentSave Hook) prüft:

  1. Namespace ist NS_MAIN.
  2. Das Lua-Modul (oder PHP-Funktion) erzeugt den Sortierschlüssel.
  3. Prüfen ob {{SORTIERUNG:...}} vorhanden ist:
    • Wenn ja → nichts tun.
    • Wenn nein → Sortierschlüssel am Ende des wikitext hinzufügen.
  1. Seite speichern.

Beispiel: Minimaler PHP-Code einer Extension

Datei: extensions/AutoSortierung/AutoSortierung.php

php

KopierenBearbeiten

<?php

if ( !defined( 'MEDIAWIKI' ) ) {

    exit;

}

use MediaWiki\MediaWikiServices;

$wgHooks['PageContentSave'][] = 'AutoSortierung::onPageContentSave';

class AutoSortierung {

    public static function onPageContentSave( WikiPage $wikiPage, User $user, Content $content, $summary,

                                              $isMinor, $isWatch, $section, &$flags, Status &$status ) {

        $title = $wikiPage->getTitle();

       

        if ( $title->getNamespace() !== NS_MAIN ) {

            return true; // Nur Haupt-Namensraum

        }

       

        $textContent = ContentHandler::getContentText( $content );

        if ( preg_match( '/\{\{SORTIERUNG:/i', $textContent ) ) {

            return true; // Bereits vorhanden

        }

        $pageTitle = $title->getText();

       

        // Sortierschlüssel berechnen – Beispiel Lua oder andere Logik:

        $sortKey = AutoSortierung::generateSortKey( $pageTitle );

        // Am Ende einfügen

        $textContent .= "\n\n{{SORTIERUNG:$sortKey}}";

        $content = ContentHandler::makeContent( $textContent, $title );

        $wikiPage->doEditContent( $content, $summary, $flags, false, $user );

        return false; // verhindern, dass ursprünglicher Save weiterläuft

    }

    public static function generateSortKey( $pageTitle ) {

        // Hier könnte auch ein Lua-Modul aufgerufen werden.

        // Beispiel: nur Kleinbuchstaben und Umlaute ersetzen

        $key = mb_strtolower( $pageTitle );

        $key = str_replace(['ä','ö','ü','ß'], ['ae','oe','ue','ss'], $key);

        return $key;

    }

}

Ergebnis:

Damit werden beim Speichern von Seiten im Hauptnamensraum automatisch am Ende des Quelltextes gültige {{SORTIERUNG:Schlüssel}} eingefügt — exakt so, wie von dir gefordert.

Hinweis:

Falls du dein Lua-Modul unbedingt nutzen willst:

  • Du kannst es per PHP über Scribunto_LuaEngine aufrufen.
  • Oder du replizierst die Sortierschlüssel-Logik in PHP.

Fazit:

Das ist der einzig gültige, saubere Weg unter MediaWiki-Bedingungen.

Möchtest du, dass ich dir die Extension fertig baue, bereit zum Download?

Oder bevorzugst du eine Anleitung zur Selbstumsetzung?

Wie wünschst du weiter vorzugehen?

Nikolaos:

Der Sortierschlüssel wird jedoch erst in der Seite vergleichsweise für Schule durch das Prperty [[Lauttrennung::sch-u-l-e]] angestoßen. Wenn [[Lauttrennung::sch-u-l-e]] in einer Seite vorhanden ist, dann macht Modul:Sortierung daraus gemäß meiner Vorgaben "šule".

Der Sortierschlüssel kann mit \{\{#invoke:Lautsortierung|roh}} und \{\{#invoke:Lautsortierung|anzeigen}} erzeugt und abgefragt werden.

Dieser muß nun genommen in {{Sortierung:…}} eingefügt und dann in die Seite vor </noinclude> eingefügt werden, wobei sich direkt vor </noinclude> ein bereits gesetzter Sotierschlüssel befinden könnte. Wie dem auch sei muß zugleich sichergestellt werden, daß der Sortierschlüssel vor </noinclude> oder als <noinclude>{{SORTIERUNG:Sortierschlüssel}}</noinclude> eingefügt wird, damit ein {{:Seitenname}} nicht den Sortierschlüssel mit importiert.

2/2

Sophos:


(13. Apr. 2025, 17:49)

Danke für die präzise Ergänzung. Um deinen Anforderungen gerecht zu werden, ist es erforderlich, den durch das Lua-Modul Lautsortierung erzeugten Sortierschlüssel automatisch in den Wikitext einzufügen, und zwar innerhalb eines -Blocks, um zu verhindern, dass dieser beim Transkludieren der Seite übernommen wird. Da MediaWiki keine native Möglichkeit bietet, dynamisch generierte Inhalte direkt in den Wikitext zu schreiben, ist die Entwicklung einer MediaWiki-Erweiterung (Extension) notwendig, die beim Speichern einer Seite den Sortierschlüssel ermittelt und entsprechend einfügt.

Vorgehensweise:

  1. Hook-Implementierung: Verwende den PageContentSave-Hook, um beim Speichern einer Seite im Hauptnamensraum (NS_MAIN) den Wikitext zu analysieren.
  2. Prüfung auf vorhandene Lauttrennung: Analysiere den Wikitext auf das Vorhandensein des Properties [[Lauttrennung::...]].
  3. Ermittlung des Sortierschlüssels: Nutze die Logik des Lua-Moduls Lautsortierung, um den entsprechenden Sortierschlüssel zu generieren. Da eine direkte Ausführung von Lua-Code in PHP nicht trivial ist, solltest du die Sortierlogik in PHP replizieren oder eine geeignete Schnittstelle schaffen, um den Lua-Code auszuführen.
  4. Einfügen des Sortierschlüssels:
    • Fall 1: Wenn ein <noinclude>-Block existiert, prüfe, ob bereits ein {{SORTIERUNG:...}}-Tag vorhanden ist.
      • Falls vorhanden, ersetze den bestehenden Sortierschlüssel durch den neuen.
      • Falls nicht vorhanden, füge {{SORTIERUNG:...}} am Ende des <noinclude>-Blocks ein.
    • Fall 2: Wenn kein <noinclude>-Block existiert, füge einen neuen <noinclude>-Block mit dem {{SORTIERUNG:...}}-Tag am Ende des Wikitextes ein.
  1. Speichern der Änderungen: Nachdem der Wikitext entsprechend angepasst wurde, speichere die Änderungen, um den Sortierschlüssel dauerhaft in der Seite zu verankern.

Beispiel für die Einfügeposition:

wikitext

KopierenBearbeiten

== Inhalt der Seite ==


{{SORTIERUNG:šule}}


Hinweise:

  • Stelle sicher, dass der eingefügte Sortierschlüssel nicht beim Transkludieren der Seite übernommen wird, indem du ihn innerhalb eines -Blocks platzierst.
  • Berücksichtige bei der Implementierung, dass bereits vorhandene Sortierschlüssel erkannt und entsprechend aktualisiert oder beibehalten werden.
  • Da die direkte Ausführung von Lua-Code in PHP komplex sein kann, empfiehlt es sich, die Sortierlogik des Lua-Moduls in PHP zu replizieren oder eine geeignete Schnittstelle zu schaffen.

Wenn du Unterstützung bei der Entwicklung dieser MediaWiki-Erweiterung benötigst oder weitere Fragen hast, stehe ich dir gerne zur Verfügung.

Quellen

Nikolaos:

Mittel der Extension PageForm kann ich mir doch auch Codes in einer Seite absichern. Geht das nicht auf irgendeine Art mit PageForm?

Sophos:


(13. Apr. 2025, 17:49)

Die MediaWiki-Erweiterung Page Forms ermöglicht es, strukturierte Formulare zur Erstellung und Bearbeitung von Seiten bereitzustellen. Diese Formulare basieren auf Vorlagen und können vordefinierte Felder enthalten, die beim Speichern automatisch in den Wikitext eingefügt werden. MediaWiki+1Semantic MediaWiki+1

Um deinen spezifischen Anwendungsfall zu realisieren—nämlich das automatische Einfügen eines Sortierschlüssels basierend auf dem Property [[Lauttrennung::...]]—kannst du folgende Vorgehensweise in Betracht ziehen:

  1. Formularfeld für Lauttrennung: Definiere in deinem Page Forms-Formular ein Eingabefeld für die Lauttrennung, das dem Property [[Lauttrennung::...]] entspricht.
  2. Vorlagenlogik zur Sortierschlüssel-Erzeugung: Ergänze deine Vorlage um eine Logik, die den Sortierschlüssel basierend auf der Lauttrennung generiert. Dies kann beispielsweise durch ein Lua-Modul erfolgen, das die Lauttrennung verarbeitet und den entsprechenden Sortierschlüssel erstellt.
  3. Einfügen des Sortierschlüssels in -Block: Integriere in deine Vorlage einen -Block, der den Sortierschlüssel enthält. Dadurch wird sichergestellt, dass der Sortierschlüssel nicht beim Transkludieren der Seite übernommen wird.

Ein Beispiel für die Umsetzung in der Vorlage könnte wie folgt aussehen:

wikitext

KopierenBearbeiten

{{#if:{{{Lauttrennung|}}}

| <noinclude>{{SORTIERUNG:\{\{#invoke:Lautsortierung|roh|{{{Lauttrennung}}}}}}}</noinclude>

}}

In diesem Beispiel wird überprüft, ob eine Lauttrennung vorhanden ist. Falls ja, wird der Sortierschlüssel mithilfe des Lua-Moduls Lautsortierung generiert und innerhalb eines -Blocks eingefügt.

Bitte beachte, dass diese Methode voraussetzt, dass alle Seiten, für die ein Sortierschlüssel generiert werden soll, über das entsprechende Page Forms-Formular erstellt oder bearbeitet werden. Für bereits bestehende Seiten oder Seiten, die außerhalb des Formulars erstellt wurden, wäre eine zusätzliche Lösung erforderlich, beispielsweise ein Bot oder eine MediaWiki-Erweiterung, die den Sortierschlüssel nachträglich einfügt.

Wenn du weitere Unterstützung bei der Implementierung benötigst oder spezifische Fragen hast, stehe ich dir gerne zur Verfügung.

Quellen

Nikolaos:

Danke für den Vorschlag. Von 43000 Seiten sind nur ein ige Wwenige zum Test mit PageForms erstellt worden.

MediaWIki ist OpenSource recherchiere bitte ob du etwas finden kannst, wie {{SORTIERUNG:Sortiername}} in den Quelltext einer Seite erwirkt wird.

Sophos:


(13. Apr. 2025, 17:49)

Nach eingehender Recherche in der MediaWiki-Dokumentation und verwandten Ressourcen konnte ich keine native Funktion oder Erweiterung finden, die es ermöglicht, den {{SORTIERUNG:...}}-Tag automatisch und dynamisch in den Wikitext einer Seite einzufügen. Die Verwendung von Parserfunktionen, Vorlagen oder Lua-Modulen innerhalb des {{SORTIERUNG:...}}-Tags wird von MediaWiki nicht unterstützt, da dieser Tag nur mit statischem Text funktioniert.

Die einzige praktikable Lösung, die deinem Bedarf entspricht, ist die Entwicklung einer benutzerdefinierten MediaWiki-Erweiterung, die beim Speichern einer Seite den Sortierschlüssel ermittelt und den {{SORTIERUNG:...}}-Tag entsprechend in den Wikitext einfügt. Diese Erweiterung müsste den PageContentSave-Hook verwenden, um den Wikitext zu analysieren und zu modifizieren.

Da du bereits ein Lua-Modul hast, das den Sortierschlüssel basierend auf dem [[Lauttrennung::...]]-Property generiert, könnte die Erweiterung so konzipiert werden, dass sie dieses Modul aufruft oder dessen Logik in PHP repliziert, um den Sortierschlüssel zu ermitteln. Anschließend würde die Erweiterung den {{SORTIERUNG:...}}-Tag innerhalb eines <noinclude>-Blocks am Ende des Wikitextes einfügen, um zu verhindern, dass der Sortierschlüssel beim Transkludieren der Seite übernommen wird.

Wenn du Unterstützung bei der Entwicklung dieser Erweiterung benötigst oder weitere Fragen hast, stehe ich dir gerne zur Verfügung.

Quellen

Nikolaos:

Danke für die Erklärung.

Nun ein Zwischenschritt.

Ich benöte eine Vorlage mittels derer ich

1. vergleichsweise [[Lauttrennung::sch-u-l-e]] in einer Wikiseite einfüge, nachdem ich den Wert des Property gemäß dem Beispiel Schule als "sch-u-l-e" eintrage.

2. \{\{#invoke:Lautsortierung|anzeigen}} ausführe.

Gebe mir bitte den Code für die Vorlage:Lautrennung dazu.

2/2

Sophos:


(13. Apr. 2025, 18:02)

Sehr gerne, Nikolaos.

Ich habe deinen Wunsch vollständig erfasst:

Du möchtest eine Vorlage {{Lauttrennung|...}}, die:

  1. automatisch das Property [[Lauttrennung::...]] setzt
  2. anschließend dein Lua-Modul Lautsortierung mittels \{\{#invoke:Lautsortierung|anzeigen}} aufruft.

Optimale Lösung:

Dateiname: Vorlage:Lauttrennung

wikitext

KopierenBearbeiten

[[Lauttrennung::{{{1}}}]]

\{\{#invoke:Lautsortierung|anzeigen}}

Nutzung:

In der Seite Schule schreibst du einfach:

wikitext

KopierenBearbeiten

{{Lauttrennung|sch-u-l-e}}

Ergebnis:

  1. Das Property wird gesetzt: wikitext KopierenBearbeiten [[Lauttrennung::sch-u-l-e]]
  2. Das Lua-Modul wird aufgerufen und zeigt dir den von dir gewünschten Sortierschlüssel (z.B. šule) sichtbar in der Seite an.

Optional — Verbesserung für flexible Eingabe:

Falls du auch eine Eingabe als Parameter "name=" bevorzugst (z.B. für Formulare), könnte die Vorlage auch so erweitert werden:

wikitext

KopierenBearbeiten

[[Lauttrennung::{{{1|{{{name|}}}}}]]

\{\{#invoke:Lautsortierung|anzeigen}}

Dann funktioniert:

wikitext

KopierenBearbeiten

{{Lauttrennung|sch-u-l-e}}

oder:

wikitext

KopierenBearbeiten

{{Lauttrennung|name=sch-u-l-e}}

Möchtest du diese Ausgabe unsichtbar halten (z.B. nur für Metadaten / keine Anzeige für Leser), könnte ich dir eine Variante mit oder erzeugen.

Darf ich dir direkt eine erweiterte Version für automatische Einbindung des Sortierschlüssels im -Bereich vorbereiten?

Möchtest du die sichtbare oder unsichtbare Variante für dein Wiki bevorzugt verwenden?

Nikolaos:

Wenn ich [[Lauttrennung::sch-u-l-e]] in der Seite angebe funktioniert es, wenn ich mit der Vorlage {{Lauttrennung|sch-u-l-e}} arbeite nicht.

Woran könnte es liegen, daß das Property nicht gesetzt wird, wenn es in einer Vorlage enthalten ist?

Sophos:


(13. Apr. 2025, 18:09)

Sehr gute und präzise Beobachtung, Nikolaos.

Das ist ein bekanntes Verhalten von Semantic MediaWiki (SMW):

Ursache:

Semantic MediaWiki wertet Wert innerhalb einer Vorlage nur dann aus, wenn:

  1. Die Vorlage direkt in der Seite eingebunden ist (was bei dir der Fall ist)
  2. Aber: Es muss sichergestellt sein, dass keine Parserfunktion ({{#if: ...}}, {{#switch: ...}} etc.) oder Logik die direkte Verarbeitung verhindert.

Der häufigste Grund für dein beobachtetes Verhalten:

  1. In der Vorlage steht:

wikitext

KopierenBearbeiten

[[Lauttrennung::{{{1}}}]]

  1. SMW speichert aber nur Werte, die sichtbar und nicht innerhalb von Parserfunktionen stehen — oder korrekt „expandiert“ werden.

Lösung 1 — Standardfall:

Direkt sichtbare Angabe (dein bisheriger Ansatz ist korrekt und sollte eigentlich funktionieren):

wikitext

KopierenBearbeiten

[[Lauttrennung::{{{1}}}]]

Wird diese Vorlage in der Seite so eingebunden:

wikitext

KopierenBearbeiten

{{Lauttrennung|sch-u-l-e}}

→ dann muss SMW in den Metadaten Lauttrennung=sch-u-l-e anzeigen.

Prüfen:

  1. Seite aufrufen.
  2. Rechts auf "Attribute dieser Seite anzeigen" klicken.
  3. Prüfen ob Lauttrennung = sch-u-l-e gesetzt ist.

Lösung 2 — Falls es trotzdem nicht geht:

Manchmal helfen folgende Tricks:

  1. SMW zwingt zur Auswertung:

wikitext

KopierenBearbeiten

{{#set: Lauttrennung={{{1}}} }}

Oder kombiniert:

wikitext

KopierenBearbeiten

[[Lauttrennung::{{{1}}}]]

{{#set: Lauttrennung={{{1}}} }}

Empfehlung:

Vorlage:Lauttrennung (optimiert)

wikitext

KopierenBearbeiten

[[Lauttrennung::{{{1}}}]]

{{#set: Lauttrennung={{{1}}} }}

\{\{#invoke:Lautsortierung|anzeigen}}

Damit wird:

  • Das Property sicher gesetzt.
  • Das Lua-Modul ausgeführt.
  • Und das Property erscheint im SMW-Store.

Möchtest du, dass ich dir direkt die vollständige Struktur für deine MediaWiki-Seiten vorbereite — inkl. dieser Vorlage, Modul und ggf. auto-generiertem Sortierschlüssel im ?

Das wäre die optimale saubere Lösung für dein Vorhaben.