private static void PrintFile(string filename, int maxRuleLength = 100) { using (TextReader reader = File.OpenText(filename)) { PoeFilterParser parser = new PoeFilterParser(); parser.TextReader = reader; // Note: parser.Next() is naive and will not find all errors. // Use parser.Parse(filename) to ensure that all errors are picked up. IFilterRule rule; while ((rule = parser.Next()) != null) { string ruleType = rule.Type.ToString(); string ruleText = rule.ToString(); switch (rule.Type) { case FilterType.WhiteSpace: ruleType = ""; break; case FilterType.DisabledBlock: DisabledBlock disabledBlock = (DisabledBlock)rule; ruleType = "#" + disabledBlock.Rule.Type; break; case FilterType.ParseError: ParseError parseError = (ParseError)rule; if (parseError.Column > 0) { ruleText = "..." + ruleText.Substring(parseError.Column); } break; case FilterType.Show: case FilterType.Hide: break; default: ruleText = "\t" + ruleText; break; } ruleText = $"{ parser.LineNumber,-5} {ruleType,-22} {ruleText}"; if (ruleText.Length > maxRuleLength) { ruleText = ruleText.Substring(0, maxRuleLength - 3) + "..."; } Console.WriteLine(ruleText); } } }
private static void TestFile(string filename) { PoeFilterFile poeFile; using (TextReader reader = File.OpenText(filename)) { PoeFilterParser parser = new PoeFilterParser(); poeFile = parser.Parse(reader); } foreach (RuleBlock filter in poeFile.Blocks) { for (int i = 0; i < filter.Rules.Count; i++) { IFilterRule rule = filter.Rules[i]; if (rule.Type == FilterType.ParseError) { throw new InvalidOperationException(rule.Type + ": " + rule.Text); } if (rule.Type == FilterType.WhiteSpace) { continue; } if (rule is DisabledBlock disabledBlock) { rule = disabledBlock.Rule; // Disabled blocks are commented rules } if (rule.Type == FilterType.Show || rule.Type == FilterType.Hide) { continue; } if (rule is IFilterCriteria _) { continue; } if (rule is IFilterAction _) { continue; } throw new InvalidOperationException(); // must be show/hide, action, or criteria } } }
private static void PrintBlocks(string filename, int maxRuleLength = 80) { PoeFilterFile poeFile; using (TextReader reader = File.OpenText(filename)) { PoeFilterParser parser = new PoeFilterParser(); poeFile = parser.Parse(reader); } for (int i = 0; i < poeFile.Blocks.Count; i++) { RuleBlock block = poeFile.Blocks[i]; // A FilterBlock includes a group of rules after a Show/Hide. // It will also include some comments before and after the rule foreach (IFilterRule rule in block.Rules) { string text = rule.ToString(); switch (rule.Type) { case FilterType.DisabledBlock: case FilterType.WhiteSpace: case FilterType.Show: case FilterType.Hide: text = " " + text; break; default: text = "\t " + text; break; } if (text.Length > maxRuleLength) { text = text.Substring(0, maxRuleLength - 3) + "..."; } Console.WriteLine(text); } Console.WriteLine("-"); } }
private static void PrintSortedBlocks(string filename, int maxRuleLength = 80) { PoeFilterFile poeFile; using (TextReader reader = File.OpenText(filename)) { PoeFilterParser parser = new PoeFilterParser(); poeFile = parser.Parse(reader); } foreach (RuleBlock block in poeFile.Blocks) { // Rules can be categorized into WhiteSpace, Blocks, Criteria, Actions, and Errors // See: https://www.pathofexile.com/item-filter/about List <IFilterRule> rules = block.Rules; if (block.IsDisabled) { rules = rules.Where(r => r.Type != FilterType.WhiteSpace).Select(r => ((DisabledBlock)r).Rule) .Where(r => r.Type != FilterType.WhiteSpace).OrderBy(r => r.Type).ToList(); } else { rules = block.Rules.Where(r => r.Type != FilterType.WhiteSpace).OrderBy(r => r.Type).ToList(); } foreach (string line in rules.Select(r => r.Type == FilterType.Show || r.Type == FilterType.Hide ? r.ToString() : "\t" + r.ToString())) { string text = line; if (text.Length > maxRuleLength) { text = line.Substring(0, maxRuleLength - 3) + "..."; } if (block.IsDisabled) { Console.Write("#"); } Console.WriteLine(text); } Console.WriteLine(); } }