65.9K
CodeProject 正在变化。 阅读更多。
Home

WPF 的 BBCode 解析器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.81/5 (11投票s)

2008 年 11 月 27 日

CPOL

2分钟阅读

viewsIcon

52530

downloadIcon

624

WPF 的可自定义 BBCode 解析器

引言

本文介绍了一个自定义的 WPF 控件,它允许你在 XAML 应用程序中定义和使用 BBCode

背景

我当时正尝试为基本的 CMS 操作创建一个 Silverlight 页面的 ASP.NET 后台。由于 XAML/XML 没有某种代码补全功能很难编辑,所以我决定尝试一下 BBCode,因为它简单而且方括号对用户来说看起来更好。:)

解析器设计

cd.png

该控件的设计相当简单。它有一个 BBCode 依赖属性,用于存储当前显示的 BBCode,一个用于解析期间使用的标签集合,一个用于没有标签的元素的 DefaultElementName,以及一个用作解析后的 XAML 输出根元素的 RootElementName

Parse 方法利用标签将 BBCode 转换为 XAML,然后使用 XamlReader.Load 方法设置 Parser 控件的 UserControl.Content 属性。

标签对象说明

  • 简单标签: [;)]
  • EnclosingTag: [i]文本[/i]
  • ValueTag: [url]http://m0sa.net[/url]
  • ParameterValueTag: [url=http://m0sa.net]m0sa.net[/url]
  • ParametrizedTag: [img width=100 height=200]image.jpg[/img]

如果你愿意,可以添加自己的标签。只需实现 ITag 接口,就可以在代码或 XAML 中在 Parser.Tags 中使用它!

Using the Code

以下是如何为 Parser 控件定义自定义 BBCode 的示例

BBCode definition - Click to enlarge

这是演示应用程序:

example.png

由于 BBCodeTags 都是依赖属性,因此可以在它们上使用绑定。在演示应用程序中,我将 Textbox.Text 绑定到 Parser.BBCode 属性。这样就有一个(非常)简单的编辑器!

值得关注的点  

我第一次尝试编写此控件时使用的是正则表达式,但我决定手动编写解析器,因为我遇到了嵌套 BBCode 的问题。

在使用 XamlReader.Parse(string) 方法时,我遇到了斯洛文尼亚语特殊字符(š、c、ž)的问题。我不得不使用...

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

...才能使其正常工作。看来 Parse 方法使用 Encoding.ASCII 从输入字符串获取字节。

历史

  • 2008-11-27:首次发布
© . All rights reserved.