Skip to content

Commit 5e13ffa

Browse files
Refactor block SVG export to avoid fragile string splitting (#5505)
1 parent 9e29f1a commit 5e13ffa

File tree

1 file changed

+24
-23
lines changed

1 file changed

+24
-23
lines changed

js/activity.js

Lines changed: 24 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1251,6 +1251,20 @@ class Activity {
12511251
this.sendAllToTrash(true, true);
12521252
};
12531253

1254+
const extractSVGInner = svgString => {
1255+
const parser = new DOMParser();
1256+
const doc = parser.parseFromString(svgString, "image/svg+xml");
1257+
const svgEl = doc.querySelector("svg");
1258+
if (!svgEl) return "";
1259+
1260+
// Remove drop shadow filters safely
1261+
svgEl.querySelectorAll("[filter]").forEach(el => {
1262+
el.removeAttribute("filter");
1263+
});
1264+
1265+
return svgEl.innerHTML;
1266+
};
1267+
12541268
/**
12551269
* @returns {SVG} returns SVG of blocks
12561270
*/
@@ -1274,11 +1288,9 @@ class Activity {
12741288
yMax = this.blocks.blockList[i].container.y + this.blocks.blockList[i].height;
12751289
}
12761290

1277-
if (this.blocks.blockList[i].collapsed) {
1278-
parts = this.blocks.blockCollapseArt[i].split("><");
1279-
} else {
1280-
parts = this.blocks.blockArt[i].split("><");
1281-
}
1291+
const rawSVG = this.blocks.blockList[i].collapsed
1292+
? this.blocks.blockCollapseArt[i]
1293+
: this.blocks.blockArt[i];
12821294

12831295
if (this.blocks.blockList[i].isCollapsible()) {
12841296
svg += "<g>";
@@ -1290,7 +1302,13 @@ class Activity {
12901302
", " +
12911303
this.blocks.blockList[i].container.y +
12921304
')">';
1293-
if (SPECIALINPUTS.includes(this.blocks.blockList[i].name)) {
1305+
1306+
if (!SPECIALINPUTS.includes(this.blocks.blockList[i].name)) {
1307+
svg += extractSVGInner(rawSVG);
1308+
} else {
1309+
// Keep existing fragile logic for now
1310+
parts = rawSVG.split("><");
1311+
12941312
for (let p = 1; p < parts.length; p++) {
12951313
// FIXME: This is fragile.
12961314
if (p === 1) {
@@ -1314,23 +1332,6 @@ class Activity {
13141332
svg += parts[p] + "><";
13151333
}
13161334
}
1317-
} else {
1318-
for (let p = 1; p < parts.length; p++) {
1319-
// FIXME: This is fragile.
1320-
if (p === 1) {
1321-
svg += "<" + parts[p] + "><";
1322-
} else if (p === 2) {
1323-
// skip filter
1324-
} else if (p === 3) {
1325-
svg += parts[p].replace("filter:url(#dropshadow);", "") + "><";
1326-
} else if (p === parts.length - 2) {
1327-
svg += parts[p] + ">";
1328-
} else if (p === parts.length - 1) {
1329-
// skip final </svg>
1330-
} else {
1331-
svg += parts[p] + "><";
1332-
}
1333-
}
13341335
}
13351336

13361337
svg += "</g>";

0 commit comments

Comments
 (0)