OSDN Git Service

6232192de2f5195aa995d379cb18a998ae66c1f3
[radegast/radegast.git] / Radegast / Core / LSLKeywordParser.cs
1 // 
2 // Radegast Metaverse Client
3 // Copyright (c) 2009-2014, Radegast Development Team
4 // All rights reserved.
5 // 
6 // Redistribution and use in source and binary forms, with or without
7 // modification, are permitted provided that the following conditions are met:
8 // 
9 //     * Redistributions of source code must retain the above copyright notice,
10 //       this list of conditions and the following disclaimer.
11 //     * Redistributions in binary form must reproduce the above copyright
12 //       notice, this list of conditions and the following disclaimer in the
13 //       documentation and/or other materials provided with the distribution.
14 //     * Neither the name of the application "Radegast", nor the names of its
15 //       contributors may be used to endorse or promote products derived from
16 //       this software without specific prior written permission.
17 // 
18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21 // DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
22 // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23 // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
24 // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
25 // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
26 // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 //
29 // $Id$
30 //
31 using System;
32 using System.Collections.Generic;
33 using System.Drawing;
34 using System.Text.RegularExpressions;
35
36 namespace Radegast
37 {
38     public struct LSLKeyWord
39     {
40         public string KeyWord;
41         public string ToolTip;
42         public Color Color;
43
44         public override string ToString()
45         {
46             return KeyWord;
47         }
48     }
49
50     public class LSLKeywordParser
51     {
52         private static Dictionary<string, LSLKeyWord> keyWords;
53         
54         public static Dictionary<string, LSLKeyWord> KeyWords
55         {
56             get
57             {
58                 if (keyWords != null)
59                     return keyWords;
60                 else
61                 {
62                     keyWords = Parse();
63                     return keyWords;
64                 }
65             }
66         }
67
68         private static Regex sectionRegex = new Regex(@"\[(\w+)\s+([\d.]+)\s*,\s*([\d.]+)\s*,\s*([\d.]+)\s*\]", RegexOptions.Compiled);
69         private static Regex keyWordRegex = new Regex(@"^([^\s]+)(\s+(.*))?", RegexOptions.Compiled);
70
71         public static Dictionary<string, LSLKeyWord> Parse()
72         {
73             Dictionary<string, LSLKeyWord> ret = new Dictionary<string, LSLKeyWord>();
74             Color currentColor = Color.Black;
75
76             bool valid = false; 
77             string section = string.Empty;
78
79             foreach (String line in Properties.Resources.lsl_keywords.Split('\n'))
80             {
81                 Match m;
82
83                 string l = line.Trim();
84                 // Skip comments
85                 if (l.StartsWith("#"))
86                 {
87                     continue;
88                 }
89
90                 // Looking for line like [word 0, .3, .5]
91                 if ((m = sectionRegex.Match(l)).Success)
92                 {
93                     section = m.Groups[1].Value;
94                     if (section == "word")
95                     {
96                         valid = true;
97                         float r = float.Parse(m.Groups[2].Value, System.Globalization.CultureInfo.InvariantCulture);
98                         float g = float.Parse(m.Groups[3].Value, System.Globalization.CultureInfo.InvariantCulture);
99                         float b = float.Parse(m.Groups[4].Value, System.Globalization.CultureInfo.InvariantCulture);
100                         currentColor = Color.FromArgb((int)(r * 255), (int)(g * 255), (int)(b * 255));
101                     }
102                     else
103                     {
104                         valid = false;
105                     }
106                     continue;
107                 }
108
109                 if ((m = keyWordRegex.Match(l)).Success)
110                 {
111                     LSLKeyWord kw = new LSLKeyWord();
112                     kw.KeyWord = m.Groups[1].Value;
113                     kw.ToolTip = m.Groups[3].Value.Replace(@"\n", "\n");
114                     kw.Color = currentColor;
115
116                     if (valid)
117                     {
118                         ret.Add(kw.KeyWord, kw);
119                     }
120                     continue;
121                 }
122             }
123             return ret;
124         }
125     }
126 }