2015-06-22 21:31:26 -05:00
/ * !
2015-07-14 16:12:34 -05:00
* SimpleMDE v1 . 3.1 ( https : //github.com/NextStepWebs/simplemde-markdown-editor)
2015-06-22 21:31:26 -05:00
* Copyright Next Step Webs , Inc .
* Licensed under the MIT license
* /
2015-07-14 16:12:34 -05:00
function fixShortcut ( e ) { return e = isMac ? e . replace ( "Ctrl" , "Cmd" ) : e . replace ( "Cmd" , "Ctrl" ) } function createIcon ( e , t ) { e = e || { } ; var n = document . createElement ( "a" ) ; return t = void 0 == t ? ! 0 : t , e . title && t && ( n . title = e . title , isMac && ( n . title = n . title . replace ( "Ctrl" , "⌘" ) , n . title = n . title . replace ( "Alt" , "⌥" ) ) ) , n . className = e . className , n } function createSep ( ) { return el = document . createElement ( "i" ) , el . className = "separator" , el . innerHTML = "|" , el } function getState ( e , t ) { t = t || e . getCursor ( "start" ) ; var n = e . getTokenAt ( t ) ; if ( ! n . type ) return { } ; for ( var r , i , o = n . type . split ( " " ) , l = { } , s = 0 ; s < o . length ; s ++ ) r = o [ s ] , "strong" === r ? l . bold = ! 0 : "variable-2" === r ? ( i = e . getLine ( t . line ) , /^\s*\d+\.\s/ . test ( i ) ? l [ "ordered-list" ] = ! 0 : l [ "unordered-list" ] = ! 0 ) : "atom" === r ? l . quote = ! 0 : "em" === r ? l . italic = ! 0 : "quote" === r && ( l . quote = ! 0 ) ; return l } function toggleFullScreen ( e ) { var t = e . codemirror . getWrapperElement ( ) , n = document , r = n . fullScreen || n . mozFullScreen || n . webkitFullScreen , i = function ( ) { t . requestFullScreen ? t . requestFullScreen ( ) : t . mozRequestFullScreen ? t . mozRequestFullScreen ( ) : t . webkitRequestFullScreen && t . webkitRequestFullScreen ( Element . ALLOW _KEYBOARD _INPUT ) } , o = function ( ) { n . cancelFullScreen ? n . cancelFullScreen ( ) : n . mozCancelFullScreen ? n . mozCancelFullScreen ( ) : n . webkitCancelFullScreen && n . webkitCancelFullScreen ( ) } ; r ? o && o ( ) : i ( ) } function toggleBold ( e ) { _toggleBlock ( e , "bold" , "**" ) } function toggleItalic ( e ) { _toggleBlock ( e , "italic" , "*" ) } function toggleCodeBlock ( e ) { _toggleBlock ( e , "code" , "```\r\n" , "\r\n```" ) } function toggleBlockquote ( e ) { var t = e . codemirror ; _toggleLine ( t , "quote" ) } function toggleUnorderedList ( e ) { var t = e . codemirror ; _toggleLine ( t , "unordered-list" ) } function toggleOrderedList ( e ) { var t = e . codemirror ; _toggleLine ( t , "ordered-list" ) } function drawLink ( e ) { var t = e . codemirror , n = getState ( t ) ; _replaceSelection ( t , n . link , "[" , "](http://)" ) } function drawImage ( e ) { var t = e . codemirror , n = getState ( t ) ; _replaceSelection ( t , n . image , "" ) } function drawHorizontalRule ( e ) { var t = e . codemirror , n = getState ( t ) ; _replaceSelection ( t , n . image , "" , "\n\n-----\n\n" ) } function undo ( e ) { var t = e . codemirror ; t . undo ( ) , t . focus ( ) } function redo ( e ) { var t = e . codemirror ; t . redo ( ) , t . focus ( ) } function togglePreview ( e ) { var t = document . getElementsByClassName ( "editor-toolbar" ) [ 0 ] , n = e . toolbar . preview , r = e . constructor . markdown , i = e . codemirror , o = i . getWrapperElement ( ) , l = o . lastChild ; /editor-preview/ . test ( l . className ) || ( l = document . createElement ( "div" ) , l . className = "editor-preview" , o . appendChild ( l ) ) , /editor-preview-active/ . test ( l . className ) ? ( l . className = l . className . replace ( /\s*editor-preview-active\s*/g , "" ) , n . className = n . className . replace ( /\s*active\s*/g , "" ) , t . className = t . className . replace ( /\s*disabled-for-preview\s*/g , "" ) ) : ( setTimeout ( function ( ) { l . className += " editor-preview-active" } , 1 ) , n . className += " active" , t . className += " disabled-for-preview" ) ; var s = i . getValue ( ) ; l . innerHTML = r ( s ) } function _replaceSelection ( e , t , n , r ) { if ( ! /editor-preview-active/ . test ( e . getWrapperElement ( ) . lastChild . className ) ) { var i , o = e . getCursor ( "start" ) , l = e . getCursor ( "end" ) ; t ? ( i = e . getLine ( o . line ) , n = i . slice ( 0 , o . ch ) , r = i . slice ( o . ch ) , e . replaceRange ( n + r , { line : o . line , ch : 0 } ) ) : ( i = e . getSelection ( ) , e . replaceSelection ( n + i + r ) , o . ch += n . length , l . ch += n . length ) , e . setSelection ( o , l ) , e . focus ( ) } } function _toggleLine ( e , t ) { if ( ! /editor-preview-active/ . test ( e . getWrapperElement ( ) . lastChild . className ) ) { for ( var n = getState ( e ) , r = e . getCursor ( "start" ) , i = e . getCursor ( "end" ) , o = { quote : /^(\s*)\>\s+/ , "unordered-list" : /^(\s*)(\*|\-|\+)\s+/ , "ordered-list" : /^(\s*)\d+\.\s+/ } , l = { quote : "> " , "unordered-list" : "* " , "ordered-list" : "1. " } , s = r . line ; s <= i . line ; s ++ ) ! function ( r ) { var i = e . getLine ( r ) ; i = n [ t ] ? i . replace ( o [ t ] , "$1" ) : l [ t ] + i , e . replaceRange ( i , { line : r , ch : 0 } , { line : r , ch : 99999999999999 } ) } ( s ) ; e . focus ( ) } } function _toggleBlock ( e , t , n , r ) { if ( ! /editor-preview-active/ . test ( e . codemirror . getWrapperElement ( ) . lastChild . className ) ) { r = "undefined" == typeof r ? n : r ; var i , o = e . codemirror , l = getState ( o ) , s = n , a = r , u = o . getCursor ( "start" ) , c = o . getCursor ( "end" ) ; l [ t ] ? ( i = o . getLine ( u . line ) , s = i . slice ( 0 , u . ch ) , a = i . slice ( u . ch ) , "bold" == t ? ( s = s . replace ( /(\*\*|__)(?![\s\S]*(\*\*|__))/ , "" ) , a = a . replace ( /(\*\*|__)/ , "" ) ) : "italic" == t && ( s = s . replace ( /(\*|_)(?![\s\S]*(\*|_))/ , "" ) , a = a . replace ( / ( \
} function Bt ( e ) { var t = e . doc ; if ( t . frontier < t . first && ( t . frontier = t . first ) , ! ( t . frontier >= e . display . viewTo ) ) { var n = + new Date + e . options . workTime , r = ns ( t . mode , Rt ( e , t . frontier ) ) , i = [ ] ; t . iter ( t . frontier , Math . min ( t . first + t . size , e . display . viewTo + 500 ) , function ( o ) { if ( t . frontier >= e . display . viewFrom ) { var l = o . styles , s = Oi ( e , o , r , ! 0 ) ; o . styles = s . styles ; var a = o . styleClasses , u = s . classes ; u ? o . styleClasses = u : a && ( o . styleClasses = null ) ; for ( var c = ! l || l . length != o . styles . length || a != u && ( ! a || ! u || a . bgClass != u . bgClass || a . textClass != u . textClass ) , h = 0 ; ! c && h < l . length ; ++ h ) c = l [ h ] != o . styles [ h ] ; c && i . push ( t . frontier ) , o . stateAfter = ns ( t . mode , r ) } else Hi ( e , o . text , r ) , o . stateAfter = t . frontier % 5 == 0 ? ns ( t . mode , r ) : null ; return ++ t . frontier , + new Date > n ? ( Ft ( e , e . options . workDelay ) , ! 0 ) : void 0 } ) , i . length && An ( e , function ( ) { for ( var t = 0 ; t < i . length ; t ++ ) Pn ( e , i [ t ] , "text" ) } ) } } function _t ( e , t , n ) { for ( var r , i , o = e . doc , l = n ? - 1 : t - ( e . doc . mode . innerMode ? 1e3 : 100 ) , s = t ; s > l ; -- s ) { if ( s <= o . first ) return o . first ; var a = Ki ( o , s - 1 ) ; if ( a . stateAfter && ( ! n || s <= o . frontier ) ) return s ; var u = Hs ( a . text , null , e . options . tabSize ) ; ( null == i || r > u ) && ( i = s - 1 , r = u ) } return i } function Rt ( e , t , n ) { var r = e . doc , i = e . display ; if ( ! r . mode . startState ) return ! 0 ; var o = _t ( e , t , n ) , l = o > r . first && Ki ( r , o - 1 ) . stateAfter ; return l = l ? ns ( r . mode , l ) : rs ( r . mode ) , r . iter ( o , t , function ( n ) { Hi ( e , n . text , l ) ; var s = o == t - 1 || o % 5 == 0 || o >= i . viewFrom && o < i . viewTo ; n . stateAfter = s ? ns ( r . mode , l ) : null , ++ o } ) , n && ( r . frontier = o ) , l } function qt ( e ) { return e . lineSpace . offsetTop } function Gt ( e ) { return e . mover . offsetHeight - e . lineSpace . offsetHeight } function Ut ( e ) { if ( e . cachedPaddingH ) return e . cachedPaddingH ; var t = qo ( e . measure , _o ( "pre" , "x" ) ) , n = window . getComputedStyle ? window . getComputedStyle ( t ) : t . currentStyle , r = { left : parseInt ( n . paddingLeft ) , right : parseInt ( n . paddingRight ) } ; return isNaN ( r . left ) || isNaN ( r . right ) || ( e . cachedPaddingH = r ) , r } function $t ( e ) { return Ns - e . display . nativeBarWidth } function jt ( e ) { return e . display . scroller . clientWidth - $t ( e ) - e . display . barWidth } function Vt ( e ) { return e . display . scroller . clientHeight - $t ( e ) - e . display . barHeight } function Kt ( e , t , n ) { var r = e . options . lineWrapping , i = r && jt ( e ) ; if ( ! t . measure . heights || r && t . measure . width != i ) { var o = t . measure . heights = [ ] ; if ( r ) { t . measure . width = i ; for ( var l = t . text . firstChild . getClientRects ( ) , s = 0 ; s < l . length - 1 ; s ++ ) { var a = l [ s ] , u = l [ s + 1 ] ; Math . abs ( a . bottom - u . bottom ) > 2 && o . push ( ( a . bottom + u . top ) / 2 - n . top ) } } o . push ( n . bottom - n . top ) } } function Xt ( e , t , n ) { if ( e . line == t ) return { map : e . measure . map , cache : e . measure . cache } ; for ( var r = 0 ; r < e . rest . length ; r ++ ) if ( e . rest [ r ] == t ) return { map : e . measure . maps [ r ] , cache : e . measure . caches [ r ] } ; for ( var r = 0 ; r < e . rest . length ; r ++ ) if ( Qi ( e . rest [ r ] ) > n ) return { map : e . measure . maps [ r ] , cache : e . measure . caches [ r ] , before : ! 0 } } function Yt ( e , t ) { t = gi ( t ) ; var n = Qi ( t ) , r = e . display . externalMeasured = new Hn ( e . doc , t , n ) ; r . lineN = n ; var i = r . built = Ii ( e , r ) ; return r . text = i . pre , qo ( e . display . lineMeasure , i . pre ) , r } function Zt ( e , t , n , r ) { return en ( e , Jt ( e , t ) , n , r ) } function Qt ( e , t ) { if ( t >= e . display . viewFrom && t < e . display . viewTo ) return e . display . view [ Fn ( e , t ) ] ; var n = e . display . externalMeasured ; return n && t >= n . lineN && t < n . lineN + n . size ? n : void 0 } function Jt ( e , t ) { var n = Qi ( t ) , r = Qt ( e , n ) ; r && ! r . text ? r = null : r && r . changes && I ( e , r , n , H ( e ) ) , r || ( r = Yt ( e , t ) ) ; var i = Xt ( r , t , n ) ; return { line : t , view : r , rect : null , map : i . map , cache : i . cache , before : i . before , hasHeights : ! 1 } } function en ( e , t , n , r , i ) { t . before && ( n = - 1 ) ; var o , l = n + ( r || "" ) ; return t . cache . hasOwnProperty ( l ) ? o = t . cache [ l ] : ( t . rect || ( t . rect = t . view . text . getBoundingClientRect ( ) ) , t . hasHeights || ( Kt ( e , t . view , t . rect ) , t . hasHeights = ! 0 ) , o = nn ( e , t , n , r ) , o . bogus || ( t . cache [ l ] = o ) ) , { left : o . left , right : o . right , top : i ? o . rtop : o . top , bottom : i ? o . rbottom : o . bottom } } function tn ( e , t , n ) { for ( var r , i , o , l , s = 0 ; s < e . length ; s += 3 ) { var a = e [ s ] , u = e [ s + 1 ] ; if ( a > t ? ( i = 0 , o = 1 , l = "left" ) : u > t ? ( i = t - a , o = i + 1 ) : ( s == e . length - 3 || t == u && e [ s + 3 ] > t ) && ( o = u - a , i = o - 1 , t >= u && ( l = "right" ) ) , null != i ) { if ( r = e [ s + 2 ] , a == u && n == ( r . insertLeft ? "left" : "right" ) && ( l = n ) , "left" == n && 0 == i ) for ( ; s && e [ s - 2 ] == e [ s - 3 ] && e [ s - 1 ] . insertLeft ; ) r = e [ ( s -= 3 ) + 2 ] , l = "left" ; if ( "right" == n && i == u - a ) for ( ; s < e . length - 3 && e [ s + 3 ] == e [ s + 4 ] && ! e [ s + 5 ] . insertLeft ; ) r = e [ ( s += 3 ) + 2 ] , l = "right" ; break } } return { node : r , start : i , end : o , collapse : l , coverStart : a , coverEnd : u } } function nn ( e , t , n , r ) { var i , o = tn ( t . map , n , r ) , l = o . node ,
} ) ) , r . sel . contains ( t . from , t . to ) > - 1 && So ( e ) , Gi ( r , t , n , o ( e ) ) , e . options . lineWrapping || ( r . iter ( u , l . line + t . text . length , function ( e ) { var t = h ( e ) ; t > i . maxLineLength && ( i . maxLine = e , i . maxLineLength = t , i . maxLineChanged = ! 0 , a = ! 1 ) } ) , a && ( e . curOp . updateMaxLine = ! 0 ) ) , r . frontier = Math . min ( r . frontier , l . line ) , Ft ( e , 400 ) ; var c = t . text . length - ( s . line - l . line ) - 1 ; t . full ? In ( e ) : l . line != s . line || 1 != t . text . length || qi ( e . doc , t ) ? In ( e , l . line , s . line + 1 , c ) : Pn ( e , l . line , "text" ) ; var f = Lo ( e , "changes" ) , d = Lo ( e , "change" ) ; if ( d || f ) { var p = { from : l , to : s , text : t . text , removed : t . removed , origin : t . origin } ; d && wo ( e , "change" , e , p ) , f && ( e . curOp . changeObjs || ( e . curOp . changeObjs = [ ] ) ) . push ( p ) } e . display . selForContextMenu = null } function Ar ( e , t , n , r , i ) { if ( r || ( r = n ) , Hl ( r , n ) < 0 ) { var o = r ; r = n , n = o } "string" == typeof t && ( t = Vs ( t ) ) , kr ( e , { from : n , to : r , text : t , origin : i } ) } function Dr ( e , t ) { if ( ! ko ( e , "scrollCursorIntoView" ) ) { var n = e . display , r = n . sizer . getBoundingClientRect ( ) , i = null ; if ( t . top + r . top < 0 ? i = ! 0 : t . bottom + r . top > ( window . innerHeight || document . documentElement . clientHeight ) && ( i = ! 1 ) , null != i && ! Cl ) { var o = _o ( "div" , " " , null , "position: absolute; top: " + ( t . top - n . viewOffset - qt ( e . display ) ) + "px; height: " + ( t . bottom - t . top + $t ( e ) + n . barHeight ) + "px; left: " + t . left + "px; width: 2px;" ) ; e . display . lineSpace . appendChild ( o ) , o . scrollIntoView ( i ) , e . display . lineSpace . removeChild ( o ) } } } function Or ( e , t , n , r ) { null == r && ( r = 0 ) ; for ( var i = 0 ; 5 > i ; i ++ ) { var o = ! 1 , l = dn ( e , t ) , s = n && n != t ? dn ( e , n ) : l , a = Hr ( e , Math . min ( l . left , s . left ) , Math . min ( l . top , s . top ) - r , Math . max ( l . left , s . left ) , Math . max ( l . bottom , s . bottom ) + r ) , u = e . doc . scrollTop , c = e . doc . scrollLeft ; if ( null != a . scrollTop && ( tr ( e , a . scrollTop ) , Math . abs ( e . doc . scrollTop - u ) > 1 && ( o = ! 0 ) ) , null != a . scrollLeft && ( nr ( e , a . scrollLeft ) , Math . abs ( e . doc . scrollLeft - c ) > 1 && ( o = ! 0 ) ) , ! o ) break } return l } function Wr ( e , t , n , r , i ) { var o = Hr ( e , t , n , r , i ) ; null != o . scrollTop && tr ( e , o . scrollTop ) , null != o . scrollLeft && nr ( e , o . scrollLeft ) } function Hr ( e , t , n , r , i ) { var o = e . display , l = yn ( e . display ) ; 0 > n && ( n = 0 ) ; var s = e . curOp && null != e . curOp . scrollTop ? e . curOp . scrollTop : o . scroller . scrollTop , a = Vt ( e ) , u = { } ; i - n > a && ( i = n + a ) ; var c = e . doc . height + Gt ( o ) , h = l > n , f = i > c - l ; if ( s > n ) u . scrollTop = h ? 0 : n ; else if ( i > s + a ) { var d = Math . min ( n , ( f ? c : i ) - a ) ; d != s && ( u . scrollTop = d ) } var p = e . curOp && null != e . curOp . scrollLeft ? e . curOp . scrollLeft : o . scroller . scrollLeft , g = jt ( e ) - ( e . options . fixedGutter ? o . gutters . offsetWidth : 0 ) , m = r - t > g ; return m && ( r = t + g ) , 10 > t ? u . scrollLeft = 0 : p > t ? u . scrollLeft = Math . max ( 0 , t - ( m ? 0 : 10 ) ) : r > g + p - 3 && ( u . scrollLeft = r + ( m ? 0 : 10 ) - g ) , u } function Er ( e , t , n ) { ( null != t || null != n ) && Pr ( e ) , null != t && ( e . curOp . scrollLeft = ( null == e . curOp . scrollLeft ? e . doc . scrollLeft : e . curOp . scrollLeft ) + t ) , null != n && ( e . curOp . scrollTop = ( null == e . curOp . scrollTop ? e . doc . scrollTop : e . curOp . scrollTop ) + n ) } function Ir ( e ) { Pr ( e ) ; var t = e . getCursor ( ) , n = t , r = t ; e . options . lineWrapping || ( n = t . ch ? Wl ( t . line , t . ch - 1 ) : t , r = Wl ( t . line , t . ch + 1 ) ) , e . curOp . scrollToPos = { from : n , to : r , margin : e . options . cursorScrollMargin , isCursor : ! 0 } } function Pr ( e ) { var t = e . curOp . scrollToPos ; if ( t ) { e . curOp . scrollToPos = null ; var n = pn ( e , t . from ) , r = pn ( e , t . to ) , i = Hr ( e , Math . min ( n . left , r . left ) , Math . min ( n . top , r . top ) - t . margin , Math . max ( n . right , r . right ) , Math . max ( n . bottom , r . bottom ) + t . margin ) ; e . scrollTo ( i . scrollLeft , i . scrollTop ) } } function zr ( e , t , n , r ) { var i , o = e . doc ; null == n && ( n = "add" ) , "smart" == n && ( o . mode . indent ? i = Rt ( e , t ) : n = "prev" ) ; var l = e . options . tabSize , s = Ki ( o , t ) , a = Hs ( s . text , null , l ) ; s . stateAfter && ( s . stateAfter = null ) ; var u , c = s . text . match ( /^\s*/ ) [ 0 ] ; if ( r || /\S/ . test ( s . text ) ) { if ( "smart" == n && ( u = o . mode . indent ( i , s . text . slice ( c . length ) , s . text ) , u == As || u > 150 ) ) { if ( ! r ) return ; n = "prev" } } else u = 0 , n = "not" ; "prev" == n ? u = t > o . first ? Hs ( Ki ( o , t - 1 ) . text , null , l ) : 0 : "add" == n ? u = a + e . options . indentUnit : "subtract" == n ? u = a - e . options . indentUnit : "number" == typeof n && ( u = a + n ) , u = Math . max ( 0 , u ) ; var h = "" , f = 0 ; if ( e . options . indentWithTabs ) for ( var d = Math . floor ( u / l ) ; d ; -- d ) f += l , h += " " ; if ( u > f && ( h += Ao ( u - f ) ) , h != c ) return Ar ( o , h , Wl ( t , 0 ) , Wl ( t , c . length ) , "+input" ) , s . stateAfter = null , ! 0 ; for ( var d = 0 ; d < o . sel . ranges . length ; d ++ ) { var p = o . sel . ranges [ d ] ; if ( p . head . line == t && p . head . ch < c . length ) { var f = Wl ( t , c . length ) ; kt ( o , d , new ft ( f , f ) ) ; break } } } function Fr ( e , t , n , r ) { var i = t , o = t ; return "number" == typeof t ? o = Ki ( e , gt ( e , t ) ) : i = Qi ( t ) , null == i ? null : ( r ( o , i ) && e . cm && Pn ( e . cm , i , n ) , o ) } function Br ( e , t ) {
Tl && ( Tl = Number ( Tl [ 1 ] ) ) , Tl && Tl >= 15 && ( bl = ! 1 , ml = ! 0 ) ; var Nl = Ll && ( vl || bl && ( null == Tl || 12.11 > Tl ) ) , Al = hl || pl && gl >= 9 , Dl = ! 1 , Ol = ! 1 ; g . prototype = Io ( { update : function ( e ) { var t = e . scrollWidth > e . clientWidth + 1 , n = e . scrollHeight > e . clientHeight + 1 , r = e . nativeBarWidth ; if ( n ) { this . vert . style . display = "block" , this . vert . style . bottom = t ? r + "px" : "0" ; var i = e . viewHeight - ( t ? r : 0 ) ; this . vert . firstChild . style . height = Math . max ( 0 , e . scrollHeight - e . clientHeight + i ) + "px" } else this . vert . style . display = "" , this . vert . firstChild . style . height = "0" ; if ( t ) { this . horiz . style . display = "block" , this . horiz . style . right = n ? r + "px" : "0" , this . horiz . style . left = e . barLeft + "px" ; var o = e . viewWidth - e . barLeft - ( n ? r : 0 ) ; this . horiz . firstChild . style . width = e . scrollWidth - e . clientWidth + o + "px" } else this . horiz . style . display = "" , this . horiz . firstChild . style . width = "0" ; return ! this . checkedOverlay && e . clientHeight > 0 && ( 0 == r && this . overlayHack ( ) , this . checkedOverlay = ! 0 ) , { right : n ? r : 0 , bottom : t ? r : 0 } } , setScrollLeft : function ( e ) { this . horiz . scrollLeft != e && ( this . horiz . scrollLeft = e ) } , setScrollTop : function ( e ) { this . vert . scrollTop != e && ( this . vert . scrollTop = e ) } , overlayHack : function ( ) { var e = Ll && ! wl ? "12px" : "18px" ; this . horiz . style . minHeight = this . vert . style . minWidth = e ; var t = this , n = function ( e ) { bo ( e ) != t . vert && bo ( e ) != t . horiz && Dn ( t . cm , Vn ) ( e ) } ; Ss ( this . vert , "mousedown" , n ) , Ss ( this . horiz , "mousedown" , n ) } , clear : function ( ) { var e = this . horiz . parentNode ; e . removeChild ( this . horiz ) , e . removeChild ( this . vert ) } } , g . prototype ) , m . prototype = Io ( { update : function ( ) { return { bottom : 0 , right : 0 } } , setScrollLeft : function ( ) { } , setScrollTop : function ( ) { } , clear : function ( ) { } } , m . prototype ) , e . scrollbarModel = { "native" : g , "null" : m } , L . prototype . signal = function ( e , t ) { Lo ( e , t ) && this . events . push ( arguments ) } , L . prototype . finish = function ( ) { for ( var e = 0 ; e < this . events . length ; e ++ ) Ms . apply ( null , this . events [ e ] ) } ; var Wl = e . Pos = function ( e , t ) { return this instanceof Wl ? ( this . line = e , void ( this . ch = t ) ) : new Wl ( e , t ) } , Hl = e . cmpPos = function ( e , t ) { return e . line - t . line || e . ch - t . ch } , El = null ; rt . prototype = Io ( { init : function ( e ) { function t ( e ) { if ( r . somethingSelected ( ) ) El = r . getSelections ( ) , n . inaccurateSelection && ( n . prevInput = "" , n . inaccurateSelection = ! 1 , o . value = El . join ( "\n" ) , Is ( o ) ) ; else { if ( ! r . options . lineWiseCopyCut ) return ; var t = tt ( r ) ; El = t . text , "cut" == e . type ? r . setSelections ( t . ranges , null , Ds ) : ( n . prevInput = "" , o . value = t . text . join ( "\n" ) , Is ( o ) ) } "cut" == e . type && ( r . state . cutIncoming = ! 0 ) } var n = this , r = this . cm , i = this . wrapper = it ( ) , o = this . textarea = i . firstChild ; e . wrapper . insertBefore ( i , e . wrapper . firstChild ) , kl && ( o . style . width = "0px" ) , Ss ( o , "input" , function ( ) { pl && gl >= 9 && n . hasSelection && ( n . hasSelection = null ) , n . poll ( ) } ) , Ss ( o , "paste" , function ( e ) { return J ( e , r ) ? ! 0 : ( r . state . pasteIncoming = ! 0 , void n . fastPoll ( ) ) } ) , Ss ( o , "cut" , t ) , Ss ( o , "copy" , t ) , Ss ( e . scroller , "paste" , function ( t ) { $n ( e , t ) || ( r . state . pasteIncoming = ! 0 , n . focus ( ) ) } ) , Ss ( e . lineSpace , "selectstart" , function ( t ) { $n ( e , t ) || ws ( t ) } ) , Ss ( o , "compositionstart" , function ( ) { var e = r . getCursor ( "from" ) ; n . composing = { start : e , range : r . markText ( e , r . getCursor ( "to" ) , { className : "CodeMirror-composing" } ) } } ) , Ss ( o , "compositionend" , function ( ) { n . composing && ( n . poll ( ) , n . composing . range . clear ( ) , n . composing = null ) } ) } , prepareSelection : function ( ) { var e = this . cm , t = e . display , n = e . doc , r = Et ( e ) ; if ( e . options . moveInputWithCursor ) { var i = dn ( e , n . sel . primary ( ) . head , "div" ) , o = t . wrapper . getBoundingClientRect ( ) , l = t . lineDiv . getBoundingClientRect ( ) ; r . teTop = Math . max ( 0 , Math . min ( t . wrapper . clientHeight - 10 , i . top + l . top - o . top ) ) , r . teLeft = Math . max ( 0 , Math . min ( t . wrapper . clientWidth - 10 , i . left + l . left - o . left ) ) } return r } , showSelection : function ( e ) { var t = this . cm , n = t . display ; qo ( n . cursorDiv , e . cursors ) , qo ( n . selectionDiv , e . selection ) , null != e . teTop && ( this . wrapper . style . top = e . teTop + "px" , this . wrapper . style . left = e . teLeft + "px" ) } , reset : function ( e ) { if ( ! this . contextMenuPending ) { var t , n , r = this . cm , i = r . doc ; if ( r . somethingSelected ( ) ) { this . prevInput = "" ; var o = i . sel . primary ( ) ; t = Xs && ( o . to ( ) . line - o . from ( ) . line > 100 || ( n = r . getSelection ( ) ) . length > 1e3 ) ; var l = t ? "-" : n || r . getSelection ( ) ; this . textarea . value = l , r . state . focused && Is ( this . textarea ) , pl && gl >= 9 && ( this . hasSelection = l ) } else e || ( this . prevInput = this . textarea . value = "" , pl && gl >= 9 && ( this . hasSelection = null ) ) ; this . inaccurateSelection = t } } , getField : func
l && e . replaceRange ( o . charAt ( 0 ) + "\n" + l . charAt ( l . length - 1 ) , Wl ( i . line - 1 , l . length - 1 ) , Wl ( i . line , 1 ) , "+transpose" ) } n . push ( new ft ( i , i ) ) } e . setSelections ( n ) } ) } , newlineAndIndent : function ( e ) { An ( e , function ( ) { for ( var t = e . listSelections ( ) . length , n = 0 ; t > n ; n ++ ) { var r = e . listSelections ( ) [ n ] ; e . replaceRange ( "\n" , r . anchor , r . head , "+input" ) , e . indentLine ( r . from ( ) . line + 1 , null , ! 0 ) , Ir ( e ) } } ) } , toggleOverwrite : function ( e ) { e . toggleOverwrite ( ) } } , os = e . keyMap = { } ; os . basic = { Left : "goCharLeft" , Right : "goCharRight" , Up : "goLineUp" , Down : "goLineDown" , End : "goLineEnd" , Home : "goLineStartSmart" , PageUp : "goPageUp" , PageDown : "goPageDown" , Delete : "delCharAfter" , Backspace : "delCharBefore" , "Shift-Backspace" : "delCharBefore" , Tab : "defaultTab" , "Shift-Tab" : "indentAuto" , Enter : "newlineAndIndent" , Insert : "toggleOverwrite" , Esc : "singleSelection" } , os . pcDefault = { "Ctrl-A" : "selectAll" , "Ctrl-D" : "deleteLine" , "Ctrl-Z" : "undo" , "Shift-Ctrl-Z" : "redo" , "Ctrl-Y" : "redo" , "Ctrl-Home" : "goDocStart" , "Ctrl-End" : "goDocEnd" , "Ctrl-Up" : "goLineUp" , "Ctrl-Down" : "goLineDown" , "Ctrl-Left" : "goGroupLeft" , "Ctrl-Right" : "goGroupRight" , "Alt-Left" : "goLineStart" , "Alt-Right" : "goLineEnd" , "Ctrl-Backspace" : "delGroupBefore" , "Ctrl-Delete" : "delGroupAfter" , "Ctrl-S" : "save" , "Ctrl-F" : "find" , "Ctrl-G" : "findNext" , "Shift-Ctrl-G" : "findPrev" , "Shift-Ctrl-F" : "replace" , "Shift-Ctrl-R" : "replaceAll" , "Ctrl-[" : "indentLess" , "Ctrl-]" : "indentMore" , "Ctrl-U" : "undoSelection" , "Shift-Ctrl-U" : "redoSelection" , "Alt-U" : "redoSelection" , fallthrough : "basic" } , os . emacsy = { "Ctrl-F" : "goCharRight" , "Ctrl-B" : "goCharLeft" , "Ctrl-P" : "goLineUp" , "Ctrl-N" : "goLineDown" , "Alt-F" : "goWordRight" , "Alt-B" : "goWordLeft" , "Ctrl-A" : "goLineStart" , "Ctrl-E" : "goLineEnd" , "Ctrl-V" : "goPageDown" , "Shift-Ctrl-V" : "goPageUp" , "Ctrl-D" : "delCharAfter" , "Ctrl-H" : "delCharBefore" , "Alt-D" : "delWordAfter" , "Alt-Backspace" : "delWordBefore" , "Ctrl-K" : "killLine" , "Ctrl-T" : "transposeChars" } , os . macDefault = { "Cmd-A" : "selectAll" , "Cmd-D" : "deleteLine" , "Cmd-Z" : "undo" , "Shift-Cmd-Z" : "redo" , "Cmd-Y" : "redo" , "Cmd-Home" : "goDocStart" , "Cmd-Up" : "goDocStart" , "Cmd-End" : "goDocEnd" , "Cmd-Down" : "goDocEnd" , "Alt-Left" : "goGroupLeft" , "Alt-Right" : "goGroupRight" , "Cmd-Left" : "goLineLeft" , "Cmd-Right" : "goLineRight" , "Alt-Backspace" : "delGroupBefore" , "Ctrl-Alt-Backspace" : "delGroupAfter" , "Alt-Delete" : "delGroupAfter" , "Cmd-S" : "save" , "Cmd-F" : "find" , "Cmd-G" : "findNext" , "Shift-Cmd-G" : "findPrev" , "Cmd-Alt-F" : "replace" , "Shift-Cmd-Alt-F" : "replaceAll" , "Cmd-[" : "indentLess" , "Cmd-]" : "indentMore" , "Cmd-Backspace" : "delWrappedLineLeft" , "Cmd-Delete" : "delWrappedLineRight" , "Cmd-U" : "undoSelection" , "Shift-Cmd-U" : "redoSelection" , "Ctrl-Up" : "goDocStart" , "Ctrl-Down" : "goDocEnd" , fallthrough : [ "basic" , "emacsy" ] } , os [ "default" ] = Ll ? os . macDefault : os . pcDefault , e . normalizeKeyMap = function ( e ) { var t = { } ; for ( var n in e ) if ( e . hasOwnProperty ( n ) ) { var r = e [ n ] ; if ( /^(name|fallthrough|(de|at)tach)$/ . test ( n ) ) continue ; if ( "..." == r ) { delete e [ n ] ; continue } for ( var i = Wo ( n . split ( " " ) , Gr ) , o = 0 ; o < i . length ; o ++ ) { var l , s ; o == i . length - 1 ? ( s = i . join ( " " ) , l = r ) : ( s = i . slice ( 0 , o + 1 ) . join ( " " ) , l = "..." ) ; var a = t [ s ] ; if ( a ) { if ( a != l ) throw new Error ( "Inconsistent bindings for " + s ) } else t [ s ] = l } delete e [ n ] } for ( var u in t ) e [ u ] = t [ u ] ; return e } ; var ls = e . lookupKey = function ( e , t , n , r ) { t = Ur ( t ) ; var i = t . call ? t . call ( e , r ) : t [ e ] ; if ( i === ! 1 ) return "nothing" ; if ( "..." === i ) return "multi" ; if ( null != i && n ( i ) ) return "handled" ; if ( t . fallthrough ) { if ( "[object Array]" != Object . prototype . toString . call ( t . fallthrough ) ) return ls ( e , t . fallthrough , n , r ) ; for ( var o = 0 ; o < t . fallthrough . length ; o ++ ) { var l = ls ( e , t . fallthrough [ o ] , n , r ) ; if ( l ) return l } } } , ss = e . isModifierKey = function ( e ) { var t = "string" == typeof e ? e : Zs [ e . keyCode ] ; return "Ctrl" == t || "Alt" == t || "Shift" == t || "Mod" == t } , as = e . keyName = function ( e , t ) { if ( bl && 34 == e . keyCode && e [ "char" ] ) return ! 1 ; var n = Zs [ e . keyCode ] , r = n ; return null == r || e . altGraphKey ? ! 1 : ( e . altKey && "Alt" != n && ( r = "Alt-" + r ) , ( Nl ? e . metaKey : e . ctrlKey ) && "Ctrl" != n && ( r = "Ctrl-" + r ) , ( Nl ? e . ctrlKey : e . metaKey ) && "Cmd" != n && ( r = "Cmd-" + r ) , ! t && e . shiftKey && "Shift" != n && ( r = "Shift-" + r ) , r ) } ; e . fromTextArea = function ( t , n ) { function r ( ) { t . value = u . getValue ( ) } if ( n = n ? Io ( n ) : { } , n . value = t . value , ! n . tabindex && t . tabIndex && ( n . tabindex = t . tabIndex ) , ! n . placeholder && t . placeholder && ( n . placeholder = t . placeholder ) , null == n . autofocus ) { var i =
} if ( e . taskOpen ) return t . push ( "meta" ) , t . length ? t . join ( " " ) : null ; if ( e . taskClosed ) return t . push ( "property" ) , t . length ? t . join ( " " ) : null ; if ( e . linkHref ? t . push ( P , "url" ) : ( e . strong && t . push ( F ) , e . em && t . push ( z ) , e . strikethrough && t . push ( B ) , e . linkText && t . push ( I ) , e . code && t . push ( L ) ) , e . header && ( t . push ( S ) , t . push ( S + "-" + e . header ) ) , e . quote && ( t . push ( M ) , t . push ( ! n . maxBlockquoteDepth || n . maxBlockquoteDepth >= e . quote ? M + "-" + e . quote : M + "-" + n . maxBlockquoteDepth ) ) , e . list !== ! 1 ) { var i = ( e . listDepth - 1 ) % 3 ; t . push ( i ? 1 === i ? N : A : T ) } return e . trailingSpaceNewLine ? t . push ( "trailing-space-new-line" ) : e . trailingSpace && t . push ( "trailing-space-" + ( e . trailingSpace % 2 ? "a" : "b" ) ) , t . length ? t . join ( " " ) : null } function f ( e , t ) { return e . match ( j , ! 0 ) ? h ( t ) : void 0 } function d ( t , r ) { var i = r . text ( t , r ) ; if ( "undefined" != typeof i ) return i ; if ( r . list ) return r . list = null , h ( r ) ; if ( r . taskList ) { var l = "x" !== t . match ( G , ! 0 ) [ 1 ] ; return l ? r . taskOpen = ! 0 : r . taskClosed = ! 0 , n . highlightFormatting && ( r . formatting = "task" ) , r . taskList = ! 1 , h ( r ) } if ( r . taskOpen = ! 1 , r . taskClosed = ! 1 , r . header && t . match ( /^#+$/ , ! 0 ) ) return n . highlightFormatting && ( r . formatting = "header" ) , h ( r ) ; var s = t . sol ( ) , u = t . next ( ) ; if ( "\\" === u && ( t . next ( ) , n . highlightFormatting ) ) { var c = h ( r ) ; return c ? c + " formatting-escape" : "formatting-escape" } if ( r . linkTitle ) { r . linkTitle = ! 1 ; var f = u ; "(" === u && ( f = ")" ) , f = ( f + "" ) . replace ( /([.?*+^$[\]\\(){}|-])/g , "\\$1" ) ; var d = "^\\s*(?:[^" + f + "\\\\]+|\\\\\\\\|\\\\.)" + f ; if ( t . match ( new RegExp ( d ) , ! 0 ) ) return P } if ( "`" === u ) { var m = r . formatting ; n . highlightFormatting && ( r . formatting = "code" ) ; var v = h ( r ) , y = t . pos ; t . eatWhile ( "`" ) ; var b = 1 + t . pos - y ; return r . code ? b === k ? ( r . code = ! 1 , v ) : ( r . formatting = m , h ( r ) ) : ( k = b , r . code = ! 0 , h ( r ) ) } if ( r . code ) return h ( r ) ; if ( "!" === u && t . match ( /\[[^\]]*\] ?(?:\(|\[)/ , ! 1 ) ) return t . match ( /\[[^\]]*\]/ ) , r . inline = r . f = g , O ; if ( "[" === u && t . match ( /.*\](\(.*\)| ?\[.*\])/ , ! 1 ) ) return r . linkText = ! 0 , n . highlightFormatting && ( r . formatting = "link" ) , h ( r ) ; if ( "]" === u && r . linkText && t . match ( /\(.*\)| ?\[.*\]/ , ! 1 ) ) { n . highlightFormatting && ( r . formatting = "link" ) ; var c = h ( r ) ; return r . linkText = ! 1 , r . inline = r . f = g , c } if ( "<" === u && t . match ( /^(https?|ftps?):\/\/(?:[^\\>]|\\.)+>/ , ! 1 ) ) { r . f = r . inline = p , n . highlightFormatting && ( r . formatting = "link" ) ; var c = h ( r ) ; return c ? c += " " : c = "" , c + H } if ( "<" === u && t . match ( /^[^> \\]+@(?:[^\\>]|\\.)+>/ , ! 1 ) ) { r . f = r . inline = p , n . highlightFormatting && ( r . formatting = "link" ) ; var c = h ( r ) ; return c ? c += " " : c = "" , c + E } if ( "<" === u && t . match ( /^\w/ , ! 1 ) ) { if ( - 1 != t . string . indexOf ( ">" ) ) { var x = t . string . substring ( 1 , t . string . indexOf ( ">" ) ) ; /markdown\s*=\s*('|"){0,1}1('|"){0,1}/ . test ( x ) && ( r . md _inside = ! 0 ) } return t . backUp ( 1 ) , r . htmlState = e . startState ( C ) , o ( t , r , a ) } if ( "<" === u && t . match ( /^\/\w*?>/ ) ) return r . md _inside = ! 1 , "tag" ; var w = ! 1 ; if ( ! n . underscoresBreakWords && "_" === u && "_" !== t . peek ( ) && t . match ( /(\w)/ , ! 1 ) ) { var S = t . pos - 2 ; if ( S >= 0 ) { var L = t . string . charAt ( S ) ; "_" !== L && L . match ( /(\w)/ , ! 1 ) && ( w = ! 0 ) } } if ( "*" === u || "_" === u && ! w ) if ( s && " " === t . peek ( ) ) ; else { if ( r . strong === u && t . eat ( u ) ) { n . highlightFormatting && ( r . formatting = "strong" ) ; var v = h ( r ) ; return r . strong = ! 1 , v } if ( ! r . strong && t . eat ( u ) ) return r . strong = u , n . highlightFormatting && ( r . formatting = "strong" ) , h ( r ) ; if ( r . em === u ) { n . highlightFormatting && ( r . formatting = "em" ) ; var v = h ( r ) ; return r . em = ! 1 , v } if ( ! r . em ) return r . em = u , n . highlightFormatting && ( r . formatting = "em" ) , h ( r ) } else if ( " " === u && ( t . eat ( "*" ) || t . eat ( "_" ) ) ) { if ( " " === t . peek ( ) ) return h ( r ) ; t . backUp ( 1 ) } if ( n . strikethrough ) if ( "~" === u && t . eatWhile ( u ) ) { if ( r . strikethrough ) { n . highlightFormatting && ( r . formatting = "strikethrough" ) ; var v = h ( r ) ; return r . strikethrough = ! 1 , v } if ( t . match ( /^[^\s]/ , ! 1 ) ) return r . strikethrough = ! 0 , n . highlightFormatting && ( r . formatting = "strikethrough" ) , h ( r ) } else if ( " " === u && t . match ( /^~~/ , ! 0 ) ) { if ( " " === t . peek ( ) ) return h ( r ) ; t . backUp ( 2 ) } return " " === u && ( t . match ( / +$/ , ! 1 ) ? r . trailingSpace ++ : r . trailingSpace && ( r . trailingSpaceNewLine = ! 0 ) ) , h ( r ) } function p ( e , t ) { var r = e . next ( ) ; if ( ">" === r ) { t . f = t . inline = d , n . highlightFormatting && ( t . formatting = "link" ) ; var i = h ( t ) ; return i ? i += " " : i = "" , i + H } return e . match ( /^[^>]+/ , ! 0 ) , H } function g ( e , t ) { if ( e . eatSpace ( ) ) return null ; var r = e . next ( ) ; return "(" === r || "[" === r ? ( t . f = t . inline = m ( "(" === r ? ")" : "]" ) , n . highlightFormatting && ( t . formatting = "link-string" ) , t . linkHref = ! 0 , h ( t ) ) : "error" } function m ( e ) { return function ( t , r )
SimpleMDE . toolbar = toolbar , SimpleMDE . markdown = function ( e ) { return window . marked ? marked ( e ) : void 0 } , SimpleMDE . prototype . render = function ( e ) { if ( e || ( e = this . element || document . getElementsByTagName ( "textarea" ) [ 0 ] ) , ! this . _rendered || this . _rendered !== e ) { this . element = e ; var t = this . options , n = this , r = { } ; for ( var i in shortcuts ) ! function ( e ) { r [ fixShortcut ( e ) ] = function ( ) { shortcuts [ e ] ( n ) } } ( i ) ; r . Enter = "newlineAndIndentContinueMarkdownList" , r . Tab = "tabAndIndentContinueMarkdownList" , r [ "Shift-Tab" ] = "shiftTabAndIndentContinueMarkdownList" , this . codemirror = CodeMirror . fromTextArea ( e , { mode : "gfm" , theme : "paper" , tabSize : void 0 != t . tabSize ? t . tabSize : 2 , indentWithTabs : t . indentWithTabs === ! 1 ? ! 1 : ! 0 , lineNumbers : ! 1 , autofocus : t . autofocus === ! 0 ? ! 0 : ! 1 , extraKeys : r , lineWrapping : t . lineWrapping === ! 1 ? ! 1 : ! 0 } ) , t . toolbar !== ! 1 && this . createToolbar ( ) , t . status !== ! 1 && this . createStatusbar ( ) , void 0 != t . autosave && t . autosave . enabled === ! 0 && this . autosave ( ) , this . _rendered = this . element } } , SimpleMDE . prototype . autosave = function ( ) { var e = this . value ( ) , t = this ; if ( void 0 == this . options . autosave . unique _id || "" == this . options . autosave . unique _id ) return void console . log ( "SimpleMDE: You must set a unique_id to use the autosave feature" ) ; null != t . element . form && void 0 != t . element . form && t . element . form . addEventListener ( "submit" , function ( ) { localStorage . setItem ( t . options . autosave . unique _id , "" ) } ) , this . options . autosave . loaded !== ! 0 && ( null != localStorage . getItem ( this . options . autosave . unique _id ) && this . codemirror . setValue ( localStorage . getItem ( this . options . autosave . unique _id ) ) , this . options . autosave . loaded = ! 0 ) , localStorage && localStorage . setItem ( this . options . autosave . unique _id , e ) ; var n = document . getElementById ( "autosaved" ) ; if ( null != n && void 0 != n && "" != n ) { var r = new Date , i = r . getHours ( ) , o = r . getMinutes ( ) , l = "am" , s = i ; s >= 12 && ( s = i - 12 , l = "pm" ) , 0 == s && ( s = 12 ) , o = 10 > o ? "0" + o : o , n . innerHTML = "Autosaved: " + s + ":" + o + " " + l } setTimeout ( function ( ) { t . autosave ( ) } , this . options . autosave . delay || 1e4 ) } , SimpleMDE . prototype . createToolbar = function ( e ) { if ( e = e || this . options . toolbar , e && 0 !== e . length ) { var t = document . createElement ( "div" ) ; t . className = "editor-toolbar" ; var n = this ; n . toolbar = { } ; for ( var r = 0 ; r < e . length ; r ++ ) ( "guide" != e [ r ] . name || n . options . toolbarGuideIcon !== ! 1 ) && ! function ( e ) { var r ; r = "|" === e ? createSep ( ) : createIcon ( e , n . options . toolbarTips ) , e . action && ( "function" == typeof e . action ? r . onclick = function ( ) { e . action ( n ) } : "string" == typeof e . action && ( r . href = e . action , r . target = "_blank" ) ) , n . toolbar [ e . name || e ] = r , t . appendChild ( r ) } ( e [ r ] ) ; var i = this . codemirror ; i . on ( "cursorActivity" , function ( ) { var e = getState ( i ) ; for ( var t in n . toolbar ) ! function ( t ) { var r = n . toolbar [ t ] ; e [ t ] ? r . className += " active" : r . className = r . className . replace ( /\s*active\s*/g , "" ) } ( t ) } ) ; var o = i . getWrapperElement ( ) ; return o . parentNode . insertBefore ( t , o ) , t } } , SimpleMDE . prototype . createStatusbar = function ( e ) { if ( e = e || this . options . status , options = this . options , e && 0 !== e . length ) { var t = document . createElement ( "div" ) ; t . className = "editor-statusbar" ; for ( var n , r = this . codemirror , i = 0 ; i < e . length ; i ++ ) ! function ( e ) { var i = document . createElement ( "span" ) ; i . className = e , "words" === e ? ( i . innerHTML = "0" , r . on ( "update" , function ( ) { i . innerHTML = wordCount ( r . getValue ( ) ) } ) ) : "lines" === e ? ( i . innerHTML = "0" , r . on ( "update" , function ( ) { i . innerHTML = r . lineCount ( ) } ) ) : "cursor" === e ? ( i . innerHTML = "0:0" , r . on ( "cursorActivity" , function ( ) { n = r . getCursor ( ) , i . innerHTML = n . line + ":" + n . ch } ) ) : "autosave" === e && void 0 != options . autosave && options . autosave . enabled === ! 0 && i . setAttribute ( "id" , "autosaved" ) , t . appendChild ( i ) } ( e [ i ] ) ; var o = this . codemirror . getWrapperElement ( ) ; return o . parentNode . insertBefore ( t , o . nextSibling ) , t } } , SimpleMDE . prototype . value = function ( e ) { return e ? ( this . codemirror . getDoc ( ) . setValue ( e ) , this ) : this . codemirror . getValue ( ) } , SimpleMDE . toggleBold = toggleBold , SimpleMDE . toggleItalic = toggleItalic , SimpleMDE . toggleBlockquote = toggleBlockquote , SimpleMDE . toggleCodeBlock = toggleCodeBlock , SimpleMDE . toggleUnorderedList = toggleUnorderedList , SimpleMDE . toggleOrderedList = toggleOrderedList , SimpleMDE . drawLink = drawLink , SimpleMDE . drawImage = drawImage , SimpleMDE . drawHorizontalRule = drawHorizontalRule , SimpleMDE . undo = undo , SimpleMDE . redo = redo , SimpleMDE . togglePreview = togglePreview , SimpleMDE . toggleFullScreen = toggl