Wikiup:Technik/Text/Edit/MwJed

aus Wikipedia, der freien Enzyklopädie

Mit dem Texteditor jEdit und dem mwjed-Plugin lassen sich mehrere Artikel parallel direkt in den Editor laden, bearbeiten und direkt aus ihm heraus wieder im Wiki abspeichern.

Derzeit ist die Nutzung nicht möglich, da die Login-Sequenz geändert wurde, und das Tool noch nicht angepasst wurde. Im Übrigen sind die URL nicht mehr gültig.

Diese Methode eignet sich vor allem dazu, um gleiche Änderungen mit Suchen und Ersetzen parallel in vielen Artikeln gleichzeitig zu machen und dann in einem Rutsch wieder abzuspeichern. Eine Möglichkeit, die sonst per Handarbeit stupide und langwierig wäre, ist beispielsweise das automatische Konvertieren von "-Gänsefüßchen in „“-Gänsefüßchen (siehe Wikipedia:Typografie).

Installation von jEdit

  1. Voraussetzung: Java (Minimum 1.4) installiert; wenn nicht von Sun-Java herunterladen und installieren.
  2. jEdit von download jEdit runterladen (passenden Installer nehmen) und den Installationsanweisungen von dort folgen.
  3. Auf mwjed home gehen und die Instruktionen im Abschnitt INSTALLATION abarbeiten, um das mwjed-Plugin (das MediaWiki-Plugin) zu installieren. Unter Windows dabei nach dem Ordner .jedit suchen (Punkt ist wichtig) dann entsprechend der dortigen Anweisung dort weitermachen.
  4. jEdit starten.

Tipps und Tricks

Konvertierung von Gänsefüßchen von Hand

  1. Zunächst jEdit starten und dann sich über den Texteditor im Wiki einloggen im Menü Plugins -> MwJed -> Log in und im folgenden Dialog im Auswahlmenü das gewünschte Wiki auswählen und seinen Benutzernamen und Passwort von diesem Wiki eingeben. Wenn das Login geklappt hat erscheint unten rechts im Activity-Fenster eine entsprechende Meldung.
  2. Dann in Plugins -> MwJed -> Open Page das Inhaltsverzeichnis seiner Artikel, die man bearbeiten möchte, laden (Artikellemma mit Namespacenamen, aber keinen vollständigen Weblink). Wenn das alles geklappt hatte sollte im Activity-Fenster einiges stehen und der Quelltext des Inhaltsverzeichnisses im Editor nach ein paar Sekunden zu sehen sein.
  3. Dann mit der Maus die Wikilinks der Artikel die man bearbeiten möchte einfach markieren und dann in Plugins -> MwJed -> Open linked pages anklicken. Nun sollte der Editor alle Artikel deren Lemma im Inhaltsverzeichnis markiert ist laden (links unten sieht man alle geöffneten Artikel).
  4. Dann im Menü Search -> Search in Open Buffers auswählen und im erscheinenden Dialogfenster All Buffers und Regular expressions auswählen und unten bei Filter den Filter *.wpk einstellen.
  5. Nun folgt 4 Mal ein Suchen-Ersetzen-Arbeitsschritt mit verschiedenen Suchen-Ersetzen-Ausdrücken, deren Reihenfolge unbedingt eingehalten werden muss (jedesmal Replace All anklicken). Dabei unbedingt auch die Gleichheitszeichen mitkopieren, aber keine führenden oder endenden Leerzeichen (siehe unten).
  6. Danach im Menü Plugins -> MwJed -> Save all dirty pages auswählen, im erscheinenden Fenster einen Änderungskommentar angeben (erscheint in der Artikelhistory) und den Haken für die Watchlist (Beobachten) unbedingt setzen (sonst sind die Artikel nicht mehr auf der Watchlist und man kann sie nicht mehr nachchecken, was jetzt geändert wurde und ob es richtig war).
  7. Wenn der Editor fertig mit Speichern ist, im Browser die Beobachtungsliste aufrufen und im Diff schauen, ob alles richtig war, ansonsten einzeln manuell nacharbeiten und falsch gesetzte Gänsefüßchen rückgängig machen, was vielleicht bei 1 von 10 Artikeln der Fall ist. Diese Routine ist nicht fehlerfrei (sie setzt eher zu viele als zu wenige Gänsefüßchen. Sie vergisst nur sehr selten welche und wenn, dann nur einzelne, so dass man das dazugehörige zweite Gänsefüßchen trotzden dank Diff-Markierung findet).
suchen:                                     ersetzen:
="([^"]*)"                                  =§§§$1§§§
(^\**|^:*|^;*|\s|[\(\[\|'>])"('*\[*\w)      $1„$2
(\w\]*'*.?)"($|\s|[\)\]\|',;.:<-])          $1“$2
=§§§([^§]*)§§§                              ="$1"

Entlinken

Bestimmte Wikilinks im Text werden wie folgt entfernt; hier am Beispiel Antarktis:

suchen:                      ersetzen:
\[\[Antarktis\|([^]]+)\]\]   $1
\[\[Antarktis\]\]            Antarktis

Einen Text komplett entlinken (Bilder und alle anderen Links die „:“ enthalten bleiben erhalten):

suchen:                      ersetzen:
\[\[([^|\]:]+)\]\]           $1
\[\[[^|\]:]+\|([^]]+)\]\]    $1

Direkte Hinweislinks wie „siehe Antarktis“ im Text schauen dann natürlich hinterher merkwürdig aus, aber das lässt sich nur per Hand lösen.

Entfernen mehrfacher Leerzeichen

