Spaces:
Paused
Paused
/** | |
* Make path readable but still valid in URL (means the whole URL is still recognized as a URL) | |
* @param path Path. May be used as URL path or query value. | |
* @returns Readable but still valid path | |
*/ | |
export function getReadablePath(path: string) { | |
path = path | |
.split('/') | |
.map(s => decodeURIComponent(s)) | |
.map(s => | |
Array.from(s) | |
.map(c => (isSafeChar(c) ? c : encodeURIComponent(c))) | |
.join('') | |
) | |
.join('/') | |
return path | |
} | |
// Check if the character is safe (means no need of percent-encoding) | |
function isSafeChar(c: string) { | |
if (c.charCodeAt(0) < 0x80) { | |
// ASCII | |
if (/^[a-zA-Z0-9\-._~]$/.test(c)) { | |
// RFC3986 unreserved chars | |
return true | |
} else if (/^[*:@,!]$/.test(c)) { | |
// Some extra pretty safe chars for URL path or query | |
// Ref: https://stackoverflow.com/a/42287988/11691878 | |
return true | |
} | |
} else { | |
if (!/\s|\u180e/.test(c)) { | |
// Non-whitespace char. \u180e is missed in \s. | |
return true | |
} | |
} | |
return false | |
} | |