mirror of
https://github.com/MindWorkAI/AI-Studio.git
synced 2026-03-29 13:31:37 +00:00
85 lines
3.0 KiB
C#
85 lines
3.0 KiB
C#
namespace AIStudio.Tools.PluginSystem.Assistants.DataModel;
|
|
|
|
internal sealed class AssistantImage : AssistantComponentBase
|
|
{
|
|
private const string PLUGIN_SCHEME = "plugin://";
|
|
|
|
public override AssistantComponentType Type => AssistantComponentType.IMAGE;
|
|
public override Dictionary<string, object> Props { get; set; } = new();
|
|
public override List<IAssistantComponent> Children { get; set; } = new();
|
|
|
|
public string Src
|
|
{
|
|
get => AssistantComponentPropHelper.ReadString(this.Props, nameof(this.Src));
|
|
set => AssistantComponentPropHelper.WriteString(this.Props, nameof(this.Src), value);
|
|
}
|
|
|
|
public string Alt
|
|
{
|
|
get => AssistantComponentPropHelper.ReadString(this.Props, nameof(this.Alt));
|
|
set => AssistantComponentPropHelper.WriteString(this.Props, nameof(this.Alt), value);
|
|
}
|
|
|
|
public string Caption
|
|
{
|
|
get => AssistantComponentPropHelper.ReadString(this.Props, nameof(this.Caption));
|
|
set => AssistantComponentPropHelper.WriteString(this.Props, nameof(this.Caption), value);
|
|
}
|
|
|
|
public string Class
|
|
{
|
|
get => AssistantComponentPropHelper.ReadString(this.Props, nameof(this.Class));
|
|
set => AssistantComponentPropHelper.WriteString(this.Props, nameof(this.Class), value);
|
|
}
|
|
|
|
public string Style
|
|
{
|
|
get => AssistantComponentPropHelper.ReadString(this.Props, nameof(this.Style));
|
|
set => AssistantComponentPropHelper.WriteString(this.Props, nameof(this.Style), value);
|
|
}
|
|
|
|
public string ResolveSource(string pluginPath)
|
|
{
|
|
if (string.IsNullOrWhiteSpace(this.Src))
|
|
return string.Empty;
|
|
|
|
var resolved = this.Src;
|
|
|
|
if (resolved.StartsWith(PLUGIN_SCHEME, StringComparison.OrdinalIgnoreCase) && !string.IsNullOrWhiteSpace(pluginPath))
|
|
{
|
|
var relative = resolved[PLUGIN_SCHEME.Length..]
|
|
.TrimStart('/', '\\')
|
|
.Replace('/', Path.DirectorySeparatorChar)
|
|
.Replace('\\', Path.DirectorySeparatorChar);
|
|
var filePath = Path.Join(pluginPath, relative);
|
|
if (!File.Exists(filePath))
|
|
return string.Empty;
|
|
|
|
var mime = GetImageMimeType(filePath);
|
|
var data = Convert.ToBase64String(File.ReadAllBytes(filePath));
|
|
return $"data:{mime};base64,{data}";
|
|
}
|
|
|
|
if (!Uri.TryCreate(resolved, UriKind.Absolute, out var uri))
|
|
return string.Empty;
|
|
|
|
return uri.Scheme is "http" or "https" or "data" ? resolved : string.Empty;
|
|
}
|
|
|
|
private static string GetImageMimeType(string path)
|
|
{
|
|
var extension = Path.GetExtension(path).TrimStart('.').ToLowerInvariant();
|
|
return extension switch
|
|
{
|
|
"svg" => "image/svg+xml",
|
|
"png" => "image/png",
|
|
"jpg" => "image/jpeg",
|
|
"jpeg" => "image/jpeg",
|
|
"gif" => "image/gif",
|
|
"webp" => "image/webp",
|
|
"bmp" => "image/bmp",
|
|
_ => "image/png",
|
|
};
|
|
}
|
|
}
|