« get me outta code hell

handle special characters in URLs more carefully - hsmusic-wiki - HSMusic - static wiki software cataloguing collaborative creation
about summary refs log tree commit diff
diff options
context:
space:
mode:
author(quasar) nebula <qznebula@protonmail.com>2023-07-14 12:27:39 -0300
committer(quasar) nebula <qznebula@protonmail.com>2023-07-14 12:27:39 -0300
commit4516c98c09ff775892707c3f2b61c857dd82707d (patch)
tree1ffb3b50cf1c9adc7409b4c01f682536e2730a48
parent7830c73e6047ab8ec1322c4a56ed6a450bfb11e6 (diff)
handle special characters in URLs more carefully
-rw-r--r--src/misc-templates.js2
-rw-r--r--src/url-spec.js4
-rw-r--r--src/util/html.js8
-rw-r--r--src/util/urls.js17
-rw-r--r--src/write/page-template.js6
5 files changed, 19 insertions, 18 deletions
diff --git a/src/misc-templates.js b/src/misc-templates.js
index 8f3f016..a34771c 100644
--- a/src/misc-templates.js
+++ b/src/misc-templates.js
@@ -552,7 +552,7 @@ function unbound_iconifyURL(url, {
     html.tag('svg', [
       html.tag('title', msg),
       html.tag('use', {
-        href: to('shared.staticFile', `icons.svg#icon-${id}`),
+        href: to('shared.staticIcon', id),
       }),
     ]));
 }
diff --git a/src/url-spec.js b/src/url-spec.js
index 0af613c..d1e347e 100644
--- a/src/url-spec.js
+++ b/src/url-spec.js
@@ -60,7 +60,9 @@ const urlSpec = {
       staticRoot: 'static',
 
       utilityFile: 'util/<>',
-      staticFile: 'static/<>',
+      staticFile: 'static/<>?<>',
+
+      staticIcon: 'static/icons.svg#icon-<>',
     },
   },
 
diff --git a/src/util/html.js b/src/util/html.js
index 1c55fb8..2db1f2e 100644
--- a/src/util/html.js
+++ b/src/util/html.js
@@ -132,14 +132,6 @@ export function attributes(attribs) {
         throw new Error(`Attribute value for ${key} should be primitive or array, got ${typeof val}`);
     })
     .filter(([_key, _val, keep]) => keep)
-    .map(([key, val]) => {
-      switch (key) {
-        case 'href':
-          return [key, encodeURI(val)];
-        default:
-          return [key, val];
-      }
-    })
     .map(([key, val]) =>
       typeof val === 'boolean'
         ? `${key}`
diff --git a/src/util/urls.js b/src/util/urls.js
index c2119b8..ad91290 100644
--- a/src/util/urls.js
+++ b/src/util/urls.js
@@ -79,16 +79,23 @@ export function generateURLs(urlSpec) {
     );
 
     const toHelper =
-      (delimiterMode) =>
+      ({device}) =>
       (key, ...args) => {
         const {
-          value: {[delimiterMode]: template},
+          value: {
+            [device ? 'device' : 'posix']: template,
+          },
         } = getValueForFullKey(relative, key);
 
         let missing = 0;
         let result = template.replaceAll(/<([0-9]+)>/g, (match, n) => {
           if (n < args.length) {
-            return args[n];
+            const value = args[n];
+            if (device) {
+              return value;
+            } else {
+              return encodeURIComponent(value);
+            }
           } else {
             missing++;
           }
@@ -106,8 +113,8 @@ export function generateURLs(urlSpec) {
       };
 
     return {
-      to: toHelper('posix'),
-      toDevice: toHelper('device'),
+      to: toHelper({device: false}),
+      toDevice: toHelper({device: true}),
     };
   };
 
diff --git a/src/write/page-template.js b/src/write/page-template.js
index 8a3b44e..fcd8759 100644
--- a/src/write/page-template.js
+++ b/src/write/page-template.js
@@ -665,7 +665,7 @@ export function generateDocumentHTML(pageInfo, {
 
         html.tag('link', {
           rel: 'stylesheet',
-          href: to('shared.staticFile', `site3.css?${cachebust}`),
+          href: to('shared.staticFile', 'site3.css', cachebust),
         }),
 
         html.tag('style',
@@ -676,7 +676,7 @@ export function generateDocumentHTML(pageInfo, {
           ]),
 
         html.tag('script', {
-          src: to('shared.staticFile', `lazy-loading.js?${cachebust}`),
+          src: to('shared.staticFile', 'lazy-loading.js', cachebust),
         }),
       ]),
 
@@ -694,7 +694,7 @@ export function generateDocumentHTML(pageInfo, {
 
           html.tag('script', {
             type: 'module',
-            src: to('shared.staticFile', `client.js?${cachebust}`),
+            src: to('shared.staticFile', 'client.js', cachebust),
           }),
         ]),
     ]);