148 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			148 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| function preg_quote(str, delimiter) {
 | |
|     // Quote regular expression characters plus an optional character
 | |
|     //
 | |
|     // version: 1107.2516
 | |
|     // discuss at: http://phpjs.org/functions/preg_quote
 | |
|     // +   original by: booeyOH
 | |
|     // +   improved by: Ates Goral (http://magnetiq.com)
 | |
|     // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
 | |
|     // +   bugfixed by: Onno Marsman
 | |
|     // +   improved by: Brett Zamir (http://brett-zamir.me)
 | |
|     // *     example 1: preg_quote("$40");
 | |
|     // *     returns 1: '\$40'
 | |
|     // *     example 2: preg_quote("*RRRING* Hello?");
 | |
|     // *     returns 2: '\*RRRING\* Hello\?'
 | |
|     // *     example 3: preg_quote("\\.+*?[^]$(){}=!<>|:");
 | |
|     // *     returns 3: '\\\.\+\*\?\[\^\]\$\(\)\{\}\=\!\<\>\|\:'
 | |
|     return (str + '').replace(new RegExp('[.\\\\+*?\\[\\^\\]$(){}=!<>|:\\' + (delimiter || '') + '-]', 'g'), '\\$&');
 | |
| }
 | |
| 
 | |
| function loadScript(url, cb) {
 | |
|     var script;
 | |
|     script = document.createElement('script');
 | |
|     script.src = url;
 | |
|     script.onload = function () {
 | |
|         cb && cb({isNew: true})
 | |
|     };
 | |
|     document.getElementsByTagName('head')[0].appendChild(script);
 | |
| }
 | |
| 
 | |
| var Formula = {
 | |
|     mode: 'plain',
 | |
|     latexeasy: null,
 | |
|     init: function () {
 | |
|         // console.log('Formula.init')
 | |
|         Formula.initMode();
 | |
|         Formula.initEvent();
 | |
|         Formula.initSubmit();
 | |
|     },
 | |
|     renderPlain: function () {
 | |
|         var $preview = $('#preview');
 | |
|         var value = $('#editor').val();
 | |
|         if (!value) {
 | |
|             $preview.hide();
 | |
|             return;
 | |
|         }
 | |
|         value = encodeURIComponent(value);
 | |
|         var formulaConfig = editor.getOpt('formulaConfig');
 | |
|         var src = formulaConfig.imageUrlTemplate.replace(/\{\}/, value);
 | |
|         $('#previewImage').attr('src', src);
 | |
|         $preview.show();
 | |
|     },
 | |
|     setValuePlain: function (value) {
 | |
|         $('#editor').val(value);
 | |
|         Formula.renderPlain();
 | |
|     },
 | |
|     setValueLive: function (value) {
 | |
|         if (!Formula.latexeasy) {
 | |
|             setTimeout(function () {
 | |
|                 Formula.setValueLive(value);
 | |
|             }, 100);
 | |
|             return;
 | |
|         }
 | |
|         Formula.latexeasy.call('set.latex', {latex: value});
 | |
|     },
 | |
|     initMode: function () {
 | |
|         var formulaConfig = editor.getOpt('formulaConfig');
 | |
|         if ('live' === formulaConfig.editorMode) {
 | |
|             $('#liveEditor').attr('src', formulaConfig.editorLiveServer + '/editor');
 | |
|             $('#modeLive').show();
 | |
|             Formula.mode = 'live';
 | |
|         } else {
 | |
|             $('#modePlain').show();
 | |
|             Formula.mode = 'plain';
 | |
|         }
 | |
|         var img = editor.selection.getRange().getClosedNode();
 | |
|         if (img && img.getAttribute('data-formula-image') !== null) {
 | |
|             var value = img.getAttribute('data-formula-image');
 | |
|             if (value) {
 | |
|                 Formula.setValue(decodeURIComponent(value));
 | |
|             }
 | |
|         }
 | |
|     },
 | |
|     setValue: function (value) {
 | |
|         switch (Formula.mode) {
 | |
|             case 'plain':
 | |
|                 Formula.setValuePlain(value);
 | |
|                 break;
 | |
|             case 'live':
 | |
|                 Formula.setValueLive(value);
 | |
|                 break;
 | |
|         }
 | |
|     },
 | |
|     getValue: function (cb) {
 | |
|         switch (Formula.mode) {
 | |
|             case 'plain':
 | |
|                 cb($.trim($('#editor').val()));
 | |
|                 break;
 | |
|             case 'live':
 | |
|                 Formula.latexeasy.call('get.latex', {}, function (data) {
 | |
|                     cb(data.latex);
 | |
|                 });
 | |
|                 break;
 | |
|         }
 | |
|     },
 | |
|     initEvent: function () {
 | |
|         var changeTimer = null, le;
 | |
|         switch (Formula.mode) {
 | |
|             case 'plain':
 | |
|                 // console.log('Formula.initEvent');
 | |
|                 $('#editor').on('change keypress', function () {
 | |
|                     changeTimer && clearTimeout(changeTimer);
 | |
|                     changeTimer = setTimeout(function () {
 | |
|                         Formula.renderPlain();
 | |
|                     }, 1000);
 | |
|                 });
 | |
|                 $('#inputDemo').on('click', function () {
 | |
|                     $('#editor').val('f(a) = \\frac{1}{2\\pi i} \\oint\\frac{f(z)}{z-a}dz');
 | |
|                     Formula.renderPlain();
 | |
|                 });
 | |
|                 break;
 | |
|             case 'live':
 | |
|                 var formulaConfig = editor.getOpt('formulaConfig');
 | |
|                 loadScript(formulaConfig.editorLiveServer + '/vendor/LatexEasyEditor/editor/sdk.js', function () {
 | |
|                     le = new window.LatexEasy(document.getElementById('liveEditor'));
 | |
|                     le.on('ready', function () {
 | |
|                         Formula.latexeasy = le;
 | |
|                     });
 | |
|                     le.init();
 | |
|                 });
 | |
|                 break;
 | |
|         }
 | |
|     },
 | |
|     initSubmit: function () {
 | |
|         dialog.onclose = function (t, ok) {
 | |
|             if (!ok) {
 | |
|                 return true;
 | |
|             }
 | |
|             // console.log('onclose', t, ok);
 | |
|             Formula.getValue(function (value) {
 | |
|                 editor.execCommand('formula', value);
 | |
|                 editor.fireEvent('saveScene');
 | |
|                 dialog.close(false);
 | |
|             });
 | |
|             return false;
 | |
|         };
 | |
|     }
 | |
| };
 | 
