358 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			358 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| define([
 | |
|     'locales',
 | |
|     'handlebars',
 | |
|     'diffMatchPatch'
 | |
| ], function(locale, Handlebars, DiffMatchPatch) {
 | |
| 
 | |
|     /**
 | |
|      * Return a text as markdown.
 | |
|      * Currently only a little helper to replace apidoc-inline Links (#Group:Name).
 | |
|      * Should be replaced with a full markdown lib.
 | |
|      * @param string text
 | |
|      */
 | |
|     Handlebars.registerHelper('markdown', function(text) {
 | |
|         if ( ! text ) {
 | |
|           return text;
 | |
|         }
 | |
|         text = text.replace(/((\[(.*?)\])?\(#)((.+?):(.+?))(\))/mg, function(match, p1, p2, p3, p4, p5, p6) {
 | |
|           var link = p3 || p5 + '/' + p6;
 | |
|           return '<a href="#api-' + p5 + '-' + p6 + '">' + link + '</a>';
 | |
|         });
 | |
|         return text;
 | |
|     });
 | |
| 
 | |
|     /**
 | |
|      * start/stop timer for simple performance check.
 | |
|      */
 | |
|     var timer;
 | |
|     Handlebars.registerHelper('startTimer', function(text) {
 | |
|         timer = new Date();
 | |
|         return '';
 | |
|     });
 | |
| 
 | |
|     Handlebars.registerHelper('stopTimer', function(text) {
 | |
|         console.log(new Date() - timer);
 | |
|         return '';
 | |
|     });
 | |
| 
 | |
|     /**
 | |
|      * Return localized Text.
 | |
|      * @param string text
 | |
|      */
 | |
|     Handlebars.registerHelper('__', function(text) {
 | |
|         return locale.__(text);
 | |
|     });
 | |
| 
 | |
|     /**
 | |
|      * Console log.
 | |
|      * @param mixed obj
 | |
|      */
 | |
|     Handlebars.registerHelper('cl', function(obj) {
 | |
|         console.log(obj);
 | |
|         return '';
 | |
|     });
 | |
| 
 | |
|     /**
 | |
|      * Replace underscore with space.
 | |
|      * @param string text
 | |
|      */
 | |
|     Handlebars.registerHelper('underscoreToSpace', function(text) {
 | |
|         return text.replace(/(_+)/g, ' ');
 | |
|     });
 | |
| 
 | |
|     /**
 | |
|      *
 | |
|      */
 | |
|     Handlebars.registerHelper('assign', function(name) {
 | |
|         if(arguments.length > 0) {
 | |
|             var type = typeof(arguments[1]);
 | |
|             var arg = null;
 | |
|             if(type === 'string' || type === 'number' || type === 'boolean') arg = arguments[1];
 | |
|             Handlebars.registerHelper(name, function() { return arg; });
 | |
|         }
 | |
|         return '';
 | |
|     });
 | |
| 
 | |
|     /**
 | |
|      *
 | |
|      */
 | |
|     Handlebars.registerHelper('nl2br', function(text) {
 | |
|         return _handlebarsNewlineToBreak(text);
 | |
|     });
 | |
| 
 | |
|     /**
 | |
|      *
 | |
|      */
 | |
|     Handlebars.registerHelper('if_eq', function(context, options) {
 | |
|         var compare = context;
 | |
|         // Get length if context is an object
 | |
|         if (context instanceof Object && ! (options.hash.compare instanceof Object))
 | |
|              compare = Object.keys(context).length;
 | |
| 
 | |
|         if (compare === options.hash.compare)
 | |
|             return options.fn(this);
 | |
| 
 | |
|         return options.inverse(this);
 | |
|     });
 | |
| 
 | |
|     /**
 | |
|      *
 | |
|      */
 | |
|     Handlebars.registerHelper('if_gt', function(context, options) {
 | |
|         var compare = context;
 | |
|         // Get length if context is an object
 | |
|         if (context instanceof Object && ! (options.hash.compare instanceof Object))
 | |
|              compare = Object.keys(context).length;
 | |
| 
 | |
|         if(compare > options.hash.compare)
 | |
|             return options.fn(this);
 | |
| 
 | |
|         return options.inverse(this);
 | |
|     });
 | |
| 
 | |
|     /**
 | |
|      *
 | |
|      */
 | |
|     var templateCache = {};
 | |
|     Handlebars.registerHelper('subTemplate', function(name, sourceContext) {
 | |
|         if ( ! templateCache[name])
 | |
|             templateCache[name] = Handlebars.compile($('#template-' + name).html());
 | |
| 
 | |
|         var template = templateCache[name];
 | |
|         var templateContext = $.extend({}, this, sourceContext.hash);
 | |
|         return new Handlebars.SafeString( template(templateContext) );
 | |
|     });
 | |
| 
 | |
|     /**
 | |
|      *
 | |
|      */
 | |
|     Handlebars.registerHelper('toLowerCase', function(value) {
 | |
|         return (value && typeof value === 'string') ? value.toLowerCase() : '';
 | |
|     });
 | |
| 
 | |
|     /**
 | |
|      *
 | |
|      */
 | |
|     Handlebars.registerHelper('splitFill', function(value, splitChar, fillChar) {
 | |
|         var splits = value.split(splitChar);
 | |
|         return new Array(splits.length).join(fillChar) + splits[splits.length - 1];
 | |
|     });
 | |
| 
 | |
|     /**
 | |
|      * Convert Newline to HTML-Break (nl2br).
 | |
|      *
 | |
|      * @param {String} text
 | |
|      * @returns {String}
 | |
|      */
 | |
|     function _handlebarsNewlineToBreak(text) {
 | |
|         return ('' + text).replace(/([^>\r\n]?)(\r\n|\n\r|\r|\n)/g, '$1' + '<br>' + '$2');
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      *
 | |
|      */
 | |
|     Handlebars.registerHelper('each_compare_list_field', function(source, compare, options) {
 | |
|         var fieldName = options.hash.field;
 | |
|         var newSource = [];
 | |
|         if (source) {
 | |
|             source.forEach(function(entry) {
 | |
|                 var values = entry;
 | |
|                 values['key'] = entry[fieldName];
 | |
|                 newSource.push(values);
 | |
|             });
 | |
|         }
 | |
| 
 | |
|         var newCompare = [];
 | |
|         if (compare) {
 | |
|             compare.forEach(function(entry) {
 | |
|                 var values = entry;
 | |
|                 values['key'] = entry[fieldName];
 | |
|                 newCompare.push(values);
 | |
|             });
 | |
|         }
 | |
|         return _handlebarsEachCompared('key', newSource, newCompare, options);
 | |
|     });
 | |
| 
 | |
|     /**
 | |
|      *
 | |
|      */
 | |
|     Handlebars.registerHelper('each_compare_keys', function(source, compare, options) {
 | |
|         var newSource = [];
 | |
|         if (source) {
 | |
|             var sourceFields = Object.keys(source);
 | |
|             sourceFields.forEach(function(name) {
 | |
|                 var values = {};
 | |
|                 values['value'] = source[name];
 | |
|                 values['key'] = name;
 | |
|                 newSource.push(values);
 | |
|             });
 | |
|         }
 | |
| 
 | |
|         var newCompare = [];
 | |
|         if (compare) {
 | |
|             var compareFields = Object.keys(compare);
 | |
|             compareFields.forEach(function(name) {
 | |
|                 var values = {};
 | |
|                 values['value'] = compare[name];
 | |
|                 values['key'] = name;
 | |
|                 newCompare.push(values);
 | |
|             });
 | |
|         }
 | |
|         return _handlebarsEachCompared('key', newSource, newCompare, options);
 | |
|     });
 | |
| 
 | |
|     /**
 | |
|      *
 | |
|      */
 | |
|     Handlebars.registerHelper('each_compare_field', function(source, compare, options) {
 | |
|         return _handlebarsEachCompared('field', source, compare, options);
 | |
|     });
 | |
| 
 | |
|     /**
 | |
|      *
 | |
|      */
 | |
|     Handlebars.registerHelper('each_compare_title', function(source, compare, options) {
 | |
|         return _handlebarsEachCompared('title', source, compare, options);
 | |
|     });
 | |
| 
 | |
|     /**
 | |
|      *
 | |
|      */
 | |
|     Handlebars.registerHelper('reformat', function(source, type){
 | |
|         if (type == 'json')
 | |
|             try {
 | |
|                return JSON.stringify(JSON.parse(source.trim()),null, "    ");
 | |
|             } catch(e) {
 | |
| 
 | |
|             }
 | |
|         return source
 | |
|     });
 | |
| 
 | |
|     /**
 | |
|      *
 | |
|      */
 | |
|     Handlebars.registerHelper('showDiff', function(source, compare, options) {
 | |
|         var ds = '';
 | |
|         if(source === compare) {
 | |
|             ds = source;
 | |
|         } else {
 | |
|             if( ! source)
 | |
|                 return compare;
 | |
| 
 | |
|             if( ! compare)
 | |
|                 return source;
 | |
| 
 | |
|             var d = diffMatchPatch.diff_main(compare, source);
 | |
|             diffMatchPatch.diff_cleanupSemantic(d);
 | |
|             ds = diffMatchPatch.diff_prettyHtml(d);
 | |
|             ds = ds.replace(/¶/gm, '');
 | |
|         }
 | |
|         if(options === 'nl2br')
 | |
|             ds = _handlebarsNewlineToBreak(ds);
 | |
| 
 | |
|         return ds;
 | |
|     });
 | |
| 
 | |
|     /**
 | |
|      *
 | |
|      */
 | |
|     function _handlebarsEachCompared(fieldname, source, compare, options)
 | |
|     {
 | |
|         var dataList = [];
 | |
|         var index = 0;
 | |
|         if(source) {
 | |
|             source.forEach(function(sourceEntry) {
 | |
|                 var found = false;
 | |
|                 if (compare) {
 | |
|                     compare.forEach(function(compareEntry) {
 | |
|                         if(sourceEntry[fieldname] === compareEntry[fieldname]) {
 | |
|                             var data = {
 | |
|                                 typeSame: true,
 | |
|                                 source: sourceEntry,
 | |
|                                 compare: compareEntry,
 | |
|                                 index: index
 | |
|                             };
 | |
|                             dataList.push(data);
 | |
|                             found = true;
 | |
|                             index++;
 | |
|                         }
 | |
|                     });
 | |
|                 }
 | |
|                 if ( ! found) {
 | |
|                     var data = {
 | |
|                         typeIns: true,
 | |
|                         source: sourceEntry,
 | |
|                         index: index
 | |
|                     };
 | |
|                     dataList.push(data);
 | |
|                     index++;
 | |
|                 }
 | |
|             });
 | |
|         }
 | |
| 
 | |
|         if (compare) {
 | |
|             compare.forEach(function(compareEntry) {
 | |
|                 var found = false;
 | |
|                 if (source) {
 | |
|                     source.forEach(function(sourceEntry) {
 | |
|                         if(sourceEntry[fieldname] === compareEntry[fieldname])
 | |
|                             found = true;
 | |
|                     });
 | |
|                 }
 | |
|                 if ( ! found) {
 | |
|                     var data = {
 | |
|                         typeDel: true,
 | |
|                         compare: compareEntry,
 | |
|                         index: index
 | |
|                     };
 | |
|                     dataList.push(data);
 | |
|                     index++;
 | |
|                 }
 | |
|             });
 | |
|         }
 | |
| 
 | |
|         var ret = '';
 | |
|         var length = dataList.length;
 | |
|         for (var index in dataList) {
 | |
|             if(index == (length - 1))
 | |
|                 dataList[index]['_last'] = true;
 | |
|             ret = ret + options.fn(dataList[index]);
 | |
|         }
 | |
|         return ret;
 | |
|     }
 | |
| 
 | |
|     var diffMatchPatch = new DiffMatchPatch();
 | |
| 
 | |
|     /**
 | |
|      * Overwrite Colors
 | |
|      */
 | |
|     DiffMatchPatch.prototype.diff_prettyHtml = function(diffs) {
 | |
|       var html = [];
 | |
|       var pattern_amp = /&/g;
 | |
|       var pattern_lt = /</g;
 | |
|       var pattern_gt = />/g;
 | |
|       var pattern_para = /\n/g;
 | |
|       for (var x = 0; x < diffs.length; x++) {
 | |
|         var op = diffs[x][0];    // Operation (insert, delete, equal)
 | |
|         var data = diffs[x][1];  // Text of change.
 | |
|         var text = data.replace(pattern_amp, '&').replace(pattern_lt, '<')
 | |
|             .replace(pattern_gt, '>').replace(pattern_para, '¶<br>');
 | |
|         switch (op) {
 | |
|           case DIFF_INSERT:
 | |
|             html[x] = '<ins>' + text + '</ins>';
 | |
|             break;
 | |
|           case DIFF_DELETE:
 | |
|             html[x] = '<del>' + text + '</del>';
 | |
|             break;
 | |
|           case DIFF_EQUAL:
 | |
|             html[x] = '<span>' + text + '</span>';
 | |
|             break;
 | |
|         }
 | |
|       }
 | |
|       return html.join('');
 | |
|     };
 | |
| 
 | |
|     // Exports
 | |
|     return Handlebars;
 | |
| });
 | 
