private void ProcessFile(string outputDirectory, Page page, Page previous, Page next, string relativePath = "") { if (string.IsNullOrWhiteSpace(relativePath)) relativePath = MapToOutputPath(page.File); page.OutputFile = Path.Combine(outputDirectory, relativePath); var extension = Path.GetExtension(page.File); if (extension.IsImageFormat()) { CreateOutputDirectory(page.OutputFile); FileSystem.File.Copy(page.File, page.OutputFile, true); return; } if (page is NonProcessedPage) { CreateOutputDirectory(page.OutputFile); FileSystem.File.Copy(page.File, page.OutputFile, true); return; } if (extension.IsMarkdownFile() || extension.IsRazorFile()) page.OutputFile = page.OutputFile.Replace(extension, ".html"); var pageContext = PageContext.FromPage(Context, page, outputDirectory, page.OutputFile); //pageContext.Content = markdown.Transform(pageContext.Content); pageContext.Previous = previous; pageContext.Next = next; var pageContexts = new List<PageContext> {pageContext}; object paginateObj; if (page.Bag.TryGetValue("paginate", out paginateObj)) { var paginate = Convert.ToInt32(paginateObj); var totalPages = (int)Math.Ceiling(Context.Posts.Count / Convert.ToDouble(paginateObj)); var paginator = new Paginator(Context, totalPages, paginate, 1); pageContext.Paginator = paginator; var paginateLink = "/page/:page/index.html"; if (page.Bag.ContainsKey("paginate_link")) paginateLink = Convert.ToString(page.Bag["paginate_link"]); var prevLink = page.Url; for (var i = 2; i <= totalPages; i++) { var newPaginator = new Paginator(Context, totalPages, paginate, i) {PreviousPageUrl = prevLink}; var link = paginateLink.Replace(":page", Convert.ToString(i)); paginator.NextPageUrl = link; paginator = newPaginator; prevLink = link; var path = Path.Combine(outputDirectory, link.ToRelativeFile()); pageContexts.Add(new PageContext(pageContext) {Paginator = newPaginator, OutputPath = path}); } } foreach (var context in pageContexts) { var metadata = page.Bag; while (metadata.ContainsKey("layout")) { var layout = metadata["layout"]; if ((string) layout == "nil" || layout == null) break; var path = Path.Combine(Context.SourceFolder, "_layouts", layout + LayoutExtension); if (!FileSystem.File.Exists(path)) break; try { metadata = ProcessTemplate(context, path); } catch (Exception ex) { throw new PageProcessingException( string.Format("Failed to process layout {0} for {1}, see inner exception for more details", layout, context.OutputPath), ex); } } try { context.Content = RenderTemplate(context.Content, context); } catch (Exception ex) { throw new PageProcessingException( string.Format("Failed to process {0}, see inner exception for more details", context.OutputPath), ex); } CreateOutputDirectory(context.OutputPath); FileSystem.File.WriteAllText(context.OutputPath, context.Content); } }
private void ProcessFile(string outputDirectory, Page page, Page previous, Page next, bool skipFileOnError, string relativePath = "") { if (string.IsNullOrWhiteSpace(relativePath)) relativePath = MapToOutputPath(page.File); page.OutputFile = Path.Combine(outputDirectory, relativePath); var extension = Path.GetExtension(page.File); if (extension.IsImageFormat()) { CreateOutputDirectory(page.OutputFile); CopyFileIfSourceNewer(page.File, page.OutputFile, true); return; } if (page is NonProcessedPage) { CreateOutputDirectory(page.OutputFile); CopyFileIfSourceNewer(page.File, page.OutputFile, true); return; } if (extension.IsMarkdownFile() || extension.IsRazorFile()) page.OutputFile = page.OutputFile.Replace(extension, ".html"); var pageContext = PageContext.FromPage(Context, page, outputDirectory, page.OutputFile); pageContext.Previous = previous; pageContext.Next = next; var pageContexts = new List<PageContext> { pageContext }; object paginateObj; if (page.Bag.TryGetValue("paginate", out paginateObj)) { var paginate = Convert.ToInt32(paginateObj); var totalPages = (int)Math.Ceiling(Context.Posts.Count / Convert.ToDouble(paginateObj)); var paginator = new Paginator(Context, totalPages, paginate, 1); pageContext.Paginator = paginator; var paginateLink = "/page/:page/index.html"; if (page.Bag.ContainsKey("paginate_link")) paginateLink = Convert.ToString(page.Bag["paginate_link"]); var prevLink = page.Url; for (var i = 2; i <= totalPages; i++) { var newPaginator = new Paginator(Context, totalPages, paginate, i) { PreviousPageUrl = prevLink }; var link = paginateLink.Replace(":page", Convert.ToString(i)); paginator.NextPageUrl = link; paginator = newPaginator; prevLink = link; var path = Path.Combine(outputDirectory, link.ToRelativeFile()); if (path.EndsWith(FileSystem.Path.DirectorySeparatorChar.ToString())) { path = Path.Combine(path, "index.html"); } var context = new PageContext(pageContext) { Paginator = newPaginator, OutputPath = path }; context.Bag["url"] = link; pageContexts.Add(context); } } foreach (var context in pageContexts) { var metadata = page.Bag; var failed = false; var excerptSeparator = context.Bag.ContainsKey("excerpt_separator") ? context.Bag["excerpt_separator"].ToString() : Context.ExcerptSeparator; try { context.Bag["excerpt"] = GetContentExcerpt(RenderTemplate(context.Content, context), excerptSeparator); } catch (Exception ex) { if (!skipFileOnError) { var message = string.Format("Failed to process {0}, see inner exception for more details", context.OutputPath); throw new PageProcessingException(message, ex); } Console.WriteLine(@"Failed to process {0}, see inner exception for more details", context.OutputPath); continue; } while (metadata.ContainsKey("layout")) { var layout = metadata["layout"]; if ((string)layout == "nil" || layout == null) break; var path = FindLayoutPath(layout.ToString()); if (path == null) break; try { metadata = ProcessTemplate(context, path); } catch (Exception ex) { if (!skipFileOnError) { var message = string.Format("Failed to process layout {0} for {1}, see inner exception for more details", layout, context.OutputPath); throw new PageProcessingException(message, ex); } Console.WriteLine(@"Failed to process layout {0} for {1} because '{2}'. Skipping file", layout, context.OutputPath, ex.Message); failed = true; break; } } if (failed) continue; try { context.Content = RenderTemplate(context.Content, context); } catch (Exception ex) { if (!skipFileOnError) { var message = string.Format("Failed to process {0}, see inner exception for more details", context.OutputPath); throw new PageProcessingException(message, ex); } Console.WriteLine(@"Failed to process {0}, see inner exception for more details", context.OutputPath); continue; } CreateOutputDirectory(context.OutputPath); FileSystem.File.WriteAllText(context.OutputPath, context.Content); } }