From 581228ada93fe4f9f7b88f7b201ece5a0d42b758 Mon Sep 17 00:00:00 2001 From: Asaki Yuki Date: Mon, 23 Feb 2026 10:45:53 +0700 Subject: [PATCH] str_slice function --- package.json | 2 +- src/compilers/bindings/Checker.ts | 8 ++++++ src/compilers/bindings/Function.ts | 46 +++++++++++++++++++++++++++++- 3 files changed, 54 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 8ec87c4..9b8f7dc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "asajs", - "version": "4.1.1", + "version": "4.1.2-indev", "description": "Create your Minecraft JSON-UI resource packs using JavaScript", "keywords": [ "Minecraft", diff --git a/src/compilers/bindings/Checker.ts b/src/compilers/bindings/Checker.ts index 16de11f..aace94b 100644 --- a/src/compilers/bindings/Checker.ts +++ b/src/compilers/bindings/Checker.ts @@ -30,6 +30,14 @@ export function isHasBinding(input: string) { return /#\w+/.test(input) } +export function isBinding(input: string) { + return /^#\w+$/.test(input) +} + +export function isNumber(input: string) { + return /^[+-]?(?:\d+|\d+\.\d*|\.\d+)(?:[eE][+-]?\d+)?$/.test(input) +} + export function isString(input: string) { return /^'.+'$/.test(input) } diff --git a/src/compilers/bindings/Function.ts b/src/compilers/bindings/Function.ts index 322e7b4..6a589fb 100644 --- a/src/compilers/bindings/Function.ts +++ b/src/compilers/bindings/Function.ts @@ -1,7 +1,7 @@ import { RandomBindingString, RandomString, ResolveBinding } from "../../components/Utils.js" import { BindingItem } from "../../types/properties/value.js" import { bindingFuntions } from "../Configuration.js" -import { isString } from "./Checker.js" +import { isBinding, isNumber, isString } from "./Checker.js" import { Expression, GenBinding } from "./types.js" type CallbackRet = { @@ -141,6 +141,12 @@ export const defaultFunctions = { } }, + not_contains: (source_str, contains_str) => { + return { + value: `(${source_str} - ${contains_str}) = ${source_str}`, + } + }, + contains: (source_str, contains_str) => { return { value: `not ((${source_str} - ${contains_str}) = ${source_str})`, @@ -195,6 +201,44 @@ export const defaultFunctions = { } }, + str_slice: (str, start, end) => { + const prefix = `'asajs:${RandomString(5)}:'` + + if (isBinding(start)) start = `('%.' + (${start} + ${prefix.length - 2}) + 's')` + else if (isNumber(start)) start = `'%.${+start + prefix.length - 2}s'` + else throw new Error("Invalid start") + + const genStrBinds: GenBinding = { + source: ``, + target: RandomBindingString(), + } + + if (isBinding(str)) genStrBinds.source = `(${prefix} + ${str})` + else if (isString(str)) genStrBinds.source = `${prefix.slice(0, -1)}${str.slice(1)}` + else throw new Error("Invalid str") + + if (end) { + if (isBinding(end)) end = `('%.' + (${end} + ${prefix.length - 2}) + 's')` + else if (isNumber(end)) end = `'%.${+end + prefix.length - 2}s'` + else throw new Error("Invalid end") + + const sliceEnd: GenBinding = { + source: `(${end} * ${genStrBinds.target})`, + target: RandomBindingString(), + } + + return { + genBindings: [genStrBinds, sliceEnd], + value: `${sliceEnd.target} - (${start} * ${sliceEnd.target})`, + } + } else { + return { + genBindings: [genStrBinds], + value: `${genStrBinds.target} - (${start} * ${genStrBinds.target})`, + } + } + }, + /** * Return a translatable string * @param key