diff --git a/techdemos/encode/js/encoders/url.js b/techdemos/encode/js/encoders/url.js index 5161178..372a197 100644 --- a/techdemos/encode/js/encoders/url.js +++ b/techdemos/encode/js/encoders/url.js @@ -15,27 +15,35 @@ function encodeURIAggressive(text) { return encoded_text; } +var safe_keys = {"!": "%21", "#": "%23", "$": "%24", "%": "%25", "&": "%26", "'": "%27", "(": "%28", ")": "%29", "*": "%2A", "+": "%2B", ",": "%2C", "-": "%2D", ".": "%2E", "/": "%2F", "=": "%3D", ":": "%3A", ";": "%3B", "=": "%3D", "?": "%3F", "@": "%40"}; + function encodeURINonDestructive(text) { var encoded_text = encodeURIAggressive(text); + // protocol if (encoded_text.includes("%3A%2F%2F")) { encoded_text = encoded_text.replace("%3A%2F%2F", "://"); const protocol = decodeURI(encoded_text.split("://")[0]) encoded_text = protocol + "://" + encoded_text.split("://")[1]; } - encoded_text = encoded_text.replaceAll("%2F", "/").replaceAll("%3F", "?").replaceAll("%26", "&").replaceAll("%2B", "+").replaceAll("%3D", "="); + for (const [key, value] of Object.entries(safe_keys)) { + encoded_text = encoded_text.replaceAll(value, key); + } return encoded_text; } function decodeURINonDestructive(text) { + // protocol if (text.includes("://")) { const protocol = encodeURIAggressive(text.split("://")[0]); text = protocol + "%3A%2F%2F" + text.split("://")[1]; } - text = text.replaceAll("/", "%2F").replaceAll("?", "%3F").replaceAll("&", "%26").replaceAll("+", "%2B").replaceAll("=", "%3D"); + for (const [key, value] of Object.entries(safe_keys)) { + text = text.replaceAll(key, value); + } return decodeURIComponent(decodeURI(text)); } diff --git a/techdemos/encode/js/main.js b/techdemos/encode/js/main.js index abcfb43..ddd5cde 100644 --- a/techdemos/encode/js/main.js +++ b/techdemos/encode/js/main.js @@ -28,15 +28,15 @@ const codes = { encode: encodeURI, decode: decodeURI }, - "URL (component)": { + "URL (Component)": { encode: encodeURIComponent, decode: decodeURIComponent }, - "URL (aggressive)": { + "URL (Aggressive)": { encode: encodeURIAggressive, decode: text => decodeURIComponent(decodeURI(text)) }, - "URL (aggressive, non destructive)": { + "URL (Aggressive, non destructive)": { encode: encodeURINonDestructive, decode: decodeURINonDestructive },