add `/sort` slash command

84140f4e4f6d6d631285b63135344c7eee0b160f

InspectorCaracal <51038201+InspectorCaracal@users.noreply.github.com>

1 files changed, +71 -0Showing whitespace changes
public/scripts/variables.js+71 -0
@@ -836,6 +836,32 @@ function randValuesCallback(from, to, args) {
836836 return value;
837837}
838838
839+function sortArrayObjectCallback(args, value) {
840+ let parsedValue;
841+ if (typeof value == 'string') {
842+ try {
843+ parsedValue = JSON.parse(value);
844+ } catch {
845+ // return the original input if it was invalid
846+ return value;
847+ }
848+ } else {
849+ parsedValue = value
850+ }
851+ if (Array.isArray(parsedValue)) {
852+ // always sort lists by value
853+ parsedValue.sort()
854+ } else if (typeof parsedValue == 'object') {
855+ let keysort = args.keysort;
856+ if (isFalseBoolean(keysort)) {
857+ parsedValue = Object.keys(parsedValue).sort(function(a,b){return parsedValue[a]-parsedValue[b]});
858+ } else {
859+ parsedValue = Object.keys(parsedValue).sort();
860+ }
861+ }
862+ return JSON.stringify(parsedValue);
863+}
864+
839865/**
840866 * Declare a new variable in the current scope.
841867 * @param {NamedArguments} args Named arguments.
@@ -2110,6 +2136,51 @@ export function registerVariableCommands() {
21102136 `,
21112137 }));
21122138 SlashCommandParser.addCommandObject(SlashCommand.fromProps({
2139+ name: 'sort',
2140+ callback: sortArrayObjectCallback,
2141+ returns: 'the sorted list or dictionary keys',
2142+ namedArgumentList: [
2143+ SlashCommandNamedArgument.fromProps({ name: 'keysort',
2144+ description: 'whether to sort by key or value; ignored for lists',
2145+ typeList: [ARGUMENT_TYPE.BOOLEAN],
2146+ enumList: ['true', 'false'],
2147+ defaultValue: 'true',
2148+ }),
2149+ ],
2150+ unnamedArgumentList: [
2151+ SlashCommandArgument.fromProps({
2152+ description: 'value',
2153+ typeList: [ARGUMENT_TYPE.STRING, ARGUMENT_TYPE.NUMBER, ARGUMENT_TYPE.LIST, ARGUMENT_TYPE.DICTIONARY],
2154+ isRequired: true,
2155+ forceEnum: false,
2156+ }),
2157+ ],
2158+ helpString: `
2159+ <div>
2160+ Sorts a list or dictionary in ascending order and passes the result down the pipe.
2161+ <ul>
2162+ <li>
2163+ For lists, returns the list sorted by value.
2164+ </li>
2165+ <li>
2166+ For dictionaries, returns the ordered list of keys after sorting. Setting keysort=false means keys are sorted by associated value.
2167+ </li>
2168+ </ul>
2169+ </div>
2170+ <div>
2171+ <strong>Examples:</strong>
2172+ <ul>
2173+ <li>
2174+ <pre><code class="language-stscript">/sort [5,3,4,1,2] | /echo</code></pre>
2175+ </li>
2176+ <li>
2177+ <pre><code class="language-stscript">/sort keysort=false {"a": 1, "d": 3, "c": 2, "b": 5} | /echo</code></pre>
2178+ </li>
2179+ </ul>
2180+ </div>
2181+ `,
2182+ }));
2183+ SlashCommandParser.addCommandObject(SlashCommand.fromProps({
21132184 name: 'rand',
21142185 callback: (args, value) => String(randValuesCallback(Number(args.from ?? 0), Number(args.to ?? (value ? value : 1)), args)),
21152186 returns: 'random number',