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; } }