src / image_search / presentation / ImagePresentationFormatter.ts
import { LocalImage } from "../models";
/**
* Dedicated presentation formatter for image search results.
* Formats relative Markdown image strings for LM Studio native tool returns.
* Mapped from Daniel Sig's working LM Studio image presentation contract.
*/
export class ImagePresentationFormatter {
/**
* Format local images as an array of relative Markdown image strings for LM Studio tool returns.
* Matches Daniel Sig's LM Studio-native image presentation contract:
* `["", ...]`
*
* @param localImages Array of LocalImage objects.
* @param displayLimit Maximum number of images to format (default: 3).
* @returns Array of relative Markdown image strings.
*/
public static formatMarkdownImageArray(
localImages: LocalImage[],
displayLimit?: number
): string[] {
if (!localImages || localImages.length === 0) {
return [];
}
const displayImages =
displayLimit !== undefined && displayLimit > 0
? localImages.slice(0, displayLimit)
: localImages;
return displayImages.map((img) => {
const titleText = img.title && img.title.trim() ? img.title.trim() : "Image";
const safeTitle = titleText
.replace(/\\/g, "\\\\")
.replace(/\[/g, "\\[")
.replace(/\]/g, "\\]")
.replace(/\s+/g, " ")
.trim();
return ``;
});
}
}
src / image_search / presentation / ImagePresentationFormatter.ts
import { LocalImage } from "../models";
/**
* Dedicated presentation formatter for image search results.
* Formats relative Markdown image strings for LM Studio native tool returns.
* Mapped from Daniel Sig's working LM Studio image presentation contract.
*/
export class ImagePresentationFormatter {
/**
* Format local images as an array of relative Markdown image strings for LM Studio tool returns.
* Matches Daniel Sig's LM Studio-native image presentation contract:
* `["", ...]`
*
* @param localImages Array of LocalImage objects.
* @param displayLimit Maximum number of images to format (default: 3).
* @returns Array of relative Markdown image strings.
*/
public static formatMarkdownImageArray(
localImages: LocalImage[],
displayLimit?: number
): string[] {
if (!localImages || localImages.length === 0) {
return [];
}
const displayImages =
displayLimit !== undefined && displayLimit > 0
? localImages.slice(0, displayLimit)
: localImages;
return displayImages.map((img) => {
const titleText = img.title && img.title.trim() ? img.title.trim() : "Image";
const safeTitle = titleText
.replace(/\\/g, "\\\\")
.replace(/\[/g, "\\[")
.replace(/\]/g, "\\]")
.replace(/\s+/g, " ")
.trim();
return ``;
});
}
}