Skip to content

Commit 4550990

Browse files
committed
feat: encode and decode value
1 parent e0cc56a commit 4550990

File tree

1 file changed

+62
-0
lines changed

1 file changed

+62
-0
lines changed

src/getValue.js

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,14 @@ const getValue = (element) => {
285285
console.error('getValue() error:', error, element);
286286
}
287287

288+
let encode = element.getAttribute('value-encode')
289+
if (encode)
290+
value = encodeValue(value, encode)
291+
292+
let decode = element.getAttribute('value-decode')
293+
if (decode)
294+
value = decodeValue(value, decode)
295+
288296
let lowercase = element.getAttribute('value-lowercase')
289297
if (lowercase || lowercase === '')
290298
value = value.toLowerCase()
@@ -324,4 +332,58 @@ function regexParser(string) {
324332
return { regex, replacement }
325333
}
326334

335+
function encodeValue(value, encodingType) {
336+
switch (encodingType.toLowerCase()) {
337+
case 'url':
338+
case 'uri':
339+
return encodeURI(value.replace(/ /g, "%20"));
340+
case 'uri-component':
341+
return encodeURIComponent(value.replace(/ /g, "%20"));
342+
case 'base64':
343+
case 'atob':
344+
const encoder = new TextEncoder();
345+
const uint8Array = encoder.encode(value);
346+
return btoa(String.fromCharCode(...uint8Array));
347+
case 'html-entities':
348+
return value.replace(/[\u00A0-\u9999<>\&]/g, (i) => {
349+
return `&#${i.charCodeAt(0)};`;
350+
});
351+
case 'json':
352+
return JSON.stringify(value);
353+
default:
354+
throw new Error(`Unsupported encoding type: ${encodingType}`);
355+
}
356+
}
357+
358+
function decodeValue(value, decodingType) {
359+
switch (decodingType.toLowerCase()) {
360+
case 'url':
361+
case 'uri':
362+
return decodeURI(value);
363+
case 'uri-component':
364+
return decodeURIComponent(value);
365+
case 'base64':
366+
case 'btoa': // New case for Base64 decoding (alias for 'base64')
367+
try {
368+
const decodedArray = Uint8Array.from(atob(value), (c) => c.charCodeAt(0));
369+
const decoder = new TextDecoder();
370+
return decoder.decode(decodedArray);
371+
} catch (error) {
372+
throw new Error(`Invalid Base64 string: ${error.message}`);
373+
}
374+
case 'html-entities':
375+
const tempElement = document.createElement('div');
376+
tempElement.innerHTML = value;
377+
return tempElement.textContent;
378+
case 'json':
379+
try {
380+
return JSON.parse(value);
381+
} catch (error) {
382+
throw new Error(`Invalid JSON string: ${error.message}`);
383+
}
384+
default:
385+
throw new Error(`Unsupported decoding type: ${decodingType}`);
386+
}
387+
}
388+
327389
export { getValue, storage };

0 commit comments

Comments
 (0)