private LayoutContentObject GetLayout(string layoutName, string layoutType, ContentType contentType)
        {
            LayoutContentObject layoutObject;

            layoutType ??= LayoutTypes.Single;
            var layoutKey = new LayoutKey(layoutName, layoutType, contentType);

            if (_layouts.TryGetValue(layoutKey, out layoutObject))
            {
                return(layoutObject);
            }

            var layoutDelegate = FindLayoutPaths(layoutType);

            if (layoutDelegate != null)
            {
                // Get all possible extensions for the specific content type
                var extensions = Site.ContentTypes.GetExtensionsByContentType(contentType);
                var layoutRoot = UPath.Root / LayoutFolderName;
                foreach (var layoutPath in layoutDelegate(Site, layoutName, layoutType))
                {
                    foreach (var extension in extensions)
                    {
                        var fullLayoutPath = layoutRoot / layoutPath.FullName + extension;
                        var entry          = new FileEntry(Site.MetaFileSystem, fullLayoutPath);
                        if (entry.Exists)
                        {
                            var scriptLayoutText = entry.ReadAllText();
                            var scriptInstance   = Site.Scripts.ParseScript(scriptLayoutText, fullLayoutPath, ScriptMode.FrontMatterAndContent);

                            if (scriptInstance.HasErrors)
                            {
                                goto exit;
                            }

                            layoutObject = new LayoutContentObject(Site, entry, scriptInstance);

                            // We run first the front matter on the layout
                            if (layoutObject.FrontMatter != null && !Site.Scripts.TryRunFrontMatter(layoutObject.FrontMatter, layoutObject))
                            {
                                goto exit;
                            }

                            _layouts.Add(layoutKey, layoutObject);
                            return(layoutObject);
                        }
                    }
                }
            }

exit:
            return(null);
        }
Beispiel #2
0
        private ScriptInstance GetLayout(string layoutName, string layoutType, ContentType contentType)
        {
            ScriptInstance scriptResult;

            layoutType ??= LayoutTypes.Single;
            var layoutKey = new LayoutKey(layoutName, layoutType, contentType);

            if (_layouts.TryGetValue(layoutKey, out scriptResult))
            {
                return(scriptResult);
            }

            var layoutDelegate = FindLayoutPaths(layoutType);

            if (layoutDelegate != null)
            {
                // Get all possible extensions for the specific content type
                var extensions = Site.ContentTypes.GetExtensionsByContentType(contentType);
                var layoutRoot = UPath.Root / LayoutFolderName;
                foreach (var layoutPath in layoutDelegate(Site, layoutName, layoutType))
                {
                    foreach (var extension in extensions)
                    {
                        var fullLayoutPath = layoutRoot / layoutPath.FullName + extension;
                        var entry          = new FileEntry(Site.MetaFileSystem, fullLayoutPath);
                        if (entry.Exists)
                        {
                            var scriptLayoutText = entry.ReadAllText();
                            scriptResult = Site.Scripts.ParseScript(scriptLayoutText, fullLayoutPath, ScriptMode.FrontMatterAndContent);
                            _layouts.Add(layoutKey, scriptResult);
                            return(scriptResult);
                        }
                    }
                }
            }

            return(null);
        }