From 1183d9eb635e4021dfbbee5c4a44c8f8fea04077 Mon Sep 17 00:00:00 2001 From: Logise1123 <88378769+Logise1123@users.noreply.github.com> Date: Sun, 27 Jul 2025 20:30:21 +0200 Subject: [PATCH 1/5] Create inputvalidator.js --- static/extensions/logise/inputvalidator.js | 421 +++++++++++++++++++++ 1 file changed, 421 insertions(+) create mode 100644 static/extensions/logise/inputvalidator.js diff --git a/static/extensions/logise/inputvalidator.js b/static/extensions/logise/inputvalidator.js new file mode 100644 index 000000000..3cf8de238 --- /dev/null +++ b/static/extensions/logise/inputvalidator.js @@ -0,0 +1,421 @@ +// Name: Input Validator +// ID: inputValidator +// Description: Blocks to easily validate user inputs like emails, numbers, and text patterns. +// By: Logise +// License: MIT + +(function(Scratch) { + 'use strict'; + + if (!Scratch.extensions.unsandboxed) { + throw new Error('Input Validator extension must run unsandboxed'); + } + + const menuIconURI = "data:image/png;base64,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"; + + class InputValidator { + getInfo() { + return { + id: 'inputValidator', + name: 'Input Validator', + color1: '#4CBF57', + color2: '#3A9944', + menuIconURI: menuIconURI, + blocks: [{ + opcode: 'isValidEmail', + blockType: Scratch.BlockType.BOOLEAN, + text: 'is [TEXT] a valid email?', + arguments: { + TEXT: { + type: Scratch.ArgumentType.STRING, + defaultValue: 'test@example.com', + }, + }, + }, + { + opcode: 'isNumberInRange', + blockType: Scratch.BlockType.BOOLEAN, + text: 'is [NUMBER] in range min [MIN] max [MAX]?', + arguments: { + NUMBER: { + type: Scratch.ArgumentType.NUMBER, + defaultValue: 50, + }, + MIN: { + type: Scratch.ArgumentType.NUMBER, + defaultValue: 0, + }, + MAX: { + type: Scratch.ArgumentType.NUMBER, + defaultValue: 100, + }, + }, + }, + { + opcode: 'isTextType', + blockType: Scratch.BlockType.BOOLEAN, + text: 'is [TEXT] [TYPE] only?', + arguments: { + TEXT: { + type: Scratch.ArgumentType.STRING, + defaultValue: 'HelloWorld', + }, + TYPE: { + type: Scratch.ArgumentType.STRING, + menu: 'textType', + defaultValue: 'letters', + }, + }, + }, + { + opcode: 'isTextLengthBetween', + blockType: Scratch.BlockType.BOOLEAN, + text: 'is length of [TEXT] between [MIN] and [MAX]?', + arguments: { + TEXT: { + type: Scratch.ArgumentType.STRING, + defaultValue: 'penguin', + }, + MIN: { + type: Scratch.ArgumentType.NUMBER, + defaultValue: 3, + }, + MAX: { + type: Scratch.ArgumentType.NUMBER, + defaultValue: 10, + }, + }, + }, + { + opcode: 'matchesRegex', + blockType: Scratch.BlockType.BOOLEAN, + text: 'does [TEXT] match regex pattern [PATTERN]?', + arguments: { + TEXT: { + type: Scratch.ArgumentType.STRING, + defaultValue: 'abc-123', + }, + PATTERN: { + type: Scratch.ArgumentType.STRING, + defaultValue: '^[a-z]{3}-[0-9]{3}$', + }, + }, + }, + { + opcode: 'isCase', + blockType: Scratch.BlockType.BOOLEAN, + text: 'is [TEXT] [CASE]?', + arguments: { + TEXT: { + type: Scratch.ArgumentType.STRING, + defaultValue: 'HELLO', + }, + CASE: { + type: Scratch.ArgumentType.STRING, + menu: 'caseType', + defaultValue: 'UPPERCASE', + }, + }, + }, + { + opcode: 'startsWith', + blockType: Scratch.BlockType.BOOLEAN, + text: 'does [TEXT] start with [PREFIX]?', + arguments: { + TEXT: { + type: Scratch.ArgumentType.STRING, + defaultValue: 'PenguinMod', + }, + PREFIX: { + type: Scratch.ArgumentType.STRING, + defaultValue: 'Penguin', + }, + }, + }, + { + opcode: 'endsWith', + blockType: Scratch.BlockType.BOOLEAN, + text: 'does [TEXT] end with [SUFFIX]?', + arguments: { + TEXT: { + type: Scratch.ArgumentType.STRING, + defaultValue: 'PenguinMod', + }, + SUFFIX: { + type: Scratch.ArgumentType.STRING, + defaultValue: 'Mod', + }, + }, + }, + { + opcode: 'containsText', + blockType: Scratch.BlockType.BOOLEAN, + text: 'does [TEXT] contain [SUBSTRING]?', + arguments: { + TEXT: { + type: Scratch.ArgumentType.STRING, + defaultValue: 'PenguinMod is cool', + }, + SUBSTRING: { + type: Scratch.ArgumentType.STRING, + defaultValue: 'Mod', + }, + }, + }, + { + opcode: 'isNumberType', + blockType: Scratch.BlockType.BOOLEAN, + text: 'is [NUMBER] an [NUM_TYPE]?', + arguments: { + NUMBER: { + type: Scratch.ArgumentType.NUMBER, + defaultValue: 42, + }, + NUM_TYPE: { + type: Scratch.ArgumentType.STRING, + menu: 'numberType', + defaultValue: 'integer', + }, + }, + }, + { + opcode: 'isNumberSign', + blockType: Scratch.BlockType.BOOLEAN, + text: 'is [NUMBER] [SIGN]?', + arguments: { + NUMBER: { + type: Scratch.ArgumentType.NUMBER, + defaultValue: 10, + }, + SIGN: { + type: Scratch.ArgumentType.STRING, + menu: 'signType', + defaultValue: 'positive', + }, + }, + }, + { + opcode: 'isValidURL', + blockType: Scratch.BlockType.BOOLEAN, + text: 'is [TEXT] a valid URL?', + arguments: { + TEXT: { + type: Scratch.ArgumentType.STRING, + defaultValue: 'https://penguinmod.com', + }, + }, + }, + { + opcode: 'isValidHexColor', + blockType: Scratch.BlockType.BOOLEAN, + text: 'is [TEXT] a valid hex color code?', + arguments: { + TEXT: { + type: Scratch.ArgumentType.STRING, + defaultValue: '#4CBF57', + }, + }, + }, + { + opcode: 'countOccurrences', + blockType: Scratch.BlockType.REPORTER, + text: 'count occurrences of [SUBSTRING] in [TEXT]', + arguments: { + SUBSTRING: { + type: Scratch.ArgumentType.STRING, + defaultValue: 'p', + }, + TEXT: { + type: Scratch.ArgumentType.STRING, + defaultValue: 'apple pineapple', + }, + }, + }, + { + opcode: 'sanitizeText', + blockType: Scratch.BlockType.REPORTER, + text: 'sanitize [TEXT] by removing [SANITIZE_ACTION]', + arguments: { + TEXT: { + type: Scratch.ArgumentType.STRING, + defaultValue: ' Hello World! 123 ', + }, + SANITIZE_ACTION: { + type: Scratch.ArgumentType.STRING, + menu: 'sanitizeAction', + defaultValue: 'leading/trailing spaces', + }, + }, + }, + ], + menus: { + textType: { + acceptReporters: true, + items: ['letters', 'numbers', 'alphanumeric'], + }, + caseType: { + acceptReporters: true, + items: ['UPPERCASE', 'lowercase'], + }, + numberType: { + acceptReporters: true, + items: ['integer', 'decimal'], + }, + signType: { + acceptReporters: true, + items: ['positive', 'negative'], + }, + sanitizeAction: { + acceptReporters: true, + items: ['leading/trailing spaces', 'all spaces', 'letters', 'numbers', 'special characters'], + }, + }, + }; + } + + isValidEmail({ TEXT }) { + const text = String(TEXT); + const pattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; + return pattern.test(text); + } + + isNumberInRange({ NUMBER, MIN, MAX }) { + const num = Number(NUMBER); + const min = Number(MIN); + const max = Number(MAX); + if (isNaN(num) || isNaN(min) || isNaN(max)) { + return false; + } + return num >= min && num <= max; + } + + isTextType({ TEXT, TYPE }) { + const text = String(TEXT); + let pattern; + switch (TYPE) { + case 'letters': + pattern = /^[a-zA-Z]+$/; + break; + case 'numbers': + pattern = /^[0-9]+$/; + break; + case 'alphanumeric': + pattern = /^[a-zA-Z0-9]+$/; + break; + default: + return false; + } + return pattern.test(text); + } + + isTextLengthBetween({ TEXT, MIN, MAX }) { + const text = String(TEXT); + const min = Number(MIN); + const max = Number(MAX); + if (isNaN(min) || isNaN(max)) { + return false; + } + const length = text.length; + return length >= min && length <= max; + } + + matchesRegex({ TEXT, PATTERN }) { + const text = String(TEXT); + const pattern = String(PATTERN); + try { + const regex = new RegExp(pattern); + return regex.test(text); + } catch (e) { + console.error("Invalid Regex Pattern:", e); + return false; + } + } + + isCase({ TEXT, CASE }) { + const text = String(TEXT); + if (CASE === 'UPPERCASE') { + return text === text.toUpperCase(); + } else if (CASE === 'lowercase') { + return text === text.toLowerCase(); + } + return false; + } + + startsWith({ TEXT, PREFIX }) { + return String(TEXT).startsWith(String(PREFIX)); + } + + endsWith({ TEXT, SUFFIX }) { + return String(TEXT).endsWith(String(SUFFIX)); + } + + containsText({ TEXT, SUBSTRING }) { + return String(TEXT).includes(String(SUBSTRING)); + } + + isNumberType({ NUMBER, NUM_TYPE }) { + const num = Number(NUMBER); + if (isNaN(num)) return false; + if (NUM_TYPE === 'integer') { + return Number.isInteger(num); + } else if (NUM_TYPE === 'decimal') { + return !Number.isInteger(num); + } + return false; + } + + isNumberSign({ NUMBER, SIGN }) { + const num = Number(NUMBER); + if (isNaN(num)) return false; + if (SIGN === 'positive') { + return num > 0; + } else if (SIGN === 'negative') { + return num < 0; + } + return false; + } + + isValidURL({ TEXT }) { + const text = String(TEXT); + try { + new URL(text); + return true; + } catch (_) { + return false; + } + } + + isValidHexColor({ TEXT }) { + const text = String(TEXT); + const pattern = /^#([0-9A-Fa-f]{3}){1,2}$/; + return pattern.test(text); + } + + countOccurrences({ SUBSTRING, TEXT }) { + const text = String(TEXT); + const substring = String(SUBSTRING); + if (substring.length === 0) return 0; + return text.split(substring).length - 1; + } + + sanitizeText({ TEXT, SANITIZE_ACTION }) { + const text = String(TEXT); + switch (SANITIZE_ACTION) { + case 'leading/trailing spaces': + return text.trim(); + case 'all spaces': + return text.replace(/\s/g, ''); + case 'letters': + return text.replace(/[a-zA-Z]/g, ''); + case 'numbers': + return text.replace(/[0-9]/g, ''); + case 'special characters': + return text.replace(/[^a-zA-Z0-9\s]/g, ''); + default: + return text; + } + } + } + + Scratch.extensions.register(new InputValidator()); +})(Scratch); From 21a928d7237e90420f9895092ce4466154b16bc4 Mon Sep 17 00:00:00 2001 From: Logise1123 <88378769+Logise1123@users.noreply.github.com> Date: Sun, 27 Jul 2025 20:32:18 +0200 Subject: [PATCH 2/5] Create fd.as --- static/images/logise/fd.as | 1 + 1 file changed, 1 insertion(+) create mode 100644 static/images/logise/fd.as diff --git a/static/images/logise/fd.as b/static/images/logise/fd.as new file mode 100644 index 000000000..e1afa79f4 --- /dev/null +++ b/static/images/logise/fd.as @@ -0,0 +1 @@ +fdas From c7370cadd985662bd0e0ae6c0613103f18932053 Mon Sep 17 00:00:00 2001 From: Logise1123 <88378769+Logise1123@users.noreply.github.com> Date: Sun, 27 Jul 2025 20:33:01 +0200 Subject: [PATCH 3/5] Add files via upload --- static/images/logise/verificator.png | Bin 0 -> 33303 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 static/images/logise/verificator.png diff --git a/static/images/logise/verificator.png b/static/images/logise/verificator.png new file mode 100644 index 0000000000000000000000000000000000000000..ffcfcc10f125847719db538654011ec0b1cfc642 GIT binary patch literal 33303 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 Date: Sun, 27 Jul 2025 20:33:25 +0200 Subject: [PATCH 4/5] Delete static/images/logise/fd.as --- static/images/logise/fd.as | 1 - 1 file changed, 1 deletion(-) delete mode 100644 static/images/logise/fd.as diff --git a/static/images/logise/fd.as b/static/images/logise/fd.as deleted file mode 100644 index e1afa79f4..000000000 --- a/static/images/logise/fd.as +++ /dev/null @@ -1 +0,0 @@ -fdas From c433a764328d5a5620f24c314126edec8f025752 Mon Sep 17 00:00:00 2001 From: Logise1123 <88378769+Logise1123@users.noreply.github.com> Date: Sun, 27 Jul 2025 20:37:39 +0200 Subject: [PATCH 5/5] Update extensions.js --- src/lib/extensions.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/lib/extensions.js b/src/lib/extensions.js index 51c2f2aa6..a4e6c0c5b 100644 --- a/src/lib/extensions.js +++ b/src/lib/extensions.js @@ -453,6 +453,15 @@ export default [ creatorAlias: "gaimerI17", note: "Extension thumbnail made by Dillon." }, + { + name: "Input Validator", + description: "A set of blocks to verify conditions, check data types, and validate inputs easily.", + code: "logise/inputvalidator.js", + banner: "logise/verificator.png", + creator: "Logise1123", + isGitHub: true, + creatorAlias: "Logise", + }, /* these extensions are completely dead as of now { name: "Online Captcha",