internal static void ParseCSS_(TextualDataResource tdr, HashSet <string> resourceUrls, Logger logger) { logger.Verbose("enter. Parsing CSS from {0}", tdr.Uri); Parser parser = new Parser(); StyleSheet stylesheet = parser.Parse(tdr.Data); CollectAllImportUris_(stylesheet, resourceUrls, tdr.Uri, logger); CollectAllFontFaceUris_(stylesheet, resourceUrls, tdr.Uri, logger); CollectAllBackgroundImageUris_(stylesheet, resourceUrls, tdr.Uri, logger); logger.Verbose("exit"); }
internal static TextualDataResource TryGetTextualData_(RGridResource blob, Uri baseUrl, Logger logger) { byte[] contentBytes = blob.Content; string contentTypeStr = blob.ContentType; logger.Verbose("enter - content length: {0} ; content type: {1}", contentBytes?.Length.ToString() ?? "<null>", contentTypeStr); if (contentTypeStr == null) { return(null); } if (contentBytes.Length == 0) { return(null); } string[] parts = contentTypeStr.Split(';'); TextualDataResource tdr = new TextualDataResource(); if (parts.Length > 0) { tdr.MimeType = parts[0].ToLowerInvariant(); } string charset = "UTF-8"; if (parts.Length > 1) { string[] keyVal = parts[1].Split('='); string key = keyVal[0].Trim(); string val = keyVal[1].Trim().Trim('"'); if (key.Equals("charset", StringComparison.OrdinalIgnoreCase)) { charset = val.ToUpper(); } } if (charset != null) { tdr.Data = Encoding.GetEncoding(charset).GetString(contentBytes); } tdr.Uri = blob.Url; if (!tdr.Uri.IsAbsoluteUri) { tdr.Uri = new Uri(baseUrl, tdr.Uri); } tdr.OriginalData = blob.Content; logger.Verbose("exit"); return(tdr); }
internal static void ParseSVG_(TextualDataResource tdr, HashSet <string> allResourceUris, Logger logger) { HtmlDocument svgDoc = new HtmlDocument(); svgDoc.Load(new MemoryStream(tdr.OriginalData)); IEnumerable <HtmlNode> nodes = svgDoc.DocumentNode.Descendants().Where(n => n.HasAttributes); foreach (HtmlNode node in nodes) { foreach (HtmlAttribute attr in node.Attributes) { if (attr.Name.Equals("xlink:href", StringComparison.OrdinalIgnoreCase) || attr.Name.Equals("href", StringComparison.OrdinalIgnoreCase)) { string uri = attr.Value; CreateUriAndAddToList(allResourceUris, tdr.Uri, uri, logger); } } } }
private void GetAndParseResource_(RGridResource blob, Uri baseUrl, HashSet <string> resourceUrls) { try { TextualDataResource tdr = TryGetTextualData_(blob, baseUrl, logger_); switch (tdr?.MimeType) { case "text/css": ParseCSS_(tdr, resourceUrls, logger_); break; case "image/svg+xml": ParseSVG_(tdr, resourceUrls, logger_); break; } } catch (Exception ex) { logger_.Log("Error: " + ex); logger_.Log("File name: " + blob.Url); debugResourceWriter_.Write(blob); } }