const STYLE_REGEX = /(\$(\d*)\(?)[^$|\[\],\s]*\)?/; const STYLE_TRIGGER = () => TAC.CFG.useStyleVars && TAC.Globals.tagword.match(STYLE_REGEX); var lastStyleVarIndex = ""; class StyleParser extends BaseTagParser { async parse() { // Refresh if needed await TacUtils.refreshStyleNamesIfChanged(); // Show styles let tempResults = []; let matchGroups = TAC.Globals.tagword.match(STYLE_REGEX); // Save index to insert again later or clear last one lastStyleVarIndex = matchGroups[2] ? matchGroups[2] : ""; if (TAC.Globals.tagword !== matchGroups[1]) { let searchTerm = TAC.Globals.tagword.replace(matchGroups[1], ""); let filterCondition = x => { let regex = new RegExp(TacUtils.escapeRegExp(searchTerm, true), 'i'); return regex.test(x[0].toLowerCase()) || regex.test(x[0].toLowerCase().replaceAll(" ", "_")); }; tempResults = TAC.Globals.styleNames.filter(x => filterCondition(x)); // Filter by tagword } else { tempResults = TAC.Globals.styleNames; } // Add final results let finalResults = []; tempResults.forEach(t => { let result = new AutocompleteResult(t[0].trim(), ResultType.styleName) result.meta = "Style"; finalResults.push(result); }); return finalResults; } } async function load(force = false) { if (TAC.Globals.styleNames.length === 0 || force) { try { TAC.Globals.styleNames = (await TacUtils.loadCSV(`${TAC.Globals.tagBasePath}/temp/styles.txt`)) .filter(x => x[0]?.trim().length > 0) // Remove empty lines .filter(x => x[0] !== "None") // Remove "None" style .map(x => [x[0].trim()]); // Trim name } catch (e) { console.error("Error loading styles.txt: " + e); } } } function sanitize(tagType, text) { if (tagType === ResultType.styleName) { if (text.includes(" ")) { return `$${lastStyleVarIndex}(${text})`; } else { return`$${lastStyleVarIndex}${text}` } } return null; } TAC.Ext.PARSERS.push(new StyleParser(STYLE_TRIGGER)); // Add our utility functions to their respective queues TAC.Ext.QUEUE_FILE_LOAD.push(load); TAC.Ext.QUEUE_SANITIZE.push(sanitize);