From 9a98bff93125f2da4580da91c3b38763da6e033f Mon Sep 17 00:00:00 2001 From: RainLoop Team Date: Fri, 15 May 2015 00:10:58 +0400 Subject: [PATCH] Release fixes --- dev/App/User.js | 4 +-- dev/Common/Globals.js | 2 +- dev/Common/HtmlEditor.js | 5 ---- dev/Common/Utils.js | 12 ++++---- dev/Component/AbstracCheckbox.js | 10 ++----- dev/External/ko.js | 27 ++++++++++-------- dev/Promises/User/Populator.js | 17 +++++++++++ dev/Screen/User/Settings.js | 4 +-- dev/Settings/User/Folders.js | 1 + dev/Stores/User/Folder.js | 2 ++ dev/View/Popup/Compose.js | 4 ++- dev/bootstrap.js | 1 - gulpfile.js | 11 ++++---- package.json | 10 +++++-- .../MailSo/Mail/FolderCollection.php | 28 +++++++++++++++---- .../app/libraries/MailSo/Mail/MailClient.php | 6 +++- .../0.0.0/app/libraries/MailSo/Mime/Email.php | 2 ++ .../0.0.0/app/libraries/RainLoop/Actions.php | 2 ++ .../libraries/RainLoop/Config/Application.php | 1 + .../Views/Admin/AdminSettingsGeneral.html | 4 +-- .../Views/Admin/AdminSettingsLicensing.html | 10 ++----- .../templates/Views/Components/Checkbox.html | 2 +- .../Components/CheckboxMaterialDesign.html | 2 +- .../0.0.0/app/templates/Views/User/Login.html | 2 +- .../Views/User/SettingsFolderItem.html | 2 +- .../templates/Views/User/SettingsFolders.html | 2 +- .../templates/Views/User/SettingsGeneral.html | 2 +- .../Views/User/SettingsSecurity.html | 2 +- .../ckeditor/plugins/signature/plugin.js | 21 ++++++++++++-- vendors/ckeditor-plugins/signature/plugin.js | 21 ++++++++++++-- 30 files changed, 143 insertions(+), 76 deletions(-) diff --git a/dev/App/User.js b/dev/App/User.js index 84bd1bfd3..8820acd3b 100644 --- a/dev/App/User.js +++ b/dev/App/User.js @@ -675,8 +675,8 @@ bCheck = false, sUid = '', aList = [], - bUnreadCountChange = false, - oFlags = null + oFlags = null, + bUnreadCountChange = false ; if (oFolder) diff --git a/dev/Common/Globals.js b/dev/Common/Globals.js index a0ce66728..5391f5744 100644 --- a/dev/Common/Globals.js +++ b/dev/Common/Globals.js @@ -254,7 +254,7 @@ sTagName = sTagName.toUpperCase(); return !(sTagName === 'INPUT' || sTagName === 'SELECT' || sTagName === 'TEXTAREA' || - (oElement && sTagName === 'DIV' && 'editorHtmlArea' === oElement.className && oElement.contentEditable) + (oElement && sTagName === 'DIV' && ('editorHtmlArea' === oElement.className || 'true' === '' + oElement.contentEditable)) ); } diff --git a/dev/Common/HtmlEditor.js b/dev/Common/HtmlEditor.js index 9b0fefa30..b79f45209 100644 --- a/dev/Common/HtmlEditor.js +++ b/dev/Common/HtmlEditor.js @@ -269,8 +269,6 @@ window.CKEDITOR.env.isCompatible = true; } - window.CKEDITOR.dtd.$removeEmpty['p'] = 1; - self.editor = window.CKEDITOR.appendTo(self.$element[0], oConfig); self.editor.on('key', function(oEvent) { @@ -307,9 +305,6 @@ self.editor.removeMenuItem('paste'); } - self.editor.setKeystroke(window.CKEDITOR.CTRL + 65 /* A */, 'selectAll'); - - self.__resizable = true; self.__inited = true; diff --git a/dev/Common/Utils.js b/dev/Common/Utils.js index 7acdd5797..7eb657b86 100644 --- a/dev/Common/Utils.js +++ b/dev/Common/Utils.js @@ -534,14 +534,14 @@ oEvent.preventDefault(); return; } - - if (oSender && oSender.tagName && oSender.tagName.match(/INPUT|TEXTAREA/i)) + else if (iKey === Enums.EventKeyCode.A) { - return; - } + if (oSender && ('true' === '' + oSender.contentEditable || + (oSender.tagName && oSender.tagName.match(/INPUT|TEXTAREA/i)))) + { + return; + } - if (iKey === Enums.EventKeyCode.A) - { if (window.getSelection) { window.getSelection().removeAllRanges(); diff --git a/dev/Component/AbstracCheckbox.js b/dev/Component/AbstracCheckbox.js index 8101ab3bd..de4696b92 100644 --- a/dev/Component/AbstracCheckbox.js +++ b/dev/Component/AbstracCheckbox.js @@ -53,14 +53,8 @@ _.extend(AbstracCheckbox.prototype, AbstractComponent.prototype); - AbstracCheckbox.prototype.click = function() { - if (!this.readOnly && this.enable() && !this.disable()) - { - this.value(!this.value()); - } - }; - - AbstracCheckbox.prototype.keypress = function() { + AbstracCheckbox.prototype.click = function() + { if (!this.readOnly && this.enable() && !this.disable()) { this.value(!this.value()); diff --git a/dev/External/ko.js b/dev/External/ko.js index 0c83c3d8b..131b5a8de 100644 --- a/dev/External/ko.js +++ b/dev/External/ko.js @@ -315,18 +315,6 @@ } }; - ko.bindingHandlers.keypress = { - 'init': function (oElement, fValueAccessor, fAllBindingsAccessor, oViewModel) { - $(oElement).on('keypress.koKeyPress', function (oEvent) { - fValueAccessor().call(oViewModel, oEvent); - }); - - ko.utils.domNodeDisposal.addDisposeCallback(oElement, function () { - $(oElement).off('keypress.koKeyPress'); - }); - } - }; - ko.bindingHandlers.onEnter = { 'init': function (oElement, fValueAccessor, fAllBindingsAccessor, oViewModel) { $(oElement).on('keypress.koOnEnter', function (oEvent) { @@ -343,6 +331,21 @@ } }; + ko.bindingHandlers.onSpace = { + 'init': function (oElement, fValueAccessor, fAllBindingsAccessor, oViewModel) { + $(oElement).on('keyup.koOnSpace', function (oEvent) { + if (oEvent && 32 === window.parseInt(oEvent.keyCode, 10)) + { + fValueAccessor().call(oViewModel, oEvent); + } + }); + + ko.utils.domNodeDisposal.addDisposeCallback(oElement, function () { + $(oElement).off('keyup.koOnSpace'); + }); + } + }; + ko.bindingHandlers.onTab = { 'init': function (oElement, fValueAccessor, fAllBindingsAccessor, oViewModel) { $(oElement).on('keydown.koOnTab', function (oEvent) { diff --git a/dev/Promises/User/Populator.js b/dev/Promises/User/Populator.js index 324271935..87a41bcf9 100644 --- a/dev/Promises/User/Populator.js +++ b/dev/Promises/User/Populator.js @@ -90,6 +90,15 @@ if (oCacheFolder) { + if (!FolderStore.displaySpecSetting()) + { + oCacheFolder.checkable(true); + } + else + { + oCacheFolder.checkable(!!oFolder.Checkable); + } + oCacheFolder.collapsed(!self.isFolderExpanded(oCacheFolder.fullNameHash)); if (oFolder.Extended) @@ -131,6 +140,14 @@ if (oData && 'Collection/FolderCollection' === oData['@Object'] && oData['@Collection'] && Utils.isArray(oData['@Collection'])) { + var + iLimit = Utils.pInt(Settings.settingsGet('FolderSpecLimit')), + iC = Utils.pInt(oData['CountRec']) + ; + + iLimit = 100 < iLimit ? 100 : (10 > iLimit ? 10 : iLimit); + + FolderStore.displaySpecSetting(0 >= iC || iLimit < iC); FolderStore.folderList(this.folderResponseParseRec( Utils.isUnd(oData.Namespace) ? '' : oData.Namespace, oData['@Collection'])); } diff --git a/dev/Screen/User/Settings.js b/dev/Screen/User/Settings.js index cb0ee5722..a6533c761 100644 --- a/dev/Screen/User/Settings.js +++ b/dev/Screen/User/Settings.js @@ -72,10 +72,10 @@ 'SettingsSecurity', 'SETTINGS_LABELS/LABEL_SECURITY_NAME', 'security'); } - if (AccountStore.isRootAccount() && + if (AccountStore.isRootAccount() && ( (Settings.settingsGet('AllowGoogleSocial') && Settings.settingsGet('AllowGoogleSocialAuth')) || Settings.settingsGet('AllowFacebookSocial') || - Settings.settingsGet('AllowTwitterSocial')) + Settings.settingsGet('AllowTwitterSocial'))) { kn.addSettingsViewModel(require('Settings/User/Social'), 'SettingsSocial', 'SETTINGS_LABELS/LABEL_SOCIAL_NAME', 'social'); diff --git a/dev/Settings/User/Folders.js b/dev/Settings/User/Folders.js index 576d43719..9d826f69b 100644 --- a/dev/Settings/User/Folders.js +++ b/dev/Settings/User/Folders.js @@ -26,6 +26,7 @@ */ function FoldersUserSettings() { + this.displaySpecSetting = FolderStore.displaySpecSetting; this.folderList = FolderStore.folderList; this.folderListHelp = ko.observable('').extend({'throttle': 100}); diff --git a/dev/Stores/User/Folder.js b/dev/Stores/User/Folder.js index 68b87d794..57081f7b1 100644 --- a/dev/Stores/User/Folder.js +++ b/dev/Stores/User/Folder.js @@ -19,6 +19,8 @@ */ function FolderUserStore() { + this.displaySpecSetting = ko.observable(true); + this.sentFolder = ko.observable(''); this.draftFolder = ko.observable(''); this.spamFolder = ko.observable(''); diff --git a/dev/View/Popup/Compose.js b/dev/View/Popup/Compose.js index 184f011aa..c464e3162 100644 --- a/dev/View/Popup/Compose.js +++ b/dev/View/Popup/Compose.js @@ -1207,7 +1207,8 @@ }); sText = '

' + sReplyTitle + ':' + - '

' + Utils.trim(sText) + '

'; + '
' + Utils.trim(sText) + '
'; +// '

' + Utils.trim(sText) + '

'; break; @@ -1223,6 +1224,7 @@ '
' + Translator.i18n('COMPOSE/FORWARD_MESSAGE_TOP_SUBJECT') + ': ' + Utils.encodeHtml(sSubject) + '

' + Utils.trim(sText) + '

'; break; + case Enums.ComposeType.ForwardAsAttachment: sText = ''; break; diff --git a/dev/bootstrap.js b/dev/bootstrap.js index e039ce7cc..b15af81a6 100644 --- a/dev/bootstrap.js +++ b/dev/bootstrap.js @@ -23,7 +23,6 @@ Globals.$win .keydown(Utils.kill_CtrlA_CtrlS) - .keyup(Utils.kill_CtrlA_CtrlS) .unload(function () { Globals.bUnload = true; }) diff --git a/gulpfile.js b/gulpfile.js index ed4d16f10..dc22784a1 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -4,8 +4,8 @@ var pkg = require('./package.json'), head = { - cc: '/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */', - agpl: '/* RainLoop Webmail (c) RainLoop Team | Licensed under AGPL 3 */' + rainloop: '/* RainLoop Webmail (c) RainLoop Team | Licensed under RainLoop Software License */', + agpl: '/* RainLoop Webmail (c) RainLoop Team | Licensed under AGPL v3 */' }, cfg = { devVersion: '0.0.0', @@ -46,7 +46,7 @@ var function getHead() { - return !cfg.community ? head.cc : head.agpl; + return !cfg.community ? head.rainloop : head.agpl; } function regOtherMinTask(sName, sPath, sInc, sOut, sHeader) @@ -454,7 +454,6 @@ gulp.task('ckeditor:copy-plugins', ['ckeditor:copy'], function() { gulp.task('ckeditor', ['ckeditor:copy-plugins'], function () { return gulp.src('rainloop/v/' + cfg.devVersion + '/static/ckeditor/*.js') .pipe(stripbom()) -// .pipe(replace("\u200B", "\\u200B")) .pipe(replace('console.log("Detecting changes using MutationObservers")', 'true')) .pipe(header("\uFEFF")) // BOM .pipe(gulp.dest('rainloop/v/' + cfg.devVersion + '/static/ckeditor')); @@ -565,7 +564,7 @@ gulp.task('rainloop:owncloud:setup', ['rainloop:owncloud:copy', fs.writeFileSync(dist + 'rainloop/appinfo/info.xml', fs.readFileSync(dist + 'rainloop/appinfo/info.xml', 'utf8') .replace('0.0', '' + versionFull + '') - .replace('', '' + (cfg.community ? 'AGPLv3' : 'CC BY-NC-SA 3.0') + '') + .replace('', '' + (cfg.community ? 'AGPLv3' : 'RainLoop Software License') + '') ); fs.writeFileSync(dist + 'rainloop/appinfo/version', versionFull); @@ -574,7 +573,7 @@ gulp.task('rainloop:owncloud:setup', ['rainloop:owncloud:copy', cfg.destPath = cfg.releasesPath + '/owncloud/' + versionFull + '/'; cfg.cleanPath = dist; cfg.zipSrcPath = dist; - cfg.zipFile = 'rainloop-owncloud-app-' + (cfg.community ? '' : 'cc-') + versionFull + '.zip'; + cfg.zipFile = 'rainloop-owncloud-app-' + (cfg.community ? '' : 'standard-') + versionFull + '.zip'; cfg.md5File = cfg.zipFile; }); diff --git a/package.json b/package.json index c178dcc67..d64f347e5 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "RainLoop", "title": "RainLoop Webmail", - "version": "1.9.0", - "release": "327", + "version": "1.9.1", + "release": "329", "description": "Simple, modern & fast web-based email client", "homepage": "http://rainloop.net", "main": "gulpfile.js", @@ -19,6 +19,10 @@ { "type": "AGPL 3.0", "ulr": "http://www.gnu.org/licenses/agpl-3.0.html" + }, + { + "type": "RainLoop Software License", + "ulr": "http://www.rainloop.net/licensing/" } ], "bugs": { @@ -36,7 +40,7 @@ "plugins" ], "readmeFilename": "README.md", - "ownCloudPackageVersion": "4.0", + "ownCloudPackageVersion": "4.1", "engines": { "node": ">= 0.10.0" }, diff --git a/rainloop/v/0.0.0/app/libraries/MailSo/Mail/FolderCollection.php b/rainloop/v/0.0.0/app/libraries/MailSo/Mail/FolderCollection.php index 25303c8b6..4cb652e61 100644 --- a/rainloop/v/0.0.0/app/libraries/MailSo/Mail/FolderCollection.php +++ b/rainloop/v/0.0.0/app/libraries/MailSo/Mail/FolderCollection.php @@ -20,7 +20,7 @@ class FolderCollection extends \MailSo\Base\Collection /** * @var string */ - private $sNamespace; + public $Namespace; /** * @var string @@ -49,7 +49,7 @@ class FolderCollection extends \MailSo\Base\Collection { parent::__construct(); - $this->sNamespace = ''; + $this->Namespace = ''; $this->FoldersHash = ''; $this->SystemFolders = array(); $this->IsThreadsSupported = false; @@ -96,12 +96,30 @@ class FolderCollection extends \MailSo\Base\Collection return $mResult; } + /** + * @return int + */ + public function CountRec() + { + $iResult = $this->Count(); + foreach ($this->aItems as /* @var $oFolder \MailSo\Mail\Folder */ $oFolder) + { + if ($oFolder) + { + $oSub = $oFolder->SubFolders(); + $iResult += $oSub ? $oSub->CountRec() : 0; + } + } + + return $iResult; + } + /** * @return string */ public function GetNamespace() { - return $this->sNamespace; + return $this->Namespace; } /** @@ -110,7 +128,7 @@ class FolderCollection extends \MailSo\Base\Collection public function FindDelimiter() { $sDelimiter = '/'; - + $oFolder = $this->GetByFullNameRaw('INBOX'); if (!$oFolder) { @@ -132,7 +150,7 @@ class FolderCollection extends \MailSo\Base\Collection */ public function SetNamespace($sNamespace) { - $this->sNamespace = $sNamespace; + $this->Namespace = $sNamespace; return $this; } diff --git a/rainloop/v/0.0.0/app/libraries/MailSo/Mail/MailClient.php b/rainloop/v/0.0.0/app/libraries/MailSo/Mail/MailClient.php index 5b3ae9727..d8ad6896e 100644 --- a/rainloop/v/0.0.0/app/libraries/MailSo/Mail/MailClient.php +++ b/rainloop/v/0.0.0/app/libraries/MailSo/Mail/MailClient.php @@ -1373,7 +1373,11 @@ class MailClient $sCriteriasResult = \trim($sCriteriasResult); if ('' === $sCriteriasResult) { - $sCriteriasResult = 'ALL'; + $sCriteriasResult = 'NOT DELETED'; // ALL + } + else + { + $sCriteriasResult .= ' NOT DELETED'; } return $sCriteriasResult; diff --git a/rainloop/v/0.0.0/app/libraries/MailSo/Mime/Email.php b/rainloop/v/0.0.0/app/libraries/MailSo/Mime/Email.php index 5e1b8ad68..ee03c6720 100644 --- a/rainloop/v/0.0.0/app/libraries/MailSo/Mime/Email.php +++ b/rainloop/v/0.0.0/app/libraries/MailSo/Mime/Email.php @@ -201,6 +201,8 @@ class Email } $sEmail = \trim(\trim($sEmail), '<>'); + $sEmail = \rtrim(\trim($sEmail), '.'); + $sEmail = \trim($sEmail); $sName = \trim(\trim($sName), '"'); $sName = \trim($sName, '\''); diff --git a/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php index 1f6bad09c..d94d21e3f 100644 --- a/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php @@ -1353,6 +1353,7 @@ class Actions 'UseImapSubscribe' => (bool) $oConfig->Get('labs', 'use_imap_list_subscribe', true), 'AllowAppendMessage' => (bool) $oConfig->Get('labs', 'allow_message_append', false), 'MaterialDesign' => (bool) $oConfig->Get('labs', 'use_material_design', true), + 'FolderSpecLimit' => (int) $oConfig->Get('labs', 'folders_spec_limit', 50), 'Community' => true, 'PremType' => false, 'Admin' => array(), @@ -9496,6 +9497,7 @@ class Actions 'FoldersHash' => isset($mResponse->FoldersHash) ? $mResponse->FoldersHash : '', 'IsThreadsSupported' => $mResponse->IsThreadsSupported, 'Optimized' => $mResponse->Optimized, + 'CountRec' => $mResponse->CountRec(), 'SystemFolders' => isset($mResponse->SystemFolders) && \is_array($mResponse->SystemFolders) ? $mResponse->SystemFolders : array() )); diff --git a/rainloop/v/0.0.0/app/libraries/RainLoop/Config/Application.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Config/Application.php index 2e40f6f89..347783eb3 100644 --- a/rainloop/v/0.0.0/app/libraries/RainLoop/Config/Application.php +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/Config/Application.php @@ -304,6 +304,7 @@ Enables caching in the system'), 'smtp_show_server_errors' => array(false), 'sieve_allow_raw_script' => array(false), 'sieve_utf8_folder_name' => array(true), + 'folders_spec_limit' => array(50), 'owncloud_save_folder' => array('Attachments'), 'curl_proxy' => array(''), 'curl_proxy_auth' => array(''), diff --git a/rainloop/v/0.0.0/app/templates/Views/Admin/AdminSettingsGeneral.html b/rainloop/v/0.0.0/app/templates/Views/Admin/AdminSettingsGeneral.html index 4733f7774..912df665c 100644 --- a/rainloop/v/0.0.0/app/templates/Views/Admin/AdminSettingsGeneral.html +++ b/rainloop/v/0.0.0/app/templates/Views/Admin/AdminSettingsGeneral.html @@ -15,7 +15,7 @@ - +   
- +   
-
- Creative Commons Attribution-NonCommercial-ShareAlike 3.0 (CC BY-NC-SA). -
-
- -
-
- +   + RainLoop Software License.

diff --git a/rainloop/v/0.0.0/app/templates/Views/Components/Checkbox.html b/rainloop/v/0.0.0/app/templates/Views/Components/Checkbox.html index bd64793f3..d710e0f50 100644 --- a/rainloop/v/0.0.0/app/templates/Views/Components/Checkbox.html +++ b/rainloop/v/0.0.0/app/templates/Views/Components/Checkbox.html @@ -1,4 +1,4 @@ - + +
diff --git a/rainloop/v/0.0.0/static/ckeditor/plugins/signature/plugin.js b/rainloop/v/0.0.0/static/ckeditor/plugins/signature/plugin.js index 4a2669004..31ff05e1d 100644 --- a/rainloop/v/0.0.0/static/ckeditor/plugins/signature/plugin.js +++ b/rainloop/v/0.0.0/static/ckeditor/plugins/signature/plugin.js @@ -9,13 +9,26 @@ rl_signature_replacer = function (editor, sText, sSignature, bHtml, bInsertBefor ; } - sText = sText.replace(/\u0002([\s\S]*)\u0002/gm, ''); - var - bEmptyText = '' === $.trim(sText), + sP = '~~~~@~~~~', + bEmptyText = false, sNewLine = (bHtml ? '
' : "\n") ; + sText = sText.replace(/\u0002([\s\S]*)\u0002/gm, sP + '$1' + sP); + + if (editor.__previos_signature) + { + sText = sText + .replace(sP + editor.__previos_signature + sP, '') + .replace(sP + editor.__previos_signature + sP, '') + .replace(sP + editor.__previos_signature + sP, '') + ; + } + + sText = sText.replace(sP, '').replace(sP, '').replace(sP, '').replace(sP, ''); + + bEmptyText = '' === $.trim(sText); if (!bEmptyText && bHtml) { bEmptyText = '' !== $.trim(editor.__plainUtils.htmlToPlain(sText)); @@ -24,10 +37,12 @@ rl_signature_replacer = function (editor, sText, sSignature, bHtml, bInsertBefor if (bInsertBefore) { sText = "\u0002" + sSignature + (bEmptyText ? '' : sNewLine) + "\u0002" + sText; + editor.__previos_signature = sSignature + (bEmptyText ? '' : sNewLine); } else { sText = sText + "\u0002" + (bEmptyText ? '' : sNewLine) + sSignature + "\u0002"; + editor.__previos_signature = (bEmptyText ? '' : sNewLine) + sSignature; } if (!bHtml) diff --git a/vendors/ckeditor-plugins/signature/plugin.js b/vendors/ckeditor-plugins/signature/plugin.js index 4a2669004..31ff05e1d 100644 --- a/vendors/ckeditor-plugins/signature/plugin.js +++ b/vendors/ckeditor-plugins/signature/plugin.js @@ -9,13 +9,26 @@ rl_signature_replacer = function (editor, sText, sSignature, bHtml, bInsertBefor ; } - sText = sText.replace(/\u0002([\s\S]*)\u0002/gm, ''); - var - bEmptyText = '' === $.trim(sText), + sP = '~~~~@~~~~', + bEmptyText = false, sNewLine = (bHtml ? '
' : "\n") ; + sText = sText.replace(/\u0002([\s\S]*)\u0002/gm, sP + '$1' + sP); + + if (editor.__previos_signature) + { + sText = sText + .replace(sP + editor.__previos_signature + sP, '') + .replace(sP + editor.__previos_signature + sP, '') + .replace(sP + editor.__previos_signature + sP, '') + ; + } + + sText = sText.replace(sP, '').replace(sP, '').replace(sP, '').replace(sP, ''); + + bEmptyText = '' === $.trim(sText); if (!bEmptyText && bHtml) { bEmptyText = '' !== $.trim(editor.__plainUtils.htmlToPlain(sText)); @@ -24,10 +37,12 @@ rl_signature_replacer = function (editor, sText, sSignature, bHtml, bInsertBefor if (bInsertBefore) { sText = "\u0002" + sSignature + (bEmptyText ? '' : sNewLine) + "\u0002" + sText; + editor.__previos_signature = sSignature + (bEmptyText ? '' : sNewLine); } else { sText = sText + "\u0002" + (bEmptyText ? '' : sNewLine) + sSignature + "\u0002"; + editor.__previos_signature = (bEmptyText ? '' : sNewLine) + sSignature; } if (!bHtml)