import { yamlScalar } from "./_shared/yaml"; export type SettingType = | "heading" | "class-toggle" | "class-select" | "variable-text" | "variable-number" | "variable-number-slider" | "variable-select" | "variable-color" | "info-text"; export interface SettingItem { id: string; title: string; type: SettingType; default?: string; /** для variable-select / class-select: значения через запятую */ options?: string; /** для variable-color: формат, напр. hex */ format?: string; } export interface StyleSettingsInput { pluginName: string; settings: SettingItem[]; } function renderItem(item: SettingItem): string { // id/title/default/options — пользовательский ввод → безопасный YAML-скаляр // (иначе, напр., default "#7C3AED" YAML читает как комментарий → null). const lines = [ ` -`, ` id: ${yamlScalar(item.id)}`, ` title: ${yamlScalar(item.title)}`, ` type: ${item.type}`, ]; if (item.type !== "heading" && item.type !== "info-text" && item.default !== undefined && item.default !== "") lines.push(` default: ${yamlScalar(item.default)}`); if ((item.type === "variable-select" || item.type === "class-select") && item.options) { const opts = item.options.split(",").map((o) => o.trim()).filter(Boolean); lines.push(` options:`); opts.forEach((o) => lines.push(` - ${yamlScalar(o)}`)); } if (item.type === "variable-color") lines.push(` format: ${item.format || "hex"}`); return lines.join("\n"); } export function buildStyleSettings(input: StyleSettingsInput): string { const id = input.pluginName.toLowerCase().replace(/\s+/g, "-"); const body = [ `/* @settings`, ``, `name: ${yamlScalar(input.pluginName)}`, `id: ${yamlScalar(id)}`, `settings:`, ...input.settings.map(renderItem), ``, `*/`, ].join("\n"); return body; }