using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.IO; namespace Journal { class Journal { public List Entries; private static readonly string EntryLineRegex = @"-- Entry: (?.*) \((?<year>\d{4})-(?<month>\d{2})" + @"-(?<day>\d{2})\)"; public static Journal FromFile(string filePath) { Journal returnValue = new Journal(); StreamReader fileReader = new StreamReader(filePath); // Prepare variables for parsing the journal file. bool hitFirstEntry = false; DateTime currentEntryDate; string currentEntryTitle; StringBuilder currentEntryText = new StringBuilder(); // Prepare a regular expression for the entry lines. Regex entryLineRegex = new Regex(EntryLineRegex); while (!fileReader.EndOfStream) { string line = fileReader.ReadLine(); if (line.StartsWith("--")) { // Is this the first entry encountered? If so, don't try to // process the previous entry. if (!hitFirstEntry) { hitFirstEntry = true; } else { // Create a JournalEntry with the current entry, then // reset for the next entry. returnValue.Entries.Add( new JournalEntry( currentEntryText.ToString(), currentEntryDate ) ); currentEntryDate = new DateTime(); currentEntryText.Clear(); } // Extract the new entry title and date from this line and // save them. Match entryMatch = entryLineRegex.Match(line); GroupCollection matches = entryMatch.Groups; currentEntryDate = new DateTime( Convert.ToInt16(matches["year"].Value), Convert.ToInt16(matches["month"].Value), Convert.ToInt16(matches["day"].Value) ); currentEntryTitle = matches["title"].Value; } else { currentEntryText.Append(line); } } return returnValue; } } class JournalEntry { public string Text; public DateTime EntryDate; public JournalEntry(string text, DateTime entryDate) { this.Text = text; this.EntryDate = entryDate; } } }