using HtmlAgilityPack;
namespace FileFlows.Web.Helpers;
///
/// HTML Helper
///
public class HtmlHelper
{
///
/// Converts all relative URLs in the provided HTML content to absolute URLs based on the given base URL.
/// This method processes the href attribute of tags and the src and content attributes of
tags.
///
/// The HTML content containing relative URLs.
/// The base URL to convert relative URLs to absolute URLs.
/// The HTML content with all relative URLs converted to absolute URLs.
/// Thrown when the base URL is not in a valid format.
public static string ConvertRelativeUrlsToAbsolute(string htmlContent, string baseUrl)
{
var htmlDoc = new HtmlDocument();
htmlDoc.LoadHtml(htmlContent);
var uri = new Uri(baseUrl);
// Convert relative URLs in tags (href attribute)
foreach (var link in htmlDoc.DocumentNode.SelectNodes("//a[@href]"))
{
var hrefValue = link.GetAttributeValue("href", string.Empty);
if (Uri.TryCreate(hrefValue, UriKind.Relative, out var relativeUri))
{
var absoluteUri = new Uri(uri, relativeUri);
link.SetAttributeValue("href", absoluteUri.ToString());
}
}
// Convert relative URLs in
tags (src and content attributes)
foreach (var img in htmlDoc.DocumentNode.SelectNodes("//img[@src or @content]"))
{
var srcValue = img.GetAttributeValue("src", string.Empty);
if (Uri.TryCreate(srcValue, UriKind.Relative, out var relativeSrcUri))
{
var absoluteSrcUri = new Uri(uri, relativeSrcUri);
img.SetAttributeValue("src", absoluteSrcUri.ToString());
}
var contentValue = img.GetAttributeValue("content", string.Empty);
if (Uri.TryCreate(contentValue, UriKind.Relative, out var relativeContentUri))
{
var absoluteContentUri = new Uri(uri, relativeContentUri);
img.SetAttributeValue("content", absoluteContentUri.ToString());
}
}
return htmlDoc.DocumentNode.OuterHtml;
}
}