Probleme mit der Methode appendReplacement unter Java

Mit regulären Expressionen kann in einem String nach bestimmten Zeichenketten gesucht werden. Daneben ist es natürlich auch möglich diese Zeichenketten zu modifizieren und sie anschließend zu ersetzen. Unter Java würde das Ganze wie folgt aussehen:

private static String convertBlockquotes(String html) {

	Pattern patternBlockquote = Pattern.compile("<blockquote>(.+?)</blockquote>", Pattern.DOTALL);

	// Find all blockquote tags
	final Matcher matcher = patternBlockquote.matcher(html);
	StringBuffer stringBuffer = new StringBuffer(html.length());

	// Translate each tag
	while (matcher.find()) {

		// Get complete tag
		String group = matcher.group();

		// Remove tags
		group = group.replace("<blockquote>", "");
		group = group.replace("</blockquote>", "");

		// Replace old tag with markdown equivalent
		matcher.appendReplacement(stringBuffer, group);
	}

	matcher.appendTail(stringBuffer);
	return stringBuffer.toString();
}

Wenn nun in dem gefundenen String sich z.B. ein $-Zeichen (das Zeichen für Ersetzung im Kontext der Matcher-Klasse) befindet, wird spätestens bei der Zeile:

// Replace old tag with markdown equivalent
matcher.appendReplacement(stringBuffer, group);

ein Problem auftreten, welches sich in einer IllegalArgumentException äußert:

Exception in thread „main“ java.lang.IllegalArgumentException: Illegal group reference

Hintergrund ist das bestimmte Zeichen wie $ oder der Backslash maskiert werden müssen. Dies konnte manuell erledigt werden, bevor die Methode appendReplacement aufgerufen wird:

group = group.replace("$", "\\$");

Einfach ist es die integrierte Methode quoteReplacement zu nutzen:

group = Matcher.quoteReplacement(group);

Diese maskiert die entsprechenden Zeichen. Ein etwas andere Lösung ist es appendReplacement ohne neue Zeichenkette aufzurufen und diese anschließend an den StringBuffer anzufügen:

matcher.appendReplacement(stringBuffer, "");
stringBuffer.append(group);

Bei dieser Variante müssen keine Zeichen maskiert werden. Die vom JDK angedachte Variante ist allerdings die der Nutzung von quoteReplacement, so das diese bevorzugt werden sollte.

WordPress-Beiträge und Seiten in Markdown umwandeln

Im letzten Jahr schrieb ich über ein Tool mit welchem die WordPress-Export-Datei in Markdown exportiert werden kann. Da das Tool einige Probleme mit bestimmten Konstellationen von Beiträgen hatte, habe ich ein eigenes Tool mit dem Namen WordPress2Markdown geschrieben. Dieses nimmt die Export-Datei, eine WordPress eXtended RSS (WXR)-Datei, entgegen und wandelt Posts und Pages in Markdown um. Ein beispielhafter Aufruf könnte dabei wie folgt aussehen:

java -jar WordPress2Markdown.jar -i wordpress-export.xml -s DATETIME -o /home/seeseekey/MarkdownExport

Der Quelltext findet sich auf GitHub zu finden und ist unter der GPL3 lizenziert. Dort findet sich ebenfalls ein entsprechendes Release.

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.

MenuetOS

Betriebssysteme werden meist in der Programmiersprache C bzw. C++ geschrieben. Vereinzelnd kommen auch andere Hochsprachen zum Zuge. Eher ungewöhnlich ist es, wenn komplette Betriebssysteme in Assembler geschrieben werden. Bei MenuetOS ist dies genau der Fall. Dieses von Ville Turjanmaa seit 2005 entwickelte System ist vollständig in Assembler geschrieben. Unterstützt wird er dabei von einigen Mitstreitern.

http://menuetos.net

In MenuetOS ist präemptives Multitasking implementiert, es verfügt über eine grafische Oberfläche, einen TCP/IP-Stack, sowie über Unterstützung für unterschiedlichste Protokolle in Form mitgelieferter Clients. Daneben ist das Betriebssystem gerade einmal knapp 1,4 MiB groß. Alles in allem ist MenuetOS ein interessantes Systemen, auch wenn es für meisten Nutzer für den täglichen Betrieb genutzt wird. Während die 32-Bit-Version noch freie Software, unter der GPL lizenziert, war, ist dies bei der 64-Bit-Version nicht mehr der Fall. Diese kann für den privaten nicht kommerziellen Gebrauch genutzt werden. Zu finden ist das Projekt unter menuetos.net.

Durchsuchen der Bash-History

Bei der Nutzung der Bourne-again shell, kurz Bash, wird über die eingegebenen Kommandos Buch geführt. Dies ermöglicht es auf Befehle zurückzugreifen, welche bereits eingeben wurde. Auf die History kann mit den Cursor-Tasten Hoch und Runter zugegriffen werden.

Diese Vorgehensweise ist natürlich nur solange praktisch, wenn der gesuchte Befehl in letzter Zeit eingegeben wurde. Gespeichert wird die History im Home-Verzeichnis des jeweiligen Nutzers in einer Datei mit dem Namen .bash_history. Nun könnte der geneigte Nutzer auf die Idee kommen diese Datei einfach nach dem gesuchten Befehl zu durchforsten:

cat .bash_history | grep "befehl123"

Einfacher ist es allerdings auf die eingebaute Suchfunktion der Bash zurückzugreifen. Aktiviert wird diese mittels der Tastenkombination Strg + R. Danach kann der Suchbegriff eingeben werden und dem Nutzer werden Vorschläge aus der Bash-History angezeigt. Sagt einer dieser Vorschläge zu, kann er mit einem Druck auf die Enter-Taste bestätigt werden. Abgebrochen werden kann die Suche mittels der Tastenkombination Strg + C.