'************************************************** ' 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