@@ -10,8 +10,20 @@ $(document).ready(function(){
10
10
}
11
11
12
12
// setup mermaid charting
13
- if ( typeof mermaid !== 'undefined' ) {
14
- mermaid . initialize ( { startOnLoad : true } ) ;
13
+ if ( typeof mermaid !== 'undefined' && config . mermaid ) {
14
+ //defaults - can be overridden in config.json by specifying mermaid_options
15
+ //TODO: Consider adding mermaid_options to settings page?
16
+ var mermaid_opts = {
17
+ "theme" : "forest" ,
18
+ "flowchart" : { "curve" : "linear" } ,
19
+ "gantt" : { "axisFormat" : "%Y/%m/%d" } ,
20
+ "sequence" : { "actorMargin" : 20 } ,
21
+ "securityLevel" : "loose"
22
+ } ;
23
+ // Merge mermaid_options into mermaid_opts, recursively
24
+ $ . extend ( true , mermaid_opts , config . mermaid_options || { } ) ;
25
+ mermaid_opts . startOnLoad = true ;
26
+ mermaid . initialize ( mermaid_opts ) ;
15
27
}
16
28
17
29
// add the table class to all tables
@@ -117,16 +129,26 @@ $(document).ready(function(){
117
129
inlineAttachment . editors . codemirror4 . attach ( simplemde . codemirror , { uploadUrl : $ ( '#app_context' ) . val ( ) + '/file/upload_file' } ) ;
118
130
119
131
// do initial convert on load
120
- convertTextAreaToMarkdown ( ) ;
121
-
122
- // attach to editor changes and update preview
123
- simplemde . codemirror . on ( 'change' , function ( ) {
124
- convertTextAreaToMarkdown ( ) ;
125
- } ) ;
132
+ convertTextAreaToMarkdown ( true ) ; //true means this is first call - do all rendering
126
133
127
134
// auto scrolls the simpleMDE preview pane
128
135
var preview = document . getElementById ( 'preview' ) ;
129
136
if ( preview !== null ) {
137
+
138
+ //timed re-render (virtual speedup) - i.e. only call convertTextAreaToMarkdown() after xxxms of inactivity to reduce redraws
139
+ var timer = null ;
140
+ //TODO: Consider adding the renderDelayTime to settings
141
+ var renderDelayTime = 500 ; //only re-render when user stops changing text
142
+
143
+ // attach to editor changes and update preview
144
+ simplemde . codemirror . on ( 'change' , function ( ) {
145
+ if ( timer != null )
146
+ clearTimeout ( timer ) ;
147
+ timer = setTimeout ( function ( ) {
148
+ convertTextAreaToMarkdown ( false ) ; //pass false to indicate this call is due to a code change
149
+ } , renderDelayTime ) ;
150
+ } ) ;
151
+
130
152
// Syncs scroll editor -> preview
131
153
var cScroll = false ;
132
154
var pScroll = false ;
@@ -244,11 +266,39 @@ $(document).ready(function(){
244
266
} ) ;
245
267
246
268
// convert editor markdown to HTML and display in #preview div
247
- function convertTextAreaToMarkdown ( ) {
269
+ //firstRender indicates this is a first call (i.e. not a re-render request due to a code editor change)
270
+ function convertTextAreaToMarkdown ( firstRender ) {
248
271
var classy = window . markdownItClassy ;
249
272
250
273
var mark_it_down = window . markdownit ( { html : true , linkify : true , typographer : true , breaks : true } ) ;
251
274
mark_it_down . use ( classy ) ;
275
+
276
+ if ( typeof mermaid !== 'undefined' && config . mermaid ) {
277
+
278
+ var mermaidChart = function ( code ) {
279
+ try {
280
+ mermaid . parse ( code )
281
+ return '<div class="mermaid">' + code + '</div>' ;
282
+ } catch ( { str, hash } ) {
283
+ return '<pre><code>' + code + '</code></pre>' ;
284
+ }
285
+ }
286
+
287
+ var defFenceRules = mark_it_down . renderer . rules . fence . bind ( mark_it_down . renderer . rules )
288
+ mark_it_down . renderer . rules . fence = function ( tokens , idx , options , env , slf ) {
289
+ var token = tokens [ idx ]
290
+ var code = token . content . trim ( )
291
+ if ( token . info === 'mermaid' ) {
292
+ return mermaidChart ( code )
293
+ }
294
+ var firstLine = code . split ( / \n / ) [ 0 ] . trim ( )
295
+ if ( firstLine === 'gantt' || firstLine === 'sequenceDiagram' || firstLine . match ( / ^ g r a p h (?: T B | B T | R L | L R | T D ) ; ? $ / ) ) {
296
+ return mermaidChart ( code )
297
+ }
298
+ return defFenceRules ( tokens , idx , options , env , slf )
299
+ }
300
+ }
301
+
252
302
var html = mark_it_down . render ( simplemde . value ( ) ) ;
253
303
254
304
// add responsive images and tables
@@ -269,6 +319,11 @@ $(document).ready(function(){
269
319
$ ( 'pre code' ) . each ( function ( i , block ) {
270
320
hljs . highlightBlock ( block ) ;
271
321
} ) ;
322
+
323
+ if ( ! firstRender && typeof mermaid !== 'undefined' && ( config . mermaid && config . mermaid_auto_update ) ) {
324
+ mermaid . init ( ) ; //when this is not first render AND mermaid_auto_update==true, re-init mermaid charts (render code changes)
325
+ }
326
+
272
327
}
273
328
274
329
// user up vote clicked
0 commit comments