Files
Beam/Beam.Dynamic/AnchorCollectionDataProvider.cs
T
qwsdcvghyu89 7ed05abdb8 refactor: modularize Beam into new projects and interfaces
- Introduced modularity by splitting Beam into new projects: Beam.Abstractions, Beam.Models, and Beam.Downloaders.
- Refactored existing classes into appropriate namespaces and projects.
- Replaced specific implementations with abstractions (e.g., SourceLinkBuilder to LinkBuilder, State to IState, etc.).
- Updated interfaces: added ITemplate, IArticleData, IDownloadReport, and others for improved extensibility.
- Removed deprecated classes like SourceLinkBuilder and StateChangerFactory.
- Enhanced link handling in downloaders by refactoring to use `string` over `SourceLink`.
- Consolidated shared logic under Beam.Abstractions.
2025-09-22 01:51:46 +10:00

40 lines
1.1 KiB
C#

using HtmlAgilityPack;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Beam.Dynamic {
public class AnchorCollectionDataProvider : IDataProvider<string[]> {
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 string[] Get(HtmlDocument document) {
if (Content is null)
return [];
var node = Content.Select(document);
if (node is null)
return [];
List<string> links = [];
foreach (var child in node.Descendants())
links.Add(child.GetAttributeValue("href", ""));
return links.Where(x => !string.IsNullOrWhiteSpace(x)).ToArray();
}
}
}