/************************************************************************ * This file is part of EspoCRM. * * EspoCRM - Open Source CRM application. * Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko * Website: http://www.espocrm.com * * EspoCRM is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * EspoCRM is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with EspoCRM. If not, see http://www.gnu.org/licenses/. ************************************************************************/ (function (Espo, _, Handlebars) { Espo.ViewHelper = function (options) { this.urlRegex = /(^|[^\[])(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig; this._registerHandlebarsHelpers(); this.mdSearch = [ /\("?(.*?)"?\)\[(.*?)\]/g, /\&\#x60;(([\s\S]*?)\&\#x60;)/, /(\*\*|__)(.*?)\1/, /(\*|_)(.*?)\1/, /\~\~(.*?)\~\~/ ]; this.mdReplace = [ '$1', '$2', '$2', '$2', '$1', ]; } _.extend(Espo.ViewHelper.prototype, { layoutManager: null, settings: null, user: null, preferences: null, language: null, tranformTextMarkdown: function (text) { var newline = text.indexOf('\r\n') != -1 ? '\r\n' : text.indexOf('\n') != -1 ? '\n' : ''; if (newline != '') { var d = []; var r = []; var p = text.split(newline); p.push(''); var isBlockLevel = false; p.forEach(function (item, i) { if (item.length >= 5 && item.indexOf('> ') === 0) { if (!isBlockLevel) { d = []; isBlockLevel = true; } d.push(item.replace(/> /gm, '')); } else { if (isBlockLevel) { r.push('
' + d.join(newline) + '
' + item) } else { r.push(item); } isBlockLevel = false; } }, this); r.pop(); var t = r.join(newline); return t; } return text; }, _registerHandlebarsHelpers: function () { var self = this; Handlebars.registerHelper('img', function (img) { return new Handlebars.SafeString(""); }); Handlebars.registerHelper('prop', function (object, name) { if (name in object) { return object[name]; } }); Handlebars.registerHelper('var', function (name, context, options) { return new Handlebars.SafeString(context[name]); }); Handlebars.registerHelper('concat', function (left, right) { return left + right; }); Handlebars.registerHelper('ifEqual', function (left, right, options) { if (left == right) { return options.fn(this); } return options.inverse(this); }); Handlebars.registerHelper('ifNotEqual', function (left, right, options) { if (left != right) { return options.fn(this); } return options.inverse(this); }); Handlebars.registerHelper('ifPropEquals', function (object, property, value, options) { if (object[property] == value) { return options.fn(this); } return options.inverse(this); }); Handlebars.registerHelper('ifAttrEquals', function (model, attr, value, options) { if (model.get(attr) == value) { return options.fn(this); } return options.inverse(this); }); Handlebars.registerHelper('ifAttrNotEmpty', function (model, attr, options) { if (model.get(attr)) { return options.fn(this); } return options.inverse(this); }); Handlebars.registerHelper('get', function (model, name) { return model.get(name); }); Handlebars.registerHelper('length', function (arr) { return arr.length; }); Handlebars.registerHelper('translate', function (name, options) { var scope = options.hash.scope || null; var category = options.hash.category || null; if (name === 'null') { return ''; } return self.language.translate(name, category, scope); }); Handlebars.registerHelper('button', function (name, options) { var style = options.hash.style || 'default'; var scope = options.hash.scope || null; var label = options.hash.label || name; return new Handlebars.SafeString(''); }); Handlebars.registerHelper('hyphen', function (string) { return Espo.Utils.convert(string, 'c-h'); }); Handlebars.registerHelper('toDom', function (string) { return Espo.Utils.toDom(string); }); Handlebars.registerHelper('breaklines', function (text) { text = Handlebars.Utils.escapeExpression(text || ''); text = text.replace(/(\r\n|\n|\r)/gm, '
'); return new Handlebars.SafeString(text); }); Handlebars.registerHelper('complexText', function (text) { text = Handlebars.Utils.escapeExpression(text || ''); text = text.replace(self.urlRegex, '$1($2)[$2]'); self.mdSearch.forEach(function (re, i) { text = text.replace(re, self.mdReplace[i]); }); text = self.tranformTextMarkdown(text); text = text.replace(/(\r\n|\n|\r)/gm, '
'); text = text.replace('[#see-more-text]', ' ' + self.language.translate('See more')) + ''; return new Handlebars.SafeString(text); }); Handlebars.registerHelper('translateOption', function (name, options) { var scope = options.hash.scope || null; var field = options.hash.field || null; if (!field) { return ''; } var translationHash = options.hash.translatedOptions || null; if (translationHash === null) { translationHash = self.language.translate(field, 'options', scope) || {}; } return translationHash[name] || name; }); Handlebars.registerHelper('options', function (list, value, options) { value = value || false; list = list || {}; var html = ''; var isArray = (Object.prototype.toString.call(list) === '[object Array]'); var multiple = (Object.prototype.toString.call(value) === '[object Array]'); var checkOption = function (name) { if (multiple) { return value.indexOf(name) != -1; } else { return value === name; } }; options.hash = options.hash || {}; var scope = options.hash.scope || false; var category = options.hash.category || false; var field = options.hash.field || false; var translationHash = options.hash.translatedOptions || null; if (translationHash === null) { if (!category && field) { translationHash = self.language.translate(field, 'options', scope) || {}; } } var translate = function (name) { if (!category) { if (typeof translationHash === 'object' && name in translationHash) { return translationHash[name]; } return name; } return self.language.translate(name, category, scope); }; for (var key in list) { var keyVal = list[key]; html += "" } return new Handlebars.SafeString(html); }); } }); }).call(this, Espo, _, Handlebars);