Skip to content

Commit 8b9ecdb

Browse files
committed
Create ID from path hash to cut down on duplicate <defs>
1 parent cfbd8ef commit 8b9ecdb

File tree

1 file changed

+24
-15
lines changed

1 file changed

+24
-15
lines changed

canvas2svg.js

+24-15
Original file line numberDiff line numberDiff line change
@@ -780,31 +780,25 @@
780780
if (arguments[0] === "evenodd" || arguments[1] === "evenodd") {
781781
element.setAttribute("fill-rule", "evenodd");
782782
}
783-
784-
this.__applyStyleToCurrentElement("fill");
785-
this.__applyTransform(element, "fill");
786783
};
787784

788785
/**
789786
* Sets the stroke property on the current element
790787
*/
791788
ctx.prototype.stroke = function () {
792789
var element = getOrCreateElementToApplyStyleTo.call(this, "stroke", "fill");
793-
794-
this.__applyStyleToCurrentElement("stroke");
795-
this.__applyTransform(element, "stroke");
796790
};
797791

798792
function getOrCreateElementToApplyStyleTo(paint1, paint2) {
799793
var element = this.__currentElement;
800794
var matrixString = this.__currentMatrix.toString();
801795

802-
var currentPath = this.__currentDefaultPath;
796+
var currentPath = this.__currentDefaultPath;
803797
var group = this.__closestGroupOrSvg();
804798
var extras = group.__extras || (group.__extras = {})
805799

806-
var isPath = element.nodeName === "path";
807-
if (extras[paint1] || extras[paint2] && extras.matrixString !== matrixString) {
800+
var isPath = element.nodeName === "path";
801+
if (extras[paint1] || extras[paint2] && extras.matrixString !== matrixString) {
808802
var pathHasNotChanged = currentPath === extras.currentPath;
809803
if (pathHasNotChanged) {
810804
if (isPath) {
@@ -826,18 +820,33 @@
826820
extras.currentPath = currentPath;
827821
extras.matrixString = matrixString;
828822

823+
this.__applyStyleToCurrentElement(paint1);
824+
this.__applyTransform(element, paint1);
825+
829826
return element;
830827
};
831828

829+
function hashString(string) {
830+
/** https://github.com/darkskyapp/string-hash **/
831+
let hash = 5381;
832+
let i = string.length;
833+
while (i) hash = (hash * 33) ^ string.charCodeAt(--i);
834+
return hash >>> 0;
835+
};
836+
832837
function convertPathToDef(group, id) {
833838
var element = this.__currentElement;
834839

835-
/** Create <path> <def> **/
836-
var id = group.__extras.id = randomString(this.__ids);
837-
var link = this.__createElement("path");
838-
link.setAttribute("id", id);
839-
link.setAttribute("d", element.getAttribute("d"));
840-
this.__defs.appendChild(link);
840+
/** Create <path> in <defs> **/
841+
var extras = group.__extras
842+
var id = extras.id
843+
if (!id) {
844+
id = extras.id = `path-${hashString(extras.currentPath)}`;
845+
var link = this.__createElement("path");
846+
link.setAttribute("id", id);
847+
link.setAttribute("d", element.getAttribute("d"));
848+
this.__defs.appendChild(link);
849+
}
841850

842851
/** Convert previous <path> to <use> **/
843852
if (element.nodeName === "path") {

0 commit comments

Comments
 (0)