From 5342ea01eead6d7392aabd7c04ec0c1330c9d827 Mon Sep 17 00:00:00 2001 From: Lucas 'Paperboy' Rose-Winters Date: Fri, 17 Oct 2025 17:42:27 +1100 Subject: [PATCH] fix(inventory): handle parenthetical descriptions with newlines in item parser Updated parseItems() to intelligently collapse newlines within parentheses: - Tracks parentheses depth to handle nested parens - Replaces newlines with spaces only when inside parentheses - Preserves newlines outside parentheses - Prevents double spaces after newline replacement Example fix: - Input: 'Books (various magical tomes\n\nhistorical texts)\n\nAlchemy Ingredients' - Before: ['Books (various magical tomes', 'historical texts)', 'Alchemy Ingredients'] - After: ['Books (various magical tomes historical texts)', 'Alchemy Ingredients'] --- src/utils/itemParser.js | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/src/utils/itemParser.js b/src/utils/itemParser.js index 387616a..edf82a1 100644 --- a/src/utils/itemParser.js +++ b/src/utils/itemParser.js @@ -6,12 +6,14 @@ /** * Parses a comma-separated item string into an array of trimmed item names. * Filters out empty strings and handles "None" gracefully. + * Smart handling: collapses newlines inside parentheses, preserves them outside. * * @param {string} itemString - Comma-separated items (e.g., "Sword, Shield, 3x Potions") * @returns {string[]} Array of item names, or empty array if none * * @example * parseItems("Sword, Shield, 3x Potions") // ["Sword", "Shield", "3x Potions"] + * parseItems("Books (magical\ntomes), Sword") // ["Books (magical tomes)", "Sword"] * parseItems("None") // [] * parseItems("") // [] * parseItems(null) // [] @@ -28,8 +30,35 @@ export function parseItems(itemString) { return []; } + // Collapse newlines inside parentheses + let processed = ''; + let parenDepth = 0; + + for (let i = 0; i < trimmed.length; i++) { + const char = trimmed[i]; + + if (char === '(') { + parenDepth++; + processed += char; + } else if (char === ')') { + parenDepth--; + processed += char; + } else if ((char === '\n' || char === '\r') && parenDepth > 0) { + // Inside parentheses: replace newline with space + // Skip if previous char was already a space + if (processed[processed.length - 1] !== ' ') { + processed += ' '; + } + } else { + processed += char; + } + } + + // Clean up multiple consecutive spaces + processed = processed.replace(/\s+/g, ' '); + // Split by comma, trim each item, filter empties - return itemString + return processed .split(',') .map(item => item.trim()) .filter(item => item !== '' && item.toLowerCase() !== 'none');