Entfernen mehrfacher Leerzeichen:

suchen:                      ersetzen:
\ +                          \ 

Vorsicht: Bitte unbedingt das Leerzeichen beim Ersetzen nach dem \ nicht vergessen! Also der Ausdruck fürs Ersetzen lautet mit Gänsefüßchen: „\ “.

Entfernen aller Navileisten

Zum Entfernen von Navileisten suche nach \{\{Navigationsleiste[^}]+\}\} und ersetze es (Replace All) durch nichts.

Makros

Konvertierung von Gänsefüßchen mittels Makro

  1. Speichere das unten stehende Script in ~/.jedit/macros/WikiFuessegaenschen.bsh.
  2. Führe Macros -> Rescan macros aus, um das Makro zu laden.
  3. Über Utilities -> Global options -> Shortcuts -> Macros bindest du es an eine Tastenkombination .
String modify(String text) {
    // DOTALL, MULTILINE
    return text.replaceAll(
        // save HTML attributes
        "(?s)(?m)" +
        "=\"([^\"]*)\"",
        "=§§§$1§§§"
    ).replaceAll(
        // replace starting quotes
        "(?s)(?m)" + 
        "(^\\**|^:*|^;*|\\s|[\\(\\[\\|'>])\"('*\\[*\\w)",
        "$1\u201e$2"
    ).replaceAll(
        // replace ending quotes
        "(?s)(?m)" + 
        "(\\w\\]*'*.?)\"($|\\s|[\\)\\]\\|',;.:<-])",
        "$1\u201c$2"
    ).replaceAll(
        // rebuild HTML attributes
        "(?s)(?m)" +
        "=§§§([^§]*)§§§",
        "=\"$1\""
    );
}

global.mwjed.modifyAll(view.EditPane.TextArea, this);

Konvertierung von HTML-Tabellen in MediaWiki-Markup

  1. Speichere das unten stehende Script in ~/.jedit/macros/WikiConvertHtmlTable.bsh.
  2. Führe Macros -> Rescan macros aus, um das Makro zu laden.
  3. Über Utilities -> Global options -> Shortcuts -> Macros bindest du es an eine Tastenkombination
import au.id.jericho.lib.html.*;

/** convert one table after another */
String modify(String text) {
    String  original    = text;
    for (;;) {
        var source  = new Source(text);
        var output  = new OutputDocument(source);
        var tables  = source.findAllElements("table");
        if (tables.size() == 0) break;
        var table   = tables.get(0);
        var buffer  = table(table);
        output.replace(table, buffer);
        text    = output.toString();
    }
    return fixLinefeeds(text);
}

/** change linefeeds before and after tables */
String fixLinefeeds(text) {
    return text
            // remove unnecessary linefeeds after tables
            .replaceAll("(?m)^\\|\\}\n\n+",                 "|}\n\n")
            // insert linefeed before nested tables 
            .replaceAll("(?m)^(\\|[^|\\n]*)?\\| *\\{\\|",   "$1|\n{|")
            // remove linefeed after nested tables
            .replaceAll("(?m)^\\|\\}\n+\\|",                "|}\n|");
}

/** convert a table */
String table(var table) {
    String  buffer  = "{|" + attrs(table) + "\n";
    for (var row : table.ChildElements) {
        buffer  += row(row);
    }
    buffer  += "|}" + "\n";
    return buffer;
}

/** convert a table row */
String row(var row) {
    String  buffer  = "";
    if (row.StartTag.Name.equals("caption")) {
        buffer  += "|+ " + row.Content.toString().trim() + "\n";
    }
    else if (row.StartTag.Name.equals("tr")) {
        buffer  += "|-" + attrs(row) + "\n";
        for (var cell : row.ChildElements) {
            buffer  += cell(cell);
        }
    }
    else {
        Macros.error(view, "expected tr, got: " + row);
        return fixUnexpected(row);
    }
    return buffer;
}

/** convert a table cell */
String cell(var cell) {
    String  buffer  = "";
    if (cell.StartTag.Name.equals("th")) {
        buffer  += "!";
    }
    else if (cell.StartTag.Name.equals("td")) {
        buffer  += "|";
    }
    else {
        Macros.error(view, "expected th or td, got: " + cell);
        return fixUnexpected(cell);
    }
    buffer  += attrs(cell);
    buffer  += cell.StartTag.Attributes.Count != 0 ? " | " : " ";
    
    var content = cell.Content.toString();
    if (content.matches("(?s)\\s*\n[ *#=:;].*"))    buffer  += "\n";
    buffer  += content.trim() + "\n";
    return buffer;
}

/** helper function to compile attributes of an element */
String attrs(var element) {
    var attrs   = element.StartTag.Attributes;
    if (attrs.Count == 0)   return "";
    String  raw = attrs.toString().replace("\n", " ").trim();
    for (var key : FIXED_ATTRS) {
        raw = fixAttr(raw, key);
    }
    return " " + raw;
}

String[] FIXED_ATTRS = new String[] {
    "valign", "align", 
    "bgcolor", "color", 
    "border", "cellpadding", "cellspacing", 
    "colspan", "rowspan", 
    "width", "height"
};

/** fix syntax of a single attribute */
String fixAttr(String attrs, String key) {
    return attrs.replaceAll(
        "(?i)" + key + " *= *\"?([#%a-z0-9]+)\"?",
        key + "=\"$1\"");
}

/** make a String representation for unexpected content */
String fixUnexpected(var element) {
    return element.toString().replaceAll("\\s+$", "") + "\n";
}

global.mwjed.modifyAll(view.EditPane.TextArea, this);