----------------- Form1.vb ------------ ''' ''' Main form for the application. i should really call this something else... ''' ''' ''' we need a format for the lines in config files. i have an idea that might (MIGHT!) just work. ''' the first line of the file would be ''' ;smeghammer-filedef '''the second line would be ''' name=python;ext=py|pyc ''' we can then for each line state how the keyword/seperator is: ''' kw // toEOL blue italic ''' kw ... regEx lightblue bold ''' kw insert word green ''' we can parse this using a simple split() operation. ''' Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load shtb.Seperators.Add(" ") shtb.Seperators.Add(vbCr) ' seperator shtb.Seperators.Add(vbNewLine) ' seperator shtb.Seperators.Add(",") ' seperator shtb.Seperators.Add(".") ' seperator shtb.Seperators.Add(")") ' seperator shtb.Seperators.Add("(") ' seperator shtb.Seperators.Add("]") ' seperator shtb.Seperators.Add("[") ' seperator shtb.Seperators.Add("}") ' seperator shtb.Seperators.Add("{") ' seperator shtb.Seperators.Add("+") ' seperator shtb.Seperators.Add("=") ' seperator shtb.Seperators.Add(vbTab) ' seperator ' fails here VVVVVV (commented out for usability) 'hilight numbers ' shtb.AddHighlightDescriptor(UrielGuy.SyntaxHighlightingTextBox.DescriptorRecognition.RegEx, "\b(?:[0-9]*\.)?[0-9]+\b", UrielGuy.SyntaxHighlightingTextBox.DescriptorType.Word, Color.Pink, Nothing, False) End Sub ''' ''' this parses a keyword string. ''' ''' the string to parse ''' '''Type Keywords '''Word - only hilight a single word '''ToEOL - continue to end of line '''ToCloseToken - continue until the closing token is seen '''ToEOW - to end of word ''' '''Style keywords '''WholeWord - Only if the whole token is equal to the word '''StartsWith - If the word starts with the token '''Contains - If the word contains the Token '''RegEx the start token is a RegEx. Stoptoken is not used ''' EXAMPLES: ''' C++ style comment ''' kw::toEOL::startswith:://::none::darkgreen::false ''' Vb style comment ''' kw:toeol::startswith::'::none::darkgreen::false ''' quote ''' kw::toclosetoken::startswith::"::"::pink::false ''' special namespaces (ie my.settings) ''' kw::toEOW::wholeword::my.settings::none::blue::true ''' by this basic syntax is ''' kw::(kind)::(style)::(opening)::(closing)::(color)::(autocomplete) ''' lines with ';' at the start are ignored. ''' Private Sub parseKw(ByVal kw As String) ' parse out the keyword. If (kw(0) = ";") Then Exit Sub ' comment End If ' list of arguments Dim a As String() = Split(kw, "::") ' check if its a seperator If (a(0) = "sep") Then ' its a seperator. add the second argument and end. ' take for example '::' -- in smeghammer, its a seperator for keywords! but if its used here, its toast. shtb.Seperators.Add(kw.Substring(3)) Exit Sub End If ' is it long enough? If (a.Length < 7) Then Throw New Exception("BadArgumentCountexception") End If ' is it the right kind? If (a(0) <> "kw") Then Dim err As String = "Error!" + vbNewLine err += "Keyword identifier not correct!" + vbNewLine err += kw + vbNewLine err += "Must start with kw" MessageBox.Show(err, "parse error", MessageBoxButtons.OK, MessageBoxIcon.Error) Exit Sub End If ' we pass the sniff test. ' we now add the keyword. Dim startKW, endKW, startToken, endToken As String ' kw start kind startKW = a(1) ' kw end kind endKW = a(2) ' starting token startToken = a(3) ' ending token endToken = a(4) ' color Dim col As Color = Color.FromName(a(5)) ' if its an autocomplete Dim ShouldUseAsAutocomplete As Boolean ' should it be autocomplete? If (a(6).ToLower() = "true") Then 'yes ShouldUseAsAutocomplete = True Else 'no ShouldUseAsAutocomplete = False End If Dim token_type, descriptor_type As Object If (startKW.ToLower() = "word") Then token_type = UrielGuy.SyntaxHighlightingTextBox.DescriptorType.Word ElseIf (startKW.ToLower() = "toeol") Then token_type = UrielGuy.SyntaxHighlightingTextBox.DescriptorType.ToEOL ElseIf (startKW.ToLower() = "toeow") Then token_type = UrielGuy.SyntaxHighlightingTextBox.DescriptorType.ToEOW ElseIf (startKW.ToLower() = "toclosetoken") Then token_type = UrielGuy.SyntaxHighlightingTextBox.DescriptorType.ToCloseToken Else Throw New Exception("Bad argument on token type. undefined token kind " + startKW) End If If (endKW.ToLower() = "wholeword") Then descriptor_type = UrielGuy.SyntaxHighlightingTextBox.DescriptorRecognition.WholeWord ' ElseIf (endKW.ToLower() = "regex") Then ' descriptor_type = UrielGuy.SyntaxHighlightingTextBox.DescriptorRecognition.RegEx ElseIf (endKW.ToLower() = "contains") Then descriptor_type = UrielGuy.SyntaxHighlightingTextBox.DescriptorRecognition.Contains ElseIf (endKW.ToLower() = "startswith") Then descriptor_type = UrielGuy.SyntaxHighlightingTextBox.DescriptorRecognition.StartsWith Else Throw New Exception("Bad Argument on Token Descriptor. unknow descriptor " + endKW) End If ' If (descriptor_type = UrielGuy.SyntaxHighlightingTextBox.DescriptorRecognition.RegEx) Then 'Me.shtb.AddHighlightDescriptor(descriptor_type, startToken, token_type, col, Nothing, ShouldUseAsAutocomplete) 'Else Me.shtb.AddHighlightDescriptor(descriptor_type, startToken, token_type, endToken, col, Nothing, ShouldUseAsAutocomplete) 'End If End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Try Me.parseKw(TextBox1.Text) Catch ex As Exception Label1.Text = ex.Message End Try End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim cp As New ColorDialog If (cp.ShowDialog <> Windows.Forms.DialogResult.Cancel) Then Button2.BackColor = cp.Color End If End Sub Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click shtb.HighlightDescriptors.Clear() Dim a As New OpenFileDialog a.Title = "Select a dictionary" a.Filter = "Smeghammer definitions|*.shd|All files|*.*" If (a.ShowDialog() <> Windows.Forms.DialogResult.Cancel) Then ' initialize a fileIOReader. ' we want something like this: ' this is how it should look like: ' kw::(kind)::(style)::(open)::(close)::(color)::(autocomplete) ' for now we are NOT supporting regex's Dim buffer As String() = IO.File.ReadAllLines(a.FileName) ' get each line in the string Dim line As String Dim count As Integer count = 1 For Each line In buffer ' get the parser running Try If (line <> "") Then parseKw(line) End If Catch ex As Exception MessageBox.Show("Line " + count.ToString() + vbNewLine + "Parse Error:" + vbNewLine + ex.Message + vbNewLine + "Ending Parsing" + vbNewLine + "Line is:" + vbNewLine + line, "parse error", MessageBoxButtons.OK, MessageBoxIcon.Error) If (MessageBox.Show("Clear highlight descriptors?", "Question", MessageBoxButtons.YesNo, MessageBoxIcon.Question) = Windows.Forms.DialogResult.Yes) Then shtb.HighlightDescriptors.Clear() End If Exit Sub End Try count += 1 Next End If End Sub End Class --- end form1.vb --- -- smeg def file -- kw::word::wholeword::kw::none::blue::false kw::word::wholeword::sep::none::blue::false ; type kw::word::wholeword::word::none::red::true kw::word::wholeword::toclosetoken::none::red::true kw::word::wholeword::toeol::none::red::true kw::word::wholeword::toeow::none::red::true ;style kw::word::wholeword::wholeword::none::red::true kw::word::wholeword::startswith::none::red::true -- end smegdef.txt --