Detectar datos URI en imagen src usando HtmlAgilityPack

base64 c# html-agility-pack

Pregunta

Procesé un montón de html y lo transformé en archivos PDF. Antes de que pueda transformar mi html, tengo que detectar si alguna de las imágenes contiene archivos de referencia. Si se trata de un archivo de referencia, los codifico en base64 y sustituyo el src.

En este momento confío en Regex para que me haga la detección, pero como uso HtmlAgilityPack, me preguntaba si puedo lograr lo mismo con HtmlAgilityPack.

Me gustaría hacer esto para no tener que mantener el Regex cuando ya estoy usando HtmlAgilityPack.

Así que ahora mismo estoy detectando el uri de datos a través de RegEx con lo siguiente:

void Main()
{
    var myHtml = @"<html><head></head><body><p><img src='data:image/gif;base64,R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs='/></p></body></html>";
    var htmlDoc = new HtmlDocument();
    htmlDoc.LoadHtml(myHtml);

    var imgs = htmlDoc.DocumentNode.SelectNodes("//img");
    if (imgs != null && imgs.Count > 0)
    {
        foreach (var imgNode in imgs)
        {
            var srcAttribute = imgNode.Attributes.FirstOrDefault(a => string.Equals("src", a.Name, StringComparison.InvariantCultureIgnoreCase));

            if (!string.IsNullOrEmpty(srcAttribute?.Value) && !StringIsDataUri(srcAttribute.Value))
            {
                Console.WriteLine("BASE ENCODE THE REFERENCED FILE");
            }
        }
    }
}

//Regex from http://stackoverflow.com/a/5714355/1958344
private static Regex regex = new Regex(@"data:(?<mime>[\w/\-\.]+);(?<encoding>\w+),(?<data>.*)", RegexOptions.Compiled);

private bool StringIsDataUri(string stringToTest)
{
    var match = regex.Match(stringToTest);
    return match.Success;
}

Respuesta aceptada

HtmlAgilityPack no tiene una función incorporada para detectar URI de datos, por lo que aún necesita incorporar su propia implementación de dicha función.

Como punto aparte, puede usar la API LINQ de HtmlAgilityPack para seleccionar un elemento img que tenga el atributo src referencia en primer lugar:

var referenceImgs = htmlDoc.DocumentNode
                           .Descendants("img")
                           .Where(o => !StringIsDataUri(o.GetAttributeValue("src","")));

foreach(HtmlNode img in referenceImgs)
{
    Console.WriteLine("BASE ENCODE THE REFERENCED FILE");
}


Related

Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué