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(); } }