@@ -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+ 
327389export  {  getValue ,  storage  } ; 
0 commit comments