172172 var promise = ext . load . libs (
173173 'js/dom/$.js' ,
174174 'js/core/datatype.js' ,
175- 'js/dom/menumod/menumod.js' ,
175+ 'js/dom/menumod/menumod.js.api ' ,
176176 'js/dom/keydown/keydown.js' ,
177177 'js/debug/debug.js' ,
178178 ) ;
237237
238238 .visually-hidden
239239 {position : absolute;width : 1px ;height : 1px ;margin : -1px ;padding : 0 ;overflow : hidden;clip : rect (0 0 0 0 );border : 0 }
240+
241+
242+ .menu input
243+ {font-size : 16px ;padding : 5px 10px }
244+
245+ .menu [type = checkbox ]
246+ {width : 20px ;height : 20px ;margin : 0 }
247+
248+ .menu-item
249+ {gap : 20px }
250+
251+ .menu-item .menu-label
252+ {width : 120px ;text-align : right}
240253
241254 </ style >
242255
@@ -266,6 +279,22 @@ <h1 slot=seo-hdr class=visually-hidden>html editor</h1>
266279 < div id =save-menu-root class =menu-root >
267280 < img id =save-menu-icon class =menu-icon >
268281 < div id =save-menu class =menu style ='display:none '>
282+ < div class =menu-title >
283+ save menu
284+ </ div >
285+ < div class =menu-item >
286+ < div class =menu-label >
287+ autosave
288+ </ div >
289+ < input type =checkbox checked >
290+ < input value =300 style ='width:60px '>
291+ </ div >
292+ < div id =trim class =menu-item >
293+ < div class =menu-label >
294+ trim on save
295+ </ div >
296+ < input type =checkbox checked >
297+ </ div >
269298 </ div >
270299 </ div >
271300 </ div >
@@ -311,16 +340,23 @@ <h1 slot=seo-hdr class=visually-hidden>html editor</h1>
311340
312341
313342
314- var slider = { } ;
343+ var slider = { } ;
315344
316- var ui = { } ;
317- ui . mode = 'vert' ;
345+ var ui = { } ;
346+ ui . mode = 'vert' ;
347+ ui . trim = null ;
318348
349+ var savemenu ;
350+ var savetimer = { } ;
351+ savetimer . timer = null ;
352+ savetimer . chk = null ;
353+ savetimer . time = null ;
354+ savetimer . onclick = null ;
319355
320356
321- var btn = { } ;
322- var on = { } ;
323- var set = { } ;
357+ var btn = { } ;
358+ var on = { } ;
359+ var set = { } ;
324360
325361
326362
@@ -343,12 +379,19 @@ <h1 slot=seo-hdr class=visually-hidden>html editor</h1>
343379 filemod . initdom ( root ) ;
344380
345381
382+ autosave = $ ( root , '#autosave' ) ;
383+
346384 $ ( root , '#save' ) . onclick = btn . save ;
347385
348- var card = $ ( root , '#save-root .menu' ) ;
349- $ ( root , '.menu-icon' ) . onclick = menu . click ( card , false , false ) ;
386+ savemenu = $ ( root , '#save-root .menu' ) ;
387+ $ ( root , '.menu-icon' ) . onclick = menu . click ( savemenu , false , false , savemenu_callback ) ;
388+ menu . input . norm ( savemenu ) ;
350389
351- autosave = $ ( root , '#autosave' ) ;
390+ savetimer . chk = $ ( savemenu , ':scope>div:nth-of-type(2) [type=checkbox]' ) ;
391+ savetimer . time = $ ( savemenu , ':scope>div:nth-of-type(2) input:not([type])' ) ;
392+ savetimer . chk . onclick = savetimer . onclick ;
393+
394+ ui . trim = $ ( savemenu , ':scope>div:nth-of-type(3) [type=checkbox]' ) ;
352395
353396
354397 publish . initdom ( ) ;
@@ -393,6 +436,61 @@ <h1 slot=seo-hdr class=visually-hidden>html editor</h1>
393436 } //focus
394437
395438
439+ function savemenu_kd ( e ) {
440+ console . log ( e . target ) ;
441+ if ( e . target . nodeName == 'INPUT' ) {
442+ return ;
443+ }
444+ return false ;
445+
446+ } //savemenu_kd
447+
448+
449+ function savemenu_callback ( type ) {
450+ console . log ( 'savemenu_callback' , arguments ) ;
451+ if ( type == 'show' ) {
452+ $ ( savemenu , ':scope>div:nth-of-type(2) input:not([type])' ) . focus ( ) ;
453+ keydown . add ( savemenu_kd ) ;
454+ }
455+ if ( type == 'hide' ) {
456+ keydown . rem ( savemenu_kd ) ;
457+ }
458+
459+ } //savemenu_callback
460+
461+
462+ savetimer . onclick = function ( ) {
463+ debug ( 'savetimer.click' ) ;
464+ clearTimeout ( savetimer . timer ) ;
465+
466+ if ( savetimer . chk . checked ) {
467+ var value = savetimer . time . value ;
468+ value = Number ( value ) ;
469+ if ( isNaN ( value ) ) {
470+ log . red ( 'invalid autosave time, using 300s' ) ;
471+ value = 300 ;
472+ }
473+ fn ( ) ;
474+ }
475+
476+
477+ function fn ( ) {
478+
479+ if ( ! autosave . checked ) {
480+ return ;
481+ }
482+ debug ( 'savetimer' , value ) ;
483+ btn . save ( ) ;
484+ if ( savetimer . chk . checked ) {
485+ var ms = value * 1000 ;
486+ setTimeout ( fn , ms ) ;
487+ }
488+
489+ } //fn
490+
491+ } //savetimer
492+
493+
396494 //:
397495
398496
@@ -495,6 +593,24 @@ <h1 slot=seo-hdr class=visually-hidden>html editor</h1>
495593 function source ( file ) {
496594
497595 var txt = editor . getValue ( ) ;
596+
597+ if ( ui . trim . checked ) {
598+ var indent = 0 ;
599+ var lines = txt . split ( '\n' ) ;
600+ lines = lines . map ( line => {
601+
602+ line = line . trimEnd ( ) ;
603+ if ( line . length == 0 ) {
604+ line = line . padStart ( indent , ' ' ) ;
605+ }
606+ var match = line . match ( / ^ \s * / ) ;
607+ indent = match ? match [ 0 ] . length : indent ;
608+ return line ;
609+
610+ } ) ;
611+ txt = lines . join ( '\n' ) ;
612+ }
613+
498614 var blob = new Blob ( [ txt ] ) ;
499615 return blob ;
500616
@@ -507,7 +623,7 @@ <h1 slot=seo-hdr class=visually-hidden>html editor</h1>
507623 editor . filename ( file ) ;
508624 editor . filename . save . hide ( ) ;
509625 filemod . cur = file ;
510- var title = file . name || file . filename ;
626+ var title = file . name || file . filename ;
511627 set . title ( title ) ;
512628 set . favicon ( icon . def ) ;
513629 }
0 commit comments