private IReadOnlyList <Token> ConstructTokens(string p)
            {
                var tokens = new List <Token>();

                for (var i = 0; i < p.Length; i++)
                {
                    var currentToken = new Token();

                    while (i < p.Length && p[i] != AnySequence)
                    {
                        currentToken.AddChar(p[i++]);
                    }

                    if (currentToken.Pattern.Length != 0)
                    {
                        tokens.Add(currentToken);
                    }

                    if (i < p.Length && p[i] == AnySequence)
                    {
                        currentToken = new Token();
                        currentToken.AddChar(AnySequence);
                        tokens.Add(currentToken);
                    }
                }

                for (int i = 0; i + 1 < tokens.Count; i++)
                {
                    //i.e. consequent *
                    //impossible case is like aa = aa, as it should be one token aaaa
                    if (tokens[i].Pattern == tokens[i + 1].Pattern)
                    {
                        tokens.RemoveAt(i--);
                    }
                }

                var distanceToStart = 0;

                for (int i = 0; i < tokens.Count; i++)
                {
                    tokens[i].FromStart = distanceToStart;
                    distanceToStart    += tokens[i].Priority;
                }

                var distanceToEnd = 0;

                for (int i = tokens.Count - 1; i >= 0; i--)
                {
                    tokens[i].FromEnd = distanceToEnd;
                    distanceToEnd    += tokens[i].Priority;
                }

                return(tokens);
            }
Ejemplo n.º 2
0
            public void ParseSVGPath(string p)
            {
                Token Current = new Token();


                for (int i = 0; i < p.Length; i++)
                {
                    if (Current.AddChar(p[i]) == false)
                    {
                        Tokens.Add(Current);
                        Current = new Token();
                        Current.AddChar(p[i]);
                    }
                }


                if (Current.Type != TokenType.NoType)
                {
                    Current.AddChar(' ');
                    Tokens.Add(Current);
                }

                Token N = NextToken();

                while (N != null)
                {
                    switch (N.command)
                    {
                    case 'M': MoveToAbs(NextToken().value, NextToken().value); break;

                    case 'm': MoveToRel(NextToken().value, NextToken().value); break;

                    case 'L': LineToAbs(NextToken().value, NextToken().value); break;

                    case 'l':
                        LineToRel(NextToken().value, NextToken().value);
                        break;

                    case 'H':
                        HorizToAbs(NextToken().value);
                        break;

                    case 'h':
                        HorizToRel(NextToken().value);
                        break;

                    case 'V':
                        VertToAbs(NextToken().value);
                        break;

                    case 'v':
                        VertToRel(NextToken().value);
                        break;

                    case 'C':
                        CurveToAbs(NextToken().value, NextToken().value, NextToken().value, NextToken().value, NextToken().value, NextToken().value);
                        break;

                    case 'c':
                        CurveToRel(NextToken().value, NextToken().value, NextToken().value, NextToken().value, NextToken().value, NextToken().value);
                        break;

                    case 'Z':
                    case 'z':
                        ClosePoly();
                        break;
                    }
                    N = NextToken();
                }

                ClosePoly();
            }