@@ -176,7 +176,6 @@ function emojify (text) {
176
176
}
177
177
178
178
179
-
180
179
var utils = Object . freeze ( {
181
180
load : load ,
182
181
genTree : genTree ,
@@ -208,7 +207,9 @@ function scrollActiveSidebar () {
208
207
209
208
for ( var i = 0 , len = lis . length ; i < len ; i += 1 ) {
210
209
var li = lis [ i ] ;
211
- var href = li . querySelector ( 'a' ) . getAttribute ( 'href' ) ;
210
+ var a = li . querySelector ( 'a' ) ;
211
+ if ( ! a ) { continue }
212
+ var href = a . getAttribute ( 'href' ) ;
212
213
213
214
if ( href !== '/' ) {
214
215
var match = href . match ( '#([^#]+)$' ) ;
@@ -322,10 +323,12 @@ function bindToggle (dom) {
322
323
}
323
324
}
324
325
326
+ var scrollingElement = document . scrollingElement || document . documentElement ;
327
+
325
328
function scroll2Top ( offset ) {
326
329
if ( offset === void 0 ) offset = 0 ;
327
330
328
- document . body . scrollTop = offset === true ? 0 : Number ( offset ) ;
331
+ scrollingElement . scrollTop = offset === true ? 0 : Number ( offset ) ;
329
332
}
330
333
331
334
function sticky ( ) {
@@ -2543,6 +2546,7 @@ function cssVars () {
2543
2546
var markdown = marked ;
2544
2547
var toc = [ ] ;
2545
2548
var CACHE = { } ;
2549
+ var originTitle = document . title ;
2546
2550
2547
2551
var renderTo = function ( dom , content ) {
2548
2552
dom = typeof dom === 'object' ? dom : document . querySelector ( dom ) ;
@@ -2579,10 +2583,9 @@ function init () {
2579
2583
return ( "<pre v-pre data-lang=\"" + lang + "\"><code class=\"lang-" + lang + "\">" + hl + "</code></pre>" )
2580
2584
} ;
2581
2585
renderer . link = function ( href , title , text ) {
2582
- if ( ! / : / . test ( href ) ) {
2586
+ if ( ! / : | ( \/ { 2 } ) / . test ( href ) ) {
2583
2587
href = ( "#/" + href ) . replace ( / \/ + / g, '/' ) ;
2584
2588
}
2585
-
2586
2589
return ( "<a href=\"" + href + "\" title=\"" + ( title || '' ) + "\">" + text + "</a>" )
2587
2590
} ;
2588
2591
renderer . paragraph = function ( text ) {
@@ -2593,11 +2596,19 @@ function init () {
2593
2596
}
2594
2597
return ( "<p>" + text + "</p>" )
2595
2598
} ;
2599
+ renderer . image = function ( href , title , text ) {
2600
+ var url = / : | ( \/ { 2 } ) / . test ( href ) ? href : ( $docsify . basePath + href ) . replace ( / \/ + / g, '/' ) ;
2601
+ var titleHTML = title ? ( " title=\"" + title + "\"" ) : '' ;
2602
+
2603
+ return ( "<img src=\"" + url + "\" alt=\"" + text + "\"" + titleHTML + " />" )
2604
+ } ;
2596
2605
2597
2606
if ( typeof $docsify . markdown === 'function' ) {
2598
- markdown . setOptions ( { renderer : renderer } ) ;
2599
- markdown = $docsify . markdown . call ( this , markdown ) ;
2607
+ markdown = $docsify . markdown . call ( this , markdown , renderer ) ;
2600
2608
} else {
2609
+ if ( $docsify . markdown && $docsify . markdown . renderer ) {
2610
+ $docsify . markdown . renderer = merge ( renderer , $docsify . markdown . renderer ) ;
2611
+ }
2601
2612
markdown . setOptions ( merge ( { renderer : renderer } , $docsify . markdown ) ) ;
2602
2613
}
2603
2614
@@ -2653,25 +2664,34 @@ function renderApp (dom, replace) {
2653
2664
* article
2654
2665
*/
2655
2666
function renderArticle ( content ) {
2656
- renderTo ( 'article' , content ? markdown ( content ) : 'not found' ) ;
2657
- if ( ! $docsify . loadSidebar ) { renderSidebar ( ) ; }
2658
-
2659
- if ( content && typeof Vue !== 'undefined' ) {
2660
- CACHE . vm && CACHE . vm . $destroy ( ) ;
2661
-
2662
- var script = [ ] . slice . call (
2663
- document . body . querySelectorAll ( 'article>script' ) )
2664
- . filter ( function ( script ) { return ! / t e m p l a t e / . test ( script . type ) ; }
2665
- ) [ 0 ] ;
2666
- var code = script ? script . innerText . trim ( ) : null ;
2667
-
2668
- script && script . remove ( ) ;
2669
- CACHE . vm = code
2670
- ? new Function ( ( "return " + code ) ) ( )
2671
- : new Vue ( { el : 'main' } ) ; // eslint-disable-line
2672
- CACHE . vm && CACHE . vm . $nextTick ( function ( _ ) { return scrollActiveSidebar ( ) ; } ) ;
2673
- }
2674
- if ( $docsify . auto2top ) { setTimeout ( function ( ) { return scroll2Top ( $docsify . auto2top ) ; } , 0 ) ; }
2667
+ var hook = window . Docsify . hook ;
2668
+ var renderFn = function ( data ) {
2669
+ renderTo ( 'article' , data ) ;
2670
+ if ( ! $docsify . loadSidebar ) { renderSidebar ( ) ; }
2671
+
2672
+ if ( data && typeof Vue !== 'undefined' ) {
2673
+ CACHE . vm && CACHE . vm . $destroy ( ) ;
2674
+
2675
+ var script = [ ] . slice . call (
2676
+ document . body . querySelectorAll ( 'article>script' ) )
2677
+ . filter ( function ( script ) { return ! / t e m p l a t e / . test ( script . type ) ; }
2678
+ ) [ 0 ] ;
2679
+ var code = script ? script . innerText . trim ( ) : null ;
2680
+
2681
+ script && script . remove ( ) ;
2682
+ CACHE . vm = code
2683
+ ? new Function ( ( "return " + code ) ) ( )
2684
+ : new Vue ( { el : 'main' } ) ; // eslint-disable-line
2685
+ CACHE . vm && CACHE . vm . $nextTick ( function ( _ ) { return scrollActiveSidebar ( ) ; } ) ;
2686
+ }
2687
+ if ( $docsify . auto2top ) { setTimeout ( function ( ) { return scroll2Top ( $docsify . auto2top ) ; } , 0 ) ; }
2688
+ } ;
2689
+
2690
+ hook . emit ( 'before' , content , function ( result ) {
2691
+ var html = result ? markdown ( result ) : '' ;
2692
+
2693
+ hook . emit ( 'after' , html , function ( result ) { return renderFn ( result || 'not found' ) ; } ) ;
2694
+ } ) ;
2675
2695
}
2676
2696
2677
2697
/**
@@ -2700,15 +2720,21 @@ function renderSidebar (content) {
2700
2720
}
2701
2721
2702
2722
renderTo ( '.sidebar-nav' , html ) ;
2723
+
2724
+ if ( toc [ 0 ] && toc [ 0 ] . level === 1 ) {
2725
+ document . title = "" + ( toc [ 0 ] . title ) + ( originTitle ? ' - ' + originTitle : '' ) ;
2726
+ }
2727
+
2703
2728
var target = activeLink ( '.sidebar-nav' , true ) ;
2704
2729
if ( target ) { renderSubSidebar ( target ) ; }
2705
- toc = [ ] ;
2706
2730
2731
+ toc = [ ] ;
2707
2732
scrollActiveSidebar ( ) ;
2708
2733
}
2709
2734
2710
2735
function renderSubSidebar ( target ) {
2711
2736
if ( ! $docsify . subMaxLevel ) { return }
2737
+ toc [ 0 ] && toc [ 0 ] . level === 1 && toc . shift ( ) ;
2712
2738
target . parentNode . innerHTML += tree ( genTree ( toc , $docsify . subMaxLevel ) , '<ul>' ) ;
2713
2739
}
2714
2740
@@ -2787,6 +2813,57 @@ function renderLoading (ref) {
2787
2813
}
2788
2814
}
2789
2815
2816
+ var Hook = function Hook ( ) {
2817
+ this . beforeHooks = [ ] ;
2818
+ this . afterHooks = [ ] ;
2819
+ this . initHooks = [ ] ;
2820
+ this . readyHooks = [ ] ;
2821
+ } ;
2822
+
2823
+ Hook . prototype . beforeEach = function beforeEach ( fn ) {
2824
+ this . beforeHooks . push ( fn ) ;
2825
+ } ;
2826
+
2827
+ Hook . prototype . afterEach = function afterEach ( fn ) {
2828
+ this . afterHooks . push ( fn ) ;
2829
+ } ;
2830
+
2831
+ Hook . prototype . init = function init ( fn ) {
2832
+ this . initHooks . push ( fn ) ;
2833
+ } ;
2834
+
2835
+ Hook . prototype . ready = function ready ( fn ) {
2836
+ this . readyHooks . push ( fn ) ;
2837
+ } ;
2838
+
2839
+ Hook . prototype . emit = function emit ( name , data , next ) {
2840
+ var newData = data ;
2841
+ var queue = this [ name + 'Hooks' ] ;
2842
+ var step = function ( index ) {
2843
+ var hook = queue [ index ] ;
2844
+ if ( index >= queue . length ) {
2845
+ next && next ( newData ) ;
2846
+ } else {
2847
+ if ( typeof hook === 'function' ) {
2848
+ if ( hook . length === 2 ) {
2849
+ hook ( data , function ( result ) {
2850
+ newData = result ;
2851
+ step ( index + 1 ) ;
2852
+ } ) ;
2853
+ } else {
2854
+ var result = hook ( data ) ;
2855
+ newData = result !== undefined ? result : newData ;
2856
+ step ( index + 1 ) ;
2857
+ }
2858
+ } else {
2859
+ step ( index + 1 ) ;
2860
+ }
2861
+ }
2862
+ } ;
2863
+
2864
+ step ( 0 ) ;
2865
+ } ;
2866
+
2790
2867
var OPTIONS = merge ( {
2791
2868
el : '#app' ,
2792
2869
repo : '' ,
@@ -2818,11 +2895,14 @@ if (script) {
2818
2895
if ( OPTIONS . name === true ) { OPTIONS . name = '' ; }
2819
2896
}
2820
2897
2898
+ var hook = new Hook ( ) ;
2899
+
2821
2900
// utils
2822
2901
window . $docsify = OPTIONS ;
2823
2902
window . Docsify = {
2824
2903
installed : true ,
2825
- utils : merge ( { } , utils )
2904
+ utils : merge ( { } , utils ) ,
2905
+ hook : hook
2826
2906
} ;
2827
2907
2828
2908
// load options
@@ -2831,22 +2911,39 @@ init();
2831
2911
var cacheRoute = null ;
2832
2912
var cacheXhr = null ;
2833
2913
2914
+ var getAlias = function ( route ) {
2915
+ if ( OPTIONS . alias [ route ] ) {
2916
+ return getAlias ( OPTIONS . alias [ route ] )
2917
+ } else {
2918
+ return route
2919
+ }
2920
+ } ;
2921
+
2834
2922
var mainRender = function ( cb ) {
2835
- var route = OPTIONS . basePath + getRoute ( ) ;
2923
+ var page ;
2924
+ var route = getRoute ( ) ;
2836
2925
if ( cacheRoute === route ) { return cb ( ) }
2837
2926
2838
- var basePath = cacheRoute = route ;
2927
+ var basePath = cacheRoute = OPTIONS . basePath + route ;
2839
2928
2840
2929
if ( ! / \/ / . test ( basePath ) ) {
2841
2930
basePath = '' ;
2842
2931
} else if ( basePath && ! / \/ $ / . test ( basePath ) ) {
2843
2932
basePath = basePath . match ( / ( \S * \/ ) [ ^ \/ ] + $ / ) [ 1 ] ;
2844
2933
}
2845
2934
2846
- var page ;
2935
+ // replace route
2936
+ route = '/' + route ;
2937
+ if ( OPTIONS . alias && OPTIONS . alias [ route ] ) {
2938
+ route = getAlias ( route ) ;
2939
+ } else {
2940
+ route = ( OPTIONS . basePath + route ) . replace ( / \/ + / , '/' ) ;
2941
+ }
2847
2942
2848
2943
if ( ! route ) {
2849
2944
page = OPTIONS . homepage || 'README.md' ;
2945
+ } else if ( / \. m d $ / . test ( route ) ) {
2946
+ page = route ;
2850
2947
} else if ( / \/ $ / . test ( route ) ) {
2851
2948
page = route + "README.md" ;
2852
2949
} else {
@@ -2884,21 +2981,26 @@ var mainRender = function (cb) {
2884
2981
} ;
2885
2982
2886
2983
var Docsify = function ( ) {
2887
- var dom = document . querySelector ( OPTIONS . el ) || document . body ;
2888
- var replace = dom !== document . body ;
2889
- var main = function ( ) {
2890
- mainRender ( function ( _ ) {
2891
- scrollIntoView ( ) ;
2892
- activeLink ( 'nav' )
2893
- ; [ ] . concat ( window . $docsify . plugins ) . forEach ( function ( fn ) { return fn && fn ( ) ; } ) ;
2894
- } ) ;
2895
- } ;
2984
+ setTimeout ( function ( _ ) {
2985
+ [ ] . concat ( OPTIONS . plugins ) . forEach ( function ( fn ) { return typeof fn === 'function' && fn ( hook ) ; } ) ;
2986
+ window . Docsify . hook . emit ( 'init' ) ;
2987
+
2988
+ var dom = document . querySelector ( OPTIONS . el ) || document . body ;
2989
+ var replace = dom !== document . body ;
2990
+ var main = function ( ) {
2991
+ mainRender ( function ( _ ) {
2992
+ scrollIntoView ( ) ;
2993
+ activeLink ( 'nav' ) ;
2994
+ } ) ;
2995
+ } ;
2896
2996
2897
- // Render app
2898
- renderApp ( dom , replace ) ;
2899
- main ( ) ;
2900
- if ( ! / ^ # \/ / . test ( window . location . hash ) ) { window . location . hash = '#/' ; }
2901
- window . addEventListener ( 'hashchange' , main ) ;
2997
+ // Render app
2998
+ renderApp ( dom , replace ) ;
2999
+ main ( ) ;
3000
+ if ( ! / ^ # \/ / . test ( window . location . hash ) ) { window . location . hash = '#/' ; }
3001
+ window . addEventListener ( 'hashchange' , main ) ;
3002
+ window . Docsify . hook . emit ( 'ready' ) ;
3003
+ } , 0 ) ;
2902
3004
} ;
2903
3005
2904
3006
var index = Docsify ( ) ;
0 commit comments