diff --git a/public/scripts/slash-commands.js b/public/scripts/slash-commands.js index 304544051..c7a4dd86c 100644 --- a/public/scripts/slash-commands.js +++ b/public/scripts/slash-commands.js @@ -227,6 +227,7 @@ export function initDefaultSlashCommands() { })); SlashCommandParser.addCommandObject(SlashCommand.fromProps({ name: 'sendas', + rawQuotes: true, callback: sendMessageAs, returns: 'Optionally the text of the sent message, if specified in the "return" argument', namedArgumentList: [ @@ -293,6 +294,7 @@ export function initDefaultSlashCommands() { })); SlashCommandParser.addCommandObject(SlashCommand.fromProps({ name: 'sys', + rawQuotes: true, callback: sendNarratorMessage, aliases: ['nar'], returns: 'Optionally the text of the sent message, if specified in the "return" argument', @@ -357,6 +359,7 @@ export function initDefaultSlashCommands() { })); SlashCommandParser.addCommandObject(SlashCommand.fromProps({ name: 'comment', + rawQuotes: true, callback: sendCommentMessage, returns: 'Optionally the text of the sent message, if specified in the "return" argument', namedArgumentList: [ @@ -574,6 +577,7 @@ export function initDefaultSlashCommands() { })); SlashCommandParser.addCommandObject(SlashCommand.fromProps({ name: 'send', + rawQuotes: true, callback: sendUserMessageCallback, returns: 'Optionally the text of the sent message, if specified in the "return" argument', namedArgumentList: [ @@ -936,6 +940,7 @@ export function initDefaultSlashCommands() { })); SlashCommandParser.addCommandObject(SlashCommand.fromProps({ name: 'echo', + rawQuotes: true, callback: echoCallback, returns: 'the text', namedArgumentList: [ diff --git a/public/scripts/slash-commands/SlashCommand.js b/public/scripts/slash-commands/SlashCommand.js index 274dac577..4c90ca3ee 100644 --- a/public/scripts/slash-commands/SlashCommand.js +++ b/public/scripts/slash-commands/SlashCommand.js @@ -1,4 +1,5 @@ import { hljs } from '../../lib.js'; +import { t } from '../i18n.js'; import { SlashCommandAbortController } from './SlashCommandAbortController.js'; import { SlashCommandArgument, SlashCommandNamedArgument } from './SlashCommandArgument.js'; import { SlashCommandClosure } from './SlashCommandClosure.js'; @@ -36,6 +37,7 @@ export class SlashCommand { * @param {string} [props.helpString] * @param {boolean} [props.splitUnnamedArgument] * @param {Number} [props.splitUnnamedArgumentCount] + * @param {boolean} [props.rawQuotes] If set to true, does not remove wrapping quotes from the unnamed argument. * @param {string[]} [props.aliases] * @param {string} [props.returns] * @param {SlashCommandNamedArgument[]} [props.namedArgumentList] @@ -54,6 +56,7 @@ export class SlashCommand { /**@type {string}*/ helpString; /**@type {boolean}*/ splitUnnamedArgument = false; /**@type {Number}*/ splitUnnamedArgumentCount; + /** @type {boolean} */ rawQuotes = false; /**@type {string[]}*/ aliases = []; /**@type {string}*/ returns; /**@type {SlashCommandNamedArgument[]}*/ namedArgumentList = []; @@ -258,6 +261,15 @@ export class SlashCommand { ].filter(it=>it).join('\n'); head.append(src); } + if (this.rawQuotes) { + const rawQuotes = document.createElement('div'); { + 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`; + head.append(rawQuotes); + } + } specs.append(head); } const body = document.createElement('div'); { diff --git a/public/scripts/slash-commands/SlashCommandParser.js b/public/scripts/slash-commands/SlashCommandParser.js index ea5b2b37b..c664bc641 100644 --- a/public/scripts/slash-commands/SlashCommandParser.js +++ b/public/scripts/slash-commands/SlashCommandParser.js @@ -975,7 +975,7 @@ 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.unnamedArgumentList = this.parseUnnamedArgument(cmd.command?.unnamedArgumentList?.length && cmd?.command?.splitUnnamedArgument, cmd?.command?.splitUnnamedArgumentCount, cmd?.command?.rawQuotes); cmd.endUnnamedArgs = this.index; if (cmd.name == 'let') { const keyArg = cmd.namedArgumentList.find(it=>it.name == 'key'); @@ -1035,7 +1035,7 @@ export class SlashCommandParser { testUnnamedArgumentEnd() { return this.testCommandEnd(); } - parseUnnamedArgument(split, splitCount = null) { + parseUnnamedArgument(split, splitCount = null, rawQuotes = false) { const wasSplit = split; /**@type {SlashCommandClosure|String}*/ let value = this.jumpedEscapeSequence ? this.take() : ''; // take the first, already tested, char if it is an escaped one @@ -1045,7 +1045,7 @@ export class SlashCommandParser { /**@type {SlashCommandUnnamedArgumentAssignment}*/ let assignment = new SlashCommandUnnamedArgumentAssignment(); assignment.start = this.index; - if (!split && this.testQuotedValue()) { + if (!split && !rawQuotes && this.testQuotedValue()) { // if the next bit is a quoted value, take the whole value and gather contents as a list assignment.value = this.parseQuotedValue(); assignment.end = this.index; diff --git a/public/style.css b/public/style.css index 13a1267ab..7355c4f7b 100644 --- a/public/style.css +++ b/public/style.css @@ -2086,6 +2086,15 @@ body[data-stscript-style] .hljs.language-stscript { } } + >.head>.rawQuotes { + padding: 0 0.5em; + cursor: help; + + &:hover { + text-decoration: 1px dotted underline; + } + } + >.head>.source { padding: 0 0.5em; cursor: help;