Skip to content

Commit

Permalink
Improved languages.DFS and util.clone (#1506)
Browse files Browse the repository at this point in the history
Minor improvements for the two functions.
  • Loading branch information
RunDevelopment authored Feb 28, 2019
1 parent 493d19e commit 152a68e
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 33 deletions.
40 changes: 24 additions & 16 deletions components/prism-core.js
Original file line number Diff line number Diff line change
Expand Up @@ -44,35 +44,37 @@ var _ = _self.Prism = {
},

// Deep clone a language definition (e.g. to extend it)
clone: function (o, visited) {
clone: function deepClone(o, visited) {
var type = _.util.type(o);
visited = visited || {};

switch (type) {
case 'Object':
if (visited[_.util.objId(o)]) {
return visited[_.util.objId(o)];
var id = _.util.objId(o);
if (visited[id]) {
return visited[id];
}
var clone = {};
visited[_.util.objId(o)] = clone;
visited[id] = clone;

for (var key in o) {
if (o.hasOwnProperty(key)) {
clone[key] = _.util.clone(o[key], visited);
clone[key] = deepClone(o[key], visited);
}
}

return clone;

case 'Array':
if (visited[_.util.objId(o)]) {
return visited[_.util.objId(o)];
var id = _.util.objId(o);
if (visited[id]) {
return visited[id];
}
var clone = [];
visited[_.util.objId(o)] = clone;
visited[id] = clone;

o.forEach(function (v, i) {
clone[i] = _.util.clone(v, visited);
clone[i] = deepClone(v, visited);
});

return clone;
Expand Down Expand Up @@ -139,19 +141,25 @@ var _ = _self.Prism = {
},

// Traverse a language definition with Depth First Search
DFS: function(o, callback, type, visited) {
DFS: function DFS(o, callback, type, visited) {
visited = visited || {};

var objId = _.util.objId;

for (var i in o) {
if (o.hasOwnProperty(i)) {
callback.call(o, i, o[i], type || i);

if (_.util.type(o[i]) === 'Object' && !visited[_.util.objId(o[i])]) {
visited[_.util.objId(o[i])] = true;
_.languages.DFS(o[i], callback, null, visited);
var property = o[i],
propertyType = _.util.type(property);

if (propertyType === 'Object' && !visited[objId(property)]) {
visited[objId(property)] = true;
DFS(property, callback, null, visited);
}
else if (_.util.type(o[i]) === 'Array' && !visited[_.util.objId(o[i])]) {
visited[_.util.objId(o[i])] = true;
_.languages.DFS(o[i], callback, i, visited);
else if (propertyType === 'Array' && !visited[objId(property)]) {
visited[objId(property)] = true;
DFS(property, callback, i, visited);
}
}
}
Expand Down
2 changes: 1 addition & 1 deletion components/prism-core.min.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

40 changes: 24 additions & 16 deletions prism.js
Original file line number Diff line number Diff line change
Expand Up @@ -49,35 +49,37 @@ var _ = _self.Prism = {
},

// Deep clone a language definition (e.g. to extend it)
clone: function (o, visited) {
clone: function deepClone(o, visited) {
var type = _.util.type(o);
visited = visited || {};

switch (type) {
case 'Object':
if (visited[_.util.objId(o)]) {
return visited[_.util.objId(o)];
var id = _.util.objId(o);
if (visited[id]) {
return visited[id];
}
var clone = {};
visited[_.util.objId(o)] = clone;
visited[id] = clone;

for (var key in o) {
if (o.hasOwnProperty(key)) {
clone[key] = _.util.clone(o[key], visited);
clone[key] = deepClone(o[key], visited);
}
}

return clone;

case 'Array':
if (visited[_.util.objId(o)]) {
return visited[_.util.objId(o)];
var id = _.util.objId(o);
if (visited[id]) {
return visited[id];
}
var clone = [];
visited[_.util.objId(o)] = clone;
visited[id] = clone;

o.forEach(function (v, i) {
clone[i] = _.util.clone(v, visited);
clone[i] = deepClone(v, visited);
});

return clone;
Expand Down Expand Up @@ -144,19 +146,25 @@ var _ = _self.Prism = {
},

// Traverse a language definition with Depth First Search
DFS: function(o, callback, type, visited) {
DFS: function DFS(o, callback, type, visited) {
visited = visited || {};

var objId = _.util.objId;

for (var i in o) {
if (o.hasOwnProperty(i)) {
callback.call(o, i, o[i], type || i);

if (_.util.type(o[i]) === 'Object' && !visited[_.util.objId(o[i])]) {
visited[_.util.objId(o[i])] = true;
_.languages.DFS(o[i], callback, null, visited);
var property = o[i],
propertyType = _.util.type(property);

if (propertyType === 'Object' && !visited[objId(property)]) {
visited[objId(property)] = true;
DFS(property, callback, null, visited);
}
else if (_.util.type(o[i]) === 'Array' && !visited[_.util.objId(o[i])]) {
visited[_.util.objId(o[i])] = true;
_.languages.DFS(o[i], callback, i, visited);
else if (propertyType === 'Array' && !visited[objId(property)]) {
visited[objId(property)] = true;
DFS(property, callback, i, visited);
}
}
}
Expand Down

0 comments on commit 152a68e

Please sign in to comment.