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); }
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(); }