str_slice function

This commit is contained in:
Asaki Yuki 2026-02-23 10:45:53 +07:00
parent cba4669d54
commit 581228ada9
3 changed files with 54 additions and 2 deletions

View file

@ -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",

View file

@ -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)
}

View file

@ -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