using HtmlAgilityPack; using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; using System.Runtime.InteropServices.Marshalling; using System.Text; using System.Text.Json; using System.Threading.Tasks; namespace Beam.Dynamic { public class DropDownDataProvider : IDataProvider, IDataProvider, IDataProvider { public IBinding? Content { get; set; } public string? RelativeTo { get; set; } private string GetAbsolute(string? @base, string relative) { if (@base is null) return relative; if (@base.EndsWith('/')) @base = @base[..^1]; if (relative.StartsWith('/')) relative = relative[1..]; return @base + '/' + relative; } public SourceLink[] Get(HtmlDocument document) { if (Content is null) return []; var node = Content.Select(document); if (node is null) return []; List links = []; foreach (var child in node.ChildNodes.Where(x => x.Name == "option")) { var childValue = child.GetAttributeValue("value", null); if (!Uri.TryCreate(GetAbsolute(RelativeTo, childValue), UriKind.Absolute, out _)) continue; links.Add(new SourceLink(GetAbsolute(RelativeTo, childValue))); } return links.ToArray(); } string[] IDataProvider.Get(HtmlDocument document) { return this.Get(document).Select(x => x.Link.AbsoluteUri).ToArray(); } string IDataProvider.Get(HtmlDocument document) { return JsonSerializer.Serialize(this.Get(document)); } } }