示例#1
0
        private Group SearchMatchGroup(string key, MatchChainNode matches)
        {
            MatchChainNode node = matches;

            while (node != null)
            {
                int num = node.Regex.GroupNumberFromName(key);

                if (num >= 0)
                {
                    Group group = node.Match.Groups[num];

                    if (group.Success)
                    {
                        return(group);
                    }
                }

                node = node.Previous;
            }

            return(null);
        }
示例#2
0
        private RouteResult DoSubRoute(UrlScheme urlScheme, MatchChainNode previousMatch)
        {
            RouteResult result = null;

            int startIndex = 0;

            if (previousMatch != null)
            {
                startIndex = previousMatch.Match.Index + previousMatch.Match.Length;
            }

            if (Childs != null)
            {
                if (m_BasePathPatternRegex != null)
                {
                    Match match = m_BasePathPatternRegex.Match(urlScheme.Main, startIndex);

                    if (match.Success && match.Index + match.Length < urlScheme.Main.Length)
                    {
                        MatchChainNode matchWrap = new MatchChainNode(previousMatch, m_BasePathPatternRegex, match);

                        foreach (RouteTable child in Childs)
                        {
                            result = child.DoSubRoute(urlScheme, matchWrap);

                            if (result != null)
                            {
                                break;
                            }
                        }
                    }
                }
                else
                {
                    foreach (RouteTable child in Childs)
                    {
                        result = child.Route(urlScheme);

                        if (result.Succeed)
                        {
                            break;
                        }
                    }
                }
            }
            else if (m_FriendlyPathPatternRegex != null)
            {
                Match match = m_FriendlyPathPatternRegex.Match(urlScheme.Main, startIndex);

                if (match.Success)
                {
                    MatchChainNode matchWrap = new MatchChainNode(previousMatch, m_FriendlyPathPatternRegex, match);

                    string originalPath = CreateOriginalPath(urlScheme.Main, urlScheme.QueryString, matchWrap);

                    result = new RouteResult(originalPath);
                }
            }
            else
            {
                string resultString = OriginalPathBuilder(urlScheme);

                if (string.IsNullOrEmpty(resultString))
                {
                    return(new RouteResult());
                }
                else
                {
                    return(new RouteResult(resultString));
                }
            }

            return(result);
        }
示例#3
0
        private string CreateOriginalPath(string path, string query, MatchChainNode matches)
        {
            StringBuilder sb = new StringBuilder();

            int lastIndex = 0;

            while (lastIndex < OriginalPathPattern.Length)
            {
                int startIndex = OriginalPathPattern.IndexOf("${", lastIndex);

                if (startIndex >= lastIndex)
                {
                    if (startIndex > 0)
                    {
                        if (OriginalPathPattern[startIndex - 1] == '$')
                        {
                            sb.Append(OriginalPathPattern, startIndex, 2);

                            lastIndex = startIndex + 2;

                            continue;
                        }
                    }

                    if (startIndex > lastIndex)
                    {
                        sb.Append(OriginalPathPattern, lastIndex, startIndex - lastIndex);
                    }

                    int endIndex = OriginalPathPattern.IndexOf("}", startIndex);

                    if (endIndex > lastIndex)
                    {
                        if (endIndex > startIndex + 3)
                        {
                            int keyStartIndex = startIndex + 2;

                            string key = OriginalPathPattern.Substring(keyStartIndex, endIndex - keyStartIndex);

                            Group group = SearchMatchGroup(key, matches);

                            if (group == null)
                            {
                                sb.Append(OriginalPathPattern, startIndex, endIndex - startIndex);
                            }
                            else
                            {
                                sb.Append(path, group.Index, group.Length);
                            }
                        }
                        else
                        {
                            sb.Append(OriginalPathPattern, startIndex, endIndex - startIndex);
                        }

                        lastIndex = endIndex + 1;
                    }
                    else
                    {
                        sb.Append(OriginalPathPattern, startIndex, OriginalPathPattern.Length - startIndex);
                        break;
                    }
                }
                else
                {
                    sb.Append(OriginalPathPattern, lastIndex, OriginalPathPattern.Length - lastIndex);
                    break;
                }
            }

            string originalPath = sb.ToString();

            int indexOfQueryString = originalPath.IndexOf('?');

            if (indexOfQueryString >= 0)
            {
                string head = originalPath.Substring(0, indexOfQueryString);

                if (indexOfQueryString < originalPath.Length - 1)
                {
                    string oldQuery = originalPath.Substring(indexOfQueryString);

                    string newQuery = MergeQueryString(oldQuery, query);

                    return(head + "?" + newQuery);
                }
                else
                {
                    return(head + query);
                }
            }
            else
            {
                return(originalPath + query);
            }
        }
