1+ require ( [ "gitbook" , "jquery" ] , function ( gitbook , $ ) {
2+ var matcher = / \/ \/ j s f i d d l e .n e t \/ .+ / ;
3+ var localConfig = {
4+ jsfiddle : {
5+ type : 'script' ,
6+ tabs : [ 'js' , 'html' , 'css' , 'result' ] ,
7+ theme : 'light'
8+ }
9+ } ;
10+ var extractConfigFromURL = function ( href ) {
11+ var match = / ( # ) ( .+ ) $ / ig. exec ( href ) ;
12+ if ( match && match [ 2 ] ) {
13+ return match [ 2 ] . split ( '&' ) . reduce ( function ( params , param ) {
14+ var splitParam = param . split ( '=' ) ;
15+ if ( splitParam [ 0 ] === 'tabs' ) {
16+ splitParam [ 1 ] = splitParam [ 1 ] . split ( ',' ) ;
17+ }
18+ params [ splitParam [ 0 ] ] = splitParam [ 1 ] ;
19+ return params ;
20+ } , { } ) ;
21+ }
22+ return { } ;
23+ } ;
24+ var generateAdditionalParams = function ( config ) {
25+ var params = '/' ;
26+ if ( config . theme ) {
27+ params += config . theme + '/' ;
28+ }
29+ var colors = Object . keys ( config ) . reduce ( function ( colors , key ) {
30+
31+ if ( [ 'href' , 'type' , 'theme' , 'tabs' , 'width' , 'height' ] . indexOf ( key ) !== - 1 ) {
32+ return colors ;
33+ }
34+
35+ colors += key + '=' + config [ key ] + '&' ;
36+ return colors ;
37+ } , '' ) ;
38+
39+ colors = colors . replace ( / & $ / , '' ) ;
40+ if ( colors ) {
41+ return params + '?' + colors ;
42+ }
43+ return params ;
44+ } ;
45+
46+ var generateUrl = function ( config ) {
47+ var additionalParam = generateAdditionalParams ( config ) ;
48+ console . log ( additionalParam ) ;
49+ var type = config . type == 'frame' ? 'embedded' : 'embed' ;
50+ return config . href + type + '/' + config . tabs . join ( ',' ) + additionalParam ;
51+ } ;
52+
53+ var creator = {
54+ script : function ( config ) {
55+ var script = document . createElement ( 'script' ) ;
56+ script . src = generateUrl ( config ) ;
57+ script . async = true ;
58+ return script ;
59+ } ,
60+ frame : function ( config ) {
61+ return $ ( [
62+ '<iframe' ,
63+ ' width=' ,
64+ '"' + ( config . width ? config . width : '100%' ) + '"' ,
65+ ' height=' ,
66+ '"' + ( config . height ? config . height : '300' ) + '"' ,
67+ ' src="' + generateUrl ( config ) + '"' ,
68+ ' allowfullscreen="allowfullscreen" frameborder="0"' ,
69+ '>' ,
70+ '</iframe>'
71+ ] . join ( '' ) ) [ 0 ] ;
72+ }
73+ } ;
74+
75+ var createEmbedNode = function ( href , config ) {
76+ var normalURL = href . replace ( / # .+ $ / , '' ) ;
77+ var configFromUrl = extractConfigFromURL ( href ) ;
78+ var mergedConfig = $ . extend ( { href : normalURL } , config , configFromUrl ) ;
79+ return creator [ mergedConfig . type ] ( mergedConfig ) ;
80+ } ;
81+
82+ function embedAllLink ( config ) {
83+ localConfig . jsfiddle = $ . extend ( localConfig . jsfiddle || { } , config . jsfiddle ) ;
84+
85+ $ ( ".book-body a" ) . each ( function ( index , link ) {
86+ if ( link . href && matcher . test ( link . href ) ) {
87+ link . parentNode . insertBefore ( createEmbedNode ( link . href , localConfig . jsfiddle ) , link . nextSibling ) ;
88+ link . parentNode . removeChild ( link ) ;
89+ }
90+ } ) ;
91+ }
92+
93+ gitbook . events . bind ( "start" , function ( e , config ) {
94+ matcher = / ( h t t p | h t t p s ) : \/ \/ j s f i d d l e .n e t \/ .+ / ;
95+ embedAllLink ( config ) ;
96+ } ) ;
97+
98+ gitbook . events . bind ( "page.change" , function ( ) {
99+ if ( matcher ) {
100+ embedAllLink ( localConfig ) ;
101+ }
102+ } ) ;
103+ } ) ;
0 commit comments