import slotExtract from "../nlp/extract"; import removeStopwords from "../nlp/stopwords"; import { NLPResult } from "./NLPResult"; import { Kbd } from "@nextui-org/react"; interface KeywordsDict { [key: string]: number; } interface IntentionsDict { [key: string]: number; } export function validBase64(str: string) { return str.length % 4 == 0 && /^[A-Za-z0-9+/]+[=]{0,2}$/.test(str); } export function base64NLP(str: string) { const keywords: KeywordsDict = { base64: 1, b64: 0.95, base: 0.5 }; let result = new NLPResult(null, null, 0.0, 0.0); for (let keyword of Object.keys(keywords)) { const pos = str.trim().indexOf(keyword); const l = str.length; const w = str.split(" ").length; if (w > 1 && (pos === 0 || pos == l)) { result.probability += keywords[keyword]; break; } } const intentions: IntentionsDict = { decode: 0.1, encode: 1 }; for (let intention of Object.keys(intentions)) { const pos = str.trim().indexOf(intention); const w = str.split(" ").length; if (w > 1 && pos !== -1) { result.confidence += intentions[intention]; result.intention = `base64.${intention}`; break; } } let processedQuery = str; if (result.intention === "base64.encode") { const blacklist = Object.keys(keywords).concat(Object.keys(intentions)).concat(["convert", "turn"]); processedQuery = slotExtract(str, blacklist); } else if (result.intention === "base64.decode") { processedQuery = removeStopwords(str, Object.keys(keywords).concat(Object.keys(intentions))).trim(); } if (result.intention === "base64.decode") { if (validBase64(processedQuery)) { result.confidence = 1; } else { result.confidence = 0; } } else if (validBase64(processedQuery) && result.intention !== "base64.encode") { result.intention = "base64.decode"; result.confidence += Math.max(1 / Math.log2(1 / processedQuery.length) + 1, 0); result.probability += Math.max(1 / Math.log2(1 / processedQuery.length) + 1, 0); } switch (result.intention) { case "base64.encode": result.suggestion = btoa(processedQuery); result.prompt = ( Base64 Encode (Hit to copy): ); break; case "base64.decode": if (result.confidence > 0.1) result.suggestion = atob(processedQuery); result.prompt = ( Base64 Decode (Hit to copy): ); break; default: break; } return result; }