You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
239 lines
7.9 KiB
239 lines
7.9 KiB
'**************************************************
|
|
' 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
|
|
|
|
''' <summary>
|
|
''' Helper class to parse a BBCode tag.
|
|
''' </summary>
|
|
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
|
|
|
|
''' <summary>Initializes an instance of the <see cref="BBCodeTag" /> class.</summary>
|
|
''' <param name="text">The text that defines the tag.</param>
|
|
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
|
|
|
|
''' <summary>
|
|
''' Gets the text of the tag.
|
|
''' </summary>
|
|
<SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")> _
|
|
Public ReadOnly Property Text() As String
|
|
Get
|
|
Return __Text
|
|
End Get
|
|
End Property
|
|
|
|
''' <summary>
|
|
''' Gets the name of the tag.
|
|
''' </summary>
|
|
Public ReadOnly Property Name() As String
|
|
Get
|
|
Return __TagName
|
|
End Get
|
|
End Property
|
|
|
|
''' <summary>
|
|
''' Indicates wheter or not the tag is an empty tag.
|
|
''' </summary>
|
|
''' <value><c>True</c> if the tag is empty; otherwise <c>False</c>.</value>
|
|
<SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification:="Provide description of the object.")> _
|
|
Public ReadOnly Property IsEmptyTag() As Boolean
|
|
Get
|
|
Return String.IsNullOrEmpty(Name)
|
|
End Get
|
|
End Property
|
|
|
|
''' <summary>
|
|
''' Indicates wheter or not the tag is a closing tag.
|
|
''' </summary>
|
|
''' <value><c>True</c> if the tag is a closing tag; otherwise <c>False</c>.</value>
|
|
<SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification:="Provide description of the object.")> _
|
|
Public ReadOnly Property IsClosingTag() As Boolean
|
|
Get
|
|
Return __IsClosingTag
|
|
End Get
|
|
End Property
|
|
|
|
''' <summary>
|
|
''' Indicates wheter or not the tag is a value tag.
|
|
''' </summary>
|
|
''' <value><c>True</c> if the tag is a value tag; otherwise <c>False</c>.</value>
|
|
<SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification:="Provide description of the object.")> _
|
|
Public ReadOnly Property IsValueTag() As Boolean
|
|
Get
|
|
Return Me.Paramters.Count = 1 AndAlso Me.Paramters.Keys(0) = "default"
|
|
End Get
|
|
End Property
|
|
|
|
''' <summary>
|
|
''' Indicates wheter or not the tag is a parametrized tag.
|
|
''' </summary>
|
|
''' <value><c>True</c> if the tag is a parametrized tag; otherwise <c>False</c>.</value>
|
|
<SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification:="Provide description of the object.")> _
|
|
Public ReadOnly Property IsParamTag() As Boolean
|
|
Get
|
|
Return Me.Paramters.Count > 0
|
|
End Get
|
|
End Property
|
|
|
|
''' <summary>
|
|
''' Indicates wheter or not the tag is a tag.
|
|
''' </summary>
|
|
''' <value><c>True</c> if the tag is a tag; otherwise <c>False</c>.</value>
|
|
<SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification:="Provide description of the object.")> _
|
|
Public ReadOnly Property IsTag() As Boolean
|
|
Get
|
|
Return (Not Me.IsEmptyTag) AndAlso (Not Me.IsClosingTag)
|
|
End Get
|
|
End Property
|
|
|
|
''' <summary>
|
|
''' Gets the paramters of the tag.
|
|
''' </summary>
|
|
Public ReadOnly Property Paramters() As BBCodeAttributeDictionary
|
|
Get
|
|
Return __Params
|
|
End Get
|
|
End Property
|
|
|
|
''' <summary>
|
|
''' Gets the <see cref="Tokenization.Tokenizer"/>.
|
|
''' </summary>
|
|
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
|
|
|