codekicker.BBCode ist open source

In meinem letzten Blogeintrag habe ich von unserem neuen Texteditor auf codekicker berichtet. Der BBCode der Fragen und Antworten wird serverseitig in HTML übersetzt und an den Browser gesendet. Heute möchte ich über unseren BBCode-Parser berichten, der diesen Job für uns übernimmt.

Anfänglich hatten wir "codeparser.NET" verwendet, um den BBCode zu transformieren, mussten jedoch diese Bibliothek bald aufgeben, weil sie sehr fehleranfällig, unflexibel und schwer zu fixen war. Daher haben wir unseren eigenen BBCode-Parser für .NET erstellt. Die gute Nachricht vorweg: Codekicker.BBCode ist open source. Der BBCode-Parser ist auf codeplex zu finden: http://bbcode.codeplex.com/

Da ich die Implementierung übernommen habe möchte ich über ein paar interessante Punkte berichten. Meine Designziele waren:

  • Bugfrei - Die Engine crasht niemals
  • Sicher - HTML wie "<script>" kann unter keinen Umständen in den Output gelangen
  • Performant - der Parser muss hohem Traffic standhalten können
  • Einfach zu bedienen - Um die Einarbeitungszeit für andere zu minimieren
  • Anpassbar - Jeder tag kann beliebig konfiguriert werden. Nichts ist hardkodiert
  • Saubere Fehlermeldungen - Die meisten Syntaxfehler werden mit einer verständlichen Nachricht in Deutsch oder Englisch gemeldet.

Schnellstart
Um einen gegebenen BBCode in sicheres HTML zu übersetzen, genügt: BBCode.ToHtml("{"[url=http://codekicker.de]codekicker[url]"}")

Wie lassen sich die Tags anpassen?

Das ist sehr einfach:

var parser = new BBCodeParser(new[]

    {

        new BBTag("b", "<b>", "</b>"),

        new BBTag("i", "<span style=\"font-style:italic;\">", "</span>"),

        new BBTag("u", "<span style=\"text-decoration:underline;\">", "</span>"),

        new BBTag("code", "<pre class=\"prettyprint\">", "</pre>"),

        new BBTag("img", "<img src=\"${content}\" />", "", false, true),

        new BBTag("quote", "<blockquote>", "</blockquote>"),

        new BBTag("list", "<ul>", "</ul>"),

        new BBTag("*", "<li>", "</li>", true, false),

        new BBTag("url", "<a href=\"${href}\">", "</a>", new BBAttribute("href", ""), new BBAttribute("href", "href")),

    });

return parser.Transform("[b]bbcode[/b]");

Qualitätssicherung mit Microsoft Pex
An einen BBCode-Parser für eine öffentliche Webseite sind extreme Anforderungen zu stellen. Erfüllt sein müssen mindestens die Crashfreiheit und Sicherheit, damit der Parser überhaupt online gehen kann. Diese Eigenschaften konnte ich mit Microsoft Pex sicherstellen. Pex erweitert gewöhnliche Unit Tests um die Fähigkeit, Eingabeparameter anzunehmen. Die Testmethode stellt dabei für beliebige, von Pex gewählte, Eingaben bestimmte Eigenschaften des zu testenden Codes sicher. Pex wählt dabei die Eingaben, in unserem Fall den BBCode, derart, dass die Test-Abdeckung maximal wird. Einer unserer Tests sieht wie folgt aus:

//the parser may never ever throw an exception other that BBCodeParsingException for any non-null input

[PexMethod]

public void NoCrash([PexAssumeNotNull] string input, out string output)

{

    try

    {

        output = BBEncodeForTest(input);

        Assert.IsNotNull(output);

    }

    catch (BBCodeParsingException)

    {

        output = null;

    }

}

 

Wir lassen Pex einen beliebigen BBCode-string auswählen und stellen sicher, dass der HTML-Output keinen script-Tag enthält. Pex wird nun mit aller Macht versuchen, doch einen script-Tag durchzubringen. Dabei geht Pex mit maschineller Präzision vor und findet auch extem unintuitive Möglichkeiten, das zu tun. Da Pex nicht in der Lage war, den Test fehlschlagen zu lassen, kann ich nun sehr sicher sein, dass unsere Implementation sicher ist.

Für Fragen zu diesem spannenden Thema empfehle ich euch natürlich, bei uns eine Frage zu stellen!

Für wen kann unser BBCode-Parser für .NET nützlich sein?
Da der BBCode-Parser in C# geschrieben ist, kann er in jeder .NET-Sprache wie z.B. C# oder VB.NET verwendet werden.

Viele Grüße und bis bald,
Marvin

Digg It!DZone It!StumbleUponTechnoratiRedditDel.icio.usNewsVineFurlBlinkList

Tags:

Kommentare

Günther Foidl Österreich
28.08.2009 22:46:52 Permalink

Hallo,

mir den Code angeschaut und der gefällt mir sehr gut. Alles schön sauber durchgezogen. Super!

Gruss
Günther

tennis dresses Großbritannien
03.02.2010 01:50:31 Permalink

Menschen mitgefohlt habe der mit roten Flecken vorne gestanden ist und sein Referat gehalten hat.

Fantastic post I hope you dont mind if I link to it from my t bags sleeveless bubble dress website.

yours plus size Großbritannien
27.02.2010 16:02:51 Permalink

Nice blog I hope you dont mind if I link to it from my yours plus size website.

House of Harlow 1960 Großbritannien
02.03.2010 23:30:26 Permalink

Nice one - Thanks for sharing dude.

Kommentar schreiben




  Country flag

biuquote
  • Kommentar
  • Live Vorschau
Loading