diff --git a/package.json b/package.json index ba5ba228..9c12748e 100644 --- a/package.json +++ b/package.json @@ -64,7 +64,7 @@ "coveralls": "~2.11.12" }, "engines": { - "node": ">=0.10.0" + "node": ">=0.12.0" }, "license": "MIT" } diff --git a/plugins/cleanupIDs.js b/plugins/cleanupIDs.js index 5ce7f0ab..6905fc19 100644 --- a/plugins/cleanupIDs.js +++ b/plugins/cleanupIDs.js @@ -12,7 +12,7 @@ exports.params = { prefix: '' }; -var referencesProps = require('./_collections').referencesProps, +var referencesProps = new Set(require('./_collections').referencesProps), regReferencesUrl = /\burl\(("|')?#(.+?)\1\)/, regReferencesHref = /^#(.+?)$/, regReferencesBegin = /^(\w+?)\./, @@ -36,8 +36,8 @@ exports.fn = function(data, params) { var currentID, currentIDstring, - IDs = Object.create(null), - referencesIDs = Object.create(null), + IDs = new Map(), + referencesIDs = new Map(), idPrefix = 'id-', // prefix IDs so that values like '__proto__' don't break the work hasStyleOrScript = false; @@ -67,24 +67,24 @@ exports.fn = function(data, params) { var key; // save IDs if (attr.name === 'id') { - key = idPrefix + attr.value; - if (key in IDs) { + key = attr.value; + if (IDs.has(key)) { item.removeAttr('id'); } else { - IDs[key] = item; + IDs.set(key, item); } } // save IDs url() references - else if (referencesProps.indexOf(attr.name) > -1) { + else if (referencesProps.has(attr.name)) { match = attr.value.match(regReferencesUrl); if (match) { - key = idPrefix + match[2]; - if (referencesIDs[key]) { - referencesIDs[key].push(attr); + key = match[2]; + if (referencesIDs.has(key)) { + referencesIDs.get(key).push(attr); } else { - referencesIDs[key] = [attr]; + referencesIDs.set(key, [attr]); } } } @@ -94,11 +94,11 @@ exports.fn = function(data, params) { attr.local === 'href' && (match = attr.value.match(regReferencesHref)) || attr.name === 'begin' && (match = attr.value.match(regReferencesBegin)) ) { - key = idPrefix + match[1]; - if (referencesIDs[key]) { - referencesIDs[key].push(attr); + key = match[1]; + if (referencesIDs.has(key)) { + referencesIDs.get(key).push(attr); } else { - referencesIDs[key] = [attr]; + referencesIDs.set(key, [attr]); } } }); @@ -121,37 +121,34 @@ exports.fn = function(data, params) { return data; } - var idKey; - for (var k in referencesIDs) { - if (IDs[k]) { - idKey = k; + for (var ID of referencesIDs) { + var key = ID[0], + references = ID[1]; + + if (IDs.has(key)) { // replace referenced IDs with the minified ones if (params.minify) { currentIDstring = getIDstring(currentID = generateID(currentID), params); - IDs[k].attr('id').value = currentIDstring; - - referencesIDs[k].forEach(function(attr) { - k = k.replace(idPrefix, ''); + IDs.get(key).attr('id').value = currentIDstring; + + references.forEach(function(attr) { + // console.log(key) attr.value = attr.value - .replace('#' + k, '#' + currentIDstring) - .replace(k + '.', currentIDstring + '.'); + .replace('#' + key, '#' + currentIDstring) + .replace(key + '.', currentIDstring + '.'); }); - - idKey = idPrefix + k; } // don't remove referenced IDs - delete IDs[idKey]; + IDs.delete(key); } } // remove non-referenced IDs attributes from elements if (params.remove) { - - for(var ID in IDs) { - IDs[ID].removeAttr('id'); + for(var keyElem of IDs) { + keyElem[1].removeAttr('id'); } - } return data; diff --git a/test/plugins/cleanupIDs.05.svg b/test/plugins/cleanupIDs.05.svg index 1cdd603a..97dc0938 100644 --- a/test/plugins/cleanupIDs.05.svg +++ b/test/plugins/cleanupIDs.05.svg @@ -1,11 +1,39 @@ + + + + + + + + + + + + + + @@@ - - + + + + + + + + + + + + + + + +