/// <summary> /// Takes a BibTex file as string as parses it to a Dictionary containing the Bibliography /// </summary> /// <param name="data">A BibTex file as a string</param> /// <returns>A dictionary of the Bibliography</returns> public List <Item> Parse(string data) { // Computing regex matches from the data. MatchCollection matchCollection = _entryRegex.Matches(data); // Collection to store the BibTex items. var items = new List <Item>(); // Iterate over every BibTex item in the data. foreach (Match match in matchCollection) { try { // Get the BibTex item and associated field values. string key = match.Groups[2].Value; Item.ItemType type = (Item.ItemType)Enum.Parse(typeof(Item.ItemType), match.Groups[1].Value, true); Dictionary <Item.FieldType, string> fields = ParseItem(match.Groups[3].Value); var item = new Item(type, fields); // Validate the item. if (!_validator.IsItemValid(item)) { throw new InvalidDataException($"The item with key {key} is not valid"); } items.Add(item); } catch (ArgumentException e) { throw new InvalidDataException($"The item type {match.Groups[1].Value} is not known by the parser", e); } } return(items); }