示例#1
0
        private Page CreatePage(SiteContext context, IDictionary <string, object> config, string file, bool isPost)
        {
            try
            {
                if (pageCache.ContainsKey(file))
                {
                    return(pageCache[file]);
                }
                var contents = SafeReadContents(file);
                var header   = contents.YamlHeader();
                var content  = RenderContent(file, contents, header);

                if (header.ContainsKey("published") && header["published"].ToString().ToLower() == "false")
                {
                    return(null);
                }

                var page = new Page
                {
                    Title    = header.ContainsKey("title") ? header["title"].ToString() : "this is a post",
                    Date     = header.ContainsKey("date") ? DateTime.Parse(header["date"].ToString()) : file.Datestamp(),
                    Content  = content,
                    Filepath = isPost ? GetPathWithTimestamp(context.OutputFolder, file) : GetFilePathForPage(context, file),
                    File     = file,
                    Bag      = header,
                };

                // resolve categories and tags
                if (isPost)
                {
                    page.Categories = ResolveCategories(context, header, page);

                    if (header.ContainsKey("tags"))
                    {
                        page.Tags = header["tags"] as IEnumerable <string>;
                    }
                }

                // resolve permalink
                if (header.ContainsKey("permalink"))
                {
                    page.Url = linkHelper.EvaluatePermalink(header["permalink"].ToString(), page);
                }
                else if (isPost && config.ContainsKey("permalink"))
                {
                    page.Url = linkHelper.EvaluatePermalink(config["permalink"].ToString(), page);
                }
                else
                {
                    page.Url = linkHelper.EvaluateLink(context, page);
                }

                // resolve id
                page.Id = page.Url.Replace(".html", string.Empty).Replace("index", string.Empty);

                // ensure the date is accessible in the hash
                if (!page.Bag.ContainsKey("date"))
                {
                    page.Bag["date"] = page.Date;
                }

                // The GetDirectoryPage method is reentrant, we need a cache to stop a stack overflow :)
                pageCache.Add(file, page);
                page.DirectoryPages = GetDirectoryPages(context, config, Path.GetDirectoryName(file), isPost).ToList();

                return(page);
            }
            catch (Exception e)
            {
                Tracing.Info(String.Format("Failed to build post from File: {0}", file));
                Tracing.Info(e.Message);
                Tracing.Debug(e.ToString());
            }

            return(null);
        }
        private Page CreatePage(SiteContext context, IConfiguration config, string file, bool isPost)
        {
            try
            {
                if (pageCache.ContainsKey(file))
                {
                    return(pageCache[file]);
                }
                var content = SafeReadContents(file);

                var relativePath   = MapToOutputPath(context, file);
                var scopedDefaults = context.Config.Defaults.ForScope(relativePath);

                var header = scopedDefaults.Merge(content.YamlHeader());

                if (header.ContainsKey("published") && header["published"].ToString().ToLower(CultureInfo.InvariantCulture) == "false")
                {
                    return(null);
                }

                var page = new Page
                {
                    Title    = header.ContainsKey("title") ? header["title"].ToString() : "this is a post",
                    Date     = header.ContainsKey("date") ? DateTime.Parse(header["date"].ToString()) : file.Datestamp(fileSystem),
                    Content  = content,
                    Filepath = isPost ? GetPathWithTimestamp(context.OutputFolder, file) : GetFilePathForPage(context, file),
                    File     = file,
                    Bag      = header,
                };

                // resolve categories and tags
                if (isPost)
                {
                    page.Categories = ResolveCategories(context, header, page);

                    if (header.ContainsKey("tags"))
                    {
                        page.Tags = header["tags"] as IEnumerable <string>;
                    }
                }

                // resolve permalink
                if (header.ContainsKey("permalink"))
                {
                    page.Url = linkHelper.EvaluatePermalink(header["permalink"].ToString(), page);
                }
                else if (isPost && config.ContainsKey("permalink"))
                {
                    page.Url = linkHelper.EvaluatePermalink(config["permalink"].ToString(), page);
                }
                else
                {
                    page.Url = linkHelper.EvaluateLink(context, page);
                }

                // resolve id
                page.Id = page.Url.Replace(".html", string.Empty).Replace("index", string.Empty);

                // always write date back to Bag as DateTime
                page.Bag["date"] = page.Date;

                // The GetDirectoryPage method is reentrant, we need a cache to stop a stack overflow :)
                pageCache.Add(file, page);
                page.DirectoryPages = GetDirectoryPages(context, config, Path.GetDirectoryName(file), isPost).ToList();

                return(page);
            }
            catch (Exception e)
            {
                Tracing.Info("Failed to build post from File: {0}", file);
                Tracing.Info(e.Message);
                Tracing.Debug(e.ToString());
            }

            return(null);
        }