Convert2Markdown

Anfang des Jahres schrieb ich ein Tool, mit welchem WordPress-Dumps in Markdown umgewandelt werden können. In den letzten Tagen habe ich das Tool erweitert, sodass es nun auch mit MediaWiki-Dumps umgehen kann und diese ebenfalls nutzen und in Markdown konvertieren kann:

java -jar Convert2Markdown.jar -i mediawiki-dump.xml

Im Zuge dessen wurde das Tool umbenannt, statt WordPress2Markdown trägt es nun den Namen Convert2Markdown. Die Erkennung welche Art Dump genutzt wird, wird von Convert2Markdown automatisch vorgenommen und der entsprechende Konverter genutzt. Daneben wurden weitere Kleinigkeiten überarbeitet; so ist es nun unter anderem möglich Artikel nach Autorenschaft zu filtern. Zu finden ist das Werkzeug auf GitHub. Dort kann auch das Release bezogen werden. Convert2Markdown ist unter der GPL3 lizenziert und damit freie Software.

Bibliothek zum Einlesen von MediaWiki-Dump-Dateien

Für ein Projekt war ich auf der Suche nach einer Java-Bibliothek um die Dumps einer MediaWiki-Installation auszuwerten. Fündig geworden bin ich bei der Bibliothek WikiXMLJ, welche allerdings mittlerweile einige Jahre auf dem Buckel hat. Auf Basis dieser Bibliothek habe ich die Bibliothek mediawikixml erstellt. Um die Bibliothek zu nutzen, muss im ersten Schritt eine neue Paketquelle in der pom.xml definiert werden.

<repositories>
 <repository>
 	<id>github</id>
 	<url>https://maven.pkg.github.com/seeseekey/mediawikixml</url>
 </repository>
</repositories>

Anschließend kann die Abhängigkeit eingebunden werden:

<dependency>
    <groupId>net.seeseekey</groupId>
    <artifactId>mediawikixml</artifactId>
    <version>1.0.1</version>
</dependency>

Damit kann die Bibliothek zur Auswertung von MediaWiki-Dumps genutzt werden:

WikiXMLParser wikiXMLParser = WikiXMLParserFactory.getParser("dump-current.xml");

try {

    wikiXMLParser.setPageCallback(new PageCallbackHandler() {
        public void process(WikiPage page) {
            System.out.println(page.getId());
            System.out.println(page.getRevisionId());
            System.out.println(page.getTimestamp());
            System.out.println(page.getTitle());
            System.out.println(page.getWikiText());
        }
    });

    wikiXMLParser.parse();
} catch (Exception e) {
    e.printStackTrace();
}

Für jede MediaWiki-Seite wird unter anderem die ID, die Revision, der Timestamp, der Titel und der eigentliche Inhalt der Seite geparst. Die Bibliothek setzt mindestens Java 8 voraus. Zu finden ist das Repository mit der Bibliothek auf GitHub. Die Bibliothek ist unter der Apache License in Version 2 lizenziert und damit freie Software.

Dump einer MediaWiki-Installation erstellen

Wer eine Wiki mit der freien Software MediaWiki betreibt und einen Dump derselben erstellen möchte, kann hierfür eines der Werkzeuge nutzen, welches bereits mit der MediaWiki-Installation mitgeliefert wird. Im Ordner maintenance findet sich für diese Zwecke das PHP-Skript dumpBackup.php:

php dumpBackup.php --full > dump.xml

Mit dem Befehl wird die komplette Wiki, inklusive der Historie jeder Seite, gesichert und in den Dump geschrieben. Soll nur der aktuelle Stand der Wiki gesichert werden, so kann hierfür der Parameter current genutzt werden:

php dumpBackup.php --current > dump.xml

Für eine komplette Sicherung der Wiki sollte nicht nur der Dump, sondern auch der Ordner images gesichert werden.

Java-Bibliothek für den Zugriff auf die MediaWiki-API

Bibliotheken um die MediaWiki-API anzusteuern gibt es wie Sand am Meer. Bei soviel Auswahl fällt es natürlich schwer eine passende und funktionale Bibliothek zu finden. Für Java habe ich mittlerweile die Bibliothek JWBF (kurz für Java Wiki Bot Framework) für mich entdeckt. Die Bibliothek kann einfach per Maven eingebunden werden:

<dependency>
	<groupId>net.sourceforge</groupId>
	<artifactId>jwbf</artifactId>
	<version>3.1.1</version>
</dependency>

Anschließend kann eine MediaWiki-Seite ohne Probleme bezogen werden:

MediaWikiBot wikiBot = new MediaWikiBot("https://wiki.example.org/");
Article article = wikiBot.getArticle("Artikelname");
System.out.println(article.getText());

Auch das Anlegen von Artikeln ist kein Problem:

MediaWikiBot wikiBot = new MediaWikiBot("https://wiki.example.org/");

Article article = new Article(wikiBot, "Test");
article.addText("Lorem ipsum dolor sit amet.");

wikiBot.login("Nutzername", "Passwort");
article.save();

Der Quelltext der Bibliothek ist auf GitHub zu finden. Lizenziert ist die Bibliothek unter der Apache License in der Version 2.0 und damit freie Software.

Bibliothek zur Nutzung der MediaWiki-API unter .NET

Für ein kleines Projekt war ich auf der Suche nach einer halbwegs aktuellen Bibliothek zur Nutzung der MediaWiki-API. Wenn man sich auf der entsprechenden Seite in der MediaWiki-Dokumentation umschaut, wird man feststellen das einem nicht all zu viele Bibliotheken zur Verfügung stehen.

Die Auswahl an .NET Bibliotheken fällt eher mager aus

Genutzt habe ich letztendlich die Bibliothek Wiki Client Library, da diese halbwegs aktuell ist und mit meinen MediaWiki-Installationen problemlos zusammenarbeitet. Ein minimales Beispiel zur Bearbeitung einer Wiki-Seite sieht mit der Bibliothek wie folgt aus:

// Init
var client = new WikiClient
{
    ClientUserAgent = "WikiBot"
};

var site = new WikiSite(client, https://wiki.example.com/api.php);

// Login
await site.Initialization;
try
{
    await site.LoginAsync("username", "password");
}
catch (WikiClientException ex)
{
    Console.WriteLine(ex.Message);
}

// Edit site
var page = new WikiPage(site, buildingName);

// Load page
await page.RefreshAsync(PageQueryOptions.FetchContent);

// Update page
page.Content = "new content";
await page.UpdateContentAsync("New page created.", minor: false, bot: true);

// Logout
await site.LogoutAsync();

Über die Nutzung von Generatoren ist es möglich größere Bereiche wie z.B. Kategorien oder Suchergebnisse zu iterieren:

// Iterate all pages
var generator = new AllPagesGenerator(site)
{
    StartTitle = "A",
    NamespaceId = BuiltInNamespaces.Main,
    PaginationSize = 50
};

using (var enumerator = generator.EnumPagesAsync().GetEnumerator())
{
    int index = 0;

    while (await enumerator.MoveNext(CancellationToken.None))
    {
        // Debug output
        var page = enumerator.Current;
        Console.WriteLine("{0}: {1}", index, page);
        index++;

        // Load page
        await page.RefreshAsync(PageQueryOptions.FetchContent);

        // Update page
        page.Content = "new content";
        await page.UpdateContentAsync("Update page.", minor: true, bot: true);
    }
}

Der Quelltext der Wiki Client Library ist auf GitHub zu finden. Lizenziert ist er unter der Apache Licence 2 und damit freie Software.