Click here to Skip to main content
15,885,782 members
Articles / Desktop Programming / WPF
Article

BBCode Parser for WPF

Rate me:
Please Sign up or sign in to vote.
4.81/5 (12 votes)
27 Nov 2008CPOL2 min read 50.4K   598   26   12
A customizable BBCode parser for WPF

Introduction

This article is about a custom WPF control that enables the definition and usage of BBCode in your XAML application.

Background

I was trying to create an ASP.NET backoffice for basic CMS operations on a Silverlight page. Since XAML/XML is hard to edit without some kind of code completion, I decided to give BBCode a shot, since it's easy and the square brackets look a lot nicer to the user. :)

Parser Design

cd.png

The design of the control is fairly simple. It has a BBCode dependency property that stores the BBCode currently on display, a collection of Tags that are used during the parsing, a DefaultElementName that is used for elements without any tag, and a RootElementName, that is used as a root for the parsed XAML output.

The Parse method utilizes the tags to transform the BBCode into XAML and then uses the XamlReader.Load method to set the UserControl.Content property of the Parser control. 

Explanation of the Tag Objects

  • SimpleTag: [;)]
  • EnclosingTag: [i]text[/i]
  • ValueTag: [url]http://m0sa.net[/url]
  • ParameterValueTag: [url=http://m0sa.net]m0sa.net[url]
  • ParametrizedTag: [img width=100 height=200]image.jpg[/img]

You can add your own tags if you wish. Just implement the ITag interface, and you can use it in Parser.Tags in code or XAML! 

Using the Code

Here is a example of how one can define custom BBCodes for the Parser control:

BBCode definition - Click to enlarge

And this is the demo app: 

example.png

Since the BBCode and Tags are dependency properties, you can use bindings on them. In the demo app, I have bound the Textbox.Text to the Parser.BBCode property. And you have a (very) simple editor!

Points of Interest  

My first attempt to write this control was with regular expressions, but I decided to write the parsing manually because I had problems with nested BBCodes. 

I had problems with special Slovenian characters (š, c, ž) using the XamlReader.Parse(string) method. I had to use... 

C#
XamlReader.Load(new MemoryStream(Encoding.UTF8.GetBytes(xaml)), pc);  

... to get it to work properly. Seems like the Parse method uses Encoding.ASCI to get the bytes from the input string.

History

  • 27-11-2008: First release

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Software Developer m0sa.net
Slovenia Slovenia
m0sa is a .NET Software Developer, currently working at Stack Exchange




Check out my latest pet project
Karate Semaphore

Comments and Discussions

 
BugUrgent : Displaying custom UserControl in the parser (not CustomControl) Pin
Member 1099113329-Aug-14 22:51
Member 1099113329-Aug-14 22:51 
GeneralRe: Urgent : Displaying custom UserControl in the parser (not CustomControl) Pin
Member 1099113329-Aug-14 23:57
Member 1099113329-Aug-14 23:57 
QuestionLive typing Pin
Member 109911334-Aug-14 9:37
Member 109911334-Aug-14 9:37 
AnswerRe: Live typing Pin
Member 109911334-Aug-14 9:54
Member 109911334-Aug-14 9:54 
GeneralWorks like a charm Pin
manulg11-Sep-13 7:16
manulg11-Sep-13 7:16 
GeneralRe: Works like a charm Pin
m0sa11-Sep-13 11:23
m0sa11-Sep-13 11:23 
GeneralLittle bug Pin
ogauchard3-Jul-09 3:31
ogauchard3-Jul-09 3:31 
GeneralA new implementation Pin
User 45427184-May-09 16:59
User 45427184-May-09 16:59 
QuestionNested Tags??? Pin
sibercyberia27-Nov-08 20:22
sibercyberia27-Nov-08 20:22 
AnswerRe: Nested Tags??? Pin
Steve Hansen27-Nov-08 21:24
Steve Hansen27-Nov-08 21:24 
GeneralRe: Nested Tags??? Pin
m0sa28-Nov-08 0:27
m0sa28-Nov-08 0:27 
GeneralRe: Nested Tags??? Pin
rcollina28-Nov-08 0:36
rcollina28-Nov-08 0:36 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.