diff --git a/public/scripts/slash-commands.js b/public/scripts/slash-commands.js index 5e4853def..58c4d8cad 100644 --- a/public/scripts/slash-commands.js +++ b/public/scripts/slash-commands.js @@ -266,6 +266,14 @@ export function initDefaultSlashCommands() { enumList: slashCommandReturnHelper.enumList({ allowObject: true }), forceEnum: true, }), + SlashCommandNamedArgument.fromProps({ + name: 'raw', + description: 'If true, does not alter quoted literal unnamed arguments', + typeList: [ARGUMENT_TYPE.BOOLEAN], + defaultValue: 'true', + enumProvider: commonEnumProviders.boolean('trueFalse'), + isRequired: false, + }), ], unnamedArgumentList: [ new SlashCommandArgument( @@ -328,6 +336,14 @@ export function initDefaultSlashCommands() { enumList: slashCommandReturnHelper.enumList({ allowObject: true }), forceEnum: true, }), + SlashCommandNamedArgument.fromProps({ + name: 'raw', + description: 'If true, does not alter quoted literal unnamed arguments', + typeList: [ARGUMENT_TYPE.BOOLEAN], + defaultValue: 'true', + enumProvider: commonEnumProviders.boolean('trueFalse'), + isRequired: false, + }), ], unnamedArgumentList: [ new SlashCommandArgument( @@ -392,6 +408,14 @@ export function initDefaultSlashCommands() { enumList: slashCommandReturnHelper.enumList({ allowObject: true }), forceEnum: true, }), + SlashCommandNamedArgument.fromProps({ + name: 'raw', + description: 'If true, does not alter quoted literal unnamed arguments', + typeList: [ARGUMENT_TYPE.BOOLEAN], + defaultValue: 'true', + enumProvider: commonEnumProviders.boolean('trueFalse'), + isRequired: false, + }), ], unnamedArgumentList: [ new SlashCommandArgument( @@ -617,6 +641,14 @@ export function initDefaultSlashCommands() { enumList: slashCommandReturnHelper.enumList({ allowObject: true }), forceEnum: true, }), + SlashCommandNamedArgument.fromProps({ + name: 'raw', + description: 'If true, does not alter quoted literal unnamed arguments', + typeList: [ARGUMENT_TYPE.BOOLEAN], + defaultValue: 'true', + enumProvider: commonEnumProviders.boolean('trueFalse'), + isRequired: false, + }), ], unnamedArgumentList: [ new SlashCommandArgument( @@ -1013,6 +1045,14 @@ export function initDefaultSlashCommands() { description: 'a closure to call when the toast is clicked. This executed closure receives scope as provided in the script. Careful about possible side effects when manipulating variables and more.', typeList: [ARGUMENT_TYPE.CLOSURE], }), + SlashCommandNamedArgument.fromProps({ + name: 'raw', + description: 'If true, does not alter quoted literal unnamed arguments', + typeList: [ARGUMENT_TYPE.BOOLEAN], + defaultValue: 'true', + enumProvider: commonEnumProviders.boolean('trueFalse'), + isRequired: false, + }), ], unnamedArgumentList: [ new SlashCommandArgument( diff --git a/public/scripts/slash-commands/SlashCommand.js b/public/scripts/slash-commands/SlashCommand.js index 4c90ca3ee..032b9bbdc 100644 --- a/public/scripts/slash-commands/SlashCommand.js +++ b/public/scripts/slash-commands/SlashCommand.js @@ -266,7 +266,7 @@ export class SlashCommand { rawQuotes.classList.add('rawQuotes'); rawQuotes.classList.add('fa-solid'); rawQuotes.classList.add('fa-quote-left'); - rawQuotes.title = t`Does not alter quoted literal unnamed arguments`; + rawQuotes.title = t`Does not alter quoted literal unnamed arguments. Pass raw=false argument to override.`; head.append(rawQuotes); } } diff --git a/public/scripts/slash-commands/SlashCommandParser.js b/public/scripts/slash-commands/SlashCommandParser.js index c664bc641..8a6b734c7 100644 --- a/public/scripts/slash-commands/SlashCommandParser.js +++ b/public/scripts/slash-commands/SlashCommandParser.js @@ -1,6 +1,6 @@ import { hljs } from '../../lib.js'; import { power_user } from '../power-user.js'; -import { isTrueBoolean, uuidv4 } from '../utils.js'; +import { isFalseBoolean, isTrueBoolean, uuidv4 } from '../utils.js'; import { SlashCommand } from './SlashCommand.js'; import { ARGUMENT_TYPE, SlashCommandArgument } from './SlashCommandArgument.js'; import { SlashCommandClosure } from './SlashCommandClosure.js'; @@ -975,7 +975,9 @@ export class SlashCommandParser { cmd.startUnnamedArgs = this.index - (/\s(\s*)$/s.exec(this.behind)?.[1]?.length ?? 0); cmd.endUnnamedArgs = this.index; if (this.testUnnamedArgument()) { - cmd.unnamedArgumentList = this.parseUnnamedArgument(cmd.command?.unnamedArgumentList?.length && cmd?.command?.splitUnnamedArgument, cmd?.command?.splitUnnamedArgumentCount, cmd?.command?.rawQuotes); + const rawQuotesArg = cmd?.namedArgumentList?.find(a => a.name === 'raw'); + const rawQuotes = cmd?.command?.rawQuotes && rawQuotesArg ? !isFalseBoolean(rawQuotesArg?.value?.toString()) : cmd?.command?.rawQuotes; + cmd.unnamedArgumentList = this.parseUnnamedArgument(cmd.command?.unnamedArgumentList?.length && cmd?.command?.splitUnnamedArgument, cmd?.command?.splitUnnamedArgumentCount, rawQuotes); cmd.endUnnamedArgs = this.index; if (cmd.name == 'let') { const keyArg = cmd.namedArgumentList.find(it=>it.name == 'key');