// Cubescript Multidimensional Arrays islists = [ bool = 0 loop i (listlen $arg1) [ if (> (listlen (at $arg1 $i)) 1) [ bool = 1; break ] ] result $bool ] countQuotes = [ numquotes = 0 loop q (strlen $arg1) [ if (testchar (substr $arg1 $q 1) 8) [ += numquotes 1 ] ] result $numquotes ] getQuotePosition = [ open_q = -1 loop h (strlen $arg1) [ if (testchar (substr $arg1 $h 1) 8) [ open_q = $h break ] ] ] reverseString = [ oldstr = $arg1 newstr = "" loop i (strlen $oldstr) [ newstr = (concatword $newstr (substr $oldstr (* (+ $i 1) -1) 1)) ] result $newstr ] // returns the subarray name of a open bracket position in an existing mdarray extractSubarrayName = [ open_bracket_pos = $arg2 subarray_name = "" loop d (strlen $arg1) [ tmpchar = (substr $arg1 (- $open_bracket_pos (+ $d 2)) 1) if (testchar $tmpchar 7) break [ if (&& (! (strcmp $tmpchar "[")) (! (strcmp $tmpchar "]"))) [ subarray_name = (concatword $subarray_name $tmpchar) ] ] ] result (reverseString $subarray_name) ] // adds a new subarray to an existing mdarray MDArray_New_Subarray = [ if (= (findlist (getalias $arg1) $arg2) -1) [ add2list $arg1 $arg2 if (islists $arg3) [ add2list $arg1 (addpunct (concatword " " $arg3 " ") 1) ] [ add2list $arg1 (addpunct (concatword " " (addpunct $arg3) " ") 1) ] ] ] // finds the open and close bracket pair positions of a subarray in an existing mdarray MDArray_Get_Bracket_Positions = [ open_bracket_pos = (+ (strpos $arg1 $arg2) (+ (strlen $arg2) 1)) close_bracket_pos = -1 loop i (- (strlen $arg1) $open_bracket_pos) [ next_char = (+ (+ $open_bracket_pos $i) 1) if (strstr (substr $arg1 $next_char 1) "]") [ close_bracket_pos = $next_char break ] ] ] // returns either an entire subarray or a single element from a subarray of an existing mdarray MDArray_Get = [ mdarray = (getalias $arg1) target = (findlist $mdarray $arg2) if (!= $target -1) [ MDArray_Get_Bracket_Positions $mdarray $arg2 if (!= $close_bracket_pos -1) [ += open_bracket_pos 1 // skip the bracket itself when extracting the subarray with the line below -= close_bracket_pos 1 subarray = (substr $mdarray $open_bracket_pos (- $close_bracket_pos $open_bracket_pos)) if (<= (countQuotes $subarray) 2) [ // quotes need to be trimmed from single-list subarrays getQuotePosition $subarray subarray = (substr $subarray (+ $open_q 1)) subarray = (substr $subarray 0 (- (strlen $subarray) 1)) ] if (= $arg3 -1) [ result $subarray ] [ result (at $subarray $arg3) ] ] ] [ echo (red)Error: $arg2 is not a subarray of $arg1 ] ] // returns a list of all opening bracket "[" positions in an existing mdarray MDArray_Get_All_Opening_Bracket_Positions = [ o_positions = "" loop i (strlen $arg1) [ if (strcmp (substr $arg1 $i 1) "[") [ add2list o_positions $i ] ] if (listlen $o_positions) [ result $o_positions ] [ result -1 ] ] // returns the number of subarrays in an existing mdarray MDArray_Get_Subarray_Count = [ result (listlen (MDArray_Get_All_Opening_Bracket_Positions (getalias $arg1))) ] // returns a list of all subarray names in an existing mdarray MDArray_Get_All_Subarray_Names = [ opening_brackets = (MDArray_Get_All_Opening_Bracket_Positions (getalias $arg1)) subarray_names = "" loop r (listlen $opening_brackets) [ add2list subarray_names (extractSubarrayName (getalias $arg1) (at $opening_brackets $r)) ] result $subarray_names ] // searches the contents of all subarrays in an existing mdarray for a keyword // returns a list of all subarray names that have content with matches MDArray_Search = [ mdarray = (getalias $arg1) token = $arg2 subarrays = (MDArray_Get_All_Subarray_Names $arg1) search_results = "" loop u (listlen $subarrays) [ curarray = (MDArray_Get $arg1 (at $subarrays $u) -1) if (strstr $curarray $token) [ if (! (strstr $search_results (at $subarrays $u))) [ add2list search_results (at $subarrays $u) ] ] ] result $search_results ] // deletes an entire subarray from an existing mdarray MDArray_Delete_Subarray = [ orig_array = (getalias $arg1) target_subarray = $arg2 target_pos = (strpos $orig_array $target_subarray) gotclose = -1 delstr = "" if (!= $target_pos -1) [ loop h (strlen $orig_array) [ if (< $h $target_pos) continue [ if (strcmp (substr $orig_array $h 1) "]") [ gotclose = $h; break ] ] ] delstr = (substr $orig_array $target_pos (- (+ $gotclose 1) $target_pos)) $arg1 = (strreplace $orig_array $delstr "") result (getalias $arg1) ] ] // modifies an existing element in an existing subarray MDArray_Modify_Subarray = [ original_subarray = (MDArray_Get $arg1 $arg2 -1) target_elem = $arg3 new_elem = $arg4 new_subarray = "" if (<= (countQuotes $original_subarray) 2) [ original_subarray = (addpunct $original_subarray) ] loop j (listlen $original_subarray) [ next_elem = (at $original_subarray $j) if (= $j $target_elem) [ if (> (listlen $new_elem) 1) [ add2list new_subarray (addpunct $new_elem) ] [ add2list new_subarray $new_elem ] ] [ if (> (listlen $next_elem) 1) [ add2list new_subarray (addpunct $next_elem) ] [ add2list new_subarray $next_elem ] ] ] MDArray_Delete_Subarray $arg1 $arg2 MDArray_New_Subarray $arg1 $arg2 $new_subarray ] // adds a new element to an existing subarray MDArray_Add_To_Subarray = [ mdarray = (getalias $arg1) to_add = $arg3 if (!= (findlist $mdarray $arg2) -1) [ subarray = (MDArray_Get $arg1 $arg2 -1) if (<= (countQuotes $subarray) 2) [ subarray = (addpunct $subarray) ] if (<= (countQuotes $to_add) 2) [ to_add = (addpunct $to_add) ] MDArray_Delete_Subarray $arg1 $arg2 MDArray_New_Subarray $arg1 $arg2 (format "%1 %2" $subarray $to_add) ] ] // some of these aliases can cause issues if they get stored in saved.cfg (missing bracket errors/etc.) addListOnQuit "bool MDArray_New_Subarray MDArray_Get_Bracket_Positions MDArray_Get reverseString MDArray_Get_All_Opening_Bracket_Positions MDArray_Get_Subarray_Count MDArray_Get_All_Subarray_Names extractSubarrayName MDArray_Search MDArray_Delete_Subarray MDArray_Modify_Subarray original_subarray target_elem new_elem new_subarray j next_elem islists hasQuotePair got_open_quote got_close_quote r i d mdarray subarray firstchar lastchar oldstr newstr subarray_names subarray_name tmpchar token subarrays search_results curarray orig_array target_subarray target_pos gotclose delstr h next_char"