protected override void Init() { Permalink = FrontMatter.ContainsKey("permalink") ? (string)FrontMatter["permalink"] : null; Layout = FrontMatter.ContainsKey("layout") ? (string)FrontMatter["layout"] : null; Slug = FrontMatter.ContainsKey("slug") ? (string)FrontMatter["slug"] : null; Published = FrontMatter.ContainsKey("published") ? (bool)FrontMatter["published"] : true; NoCache = FrontMatter.ContainsKey("no_cache") ? (bool)FrontMatter["no_cache"] : false; Categories = new List <string>(); Tags = new List <string>(); // categories if (FrontMatter.ContainsKey("categories")) { var categories = FrontMatter["categories"] as List <object>; if (categories != null) { Categories = categories.Select(item => item.ToString()).ToList(); } else { var commaSeparatedString = FrontMatter["categories"] as string; if (commaSeparatedString != null) { Categories = commaSeparatedString.Split(new char[] { ',', ';', ' ' }, StringSplitOptions.RemoveEmptyEntries).ToList(); } } } // tags if (FrontMatter.ContainsKey("tags")) { var tags = FrontMatter["tags"] as List <object>; if (tags != null) { Tags = tags.Select(item => item.ToString()).ToList(); } else { var commaSeparatedString = FrontMatter["tags"] as string; if (commaSeparatedString != null) { Tags = commaSeparatedString.Split(new char[] { ',', ';', ' ' }, StringSplitOptions.RemoveEmptyEntries).ToList(); } } } // calculate Permalink if (String.IsNullOrWhiteSpace(Permalink)) { Permalink = "/" + VirtualPath.Replace('\\', '/').Trim('/'); // now we have /some_folder/file.html or /some_file.md // remove extension int idx = Permalink.LastIndexOf("."); if (idx != -1) { Permalink = Permalink.Substring(0, idx); } // check if it ends with /index if (Permalink.EndsWith("/index", StringComparison.OrdinalIgnoreCase)) { Permalink = Permalink.Substring(0, Permalink.Length - 6); } if (String.IsNullOrEmpty(Permalink)) { Permalink = "/"; } } // is it collection document? string[] permalinkParts = Permalink.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries); if (permalinkParts.Length > 1 && permalinkParts[0].StartsWith("_")) { this.Collection = permalinkParts[0].Substring(1); var collectionMetadata = Site.GetCollectionMetadata(this.Collection); // calculate date and permalink from post URL string pageName = permalinkParts.Last(); var match = Regex.Match(pageName, @"^(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})(-(?<title>.+))?"); if (match.Success) { string year = match.Groups["year"].Value; string month = match.Groups["month"].Value; string day = match.Groups["day"].Value; // replace permalink Permalink = collectionMetadata.Permalink .Replace(":year", year) .Replace(":month", month) .Replace(":day", day) .Replace(":title", match.Groups["title"].Value); // replace date Date = new DateTime(Int32.Parse(year), Int32.Parse(month), Int32.Parse(day)); } else { // replace '/_' in the beginning with '/' Permalink = "/" + Permalink.Substring(2); } // published state this.Published = collectionMetadata.Output; // add page to a collection Site.AddCollectionPage(this); } // override date from front matter if (FrontMatter.ContainsKey("date")) { Date = (DateTime)FrontMatter["date"]; } }