-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathBlogGenerator.cs
83 lines (70 loc) · 3.2 KB
/
BlogGenerator.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
using System;
using System.IO;
namespace blog_generator {
public class BlogGenerator {
private readonly HtmlGenerator _htmlGenerator;
private readonly BlogFactory _blogFactory;
private readonly string _templateFile;
private readonly string _indexFile;
private readonly string _pageFolder;
private readonly Settings _settings;
public BlogGenerator(Settings settings) {
_htmlGenerator = new HtmlGenerator();
_blogFactory = new BlogFactory(settings);
_templateFile = Path.Combine(settings.TemplateFolder, "template.html");
_indexFile = Path.Combine(settings.OutPutFolder, "index.html");
_pageFolder = Path.Combine(settings.OutPutFolder, "pages");
_settings = settings;
}
public void Generate() {
if(Directory.Exists(_settings.OutPutFolder))
Directory.Delete(_settings.OutPutFolder, true);
Directory.CreateDirectory(_settings.OutPutFolder);
var template = File.ReadAllText(_templateFile);
var blog = _blogFactory.Create();
blog.Sort();
GenerateIndex(blog, template);
GeneratePosts(blog, template);
GeneratePages(blog, template);
}
internal void CopyDirectories() {
if(string.IsNullOrWhiteSpace(_settings.CopyDirectories))
return;
var directories = _settings.CopyDirectories.Split(',');
foreach(var directory in directories) {
var sourceDir = Path.Combine(_settings.TemplateFolder, directory);
var outDir = Path.Combine(_settings.OutPutFolder, directory);
IOExtensions.CopyDirectory(sourceDir, outDir, true);
}
}
private void GenerateIndex(Blog blog, string template) {
var index = 1;
var html = _htmlGenerator.IndexFromTemplate(blog, template, index);
File.WriteAllText(_indexFile, html);
}
private void GeneratePosts(Blog blog, string template) {
foreach(BlogPost post in blog.Posts) {
var path = GetPostFilePath(post);
var dir = Path.GetDirectoryName(path);
if(!Directory.Exists(dir))
Directory.CreateDirectory(dir);
var html = _htmlGenerator.PostPageTemplate(blog, post, template);
html = _htmlGenerator.GenerateTreeMenu(blog, html);
File.WriteAllText(path, html);
}
}
private void GeneratePages(Blog blog, string template) {
if(!Directory.Exists(_pageFolder))
Directory.CreateDirectory(_pageFolder);
for(int i = 1; i <= blog.PageCount(); i++) {
var html = _htmlGenerator.PagesFromTemplate(blog, template, i);
File.WriteAllText(Path.Combine(_pageFolder, $"{i}.html"), html);
}
}
private string GetPostFilePath(BlogPost post) {
var fileName = Path.GetFileNameWithoutExtension(post.FileName) + ".html";
var filePath = Path.Combine(_settings.OutPutFolder, post.Year, post.Month, fileName);
return filePath;
}
}
}