1
- ( function ( ) {
2
- if ( ! self . Prism || ! self . document || ! document . querySelectorAll || ! [ ] . filter ) return ;
1
+ ( function ( ) {
2
+ if ( ! self . Prism || ! self . document || ! document . querySelectorAll || ! [ ] . filter ) return ;
3
3
4
+ /**
5
+ * The list of adapter which will be used if `data-adapter` is not specified.
6
+ *
7
+ * @type {Array.<(response: any, pre?: HTMLPreElement) => string> }
8
+ */
4
9
var adapters = [ ] ;
10
+
11
+ /**
12
+ * Adds a new function to the list of adapters.
13
+ *
14
+ * If the given adapter is already registered or not a function, nothing will happen.
15
+ *
16
+ * @param {(response: any, pre?: HTMLPreElement) => string } adapter The adapter to be registered.
17
+ */
5
18
function registerAdapter ( adapter ) {
6
19
if ( typeof adapter === "function" && ! getAdapter ( adapter ) ) {
7
20
adapters . push ( adapter ) ;
8
21
}
9
22
}
23
+ /**
24
+ * Returns the given adapter itself, if registered, or a registered adapter with the given function name.
25
+ *
26
+ * If no fitting adapter is registered, `null` will be returned.
27
+ *
28
+ * @param {string|Function } adapter The adapter itself or the function name of an adapter.
29
+ * @returns {(response: any, pre?: HTMLPreElement) => string } A registered adapter or `null`.
30
+ */
10
31
function getAdapter ( adapter ) {
11
32
if ( typeof adapter === "function" ) {
12
- return adapters . filter ( function ( fn ) { return fn . valueOf ( ) === adapter . valueOf ( ) } ) [ 0 ] ;
33
+ return adapters . filter ( function ( fn ) { return fn . valueOf ( ) === adapter . valueOf ( ) ; } ) [ 0 ] ;
13
34
}
14
35
else if ( typeof adapter === "string" && adapter . length > 0 ) {
15
- return adapters . filter ( function ( fn ) { return fn . name === adapter } ) [ 0 ] ;
36
+ return adapters . filter ( function ( fn ) { return fn . name === adapter ; } ) [ 0 ] ;
16
37
}
17
38
return null ;
18
39
}
40
+ /**
41
+ * Remove the given adapter or the first registered adapter with the given function name from the list of
42
+ * registered adapters.
43
+ *
44
+ * @param {string|Function } adapter The adapter itself or the function name of an adapter.
45
+ */
19
46
function removeAdapter ( adapter ) {
20
- if ( typeof adapter === "string" )
47
+ if ( typeof adapter === "string" ) {
21
48
adapter = getAdapter ( adapter ) ;
49
+ }
22
50
if ( typeof adapter === "function" ) {
23
51
var index = adapters . indexOf ( adapter ) ;
24
- if ( index >= 0 ) {
25
- adapters . splice ( index , 1 ) ;
52
+ if ( index >= 0 ) {
53
+ adapters . splice ( index , 1 ) ;
26
54
}
27
55
}
28
56
}
29
57
30
- Prism . plugins . jsonphighlight = {
31
- registerAdapter : registerAdapter ,
32
- removeAdapter : removeAdapter ,
33
- highlight : highlight
34
- } ;
35
58
registerAdapter ( function github ( rsp , el ) {
36
- if ( rsp && rsp . meta && rsp . data ) {
37
- if ( rsp . meta . status && rsp . meta . status >= 400 ) {
38
- return "Error: " + ( rsp . data . message || rsp . meta . status ) ;
59
+ if ( rsp && rsp . meta && rsp . data ) {
60
+ if ( rsp . meta . status && rsp . meta . status >= 400 ) {
61
+ return "Error: " + ( rsp . data . message || rsp . meta . status ) ;
39
62
}
40
- else if ( typeof ( rsp . data . content ) === "string" ) {
41
- return typeof ( atob ) === "function"
63
+ else if ( typeof ( rsp . data . content ) === "string" ) {
64
+ return typeof ( atob ) === "function"
42
65
? atob ( rsp . data . content . replace ( / \s / g, "" ) )
43
66
: "Your browser cannot decode base64" ;
44
67
}
45
68
}
46
69
return null ;
47
70
} ) ;
48
71
registerAdapter ( function gist ( rsp , el ) {
49
- if ( rsp && rsp . meta && rsp . data && rsp . data . files ) {
50
- if ( rsp . meta . status && rsp . meta . status >= 400 ) {
51
- return "Error: " + ( rsp . data . message || rsp . meta . status ) ;
72
+ if ( rsp && rsp . meta && rsp . data && rsp . data . files ) {
73
+ if ( rsp . meta . status && rsp . meta . status >= 400 ) {
74
+ return "Error: " + ( rsp . data . message || rsp . meta . status ) ;
52
75
}
53
- else {
54
- var filename = el . getAttribute ( " data-filename" ) ;
55
- if ( filename == null ) {
56
- // Maybe in the future we can somehow render all files
57
- // But the standard <script> include for gists does that nicely already,
58
- // so that might be getting beyond the scope of this plugin
59
- for ( var key in rsp . data . files ) {
60
- if ( rsp . data . files . hasOwnProperty ( key ) ) {
61
- filename = key ;
62
- break ;
63
- }
76
+
77
+ var files = rsp . data . files ;
78
+ var filename = el . getAttribute ( "data-filename" ) ;
79
+ if ( filename == null ) {
80
+ // Maybe in the future we can somehow render all files
81
+ // But the standard <script> include for gists does that nicely already,
82
+ // so that might be getting beyond the scope of this plugin
83
+ for ( var key in files ) {
84
+ if ( files . hasOwnProperty ( key ) ) {
85
+ filename = key ;
86
+ break ;
64
87
}
65
88
}
66
- if ( rsp . data . files [ filename ] !== undefined ) {
67
- return rsp . data . files [ filename ] . content ;
68
- }
69
- else {
70
- return "Error: unknown or missing gist file " + filename ;
71
- }
72
89
}
90
+
91
+ if ( files [ filename ] !== undefined ) {
92
+ return files [ filename ] . content ;
93
+ }
94
+ return "Error: unknown or missing gist file " + filename ;
73
95
}
74
96
return null ;
75
97
} ) ;
76
98
registerAdapter ( function bitbucket ( rsp , el ) {
77
- return rsp && rsp . node && typeof ( rsp . data ) === "string"
78
- ? rsp . data
79
- : null ;
99
+ if ( rsp && rsp . node && typeof ( rsp . data ) === "string" ) {
100
+ return rsp . data ;
101
+ }
102
+ return null ;
80
103
} ) ;
81
104
82
105
var jsonpcb = 0 ,
83
- loadstr = "Loading… " ;
106
+ loadMsg = "Loading\u2026 " ;
84
107
108
+ /**
109
+ * Highlights all `pre` elements with an `data-jsonp` by requesting the specified JSON and using the specified adapter
110
+ * or a registered adapter to extract the code to highlight from the response. The highlighted code will be inserted
111
+ * into the `pre` element.
112
+ */
85
113
function highlight ( ) {
86
- Array . prototype . slice . call ( document . querySelectorAll ( "pre[data-jsonp]" ) ) . forEach ( function ( pre ) {
114
+ Array . prototype . slice . call ( document . querySelectorAll ( "pre[data-jsonp]" ) ) . forEach ( function ( pre ) {
87
115
pre . textContent = "" ;
88
116
89
117
var code = document . createElement ( "code" ) ;
90
- code . textContent = loadstr ;
118
+ code . textContent = loadMsg ;
91
119
pre . appendChild ( code ) ;
92
120
93
- var adapterfn = pre . getAttribute ( "data-adapter" ) ;
121
+ var adapterName = pre . getAttribute ( "data-adapter" ) ;
94
122
var adapter = null ;
95
- if ( adapterfn ) {
96
- if ( typeof ( window [ adapterfn ] ) === "function" ) {
97
- adapter = window [ adapterfn ] ;
123
+ if ( adapterName ) {
124
+ if ( typeof window [ adapterName ] === "function" ) {
125
+ adapter = window [ adapterName ] ;
98
126
}
99
127
else {
100
- code . textContent = "JSONP adapter function '" + adapterfn + "' doesn't exist" ;
128
+ code . textContent = "JSONP adapter function '" + adapterName + "' doesn't exist" ;
101
129
return ;
102
130
}
103
131
}
104
132
105
- var cb = "prismjsonp" + ( jsonpcb ++ ) ;
106
-
133
+ var cb = "prismjsonp" + jsonpcb ++ ;
134
+
107
135
var uri = document . createElement ( "a" ) ;
108
136
var src = uri . href = pre . getAttribute ( "data-jsonp" ) ;
109
- uri . href += ( uri . search ? "&" : "?" ) + ( pre . getAttribute ( "data-callback" ) || "callback" ) + "=" + cb ;
137
+ uri . href += ( uri . search ? "&" : "?" ) + ( pre . getAttribute ( "data-callback" ) || "callback" ) + "=" + cb ;
110
138
111
- var timeout = setTimeout ( function ( ) {
139
+ var timeout = setTimeout ( function ( ) {
112
140
// we could clean up window[cb], but if the request finally succeeds, keeping it around is a good thing
113
- if ( code . textContent === loadstr )
141
+ if ( code . textContent === loadMsg ) {
114
142
code . textContent = "Timeout loading '" + src + "'" ;
143
+ }
115
144
} , 5000 ) ;
116
-
145
+
117
146
var script = document . createElement ( "script" ) ;
118
147
script . src = uri . href ;
119
148
120
- window [ cb ] = function ( rsp ) {
149
+ window [ cb ] = function ( rsp ) {
121
150
document . head . removeChild ( script ) ;
122
151
clearTimeout ( timeout ) ;
123
152
delete window [ cb ] ;
124
153
125
154
var data = "" ;
126
-
127
- if ( adapter ) {
155
+
156
+ if ( adapter ) {
128
157
data = adapter ( rsp , pre ) ;
129
158
}
130
159
else {
131
- for ( var p in adapters ) {
160
+ for ( var p in adapters ) {
132
161
data = adapters [ p ] ( rsp , pre ) ;
133
- if ( data !== null ) break ;
162
+ if ( data !== null ) {
163
+ break ;
164
+ }
134
165
}
135
166
}
136
167
147
178
} ) ;
148
179
}
149
180
181
+ Prism . plugins . jsonphighlight = {
182
+ registerAdapter : registerAdapter ,
183
+ removeAdapter : removeAdapter ,
184
+ highlight : highlight
185
+ } ;
186
+
150
187
highlight ( ) ;
151
188
} ) ( ) ;
0 commit comments