/// <summary>
        /// Renders 'View all' pages
        /// </summary>
        /// <param name="id">The dash delimited pattern type value to filter with (e.g. organisms-global)</param>
        /// <param name="enableCss">Generate CSS for each pattern. Currently unsupported</param>
        /// <param name="noCache">Set the cacheBuster value to 0</param>
        /// <returns>A 'View all' page</returns>
        public ActionResult ViewAll(string id, bool?enableCss, bool?noCache)
        {
            // Get data from provider and set additional variables
            var model = new ViewDataDictionary(Provider.Data())
            {
                { "cssEnabled", (enableCss.HasValue && enableCss.Value).ToString().ToLower() },
                { "cacheBuster", noCache.HasValue&& noCache.Value ? "0" : Provider.CacheBuster() }
            };

            // Get the list of patterns to exclude from the page
            var styleGuideExcludes = Provider.Setting("styleGuideExcludes")
                                     .Split(new[] { PatternProvider.IdentifierDelimiter }, StringSplitOptions.RemoveEmptyEntries).ToList();

            // Filter out any hidden or exluded patterns
            var patterns =
                Provider.Patterns()
                .Where(
                    p =>
                    !p.Hidden && !string.IsNullOrEmpty(p.SubType) && !styleGuideExcludes.Contains(p.Type) &&
                    !styleGuideExcludes.Contains(p.Type.StripOrdinals()))
                .ToList();

            if (!string.IsNullOrEmpty(id))
            {
                // If a type filter is specified, add it to the data collection
                model.Add("patternPartial", string.Format("viewall-{0}", id.StripOrdinals()));

                // Find only the patterns that match the type filter
                patterns =
                    patterns.Where(p => p.TypeDash.Equals(id, StringComparison.InvariantCultureIgnoreCase)).ToList();
            }

            var partials = new List <object>();

            foreach (var pattern in patterns)
            {
                // Load the pattern's template
                var html     = Render.StringToString(pattern.Html, model, new MustacheTemplateLocator().GetTemplate);
                var lineages = new List <object>();

                // TODO: #8 Implement CSS Rule Saver as per the PHP version. Currently unsupported
                var css = string.Empty;

                // Gather a list of child patterns that the current pattern's template references
                foreach (var partial in pattern.Lineages)
                {
                    var childPattern =
                        Provider.Patterns().FirstOrDefault(
                            p => p.Partial.Equals(partial, StringComparison.InvariantCultureIgnoreCase));

                    if (childPattern != null)
                    {
                        lineages.Add(new
                        {
                            lineagePath =
                                string.Format("../../{0}/{1}",
                                              PatternProvider.FolderNamePattern.TrimStart(PatternProvider.IdentifierHidden),
                                              childPattern.HtmlUrl),
                            lineagePattern = partial,
                            lineageState   = PatternProvider.GetState(childPattern)
                        });
                    }
                }

                // Generate a JSON object to holder the patterns data
                partials.Add(new
                {
                    patternPartial       = pattern.Partial,
                    patternLink          = pattern.HtmlUrl,
                    patternName          = pattern.Name.StripOrdinals().ToDisplayCase(),
                    patternPartialCode   = html,
                    patternPartialCodeE  = Server.HtmlEncode(html),
                    patternLineageExists = lineages.Count > 0,
                    patternLineages      = lineages,
                    patternCSSExists     = !string.IsNullOrEmpty(css),
                    patternCSS           = css
                });
            }

            // Add all the pattern data to the main data collection
            model.Add("partials", partials);

            // Render 'View all' page
            return(View(PatternProvider.ViewNameViewAllPage, PatternProvider.FileNameMaster, model));
        }
