From 8131f25456016fcd54ebb63be30a5b9e79170322 Mon Sep 17 00:00:00 2001 From: Ruichka <42318266+Ruichka@users.noreply.github.com> Date: Sat, 8 Mar 2025 16:51:48 +0300 Subject: [PATCH] Allow data URI scheme for custom images (#1196) * Allow data URL external images * fix * removed inconsistency --- index.html | 20 ++++++++++---------- modules/renderers/draw-markers.js | 2 +- modules/renderers/draw-military.js | 8 ++++---- modules/ui/battle-screen.js | 4 ++-- modules/ui/editors.js | 6 +++--- modules/ui/markers-editor.js | 6 +++--- modules/ui/markers-overview.js | 2 +- modules/ui/military-overview.js | 4 ++-- modules/ui/regiment-editor.js | 4 ++-- modules/ui/regiments-overview.js | 2 +- modules/ui/tools.js | 4 ++-- versioning.js | 2 +- 12 files changed, 32 insertions(+), 32 deletions(-) diff --git a/index.html b/index.html index 6f8a37a9..e5b48466 100644 --- a/index.html +++ b/index.html @@ -8116,8 +8116,8 @@ - - + + @@ -8144,13 +8144,13 @@ - - - - - + + + + + - + @@ -8166,11 +8166,11 @@ - + - + diff --git a/modules/renderers/draw-markers.js b/modules/renderers/draw-markers.js index d9d6b816..f7466a55 100644 --- a/modules/renderers/draw-markers.js +++ b/modules/renderers/draw-markers.js @@ -42,7 +42,7 @@ function drawMarker(marker, rescale = 1) { const viewX = rn(x - zoomSize / 2, 1); const viewY = rn(y - zoomSize, 1); - const isExternal = icon.startsWith("http"); + const isExternal = icon.startsWith("http") || icon.startsWith("data:image"); return /* html */ ` diff --git a/modules/renderers/draw-military.js b/modules/renderers/draw-military.js index 5e85bd4f..a332130f 100644 --- a/modules/renderers/draw-military.js +++ b/modules/renderers/draw-military.js @@ -56,14 +56,14 @@ const drawRegiments = function (regiments, s) { .attr("text-rendering", "optimizeSpeed") .attr("x", d => x(d) - size) .attr("y", d => d.y) - .text(d => (d.icon.startsWith("http") ? "" : d.icon)); + .text(d => (d.icon.startsWith("http") || d.icon.startsWith("data:image") ? "" : d.icon)); g.append("image") .attr("class", "regimentImage") .attr("x", d => x(d) - h) .attr("y", d => y(d)) .attr("height", h) .attr("width", h) - .attr("href", d => (d.icon.startsWith("http") ? d.icon : "")); + .attr("href", d => (d.icon.startsWith("http") || d.icon.startsWith("data:image") ? d.icon : "")); }; const drawRegiment = function (reg, stateId) { @@ -109,14 +109,14 @@ const drawRegiment = function (reg, stateId) { .attr("text-rendering", "optimizeSpeed") .attr("x", x1 - size) .attr("y", reg.y) - .text(reg.icon.startsWith("http") ? "" : reg.icon); + .text(reg.icon.startsWith("http") || reg.icon.startsWith("data:image") ? "" : reg.icon); g.append("image") .attr("class", "regimentImage") .attr("x", x1 - h) .attr("y", y1) .attr("height", h) .attr("width", h) - .attr("href", reg.icon.startsWith("http") ? reg.icon : ""); + .attr("href", reg.icon.startsWith("http") || reg.icon.startsWith("data:image") ? reg.icon : ""); }; // move one regiment to another diff --git a/modules/ui/battle-screen.js b/modules/ui/battle-screen.js index b12ceea4..d56ea3f8 100644 --- a/modules/ui/battle-screen.js +++ b/modules/ui/battle-screen.js @@ -131,7 +131,7 @@ class Battle { for (const u of options.military) { const label = capitalize(u.name.replace(/_/g, " ")); - const isExternal = u.icon.startsWith("http"); + const isExternal = u.icon.startsWith("http") || u.icon.startsWith("data:image"); const iconHTML = isExternal ? `` : u.icon; headers += `${iconHTML}`; } @@ -148,7 +148,7 @@ class Battle { const distance = (Math.hypot(this.y - regiment.by, this.x - regiment.bx) * distanceScale) | 0; // distance between regiment and its base const color = state.color[0] === "#" ? state.color : "#999"; - const isExternal = regiment.icon.startsWith("http"); + const isExternal = regiment.icon.startsWith("http") || regiment.icon.startsWith("data:image"); const iconHtml = isExternal ? `` : `${regiment.icon}`; diff --git a/modules/ui/editors.js b/modules/ui/editors.js index 30e4a763..3ebff350 100644 --- a/modules/ui/editors.js +++ b/modules/ui/editors.js @@ -1171,7 +1171,7 @@ function selectIcon(initial, callback) { // find external images used as icons and show them const externalResources = new Set(); - const isExternal = url => url.startsWith("http"); + const isExternal = url => url.startsWith("http") || url.startsWith("data:image"); options.military.forEach(unit => { if (isExternal(unit.icon)) externalResources.add(unit.icon); @@ -1204,14 +1204,14 @@ function selectIcon(initial, callback) { const image = document.createElement("div"); image.style.cssText = `width: 2.2em; height: 2.2em; background-size: cover; background-image: url(${url})`; addedIcons.appendChild(image); - image.onclick = () => callback(ulr); + image.onclick = () => callback(url); } byId("addImage").onclick = function () { const input = this.previousElementSibling; const ulr = input.value; if (!ulr) return tip("Enter image URL to add", false, "error", 4000); - if (!ulr.match(/^(http|https):\/\//)) return tip("Enter valid URL", false, "error", 4000); + if (!ulr.match(/^((http|https):\/\/)|data\:image\//)) return tip("Enter valid URL", false, "error", 4000); addExternalImage(ulr); callback(ulr); input.value = ""; diff --git a/modules/ui/markers-editor.js b/modules/ui/markers-editor.js index 2147e09b..9f56db9a 100644 --- a/modules/ui/markers-editor.js +++ b/modules/ui/markers-editor.js @@ -95,7 +95,7 @@ function editMarker(markerI) { } function updateInputs() { - byId("markerIcon").innerHTML = marker.icon.startsWith("http") + byId("markerIcon").innerHTML = marker.icon.startsWith("http") || marker.icon.startsWith("data:image") ? `` : marker.icon; @@ -117,7 +117,7 @@ function editMarker(markerI) { function changeMarkerIcon() { selectIcon(marker.icon, value => { - const isExternal = value.startsWith("http"); + const isExternal = value.startsWith("http") || value.startsWith("data:image"); byId("markerIcon").innerHTML = isExternal ? `` : value; getSameTypeMarkers().forEach(marker => { @@ -194,7 +194,7 @@ function editMarker(markerI) { } function redrawIcon({i, hidden, icon, dx = 50, dy = 50, px = 12}) { - const isExternal = icon.startsWith("http"); + const isExternal = icon.startsWith("http") || icon.startsWith("data:image"); const iconText = !hidden && document.querySelector(`#marker${i} > text`); if (iconText) { diff --git a/modules/ui/markers-overview.js b/modules/ui/markers-overview.js index 4980dd9b..bcb2efb0 100644 --- a/modules/ui/markers-overview.js +++ b/modules/ui/markers-overview.js @@ -72,7 +72,7 @@ function overviewMarkers() { return /* html */ `
${ - icon.startsWith("http") + icon.startsWith("http") || icon.startsWith("data:image") ? `` : `${icon}` } diff --git a/modules/ui/military-overview.js b/modules/ui/military-overview.js index 2533f1c5..1a916f7a 100644 --- a/modules/ui/military-overview.js +++ b/modules/ui/military-overview.js @@ -286,7 +286,7 @@ function overviewMilitary() { if (type === "icon") { return selectIcon(el.textContent, function (value) { - el.innerHTML = value.startsWith("http") + el.innerHTML = value.startsWith("http") || value.startsWith("data:image") ? `` : value; }); @@ -339,7 +339,7 @@ function overviewMilitary() { row.innerHTML = /* html */ `