@@ -8,6 +8,8 @@ if (!window.fetch) {
8
8
}
9
9
10
10
var $markdownElem = document . querySelector ( '#markdown' ) ;
11
+ var $markedVerElem = document . querySelector ( '#markedVersion' ) ;
12
+ var $markedVer = document . querySelector ( '#markedCdn' ) ;
11
13
var $optionsElem = document . querySelector ( '#options' ) ;
12
14
var $outputTypeElem = document . querySelector ( '#outputType' ) ;
13
15
var $inputTypeElem = document . querySelector ( '#inputType' ) ;
@@ -20,17 +22,20 @@ var $panes = document.querySelectorAll('.pane');
20
22
var $inputPanes = document . querySelectorAll ( '.inputPane' ) ;
21
23
var inputDirty = true ;
22
24
var $activeOutputElem = null ;
23
- var changeTimeout = null ;
24
25
var search = searchToObject ( ) ;
25
26
27
+ var markedVersions = {
28
+ master : 'https://cdn.jsdelivr.net/gh/markedjs/marked/lib/marked.js'
29
+ } ;
30
+ var markedVersionCache = { } ;
31
+
26
32
var iframeLoaded = false ;
27
33
$previewIframe . addEventListener ( 'load' , function ( ) {
28
34
iframeLoaded = true ;
29
35
inputDirty = true ;
30
- checkForChanges ( ) ;
31
36
} ) ;
32
37
33
- if ( 'text' in search ) {
38
+ if ( 'text' in search && search . text ) {
34
39
$markdownElem . value = search . text ;
35
40
} else {
36
41
fetch ( './initial.md' )
@@ -39,25 +44,47 @@ if ('text' in search) {
39
44
if ( $markdownElem . value === '' ) {
40
45
$markdownElem . value = text ;
41
46
inputDirty = true ;
42
- clearTimeout ( changeTimeout ) ;
43
- checkForChanges ( ) ;
44
47
setScrollPercent ( 0 ) ;
45
48
}
46
49
} ) ;
47
50
}
48
51
49
- if ( 'options' in search ) {
50
- $optionsElem . value = search . options ;
51
- } else {
52
- $optionsElem . value = JSON . stringify (
53
- marked . getDefaults ( ) ,
54
- function ( key , value ) {
55
- if ( value && typeof value === 'object' && Object . getPrototypeOf ( value ) !== Object . prototype ) {
56
- 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
+ } , ' ' ) ;
57
85
}
58
- return value ;
59
- } , ' ' ) ;
60
- }
86
+ } ) ;
87
+ } ) ;
61
88
62
89
if ( search . outputType ) {
63
90
$outputTypeElem . value = search . outputType ;
@@ -95,6 +122,7 @@ $outputTypeElem.addEventListener('change', handleOutputChange, false);
95
122
handleOutputChange ( ) ;
96
123
$inputTypeElem . addEventListener ( 'change' , handleInputChange , false ) ;
97
124
handleInputChange ( ) ;
125
+ $markedVerElem . addEventListener ( 'change' , updateVersion , false ) ;
98
126
99
127
function handleInput ( ) {
100
128
inputDirty = true ;
@@ -112,8 +140,17 @@ $optionsElem.addEventListener('keydown', handleInput, false);
112
140
113
141
$clearElem . addEventListener ( 'click' , function ( ) {
114
142
$markdownElem . value = '' ;
115
- $optionsElem . value = '' ;
116
- 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
+ } ) ;
117
154
} , false ) ;
118
155
119
156
function searchToObject ( ) {
@@ -170,14 +207,36 @@ function updateLink() {
170
207
}
171
208
172
209
$permalinkElem . href = '?' + outputType + 'text=' + encodeURIComponent ( $markdownElem . value )
173
- + '&options=' + encodeURIComponent ( $optionsElem . value ) ;
210
+ + '&options=' + encodeURIComponent ( $optionsElem . value )
211
+ + '&version=' + encodeURIComponent ( $markedVerElem . value ) ;
174
212
history . replaceState ( '' , document . title , $permalinkElem . href ) ;
175
213
}
176
214
215
+ function updateVersion ( ) {
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 ) ;
234
+ }
235
+
177
236
var delayTime = 1 ;
178
237
var options = { } ;
179
238
function checkForChanges ( ) {
180
- if ( inputDirty ) {
239
+ if ( inputDirty && typeof marked !== 'undefined' ) {
181
240
inputDirty = false ;
182
241
183
242
updateLink ( ) ;
@@ -225,7 +284,7 @@ function checkForChanges() {
225
284
delayTime = 1000 ;
226
285
}
227
286
}
228
- changeTimeout = window . setTimeout ( checkForChanges , delayTime ) ;
287
+ window . setTimeout ( checkForChanges , delayTime ) ;
229
288
} ;
230
289
checkForChanges ( ) ;
231
290
setScrollPercent ( 0 ) ;
0 commit comments