Skip to content

Commit e150866

Browse files
committed
Merge pull request algorithm-visualizer#97 from amr-salama/gh-pages
add link/hash navigation to algorithms
2 parents 0dfce13 + 71a6a16 commit e150866

File tree

1 file changed

+82
-2
lines changed

1 file changed

+82
-2
lines changed

js/script.js

Lines changed: 82 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,15 @@ var executeDataAndCode = function () {
158158
}
159159
$('.sidemenu button').removeClass('active');
160160
$menu.addClass('active');
161-
$('#btn_desc').click();
161+
var requestedTab = getHashValue('tab');
162+
if(requestedTab) {
163+
if(requestedTab === 'trace')
164+
$('#btn_trace').click();
165+
else
166+
$('#btn_desc').click();
167+
} else {
168+
$('#btn_desc').click();
169+
}
162170

163171
$('#category').html(category_name);
164172
$('#algorithm').html(algorithm_name);
@@ -253,6 +261,11 @@ var executeDataAndCode = function () {
253261
var list = {};
254262
var anyOpened = false;
255263
$.getJSON('./algorithm/category.json', function (data) {
264+
var requestedCategory = getHashValue('category'),
265+
requestedAlgorithm = getHashValue('algorithm');
266+
var anyRequested = requestedCategory && requestedAlgorithm;
267+
anyOpened = anyRequested;
268+
256269
list = data;
257270
for (var category in list) {
258271
(function (category) {
@@ -272,6 +285,9 @@ var executeDataAndCode = function () {
272285
.attr('data-algorithm', algorithm)
273286
.attr('data-category', category)
274287
.click(function () {
288+
setHashValue('category', category);
289+
setHashValue('algorithm', algorithm);
290+
setHashValue('tab', 'desc');
275291
loadAlgorithm(category, algorithm);
276292
});
277293
$('#list').append($algorithm);
@@ -283,6 +299,19 @@ var executeDataAndCode = function () {
283299
}
284300
})(category);
285301
}
302+
303+
if(anyRequested) {
304+
if(!list[requestedCategory] || !list[requestedCategory].list[requestedAlgorithm]) {
305+
showErrorToast('Oops! This link appears to be broken.');
306+
$('#scratch-paper').click();
307+
removeHashValue('category');
308+
removeHashValue('algorithm');
309+
removeHashValue('tab');
310+
} else {
311+
$('[data-category="' + requestedCategory + '"]').toggleClass('collapse');
312+
loadAlgorithm(requestedCategory, requestedAlgorithm);
313+
}
314+
}
286315
});
287316
$('#powered-by').click(function () {
288317
$('#powered-by-list button').toggleClass('collapse');
@@ -372,12 +401,14 @@ var executeDataAndCode = function () {
372401
$('#tab_desc').addClass('active');
373402
$('.tab_bar > button').removeClass('active');
374403
$(this).addClass('active');
404+
setHashValue('tab', 'desc');
375405
});
376406
$('#btn_trace').click(function () {
377407
$('.tab_container > .tab').removeClass('active');
378408
$('#tab_module').addClass('active');
379409
$('.tab_bar > button').removeClass('active');
380410
$(this).addClass('active');
411+
setHashValue('tab', 'trace');
381412
});
382413

383414
$(window).resize(function () {
@@ -476,6 +507,55 @@ var executeDataAndCode = function () {
476507
tracerManager.findOwner(this).mousewheel(e);
477508
});
478509

510+
var getHashValue = function (key) {
511+
if(!key) return null;
512+
var hash = window.location.hash.substr(1);
513+
var params = hash ? hash.split('&') : [];
514+
for(var i = 0; i < params.length; i++) {
515+
var pair = params[i].split('=');
516+
if(pair[0] === key) {
517+
return pair[1];
518+
}
519+
}
520+
return null;
521+
}
522+
var setHashValue = function (key, value) {
523+
if(!key || !value) return;
524+
var hash = window.location.hash.substr(1);
525+
var params = hash ? hash.split('&') : [];
526+
527+
var found = false;
528+
for(var i = 0; i < params.length && !found; i++) {
529+
var pair = params[i].split('=');
530+
if(pair[0] === key) {
531+
pair[1] = value;
532+
params[i] = pair.join('=');
533+
found = true;
534+
}
535+
}
536+
if(!found) {
537+
params.push([key, value].join('='));
538+
}
539+
540+
var newHash = params.join('&');
541+
window.location.hash = '#' + newHash;
542+
}
543+
var removeHashValue = function (key) {
544+
if(!key) return;
545+
var hash = window.location.hash.substr(1);
546+
var params = hash ? hash.split('&') : [];
547+
548+
for(var i = 0; i < params.length; i++) {
549+
var pair = params[i].split('=');
550+
if(pair[0] === key) {
551+
params.splice(i, 1);
552+
break;
553+
}
554+
}
555+
556+
var newHash = params.join('&');
557+
window.location.hash = '#' + newHash;
558+
}
479559
// Share scratch paper
480560

481561
var getParameterByName = function (name) {
@@ -523,4 +603,4 @@ var executeDataAndCode = function () {
523603
if (gistID) {
524604
loadScratchPaper(gistID);
525605
}
526-
})();
606+
})();

0 commit comments

Comments
 (0)