@@ -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