using System; using System.Collections.Generic; using System.Text.RegularExpressions; using Sozsoft.Mcp.Dtos; namespace Sozsoft.Mcp; /// /// Talep aciklamasina yapistirilan gorseller HtmlEditor'da base64 data: URI olarak /// saklanir. Model bu metni resim olarak goremez; gorseller ayiklanip MCP gorsel icerigi olarak /// iletilir, metinde yerlerine bir isaret kalir. Yalnizca modelin okuyabildigi bicimler ayiklanir; /// digerleri (svg gibi) metinde oldugu gibi birakilir. /// internal static partial class McpDevRequestImages { private static readonly HashSet SupportedMimeTypes = new(StringComparer.OrdinalIgnoreCase) { "image/png", "image/jpeg", "image/gif", "image/webp" }; [GeneratedRegex("""]*?\bsrc\s*=\s*["']data:(?image/[\w.+-]+);base64,(?[^"']+)["'][^>]*>""", RegexOptions.IgnoreCase)] private static partial Regex EmbeddedImage(); public static (string? Html, List Images) Extract(string? html) { var images = new List(); if (string.IsNullOrEmpty(html)) { return (html, images); } var text = EmbeddedImage().Replace(html, match => { var mimeType = match.Groups["mime"].Value.ToLowerInvariant(); var data = Regex.Replace(match.Groups["data"].Value, @"\s+", string.Empty); if (!SupportedMimeTypes.Contains(mimeType) || !IsBase64(data)) { return match.Value; } var placeholder = $"[image-{images.Count + 1}]"; images.Add(new McpDevRequestImageDto { Placeholder = placeholder, MimeType = mimeType, Data = data }); return placeholder; }); return (text, images); } private static bool IsBase64(string data) => Convert.TryFromBase64String(data, new byte[data.Length * 3 / 4], out _); }