HTML Tidy als Filter in ASP.NET

Auf der MSDN-Website wurde in 2003-05 ein Add-In vorgestellt, das das bekannte HTML Tidy in Visual Studio .NET integriert. Der Nutzen dieses Ansatzes hält sich meiner Meinung nach in Grenzen, zumal das Add-In nur mit ASCII-Zeichen sicher umgehen kann und Tidy von Web-Controls nicht den „fertigen“ HTML-Code zu sehen bekommt.

Wesentlich sinnvoller erscheint es mir, Tidy den HTML-Code bearbeiten zu lassen, den ein Browser sehen würde. Das kann ein Filter leisten. Insbesondere kann Tidy HTML in XHTML konvertieren.

Filter sind im .NET-Framework von der Klasse System.IO.Stream abgeleitet. Meine Klasse TidyFilter implementiert einen Filter, der einen Byte-Strom an Tidy weiterreicht:

Tidy installieren

Sie benötigen eine ausführbare .exe-Datei sowie eine Konfigurationsdatei tidy.cfg. Die Konfigurationsoptionen sind ausführlich dokumentiert, meine eigene Konfigurationsdatei sieht derzeit so aus:

tidy.exe muß in einem Verzeichnis abgelegt werden, das Ausführberechtigungen für ausführbare Dateien besitzt. Möglicherweise müssen Sie die Datei deshalb ins cgi-bin-Verzeichnis verschieben. Den Pfad zu den beiden Dateien müssen Sie relativ zum Stammverzeichnis Ihrer ASP.NET-Applikation angeben:

Ich verwende hier die „klassische“ .exe-Datei. Es gibt zwar einen einen COM-Wrapper für TidyLib, das COM-Objekt müßte jedoch auf dem Server registriert werden, was die Portabilität einschränken würde. Die Performance ist dennoch zufriedenstellend.

Kompilieren des Quellcodes

Kompilieren in Visual Studio .NET

Erstellen Sie einfach eine neue Klasse und fügen Sie den obigen Quellcode ein.

Kompilieren mit vbc.exe

Der Quellcode wird mit folgendem Befehl kompiliert:

Dieser Aufruf erzeugt eine Datei TidyFilter.dll. Diese müssen Sie in das \bin-Verzeichnis Ihrer ASP.NET-Applikation kopieren. Um den Filter zu verwenden, müssen Sie die Assembly in der .aspx-Datei referenzieren:

Filter aktivieren

Der Filter kann bspw. in der OnInit-Methode einer Seite aufgerufen werden:

Der Filter arbeitet mit Byte-Streams, nicht mit Strings. Sie müssen also dafür sorgen, daß ASP.NET die Zeichencodierung verwendet, die Tidy erwartet. Schreiben Sie bspw. <globalization responseEncoding="utf-8" /> in der web.config und char-encoding: utf8 in der tidy.cfg. Tidy unterstützt neben UTF-8 einige andere Codierungen, aber es gibt eigentlich keinen Grund, nicht UTF-8 zu verwenden.