public SiteConfig Execute()
{
var root = Path.GetFullPath(Path.GetDirectoryName(this.ConfigPath));
var settings = new JsonSerializerSettings();
settings.Converters.Add(new JsonTimeZoneConverter());
string json;
using (var reader = new StreamReader(this.ConfigPath))
{
json = reader.ReadToEnd();
}
var config = new SiteConfig();
config.Parent = this.Parent;
var ignoreFiles = new string[0];
var subsites = new string[0];
//var config = JsonConvert.DeserializeObject<SiteConfig>(json, settings);
foreach (var token in JObject.Parse(json))
{
var key = token.Key.ToLowerInvariant();
var value = token.Value;
switch (key)
{
case "author":
config.Author = value.ToObject<Author>();
break;
case "output":
case "outputpath":
config.OutputPath = Path.Combine(root, (string)value).Replace(Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar).EnsureBackslashTerminated();
break;
case "url":
config.Url = (string)value;
break;
case "rooturl":
config.RootUrl = (string)value;
break;
case "subsites":
subsites = value.Values<string>().ToArray();
break;
case "additionalmetadata":
config.AdditionalMetadataForFiles = this.ParseAdditionalMetadata(value).ToList();
break;
case "defaultlayoutforextension":
this.AssignDefaultLayouts(config, value);
break;
case "ignorefiles":
config.IgnoreFiles = this.ParseIgnoreFiles(value.Values<string>()).ToArray();
break;
default:
config.Metadata.Add(key, value);
break;
}
}
config.SitePath = root;
config.DataPath = Path.Combine(root, "data\\");
config.DocumentsPath = Path.Combine(root, "documents\\");
config.FilesPath = Path.Combine(root, "files\\");
config.LayoutsPath = Path.Combine(root, "layouts\\");
config.OutputPath = config.OutputPath ?? Path.Combine(root, "build\\");
config.Url = config.Url.EnsureStartsWith("/");
config.RootUrl = config.RootUrl ?? "http://localhost/";
// If override output path was provided use that.
config.OutputPath = String.IsNullOrEmpty(this.OutputPath) ? Path.GetFullPath(config.OutputPath) : Path.GetFullPath(this.OutputPath);
var siteConfigs = new List<SiteConfig>(subsites.Length);
foreach (var subsite in subsites)
{
var command = new LoadSiteConfigCommand();
command.Parent = config;
command.ConfigPath = Path.Combine(root, subsite);
var subsiteConfig = command.Execute();
siteConfigs.Add(subsiteConfig);
}
config.SubsiteConfigs = siteConfigs.ToArray();
return this.SiteConfig = config;
}