示例#4
0
 public MatchChainNode(MatchChainNode previous, Regex regex, Match match)
 {
     Previous = previous;
     Regex    = regex;
     Match    = match;
 }
示例#5
0
		private Group SearchMatchGroup(string key, MatchChainNode matches)
		{
			MatchChainNode node = matches;

			while (node != null)
			{
				int num = node.Regex.GroupNumberFromName(key);

				if (num >= 0)
				{
					Group group = node.Match.Groups[num];

					if (group.Success)
						return group;
				}

				node = node.Previous;
			}

			return null;
		}
示例#6
0
		private string CreateOriginalPath(string path, string query, MatchChainNode matches)
		{
			StringBuilder sb = new StringBuilder();

			int lastIndex = 0;

			while (lastIndex < OriginalPathPattern.Length)
			{
				int startIndex = OriginalPathPattern.IndexOf("${", lastIndex);

				if (startIndex >= lastIndex)
				{
					if (startIndex > 0)
					{
						if (OriginalPathPattern[startIndex - 1] == '$')
						{
							sb.Append(OriginalPathPattern, startIndex, 2);

							lastIndex = startIndex + 2;

							continue;
						}
					}

					if (startIndex > lastIndex)
					{
						sb.Append(OriginalPathPattern, lastIndex, startIndex - lastIndex);
					}

					int endIndex = OriginalPathPattern.IndexOf("}", startIndex);

					if (endIndex > lastIndex)
					{
						if (endIndex > startIndex + 3)
						{
							int keyStartIndex = startIndex + 2;

							string key = OriginalPathPattern.Substring(keyStartIndex, endIndex - keyStartIndex);

							Group group = SearchMatchGroup(key, matches);

							if (group == null)
							{
								sb.Append(OriginalPathPattern, startIndex, endIndex - startIndex);
							}
							else
							{
								sb.Append(path, group.Index, group.Length);
							}
						}
						else
						{
							sb.Append(OriginalPathPattern, startIndex, endIndex - startIndex);
						}

						lastIndex = endIndex + 1;
					}
					else
					{
						sb.Append(OriginalPathPattern, startIndex, OriginalPathPattern.Length - startIndex);
						break;
					}
				}
				else
				{
					sb.Append(OriginalPathPattern, lastIndex, OriginalPathPattern.Length - lastIndex);
					break;
				}
			}

			string originalPath = sb.ToString();

			int indexOfQueryString = originalPath.IndexOf('?');

			if (indexOfQueryString >= 0)
			{
				string head = originalPath.Substring(0, indexOfQueryString);

				if (indexOfQueryString < originalPath.Length - 1)
				{
					string oldQuery = originalPath.Substring(indexOfQueryString);

					string newQuery = MergeQueryString(oldQuery, query);

					return head + "?" + newQuery;
				}
				else
				{
					return head + query;
				}
			}
			else
			{
				return originalPath + query;
			}
		}
示例#7
0
        private RouteResult DoSubRoute(UrlScheme urlScheme, MatchChainNode previousMatch)
        {
            RouteResult result = null;

            int startIndex = 0;

            if (previousMatch != null)
                startIndex = previousMatch.Match.Index + previousMatch.Match.Length;

            if (Childs != null)
            {
                if (m_BasePathPatternRegex != null)
                {
                    Match match = m_BasePathPatternRegex.Match(urlScheme.Main, startIndex);

                    if (match.Success && match.Index + match.Length < urlScheme.Main.Length)
                    {
                        MatchChainNode matchWrap = new MatchChainNode(previousMatch, m_BasePathPatternRegex, match);

                        foreach (RouteTable child in Childs)
                        {
                            result = child.DoSubRoute(urlScheme, matchWrap);

                            if (result != null)
                                break;
                        }
                    }
                }
                else
                {
                    foreach (RouteTable child in Childs)
                    {
                        result = child.Route(urlScheme);

                        if (result.Succeed)
                            break;
                    }
                }
            }
            else if (m_FriendlyPathPatternRegex != null)
            {
                Match match = m_FriendlyPathPatternRegex.Match(urlScheme.Main, startIndex);

                if (match.Success)
                {
                    MatchChainNode matchWrap = new MatchChainNode(previousMatch, m_FriendlyPathPatternRegex, match);

                    string originalPath = CreateOriginalPath(urlScheme.Main, urlScheme.QueryString, matchWrap);

                    result = new RouteResult(originalPath);
                }
            }
            else
            {
                string resultString = OriginalPathBuilder(urlScheme);

                if (string.IsNullOrEmpty(resultString))
                    return new RouteResult();
                else
                    return new RouteResult(resultString);
            }

            return result;
        }
示例#8
0
			public MatchChainNode(MatchChainNode previous, Regex regex, Match match)
			{
				Previous = previous;
				Regex = regex;
				Match = match;
			}