From bedf43af45d97a10a6f62b4f1bb21cd66fda1d71 Mon Sep 17 00:00:00 2001
From: aura <nw@moneybot.cc>
Date: Thu, 19 Feb 2026 19:57:10 +0100
Subject: empty moneyjsx site

---
 public/src/util.tsx | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 60 insertions(+)
 create mode 100644 public/src/util.tsx

(limited to 'public/src/util.tsx')

diff --git a/public/src/util.tsx b/public/src/util.tsx
new file mode 100644
index 0000000..f083d9f
--- /dev/null
+++ b/public/src/util.tsx
@@ -0,0 +1,60 @@
+export function escapeHtml( html: string ) {
+  const entityMap = {
+    '&': '&amp;',
+    '<': '&lt;',
+    '>': '&gt;',
+    '"': '&quot;',
+    "'": '&#39;',
+    '/': '&#x2F;',
+    '`': '&#x60;',
+    '=': '&#x3D;'
+  };
+
+  return String( html ).replace( /[&<>"'`=\/]/g, ( s ) => {
+    return entityMap[s];
+  } );
+}
+
+export function parseJWT( token: string ) : any {
+  const parts = token.split( '.' );
+  let encoded = parts[1];
+  encoded = encoded.replace(/-/g, '+').replace(/_/g, '/');
+  const pad = encoded.length % 4;
+  if( pad === 1 )
+    throw new Error( 'what the fuck' );
+  if( pad > 1 )
+    encoded += new Array( 5 - pad ).join( '=' );
+
+  const payload = JSON.parse( atob( encoded ) );
+  return payload;
+}
+
+export function sizeHumanReadable( size: number, short: boolean = false ) {
+  if( size < 1024 )
+    return size + (short? 'B' : ' B');
+  else if( size < 1024 * 1024 )
+    return ( size / 1024 ).toFixed( short? 1: 2 ) + (short? 'K' : ' KB');
+  else if( size < 1024 * 1024 * 1024 )
+    return ( size / 1024 / 1024 ).toFixed( short? 1 : 2 ) + (short? 'M' : ' MB');
+  else
+    return ( size / 1024 / 1024 / 1024 ).toFixed( short? 1 : 2 ) + (short? 'G':' GB');
+}
+
+export function monthToNumber( month: string ) {
+  const months = [
+    '',
+    'jan',
+    'feb',
+    'mar',
+    'apr',
+    'may',
+    'jun',
+    'jul',
+    'aug',
+    'sep',
+    'oct',
+    'nov',
+    'dec'
+  ];
+  return months.indexOf( month.toLowerCase() );
+};
-- 
cgit v1.2.3

