99 lines
2.8 KiB
JavaScript
99 lines
2.8 KiB
JavaScript
import { settingValues } from './settings.js';
|
|
|
|
/**
|
|
* Event handler for auto-formatting functionality
|
|
*/
|
|
export class AutoFormatterEventHandler {
|
|
constructor() {}
|
|
|
|
/**
|
|
* Handle blur event to trigger auto-formatting
|
|
* @param {Event} event - The blur event
|
|
*/
|
|
handleBlur(event) {
|
|
if (
|
|
settingValues.enableAutoFormat &&
|
|
event.target.tagName === 'TEXTAREA'
|
|
) {
|
|
formatTextareaOnBlur(event.target);
|
|
}
|
|
}
|
|
|
|
// Placeholder methods to maintain consistency with other event handlers
|
|
handleInput(event) {}
|
|
handleFocus(event) {}
|
|
handleKeyDown(event) {}
|
|
handleKeyUp(event) {}
|
|
handleMouseMove(event) {}
|
|
handleClick(event) {}
|
|
}
|
|
|
|
/**
|
|
* Format the prompt text: add a comma and space after each tag, and remove extra spaces.
|
|
* Preserve special syntax such as weights (tag:1.2), parentheses, and wildcards.
|
|
* @param {string} text - The original text.
|
|
* @returns {string} - The formatted text.
|
|
*/
|
|
export function formatPromptText(text) {
|
|
if (!text || text.trim().length === 0) return text;
|
|
|
|
// Split text into individual lines for processing
|
|
const lines = text.split('\n');
|
|
const formattedLines = [];
|
|
|
|
for (const line of lines) {
|
|
const trimmedLine = line.trim();
|
|
|
|
// Keep empty lines unchanged
|
|
if (trimmedLine.length === 0) {
|
|
formattedLines.push('');
|
|
continue;
|
|
}
|
|
|
|
// Split the line by commas into raw tag segments
|
|
const rawTags = trimmedLine.split(',');
|
|
|
|
const cleanedTags = [];
|
|
for (const tag of rawTags) {
|
|
// Trim spaces around each tag
|
|
const trimmedTag = tag.trim();
|
|
|
|
// Keep only non-empty tags
|
|
if (trimmedTag.length > 0) {
|
|
cleanedTags.push(trimmedTag);
|
|
}
|
|
}
|
|
|
|
// Rejoin cleaned tags with ", "
|
|
let formattedLine = cleanedTags.join(', ');
|
|
|
|
// Add a trailing comma and space if the line contains valid tags
|
|
if (formattedLine.length > 0) {
|
|
formattedLine += ', ';
|
|
}
|
|
|
|
formattedLines.push(formattedLine);
|
|
}
|
|
|
|
// Rejoin all lines with newline characters
|
|
return formattedLines.join('\n');
|
|
}
|
|
|
|
/**
|
|
* Format the content of a textarea when it loses focus.
|
|
* @param {HTMLTextAreaElement} textarea - The target textarea element.
|
|
*/
|
|
export function formatTextareaOnBlur(textarea) {
|
|
const originalText = textarea.value;
|
|
const formattedText = formatPromptText(originalText);
|
|
|
|
if (originalText !== formattedText) {
|
|
const cursorPos = textarea.selectionStart;
|
|
textarea.value = formattedText;
|
|
|
|
// Try to preserve cursor position
|
|
const newCursorPos = Math.min(cursorPos, formattedText.length);
|
|
textarea.setSelectionRange(newCursorPos, newCursorPos);
|
|
}
|
|
}
|