diff --git a/web/js/auto-formatter.js b/web/js/auto-formatter.js new file mode 100644 index 0000000..839cc15 --- /dev/null +++ b/web/js/auto-formatter.js @@ -0,0 +1,63 @@ +/** + * 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) { + textarea.setRangeText(formattedText, 0, originalText.length, 'end'); + } +} diff --git a/web/js/main.js b/web/js/main.js index ac65c5d..0dc6530 100644 --- a/web/js/main.js +++ b/web/js/main.js @@ -6,7 +6,7 @@ import { loadCSS } from "./utils.js"; import { TagSource, loadDataAsync } from "./data.js"; import { AutocompleteEventHandler } from "./autocomplete.js"; import { RelatedTagsEventHandler } from "./related-tags.js"; -import { formatTextareaOnBlur } from './utils.js'; +import { formatTextareaOnBlur } from "./auto-formatter.js"; // --- Constants --- const id = "AutocompletePlus"; diff --git a/web/js/utils.js b/web/js/utils.js index 8c0d941..ed59fc8 100644 --- a/web/js/utils.js +++ b/web/js/utils.js @@ -654,67 +654,3 @@ export function getScrollbarWidth() { return _cachedScrollbarWidth; } - -/** - * 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) { - textarea.setRangeText(formattedText, 0, originalText.length, 'end'); - } -} \ No newline at end of file