Quellcode durchsuchen

Add RFC3986-compliant URL format encoding

Fixes https://github.com/hakimel/reveal.js/issues/3315
Martino vor 2 Jahren
Ursprung
Commit
ea6b7197c7
6 geänderte Dateien mit 20 neuen und 2 gelöschten Zeilen
  1. 0 0
      dist/reveal.esm.js
  2. 0 0
      dist/reveal.esm.js.map
  3. 0 0
      dist/reveal.js
  4. 0 0
      dist/reveal.js.map
  5. 4 2
      js/controllers/slidecontent.js
  6. 16 0
      js/utils/util.js

Datei-Diff unterdrückt, da er zu groß ist
+ 0 - 0
dist/reveal.esm.js


Datei-Diff unterdrückt, da er zu groß ist
+ 0 - 0
dist/reveal.esm.js.map


Datei-Diff unterdrückt, da er zu groß ist
+ 0 - 0
dist/reveal.js


Datei-Diff unterdrückt, da er zu groß ist
+ 0 - 0
dist/reveal.js.map


+ 4 - 2
js/controllers/slidecontent.js

@@ -1,4 +1,4 @@
-import { extend, queryAll, closest, getMimeTypeFromFile } from '../utils/util.js'
+import { extend, queryAll, closest, getMimeTypeFromFile, encodeRFC3986URI } from '../utils/util.js'
 import { isMobile } from '../utils/device.js'
 
 import fitty from 'fitty';
@@ -108,7 +108,9 @@ export default class SlideContent {
 					// URL(s)
 					else {
 						backgroundContent.style.backgroundImage = backgroundImage.split( ',' ).map( background => {
-							return `url(${encodeURI(background.trim())})`;
+							// Decode URL(s) that are already encoded first
+							let decoded = decodeURI(background.trim());
+							return `url(${encodeRFC3986URI(decoded)})`;
 						}).join( ',' );
 					}
 				}

+ 16 - 0
js/utils/util.js

@@ -294,4 +294,20 @@ const fileExtensionToMimeMap = {
  */
 export const getMimeTypeFromFile = ( filename='' ) => {
 	return fileExtensionToMimeMap[filename.split('.').pop()]
+}
+
+/**
+ * Encodes a string for RFC3986-compliant URL format.
+ * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURI#encoding_for_rfc3986
+ *
+ * @param {string} url
+ */
+export const encodeRFC3986URI = ( url='' ) => {
+	return encodeURI(url)
+	  .replace(/%5B/g, "[")
+	  .replace(/%5D/g, "]")
+	  .replace(
+		/[!'()*]/g,
+		(c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}`
+	  );
 }

Einige Dateien werden nicht angezeigt, da zu viele Dateien in diesem Diff geändert wurden.