public string GetContent(DocumentVersionModel documentVersion, string filename)
        {
            var content      = string.Empty;
            var combinedPath = Path.Combine(documentVersion.Path, filename);

            if (File.Exists(combinedPath))
            {
                content = File.ReadAllText(combinedPath);
            }

            content = content.KeepAfter("<body>").KeepUntil("</body>");

            var imgRegex = new Regex("(?<=<img.*?src=[\"'])[^\"']*", RegexOptions.IgnoreCase);

            content = imgRegex.Replace(content, m => {
                if (m.Value.StartsWith("http", StringComparison.OrdinalIgnoreCase))
                {
                    return(m.Value);
                }

                return(documentVersion.StaticBase + m.Value);
            });

            content = content.Replace("<table>", "<table class=\"table table-bordered\">");
            content = content.Replace("{{version}}", documentVersion.Version.Substring(1)); // version without "v"
            content = content.Replace("{{docversion}}", documentVersion.Version);

            return(content);
        }
        public void ScanDocuments()
        {
            var docList = new List <DocumentModel>();

            foreach (var typeFolder in Directory.EnumerateDirectories(documentsRootFolder))
            {
                var document = new DocumentModel();

                document.Product = Path.GetFileName(typeFolder);
                document.Title   = _siteConfig.Products[document.Product];

                var versionDirectories = Directory.EnumerateDirectories(typeFolder)
                                         .Where(directory => !directory.EndsWith("-sprint", StringComparison.OrdinalIgnoreCase));

                foreach (var versionDirectory in versionDirectories)
                {
                    var dir = versionDirectory.Replace(_webRootPath, string.Empty).Replace('\\', '/').TrimEnd('/') + "/";
                    var documentVersionModel = new DocumentVersionModel()
                    {
                        Path             = versionDirectory,
                        ContentFilenames = Directory.EnumerateFiles(versionDirectory, "*.html", SearchOption.AllDirectories).Select(Path.GetFileName).ToList(),
                        Version          = Path.GetFileName(versionDirectory),
                        StaticBase       = $"{_cdnUrl}{dir}"
                    };

                    documentVersionModel.StartFilename = documentVersionModel
                                                         .ContentFilenames
                                                         .Select(filename => new { Filename = filename, Rank = IsDefaultDoc(filename) ? 1 : 0 })
                                                         .OrderByDescending(o => o.Rank)
                                                         .Select(s => s.Filename)
                                                         .FirstOrDefault();
                    documentVersionModel.TocFilename = documentVersionModel
                                                       .ContentFilenames.Where(file => string.CompareOrdinal(file, "toc.html") == 0)
                                                       .FirstOrDefault();

                    document.DocumentVersions.Add(documentVersionModel);
                }

                document.Versions = document.DocumentVersions
                                    .Select(s => s.Version)
                                    .OrderByDescending(o => o, new AlphanumComparator())
                                    .ToList();

                docList.Add(document);
            }

            Documents.Clear();
            Documents.AddRange(docList);
        }
        public string ValidateFilename(DocumentVersionModel documentVersion, string file)
        {
            var filename = documentVersion.StartFilename;

            if (!string.IsNullOrEmpty(file))
            {
                var selectedFilename = documentVersion.ContentFilenames
                                       .FirstOrDefault(contentFilename => string.CompareOrdinal(file, Path.GetFileNameWithoutExtension(contentFilename)) == 0);
                if (!string.IsNullOrEmpty(selectedFilename))
                {
                    filename = selectedFilename;
                }
            }

            return(filename);
        }