'**************************************************
' FILE : BBCodeTag.vb
' AUTHOR : Paulo Santos
' CREATION : 4/30/2009 10:14:00 AM
' COPYRIGHT : Copyright © 2009
' PJ on Development
' All Rights Reserved.
'
' Description:
' TODO: Add file description
'
' Change log:
' 0.1 4/30/2009 10:14:00 AM
' Paulo Santos
' Created.
'***************************************************
Imports System.Text.RegularExpressions
Imports System.Diagnostics.CodeAnalysis
'''
''' Helper class to parse a BBCode tag.
'''
Friend NotInheritable Class BBCodeTag
Private Shared ReadOnly __Tokenizer As Tokenization.Tokenizer = PrepareTokenizer()
Private __Text As String
Private __TagName As String
Private __IsClosingTag As Boolean
Private __Params As New BBCodeAttributeDictionary
''' Initializes an instance of the class.
''' The text that defines the tag.
Public Sub New(ByVal text As String)
__Text = text
'*
'* Read each token to the tag
'*
Dim sb As New Text.StringBuilder()
Dim addParam As Boolean
Dim paramName As String = String.Empty
Do
Dim tk = Tokenizer.GetToken(text)
If (tk Is Nothing) Then
Exit Do
End If
Select Case tk.RuleType
Case -1
'*
'* Check if it's a closing tag
'*
If (String.CompareOrdinal(tk.Name, "EndTagStart") = 0) Then
__IsClosingTag = True
End If
Case 0
'*
'* Whitespace, ignoring
'*
Case 1
'*
'* Name. it can be the name of the tag, or the name of a parameter
'*
If (String.IsNullOrEmpty(__TagName)) Then
__TagName = tk.Value.ToUpperInvariant()
Else
'*
'* Check if the paramName is already filled
'*
If (Not addParam) Then
paramName = tk.Value
Me.Paramters(paramName) = String.Empty
ElseIf (addParam) Then
'*
'* Add the parameter and it's value
'*
addParam = False
AddParamFromToken(paramName, tk)
End If
End If
Case 2
'*
'* Finds the equals sign
'*
addParam = True
Case 3
'*
'* Value: the value of a parameter
'*
If (addParam) Then
addParam = False
AddParamFromToken(paramName, tk)
End If
Case Else
sb.Append(tk.Value)
End Select
Loop
If (sb.Length > 0 AndAlso String.IsNullOrEmpty(__TagName)) Then
__TagName = sb.ToString()
End If
End Sub
'''
''' Gets the text of the tag.
'''
_
Public ReadOnly Property Text() As String
Get
Return __Text
End Get
End Property
'''
''' Gets the name of the tag.
'''
Public ReadOnly Property Name() As String
Get
Return __TagName
End Get
End Property
'''
''' Indicates wheter or not the tag is an empty tag.
'''
''' True if the tag is empty; otherwise False.
_
Public ReadOnly Property IsEmptyTag() As Boolean
Get
Return String.IsNullOrEmpty(Name)
End Get
End Property
'''
''' Indicates wheter or not the tag is a closing tag.
'''
''' True if the tag is a closing tag; otherwise False.
_
Public ReadOnly Property IsClosingTag() As Boolean
Get
Return __IsClosingTag
End Get
End Property
'''
''' Indicates wheter or not the tag is a value tag.
'''
''' True if the tag is a value tag; otherwise False.
_
Public ReadOnly Property IsValueTag() As Boolean
Get
Return Me.Paramters.Count = 1 AndAlso Me.Paramters.Keys(0) = "default"
End Get
End Property
'''
''' Indicates wheter or not the tag is a parametrized tag.
'''
''' True if the tag is a parametrized tag; otherwise False.
_
Public ReadOnly Property IsParamTag() As Boolean
Get
Return Me.Paramters.Count > 0
End Get
End Property
'''
''' Indicates wheter or not the tag is a tag.
'''
''' True if the tag is a tag; otherwise False.
_
Public ReadOnly Property IsTag() As Boolean
Get
Return (Not Me.IsEmptyTag) AndAlso (Not Me.IsClosingTag)
End Get
End Property
'''
''' Gets the paramters of the tag.
'''
Public ReadOnly Property Paramters() As BBCodeAttributeDictionary
Get
Return __Params
End Get
End Property
'''
''' Gets the .
'''
Private Shared ReadOnly Property Tokenizer() As Tokenization.Tokenizer
Get
Return __Tokenizer
End Get
End Property
Private Sub AddParamFromToken(ByRef paramName As String, ByVal tk As Tokenization.Token)
If (String.IsNullOrEmpty(paramName)) Then
Me.Paramters("default") = UnQuote(tk.Value)
Else
Me.Paramters(paramName) = UnQuote(tk.Value)
End If
paramName = String.Empty
End Sub
Private Shared Function PrepareTokenizer() As Tokenization.Tokenizer
Dim tk As New Tokenization.Tokenizer
'*
'* Prepares the BBCode Grammar
'*
With tk
'*
'* Define the grammar macros
'*
AddTokenizerBaseMacros(tk)
'*
'* Define the grammar rules
'*
.AddRule("TagStart", -1, "\[")
.AddRule("EndTagStart", -1, "\[/")
.AddRule("TagEnd", -1, "\]")
.AddRule("Space", 0, "{w}")
.AddRule("Name", 1, "{name}")
.AddRule("Equals", 2, "{w}={w}")
.AddRule("Value", 3, "{value}")
.AddRule("Text", 99, ".")
End With
Return tk
End Function
End Class