Make diagram configurable
This commit is contained in:
		
							parent
							
								
									fd901e07ba
								
							
						
					
					
						commit
						bf778a9945
					
				
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@ -1,4 +1,5 @@
 | 
			
		||||
.project
 | 
			
		||||
.idea
 | 
			
		||||
.settings
 | 
			
		||||
node_modules
 | 
			
		||||
Thumbs.db
 | 
			
		||||
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1813
									
								
								public/res/editor.js
									
									
									
									
									
								
							
							
						
						
									
										1813
									
								
								public/res/editor.js
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@ -1,158 +1,226 @@
 | 
			
		||||
/*globals Markdown */
 | 
			
		||||
define([
 | 
			
		||||
    "jquery",
 | 
			
		||||
    "underscore",
 | 
			
		||||
    "utils",
 | 
			
		||||
    "logger",
 | 
			
		||||
    "classes/Extension",
 | 
			
		||||
    "text!html/markdownExtraSettingsBlock.html",
 | 
			
		||||
    'google-code-prettify',
 | 
			
		||||
    'highlightjs',
 | 
			
		||||
    'crel',
 | 
			
		||||
    'sequence-diagram',
 | 
			
		||||
    'flow-chart',
 | 
			
		||||
    'pagedown-extra',
 | 
			
		||||
], function($, _, utils, logger, Extension, markdownExtraSettingsBlockHTML, prettify, hljs, crel, sequenceDiagram, flowChart) {
 | 
			
		||||
	"jquery",
 | 
			
		||||
	"underscore",
 | 
			
		||||
	"utils",
 | 
			
		||||
	"logger",
 | 
			
		||||
	"classes/Extension",
 | 
			
		||||
	"text!html/markdownExtraSettingsBlock.html",
 | 
			
		||||
	'google-code-prettify',
 | 
			
		||||
	'highlightjs',
 | 
			
		||||
	'crel',
 | 
			
		||||
	'sequence-diagram',
 | 
			
		||||
	'flow-chart',
 | 
			
		||||
	'text!html/tooltipMarkdownExtraDiagrams.html',
 | 
			
		||||
	'pagedown-extra'
 | 
			
		||||
], function($, _, utils, logger, Extension, markdownExtraSettingsBlockHTML, prettify, hljs, crel, sequenceDiagram, flowChart, tooltipMarkdownExtraDiagramsHTML) {
 | 
			
		||||
 | 
			
		||||
    var markdownExtra = new Extension("markdownExtra", "Markdown Extra", true);
 | 
			
		||||
    markdownExtra.settingsBlock = markdownExtraSettingsBlockHTML;
 | 
			
		||||
    markdownExtra.defaultConfig = {
 | 
			
		||||
        extensions: [
 | 
			
		||||
            "fenced_code_gfm",
 | 
			
		||||
            "tables",
 | 
			
		||||
            "def_list",
 | 
			
		||||
            "attr_list",
 | 
			
		||||
            "footnotes",
 | 
			
		||||
            "smartypants",
 | 
			
		||||
            "strikethrough",
 | 
			
		||||
            "newlines",
 | 
			
		||||
        ],
 | 
			
		||||
        intraword: true,
 | 
			
		||||
        comments: true,
 | 
			
		||||
        highlighter: "prettify"
 | 
			
		||||
    };
 | 
			
		||||
	var markdownExtra = new Extension("markdownExtra", "Markdown Extra", true);
 | 
			
		||||
	markdownExtra.settingsBlock = markdownExtraSettingsBlockHTML;
 | 
			
		||||
	markdownExtra.defaultConfig = {
 | 
			
		||||
		extensions: [
 | 
			
		||||
			"fenced_code_gfm",
 | 
			
		||||
			"tables",
 | 
			
		||||
			"def_list",
 | 
			
		||||
			"attr_list",
 | 
			
		||||
			"footnotes",
 | 
			
		||||
			"smartypants",
 | 
			
		||||
			"strikethrough",
 | 
			
		||||
			"newlines"
 | 
			
		||||
		],
 | 
			
		||||
		intraword: true,
 | 
			
		||||
		comments: true,
 | 
			
		||||
		highlighter: "prettify"
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
    markdownExtra.onLoadSettings = function() {
 | 
			
		||||
        function hasExtension(extensionName) {
 | 
			
		||||
            return _.some(markdownExtra.config.extensions, function(extension) {
 | 
			
		||||
                return extension == extensionName;
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
        utils.setInputChecked("#input-markdownextra-fencedcodegfm", hasExtension("fenced_code_gfm"));
 | 
			
		||||
        utils.setInputChecked("#input-markdownextra-tables", hasExtension("tables"));
 | 
			
		||||
        utils.setInputChecked("#input-markdownextra-deflist", hasExtension("def_list"));
 | 
			
		||||
        utils.setInputChecked("#input-markdownextra-attrlist", hasExtension("attr_list"));
 | 
			
		||||
        utils.setInputChecked("#input-markdownextra-footnotes", hasExtension("footnotes"));
 | 
			
		||||
        utils.setInputChecked("#input-markdownextra-smartypants", hasExtension("smartypants"));
 | 
			
		||||
        utils.setInputChecked("#input-markdownextra-strikethrough", hasExtension("strikethrough"));
 | 
			
		||||
        utils.setInputChecked("#input-markdownextra-newlines", hasExtension("newlines"));
 | 
			
		||||
        utils.setInputChecked("#input-markdownextra-intraword", markdownExtra.config.intraword);
 | 
			
		||||
        utils.setInputChecked("#input-markdownextra-comments", markdownExtra.config.comments);
 | 
			
		||||
        utils.setInputValue("#input-markdownextra-highlighter", markdownExtra.config.highlighter);
 | 
			
		||||
    };
 | 
			
		||||
	markdownExtra.onLoadSettings = function() {
 | 
			
		||||
		function hasExtension(extensionName) {
 | 
			
		||||
			return _.some(markdownExtra.config.extensions, function(extension) {
 | 
			
		||||
				return extension == extensionName;
 | 
			
		||||
			});
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
    markdownExtra.onSaveSettings = function(newConfig) {
 | 
			
		||||
        newConfig.extensions = [];
 | 
			
		||||
        utils.getInputChecked("#input-markdownextra-fencedcodegfm") && newConfig.extensions.push("fenced_code_gfm");
 | 
			
		||||
        utils.getInputChecked("#input-markdownextra-tables") && newConfig.extensions.push("tables");
 | 
			
		||||
        utils.getInputChecked("#input-markdownextra-deflist") && newConfig.extensions.push("def_list");
 | 
			
		||||
        utils.getInputChecked("#input-markdownextra-attrlist") && newConfig.extensions.push("attr_list");
 | 
			
		||||
        utils.getInputChecked("#input-markdownextra-footnotes") && newConfig.extensions.push("footnotes");
 | 
			
		||||
        utils.getInputChecked("#input-markdownextra-smartypants") && newConfig.extensions.push("smartypants");
 | 
			
		||||
        utils.getInputChecked("#input-markdownextra-strikethrough") && newConfig.extensions.push("strikethrough");
 | 
			
		||||
        utils.getInputChecked("#input-markdownextra-newlines") && newConfig.extensions.push("newlines");
 | 
			
		||||
        newConfig.intraword = utils.getInputChecked("#input-markdownextra-intraword");
 | 
			
		||||
        newConfig.comments = utils.getInputChecked("#input-markdownextra-comments");
 | 
			
		||||
        newConfig.highlighter = utils.getInputValue("#input-markdownextra-highlighter");
 | 
			
		||||
    };
 | 
			
		||||
		utils.setInputChecked("#input-markdownextra-fencedcodegfm", hasExtension("fenced_code_gfm"));
 | 
			
		||||
		utils.setInputChecked("#input-markdownextra-tables", hasExtension("tables"));
 | 
			
		||||
		utils.setInputChecked("#input-markdownextra-deflist", hasExtension("def_list"));
 | 
			
		||||
		utils.setInputChecked("#input-markdownextra-attrlist", hasExtension("attr_list"));
 | 
			
		||||
		utils.setInputChecked("#input-markdownextra-footnotes", hasExtension("footnotes"));
 | 
			
		||||
		utils.setInputChecked("#input-markdownextra-smartypants", hasExtension("smartypants"));
 | 
			
		||||
		utils.setInputChecked("#input-markdownextra-strikethrough", hasExtension("strikethrough"));
 | 
			
		||||
		utils.setInputChecked("#input-markdownextra-newlines", hasExtension("newlines"));
 | 
			
		||||
		utils.setInputChecked("#input-markdownextra-intraword", markdownExtra.config.intraword);
 | 
			
		||||
		utils.setInputChecked("#input-markdownextra-comments", markdownExtra.config.comments);
 | 
			
		||||
		utils.setInputValue("#input-markdownextra-highlighter", markdownExtra.config.highlighter);
 | 
			
		||||
		utils.setInputChecked("#input-markdownextra-diagrams", markdownExtra.config.diagrams);
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
    var eventMgr;
 | 
			
		||||
    markdownExtra.onEventMgrCreated = function(eventMgrParameter) {
 | 
			
		||||
        eventMgr = eventMgrParameter;
 | 
			
		||||
    };
 | 
			
		||||
	markdownExtra.onSaveSettings = function(newConfig) {
 | 
			
		||||
		newConfig.extensions = [];
 | 
			
		||||
		utils.getInputChecked("#input-markdownextra-fencedcodegfm") && newConfig.extensions.push("fenced_code_gfm");
 | 
			
		||||
		utils.getInputChecked("#input-markdownextra-tables") && newConfig.extensions.push("tables");
 | 
			
		||||
		utils.getInputChecked("#input-markdownextra-deflist") && newConfig.extensions.push("def_list");
 | 
			
		||||
		utils.getInputChecked("#input-markdownextra-attrlist") && newConfig.extensions.push("attr_list");
 | 
			
		||||
		utils.getInputChecked("#input-markdownextra-footnotes") && newConfig.extensions.push("footnotes");
 | 
			
		||||
		utils.getInputChecked("#input-markdownextra-smartypants") && newConfig.extensions.push("smartypants");
 | 
			
		||||
		utils.getInputChecked("#input-markdownextra-strikethrough") && newConfig.extensions.push("strikethrough");
 | 
			
		||||
		utils.getInputChecked("#input-markdownextra-newlines") && newConfig.extensions.push("newlines");
 | 
			
		||||
		newConfig.intraword = utils.getInputChecked("#input-markdownextra-intraword");
 | 
			
		||||
		newConfig.comments = utils.getInputChecked("#input-markdownextra-comments");
 | 
			
		||||
		newConfig.highlighter = utils.getInputValue("#input-markdownextra-highlighter");
 | 
			
		||||
		newConfig.diagrams = utils.getInputChecked("#input-markdownextra-diagrams");
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
    var previewContentsElt;
 | 
			
		||||
    markdownExtra.onReady = function() {
 | 
			
		||||
        previewContentsElt = document.getElementById('preview-contents');
 | 
			
		||||
    };
 | 
			
		||||
	var eventMgr;
 | 
			
		||||
	markdownExtra.onEventMgrCreated = function(eventMgrParameter) {
 | 
			
		||||
		eventMgr = eventMgrParameter;
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
    markdownExtra.onPagedownConfigure = function(editor) {
 | 
			
		||||
        var converter = editor.getConverter();
 | 
			
		||||
        if(markdownExtra.config.intraword === true) {
 | 
			
		||||
            var converterOptions = {
 | 
			
		||||
                _DoItalicsAndBold: function(text) {
 | 
			
		||||
                    text = text.replace(/([^\w*]|^)(\*\*|__)(?=\S)(.+?[*_]*)(?=\S)\2(?=[^\w*]|$)/g, "$1<strong>$3</strong>");
 | 
			
		||||
                    text = text.replace(/([^\w*]|^)(\*|_)(?=\S)(.+?)(?=\S)\2(?=[^\w*]|$)/g, "$1<em>$3</em>");
 | 
			
		||||
                    return text;
 | 
			
		||||
                }
 | 
			
		||||
            };
 | 
			
		||||
            converter.setOptions(converterOptions);
 | 
			
		||||
        }
 | 
			
		||||
        if(markdownExtra.config.comments === true) {
 | 
			
		||||
            converter.hooks.chain("postConversion", function(text) {
 | 
			
		||||
                return text.replace(/<!--.*?-->/g, function(wholeMatch) {
 | 
			
		||||
                    return wholeMatch.replace(/^<!---(.+?)-?-->$/, ' <span class="comment label label-danger">$1</span> ');
 | 
			
		||||
                });
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
	var previewContentsElt;
 | 
			
		||||
	markdownExtra.onReady = function() {
 | 
			
		||||
		previewContentsElt = document.getElementById('preview-contents');
 | 
			
		||||
		utils.createTooltip(".tooltip-markdown-extra-diagrams", tooltipMarkdownExtraDiagramsHTML);
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
        var extraOptions = {
 | 
			
		||||
            extensions: markdownExtra.config.extensions
 | 
			
		||||
        };
 | 
			
		||||
	var onAsyncPreview = function(cb) {
 | 
			
		||||
		cb();
 | 
			
		||||
	};
 | 
			
		||||
	markdownExtra.onAsyncPreview = function(cb) {
 | 
			
		||||
		onAsyncPreview(cb);
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
        function doSequenceDiagrams() {
 | 
			
		||||
            _.each(previewContentsElt.querySelectorAll('.prettyprint > .language-sequence'), function(elt) {
 | 
			
		||||
                try {
 | 
			
		||||
                    var diagram = sequenceDiagram.parse(elt.textContent);
 | 
			
		||||
                    var preElt = elt.parentNode;
 | 
			
		||||
                    var containerElt = crel('div', {
 | 
			
		||||
                        class: 'sequence-diagram'
 | 
			
		||||
                    });
 | 
			
		||||
                    preElt.parentNode.replaceChild(containerElt, preElt);
 | 
			
		||||
                    diagram.drawSVG(containerElt, {
 | 
			
		||||
                        theme: 'simple'
 | 
			
		||||
                    });
 | 
			
		||||
                }
 | 
			
		||||
                catch(e) {
 | 
			
		||||
                    console.error(e);
 | 
			
		||||
                }
 | 
			
		||||
            });
 | 
			
		||||
            _.each(previewContentsElt.querySelectorAll('.prettyprint > .language-flow'), function(elt) {
 | 
			
		||||
                try {
 | 
			
		||||
                    var chart = flowChart.parse(elt.textContent);
 | 
			
		||||
                    var preElt = elt.parentNode;
 | 
			
		||||
                    var containerElt = crel('div', {
 | 
			
		||||
                        class: 'flow-chart'
 | 
			
		||||
                    });
 | 
			
		||||
                    preElt.parentNode.replaceChild(containerElt, preElt);
 | 
			
		||||
                    chart.drawSVG(containerElt, {
 | 
			
		||||
                        'line-width': 2
 | 
			
		||||
                    });
 | 
			
		||||
                }
 | 
			
		||||
                catch(e) {
 | 
			
		||||
                    console.error(e);
 | 
			
		||||
                }
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
        if(markdownExtra.config.highlighter == "highlight") {
 | 
			
		||||
            extraOptions.highlighter = "prettify";
 | 
			
		||||
            editor.hooks.chain("onPreviewRefresh", function() {
 | 
			
		||||
                doSequenceDiagrams();
 | 
			
		||||
                _.each(previewContentsElt.querySelectorAll('.prettyprint > code'), function(elt) {
 | 
			
		||||
                    !elt.highlighted && hljs.highlightBlock(elt);
 | 
			
		||||
                    elt.highlighted = true;
 | 
			
		||||
                });
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
        else if(markdownExtra.config.highlighter == "prettify") {
 | 
			
		||||
            extraOptions.highlighter = "prettify";
 | 
			
		||||
            editor.hooks.chain("onPreviewRefresh", function() {
 | 
			
		||||
                doSequenceDiagrams();
 | 
			
		||||
                prettify.prettyPrint();
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
        Markdown.Extra.init(converter, extraOptions);
 | 
			
		||||
    };
 | 
			
		||||
	var extraOptions;
 | 
			
		||||
	markdownExtra.onInit = function() {
 | 
			
		||||
		var sequenceDiagramEltList, flowChartEltList, highlightEltList, prettifyEltList;
 | 
			
		||||
		extraOptions = {
 | 
			
		||||
			extensions: markdownExtra.config.extensions
 | 
			
		||||
		};
 | 
			
		||||
 | 
			
		||||
    return markdownExtra;
 | 
			
		||||
		function doSequenceDiagram(cb) {
 | 
			
		||||
			if(sequenceDiagramEltList.length === 0) {
 | 
			
		||||
				return cb();
 | 
			
		||||
			}
 | 
			
		||||
			var sequenceDiagramElt = sequenceDiagramEltList.pop();
 | 
			
		||||
			try {
 | 
			
		||||
				var diagram = sequenceDiagram.parse(sequenceDiagramElt.textContent);
 | 
			
		||||
				var preElt = sequenceDiagramElt.parentNode;
 | 
			
		||||
				var containerElt = crel('div', {
 | 
			
		||||
					class: 'sequence-diagram'
 | 
			
		||||
				});
 | 
			
		||||
				preElt.parentNode.replaceChild(containerElt, preElt);
 | 
			
		||||
				diagram.drawSVG(containerElt, {
 | 
			
		||||
					theme: 'simple'
 | 
			
		||||
				});
 | 
			
		||||
			}
 | 
			
		||||
			catch(e) {
 | 
			
		||||
			}
 | 
			
		||||
			_.delay(doSequenceDiagram, 0, cb);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		function doFlowChart(cb) {
 | 
			
		||||
			if(flowChartEltList.length === 0) {
 | 
			
		||||
				return cb();
 | 
			
		||||
			}
 | 
			
		||||
			var flowChartElt = flowChartEltList.pop();
 | 
			
		||||
			try {
 | 
			
		||||
				var chart = flowChart.parse(flowChartElt.textContent);
 | 
			
		||||
				var preElt = flowChartElt.parentNode;
 | 
			
		||||
				var containerElt = crel('div', {
 | 
			
		||||
					class: 'flow-chart'
 | 
			
		||||
				});
 | 
			
		||||
				preElt.parentNode.replaceChild(containerElt, preElt);
 | 
			
		||||
				chart.drawSVG(containerElt, {
 | 
			
		||||
					'line-width': 2
 | 
			
		||||
				});
 | 
			
		||||
			}
 | 
			
		||||
			catch(e) {
 | 
			
		||||
			}
 | 
			
		||||
			_.delay(doFlowChart, 0, cb);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		function doHighlight(cb) {
 | 
			
		||||
			if(highlightEltList.length === 0) {
 | 
			
		||||
				return cb();
 | 
			
		||||
			}
 | 
			
		||||
			var highlightElt = highlightEltList.pop();
 | 
			
		||||
			hljs.highlightBlock(highlightElt);
 | 
			
		||||
			highlightElt.highlighted = true;
 | 
			
		||||
			_.delay(doHighlight, 0, cb);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		function doPrettify(cb) {
 | 
			
		||||
			if(prettifyEltList.length === 0) {
 | 
			
		||||
				return cb();
 | 
			
		||||
			}
 | 
			
		||||
			var prettifyElt = prettifyEltList.pop();
 | 
			
		||||
			var html = prettify.prettyPrintOne(prettifyElt.innerHTML);
 | 
			
		||||
			prettifyElt.innerHTML = html;
 | 
			
		||||
			prettifyElt.highlighted = true;
 | 
			
		||||
			_.delay(doPrettify, 0, cb);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if(markdownExtra.config.highlighter == "highlight") {
 | 
			
		||||
			extraOptions.highlighter = "prettify";
 | 
			
		||||
			var afterHighlight = onAsyncPreview;
 | 
			
		||||
			onAsyncPreview = function(cb) {
 | 
			
		||||
				highlightEltList = _.filter(previewContentsElt.querySelectorAll('.prettyprint > code'), function(elt) {
 | 
			
		||||
					return !elt.highlighted;
 | 
			
		||||
				});
 | 
			
		||||
				_.delay(doHighlight, 0, function() {
 | 
			
		||||
					afterHighlight(cb);
 | 
			
		||||
				});
 | 
			
		||||
			};
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if(markdownExtra.config.highlighter == "prettify") {
 | 
			
		||||
			extraOptions.highlighter = "prettify";
 | 
			
		||||
			var afterPrettify = onAsyncPreview;
 | 
			
		||||
			onAsyncPreview = function(cb) {
 | 
			
		||||
				prettifyEltList = _.filter(previewContentsElt.querySelectorAll('.prettyprint > code'), function(elt) {
 | 
			
		||||
					return !elt.highlighted;
 | 
			
		||||
				});
 | 
			
		||||
				_.delay(doPrettify, 0, function() {
 | 
			
		||||
					afterPrettify(cb);
 | 
			
		||||
				});
 | 
			
		||||
			};
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if(markdownExtra.config.diagrams) {
 | 
			
		||||
			extraOptions.highlighter = "prettify";
 | 
			
		||||
			var afterDiagrams = onAsyncPreview;
 | 
			
		||||
			onAsyncPreview = function(cb) {
 | 
			
		||||
				sequenceDiagramEltList = Array.prototype.slice.call(previewContentsElt.querySelectorAll('.prettyprint > .language-sequence'));
 | 
			
		||||
				flowChartEltList = Array.prototype.slice.call(previewContentsElt.querySelectorAll('.prettyprint > .language-flow'));
 | 
			
		||||
				_.delay(doSequenceDiagram, 0, function() {
 | 
			
		||||
					_.delay(doFlowChart, 0, function() {
 | 
			
		||||
						afterDiagrams(cb);
 | 
			
		||||
					});
 | 
			
		||||
				});
 | 
			
		||||
			};
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	markdownExtra.onPagedownConfigure = function(editor) {
 | 
			
		||||
		var converter = editor.getConverter();
 | 
			
		||||
		if(markdownExtra.config.intraword === true) {
 | 
			
		||||
			var converterOptions = {
 | 
			
		||||
				_DoItalicsAndBold: function(text) {
 | 
			
		||||
					text = text.replace(/([^\w*]|^)(\*\*|__)(?=\S)(.+?[*_]*)(?=\S)\2(?=[^\w*]|$)/g, "$1<strong>$3</strong>");
 | 
			
		||||
					text = text.replace(/([^\w*]|^)(\*|_)(?=\S)(.+?)(?=\S)\2(?=[^\w*]|$)/g, "$1<em>$3</em>");
 | 
			
		||||
					return text;
 | 
			
		||||
				}
 | 
			
		||||
			};
 | 
			
		||||
			converter.setOptions(converterOptions);
 | 
			
		||||
		}
 | 
			
		||||
		if(markdownExtra.config.comments === true) {
 | 
			
		||||
			converter.hooks.chain("postConversion", function(text) {
 | 
			
		||||
				return text.replace(/<!--.*?-->/g, function(wholeMatch) {
 | 
			
		||||
					return wholeMatch.replace(/^<!---(.+?)-?-->$/, ' <span class="comment label label-danger">$1</span> ');
 | 
			
		||||
				});
 | 
			
		||||
			});
 | 
			
		||||
		}
 | 
			
		||||
		Markdown.Extra.init(converter, extraOptions);
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	return markdownExtra;
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
@ -1,73 +1,78 @@
 | 
			
		||||
define([
 | 
			
		||||
    "jquery",
 | 
			
		||||
    "underscore",
 | 
			
		||||
    "utils",
 | 
			
		||||
    "mousetrap",
 | 
			
		||||
    "classes/Extension",
 | 
			
		||||
    "text!extensions/shortcutsDefaultMapping.settings",
 | 
			
		||||
    "text!html/shortcutsSettingsBlock.html",
 | 
			
		||||
], function($, _, utils, mousetrap, Extension, shortcutsDefaultMapping, shortcutsSettingsBlockHTML) {
 | 
			
		||||
	"jquery",
 | 
			
		||||
	"underscore",
 | 
			
		||||
	"utils",
 | 
			
		||||
	"mousetrap",
 | 
			
		||||
	"classes/Extension",
 | 
			
		||||
	"text!extensions/shortcutsDefaultMapping.settings",
 | 
			
		||||
	"text!html/shortcutsSettingsBlock.html",
 | 
			
		||||
	"text!html/tooltipSettingsShortcutsExtension.html"
 | 
			
		||||
], function($, _, utils, mousetrap, Extension, shortcutsDefaultMapping, shortcutsSettingsBlockHTML, tooltipSettingsShortcutsExtensionHTML) {
 | 
			
		||||
 | 
			
		||||
    var shortcuts = new Extension("shortcuts", "Shortcuts", true, true);
 | 
			
		||||
    shortcuts.settingsBlock = shortcutsSettingsBlockHTML;
 | 
			
		||||
    shortcuts.defaultConfig = {
 | 
			
		||||
        mapping: shortcutsDefaultMapping,
 | 
			
		||||
    };
 | 
			
		||||
	var shortcuts = new Extension("shortcuts", "Shortcuts", true, true);
 | 
			
		||||
	shortcuts.settingsBlock = shortcutsSettingsBlockHTML;
 | 
			
		||||
	shortcuts.defaultConfig = {
 | 
			
		||||
		mapping: shortcutsDefaultMapping
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
    var eventMgr;
 | 
			
		||||
    var pagedownEditor;
 | 
			
		||||
    shortcuts.onEventMgrCreated = function(eventMgrParameter) {
 | 
			
		||||
        eventMgr = eventMgrParameter;
 | 
			
		||||
        eventMgr.addListener('onPagedownConfigure', function(pagedownEditorParam) {
 | 
			
		||||
            pagedownEditor = pagedownEditorParam;
 | 
			
		||||
        });
 | 
			
		||||
    };
 | 
			
		||||
	var eventMgr;
 | 
			
		||||
	var pagedownEditor;
 | 
			
		||||
	shortcuts.onEventMgrCreated = function(eventMgrParameter) {
 | 
			
		||||
		eventMgr = eventMgrParameter;
 | 
			
		||||
		eventMgr.addListener('onPagedownConfigure', function(pagedownEditorParam) {
 | 
			
		||||
			pagedownEditor = pagedownEditorParam;
 | 
			
		||||
		});
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
    shortcuts.onLoadSettings = function() {
 | 
			
		||||
        utils.setInputValue("#textarea-shortcuts-mapping", shortcuts.config.mapping);
 | 
			
		||||
    };
 | 
			
		||||
	shortcuts.onLoadSettings = function() {
 | 
			
		||||
		utils.setInputValue("#textarea-shortcuts-mapping", shortcuts.config.mapping);
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
    shortcuts.onSaveSettings = function(newConfig, event) {
 | 
			
		||||
        newConfig.code = utils.getInputValue("#textarea-shortcuts-mapping");
 | 
			
		||||
        try {
 | 
			
		||||
            /*jshint evil: true */
 | 
			
		||||
            eval('var test = ' + newConfig.code);
 | 
			
		||||
        }
 | 
			
		||||
        catch(e) {
 | 
			
		||||
            eventMgr.onError(e);
 | 
			
		||||
            // Mark the textarea as error
 | 
			
		||||
            utils.getInputTextValue("#textarea-shortcuts-mapping", event, /^$/);
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
	shortcuts.onSaveSettings = function(newConfig, event) {
 | 
			
		||||
		newConfig.code = utils.getInputValue("#textarea-shortcuts-mapping");
 | 
			
		||||
		try {
 | 
			
		||||
			/*jshint evil: true */
 | 
			
		||||
			eval('var test = ' + newConfig.code);
 | 
			
		||||
		}
 | 
			
		||||
		catch(e) {
 | 
			
		||||
			eventMgr.onError(e);
 | 
			
		||||
			// Mark the textarea as error
 | 
			
		||||
			utils.getInputTextValue("#textarea-shortcuts-mapping", event, /^$/);
 | 
			
		||||
		}
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
    /*jshint unused:false */
 | 
			
		||||
    function bindPagedownButton(buttonName) {
 | 
			
		||||
        return function(evt) {
 | 
			
		||||
            pagedownEditor.uiManager.doClick(pagedownEditor.uiManager.buttons[buttonName]);
 | 
			
		||||
            evt.preventDefault();
 | 
			
		||||
        };
 | 
			
		||||
    }
 | 
			
		||||
	/*jshint unused:false */
 | 
			
		||||
	function bindPagedownButton(buttonName) {
 | 
			
		||||
		return function(evt) {
 | 
			
		||||
			pagedownEditor.uiManager.doClick(pagedownEditor.uiManager.buttons[buttonName]);
 | 
			
		||||
			evt.preventDefault();
 | 
			
		||||
		};
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
    function expand(text, replacement) {
 | 
			
		||||
        utils.defer(function() {
 | 
			
		||||
            require('editor').replacePreviousText(text, replacement);
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
	function expand(text, replacement) {
 | 
			
		||||
		utils.defer(function() {
 | 
			
		||||
			require('editor').replacePreviousText(text, replacement);
 | 
			
		||||
		});
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
    /*jshint unused:true */
 | 
			
		||||
    shortcuts.onInit = function() {
 | 
			
		||||
        try {
 | 
			
		||||
            /*jshint evil: true */
 | 
			
		||||
            var shortcutMap;
 | 
			
		||||
            eval('shortcutMap = ' + shortcuts.config.mapping);
 | 
			
		||||
            _.each(shortcutMap, function(func, shortcut) {
 | 
			
		||||
                mousetrap.bind(shortcut, func);
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
        catch(e) {
 | 
			
		||||
            console.error(e);
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
	/*jshint unused:true */
 | 
			
		||||
	shortcuts.onInit = function() {
 | 
			
		||||
		try {
 | 
			
		||||
			/*jshint evil: true */
 | 
			
		||||
			var shortcutMap;
 | 
			
		||||
			eval('shortcutMap = ' + shortcuts.config.mapping);
 | 
			
		||||
			_.each(shortcutMap, function(func, shortcut) {
 | 
			
		||||
				mousetrap.bind(shortcut, func);
 | 
			
		||||
			});
 | 
			
		||||
		}
 | 
			
		||||
		catch(e) {
 | 
			
		||||
			console.error(e);
 | 
			
		||||
		}
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
    return shortcuts;
 | 
			
		||||
	shortcuts.onReady = function() {
 | 
			
		||||
		utils.createTooltip(".tooltip-shortcuts-extension", tooltipSettingsShortcutsExtensionHTML);
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	return shortcuts;
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
@ -1,65 +1,70 @@
 | 
			
		||||
define([
 | 
			
		||||
    "jquery",
 | 
			
		||||
    "underscore",
 | 
			
		||||
    "utils",
 | 
			
		||||
    "classes/Extension",
 | 
			
		||||
    "fileSystem",
 | 
			
		||||
    "settings",
 | 
			
		||||
    "text!html/userCustomSettingsBlock.html",
 | 
			
		||||
], function($, _, utils, Extension, fileSystem, settings, userCustomSettingsBlockHTML) {
 | 
			
		||||
	"jquery",
 | 
			
		||||
	"underscore",
 | 
			
		||||
	"utils",
 | 
			
		||||
	"classes/Extension",
 | 
			
		||||
	"fileSystem",
 | 
			
		||||
	"settings",
 | 
			
		||||
	"text!html/userCustomSettingsBlock.html",
 | 
			
		||||
	"text!html/tooltipUserCustomExtension.html"
 | 
			
		||||
], function($, _, utils, Extension, fileSystem, settings, userCustomSettingsBlockHTML, tooltipUserCustomExtensionHTML) {
 | 
			
		||||
 | 
			
		||||
    var userCustom = new Extension("userCustom", "UserCustom extension", true);
 | 
			
		||||
    userCustom.settingsBlock = userCustomSettingsBlockHTML;
 | 
			
		||||
    userCustom.defaultConfig = {
 | 
			
		||||
        code: "",
 | 
			
		||||
    };
 | 
			
		||||
	var userCustom = new Extension("userCustom", "UserCustom extension", true);
 | 
			
		||||
	userCustom.settingsBlock = userCustomSettingsBlockHTML;
 | 
			
		||||
	userCustom.defaultConfig = {
 | 
			
		||||
		code: ""
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
    var fileMgr;
 | 
			
		||||
    userCustom.onFileMgrCreated = function(fileMgrParameter) {
 | 
			
		||||
        fileMgr = fileMgrParameter;
 | 
			
		||||
    };
 | 
			
		||||
	var fileMgr;
 | 
			
		||||
	userCustom.onFileMgrCreated = function(fileMgrParameter) {
 | 
			
		||||
		fileMgr = fileMgrParameter;
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
    var synchronizer;
 | 
			
		||||
    userCustom.onSynchronizerCreated = function(synchronizerParameter) {
 | 
			
		||||
        synchronizer = synchronizerParameter;
 | 
			
		||||
    };
 | 
			
		||||
	var synchronizer;
 | 
			
		||||
	userCustom.onSynchronizerCreated = function(synchronizerParameter) {
 | 
			
		||||
		synchronizer = synchronizerParameter;
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
    var publisher;
 | 
			
		||||
    userCustom.onPublisherCreated = function(publisherParameter) {
 | 
			
		||||
        publisher = publisherParameter;
 | 
			
		||||
    };
 | 
			
		||||
	var publisher;
 | 
			
		||||
	userCustom.onPublisherCreated = function(publisherParameter) {
 | 
			
		||||
		publisher = publisherParameter;
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
    var eventMgr;
 | 
			
		||||
    userCustom.onEventMgrCreated = function(eventMgrParameter) {
 | 
			
		||||
        eventMgr = eventMgrParameter;
 | 
			
		||||
    };
 | 
			
		||||
	var eventMgr;
 | 
			
		||||
	userCustom.onEventMgrCreated = function(eventMgrParameter) {
 | 
			
		||||
		eventMgr = eventMgrParameter;
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
    userCustom.onLoadSettings = function() {
 | 
			
		||||
        utils.setInputValue("#textarea-usercustom-code", userCustom.config.code);
 | 
			
		||||
    };
 | 
			
		||||
	userCustom.onLoadSettings = function() {
 | 
			
		||||
		utils.setInputValue("#textarea-usercustom-code", userCustom.config.code);
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
    userCustom.onSaveSettings = function(newConfig, event) {
 | 
			
		||||
        newConfig.code = utils.getInputValue("#textarea-usercustom-code");
 | 
			
		||||
        try {
 | 
			
		||||
            /*jshint evil: true */
 | 
			
		||||
            eval(newConfig.code);
 | 
			
		||||
        }
 | 
			
		||||
        catch(e) {
 | 
			
		||||
            eventMgr.onError(e);
 | 
			
		||||
            // Mark the textarea as error
 | 
			
		||||
            utils.getInputTextValue("#textarea-usercustom-code", event, /^$/);
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
	userCustom.onSaveSettings = function(newConfig, event) {
 | 
			
		||||
		newConfig.code = utils.getInputValue("#textarea-usercustom-code");
 | 
			
		||||
		try {
 | 
			
		||||
			/*jshint evil: true */
 | 
			
		||||
			eval(newConfig.code);
 | 
			
		||||
		}
 | 
			
		||||
		catch(e) {
 | 
			
		||||
			eventMgr.onError(e);
 | 
			
		||||
			// Mark the textarea as error
 | 
			
		||||
			utils.getInputTextValue("#textarea-usercustom-code", event, /^$/);
 | 
			
		||||
		}
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
    userCustom.onInit = function() {
 | 
			
		||||
        try {
 | 
			
		||||
            /*jshint evil: true */
 | 
			
		||||
            eval(userCustom.config.code);
 | 
			
		||||
        }
 | 
			
		||||
        catch(e) {
 | 
			
		||||
            console.error(e);
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
	userCustom.onInit = function() {
 | 
			
		||||
		try {
 | 
			
		||||
			/*jshint evil: true */
 | 
			
		||||
			eval(userCustom.config.code);
 | 
			
		||||
		}
 | 
			
		||||
		catch(e) {
 | 
			
		||||
			console.error(e);
 | 
			
		||||
		}
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
    return userCustom;
 | 
			
		||||
	userCustom.onReady = function() {
 | 
			
		||||
		utils.createTooltip(".tooltip-usercustom-extension", tooltipUserCustomExtensionHTML);
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	return userCustom;
 | 
			
		||||
});
 | 
			
		||||
@ -198,7 +198,7 @@
 | 
			
		||||
	        </ul>
 | 
			
		||||
			<div class="input-group">
 | 
			
		||||
				<span class="input-group-addon"><i class="icon-search"></i></span><input
 | 
			
		||||
					type="text" class="form-control" placeholder="Find document"></input>
 | 
			
		||||
					type="text" class="form-control" placeholder="Find document" />
 | 
			
		||||
			</div>
 | 
			
		||||
		</div>
 | 
			
		||||
		<div class="panel-content">
 | 
			
		||||
@ -278,7 +278,7 @@
 | 
			
		||||
				<div class="input-group">
 | 
			
		||||
					<span class="input-group-addon"><i class="icon-globe"></i></span><input
 | 
			
		||||
						id="input-insert-link" type="text" class="col-sm-5 form-control"
 | 
			
		||||
						placeholder='http://example.com/ "optional title"'></input>
 | 
			
		||||
						placeholder='http://example.com/ "optional title"' />
 | 
			
		||||
				</div>
 | 
			
		||||
			</div>
 | 
			
		||||
			<div class="modal-footer">
 | 
			
		||||
@ -305,7 +305,7 @@
 | 
			
		||||
				<div class="input-group">
 | 
			
		||||
					<span class="input-group-addon"><i class="icon-picture"></i></span><input
 | 
			
		||||
						id="input-insert-image" type="text" class="col-sm-5 form-control"
 | 
			
		||||
						placeholder='http://example.com/image.jpg "optional title"'></input>
 | 
			
		||||
						placeholder='http://example.com/image.jpg "optional title"' />
 | 
			
		||||
				</div>
 | 
			
		||||
			</div>
 | 
			
		||||
			<div class="modal-footer">
 | 
			
		||||
@ -963,7 +963,7 @@
 | 
			
		||||
							</div>
 | 
			
		||||
							<div class="form-group">
 | 
			
		||||
								<label class="col-sm-4 control-label"
 | 
			
		||||
									for="input-settings-gdrive-multiaccount">Google Drive multi-accounts</a>
 | 
			
		||||
									for="input-settings-gdrive-multiaccount">Google Drive multi-accounts
 | 
			
		||||
								</label>
 | 
			
		||||
								<div class="col-sm-7">
 | 
			
		||||
									<select id="input-settings-gdrive-multiaccount" class="form-control">
 | 
			
		||||
@ -1082,7 +1082,7 @@
 | 
			
		||||
							</div>
 | 
			
		||||
							<div class="form-group">
 | 
			
		||||
								<label class="col-sm-4 control-label"
 | 
			
		||||
									for="input-settings-markdown-mime-type">Markdown MIME type</a>
 | 
			
		||||
									for="input-settings-markdown-mime-type">Markdown MIME type
 | 
			
		||||
								</label>
 | 
			
		||||
								<div class="col-sm-7">
 | 
			
		||||
									<select id="input-settings-markdown-mime-type" class="form-control">
 | 
			
		||||
@ -1159,7 +1159,7 @@
 | 
			
		||||
								data-dismiss="modal"><i class="icon-help-circled"></i>
 | 
			
		||||
								Welcome document</a> <a href="#"
 | 
			
		||||
								class="btn btn-block btn-primary action-welcome-tour"
 | 
			
		||||
								data-dismiss="modal" data-dismiss="modal"><i
 | 
			
		||||
								data-dismiss="modal"><i
 | 
			
		||||
								class="icon-help-circled"></i> Welcome tour</a>
 | 
			
		||||
						</div>
 | 
			
		||||
						<div class="tab-pane-button-container">
 | 
			
		||||
 | 
			
		||||
@ -100,6 +100,15 @@
 | 
			
		||||
			</select>
 | 
			
		||||
		</div>
 | 
			
		||||
	</div>
 | 
			
		||||
    <div class="form-group">
 | 
			
		||||
        <label class="col-sm-4 control-label"
 | 
			
		||||
               for="input-markdownextra-diagrams">Diagrams <a href="#" class="tooltip-markdown-extra-diagrams">(?)</a></label>
 | 
			
		||||
        <div class="col-sm-7">
 | 
			
		||||
            <div class="checkbox">
 | 
			
		||||
                <input type="checkbox" id="input-markdownextra-diagrams">
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
    </div>
 | 
			
		||||
</div>
 | 
			
		||||
<span class="help-block pull-right"><a target="_blank"
 | 
			
		||||
	href="https://github.com/jmcmanus/pagedown-extra">More info</a></span>
 | 
			
		||||
							
								
								
									
										23
									
								
								public/res/html/tooltipMarkdownExtraDiagrams.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								public/res/html/tooltipMarkdownExtraDiagrams.html
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,23 @@
 | 
			
		||||
You can create sequence diagrams like this:
 | 
			
		||||
<br />
 | 
			
		||||
<br />
 | 
			
		||||
```sequence<br />
 | 
			
		||||
Alice->Bob: Hello Bob, how are you?
 | 
			
		||||
Bob-->Alice: I am good thanks!
 | 
			
		||||
```<br />
 | 
			
		||||
<a target="_blank" href="http://bramp.github.io/js-sequence-diagrams/">More info</a>
 | 
			
		||||
<br />
 | 
			
		||||
<br />
 | 
			
		||||
Or flow charts like this:
 | 
			
		||||
<br />
 | 
			
		||||
<br />
 | 
			
		||||
```flow<br />
 | 
			
		||||
st=>start: Start<br />
 | 
			
		||||
e=>end<br />
 | 
			
		||||
op=>operation: My Operation<br />
 | 
			
		||||
cond=>condition: Yes or No?<br />
 | 
			
		||||
st->op->cond<br />
 | 
			
		||||
cond(yes)->e<br />
 | 
			
		||||
cond(no)->op<br />
 | 
			
		||||
```<br />
 | 
			
		||||
<a target="_blank" href="http://adrai.github.io/flowchart.js/">More info</a>
 | 
			
		||||
@ -230,6 +230,15 @@ define([
 | 
			
		||||
        version = "v18";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
	if(version == 'v18') {
 | 
			
		||||
		if(_.has(localStorage, 'settings')) {
 | 
			
		||||
			settings = JSON.parse(localStorage.settings);
 | 
			
		||||
			((settings.extensionSettings || {}).markdownExtra || {}).diagrams = true;
 | 
			
		||||
			localStorage.settings = JSON.stringify(settings);
 | 
			
		||||
		}
 | 
			
		||||
		version = "v19";
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
    localStorage.version = version;
 | 
			
		||||
    return localStorage;
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
@ -132,6 +132,7 @@ hr {
 | 
			
		||||
 | 
			
		||||
.sequence-diagram, .flow-chart {
 | 
			
		||||
    text-align: center;
 | 
			
		||||
	margin-bottom: @p-margin;
 | 
			
		||||
    text {
 | 
			
		||||
        font-size: 1em !important;
 | 
			
		||||
        font-family: @font-family-sans-serif !important;
 | 
			
		||||
 | 
			
		||||
@ -256,6 +256,10 @@ a {
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.text-danger:hover {
 | 
			
		||||
    color: @state-danger-text;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.layout-panel() {
 | 
			
		||||
	position: absolute;
 | 
			
		||||
	top: 0;
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										1454
									
								
								public/res/utils.js
									
									
									
									
									
								
							
							
						
						
									
										1454
									
								
								public/res/utils.js
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
		Loading…
	
		Reference in New Issue
	
	Block a user