'**************************************************
' FILE : Utils.vb
' AUTHOR : Paulo Santos
' CREATION : 4/29/2009 2:14:26 PM
' COPYRIGHT : Copyright © 2009
' PJ on Development
' All Rights Reserved.
'
' Description:
' TODO: Add file description
'
' Change log:
' 0.1 4/29/2009 2:14:26 PM
' Paulo Santos
' Created.
'***************************************************
Imports System.Text.RegularExpressions
Imports System.Diagnostics.CodeAnalysis
Friend Module Utils
Public Const STR_BBCodeSchemaNamespace As String = "" '= "http://pjondevelopment.50webs.com/schema/bbcode"
Public Const STR_BBCodeDictionaryXmlElement As String = "Dictionary"
Public Const STR_BBCodeElementTypesXmlElement As String = "ElementTypes"
Public Const STR_BBCodeConfigurationXmlElement As String = "Configuration"
'''
''' Returns the specified text between quotes.
'''
''' The text to be placed between quotes.
''' The text between quotes.
Public Function Quote(ByVal text As String) As String
Return "'" & text.Replace("'", "''") & "'"
End Function
'''
''' Unquotes the specified text.
'''
''' The text to be unquoted.
''' The unquoted text.
Public Function UnQuote(ByVal text As String) As String
Dim rx As New Text.RegularExpressions.Regex("^(?'(?(?:''|[^'])*)')|(?""(?(?:""""|[^""])*)"")$")
Dim m = rx.Match(text)
If (Not m.Success) Then
Return text
End If
If (m.Groups("quote").Success) Then
Return m.Groups("text").Value.Replace("''", "'")
End If
Return m.Groups("text").Value.Replace("""""", """")
End Function
'''
''' Validates the specified tag name.
'''
''' The tagname to be validated.
Public Sub ValidateTagName(ByVal tagName As String)
If (String.IsNullOrEmpty(tagName)) Then
Throw New ArgumentNullException("tagName")
End If
If (tagName.IndexOf("=", StringComparison.Ordinal) <> -1) OrElse (tagName.IndexOf("[", StringComparison.Ordinal) <> -1) OrElse (tagName.IndexOf("]", StringComparison.Ordinal) <> -1) Then
Throw New ArgumentException("Invalid tag name. The tag name cannot contain '=' '[' or ']'.", "tagName")
End If
End Sub
'''
''' Validates the specified type to ensure that it is a subclass of .
'''
''' The to be validated.
Public Sub ValidateBBCodeElementType(Of TContext As Class)(ByVal value As Type)
'*
'* Validate is nothing
'*
If (value Is Nothing) Then
Throw New ArgumentNullException("value")
End If
'*
'* Validates the BBCodeElement itself
'*
Dim bbcodeType = GetType(BBCodeElement(Of TContext))
If (value.Equals(bbcodeType)) Then
Exit Sub
End If
'*
'* Validate subclass
'*
If Not bbcodeType.IsAssignableFrom(value) Then
Throw New InvalidOperationException("The type " & value.FullName & " must be a assingable to BBCodeElement.")
End If
'*
'* Validate default constructor
'*
If (value.GetConstructor(New Type() {}) Is Nothing) Then
Throw New InvalidOperationException("The type " & value.FullName & " does not provide a public default constructor.")
End If
End Sub
'''
''' Encodes the specified text as HTML.
'''
''' The text to be encoded.
''' The encoded HTML.
_
Public Function HtmlEncode(ByVal text As String) As String
Dim sb As New Text.StringBuilder(text)
sb.Replace(ChrW(&H26), "&")
sb.Replace(ChrW(&H22), """)
sb.Replace(ChrW(&H27), "'")
sb.Replace(ChrW(&H3C), "<")
sb.Replace(ChrW(&H3E), ">")
sb.Replace(ChrW(&HA0), " ")
sb.Replace(ChrW(&HA1), "¡")
sb.Replace(ChrW(&HA2), "¢")
sb.Replace(ChrW(&HA3), "£")
sb.Replace(ChrW(&HA4), "¤")
sb.Replace(ChrW(&HA5), "¥")
sb.Replace(ChrW(&HA6), "¦")
sb.Replace(ChrW(&HA7), "§")
sb.Replace(ChrW(&HA8), "¨")
sb.Replace(ChrW(&HA9), "©")
sb.Replace(ChrW(&HAA), "ª")
sb.Replace(ChrW(&HAB), "«")
sb.Replace(ChrW(&HAC), "¬")
sb.Replace(ChrW(&HAD), "")
sb.Replace(ChrW(&HAE), "®")
sb.Replace(ChrW(&HAF), "¯")
sb.Replace(ChrW(&HB0), "°")
sb.Replace(ChrW(&HB1), "±")
sb.Replace(ChrW(&HB2), "²")
sb.Replace(ChrW(&HB3), "³")
sb.Replace(ChrW(&HB4), "´")
sb.Replace(ChrW(&HB5), "µ")
sb.Replace(ChrW(&HB6), "¶")
sb.Replace(ChrW(&HB7), "·")
sb.Replace(ChrW(&HB8), "¸")
sb.Replace(ChrW(&HB9), "¹")
sb.Replace(ChrW(&HBA), "º")
sb.Replace(ChrW(&HBB), "»")
sb.Replace(ChrW(&HBC), "¼")
sb.Replace(ChrW(&HBD), "½")
sb.Replace(ChrW(&HBE), "¾")
sb.Replace(ChrW(&HBF), "¿")
sb.Replace(ChrW(&HC0), "À")
sb.Replace(ChrW(&HC1), "Á")
sb.Replace(ChrW(&HC2), "Â")
sb.Replace(ChrW(&HC3), "Ã")
sb.Replace(ChrW(&HC4), "Ä")
sb.Replace(ChrW(&HC5), "Å")
sb.Replace(ChrW(&HC6), "Æ")
sb.Replace(ChrW(&HC7), "Ç")
sb.Replace(ChrW(&HC8), "È")
sb.Replace(ChrW(&HC9), "É")
sb.Replace(ChrW(&HCA), "Ê")
sb.Replace(ChrW(&HCB), "Ë")
sb.Replace(ChrW(&HCC), "Ì")
sb.Replace(ChrW(&HCD), "Í")
sb.Replace(ChrW(&HCE), "Î")
sb.Replace(ChrW(&HCF), "Ï")
sb.Replace(ChrW(&HD0), "Ð")
sb.Replace(ChrW(&HD1), "Ñ")
sb.Replace(ChrW(&HD2), "Ò")
sb.Replace(ChrW(&HD3), "Ó")
sb.Replace(ChrW(&HD4), "Ô")
sb.Replace(ChrW(&HD5), "Õ")
sb.Replace(ChrW(&HD6), "Ö")
sb.Replace(ChrW(&HD7), "×")
sb.Replace(ChrW(&HD8), "Ø")
sb.Replace(ChrW(&HD9), "Ù")
sb.Replace(ChrW(&HDA), "Ú")
sb.Replace(ChrW(&HDB), "Û")
sb.Replace(ChrW(&HDC), "Ü")
sb.Replace(ChrW(&HDD), "Ý")
sb.Replace(ChrW(&HDE), "Þ")
sb.Replace(ChrW(&HDF), "ß")
sb.Replace(ChrW(&HE0), "à")
sb.Replace(ChrW(&HE1), "á")
sb.Replace(ChrW(&HE2), "â")
sb.Replace(ChrW(&HE3), "ã")
sb.Replace(ChrW(&HE4), "ä")
sb.Replace(ChrW(&HE5), "å")
sb.Replace(ChrW(&HE6), "æ")
sb.Replace(ChrW(&HE7), "ç")
sb.Replace(ChrW(&HE8), "è")
sb.Replace(ChrW(&HE9), "é")
sb.Replace(ChrW(&HEA), "ê")
sb.Replace(ChrW(&HEB), "ë")
sb.Replace(ChrW(&HEC), "ì")
sb.Replace(ChrW(&HED), "í")
sb.Replace(ChrW(&HEE), "î")
sb.Replace(ChrW(&HEF), "ï")
sb.Replace(ChrW(&HF0), "ð")
sb.Replace(ChrW(&HF1), "ñ")
sb.Replace(ChrW(&HF2), "ò")
sb.Replace(ChrW(&HF3), "ó")
sb.Replace(ChrW(&HF4), "ô")
sb.Replace(ChrW(&HF5), "õ")
sb.Replace(ChrW(&HF6), "ö")
sb.Replace(ChrW(&HF7), "÷")
sb.Replace(ChrW(&HF8), "ø")
sb.Replace(ChrW(&HF9), "ù")
sb.Replace(ChrW(&HFA), "ú")
sb.Replace(ChrW(&HFB), "û")
sb.Replace(ChrW(&HFC), "ü")
sb.Replace(ChrW(&HFD), "ý")
sb.Replace(ChrW(&HFE), "þ")
sb.Replace(ChrW(&HFF), "ÿ")
sb.Replace(ChrW(&H152), "Œ")
sb.Replace(ChrW(&H153), "œ")
sb.Replace(ChrW(&H160), "Š")
sb.Replace(ChrW(&H161), "š")
sb.Replace(ChrW(&H178), "Ÿ")
sb.Replace(ChrW(&H192), "ƒ")
sb.Replace(ChrW(&H2C6), "ˆ")
sb.Replace(ChrW(&H2DC), "˜")
sb.Replace(ChrW(&H391), "Α")
sb.Replace(ChrW(&H392), "Β")
sb.Replace(ChrW(&H393), "Γ")
sb.Replace(ChrW(&H394), "Δ")
sb.Replace(ChrW(&H395), "Ε")
sb.Replace(ChrW(&H396), "Ζ")
sb.Replace(ChrW(&H397), "Η")
sb.Replace(ChrW(&H398), "Θ")
sb.Replace(ChrW(&H399), "Ι")
sb.Replace(ChrW(&H39A), "Κ")
sb.Replace(ChrW(&H39B), "Λ")
sb.Replace(ChrW(&H39C), "Μ")
sb.Replace(ChrW(&H39D), "Ν")
sb.Replace(ChrW(&H39E), "Ξ")
sb.Replace(ChrW(&H39F), "Ο")
sb.Replace(ChrW(&H3A0), "Π")
sb.Replace(ChrW(&H3A1), "Ρ")
sb.Replace(ChrW(&H3A3), "Σ")
sb.Replace(ChrW(&H3A4), "Τ")
sb.Replace(ChrW(&H3A5), "Υ")
sb.Replace(ChrW(&H3A6), "Φ")
sb.Replace(ChrW(&H3A7), "Χ")
sb.Replace(ChrW(&H3A8), "Ψ")
sb.Replace(ChrW(&H3A9), "Ω")
sb.Replace(ChrW(&H3B1), "α")
sb.Replace(ChrW(&H3B2), "β")
sb.Replace(ChrW(&H3B3), "γ")
sb.Replace(ChrW(&H3B4), "δ")
sb.Replace(ChrW(&H3B5), "ε")
sb.Replace(ChrW(&H3B6), "ζ")
sb.Replace(ChrW(&H3B7), "η")
sb.Replace(ChrW(&H3B8), "θ")
sb.Replace(ChrW(&H3B9), "ι")
sb.Replace(ChrW(&H3BA), "κ")
sb.Replace(ChrW(&H3BB), "λ")
sb.Replace(ChrW(&H3BC), "μ")
sb.Replace(ChrW(&H3BD), "ν")
sb.Replace(ChrW(&H3BE), "ξ")
sb.Replace(ChrW(&H3BF), "ο")
sb.Replace(ChrW(&H3C0), "π")
sb.Replace(ChrW(&H3C1), "ρ")
sb.Replace(ChrW(&H3C2), "ς")
sb.Replace(ChrW(&H3C3), "σ")
sb.Replace(ChrW(&H3C4), "τ")
sb.Replace(ChrW(&H3C5), "υ")
sb.Replace(ChrW(&H3C6), "φ")
sb.Replace(ChrW(&H3C7), "χ")
sb.Replace(ChrW(&H3C8), "ψ")
sb.Replace(ChrW(&H3C9), "ω")
sb.Replace(ChrW(&H3D1), "ϑ")
sb.Replace(ChrW(&H3D2), "ϒ")
sb.Replace(ChrW(&H3D6), "ϖ")
sb.Replace(ChrW(&H2002), " ")
sb.Replace(ChrW(&H2003), " ")
sb.Replace(ChrW(&H2009), " ")
sb.Replace(ChrW(&H200C), "")
sb.Replace(ChrW(&H200D), "")
sb.Replace(ChrW(&H200E), "")
sb.Replace(ChrW(&H200F), "")
sb.Replace(ChrW(&H2013), "–")
sb.Replace(ChrW(&H2014), "—")
sb.Replace(ChrW(&H2018), "‘")
sb.Replace(ChrW(&H2019), "’")
sb.Replace(ChrW(&H201A), "‚")
sb.Replace(ChrW(&H201C), "“")
sb.Replace(ChrW(&H201D), "”")
sb.Replace(ChrW(&H201E), "„")
sb.Replace(ChrW(&H2020), "†")
sb.Replace(ChrW(&H2021), "‡")
sb.Replace(ChrW(&H2022), "•")
sb.Replace(ChrW(&H2026), "…")
sb.Replace(ChrW(&H2030), "‰")
sb.Replace(ChrW(&H2032), "′")
sb.Replace(ChrW(&H2033), "″")
sb.Replace(ChrW(&H2039), "‹")
sb.Replace(ChrW(&H203A), "›")
sb.Replace(ChrW(&H203E), "‾")
sb.Replace(ChrW(&H2044), "⁄")
sb.Replace(ChrW(&H20AC), "€")
sb.Replace(ChrW(&H2111), "ℑ")
sb.Replace(ChrW(&H2118), "℘")
sb.Replace(ChrW(&H211C), "ℜ")
sb.Replace(ChrW(&H2122), "™")
sb.Replace(ChrW(&H2135), "ℵ")
sb.Replace(ChrW(&H2190), "←")
sb.Replace(ChrW(&H2191), "↑")
sb.Replace(ChrW(&H2192), "→")
sb.Replace(ChrW(&H2193), "↓")
sb.Replace(ChrW(&H2194), "↔")
sb.Replace(ChrW(&H21B5), "↵")
sb.Replace(ChrW(&H21D0), "⇐")
sb.Replace(ChrW(&H21D1), "⇑")
sb.Replace(ChrW(&H21D2), "⇒")
sb.Replace(ChrW(&H21D3), "⇓")
sb.Replace(ChrW(&H21D4), "⇔")
sb.Replace(ChrW(&H2200), "∀")
sb.Replace(ChrW(&H2202), "∂")
sb.Replace(ChrW(&H2203), "∃")
sb.Replace(ChrW(&H2205), "∅")
sb.Replace(ChrW(&H2207), "∇")
sb.Replace(ChrW(&H2208), "∈")
sb.Replace(ChrW(&H2209), "∉")
sb.Replace(ChrW(&H220B), "∋")
sb.Replace(ChrW(&H220F), "∏")
sb.Replace(ChrW(&H2211), "∑")
sb.Replace(ChrW(&H2212), "−")
sb.Replace(ChrW(&H2217), "∗")
sb.Replace(ChrW(&H221A), "√")
sb.Replace(ChrW(&H221D), "∝")
sb.Replace(ChrW(&H221E), "∞")
sb.Replace(ChrW(&H2220), "∠")
sb.Replace(ChrW(&H2227), "∧")
sb.Replace(ChrW(&H2228), "∨")
sb.Replace(ChrW(&H2229), "∩")
sb.Replace(ChrW(&H222A), "∪")
sb.Replace(ChrW(&H222B), "∫")
sb.Replace(ChrW(&H2234), "∴")
sb.Replace(ChrW(&H223C), "∼")
sb.Replace(ChrW(&H2245), "≅")
sb.Replace(ChrW(&H2248), "≈")
sb.Replace(ChrW(&H2260), "≠")
sb.Replace(ChrW(&H2261), "≡")
sb.Replace(ChrW(&H2264), "≤")
sb.Replace(ChrW(&H2265), "≥")
sb.Replace(ChrW(&H2282), "⊂")
sb.Replace(ChrW(&H2283), "⊃")
sb.Replace(ChrW(&H2284), "⊄")
sb.Replace(ChrW(&H2286), "⊆")
sb.Replace(ChrW(&H2287), "⊇")
sb.Replace(ChrW(&H2295), "⊕")
sb.Replace(ChrW(&H2297), "⊗")
sb.Replace(ChrW(&H22A5), "⊥")
sb.Replace(ChrW(&H22C5), "⋅")
sb.Replace(ChrW(&H2308), "⌈")
sb.Replace(ChrW(&H2309), "⌉")
sb.Replace(ChrW(&H230A), "⌊")
sb.Replace(ChrW(&H230B), "⌋")
sb.Replace(ChrW(&H2329), "〈")
sb.Replace(ChrW(&H232A), "〉")
sb.Replace(ChrW(&H25CA), "◊")
sb.Replace(ChrW(&H2660), "♠")
sb.Replace(ChrW(&H2663), "♣")
sb.Replace(ChrW(&H2665), "♥")
sb.Replace(ChrW(&H2666), "♦")
sb.Replace(" ", " ")
Return sb.ToString()
End Function
Sub AddTokenizerBaseMacros(ByVal tokenizer As Tokenization.Tokenizer)
'*
'* Prepares the BBCode Grammar
'*
With tokenizer
.Options = RegexOptions.Singleline Or RegexOptions.IgnoreCase
'*
'* Define the grammar macros
'*
.AddMacro("h", "[0-9a-f]")
.AddMacro("nl", "\n|\r\n|\r|\f")
.AddMacro("space", "[ \t\r\n\f]+")
.AddMacro("s", "[ \t\r\n\f]*")
.AddMacro("w", "{s}?")
.AddMacro("nonascii", "[\u0080-\uffff]")
.AddMacro("unicode", "\\{h}{1,6}(\r\n|[ \t\r\n\f])?")
.AddMacro("escape", "{unicode}|\\[^\r\n\f0-9a-f]")
.AddMacro("nmstart", "[_a-z]|{nonascii}|{escape}")
.AddMacro("nmchar", "[_a-z0-9-]|{nonascii}|{escape}")
.AddMacro("string1", "\""([^\n\r\f\\""]|\\{nl}|{escape})*\""")
.AddMacro("string2", "\'([^\n\r\f\\']|\\{nl}|{escape})*\'")
.AddMacro("invalid1", "\""([^\n\r\f\\""]|\\{nl}|{escape})*")
.AddMacro("invalid2", "\'([^\n\r\f\\']|\\{nl}|{escape})*")
.AddMacro("name", "{nmchar}+")
.AddMacro("num", "[0-9]+|[0-9]*\.[0-9]+")
.AddMacro("string", "{string1}|{string2}")
.AddMacro("invalid", "{invalid1}|{invalid2}")
.AddMacro("url", "(ftp|https?://)" & _
"(([0-9a-z_!~*'().&=+$%-]+):([0-9a-z_!~*'().&=+$%-]+@))?" & _
"(([0-9]{1,3}\.){3}[0-9]{1,3}|([0-9a-z_!~*'()-]+\.)*([0-9a-z][0-9a-z-]{0,61})?[0-9a-z]\.[a-z]{2,6})" & _
"(:[0-9]{1,4})?" & _
"((/[0-9a-z_!~*'().;?:@&=+$,%#-]+)+/?|(/?))")
.AddMacro("mail", "(?:mailto:)?[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,4}")
.AddMacro("value", "{string}|{mail}|{url}|{num}|{name}")
.AddMacro("param", "{name}{w}={w}{value}")
.AddMacro("params", "({space}({param}|{name}))+")
End With
End Sub
End Module