@@ -22,17 +22,20 @@ var $panes = document.querySelectorAll('.pane');
22
22
var $inputPanes = document . querySelectorAll ( '.inputPane' ) ;
23
23
var inputDirty = true ;
24
24
var $activeOutputElem = null ;
25
- var changeTimeout = null ;
26
25
var search = searchToObject ( ) ;
27
26
27
+ var markedVersions = {
28
+ master : 'https://cdn.jsdelivr.net/gh/markedjs/marked/lib/marked.js'
29
+ } ;
30
+ var markedVersionCache = { } ;
31
+
28
32
var iframeLoaded = false ;
29
33
$previewIframe . addEventListener ( 'load' , function ( ) {
30
34
iframeLoaded = true ;
31
35
inputDirty = true ;
32
- checkForChanges ( ) ;
33
36
} ) ;
34
37
35
- if ( 'text' in search ) {
38
+ if ( 'text' in search && search . text ) {
36
39
$markdownElem . value = search . text ;
37
40
} else {
38
41
fetch ( './initial.md' )
@@ -41,25 +44,47 @@ if ('text' in search) {
41
44
if ( $markdownElem . value === '' ) {
42
45
$markdownElem . value = text ;
43
46
inputDirty = true ;
44
- clearTimeout ( changeTimeout ) ;
45
- checkForChanges ( ) ;
46
47
setScrollPercent ( 0 ) ;
47
48
}
48
49
} ) ;
49
50
}
50
51
51
- if ( 'options' in search ) {
52
- $optionsElem . value = search . options ;
53
- } else {
54
- $optionsElem . value = JSON . stringify (
55
- marked . getDefaults ( ) ,
56
- function ( key , value ) {
57
- if ( value && typeof value === 'object' && Object . getPrototypeOf ( value ) !== Object . prototype ) {
58
- return undefined ;
52
+ fetch ( 'https://data.jsdelivr.com/v1/package/npm/marked' )
53
+ . then ( function ( res ) {
54
+ return res . json ( ) ;
55
+ } )
56
+ . then ( function ( json ) {
57
+ for ( var i = 0 ; i < json . versions . length ; i ++ ) {
58
+ var ver = json . versions [ i ] ;
59
+ markedVersions [ ver ] = 'https://cdn.jsdelivr.net/npm/marked@' + ver + '/lib/marked.js' ;
60
+ var opt = document . createElement ( 'option' ) ;
61
+ opt . textContent = ver ;
62
+ opt . value = ver ;
63
+ $markedVerElem . appendChild ( opt ) ;
64
+ }
65
+ } )
66
+ . then ( function ( ) {
67
+ if ( 'version' in search && search . version ) {
68
+ $markedVerElem . value = search . version ;
69
+ } else {
70
+ $markedVerElem . value = 'master' ;
71
+ }
72
+
73
+ updateVersion ( ) . then ( function ( ) {
74
+ if ( 'options' in search && search . options ) {
75
+ $optionsElem . value = search . options ;
76
+ } else {
77
+ $optionsElem . value = JSON . stringify (
78
+ marked . getDefaults ( ) ,
79
+ function ( key , value ) {
80
+ if ( value && typeof value === 'object' && Object . getPrototypeOf ( value ) !== Object . prototype ) {
81
+ return undefined ;
82
+ }
83
+ return value ;
84
+ } , ' ' ) ;
59
85
}
60
- return value ;
61
- } , ' ' ) ;
62
- }
86
+ } ) ;
87
+ } ) ;
63
88
64
89
if ( search . outputType ) {
65
90
$outputTypeElem . value = search . outputType ;
@@ -80,11 +105,6 @@ function handleOutputChange() {
80
105
updateLink ( ) ;
81
106
}
82
107
83
- function handleVersionChange ( ) {
84
- handleChange ( $markedVer , $markedVerElem . value ) ;
85
- updateVersion ( ) ;
86
- }
87
-
88
108
function handleChange ( panes , visiblePane ) {
89
109
var active = null ;
90
110
for ( var i = 0 ; i < panes . length ; i ++ ) {
@@ -102,8 +122,7 @@ $outputTypeElem.addEventListener('change', handleOutputChange, false);
102
122
handleOutputChange ( ) ;
103
123
$inputTypeElem . addEventListener ( 'change' , handleInputChange , false ) ;
104
124
handleInputChange ( ) ;
105
- $markedVerElem . addEventListener ( 'change' , handleVersionChange , false ) ;
106
- handleVersionChange ( ) ;
125
+ $markedVerElem . addEventListener ( 'change' , updateVersion , false ) ;
107
126
108
127
function handleInput ( ) {
109
128
inputDirty = true ;
@@ -121,8 +140,17 @@ $optionsElem.addEventListener('keydown', handleInput, false);
121
140
122
141
$clearElem . addEventListener ( 'click' , function ( ) {
123
142
$markdownElem . value = '' ;
124
- $optionsElem . value = '' ;
125
- handleInput ( ) ;
143
+ $markedVerElem . value = 'master' ;
144
+ updateVersion ( ) . then ( function ( ) {
145
+ $optionsElem . value = JSON . stringify (
146
+ marked . getDefaults ( ) ,
147
+ function ( key , value ) {
148
+ if ( value && typeof value === 'object' && Object . getPrototypeOf ( value ) !== Object . prototype ) {
149
+ return undefined ;
150
+ }
151
+ return value ;
152
+ } , ' ' ) ;
153
+ } ) ;
126
154
} , false ) ;
127
155
128
156
function searchToObject ( ) {
@@ -179,18 +207,36 @@ function updateLink() {
179
207
}
180
208
181
209
$permalinkElem . href = '?' + outputType + 'text=' + encodeURIComponent ( $markdownElem . value )
182
- + '&options=' + encodeURIComponent ( $optionsElem . value ) ;
210
+ + '&options=' + encodeURIComponent ( $optionsElem . value )
211
+ + '&version=' + encodeURIComponent ( $markedVerElem . value ) ;
183
212
history . replaceState ( '' , document . title , $permalinkElem . href ) ;
184
213
}
185
214
186
215
function updateVersion ( ) {
187
- $markedVer . setAttribute ( 'src' , $markedVerElem . value ) ;
216
+ var promise ;
217
+ if ( $markedVerElem . value in markedVersionCache ) {
218
+ promise = Promise . resolve ( markedVersionCache [ $markedVerElem . value ] ) ;
219
+ } else {
220
+ promise = fetch ( markedVersions [ $markedVerElem . value ] )
221
+ . then ( function ( res ) { return res . text ( ) ; } )
222
+ . then ( function ( text ) {
223
+ markedVersionCache [ $markedVerElem . value ] = text ;
224
+ return text ;
225
+ } ) ;
226
+ }
227
+ return promise . then ( function ( text ) {
228
+ var script = document . createElement ( 'script' ) ;
229
+ script . textContent = text ;
230
+
231
+ $markedVer . parentNode . replaceChild ( script , $markedVer ) ;
232
+ $markedVer = script ;
233
+ } ) . then ( handleInput ) ;
188
234
}
189
235
190
236
var delayTime = 1 ;
191
237
var options = { } ;
192
238
function checkForChanges ( ) {
193
- if ( inputDirty ) {
239
+ if ( inputDirty && typeof marked !== 'undefined' ) {
194
240
inputDirty = false ;
195
241
196
242
updateLink ( ) ;
@@ -238,7 +284,7 @@ function checkForChanges() {
238
284
delayTime = 1000 ;
239
285
}
240
286
}
241
- changeTimeout = window . setTimeout ( checkForChanges , delayTime ) ;
287
+ window . setTimeout ( checkForChanges , delayTime ) ;
242
288
} ;
243
289
checkForChanges ( ) ;
244
290
setScrollPercent ( 0 ) ;
0 commit comments