summaryrefslogtreecommitdiff
path: root/node_modules/mdurl/lib/encode.mjs
diff options
context:
space:
mode:
authorShipwreckt <me@shipwreckt.co.uk>2025-10-31 20:02:14 +0000
committerShipwreckt <me@shipwreckt.co.uk>2025-10-31 20:02:14 +0000
commit7a52ddeba2a68388b544f529d2d92104420f77b0 (patch)
tree15ddd47457a2cb4a96060747437d36474e4f6b4e /node_modules/mdurl/lib/encode.mjs
parent53d6ae2b5568437afa5e4995580a3fb679b7b91b (diff)
Changed from static to 11ty!
Diffstat (limited to 'node_modules/mdurl/lib/encode.mjs')
-rw-r--r--node_modules/mdurl/lib/encode.mjs89
1 files changed, 89 insertions, 0 deletions
diff --git a/node_modules/mdurl/lib/encode.mjs b/node_modules/mdurl/lib/encode.mjs
new file mode 100644
index 0000000..7a0c356
--- /dev/null
+++ b/node_modules/mdurl/lib/encode.mjs
@@ -0,0 +1,89 @@
+const encodeCache = {}
+
+// Create a lookup array where anything but characters in `chars` string
+// and alphanumeric chars is percent-encoded.
+//
+function getEncodeCache (exclude) {
+ let cache = encodeCache[exclude]
+ if (cache) { return cache }
+
+ cache = encodeCache[exclude] = []
+
+ for (let i = 0; i < 128; i++) {
+ const ch = String.fromCharCode(i)
+
+ if (/^[0-9a-z]$/i.test(ch)) {
+ // always allow unencoded alphanumeric characters
+ cache.push(ch)
+ } else {
+ cache.push('%' + ('0' + i.toString(16).toUpperCase()).slice(-2))
+ }
+ }
+
+ for (let i = 0; i < exclude.length; i++) {
+ cache[exclude.charCodeAt(i)] = exclude[i]
+ }
+
+ return cache
+}
+
+// Encode unsafe characters with percent-encoding, skipping already
+// encoded sequences.
+//
+// - string - string to encode
+// - exclude - list of characters to ignore (in addition to a-zA-Z0-9)
+// - keepEscaped - don't encode '%' in a correct escape sequence (default: true)
+//
+function encode (string, exclude, keepEscaped) {
+ if (typeof exclude !== 'string') {
+ // encode(string, keepEscaped)
+ keepEscaped = exclude
+ exclude = encode.defaultChars
+ }
+
+ if (typeof keepEscaped === 'undefined') {
+ keepEscaped = true
+ }
+
+ const cache = getEncodeCache(exclude)
+ let result = ''
+
+ for (let i = 0, l = string.length; i < l; i++) {
+ const code = string.charCodeAt(i)
+
+ if (keepEscaped && code === 0x25 /* % */ && i + 2 < l) {
+ if (/^[0-9a-f]{2}$/i.test(string.slice(i + 1, i + 3))) {
+ result += string.slice(i, i + 3)
+ i += 2
+ continue
+ }
+ }
+
+ if (code < 128) {
+ result += cache[code]
+ continue
+ }
+
+ if (code >= 0xD800 && code <= 0xDFFF) {
+ if (code >= 0xD800 && code <= 0xDBFF && i + 1 < l) {
+ const nextCode = string.charCodeAt(i + 1)
+ if (nextCode >= 0xDC00 && nextCode <= 0xDFFF) {
+ result += encodeURIComponent(string[i] + string[i + 1])
+ i++
+ continue
+ }
+ }
+ result += '%EF%BF%BD'
+ continue
+ }
+
+ result += encodeURIComponent(string[i])
+ }
+
+ return result
+}
+
+encode.defaultChars = ";/?:@&=+$,-_.!~*'()#"
+encode.componentChars = "-_.!~*'()"
+
+export default encode