private static void hideNext(PopulatedTemplate template)
        {
            HtmlDocument populatedDocument = template.PopulatedDocument;

            HtmlNode next = populatedDocument.DocumentNode.SelectSingleNode(NextPostXPath);

            next.Remove();
        }
        private static void hidePrevious(PopulatedTemplate template)
        {
            HtmlDocument populatedDocument = template.PopulatedDocument;

            HtmlNode previous = populatedDocument.DocumentNode.SelectSingleNode(PreviousPostXPath);

            previous.Remove();
        }
        private static void replaceNext(PopulatedTemplate template, string relativeUri)
        {
            HtmlDocument populatedDocument = template.PopulatedDocument;

            HtmlNode next = populatedDocument.DocumentNode.SelectSingleNode(NextPostXPath);

            next.Attributes.Add(HREF, relativeUri);
        }
        private static void replacePrevious(PopulatedTemplate template, string relativeUri)
        {
            HtmlDocument populatedDocument = template.PopulatedDocument;

            HtmlNode previous = populatedDocument.DocumentNode.SelectSingleNode(PreviousPostXPath);

            previous.Attributes.Add(HREF, relativeUri);
        }
        public override void Compose()
        {
            #region Copy CSS File to Output directory

            string cssFile = OptionsContext.Current.Options.BlogCSSFile;
            string cssFolder = Path.Combine(OptionsContext.Current.Options.OutputDirectory, "css");
            IOContext.Current.CreateDirectory(cssFolder);
            IOContext.Current.FileCopy(cssFile, Path.Combine(cssFolder, cssFile));

            #endregion

            IReadOnlyCollection <IBasePage> blogPosts = _blogProvider.Pages;
            int index = 1;
            int posts = blogPosts.Count;

            IList<PopulatedTemplate> populatedTemplates = new List<PopulatedTemplate>();
            PopulatedTemplate rootIndexTemplate = null;

            foreach (IBlogPost blogPost in blogPosts)
            {
                // ASSUMPTION: First blog post in the list is the newest, should have been sorted by date in the BlogPostProvider.
                // Only run this code once.
                if (rootIndexTemplate == null)
                {
                    rootIndexTemplate = createRootIndexPopulatedTemplate(blogPost, posts);
                }

                try
                {
                    HtmlDocument template = CopyOfTemplate;

                    addBlogCSS(template, blogPost);
                    replaceBlogDiv(template, blogPost);
                    replaceAllTitles(template, blogPost);
                    replaceAllDates(template, blogPost);
                    replaceAllFragments(template);

                    NavigationButtons buttonsNeeded;

                    if (posts == 1)
                    {
                        buttonsNeeded = NavigationButtons.None;
                    }
                    else
                    {
                        if (index == 1)
                        {
                            buttonsNeeded = NavigationButtons.PreviousOnly;
                        }
                        else if (index == posts)
                        {
                            buttonsNeeded = NavigationButtons.NextOnly;
                        }
                        else
                        {
                            buttonsNeeded = NavigationButtons.Both;
                        }
                    }

                    populatedTemplates.Add(new PopulatedTemplate(blogPost, template, buttonsNeeded, OptionsContext.Current.Options.OutputDirectory));
                }
                catch (Exception e)
                {
                    ErrorWriterContext.Current.WriteLine(Invariant($"Error creating blog post with title {blogPost.Metadata.Title}."));
                    ErrorWriterContext.Current.WriteLine(e.ToString());
                    throw e;
                }

                index++;
            }

            #region Root Index page creation

            // Create the main page root index file first
            if (rootIndexTemplate == null)
            {
                throw new InvalidOperationException("Stopped because the main page wasn't going to be created");
            }

            // Only two possible cases:
            //      1. There is only one blog post
            //      2. This is the first blog post of many
            // The first blog post should not need next or both navigation buttons.
            switch (rootIndexTemplate.ButtonsNeeded)
            {
                case NavigationButtons.None:
                    {
                        hideNext(rootIndexTemplate);
                        hidePrevious(rootIndexTemplate);
                    }
                    break;
                case NavigationButtons.PreviousOnly:
                    {
                        // ASSUMPTION: The first index will be the previous page, based on date sorting
                        PopulatedTemplate previousTemplate = populatedTemplates[1];
                        replacePrevious(rootIndexTemplate, previousTemplate.RootRelativePath);
                        hideNext(rootIndexTemplate);
                    }
                    break;
                default:
                    throw new InvalidOperationException(Invariant($"Enum value {rootIndexTemplate.ButtonsNeeded} is not valid for the first blog post"));
            }

            rootIndexTemplate.SaveAsRootIndex();

            #endregion

            // Now create the rest of the blog pages
            for (int i = 0; i < populatedTemplates.Count; i++)
            {
                PopulatedTemplate currentTemplate = populatedTemplates[i];

                switch (currentTemplate.ButtonsNeeded)
                {
                    case NavigationButtons.None:
                        {
                            hideNext(currentTemplate);
                            hidePrevious(currentTemplate);
                        }
                        break;
                    case NavigationButtons.NextOnly:
                        {
                            PopulatedTemplate nextTemplate = populatedTemplates[i - 1];
                            replaceNext(currentTemplate, nextTemplate.RelativePath);
                            hidePrevious(currentTemplate);
                        }
                        break;
                    case NavigationButtons.PreviousOnly:
                        {
                            PopulatedTemplate previousTemplate = populatedTemplates[i + 1];
                            replacePrevious(currentTemplate, previousTemplate.RelativePath);
                            hideNext(currentTemplate);
                        }
                        break;
                    case NavigationButtons.Both:
                        {
                            PopulatedTemplate previousTemplate = populatedTemplates[i + 1];
                            replacePrevious(currentTemplate, previousTemplate.RelativePath);

                            PopulatedTemplate nextTemplate = populatedTemplates[i - 1];
                            replaceNext(currentTemplate, nextTemplate.RelativePath);
                        }
                        break;
                    default:
                        throw new InvalidOperationException(Invariant($"Enum value {currentTemplate.ButtonsNeeded} not supported"));
                }

                currentTemplate.Save();
            }
        }