public void Compile()
        {
            IEnumerable <ParsedPath> pinboardFileNames         = Target.InputPaths.Where(f => f.Extension == ".pinboard");
            IEnumerable <ParsedPath> distinctPinboardFileNames = pinboardFileNames.Distinct <ParsedPath>(new FileNameEqualityComparer());

            Dictionary <ParsedPath, PinboardFileV1> pinboards = ReadPinboardFiles(pinboardFileNames);

            ReconcilePinboards(pinboardFileNames, distinctPinboardFileNames, pinboards);

            TextWriter writer;
            ParsedPath csFileName = Target.OutputPaths.Where(f => f.Extension == ".cs").First();

            Context.WriteMessage("Writing output file '{0}'", csFileName);

            if (!Directory.Exists(csFileName.VolumeAndDirectory))
            {
                Directory.CreateDirectory(csFileName.VolumeAndDirectory);
            }

            using (writer = new StreamWriter(csFileName, false, Encoding.UTF8))
            {
                RectanglesContent rectangleData = CreateRectangleData(distinctPinboardFileNames, pinboards);

                WriteCsOutput(writer, rectangleData);
            }
        }
        private RectanglesContent CreateRectangleData(IEnumerable <ParsedPath> distinctPinboardFiles, Dictionary <ParsedPath, PinboardFileV1> pinboards)
        {
            RectanglesContent rectData = new RectanglesContent();

            rectData.Namespace = this.Namespace;
            rectData.Classes   = new List <RectanglesContent.Class>();

            foreach (var pinboardFile in distinctPinboardFiles)
            {
                PinboardFileV1 pinboard = pinboards[pinboardFile];

                RectanglesContent.Class rectClass = new RectanglesContent.Class();

                rectClass.ClassNamePrefix = pinboardFile.File;

                List <string> names = new List <string>();

                names.Add("Screen");

                foreach (var rectInfo in pinboard.RectInfos)
                {
                    names.Add(rectInfo.Name);
                }

                rectClass.RectangleNames = names;

                rectData.Classes.Add(rectClass);
            }

            return(rectData);
        }
        private void WriteCsOutput(TextWriter textWriter, RectanglesContent rectangleData)
        {
            CSharpStreamWriter writer = new CSharpStreamWriter(textWriter);

            writer.WriteLine("//");
            writer.WriteLine("// This file was generated on {{0}}.", DateTime.Now);
            writer.WriteLine("//");
            writer.WriteLine();
            writer.WriteLine("using System;");
            writer.WriteLine("using Microsoft.Xna.Framework;");
            writer.WriteLine("using Microsoft.Xna.Framework.Graphics;");
            writer.WriteLine("using System.Text;");
            writer.WriteLine();
            writer.WriteLine("namespace {{0}}", rectangleData.Namespace);
            writer.WriteLine("{");

            for (int i = 0; i < rectangleData.Classes.Count; i++)
            {
                RectanglesContent.Class classData = rectangleData.Classes[i];

                writer.WriteLine("public class {{0}}Rectangles", classData.ClassNamePrefix);
                writer.WriteLine("{");

                writer.WriteLine("private Rectangle[] rectangles;");
                writer.WriteLine();
                writer.WriteLine("public {{0}}Rectangles(Rectangle[] rectangles)", classData.ClassNamePrefix);
                writer.WriteLine("{");
                writer.WriteLine("this.rectangles = rectangles;");
                writer.WriteLine("}");
                writer.WriteLine();

                for (int j = 0; j < classData.RectangleNames.Count; j++)
                {
                    writer.WriteLine("public Rectangle {{0}} { get { return rectangles[{{1}}]; } }",
                                     classData.RectangleNames[j],
                                     j);
                }

                writer.WriteLine("}");
            }

            writer.WriteLine("public static class Rectangles");
            writer.WriteLine("{");

            for (int i = 0; i < rectangleData.Classes.Count; i++)
            {
                writer.WriteLine("public static {{0}}Rectangles {{0}} { get; set; }", rectangleData.Classes[i].ClassNamePrefix);
            }

            writer.WriteLine("}");
            writer.WriteLine("}");
        }