public void AddViewsFromDirectory(string sourceDirectory, List <ViewNode> featureViews) { var viewsSourceDirectory = Path.GetFullPath(sourceDirectory); var viewFiles = Directory.GetFiles(viewsSourceDirectory, $"*{Config.ViewsPattern}*", SearchOption.AllDirectories); foreach (var viewFile in viewFiles) { var featureViewPath = Path.GetFullPath(viewFile) .Split(new[] { $@"{viewsSourceDirectory}\" }, StringSplitOptions.RemoveEmptyEntries) .Last(); var parts = featureViewPath .Split(new[] { @"\" }, StringSplitOptions.RemoveEmptyEntries); var namespaces = parts .Take(parts.Length - 1) .Select(Helpers.ToPascalCaseFromKebabCase) .ToList(); var featureNamespace = namespaces.First(); if (featureViews.All(v => v.Name != featureNamespace)) { featureViews.Add(new ViewNode { Name = featureNamespace }); } var subFeatures = namespaces .Skip(1) .ToList(); var viewNode = featureViews.Single(v => v.Name == featureNamespace); var parentFolderName = subFeatures.LastOrDefault() ?? featureNamespace; foreach (var subFeature in subFeatures) { var doesViewNodeHasSubFeature = viewNode.ChildViews .Any(v => v.Name == subFeature); if (!doesViewNodeHasSubFeature) { var subFeatureNode = new ViewNode { Name = subFeature }; viewNode.ChildViews.Add(subFeatureNode); } viewNode = viewNode.ChildViews .Single(v => v.Name == subFeature); } var fullViewNameInKebabCase = parts .Last() .Split(new[] { Config.ViewsPattern }, StringSplitOptions.RemoveEmptyEntries) .First(); var fullViewNameInPascalCase = Helpers.ToPascalCaseFromKebabCase(fullViewNameInKebabCase); var viewName = fullViewNameInPascalCase != parentFolderName ? Regex.Replace(fullViewNameInPascalCase, $"^{parentFolderName}", string.Empty) : fullViewNameInPascalCase; viewNode.ViewEntries.Add(new ViewEntry { Name = viewName, Path = featureViewPath.Replace(@"\", "/") }); } }
public void AddViewsFromDirectory(ViewConfig viewConfig, List <ViewNode> featureViews) { var prefix = (viewConfig.Prefix ?? string.Empty); var urlEncode = viewConfig.UrlEncodePath; var sourceDirectory = viewConfig.SourceDirectory; var viewsIgnoredExtensions = Config.ViewsIgnoredExtensions; var viewsSourceDirectory = Path.GetFullPath(sourceDirectory); var viewFiles = Directory.GetFiles(viewsSourceDirectory, $"*{Config.ViewsPattern}*", SearchOption.AllDirectories) .Where(filename => !viewsIgnoredExtensions.Any(ext => filename.EndsWith(ext))) .ToArray(); foreach (var viewFile in viewFiles) { var featureViewPath = Path.GetFullPath(viewFile) .Split(new[] { $@"{viewsSourceDirectory}\" }, StringSplitOptions.RemoveEmptyEntries) .Last(); var parts = featureViewPath .Split(new[] { @"\" }, StringSplitOptions.RemoveEmptyEntries); var namespaces = parts .Take(parts.Length - 1) .Select(Helpers.ToPascalCaseFromKebabCase) .ToList(); var featureNamespace = namespaces.First(); if (featureViews.All(v => v.Name != featureNamespace)) { featureViews.Add(new ViewNode { Name = featureNamespace }); } var subFeatures = namespaces .Skip(1) .ToList(); var viewNode = featureViews.Single(v => v.Name == featureNamespace); var parentFolderName = subFeatures.LastOrDefault() ?? featureNamespace; foreach (var subFeature in subFeatures) { var doesViewNodeHasSubFeature = viewNode.ChildViews .Any(v => v.Name == subFeature); if (!doesViewNodeHasSubFeature) { var subFeatureNode = new ViewNode { Name = subFeature }; viewNode.ChildViews.Add(subFeatureNode); } viewNode = viewNode.ChildViews .Single(v => v.Name == subFeature); } var fullViewNameInKebabCase = parts .Last() .Split(new[] { Config.ViewsPattern }, StringSplitOptions.RemoveEmptyEntries) .First(); var fullViewNameInPascalCase = Helpers.ToPascalCaseFromKebabCase(fullViewNameInKebabCase); var viewName = fullViewNameInPascalCase != parentFolderName ? Regex.Replace(fullViewNameInPascalCase, $"^{parentFolderName}", string.Empty) : fullViewNameInPascalCase; var formattedPath = featureViewPath.Replace(@"\", "/"); var path = urlEncode ? HttpUtility.UrlEncode(formattedPath) : formattedPath; var viewPath = $"{prefix}{path}"; if (viewConfig.GenerateAsLowercase) { viewPath = viewPath.ToLower(); } viewNode.ViewEntries.Add(new ViewEntry { Name = viewName, Path = viewPath }); } }