Beispiel #2
0
        public ActionResult ViewSingle(string id, string masterName, bool?parse, bool?enableCss, bool?noCache)
        {
            var model = new ViewDataDictionary(Provider.Data())
            {
                { "cssEnabled", (enableCss.HasValue && enableCss.Value).ToString().ToLower() },
                { "cacheBuster", noCache.HasValue&& noCache.Value ? "0" : Provider.CacheBuster() }
            };

            var pattern = Provider.Patterns()
                          .FirstOrDefault(p => p.PathDash.Equals(id, StringComparison.InvariantCultureIgnoreCase));

            if (pattern == null)
            {
                return(null);
            }

            var childLineages  = new List <object>();
            var parentLineages = new List <object>();

            foreach (var childPattern in pattern.Lineages.Select(partial => Provider.Patterns().FirstOrDefault(
                                                                     p => p.Partial.Equals(partial, StringComparison.InvariantCultureIgnoreCase)))
                     .Where(childPattern => childPattern != null))
            {
                childLineages.Add(new
                {
                    lineagePath =
                        string.Format("../../{0}/{1}",
                                      PatternProvider.FolderNamePattern.TrimStart(PatternProvider.IdentifierHidden),
                                      childPattern.HtmlUrl),
                    lineagePattern = childPattern.Partial
                });
            }

            var parentPatterns = Provider.Patterns().Where(p => p.Lineages.Contains(pattern.Partial));

            foreach (var parentPattern in parentPatterns)
            {
                parentLineages.Add(new
                {
                    lineagePath =
                        string.Format("../../{0}/{1}",
                                      PatternProvider.FolderNamePattern.TrimStart(PatternProvider.IdentifierHidden),
                                      parentPattern.HtmlUrl),
                    lineagePattern = parentPattern.Partial
                });
            }

            var serializer = new JavaScriptSerializer();

            model.Add("viewSingle", true);
            model.Add("patternPartial", pattern.Partial);
            model.Add("lineage", serializer.Serialize(childLineages));
            model.Add("lineageR", serializer.Serialize(parentLineages));
            model.Add("patternState", PatternProvider.GetState(pattern));

            foreach (var data in pattern.Data)
            {
                if (model.ContainsKey(data.Key))
                {
                    model[data.Key] = data.Value;
                }
                else
                {
                    model.Add(data.Key, data.Value);
                }
            }

            if (!string.IsNullOrEmpty(masterName))
            {
                return(View(pattern.ViewUrl, masterName, model));
            }

            var html = pattern.Html;

            if (parse.HasValue && parse.Value)
            {
                html = Render.StringToString(html, model, new MustacheTemplateLocator().GetTemplate);
            }

            return(Content(Server.HtmlEncode(html)));
        }
        /// <summary>
        /// Renders a single pattern page
        /// </summary>
        /// <param name="id">The dash delimited path of the pattern (e.g. atoms-colors)</param>
        /// <param name="masterName">The optional master view to use when rendering</param>
        /// <param name="parse">Whether or not to parse the template and replace Mustache tags with data</param>
        /// <param name="enableCss">Generate CSS for each pattern. Currently unsupported</param>
        /// <param name="noCache">Set the cacheBuster value to 0</param>
        /// <returns>A pattern page</returns>
        public ActionResult ViewSingle(string id, string masterName, bool?parse, bool?enableCss, bool?noCache)
        {
            // Get data from provider and set additional variables
            var model = new ViewDataDictionary(Provider.Data())
            {
                { "cssEnabled", (enableCss.HasValue && enableCss.Value).ToString().ToLower() },
                { "cacheBuster", noCache.HasValue&& noCache.Value ? "0" : Provider.CacheBuster() }
            };

            // Find pattern from dash delimited path
            var pattern = Provider.Patterns()
                          .FirstOrDefault(p => p.PathDash.Equals(id, StringComparison.InvariantCultureIgnoreCase));

            if (pattern == null)
            {
                return(null);
            }

            var childLineages  = new List <object>();
            var parentLineages = new List <object>();

            // Gather a list of child patterns that the current pattern's template references
            foreach (var childPattern in pattern.Lineages.Select(partial => Provider.Patterns().FirstOrDefault(
                                                                     p => p.Partial.Equals(partial, StringComparison.InvariantCultureIgnoreCase)))
                     .Where(childPattern => childPattern != null))
            {
                childLineages.Add(new
                {
                    lineagePath =
                        string.Format("../../{0}/{1}",
                                      PatternProvider.FolderNamePattern.TrimStart(PatternProvider.IdentifierHidden),
                                      childPattern.HtmlUrl),
                    lineagePattern = childPattern.Partial,
                    lineageState   = PatternProvider.GetState(childPattern)
                });
            }

            // Gather a list of parent patterns whose templates references the current pattern
            var parentPatterns = Provider.Patterns().Where(p => p.Lineages.Contains(pattern.Partial));

            foreach (var parentPattern in parentPatterns)
            {
                parentLineages.Add(new
                {
                    lineagePath =
                        string.Format("../../{0}/{1}",
                                      PatternProvider.FolderNamePattern.TrimStart(PatternProvider.IdentifierHidden),
                                      parentPattern.HtmlUrl),
                    lineagePattern = parentPattern.Partial,
                    lineageState   = PatternProvider.GetState(parentPattern)
                });
            }

            var serializer = new JavaScriptSerializer();

            // Add pattern specific data to the data collection
            model.Add("viewSingle", true);
            model.Add("patternPartial", pattern.Partial);
            model.Add("lineage", serializer.Serialize(childLineages));
            model.Add("lineageR", serializer.Serialize(parentLineages));
            model.Add("patternState", PatternProvider.GetState(pattern));

            // For all values in the pattern data collection update the main data collection
            foreach (var data in pattern.Data)
            {
                if (model.ContainsKey(data.Key))
                {
                    model[data.Key] = data.Value;
                }
                else
                {
                    model.Add(data.Key, data.Value);
                }
            }

            if (!string.IsNullOrEmpty(masterName))
            {
                // If a master has been specified, render 'pattern.html' using master view
                return(View(pattern.ViewUrl, masterName, model));
            }

            var html = pattern.Html;

            if (parse.HasValue && parse.Value)
            {
                // If not parsing, render 'pattern.mustache'
                html = Render.StringToString(html, model, new MustacheTemplateLocator().GetTemplate);
            }

            // Else, render 'pattern.escaped.html'
            return(Content(Server.HtmlEncode(html)));
        }