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; using Beam.Abstractions; namespace Beam.Dynamic; public class DropDownDataProvider : IComposableDataProvider, IComposableDataProvider { public IBinding? Content { get; set; } public Uri? RelativeTo { get; set; } public string[] Get(HtmlDocument document) { if (Content is null) return []; var node = Select(document); if (node is null) return []; return Get(node); } string IDataProvider.Get(HtmlDocument document) { var node = Select(document); return node is null ? "" : (this as IComposableDataProvider).Get(node); } public string[] Get(HtmlNode node) { List links = []; foreach (var child in node.ChildNodes.Where(x => x.Name == "option")) { var childValue = child.GetAttributeValue("value", null); if (!Uri.TryCreate(RelativeTo, childValue, out var uri)) continue; links.Add(uri.AbsoluteUri); } return links.ToArray(); } string IComposableDataProvider.Get(HtmlNode node) { return JsonSerializer.Serialize(Get(node)); } public HtmlNode? Select(HtmlDocument doc) { return Content?.Select(doc); } HtmlNode? IComposableDataProvider.Select(HtmlNode node) { return node; } HtmlNode? IComposableDataProvider.Select(HtmlNode node) { return node; } }