private List <NavItem> CreateNavItems(GithubUri githubUri, IReadOnlyCollection <ContentInfo> files)
        {
            var navItems = files
                           .Where(r => (GithubUri.CheckIfMarkdownFile(r.Name) || r.Type == "dir") &&
                                  !r.Name.StartsWith("."))
                           .Select(r =>
                                   new NavItem(
                                       r.Name,
                                       githubUri.Owner + "/" + githubUri.RepoName + "/" + r.Path,
                                       r.Type == "dir" ? NavType.Directory : NavType.Markdown,
                                       false))
                           .OrderBy(r => r.Type)
                           .ThenBy(r => r.Title)
                           .ToList();

            if (navItems != null && navItems.Count > 0)
            {
                if (githubUri.IsMarkdownFile)
                {
                    navItems.First(n => n.Uri.EndsWith(githubUri.FilePath)).IsDefault = true;
                }
                else if (navItems.Any(n => n.Uri.EndsWith(README)))
                {
                    navItems.First(n => n.Uri.EndsWith(README)).IsDefault = true;
                }
                else if (navItems.Any(n => GithubUri.CheckIfMarkdownFile(n.Uri)))
                {
                    navItems.First(n => GithubUri.CheckIfMarkdownFile(n.Uri)).IsDefault = true;
                }
            }

            return(navItems);
        }
        public async Task <string> DownloadFileAsHtmlAsync(GithubUri githubUri)
        {
            var gitParams = await ResolveParamsAsync(githubUri);

            var mdFile = await DownloadMarkdownFileAsync(gitParams.Owner, gitParams.RepoName, gitParams.FilePath);

            return(await ConvertToHtml(mdFile, ResolveUri));
        }
        private async Task <string> DownloadMarkdownFileAsync(string owner, string repoName, string filePath)
        {
            if (!GithubUri.CheckIfMarkdownFile(filePath))
            {
                return("");
            }

            var file = await _githubRepo.GetFileContentAsync(owner, repoName, filePath);

            return(file.Content);
        }
        private async Task <string> GetRepoNameOrDefaultAsync(GithubUri githubUri)
        {
            if (!string.IsNullOrWhiteSpace(githubUri.RepoName))
            {
                return(githubUri.RepoName);
            }

            var repos = await _githubRepo.GetAllForUserAsync(githubUri.Owner);

            return(repos.First(r => r.Name.StartsWith(REPO_IDENTIFIER)).Name);
        }
        private async Task <string> GetFilePathOrDefaultAsync(GithubUri githubUri)
        {
            if (!string.IsNullOrWhiteSpace(githubUri.FilePath))
            {
                return(githubUri.FilePath);
            }

            var _files = await _githubRepo.GetAllContentsAsync(githubUri.Owner, githubUri.RepoName, "");

            return(_files.First(f => GithubUri.CheckIfMarkdownFile(f.Name)).Path);
        }
        private async Task <(string Owner, string RepoName, string FilePath)> ResolveParamsAsync(GithubUri githubUri)
        {
            if (!string.IsNullOrWhiteSpace(githubUri.FilePath))
            {
                Ensure.ArgumentNotEmpty(githubUri.RepoName, nameof(githubUri.RepoName));
            }

            Ensure.ArgumentNotEmpty(githubUri.Owner, nameof(githubUri.Owner));

            var repoName = await GetRepoNameOrDefaultAsync(githubUri);

            var filePath = await GetFilePathOrDefaultAsync(githubUri);

            return(githubUri.Owner, repoName, filePath);
        }
        private async Task <IReadOnlyCollection <ContentInfo> > DownloadFilesAsync(GithubUri githubUri)
        {
            var repoName = await GetRepoNameOrDefaultAsync(githubUri);

            return(await _githubRepo.GetAllContentsAsync(githubUri.Owner, repoName, githubUri.ContainerPath));
        }
        public async Task <IEnumerable <NavItem> > GetNavItemsAsync(GithubUri githubUri)
        {
            var files = await DownloadFilesAsync(githubUri);

            return(CreateNavItems(githubUri, files));
        }