private RepoTreeItem FilterByLanguage(ILoadedRepository repo)
 {
     return(FilterByTagPrefix(repo, "lang:", tag => {
         var langTag = tag.Substring(5);
         var r = Iso639.GetTag(langTag);
         return $"{Util.Util.GetCultureDisplayName(langTag)} [{langTag}]";
     }));
 }
        private RepoTreeItem FilterByTagPrefix(ILoadedRepository repo, string prefix, Func <string, string> convertor)
        {
            // var nodes = new ObservableCollection<PackageCategoryTreeItem>();

            var map = new Dictionary <string, List <PackageMenuItem> >();

            foreach (var package in repo.Packages.Packages)
            {
                if (package.Value == null)
                {
                    continue;
                }

                IDescriptor descriptor = package.Value !;

                var pkgKey  = PackageKey.Create(repo.Index.Url, descriptor.Id);
                var release = repo.Release(pkgKey);
                var payload = release?.WindowsExecutable();

                if (release == null || payload == null)
                {
                    continue;
                }

                var tags = Iter.ToArray(descriptor.Tags.Where(x => x.StartsWith(prefix)));

                if (tags.IsNullOrEmpty())
                {
                    tags = new[] { prefix };
                }

                foreach (var tag in tags)
                {
                    if (!map.ContainsKey(tag))
                    {
                        map[tag] = new List <PackageMenuItem>();
                    }

                    map[tag].Add(new PackageMenuItem(_store,
                                                     pkgKey, payload, descriptor.NativeName() ?? "<>", release.Version));
                }
            }

            var categoriesSet = new SortedSet <PackageCategoryTreeItem>(map.OrderBy(x => x.Key).Map(x => {
                x.Value.Sort();
                var items = new ObservableCollection <PackageMenuItem>(x.Value);
                return(new PackageCategoryTreeItem(_store, convertor(x.Key), items));
            }));

            var categories = new ObservableCollection <PackageCategoryTreeItem>(categoriesSet);

            return(new RepoTreeItem(repo.Index.NativeName(), categories));
        }
        private async Task <RepoTreeItem> FilterByCategory(ILoadedRepository repo)
        {
            var app = (PahkatApp)Application.Current;
            Dictionary <Uri, LocalizationStrings> strings = await app.PackageStore.Strings(app.Settings.GetLanguage() ?? "en");

            return(FilterByTagPrefix(repo, "cat:", tag => {
                if (tag == "cat:")
                {
                    return "Uncategorized";
                }

                if (strings.TryGetValue(repo.Index.Url, out var s))
                {
                    if (s.Tags.TryGetValue(tag, out var t))
                    {
                        return t;
                    }
                }

                return tag;
            }));
        }
        public static IRelease?Release(this ILoadedRepository repo, PackageKey packageKey)
        {
            if (packageKey.RepositoryUrl != repo.Index.Url)
            {
                return(null);
            }

            if (!repo.Packages.Packages.TryGetValue(packageKey.Id, out var descriptor) || descriptor == null)
            {
                return(null);
            }

            var releases = descriptor.Release;

            var release = descriptor.Release.First(r => {
                // Check if version even has a Windows target
                var target = r?.WindowsTarget();

                if (target == null)
                {
                    return(false);
                }

                // Check the channel is valid
                var channel = r?.Channel == "" ? null : r?.Channel;
                if (repo.Meta.Channel != null)
                {
                    // If a defined repo channel, find a package with no channel or this channel
                    return(channel == null || repo.Meta.Channel == r?.Channel);
                }

                // Free pass, no channels on either side :D
                return(repo.Meta.Channel == null);
            });

            return(release);
        }
 public static IWindowsExecutable?Payload(this ILoadedRepository repo, PackageKey packageKey)
 {
     return(repo.Release(packageKey)?.WindowsExecutable());
 }
 public Functions(ILoadedRepository repo, ChromiumWebBrowser webView)
 {
     Repo    = repo;
     WebView = webView;
 }
 internal void SetRepository(ILoadedRepository repo)
 {
     _functions = new WebBridgeService.Functions(repo, webView);
 }