Welcome to mirror list, hosted at ThFree Co, Russian Federation.

RegexWorker.cs « Configuration « System.Web « referencesource « class « mcs - github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 34d9ce4cda7a3ba496bbb555e642450fc5bebbfc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
//------------------------------------------------------------------------------
// <copyright file="RegexWorker.cs" company="Microsoft">
//     Copyright (c) Microsoft Corporation.  All rights reserved.
// </copyright>
//------------------------------------------------------------------------------

/*
 * Base class for browser capabilities object: just a read-only dictionary
 * holder that supports Init()
 *
 * 


*/

using System.Web.UI;
using System.Collections;
using System.Collections.Specialized;
using System.ComponentModel;
using System.Globalization;
using System.Security.Permissions;
using System.Text;
using System.Text.RegularExpressions;
using System.Web.RegularExpressions;
using System.Web.Util;

namespace System.Web.Configuration {

    //
    public class RegexWorker {
        internal static readonly Regex RefPat = new BrowserCapsRefRegex();
        private Hashtable _groups;
        private HttpBrowserCapabilities _browserCaps;

        public RegexWorker(HttpBrowserCapabilities browserCaps) {
            _browserCaps = browserCaps;
        }

        private string Lookup(string from) {
            MatchCollection matches = RefPat.Matches(from);

            // shortcut for no reference case
            if (matches.Count == 0) {
                return from;
            }

            StringBuilder sb = new StringBuilder();
            int startIndex = 0;

            foreach (Match match in matches) {
                int length = match.Index - startIndex;
                sb.Append(from.Substring(startIndex, length));
                startIndex = match.Index + match.Length;

                string groupName = match.Groups["name"].Value;

                string result = null;
                if (_groups != null) {
                    result = (String)_groups[groupName];
                }

                if (result == null) {
                    result = _browserCaps[groupName];
                }

                sb.Append(result);
            }

            sb.Append(from, startIndex, from.Length - startIndex);
            string output = sb.ToString();

            // Return null instead of empty string since empty string is used to override values.
            if (output.Length == 0) {
                return null;
            }

            return output;
        }

        public string this[string key] {
            get {
                return Lookup(key);
            }
        }

        public bool ProcessRegex(string target, string regexExpression) {
            if(target == null) {
                target = String.Empty;
            }

            Regex regex = new Regex(regexExpression, RegexOptions.ExplicitCapture);
            Match match = regex.Match(target);
            if(match.Success == false) {
                return false;
            }

            string[] groups = regex.GetGroupNames();

            if (groups.Length > 0) {
                if (_groups == null) {
                    _groups = new Hashtable();
                }

                for (int i = 0; i < groups.Length; i++) {
                    _groups[groups[i]] = match.Groups[i].Value;
                }
            }

            return true;
        }
    }
}