private void ReadIcon(MutableProjectTree tree, bool expandedIcon) { // Parses '{1B5CF1ED-9525-42B4-85F0-2CB50530ECA9 1}' Tokenizer tokenizer = Tokenizer(Delimiters.BracedPropertyValueBlock); tokenizer.Skip(TokenType.LeftBrace); // Empty icon if (tokenizer.SkipIf(TokenType.RightBrace)) { return; } var moniker = ReadProjectImageMoniker(); if (expandedIcon) { tree.ExpandedIcon = moniker; } else { tree.Icon = moniker; } tokenizer.Skip(TokenType.RightBrace); }
private string ReadQuotedPropertyValue() { // Parses '"C:\Temp"' Tokenizer tokenizer = Tokenizer(Delimiters.QuotedPropertyValue); tokenizer.Skip(TokenType.Quote); string value = tokenizer.ReadIdentifier(IdentifierParseOptions.None); tokenizer.Skip(TokenType.Quote); return(value); }
private int ReadIndentLevel(out int previousIndentLevel) { // Attempts to read the indent level of the current project item // // Root <--- IndentLevel: 0 // Parent <--- IndentLevel: 1 // Child <--- IndentLevel: 2 previousIndentLevel = _indentLevel; int indentLevel = 0; while (_tokenizer.Peek() == TokenType.WhiteSpace) { _tokenizer.Skip(TokenType.WhiteSpace); _tokenizer.Skip(TokenType.WhiteSpace); _tokenizer.Skip(TokenType.WhiteSpace); _tokenizer.Skip(TokenType.WhiteSpace); indentLevel++; } if (indentLevel > previousIndentLevel + 1) { throw _tokenizer.FormatException(ProjectTreeFormatError.IndentTooManyLevels, "Project item has been indented too many levels"); } return(_indentLevel = indentLevel); }
private void ReadFields(MutableProjectTree tree) { // Parses ', FilePath: "C:\Temp\Foo"' // This section is optional while (_tokenizer.SkipIf(TokenType.Comma)) { _tokenizer.Skip(TokenType.WhiteSpace); Tokenizer tokenizer = Tokenizer(Delimiters.PropertyName); string fieldName = tokenizer.ReadIdentifier(IdentifierParseOptions.Required); switch (fieldName) { case "FilePath": tokenizer.Skip(TokenType.Colon); tokenizer.Skip(TokenType.WhiteSpace); ReadFilePath(tree); break; case "Icon": tokenizer.Skip(TokenType.Colon); tokenizer.Skip(TokenType.WhiteSpace); ReadIcon(tree, expandedIcon: false); break; case "ExpandedIcon": tokenizer.Skip(TokenType.Colon); tokenizer.Skip(TokenType.WhiteSpace); ReadIcon(tree, expandedIcon: true); break; case "DisplayOrder": tokenizer.Skip(TokenType.Colon); tokenizer.Skip(TokenType.WhiteSpace); ReadDisplayOrder(tree); break; case "ItemName": tokenizer.Skip(TokenType.Colon); tokenizer.Skip(TokenType.WhiteSpace); ReadItemName(tree); break; default: throw _tokenizer.FormatException(ProjectTreeFormatError.UnrecognizedPropertyName, $"Expected 'FilePath', 'Icon' or 'ExpandedIcon', but encountered '{fieldName}'."); } } }
private ProjectImageMoniker ReadProjectImageMoniker() { Tokenizer tokenizer = Tokenizer(Delimiters.BracedPropertyValue); string guidAsString = tokenizer.ReadIdentifier(IdentifierParseOptions.Required); Guid guid; if (!Guid.TryParseExact(guidAsString, "D", out guid)) { throw _tokenizer.FormatException(ProjectTreeFormatError.GuidExpected, $"Expected GUID, but encountered '{guidAsString}'"); } tokenizer.Skip(TokenType.WhiteSpace); string idAsString = tokenizer.ReadIdentifier(IdentifierParseOptions.Required); int id; if (!int.TryParse(idAsString, out id)) { throw _tokenizer.FormatException(ProjectTreeFormatError.IntegerExpected, $"Expected integer, but encountered '{idAsString}'"); } return(new ProjectImageMoniker(guid, id)); }
private void ReadCapabilities(MutableProjectTree tree) { // Parse '{ProjectRoot Folder}' Tokenizer tokenizer = Tokenizer(Delimiters.BracedPropertyValueBlock); tokenizer.Skip(TokenType.LeftBrace); // Empty flags if (tokenizer.SkipIf(TokenType.RightBrace)) { return; } do { ReadFlag(tree); }while (tokenizer.SkipIf(TokenType.WhiteSpace)); tokenizer.Skip(TokenType.RightBrace); }
private void ReadProperty(MutableProjectTree tree) { Tokenizer tokenizer = Tokenizer(Delimiters.PropertyName); string propertyName = tokenizer.ReadIdentifier(IdentifierParseOptions.Required); switch (propertyName) { case "visibility": tokenizer.Skip(TokenType.Colon); tokenizer.Skip(TokenType.WhiteSpace); ReadVisibility(tree); break; case "flags": tokenizer.Skip(TokenType.Colon); tokenizer.Skip(TokenType.WhiteSpace); ReadCapabilities(tree); break; default: throw _tokenizer.FormatException(ProjectTreeFormatError.UnrecognizedPropertyName, $"Expected 'visibility' or 'flags', but encountered '{propertyName}'."); } }