Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
StringFunctions.cs
Go to the documentation of this file.
3using System.Text;
4using System.Xml;
7
9
10internal sealed class StringFunctions : ValueQuery
11{
13
14 private readonly IList<Query> _argList;
15
16 private static readonly CompareInfo s_compareInfo = CultureInfo.InvariantCulture.CompareInfo;
17
19 {
20 get
21 {
22 if (_funcType == Function.FunctionType.FuncStringLength)
23 {
24 return XPathResultType.Number;
25 }
26 if (_funcType == Function.FunctionType.FuncStartsWith || _funcType == Function.FunctionType.FuncContains)
27 {
28 return XPathResultType.Boolean;
29 }
30 return XPathResultType.String;
31 }
32 }
33
39
41 : base(other)
42 {
43 _funcType = other._funcType;
44 Query[] array = new Query[other._argList.Count];
45 for (int i = 0; i < array.Length; i++)
46 {
47 array[i] = Query.Clone(other._argList[i]);
48 }
49 _argList = array;
50 }
51
52 public override void SetXsltContext(XsltContext context)
53 {
54 for (int i = 0; i < _argList.Count; i++)
55 {
56 _argList[i].SetXsltContext(context);
57 }
58 }
59
77
78 internal static string toString(double num)
79 {
80 return num.ToString("R", NumberFormatInfo.InvariantInfo);
81 }
82
83 internal static string toString(bool b)
84 {
85 if (!b)
86 {
87 return "false";
88 }
89 return "true";
90 }
91
93 {
94 if (_argList.Count > 0)
95 {
96 object obj = _argList[0].Evaluate(nodeIterator);
97 switch (GetXPathType(obj))
98 {
99 case XPathResultType.NodeSet:
100 {
102 if (xPathNavigator == null)
103 {
104 return string.Empty;
105 }
106 return xPathNavigator.Value;
107 }
108 case XPathResultType.String:
109 return (string)obj;
110 case XPathResultType.Boolean:
111 if (!(bool)obj)
112 {
113 return "false";
114 }
115 return "true";
116 case (XPathResultType)4:
117 return ((XPathNavigator)obj).Value;
118 default:
119 return toString((double)obj);
120 }
121 }
122 return nodeIterator.Current.Value;
123 }
124
126 {
127 int num = 0;
129 while (num < _argList.Count)
130 {
131 stringBuilder.Append(_argList[num++].Evaluate(nodeIterator).ToString());
132 }
133 return stringBuilder.ToString();
134 }
135
137 {
138 string text = _argList[0].Evaluate(nodeIterator).ToString();
139 string text2 = _argList[1].Evaluate(nodeIterator).ToString();
140 if (text.Length >= text2.Length)
141 {
142 return string.CompareOrdinal(text, 0, text2, 0, text2.Length) == 0;
143 }
144 return false;
145 }
146
148 {
149 string source = _argList[0].Evaluate(nodeIterator).ToString();
150 string value = _argList[1].Evaluate(nodeIterator).ToString();
151 return s_compareInfo.IndexOf(source, value, CompareOptions.Ordinal) >= 0;
152 }
153
155 {
156 string text = _argList[0].Evaluate(nodeIterator).ToString();
157 string text2 = _argList[1].Evaluate(nodeIterator).ToString();
158 if (text2.Length == 0)
159 {
160 return text2;
161 }
162 int num = s_compareInfo.IndexOf(text, text2, CompareOptions.Ordinal);
163 if (num >= 1)
164 {
165 return text.Substring(0, num);
166 }
167 return string.Empty;
168 }
169
171 {
172 string text = _argList[0].Evaluate(nodeIterator).ToString();
173 string text2 = _argList[1].Evaluate(nodeIterator).ToString();
174 if (text2.Length == 0)
175 {
176 return text;
177 }
178 int num = s_compareInfo.IndexOf(text, text2, CompareOptions.Ordinal);
179 if (num >= 0)
180 {
181 return text.Substring(num + text2.Length);
182 }
183 return string.Empty;
184 }
185
187 {
188 string text = _argList[0].Evaluate(nodeIterator).ToString();
189 double num = XmlConvert.XPathRound(XmlConvert.ToXPathDouble(_argList[1].Evaluate(nodeIterator))) - 1.0;
190 if (double.IsNaN(num) || (double)text.Length <= num)
191 {
192 return string.Empty;
193 }
194 if (_argList.Count == 3)
195 {
197 if (double.IsNaN(num2))
198 {
199 return string.Empty;
200 }
201 if (num < 0.0 || num2 < 0.0)
202 {
203 num2 = num + num2;
204 if (!(num2 > 0.0))
205 {
206 return string.Empty;
207 }
208 num = 0.0;
209 }
210 double num3 = (double)text.Length - num;
211 if (num2 > num3)
212 {
213 num2 = num3;
214 }
215 return text.Substring((int)num, (int)num2);
216 }
217 if (num < 0.0)
218 {
219 num = 0.0;
220 }
221 return text.Substring((int)num);
222 }
223
225 {
226 if (_argList.Count > 0)
227 {
228 return _argList[0].Evaluate(nodeIterator).ToString().Length;
229 }
230 return nodeIterator.Current.Value.Length;
231 }
232
234 {
235 string text = ((_argList.Count <= 0) ? nodeIterator.Current.Value : _argList[0].Evaluate(nodeIterator).ToString());
236 int num = -1;
237 char[] array = text.ToCharArray();
238 bool flag = false;
239 for (int i = 0; i < array.Length; i++)
240 {
241 if (!XmlCharType.IsWhiteSpace(array[i]))
242 {
243 flag = true;
244 num++;
245 array[num] = array[i];
246 }
247 else if (flag)
248 {
249 flag = false;
250 num++;
251 array[num] = ' ';
252 }
253 }
254 if (num > -1 && array[num] == ' ')
255 {
256 num--;
257 }
258 return new string(array, 0, num + 1);
259 }
260
262 {
263 string text = _argList[0].Evaluate(nodeIterator).ToString();
264 string text2 = _argList[1].Evaluate(nodeIterator).ToString();
265 string text3 = _argList[2].Evaluate(nodeIterator).ToString();
266 int num = -1;
267 char[] array = text.ToCharArray();
268 for (int i = 0; i < array.Length; i++)
269 {
270 int num2 = text2.IndexOf(array[i]);
271 if (num2 != -1)
272 {
273 if (num2 < text3.Length)
274 {
275 num++;
276 array[num] = text3[num2];
277 }
278 }
279 else
280 {
281 num++;
282 array[num] = array[i];
283 }
284 }
285 return new string(array, 0, num + 1);
286 }
287
288 public override XPathNodeIterator Clone()
289 {
290 return new StringFunctions(this);
291 }
292}
XPathResultType GetXPathType(object value)
Definition Query.cs:147
static Query Clone(Query input)
Definition Query.cs:66
double StringLength(XPathNodeIterator nodeIterator)
string Substring(XPathNodeIterator nodeIterator)
bool Contains(XPathNodeIterator nodeIterator)
string SubstringBefore(XPathNodeIterator nodeIterator)
readonly Function.FunctionType _funcType
StringFunctions(Function.FunctionType funcType, IList< Query > argList)
string Concat(XPathNodeIterator nodeIterator)
string Normalize(XPathNodeIterator nodeIterator)
static string toString(double num)
string Translate(XPathNodeIterator nodeIterator)
override void SetXsltContext(XsltContext context)
override object Evaluate(XPathNodeIterator nodeIterator)
override XPathResultType StaticType
static readonly CompareInfo s_compareInfo
string SubstringAfter(XPathNodeIterator nodeIterator)
override XPathNodeIterator Clone()
bool StartsWith(XPathNodeIterator nodeIterator)
string toString(XPathNodeIterator nodeIterator)
static CultureInfo InvariantCulture
static bool IsWhiteSpace(char ch)
static double ToXPathDouble(object o)
static double XPathRound(double value)