Experemental Plain2Html/Html2Plain convertor (+ jQuery linkify)

This commit is contained in:
RainLoop Team 2014-07-22 03:58:13 +04:00
parent 8cfd52ef12
commit e4333a6f90
18 changed files with 1211 additions and 604 deletions

View file

@ -113,7 +113,6 @@ Globals.oHtmlEditorDefaultConfig = {
'allowedContent': true,
'autoParagraph': false,
'fillEmptyBlocks': false,
'enterMode': window.CKEDITOR.ENTER_BR,
'shiftEnterMode': window.CKEDITOR.ENTER_BR,

View file

@ -1460,6 +1460,7 @@ Utils.settingsSaveHelperSimpleFunction = function (koTrigger, oContext)
return Utils.settingsSaveHelperFunction(null, koTrigger, oContext, 1000);
};
Utils.$div = $('<div></div>');
/**
* @param {string} sHtml
@ -1468,24 +1469,54 @@ Utils.settingsSaveHelperSimpleFunction = function (koTrigger, oContext)
Utils.htmlToPlain = function (sHtml)
{
var
iPos = 0,
iP1 = 0,
iP2 = 0,
iP3 = 0,
iLimit = 0,
sText = '',
sQuoteChar = '> ',
convertBlockquote = function () {
if (arguments && 1 < arguments.length)
splitPlainText = function (sText)
{
var
iLen = 100,
sPrefix = '',
sSubText = '',
sResult = sText,
iSpacePos = 0,
iNewLinePos = 0
;
while (sResult.length > iLen)
{
var sText = $.trim(arguments[1])
.replace(/__bq__start__(.|[\s\S\n\r]*)__bq__end__/gm, convertBlockquote)
;
sSubText = sResult.substring(0, iLen);
iSpacePos = sSubText.lastIndexOf(' ');
iNewLinePos = sSubText.lastIndexOf('\n');
sText = '\n' + sQuoteChar + $.trim(sText).replace(/\n/gm, '\n' + sQuoteChar) + '\n>\n';
if (-1 !== iNewLinePos)
{
iSpacePos = iNewLinePos;
}
return sText.replace(/\n([> ]+)/gm, function () {
return (arguments && 1 < arguments.length) ? '\n' + $.trim(arguments[1].replace(/[\s]/, '')) + ' ' : '';
});
if (-1 === iSpacePos)
{
iSpacePos = iLen;
}
sPrefix += sSubText.substring(0, iSpacePos) + '\n';
sResult = sResult.substring(iSpacePos + 1);
}
return '';
return sPrefix + sResult;
},
convertBlockquote = function (sText) {
sText = splitPlainText($.trim(sText));
sText = '> ' + sText.replace(/\n/gm, '\n> ');
return sText.replace(/(^|\n)([> ]+)/gm, function () {
return (arguments && 2 < arguments.length) ? arguments[1] + $.trim(arguments[2].replace(/[\s]/, '')) + ' ' : '';
});
},
convertDivs = function () {
@ -1494,40 +1525,23 @@ Utils.htmlToPlain = function (sHtml)
var sText = $.trim(arguments[1]);
if (0 < sText.length)
{
sText = sText.replace(/<div[^>]*>(.|[\s\S\r\n]*)<\/div>/gmi, convertDivs);
sText = sText.replace(/<div[^>]*>([\s\S\r\n]*)<\/div>/gmi, convertDivs);
sText = '\n' + $.trim(sText) + '\n';
}
return sText;
}
return '';
},
fixAttibuteValue = function () {
if (arguments && 1 < arguments.length)
{
return '' + arguments[1] + arguments[2].replace(/</g, '&lt;').replace(/>/g, '&gt;');
}
return '';
return (arguments && 1 < arguments.length) ?
'' + arguments[1] + arguments[2].replace(/</g, '&lt;').replace(/>/g, '&gt;') : '';
},
convertLinks = function () {
if (arguments && 1 < arguments.length)
{
var
sName = $.trim(arguments[1])
// sHref = $.trim(arguments[0].replace(/<a [\s\S]*href[ ]?=[ ]?["']?([^"']+).+<\/a>/gmi, '$1'))
;
return sName;
// sName = (0 === trim(sName).length) ? '' : sName;
// sHref = ('mailto:' === sHref.substr(0, 7)) ? '' : sHref;
// sHref = ('http' === sHref.substr(0, 4)) ? sHref : '';
// sHref = (sName === sHref) ? '' : sHref;
// sHref = (0 < sHref.length) ? ' (' + sHref + ') ' : '';
// return (0 < sName.length) ? sName + sHref : sName;
}
return '';
return (arguments && 1 < arguments.length) ? $.trim(arguments[1]) : '';
}
;
@ -1542,25 +1556,67 @@ Utils.htmlToPlain = function (sHtml)
.replace(/<\/tr>/gi, '\n')
.replace(/<hr[^>]*>/gmi, '\n_______________________________\n\n')
.replace(/<img [^>]*>/gmi, '')
.replace(/<div[^>]*>(.|[\s\S\r\n]*)<\/div>/gmi, convertDivs)
.replace(/<div[^>]*>([\s\S\r\n]*)<\/div>/gmi, convertDivs)
.replace(/<blockquote[^>]*>/gmi, '\n__bq__start__\n')
.replace(/<\/blockquote>/gmi, '\n__bq__end__\n')
.replace(/<a [^>]*>(.|[\s\S\r\n]*)<\/a>/gmi, convertLinks)
.replace(/<a [^>]*>([\s\S\r\n]*?)<\/a>/gmi, convertLinks)
.replace(/<\/div>/gi, '\n')
.replace(/&nbsp;/gi, ' ')
.replace(/<[^>]*>/gm, '')
.replace(/&gt;/gi, '>')
.replace(/&lt;/gi, '<')
.replace(/&quot;/gi, '"')
.replace(/&amp;/gi, '&')
.replace(/&\w{2,6};/gi, '')
.replace(/<[^>]*>/gm, '')
;
return sText
sText = Utils.$div.html(sText).text();
sText = sText
.replace(/\n[ \t]+/gm, '\n')
.replace(/[\n]{3,}/gm, '\n\n')
.replace(/__bq__start__(.|[\s\S\r\n]*)__bq__end__/gm, convertBlockquote)
.replace(/&gt;/gi, '>')
.replace(/&lt;/gi, '<')
;
iPos = 0;
iLimit = 100;
while (0 < iLimit)
{
iLimit--;
iP1 = sText.indexOf('__bq__start__', iPos);
if (-1 < iP1)
{
iP2 = sText.indexOf('__bq__start__', iP1 + 5);
iP3 = sText.indexOf('__bq__end__', iP1 + 5);
if ((-1 === iP2 || iP3 < iP2) && iP1 < iP3)
{
sText = sText.substring(0, iP1) +
convertBlockquote(sText.substring(iP1 + 13, iP3)) +
sText.substring(iP3 + 11);
iPos = 0;
}
else if (-1 < iP2 && iP2 < iP3)
{
iPos = iP2 - 1;
}
else
{
iPos = 0;
}
}
else
{
break;
}
}
sText = sText
.replace(/__bq__start__/gm, '')
.replace(/__bq__end__/gm, '')
;
return sText;
};
/**
@ -1569,9 +1625,77 @@ Utils.htmlToPlain = function (sHtml)
*/
Utils.plainToHtml = function (sPlain)
{
return sPlain.toString()
.replace(/&/g, '&amp;').replace(/>/g, '&gt;').replace(/</g, '&lt;')
.replace(/\r/g, '').replace(/\n/g, '<br />');
sPlain = sPlain.toString().replace(/\r/g, '');
var
bIn = false,
bDo = true,
bStart = true,
aNextText = [],
sLine = '',
iIndex = 0,
aText = sPlain.split("\n")
;
do
{
bDo = false;
aNextText = [];
for (iIndex = 0; iIndex < aText.length; iIndex++)
{
sLine = aText[iIndex];
bStart = '>' === sLine.substr(0, 1);
if (bStart && !bIn)
{
bDo = true;
bIn = true;
aNextText.push('~~~blockquote~~~');
aNextText.push(sLine.substr(1));
}
else if (!bStart && bIn)
{
bIn = false;
aNextText.push('~~~/blockquote~~~');
aNextText.push(sLine);
}
else if (bStart && bIn)
{
aNextText.push(sLine.substr(1));
}
else
{
aNextText.push(sLine);
}
}
if (bIn)
{
bIn = false;
aNextText.push('~~~/blockquote~~~');
}
aText = aNextText;
}
while (bDo);
sPlain = aText.join("\n");
sPlain = sPlain
.replace(/&/g, '&amp;')
.replace(/>/g, '&gt;').replace(/</g, '&lt;')
.replace(/~~~blockquote~~~[\s]*/g, '<blockquote>')
.replace(/[\s]*~~~\/blockquote~~~/g, '</blockquote>')
.replace(/[\-_~]{10,}/g, '<hr />')
.replace(/\n/g, '<br />');
if ($.fn && $.fn.linkify)
{
sPlain = Utils.$div.html(sPlain)
.linkify().find('.linkified').removeClass('linkified').end()
.html();
}
return sPlain;
};
Utils.resizeAndCrop = function (sUrl, iValue, fCallback)

View file

@ -90,7 +90,6 @@ function MessageModel()
this.body = null;
this.plainRaw = '';
this.isRtl = ko.observable(false);
this.isHtml = ko.observable(false);
this.hasImages = ko.observable(false);
this.attachments = ko.observableArray([]);
@ -268,7 +267,6 @@ MessageModel.prototype.clear = function ()
this.attachmentsMainType('');
this.body = null;
this.isRtl(false);
this.isHtml(false);
this.hasImages(false);
this.attachments([]);
@ -342,7 +340,7 @@ MessageModel.prototype.initByJson = function (oJsonMessage)
this.subjectPrefix('');
this.subjectSuffix(this.subject());
}
this.dateTimeStampInUTC(Utils.pInt(oJsonMessage.DateTimeStampInUTC));
this.hasAttachments(!!oJsonMessage.HasAttachments);
this.attachmentsMainType(oJsonMessage.AttachmentsMainType);
@ -861,7 +859,6 @@ MessageModel.prototype.populateByMessageListItem = function (oMessage)
this.moment(oMessage.moment());
this.body = null;
// this.isRtl(oMessage.isRtl());
// this.isHtml(false);
// this.hasImages(false);
// this.attachments([]);
@ -1026,7 +1023,6 @@ MessageModel.prototype.storeDataToDom = function ()
{
if (this.body)
{
this.body.data('rl-is-rtl', !!this.isRtl());
this.body.data('rl-is-html', !!this.isHtml());
this.body.data('rl-has-images', !!this.hasImages());
@ -1055,7 +1051,6 @@ MessageModel.prototype.fetchDataToDom = function ()
{
if (this.body)
{
this.isRtl(!!this.body.data('rl-is-rtl'));
this.isHtml(!!this.body.data('rl-is-html'));
this.hasImages(!!this.body.data('rl-has-images'));

View file

@ -886,7 +886,7 @@ WebMailDataStorage.prototype.setMessage = function (oData, bCached)
oBody = null,
oTextBody = null,
sId = '',
sPlain = '',
sPlainAsHtml = '',
bPgpSigned = false,
bPgpEncrypted = false,
oMessagesBodiesDom = this.messagesBodiesDom(),
@ -922,17 +922,20 @@ WebMailDataStorage.prototype.setMessage = function (oData, bCached)
if (Utils.isNormal(oData.Result.Html) && '' !== oData.Result.Html)
{
bIsHtml = true;
oBody.html(oData.Result.Html.toString()).addClass('b-text-part html');
oBody
.html(oData.Result.Html.toString())
.linkify().find('.linkified').removeClass('linkified').end()
.addClass('b-text-part html')
;
}
else if (Utils.isNormal(oData.Result.Plain) && '' !== oData.Result.Plain)
{
bIsHtml = false;
sPlain = oData.Result.Plain.toString();
sPlainAsHtml = Utils.plainToHtml(oData.Result.Plain.toString());
if ((oMessage.isPgpSigned() || oMessage.isPgpEncrypted()) &&
RL.data().capaOpenPGP() && Utils.isNormal(oData.Result.PlainRaw))
if ((oMessage.isPgpSigned() || oMessage.isPgpEncrypted()) && RL.data().capaOpenPGP())
{
oMessage.plainRaw = Utils.pString(oData.Result.PlainRaw);
oMessage.plainRaw = Utils.pString(oData.Result.Plain);
bPgpEncrypted = /---BEGIN PGP MESSAGE---/.test(oMessage.plainRaw);
if (!bPgpEncrypted)
@ -944,7 +947,7 @@ WebMailDataStorage.prototype.setMessage = function (oData, bCached)
$proxyDiv.empty();
if (bPgpSigned && oMessage.isPgpSigned())
{
sPlain =
sPlainAsHtml =
$proxyDiv.append(
$('<pre class="b-plain-openpgp signed"></pre>').text(oMessage.plainRaw)
).html()
@ -952,7 +955,7 @@ WebMailDataStorage.prototype.setMessage = function (oData, bCached)
}
else if (bPgpEncrypted && oMessage.isPgpEncrypted())
{
sPlain =
sPlainAsHtml =
$proxyDiv.append(
$('<pre class="b-plain-openpgp encrypted"></pre>').text(oMessage.plainRaw)
).html()
@ -965,7 +968,11 @@ WebMailDataStorage.prototype.setMessage = function (oData, bCached)
oMessage.isPgpEncrypted(bPgpEncrypted);
}
oBody.html(sPlain).addClass('b-text-part plain');
oBody
.html(sPlainAsHtml)
.linkify().find('.linkified').removeClass('linkified').end()
.addClass('b-text-part plain')
;
}
else
{
@ -977,12 +984,6 @@ WebMailDataStorage.prototype.setMessage = function (oData, bCached)
oMessage.pgpSignedVerifyStatus(Enums.SignedVerifyStatus.None);
oMessage.pgpSignedVerifyUser('');
if (oData.Result.Rtl)
{
oMessage.isRtl(true);
oBody.addClass('rtl-text-part');
}
oMessage.body = oBody;
if (oMessage.body)
{

View file

@ -52,7 +52,7 @@ html.rl-no-preview-pane {
padding-left: 10px;
}
}
.b-message-view-desc {
text-align: center;
font-size: 24px;
@ -316,10 +316,6 @@ html.rl-no-preview-pane {
display: none;
}
&.rtl-text-part {
direction: rtl;
}
&.html {
div[data-x-div-type=body] {
margin: 15px;
@ -345,7 +341,7 @@ html.rl-no-preview-pane {
border: none;
font-family: Monaco, Menlo, Consolas, 'Courier New', monospace;
}
blockquote {
border-left: 2px solid blue;
color: blue;

View file

@ -132,6 +132,7 @@ cfg.paths.js = {
'vendors/jquery-lazyload/jquery.lazyload.min.js',
'vendors/jquery-nanoscroller/jquery.nanoscroller-0.7.min.js',
'vendors/jquery-wakeup/jquery.wakeup.min.js',
'vendors/jquery-linkify/jquery.linkify.min.js',
'vendors/inputosaurus/inputosaurus.min.js',
'vendors/moment/min/moment.min.js ',
'vendors/routes/signals.min.js',

View file

@ -6956,7 +6956,7 @@ class Actions
$aParts = \explode(':', $sSubject);
foreach ($aParts as $sPart)
{
if (!$sDrop &&
if (!$sDrop &&
(\preg_match('/^(RE|FWD)$/i', \trim($sPart)) || \preg_match('/^(RE|FWD)[\[\(][\d]+[\]\)]$/i', \trim($sPart))))
{
$aPrefix[] = $sPart;
@ -7083,7 +7083,7 @@ class Actions
$mResult['IsForwarded'] = 0 < \strlen($sForwardedFlag) && \in_array(\strtolower($sForwardedFlag), $aFlags);
$mResult['IsReadReceipt'] = 0 < \strlen($sReadReceiptFlag) && \in_array(\strtolower($sReadReceiptFlag), $aFlags);
$mResult['TextPartIsTrimmed'] = false;
if ('Message' === $sParent)
@ -7128,6 +7128,7 @@ class Actions
{
$fAdditionalExternalFilter = function ($sUrl) {
return './?/ProxyExternal/'.\RainLoop\Utils::EncodeKeyValues(array(
'Rnd' => \md5(\microtime(true)),
'Token' => \RainLoop\Utils::GetConnectionToken(),
'Url' => $sUrl
)).'/';
@ -7135,16 +7136,15 @@ class Actions
}
$mResult['Html'] = 0 === \strlen($sHtml) ? '' : \MailSo\Base\HtmlUtils::ClearHtml(
$sHtml, $bHasExternals, $mFoundedCIDs, $aContentLocationUrls, $mFoundedContentLocationUrls, false,
!!$this->Config()->Get('labs', 'allow_smart_html_links', true), $fAdditionalExternalFilter);
$sHtml, $bHasExternals, $mFoundedCIDs, $aContentLocationUrls, $mFoundedContentLocationUrls, false, false,
$fAdditionalExternalFilter);
$mResult['ExternalProxy'] = null !== $fAdditionalExternalFilter;
$mResult['PlainRaw'] = $sPlain;
$mResult['Plain'] = 0 === \strlen($sPlain) ? '' : \MailSo\Base\HtmlUtils::ConvertPlainToHtml($sPlain);
$mResult['Rtl'] = \MailSo\Base\Utils::IsRTL($sPlain);
$mResult['Plain'] = $sPlain;
// $mResult['Plain'] = 0 === \strlen($sPlain) ? '' : \MailSo\Base\HtmlUtils::ConvertPlainToHtml($sPlain);
$mResult['TextHash'] = \md5($mResult['Html'].$mResult['Plain'].$mResult['PlainRaw']);
$mResult['TextHash'] = \md5($mResult['Html'].$mResult['Plain']);
$mResult['TextPartIsTrimmed'] = $mResponse->TextPartIsTrimmed();

View file

@ -1,10 +1,10 @@
[LOGIN]
LABEL_EMAIL = "Login/Email"
LABEL_EMAIL = "E-mail"
LABEL_LOGIN = "Login"
LABEL_PASSWORD = "Hasło"
LABEL_SIGN_ME = "Zapamiętaj mnie"
LABEL_VERIFICATION_CODE = "Verification Code"
LABEL_DONT_ASK_VERIFICATION_CODE = "Don't ask for the code for 2 weeks"
LABEL_VERIFICATION_CODE = "Kod weryfikujący"
LABEL_DONT_ASK_VERIFICATION_CODE = "Nie pytaj o kod przez 2 tygodnie"
BUTTON_SIGN_IN = "Zaloguj"
TITLE_SIGN_IN_GOOGLE = "Zaloguj się przez Google"
TITLE_SIGN_IN_FACEBOOK = "Zaloguj się przez Facebook"
@ -13,7 +13,7 @@ TITLE_SIGN_IN_TWITTER = "Zaloguj się przez Twitter"
[TOP_TOOLBAR]
BUTTON_ADD_ACCOUNT = "Dodaj konto"
BUTTON_SETTINGS = "Ustawienia"
BUTTON_HELP = "Help"
BUTTON_HELP = "Pomoc"
BUTTON_LOGOUT = "Wyloguj się"
[SEARCH]
@ -23,10 +23,10 @@ LABEL_ADV_FROM = "Od"
LABEL_ADV_TO = "Do"
LABEL_ADV_SUBJECT = "Temat"
LABEL_ADV_TEXT = "Tekst"
LABEL_ADV_HAS_ATTACHMENT = "Has attachment"
LABEL_ADV_HAS_ATTACHMENTS = "Ma załączniki"
LABEL_ADV_HAS_ATTACHMENT = "Ma załącznik"
LABEL_ADV_HAS_ATTACHMENTS = "Z załącznikiem"
LABEL_ADV_FLAGGED = "Oznaczona"
LABEL_ADV_UNSEEN = "Nieodczytana"
LABEL_ADV_UNSEEN = "Nieprzeczytana"
LABEL_ADV_DATE = "Data"
LABEL_ADV_DATE_ALL = "Wszystkie"
LABEL_ADV_DATE_3_DAYS = "Do 3 dni"
@ -40,11 +40,11 @@ BUTTON_ADV_SEARCH = "Szukaj"
[MAGNIFIC_POPUP]
CLOSE = "Zamknij (Esc)"
LOADING = "Ładowanie..."
GALLERY_PREV = "Poprzedni"
GALLERY_NEXT = "Następny"
GALLERY_PREV = "Poprzedni (strzałka w lewo)"
GALLERY_NEXT = "Następny (strzałka w prawo)"
GALLERY_COUNTER = "%curr% z %total%"
IMAGE_ERROR = "<a href=\"%url%\" target=\"_blank\">Obraz</a> nie mógł zostać załadowany."
AJAX_ERROR = "<a href=\"%url%\" target=\"_blank\">Zawartość</a> nie mogła zostać załadowana."
IMAGE_ERROR = "Nie można było załadować <a href=\"%url%\" target=\"_blank\">obrazu</a>."
AJAX_ERROR = "Nie można było załadować <a href=\"%url%\" target=\"_blank\">zawartości</a>."
[FOLDER_LIST]
BUTTON_COMPOSE = "Utwórz"
@ -54,7 +54,7 @@ SENT_NAME = "Wysłane"
DRAFTS_NAME = "Wersje robocze"
SPAM_NAME = "Spam"
TRASH_NAME = "Kosz"
ARCHIVE_NAME = "Archive"
ARCHIVE_NAME = "Archiwum"
[QUOTA]
TITLE = "Wykorzystane miejsce"
@ -63,9 +63,9 @@ TITLE = "Wykorzystane miejsce"
BUTTON_RELOAD = "Odśwież"
BUTTON_MOVE_TO = "Przenieś do"
BUTTON_DELETE = "Usuń"
BUTTON_ARCHIVE = "Archive"
BUTTON_ARCHIVE = "Archiwum"
BUTTON_SPAM = "Oznacz jako spam"
BUTTON_NOT_SPAM = "Not Spam"
BUTTON_NOT_SPAM = "Oznacz jako wiarygodna"
BUTTON_EMPTY_FOLDER = "Wyczyść folder"
BUTTON_MULTY_FORWARD = "Przekaż dalej"
BUTTON_DELETE_WITHOUT_MOVE = "Usuń na stałe"
@ -73,51 +73,51 @@ BUTTON_MORE = "Więcej"
MENU_SET_SEEN = "Oznacz jako przeczytane"
MENU_SET_ALL_SEEN = "Oznacz wszystkie jako przeczytane"
MENU_UNSET_SEEN = "Oznacz jako nieprzeczytane"
MENU_SET_FLAG = "Etykieta"
MENU_UNSET_FLAG = "Usuń Etykietę"
MENU_SET_FLAG = "Oznacz jako ważne"
MENU_UNSET_FLAG = "Oznacz jako nieważne"
MENU_SELECT_ALL = "Wszystkie"
MENU_SELECT_NONE = "Żaden"
MENU_SELECT_INVERT = "Odwróć"
MENU_SELECT_UNSEEN = "Nieprzeczytane"
MENU_SELECT_SEEN = "Przeczytane"
MENU_SELECT_FLAGGED = "Z Etykietą"
MENU_SELECT_UNFLAGGED = "Bez Etykiety"
EMPTY_LIST = "Lista pusta"
MENU_SELECT_FLAGGED = "Oznaczone jako ważne"
MENU_SELECT_UNFLAGGED = "Oznaczone jako nieważne"
EMPTY_LIST = "Pusta lista"
EMPTY_SEARCH_LIST = "Brak wiadomości spełniających kryteria wyszukiwania"
SEARCH_RESULT_FOR = "Wyniki wyszukiwania dla \"%SEARCH%\""
SEARCH_RESULT_FOR = "Wyniki wyszukiwania dla: \"%SEARCH%\""
LIST_LOADING = "Ładowanie"
EMPTY_SUBJECT_TEXT = "(Brak tematu)"
PUT_MESSAGE_HERE = "Przeciągnij tutaj wiadomość żeby zobaczyć ją w liście"
TODAY_AT = "dzisiaj o %TIME%"
YESTERDAY_AT = "wczoraj o %TIME%"
PUT_MESSAGE_HERE = "Przeciągnij tutaj wiadomość, żeby zobaczyć ją na liście"
TODAY_AT = "dzisiaj o: %TIME%"
YESTERDAY_AT = "wczoraj o: %TIME%"
SEARCH_PLACEHOLDER = "Szukaj"
NEW_MESSAGE_NOTIFICATION = "Masz %COUNT% nowych wiadomości!"
QUOTA_SIZE = "Wykorzystano <strong>%SIZE% (%PROC%%)</strong> z przyznanych <strong>%LIMIT%</strong>"
NEW_MESSAGE_NOTIFICATION = "Masz: %COUNT% now(-ą,-e,-ych) wiadomości!"
QUOTA_SIZE = "Wykorzystano: <strong>%SIZE% (%PROC%%)</strong> z przyznanych: <strong>%LIMIT%</strong>"
[MESSAGE]
BUTTON_EDIT = "Edytuj"
BUTTON_BACK = "Wstecz"
BUTTON_CLOSE = "Zamknij"
BUTTON_DELETE = "Usuń"
BUTTON_ARCHIVE = "Archive"
BUTTON_ARCHIVE = "Archiwizuj"
BUTTON_SPAM = "Oznacz jako spam"
BUTTON_NOT_SPAM = "Not Spam"
BUTTON_MOVE_TO = "Przenieś Do"
BUTTON_NOT_SPAM = "Oznacz jako wiarygodną"
BUTTON_MOVE_TO = "Przenieś do"
BUTTON_MORE = "Więcej"
BUTTON_REPLY = "Odpowiedz"
BUTTON_REPLY_ALL = "Odpowiedz wszystkim"
BUTTON_FORWARD = "Przekaż dalej"
BUTTON_FORWARD_AS_ATTACHMENT = "Przekaż jako załącznik"
BUTTON_EDIT_AS_NEW = "Edytuj jako nową wiadomość"
BUTTON_SHOW_IMAGES = "Wyświetl obrazy poniżej"
BUTTON_SHOW_IMAGES = "Wyświetl obrazy"
BUTTON_NOTIFY_READ_RECEIPT = "Nadawca prosi o potwierdzenie odczytania tej wiadomości"
BUTTON_IN_NEW_WINDOW = "Wyświetl w osobnym oknie"
MENU_HEADERS = "Pokaż nagłówek wiadomości"
MENU_HEADERS = "Pokaż nagłówki wiadomości"
MENU_VIEW_ORIGINAL = "Pokaż oryginał"
MENU_DOWNLOAD_ORIGINAL = "Pobież jako plik .eml"
MENU_FILTER_SIMILAR = "Filtruj podobne wiadomości"
MENU_PRINT = "Drukuj"
EMPTY_SUBJECT_TEXT = "(Brak Tematu)"
EMPTY_SUBJECT_TEXT = "(Brak tematu)"
LABEL_SUBJECT = "Temat"
LABEL_DATE = "Data"
LABEL_FROM = "Od"
@ -134,14 +134,14 @@ PRINT_LABEL_DATE = "Data"
PRINT_LABEL_SUBJECT = "Temat"
PRINT_LABEL_ATTACHMENTS = "Załączniki"
MESSAGE_LOADING = "Ładowanie..."
MESSAGE_VIEW_DESC = "Wybierz wiadomość z listy w celu jej wyświetlenia."
PGP_PASSWORD_INPUT_PLACEHOLDER = "Password"
PGP_SIGNED_MESSAGE_DESC = "OpenPGP signed message (click to verify)"
PGP_ENCRYPTED_MESSAGE_DESC = "OpenPGP encrypted message (click to decrypt)"
MESSAGE_VIEW_DESC = "Wybierz wiadomość z listy w celu jej wyświetlenia"
PGP_PASSWORD_INPUT_PLACEHOLDER = "Hasło"
PGP_SIGNED_MESSAGE_DESC = "Wiadomość podpisana za pomocą OpenPGP (kliknij, aby zweryfikować)"
PGP_ENCRYPTED_MESSAGE_DESC = "Wiadomość zaszyfrowana za pomocą OpenPGP (kliknij, aby odszyfrować)"
[READ_RECEIPT]
SUBJECT = "Potwierdzenie odbioru (wyświetlenia) - %SUBJECT%"
BODY = "To jest potwierdzenie odbioru wiadomości wysłanej do %READ-RECEIPT%.
BODY = "To jest potwierdzenie odbioru wiadomości wysłanej do: %READ-RECEIPT%.
Uwaga: Potwierdzenie odbioru wiadomości przez odbiorcę informuję tylko o tym, że wiadomość została wyświetlona na komputerze odbiorcy. Nie ma żadnej gwarancji, że odbiorca odczytał wiadomość i zapoznał się z jej treścią."
@ -153,10 +153,10 @@ LEGEND_CONTACTS = "Kontakty"
SEARCH_INPUT_PLACEHOLDER = "Szukaj"
BUTTON_ADD_CONTACT = "Dodaj Kontakt"
BUTTON_CREATE_CONTACT = "Utwórz"
BUTTON_UPDATE_CONTACT = "Aktualizuj"
BUTTON_IMPORT = "Import (csv, vcf, vCard)"
BUTTON_EXPORT_VCARD = "Export (vcf, vCard)"
BUTTON_EXPORT_CSV = "Export (csv)"
BUTTON_UPDATE_CONTACT = "Zaktualizuj"
BUTTON_IMPORT = "Importuj (csv, vcf, vCard)"
BUTTON_EXPORT_VCARD = "Eksportuj (vcf, vCard)"
BUTTON_EXPORT_CSV = "Eksportuj (csv)"
ERROR_IMPORT_FILE = "Błąd importu (nieprawidłowy format pliku)"
LIST_LOADING = "Ładowanie"
EMPTY_LIST = "Brak kontaktów"
@ -164,37 +164,38 @@ EMPTY_SEARCH = "Nie znaleziono żadnych kontaktów"
CLEAR_SEARCH = "Wyczyść wyszukiwanie"
CONTACT_VIEW_DESC = "Wybierz kontakt z listy w celu jego wyświetlenia"
LABEL_DISPLAY_NAME = "Wyświetlana nazwa"
LABEL_EMAIL = "Email"
LABEL_EMAIL = "E-mail"
LABEL_PHONE = "Telefon"
LABEL_WEB = "Web"
LABEL_BIRTHDAY = "Birthday"
LINK_ADD_EMAIL = "Dodaj adres email"
LINK_ADD_PHONE = "Dodaj nr Tel"
LINK_BIRTHDAY = "Birthday"
LABEL_WEB = "Strona WWW"
LABEL_BIRTHDAY = "Urodziny"
LABEL_TAGS = "Tagi"
LINK_ADD_EMAIL = "Dodaj adres e-mail"
LINK_ADD_PHONE = "Dodaj nr telefonu"
LINK_BIRTHDAY = "Urodziny"
PLACEHOLDER_ENTER_DISPLAY_NAME = "Nazwa wyświetlana"
PLACEHOLDER_ENTER_LAST_NAME = "Nazwisko"
PLACEHOLDER_ENTER_FIRST_NAME = "Imię"
PLACEHOLDER_ENTER_NICK_NAME = "Enter nickname"
PLACEHOLDER_ENTER_NICK_NAME = "Pseudonim"
LABEL_READ_ONLY = "Tylko do odczytu"
LABEL_SHARE = "Udostępnij kontakt"
ADD_MENU_LABEL = "Add"
ADD_MENU_NICKNAME = "Nickname"
ADD_MENU_NOTES = "Notes"
ADD_MENU_EMAIL = "Email"
ADD_MENU_PHONE = "Phone"
ADD_MENU_URL = "URL"
ADD_MENU_ADDRESS = "Address"
ADD_MENU_BIRTHDAY = "Birthday"
ADD_MENU_TAGS = "Tags"
ADD_MENU_LABEL = "Dodaj"
ADD_MENU_NICKNAME = "Pseudonim"
ADD_MENU_NOTES = "Notatki"
ADD_MENU_EMAIL = "E-mail"
ADD_MENU_PHONE = "Telefon"
ADD_MENU_URL = "Adres URL"
ADD_MENU_ADDRESS = "Adres"
ADD_MENU_BIRTHDAY = "Urodziny"
ADD_MENU_TAGS = "Tagi"
BUTTON_SHARE_NONE = "Nikomu"
BUTTON_SHARE_ALL = "Wszystkim"
BUTTON_SYNC = "Synchronization (CardDAV)"
BUTTON_SYNC = "Synchronizacja (CardDAV)"
[COMPOSE]
TITLE_FROM = "Od"
TITLE_TO = "Do"
TITLE_CC = "Kopia do"
TITLE_BCC = "Ukryci odbiorcy"
TITLE_CC = "DW"
TITLE_BCC = "UDW"
TITLE_REPLY_TO = "Odpowiedź do"
TITLE_SUBJECT = "Temat"
LINK_SHOW_INPUTS = "Pokaż wszystkie pola"
@ -202,14 +203,14 @@ BUTTON_SEND = "Wyślij"
BUTTON_SAVE = "Zapisz"
BUTTON_DELETE = "Usuń"
BUTTON_CANCEL = "Anuluj"
SAVED_TIME = "Zapisane o %TIME%"
SAVED_TIME = "Zapisane o: %TIME%"
SAVED_ERROR_ON_SEND = "Wiadomość została wysłana, ale nie została zapisana w folderze: Wysłane"
ATTACH_FILES = "Dołącz pliki"
ATTACH_DROP_FILES_DESC = "Przeciągnij pliki tutaj"
ATTACH_ITEM_CANCEL = "Anuluj"
DROPBOX = "Dropbox"
GOOGLE_DRIVE = "Google Drive"
REPLY_MESSAGE_TITLE = "%DATETIME% %EMAIL% napisał"
REPLY_MESSAGE_TITLE = "%DATETIME% - %EMAIL%:"
FORWARD_MESSAGE_TOP_TITLE = "-------- Przekierowana wiadomość -------"
FORWARD_MESSAGE_TOP_FROM = "Od"
FORWARD_MESSAGE_TOP_TO = "Do"
@ -217,82 +218,82 @@ FORWARD_MESSAGE_TOP_CC = "CC"
FORWARD_MESSAGE_TOP_SENT = "Wysłany"
FORWARD_MESSAGE_TOP_SUBJECT = "Temat"
EMPTY_TO_ERROR_DESC = "Wprowadź co najmniej jednego odbiorcę"
ATTACHMENTS_UPLOAD_ERROR_DESC = "Not all attachments have been uploaded yet"
ATTACHMENTS_UPLOAD_ERROR_DESC = "Nie przesłano jeszcze wszystkich załączników"
BUTTON_REQUEST_READ_RECEIPT = "Żądaj potwierdzenia odbioru"
[POPUPS_ASK]
BUTTON_YES = "Tak"
BUTTON_NO = "Nie"
DESC_WANT_CLOSE_THIS_WINDOW = "Na pewno zamknąć to okno ?"
DESC_WANT_DELETE_MESSAGES = "Na pewno usunąć wiadomość(i)?"
DESC_WANT_DELETE_MESSAGES = "Na pewno usunąć wiadomość(-i) ?"
[POPUPS_LANGUAGES]
TITLE_LANGUAGES = "Choose language/Wybierz język"
TITLE_LANGUAGES = "Wybierz język"
[POPUPS_ADD_ACCOUNT]
TITLE_ADD_ACCOUNT = "Dodać Konto?"
TITLE_ADD_ACCOUNT = "Dodawanie konta"
BUTTON_ADD_ACCOUNT = "Dodaj"
[POPUPS_IDENTITIES]
TITLE_ADD_IDENTITY = "Dodać tożsamość?"
TITLE_UPDATE_IDENTITY = "Uaktualnić tożsamość?"
TITLE_ADD_IDENTITY = "Dodawanie tożsamości"
TITLE_UPDATE_IDENTITY = "Aktualizacja tożsamości"
BUTTON_ADD_IDENTITY = "Dodaj"
BUTTON_UPDATE_IDENTITY = "Aktualizuj"
LABEL_EMAIL = "Email"
LABEL_EMAIL = "E-mail"
LABEL_NAME = "Nazwa"
LABEL_REPLY_TO = "Odpowiedz do"
LABEL_BCC = "Ukryci odbiorcy"
[POPUPS_CREATE_FOLDER]
TITLE_CREATE_FOLDER = "Utworzyć Folder?"
TITLE_CREATE_FOLDER = "Tworzenie folderu"
SELECT_NO_PARENT = ""
LABEL_NAME = "Nazwa Folderu"
LABEL_PARENT = "Folder Nadrzędny"
LABEL_NAME = "Nazwa folderu"
LABEL_PARENT = "Folder nadrzędny"
BUTTON_CREATE = "Utwórz"
BUTTON_CANCEL = "Anuluj"
BUTTON_CLOSE = "Zamknij"
TITLE_CREATING_PROCESS = "Trwa dodawanie Folderu"
TITLE_CREATING_PROCESS = "Trwa dodawanie folderu"
[POPUPS_CLEAR_FOLDER]
TITLE_CLEAR_FOLDER = "Czy chcesz usunąć wszystkie wiadomości z folderu?"
BUTTON_CLEAR = "Usuń"
BUTTON_CANCEL = "Anuluj"
BUTTON_CLOSE = "Zamknij"
DANGER_DESC_WARNING = "Uwaga!"
DANGER_DESC_HTML_1 = "Wybrana akcja doprowadzi do usunięcia na stałe wszystkich wiadomości z folderu <strong>%FOLDER%</strong> !"
DANGER_DESC_HTML_2 = "Po rozpoczęciu, proces nie może zostać przerwany ani anulowany."
TITLE_CLEARING_PROCESS = "Trwa usuwanie wszystkich wiadomości w folderze..."
DANGER_DESC_WARNING = "Ostrzeżenie !"
DANGER_DESC_HTML_1 = "Wszystkie wiadomości w folderze: <strong>%FOLDER%</strong>, zostaną bezpowrotnie usunięte !"
DANGER_DESC_HTML_2 = "Po rozpoczęciu, proces nie może zostać przerwany lub anulowany."
TITLE_CLEARING_PROCESS = "Trwa usuwanie wszystkich wiadomości z folderu..."
[POPUPS_IMPORT_OPEN_PGP_KEY]
TITLE_IMPORT_OPEN_PGP_KEY = "Import OpenPGP key"
BUTTON_IMPORT_OPEN_PGP_KEY = "Import"
TITLE_IMPORT_OPEN_PGP_KEY = "Importowanie klucza OpenPGP"
BUTTON_IMPORT_OPEN_PGP_KEY = "Importuj"
[POPUPS_VIEW_OPEN_PGP_KEY]
TITLE_VIEW_OPEN_PGP_KEY = "View OpenPGP key"
BUTTON_SELECT = "Select"
BUTTON_CLOSE = "Close"
TITLE_VIEW_OPEN_PGP_KEY = "Klucz OpenPGP"
BUTTON_SELECT = "Zaznacz"
BUTTON_CLOSE = "Zamknij"
[POPUPS_GENERATE_OPEN_PGP_KEYS]
TITLE_GENERATE_OPEN_PGP_KEYS = "Generate OpenPGP keys"
LABEL_EMAIL = "Email"
LABEL_NAME = "Name"
LABEL_PASSWORD = "Password"
LABEL_KEY_BIT_LENGTH = "Key length"
BUTTON_GENERATE_OPEN_PGP_KEYS = "Generate"
TITLE_GENERATE_OPEN_PGP_KEYS = "Generowanie klucza OpenPGP"
LABEL_EMAIL = "E-mail"
LABEL_NAME = "Imię i nazwisko"
LABEL_PASSWORD = "Hasło"
LABEL_KEY_BIT_LENGTH = "Długość klucza"
BUTTON_GENERATE_OPEN_PGP_KEYS = "Generuj"
[POPUPS_COMPOSE_OPEN_PGP]
TITLE_COMPOSE_OPEN_PGP = "OpenPGP Sign/Encrypt"
LABEL_SIGN = "Sign"
LABEL_ENCRYPT = "Encrypt"
LABEL_PASSWORD = "Password"
BUTTON_SIGN = "Sign"
BUTTON_ENCRYPT = "Encrypt"
BUTTON_SIGN_AND_ENCRYPT = "Sign and encrypt"
TITLE_COMPOSE_OPEN_PGP = "Podpisz/Zaszyfruj"
LABEL_SIGN = "Podpisz"
LABEL_ENCRYPT = "Zaszyfruj"
LABEL_PASSWORD = "Hasło"
BUTTON_SIGN = "Podpisz"
BUTTON_ENCRYPT = "Zaszyfruj"
BUTTON_SIGN_AND_ENCRYPT = "Podpisz i zaszyfruj"
[POPUPS_TWO_FACTOR_TEST]
TITLE_TEST_CODE = "2-Step verification test"
LABEL_CODE = "Code"
BUTTON_TEST = "Test"
TITLE_TEST_CODE = "Test weryfikacji 2-stopniowej"
LABEL_CODE = "Kod"
BUTTON_TEST = "Testuj"
[POPUPS_SYSTEM_FOLDERS]
TITLE_SYSTEM_FOLDERS = "Wybierz foldery systemowe"
@ -300,24 +301,24 @@ SELECT_CHOOSE_ONE = "Wybierz"
SELECT_UNUSE_NAME = "Nie używaj"
LABEL_SENT = "Wysłane"
LABEL_DRAFTS = "Wersje robocze"
LABEL_SPAM = "SPAM"
LABEL_SPAM = "Spam"
LABEL_TRASH = "Kosz"
LABEL_ARCHIVE = "Archive"
LABEL_ARCHIVE = "Archiwum"
BUTTON_CANCEL = "Anuluj"
BUTTON_CLOSE = "Zamknij"
NOTIFICATION_SENT = "Nie został wybrany folder \"Wysłane\" do którego przenoszone są wiadomości po wysłaniu.
Jeżeli wysłane wiadomości nie mają być przechowywane, proszę o zaznaczenie opcji \"Nie używaj\"."
NOTIFICATION_SENT = "Nie został wybrany folder \"Wysłane\", do którego przenoszone są wiadomości po wysłaniu.
Jeżeli wysłane wiadomości nie mają być przechowywane, proszę o zaznaczenie opcji: \"Nie używaj\"."
NOTIFICATION_DRAFTS = "Nie został wybrany folder \"Wersje robocze\" do którego są zapisywane wiadomości w trakcie ich tworzenia."
NOTIFICATION_DRAFTS = "Nie został wybrany folder \"Wersje robocze\", do którego są zapisywane wiadomości w trakcie ich tworzenia."
NOTIFICATION_SPAM = "Nie został wybrany folder \"SPAM\" do którego przenoszone są wiadomości oznaczone jako SPAM.
Jeżeli wiadomości oznaczone jako spam mają być usuwane na stałe, proszę o zaznaczenie opcji \"Nie używaj\"."
NOTIFICATION_SPAM = "Nie został wybrany folder \"Spam\", do którego przenoszone są wiadomości oznaczone jako SPAM.
Jeżeli wiadomości oznaczone jako spam mają być usuwane na stałe, proszę o zaznaczenie opcji: \"Nie używaj\"."
NOTIFICATION_TRASH = "Nie został wybrany folder \"Kosz\" do którego przenoszone są wszystkie usunięte wiadomości.
Jeżeli wiadomości usunięte mają być usuwane na stałe, proszę o zaznaczenie opcji \"Nie używaj\"."
NOTIFICATION_TRASH = "Nie został wybrany folder \"Kosz\", do którego przenoszone są wszystkie usunięte wiadomości.
Jeżeli wiadomości usunięte mają być usuwane na stałe, proszę o zaznaczenie opcji: \"Nie używaj\"."
NOTIFICATION_ARCHIVE = "You haven't selected \"Archive\" system folder achived messages are placed to."
NOTIFICATION_ARCHIVE = "Nie został wybrany folder \"Archiwum\", zostanie użyty systemowy folder archiwizowanych wiadomości."
[TITLES]
LOADING = "Ładowanie"
@ -330,7 +331,7 @@ COMPOSE = "Utwórz"
ERROR_FILE_IS_TOO_BIG = "Plik jest za duży"
ERROR_FILE_PARTIALLY_UPLOADED = "Z powodu nieokreślonego błędu, plik nie został przesłany w całości"
ERROR_NO_FILE_UPLOADED = "Nie przesłano żadnego pliku"
ERROR_MISSING_TEMP_FOLDER = "Brakuje tymczasowego katalogu lub pliku"
ERROR_MISSING_TEMP_FOLDER = "Brakuje pliku tymczasowego"
ERROR_ON_SAVING_FILE = "Wystąpił nieoczekiwany błąd w trakcie przesyłania pliku"
ERROR_FILE_TYPE = "Nieprawidłowy typ pliku"
ERROR_UNKNOWN = "Wystąpił nieznany błąd w trakcie przesyłania pliku"
@ -348,41 +349,49 @@ LABEL_FOLDERS_NAME = "Foldery"
LABEL_ACCOUNTS_NAME = "Konta"
LABEL_IDENTITY_NAME = "Tożsamość"
LABEL_IDENTITIES_NAME = "Tożsamości"
LABEL_SECURITY_NAME = "Security"
LABEL_SOCIAL_NAME = "Social"
LABEL_THEMES_NAME = "Wygląd"
LABEL_FILTERS_NAME = "Filtry"
LABEL_SECURITY_NAME = "Bezpieczeństwo"
LABEL_SOCIAL_NAME = "Sieci społecznościowe"
LABEL_THEMES_NAME = "Skórki"
LABEL_CHANGE_PASSWORD_NAME = "Hasło"
LABEL_OPEN_PGP_NAME = "OpenPGP"
BUTTON_BACK = "Wstecz"
[SETTINGS_FILTERS]
LEGEND_FILTERS = "Filtry"
BUTTON_ADD_FILTER = "Dodaj filter"
BUTTON_DELETE_FILTER = "Usuń filter"
BUTTON_ADD_CONDITION = "Dodaj warunek"
BUTTON_ADD_ACTION = "Dodaj działanie"
[SETTINGS_IDENTITY]
LEGEND_IDENTITY = "Tożsamość"
LABEL_DISPLAY_NAME = "Imię"
LABEL_DISPLAY_NAME = "Imię i nazwisko"
LABEL_REPLY_TO = "Zwrotny adres e-mail"
LABEL_SIGNATURE = "Podpis"
LABEL_ADD_SIGNATURE_TO_ALL = "Dadawaj podpis do wszystkich wysyłanych wiadomości"
[SETTINGS_SECURITY]
LEGEND_TWO_FACTOR_AUTH = "2-Step Verification (Google Authenticator)"
LABEL_ENABLE_TWO_FACTOR = "Enable 2-Step verification"
LABEL_TWO_FACTOR_USER = "User"
LEGEND_TWO_FACTOR_AUTH = "Weryfikacja 2-stopniowa (Google Authenticator)"
LABEL_ENABLE_TWO_FACTOR = "Włącz 2-stopniową weryfikację"
LABEL_TWO_FACTOR_USER = "Użytkownik"
LABEL_TWO_FACTOR_STATUS = "Status"
LABEL_TWO_FACTOR_SECRET = "Secret"
LABEL_TWO_FACTOR_BACKUP_CODES = "Backup codes"
BUTTON_CREATE = "Create New Secret"
BUTTON_CLEAR = "Clear"
BUTTON_TEST = "Test"
BUTTON_SHOW_SECRET = "Show Secret"
BUTTON_HIDE_SECRET = "Hide Secret"
TWO_FACTOR_SECRET_CONFIGURED_DESC = "Configured"
TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC = "Not configured"
TWO_FACTOR_SECRET_DESC = "Import this info into your Google Authenticator client (or other TOTP client) using the provided QR code below or by entering the code manually."
TWO_FACTOR_BACKUP_CODES_DESC = "If you can't receive codes via Google Authenticator, you can use backup codes to sign in. After youve used a backup code to sign in, it will become inactive."
LABEL_TWO_FACTOR_SECRET = "Tajna fraza"
LABEL_TWO_FACTOR_BACKUP_CODES = "Kody zapasowe"
BUTTON_CREATE = "Utwórz nową frazę"
BUTTON_CLEAR = "Wyczyść"
BUTTON_TEST = "Testuj"
BUTTON_SHOW_SECRET = "Pokaż frazę"
BUTTON_HIDE_SECRET = "Ukryj frazę"
TWO_FACTOR_SECRET_CONFIGURED_DESC = "Skonfigurowane"
TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC = "Nie skonfigurowane"
TWO_FACTOR_SECRET_DESC = "Zaimportuj te informacje do swojego klienta usługi Google Authenticator (lub innego klienta TOTP), używając poniższego kodu QR lub wpisując kod ręcznie."
TWO_FACTOR_BACKUP_CODES_DESC = "Jeżeli nie możesz otrzymać kodu poprzez apikację Google Authenticator, możesz użyć kodów zapasowych. Po zużyciu kodów, opcja ta będzie nieaktywna."
[SETTINGS_GENERAL]
LEGEND_GENERAL = "Ogólne"
LABEL_LANGUAGE = "Język"
LABEL_EDITOR = "Domyślny edytor tekstu"
LABEL_EDITOR = "Format wiadomości"
LABEL_EDITOR_HTML_AS_DEFAULT = "HTML"
LABEL_EDITOR_PLAIN_AS_DEFAULT = "Zwykły tekst"
LABEL_ANIMATION = "Animacja interfejsu"
@ -391,10 +400,10 @@ LABEL_ANIMATION_NORMAL = "Zwykła"
LABEL_ANIMATION_NONE = "Brak"
LABEL_VIEW_OPTIONS = "Opcje wyświetlania"
LABEL_USE_PREVIEW_PANE = "Wyświetl okno podglądu"
LABEL_USE_CHECKBOXES_IN_LIST = "Wyświetl checkboxy w listach"
LABEL_USE_CHECKBOXES_IN_LIST = "Wyświetl pola zaznaczenia w listach"
LABEL_USE_THREADS = "Używaj wątków"
LABEL_REPLY_SAME_FOLDER = "Umieść odpowiedź w folderze wiadomości na którą udzielana jest odpowiedź"
LABEL_SHOW_IMAGES = "Zawsze wyświetlaj obrazy w wiadomości"
LABEL_REPLY_SAME_FOLDER = "Umieść odpowiedź w folderze wiadomości, na którą udzielana jest odpowiedź"
LABEL_SHOW_IMAGES = "Zawsze wyświetlaj obrazy w wiadomościach"
LABEL_SHOW_ANIMATION = "Odtwarzaj animacje"
LABEL_MESSAGE_PER_PAGE = "wiadomości na stronie"
LABEL_CHROME_NOTIFICATION = "Powiadomienia"
@ -404,38 +413,38 @@ LABEL_CHROME_NOTIFICATION_DESC_DENIED = "(Zablokowane przez przeglądarkę)"
[SETTINGS_CONTACTS]
LEGEND_CONTACTS = "Kontakty"
LABEL_CONTACTS_AUTOSAVE = "Automatycznie dodaj nieznanych nadawców i odbiorców do książki adresowej"
LEGEND_CONTACTS_SYNC = "Remote Synchronization (CardDAV)"
LABEL_CONTACTS_SYNC_ENABLE = "Enable remote synchronization"
LABEL_CONTACTS_SYNC_SERVER = "Server"
LABEL_CONTACTS_SYNC_AB_URL = "Addressbook URL"
LABEL_CONTACTS_SYNC_USER = "User"
LABEL_CONTACTS_SYNC_PASSWORD = "Password"
LEGEND_CONTACTS_SYNC = "Zdalna synchronizacja (CardDAV)"
LABEL_CONTACTS_SYNC_ENABLE = "Włącz zdalną synchronizację"
LABEL_CONTACTS_SYNC_SERVER = "Serwer"
LABEL_CONTACTS_SYNC_AB_URL = "Adres URL"
LABEL_CONTACTS_SYNC_USER = "Użytkownik"
LABEL_CONTACTS_SYNC_PASSWORD = "Hasło"
[SETTINGS_THEMES]
LEGEND_THEMES = "Wygląd"
LEGEND_THEMES = "Skórki"
LEGEND_THEMES_CUSTOM = "Konfiguracja indywidualnego wyglądu"
LABEL_CUSTOM_TYPE = "Typ"
LABEL_CUSTOM_TYPE_LIGHT = "Jasny"
LABEL_CUSTOM_TYPE_DARK = "Ciemny"
LABEL_CUSTOM_BACKGROUND_IMAGE = "Tło"
BUTTON_UPLOAD_BACKGROUND_IMAGE = "Prześlij własne tło (.JPG, .PNG)"
ERROR_FILE_IS_TOO_BIG = "Plik jest za duży"
ERROR_FILE_IS_TOO_BIG = "Plik jest za duży (1MB+)"
ERROR_FILE_TYPE_ERROR = "Nieprawidłowy format pliku (obsługiwane są wyłącznie pliki .JPG i .PNG)"
ERROR_UNKNOWN = "Wystąpił nieznany błąd w trakcie przesyłania"
[SETTINGS_SOCIAL]
LEGEND_GOOGLE = "Google Account"
BUTTON_GOOGLE_CONNECT = "Połącz z Google"
BUTTON_GOOGLE_DISCONNECT = "Odłącz z Google"
MAIN_GOOGLE_DESC = "Po zezwoleniu na logowanie przez Google, możesz zalogować się na to konto używając guzika Google w panelu logowania."
BUTTON_GOOGLE_DISCONNECT = "Odłącz"
MAIN_GOOGLE_DESC = "Po zezwoleniu na logowanie przez Google, możesz zalogować się na to konto używając przycisku: \"Google\" w panelu logowania."
LEGEND_FACEBOOK = "Facebook"
BUTTON_FACEBOOK_CONNECT = "Połącz z Facebook"
BUTTON_FACEBOOK_DISCONNECT = "Odłącz z Facebook"
MAIN_FACEBOOK_DESC = "Po zezwoleniu na logowanie przez Facebook, możesz zalogować się na to konto używając guzika Facebook w panelu logowania."
BUTTON_FACEBOOK_DISCONNECT = "Odłącz"
MAIN_FACEBOOK_DESC = "Po zezwoleniu na logowanie przez Facebook, możesz zalogować się na to konto używając przycisku: \"Facebook\" w panelu logowania."
LEGEND_TWITTER = "Twitter"
BUTTON_TWITTER_CONNECT = "Połącz z Twitter"
BUTTON_TWITTER_DISCONNECT = "Odłącz z Twitter"
MAIN_TWITTER_DESC = "Po zezwoleniu na logowanie przez Twitter, możesz zalogować się na to konto używając guzika Twitter w panelu logowania."
BUTTON_TWITTER_DISCONNECT = "Odłącz"
MAIN_TWITTER_DESC = "Po zezwoleniu na logowanie przez Twitter, możesz zalogować się na to konto używając przycisku: \"Twitter\" w panelu logowania."
[SETTINGS_FOLDERS]
LEGEND_FOLDERS = "Lista Folderów"
@ -459,16 +468,16 @@ DELETING_ASK = "Czy na pewno usunąć?"
[SETTINGS_IDENTITIES]
LEGEND_IDENTITY = "Tożsamość"
LEGEND_IDENTITIES = "Dodatkowe Tożsamości"
LABEL_DEFAULT = "Default"
LEGEND_IDENTITIES = "Dodatkowe tożsamości"
LABEL_DEFAULT = "Domyślna"
LABEL_DISPLAY_NAME = "Nazwa"
LABEL_REPLY_TO = "Odp. do"
LABEL_REPLY_TO = "Odpowiedź do"
LABEL_SIGNATURE = "Podpis"
LABEL_ADD_SIGNATURE_TO_ALL = "Dodaj podpis do wszystkich wysyłanych wiadomości"
BUTTON_ADD_IDENTITY = "Dodaj Tożsamość"
BUTTON_ADD_IDENTITY = "Dodaj tożsamość"
BUTTON_DELETE = "Usuń"
LOADING_PROCESS = "Trwa aktualizowanie listy tożsamości"
DELETING_ASK = "Jesteś pewny(a)?"
DELETING_ASK = "Czy na pewno chcesz usunąć ?"
[SETTINGS_CHANGE_PASSWORD]
LEGEND_CHANGE_PASSWORD = "Zmiana hasła"
@ -476,67 +485,67 @@ LABEL_CURRENT_PASSWORD = "Aktualne hasło"
LABEL_NEW_PASSWORD = "Nowe hasło"
LABEL_REPEAT_PASSWORD = "Powtórz nowe hasło"
BUTTON_UPDATE_PASSWORD = "Zmień hasło na nowe"
ERROR_PASSWORD_MISMATCH = "Passwords do not match, please try again"
ERROR_PASSWORD_MISMATCH = "Wpisane hasła nie pasują do siebie, proszę spróbować ponownie"
[SETTINGS_OPEN_PGP]
LEGEND_OPEN_PGP = "OpenPGP"
BUTTON_ADD_OPEN_PGP_KEY = "Import OpenPGP Key"
BUTTON_GENERATE_OPEN_PGP_KEYS = "Generate OpenPGP Keys"
TITLE_PRIVATE = "Private"
TITLE_PUBLIC = "Public"
DELETING_ASK = "Are you sure?"
BUTTON_ADD_OPEN_PGP_KEY = "Importuj klucz OpenPGP"
BUTTON_GENERATE_OPEN_PGP_KEYS = "Generuj klucz OpenPGP"
TITLE_PRIVATE = "Prywatny"
TITLE_PUBLIC = "Publiczny"
DELETING_ASK = "Czy na pewno chcesz usunąć ?"
[SHORTCUTS_HELP]
LEGEND_SHORTCUTS_HELP = "Keyboard shortcuts help"
TAB_MAILBOX = "Mailbox"
TAB_MESSAGE_LIST = "Message list"
TAB_MESSAGE_VIEW = "Message view"
TAB_COMPOSE = "Compose"
LABEL_OPEN_USER_DROPDOWN = "Open user dropdown"
LABEL_REPLY = "Reply"
LABEL_REPLY_ALL = "Reply All"
LABEL_FORWARD = "Forward"
LABEL_FORWARD_MULTIPLY = "Forward (multiply)"
LABEL_HELP = "Help"
LEGEND_SHORTCUTS_HELP = "Skróty klawiaturowe"
TAB_MAILBOX = "Skrzynka pocztowa"
TAB_MESSAGE_LIST = "Lista wiadomości"
TAB_MESSAGE_VIEW = "Widok wiadomości"
TAB_COMPOSE = "Tworzenie wiadomości"
LABEL_OPEN_USER_DROPDOWN = "Otwórz podręczne menu użytkownika"
LABEL_REPLY = "Odpowiedz"
LABEL_REPLY_ALL = "Odpowiedz wszystkim"
LABEL_FORWARD = "Przekaż"
LABEL_FORWARD_MULTIPLY = "Przekaż (wielokrotnie)"
LABEL_HELP = "Pomoc"
LABEL_CHECK_ALL = "Check All messages"
LABEL_ARCHIVE = "Archive"
LABEL_DELETE = "Delete"
LABEL_MOVE = "Move"
LABEL_READ = "Read selected messages"
LABEL_UNREAD = "Unread selected messages"
LABEL_IMPORTANT = "Important, star/flag selected messages"
LABEL_SEARCH = "Search"
LABEL_CANCEL_SEARCH = "Cancel search"
LABEL_FULLSCREEN_ENTER = "Fullscreen (Preview pane layout)"
LABEL_VIEW_MESSAGE_ENTER = "View message (No preview pane layout)"
LABEL_SWITCH_TO_MESSAGE = "Switch focus to selected message"
LABEL_SWITCH_TO_FOLDER_LIST = "Switch focus to folder list"
LABEL_CHECK_ALL = "Sprawdź wszystkie wiadomości"
LABEL_ARCHIVE = "Archiwum"
LABEL_DELETE = "Usuń"
LABEL_MOVE = "Przenieś"
LABEL_READ = "Oznacz zaznaczone wiadomości, jako przeczytane"
LABEL_UNREAD = "Oznacz zaznaczone wiadomości, jako nieprzeczytane"
LABEL_IMPORTANT = "Oznacz zaznaczone wiadomości, jako ważne"
LABEL_SEARCH = "Szukaj"
LABEL_CANCEL_SEARCH = "Anuluj szukanie"
LABEL_FULLSCREEN_ENTER = "Pełny ekran (aktywny podgląd wiadomości)"
LABEL_VIEW_MESSAGE_ENTER = "Pokaż wiadomość (nieaktywny podgląd wiadomości)"
LABEL_SWITCH_TO_MESSAGE = "Wybrana wiadomość na pierwszym planie"
LABEL_SWITCH_TO_FOLDER_LIST = "Lista folderów na pierwszym planie"
LABEL_FULLSCREEN_TOGGLE = "Toggle fullscreen mode"
LABEL_BLOCKQUOTES_TOGGLE = "Toggle message blockquotes"
LABEL_PRINT = "Print"
LABEL_EXIT_FULLSCREEN = "Exit fullscreen mode"
LABEL_CLOSE_MESSAGE = "Close message (No preview pane layout)"
LABEL_SWITCH_TO_LIST = "Switch focus back to message list"
LABEL_FULLSCREEN_TOGGLE = "Tryb pełnoekranowy"
LABEL_BLOCKQUOTES_TOGGLE = "Cytowanie wiadomości"
LABEL_PRINT = "Drukuj"
LABEL_EXIT_FULLSCREEN = "Opuść tryb pełnoekranowy"
LABEL_CLOSE_MESSAGE = "Zamknij wiadomość (nieaktywny podgląd wiadomości)"
LABEL_SWITCH_TO_LIST = "Powróc do widoku listy wiadomości"
LABEL_OPEN_COMPOSE_POPUP = "Open compose popup"
LABEL_OPEN_IDENTITIES_DROPDOWN = "Open identities dropdown"
LABEL_SAVE_MESSAGE = "Save message"
LABEL_SEND_MESSAGE = "Send message"
LABEL_CLOSE_COMPOSE = "Close compose"
LABEL_OPEN_COMPOSE_POPUP = "Otwórz okno tworzenia wiadomości"
LABEL_OPEN_IDENTITIES_DROPDOWN = "Otwórz menu wyboru tożsamości"
LABEL_SAVE_MESSAGE = "Zapisz wiadomość"
LABEL_SEND_MESSAGE = "Wyślij wiadomość"
LABEL_CLOSE_COMPOSE = "Zamknij okno tworzenia wiadomości"
[PGP_NOTIFICATIONS]
NO_PUBLIC_KEYS_FOUND = "No public keys found"
NO_PUBLIC_KEYS_FOUND_FOR = "No public keys found for "%EMAIL%" email"
NO_PRIVATE_KEY_FOUND = "No private key found"
NO_PRIVATE_KEY_FOUND_FOR = "No private key found for "%EMAIL%" email"
UNVERIFIRED_SIGNATURE = "Unverified signature"
DECRYPTION_ERROR = "OpenPGP decryption error"
GOOD_SIGNATURE = "Good signature from %USER%"
PGP_ERROR = "OpenPGP error: %ERROR%"
SPECIFY_FROM_EMAIL = "Please specify FROM email address"
SPECIFY_AT_LEAST_ONE_RECIPIENT = "Please specify at least one recipient"
NO_PUBLIC_KEYS_FOUND = "Nie znaleziono kluczy publicznych"
NO_PUBLIC_KEYS_FOUND_FOR = "Nie znaleziono kluczy publicznych dla adresu: "%EMAIL%""
NO_PRIVATE_KEY_FOUND = "Nie znaleziono kluczy prywatnych"
NO_PRIVATE_KEY_FOUND_FOR = "Nie znaleziono kluczy prywatnych dla adresu: "%EMAIL%""
UNVERIFIRED_SIGNATURE = "Niezweryfikowana sygnatura"
DECRYPTION_ERROR = "Błąd deszyfrowania OpenPGP"
GOOD_SIGNATURE = "Wiadomość podpisana przez: %USER%"
PGP_ERROR = "Błąd OpenPGP: %ERROR%"
SPECIFY_FROM_EMAIL = "Proszę podać adres e-mail w polu: OD"
SPECIFY_AT_LEAST_ONE_RECIPIENT = "Proszę podać przynajmniej jednego odbiorcę"
[NOTIFICATIONS]
INVALID_TOKEN = "Nieprawidłowy token"
@ -544,19 +553,19 @@ AUTH_ERROR = "Błąd autoryzacji"
ACCESS_ERROR = "Błąd dostępu"
CONNECTION_ERROR = "Błąd połączenia z serwerem"
CAPTCHA_ERROR = "Nieprawidłowy kod CAPTCHA"
SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE = "To społecznościowe ID na Facebooku nie jest powiązane z żadnym kontem pocztowym. W związku z tym zaloguj się używając danych swojego konta e-mail i skonfiguruj tę opcję w Ustawieniach > Social Media"
SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE = "To społecznościowe ID na Twitter nie jest powiązane z żadnym kontem pocztowym. W związku z tym zaloguj się używając danych swojego konta e-mail i skonfiguruj tę opcję w Ustawieniach > Social Media"
SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE = "To społecznościowe ID (Google Acounts) nie jest powiązane z żadnym kontem pocztowym. W związku z tym zaloguj się używając danych swojego konta e-mail i skonfiguruj tę opcję w Ustawieniach > Social Media"
DOMAIN_NOT_ALLOWED = "Domena nie dozwolona"
SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE = "To społecznościowe ID (Facebooku), nie jest powiązane z żadnym kontem pocztowym. Zaloguj się używając danych swojego konta e-mail i skonfiguruj tę opcję w: Ustawienia > Sieci społecznościowe"
SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE = "To społecznościowe ID (Twitter), nie jest powiązane z żadnym kontem pocztowym. Zaloguj się używając danych swojego konta e-mail i skonfiguruj tę opcję w: Ustawienia > Sieci społecznościowe"
SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE = "To społecznościowe ID (Konto Google), nie jest powiązane z żadnym kontem pocztowym. Zaloguj się używając danych swojego konta e-mail i skonfiguruj tę opcję w: Ustawienia > Sieci społecznościowe"
DOMAIN_NOT_ALLOWED = "Domena niedozwolona"
ACCOUNT_NOT_ALLOWED = "Konto nie jest dozwolone"
ACCOUNT_TWO_FACTOR_AUTH_REQUIRED = "Two factor verification required"
ACCOUNT_TWO_FACTOR_AUTH_ERROR = "Two factor verification error"
COULD_NOT_SAVE_NEW_PASSWORD = "Could not save new password"
CURRENT_PASSWORD_INCORRECT = "Current password incorrect"
NEW_PASSWORD_SHORT = "Password is too short"
NEW_PASSWORD_WEAK = "Password is too easy"
NEW_PASSWORD_FORBIDDENT = "Password contains forbidden characters"
CONTACTS_SYNC_ERROR = "Contacts synchronization error"
ACCOUNT_TWO_FACTOR_AUTH_REQUIRED = "Wymagana 2-stopniowa weryfikacja"
ACCOUNT_TWO_FACTOR_AUTH_ERROR = "Błąd 2-stopniowej weryfikacji"
COULD_NOT_SAVE_NEW_PASSWORD = "Nie można było zapisać nowego hasła"
CURRENT_PASSWORD_INCORRECT = "Obecne hasło jest niepoprawne"
NEW_PASSWORD_SHORT = "Hasło jest za krótkie"
NEW_PASSWORD_WEAK = "Hasło jest zbyt łatwe"
NEW_PASSWORD_FORBIDDENT = "Hasło zawiera zakazane znaki"
CONTACTS_SYNC_ERROR = "Błąd synchronizacji kontaktów"
CANT_GET_MESSAGE_LIST = "Nie jest możliwe pobranie listy wiadomości"
CANT_GET_MESSAGE = "Nie można pobrać wiadomości"
CANT_DELETE_MESSAGE = "Nie można usunąć wiadomości"
@ -583,22 +592,22 @@ LICENSING_DOMAIN_BANNED = "Subskrypcja dla tej domeny została zablokowana"
DEMO_SEND_MESSAGE_ERROR = "Ze względów bezpieczeństwa, to konto testowe nie ma możliwości przesyłania, wiadomości na zewnętrzne adresy e-mail."
ACCOUNT_ALREADY_EXISTS = "Konto o takiej nazwie już istnieje"
MAIL_SERVER_ERROR = "Wystąpił błąd w trakcie połączenia z serwerem poczty"
INVALID_INPUT_ARGUMENT = "Invalid input argument"
INVALID_INPUT_ARGUMENT = "Nieprawidłowy argument"
UNKNOWN_ERROR = "Nieznany błąd"
[STATIC]
BACK_LINK = "Przeładuj"
DOMAIN_LIST_DESC = "Lista domen do których webmail ma dostęp."
PHP_EXSTENSIONS_ERROR_DESC = "Wymagane rozszerzenia PHP są niedostępne!"
PHP_VERSION_ERROR_DESC = "Aktualnie zainstalowana wersja PHP (%VERSION%) jest niższa niż minimalnie wymagana 5.3.0!"
BACK_LINK = "Odśwież"
DOMAIN_LIST_DESC = "Lista domen do których webmail ma dostęp"
PHP_EXSTENSIONS_ERROR_DESC = "Wymagane rozszerzenia PHP są niedostępne !"
PHP_VERSION_ERROR_DESC = "Aktualnie zainstalowana wersja PHP: (%VERSION%), jest niższa niż minimalnie wymagana 5.3.0 !"
NO_SCRIPT_TITLE = "Ta aplikacja wymaga JavaScript."
NO_SCRIPT_DESC = "Twoja przeglądarka nie obsługuje JavaScript.
NO_SCRIPT_TITLE = "Ta aplikacja wymaga JavaScript"
NO_SCRIPT_DESC = "Twoja przeglądarka nie obsługuje JavaScript
Proszę o umożliwienie obsługi JavaScript w przeglądarce, oraz ponowne załadowanie tej strony."
NO_COOKIE_TITLE = "Ta aplikacja wymaga plików Cookies"
NO_COOKIE_DESC = "Obsługa Cookies jest wyłączona w twojej przeglądarce.
Proszę o umożliwienie obsługi plików Cookie w przeglądarce, oraz ponowne uruchomienie tej strony."
NO_COOKIE_DESC = "Obsługa Cookies jest wyłączona w twojej przeglądarce
Proszę o umożliwienie obsługi plików Cookie w przeglądarce oraz ponowne uruchomienie tej strony."
BAD_BROWSER_TITLE = "Twoja przeglądarka jest przestarzała!"
BAD_BROWSER_DESC = "W celu wykorzystania wszystkich funkcji tej aplikacji,

View file

@ -5,8 +5,6 @@
$div = $('<div></div>'),
trim = $.trim,
/**
* @param {string} sHtml
* @return {string}
@ -14,40 +12,69 @@
htmlToPlain = function (sHtml)
{
var
iPos = 0,
iP1 = 0,
iP2 = 0,
iP3 = 0,
iLimit = 0,
sText = '',
sQuoteChar = '> ',
convertBlockquote = function () {
if (arguments && 1 < arguments.length)
splitPlainText = function (sText)
{
var
iLen = 100,
sPrefix = '',
sSubText = '',
sResult = sText,
iSpacePos = 0,
iNewLinePos = 0
;
while (sResult.length > iLen)
{
var
sText = trim(arguments[1])
.replace(/__bq__start__([\s\S\n\r]*)__bq__end__/gm, convertBlockquote)
;
sSubText = sResult.substring(0, iLen);
iSpacePos = sSubText.lastIndexOf(' ');
iNewLinePos = sSubText.lastIndexOf('\n');
sText = '\n' + sQuoteChar + trim(sText).replace(/\n/gm, '\n' + sQuoteChar) + '\n>\n';
if (-1 !== iNewLinePos)
{
iSpacePos = iNewLinePos;
}
return sText.replace(/\n([> ]+)/gm, function () {
return (arguments && 1 < arguments.length) ? '\n' + trim(arguments[1].replace(/[\s]/, '')) + ' ' : '';
});
if (-1 === iSpacePos)
{
iSpacePos = iLen;
}
sPrefix += sSubText.substring(0, iSpacePos) + '\n';
sResult = sResult.substring(iSpacePos + 1);
}
return '';
return sPrefix + sResult;
},
convertBlockquote = function (sText) {
sText = splitPlainText($.trim(sText));
sText = '> ' + sText.replace(/\n/gm, '\n> ');
return sText.replace(/(^|\n)([> ]+)/gm, function () {
return (arguments && 2 < arguments.length) ? arguments[1] + $.trim(arguments[2].replace(/[\s]/, '')) + ' ' : '';
});
},
convertDivs = function () {
if (arguments && 1 < arguments.length)
{
var sText = trim(arguments[1]);
var sText = $.trim(arguments[1]);
if (0 < sText.length)
{
sText = sText.replace(/<div[^>]*>([\s\S\r\n]*)<\/div>/gmi, convertDivs);
sText = '\n' + trim(sText) + '\n';
sText = '\n' + $.trim(sText) + '\n';
}
return sText;
}
return '';
},
@ -57,7 +84,7 @@
},
convertLinks = function () {
return (arguments && 1 < arguments.length) ? trim(arguments[1]) : '';
return (arguments && 1 < arguments.length) ? $.trim(arguments[1]) : '';
}
;
@ -76,22 +103,63 @@
.replace(/<blockquote[^>]*>/gmi, '\n__bq__start__\n')
.replace(/<\/blockquote>/gmi, '\n__bq__end__\n')
.replace(/<a [^>]*>([\s\S\r\n]*?)<\/a>/gmi, convertLinks)
.replace(/<\/div>/gi, '\n')
.replace(/&nbsp;/gi, ' ')
.replace(/&gt;/gi, '>')
.replace(/&lt;/gi, '<')
.replace(/&quot;/gi, '"')
.replace(/&amp;/gi, '&')
.replace(/<[^>]*>/gm, '')
;
sText = $div.html(sText).text();
sText = sText
.replace(/\n[ \t]+/gm, '\n')
.replace(/[\n]{3,}/gm, '\n\n')
.replace(/__bq__start__([\s\S\r\n]*)__bq__end__/gm, convertBlockquote)
.replace(/&gt;/gi, '>')
.replace(/&lt;/gi, '<')
;
iPos = 0;
iLimit = 100;
while (0 < iLimit)
{
iLimit--;
iP1 = sText.indexOf('__bq__start__', iPos);
if (-1 < iP1)
{
iP2 = sText.indexOf('__bq__start__', iP1 + 5);
iP3 = sText.indexOf('__bq__end__', iP1 + 5);
if ((-1 === iP2 || iP3 < iP2) && iP1 < iP3)
{
sText = sText.substring(0, iP1) +
convertBlockquote(sText.substring(iP1 + 13, iP3)) +
sText.substring(iP3 + 11);
iPos = 0;
}
else if (-1 < iP2 && iP2 < iP3)
{
iPos = iP2 - 1;
}
else
{
iPos = 0;
}
}
else
{
break;
}
}
sText = sText
.replace(/__bq__start__/gm, '')
.replace(/__bq__end__/gm, '')
;
return $div.html(sText).text();
return sText;
},
/**
@ -100,9 +168,77 @@
*/
plainToHtml = function (sPlain)
{
return sPlain.toString()
.replace(/&/g, '&amp;').replace(/>/g, '&gt;').replace(/</g, '&lt;')
.replace(/\r/g, '').replace(/\n/g, '<br />');
sPlain = sPlain.toString().replace(/\r/g, '');
var
bIn = false,
bDo = true,
bStart = true,
aNextText = [],
sLine = '',
iIndex = 0,
aText = sPlain.split("\n")
;
do
{
bDo = false;
aNextText = [];
for (iIndex = 0; iIndex < aText.length; iIndex++)
{
sLine = aText[iIndex];
bStart = '>' === sLine.substr(0, 1);
if (bStart && !bIn)
{
bDo = true;
bIn = true;
aNextText.push('~~~blockquote~~~');
aNextText.push(sLine.substr(1));
}
else if (!bStart && bIn)
{
bIn = false;
aNextText.push('~~~/blockquote~~~');
aNextText.push(sLine);
}
else if (bStart && bIn)
{
aNextText.push(sLine.substr(1));
}
else
{
aNextText.push(sLine);
}
}
if (bIn)
{
bIn = false;
aNextText.push('~~~/blockquote~~~');
}
aText = aNextText;
}
while (bDo);
sPlain = aText.join("\n");
sPlain = sPlain
.replace(/&/g, '&amp;')
.replace(/>/g, '&gt;').replace(/</g, '&lt;')
.replace(/~~~blockquote~~~[\s]*/g, '<blockquote>')
.replace(/[\s]*~~~\/blockquote~~~/g, '</blockquote>')
.replace(/[\-_~]{10,}/g, '<hr />')
.replace(/\n/g, '<br />');
if ($.fn && $.fn.linkify)
{
sPlain = $div.html(sPlain)
.linkify().find('.linkified').removeClass('linkified').end()
.html();
}
return sPlain;
}
;
@ -226,7 +362,7 @@ CKEDITOR.plugins.plain = {
if (editor.mode === 'wysiwyg') {
editor.fire('saveSnapshot');
}
editor.getCommand('plain').setState(CKEDITOR.TRISTATE_DISABLED);
editor.setMode(editor.mode === 'plain' ? 'wysiwyg' : 'plain');
},

View file

@ -637,7 +637,7 @@
border-radius: 8px;
}
/*! normalize.css 2012-03-11T12:53 UTC - http://github.com/necolas/normalize.css */
/* =============================================================================
@ -1142,7 +1142,7 @@ table {
border-collapse: collapse;
border-spacing: 0;
}
@charset "UTF-8";
@font-face {
@ -1513,7 +1513,7 @@ table {
.icon-resize-out:before {
content: "\e06d";
}
/** initial setup **/
.nano {
/*
@ -1630,7 +1630,7 @@ table {
.nano > .pane2:hover > .slider2, .nano > .pane2.active > .slider2 {
background-color: rgba(0, 0, 0, 0.4);
}
/* Magnific Popup CSS */
.mfp-bg {
top: 0;
@ -1995,7 +1995,7 @@ img.mfp-img {
right: 0;
padding-top: 0; }
/* overlay at start */
.mfp-fade.mfp-bg {
@ -2041,7 +2041,7 @@ img.mfp-img {
-moz-transform: translateX(50px);
transform: translateX(50px);
}
.simple-pace {
-webkit-pointer-events: none;
pointer-events: none;
@ -2112,7 +2112,7 @@ img.mfp-img {
@keyframes simple-pace-stripe-animation {
0% { transform: none; transform: none; }
100% { transform: translate(-32px, 0); transform: translate(-32px, 0); }
}
}
.inputosaurus-container {
background-color:#fff;
border:1px solid #bcbec0;
@ -2180,7 +2180,7 @@ img.mfp-img {
box-shadow:none;
}
.inputosaurus-input-hidden { display:none; }
.flag-wrapper {
width: 24px;
height: 16px;
@ -2226,7 +2226,7 @@ img.mfp-img {
.flag.flag-pt-br {background-position: -192px -11px}
.flag.flag-cn, .flag.flag-zh-tw, .flag.flag-zh-cn, .flag.flag-zh-hk {background-position: -208px -22px}
/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */
.clearfix {
*zoom: 1;
@ -8345,9 +8345,6 @@ html.rl-no-preview-pane .messageView.message-selected {
.messageView .b-content .messageItem .bodyText .b-text-part .rl-bq-switcher.hidden-bq {
display: none;
}
.messageView .b-content .messageItem .bodyText .b-text-part.rtl-text-part {
direction: rtl;
}
.messageView .b-content .messageItem .bodyText .b-text-part.html div[data-x-div-type=body] {
margin: 15px;
}

File diff suppressed because one or more lines are too long

View file

@ -78,7 +78,7 @@ var
NotificationClass = window.Notification && window.Notification.requestPermission ? window.Notification : null
;
/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */
/*jshint onevar: false*/
@ -87,7 +87,7 @@ var
*/
var RL = null;
/*jshint onevar: true*/
/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */
/**
@ -203,7 +203,6 @@ Globals.oHtmlEditorDefaultConfig = {
'allowedContent': true,
'autoParagraph': false,
'fillEmptyBlocks': false,
'enterMode': window.CKEDITOR.ENTER_BR,
'shiftEnterMode': window.CKEDITOR.ENTER_BR,
@ -244,7 +243,7 @@ if (Globals.bAllowPdfPreview && navigator && navigator.mimeTypes)
return oType && 'application/pdf' === oType.type;
});
}
/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */
Consts.Defaults = {};
@ -364,7 +363,7 @@ Consts.DataImages.UserDotPic = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA
* @type {string}
*/
Consts.DataImages.TranspPic = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQIW2NkAAIAAAoAAggA9GkAAAAASUVORK5CYII=';
/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */
/**
@ -795,7 +794,7 @@ Enums.Notification = {
'UnknownNotification': 999,
'UnknownError': 999
};
/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */
Utils.trim = $.trim;
@ -2258,6 +2257,7 @@ Utils.settingsSaveHelperSimpleFunction = function (koTrigger, oContext)
return Utils.settingsSaveHelperFunction(null, koTrigger, oContext, 1000);
};
Utils.$div = $('<div></div>');
/**
* @param {string} sHtml
@ -2266,24 +2266,54 @@ Utils.settingsSaveHelperSimpleFunction = function (koTrigger, oContext)
Utils.htmlToPlain = function (sHtml)
{
var
iPos = 0,
iP1 = 0,
iP2 = 0,
iP3 = 0,
iLimit = 0,
sText = '',
sQuoteChar = '> ',
convertBlockquote = function () {
if (arguments && 1 < arguments.length)
splitPlainText = function (sText)
{
var
iLen = 100,
sPrefix = '',
sSubText = '',
sResult = sText,
iSpacePos = 0,
iNewLinePos = 0
;
while (sResult.length > iLen)
{
var sText = $.trim(arguments[1])
.replace(/__bq__start__(.|[\s\S\n\r]*)__bq__end__/gm, convertBlockquote)
;
sSubText = sResult.substring(0, iLen);
iSpacePos = sSubText.lastIndexOf(' ');
iNewLinePos = sSubText.lastIndexOf('\n');
sText = '\n' + sQuoteChar + $.trim(sText).replace(/\n/gm, '\n' + sQuoteChar) + '\n>\n';
if (-1 !== iNewLinePos)
{
iSpacePos = iNewLinePos;
}
return sText.replace(/\n([> ]+)/gm, function () {
return (arguments && 1 < arguments.length) ? '\n' + $.trim(arguments[1].replace(/[\s]/, '')) + ' ' : '';
});
if (-1 === iSpacePos)
{
iSpacePos = iLen;
}
sPrefix += sSubText.substring(0, iSpacePos) + '\n';
sResult = sResult.substring(iSpacePos + 1);
}
return '';
return sPrefix + sResult;
},
convertBlockquote = function (sText) {
sText = splitPlainText($.trim(sText));
sText = '> ' + sText.replace(/\n/gm, '\n> ');
return sText.replace(/(^|\n)([> ]+)/gm, function () {
return (arguments && 2 < arguments.length) ? arguments[1] + $.trim(arguments[2].replace(/[\s]/, '')) + ' ' : '';
});
},
convertDivs = function () {
@ -2292,40 +2322,23 @@ Utils.htmlToPlain = function (sHtml)
var sText = $.trim(arguments[1]);
if (0 < sText.length)
{
sText = sText.replace(/<div[^>]*>(.|[\s\S\r\n]*)<\/div>/gmi, convertDivs);
sText = sText.replace(/<div[^>]*>([\s\S\r\n]*)<\/div>/gmi, convertDivs);
sText = '\n' + $.trim(sText) + '\n';
}
return sText;
}
return '';
},
fixAttibuteValue = function () {
if (arguments && 1 < arguments.length)
{
return '' + arguments[1] + arguments[2].replace(/</g, '&lt;').replace(/>/g, '&gt;');
}
return '';
return (arguments && 1 < arguments.length) ?
'' + arguments[1] + arguments[2].replace(/</g, '&lt;').replace(/>/g, '&gt;') : '';
},
convertLinks = function () {
if (arguments && 1 < arguments.length)
{
var
sName = $.trim(arguments[1])
// sHref = $.trim(arguments[0].replace(/<a [\s\S]*href[ ]?=[ ]?["']?([^"']+).+<\/a>/gmi, '$1'))
;
return sName;
// sName = (0 === trim(sName).length) ? '' : sName;
// sHref = ('mailto:' === sHref.substr(0, 7)) ? '' : sHref;
// sHref = ('http' === sHref.substr(0, 4)) ? sHref : '';
// sHref = (sName === sHref) ? '' : sHref;
// sHref = (0 < sHref.length) ? ' (' + sHref + ') ' : '';
// return (0 < sName.length) ? sName + sHref : sName;
}
return '';
return (arguments && 1 < arguments.length) ? $.trim(arguments[1]) : '';
}
;
@ -2340,25 +2353,67 @@ Utils.htmlToPlain = function (sHtml)
.replace(/<\/tr>/gi, '\n')
.replace(/<hr[^>]*>/gmi, '\n_______________________________\n\n')
.replace(/<img [^>]*>/gmi, '')
.replace(/<div[^>]*>(.|[\s\S\r\n]*)<\/div>/gmi, convertDivs)
.replace(/<div[^>]*>([\s\S\r\n]*)<\/div>/gmi, convertDivs)
.replace(/<blockquote[^>]*>/gmi, '\n__bq__start__\n')
.replace(/<\/blockquote>/gmi, '\n__bq__end__\n')
.replace(/<a [^>]*>(.|[\s\S\r\n]*)<\/a>/gmi, convertLinks)
.replace(/<a [^>]*>([\s\S\r\n]*?)<\/a>/gmi, convertLinks)
.replace(/<\/div>/gi, '\n')
.replace(/&nbsp;/gi, ' ')
.replace(/<[^>]*>/gm, '')
.replace(/&gt;/gi, '>')
.replace(/&lt;/gi, '<')
.replace(/&quot;/gi, '"')
.replace(/&amp;/gi, '&')
.replace(/&\w{2,6};/gi, '')
.replace(/<[^>]*>/gm, '')
;
return sText
sText = Utils.$div.html(sText).text();
sText = sText
.replace(/\n[ \t]+/gm, '\n')
.replace(/[\n]{3,}/gm, '\n\n')
.replace(/__bq__start__(.|[\s\S\r\n]*)__bq__end__/gm, convertBlockquote)
.replace(/&gt;/gi, '>')
.replace(/&lt;/gi, '<')
;
iPos = 0;
iLimit = 100;
while (0 < iLimit)
{
iLimit--;
iP1 = sText.indexOf('__bq__start__', iPos);
if (-1 < iP1)
{
iP2 = sText.indexOf('__bq__start__', iP1 + 5);
iP3 = sText.indexOf('__bq__end__', iP1 + 5);
if ((-1 === iP2 || iP3 < iP2) && iP1 < iP3)
{
sText = sText.substring(0, iP1) +
convertBlockquote(sText.substring(iP1 + 13, iP3)) +
sText.substring(iP3 + 11);
iPos = 0;
}
else if (-1 < iP2 && iP2 < iP3)
{
iPos = iP2 - 1;
}
else
{
iPos = 0;
}
}
else
{
break;
}
}
sText = sText
.replace(/__bq__start__/gm, '')
.replace(/__bq__end__/gm, '')
;
return sText;
};
/**
@ -2367,9 +2422,77 @@ Utils.htmlToPlain = function (sHtml)
*/
Utils.plainToHtml = function (sPlain)
{
return sPlain.toString()
.replace(/&/g, '&amp;').replace(/>/g, '&gt;').replace(/</g, '&lt;')
.replace(/\r/g, '').replace(/\n/g, '<br />');
sPlain = sPlain.toString().replace(/\r/g, '');
var
bIn = false,
bDo = true,
bStart = true,
aNextText = [],
sLine = '',
iIndex = 0,
aText = sPlain.split("\n")
;
do
{
bDo = false;
aNextText = [];
for (iIndex = 0; iIndex < aText.length; iIndex++)
{
sLine = aText[iIndex];
bStart = '>' === sLine.substr(0, 1);
if (bStart && !bIn)
{
bDo = true;
bIn = true;
aNextText.push('~~~blockquote~~~');
aNextText.push(sLine.substr(1));
}
else if (!bStart && bIn)
{
bIn = false;
aNextText.push('~~~/blockquote~~~');
aNextText.push(sLine);
}
else if (bStart && bIn)
{
aNextText.push(sLine.substr(1));
}
else
{
aNextText.push(sLine);
}
}
if (bIn)
{
bIn = false;
aNextText.push('~~~/blockquote~~~');
}
aText = aNextText;
}
while (bDo);
sPlain = aText.join("\n");
sPlain = sPlain
.replace(/&/g, '&amp;')
.replace(/>/g, '&gt;').replace(/</g, '&lt;')
.replace(/~~~blockquote~~~[\s]*/g, '<blockquote>')
.replace(/[\s]*~~~\/blockquote~~~/g, '</blockquote>')
.replace(/[\-_~]{10,}/g, '<hr />')
.replace(/\n/g, '<br />');
if ($.fn && $.fn.linkify)
{
sPlain = Utils.$div.html(sPlain)
.linkify().find('.linkified').removeClass('linkified').end()
.html();
}
return sPlain;
};
Utils.resizeAndCrop = function (sUrl, iValue, fCallback)
@ -2578,7 +2701,7 @@ Utils.detectDropdownVisibility = _.debounce(function () {
return oItem.hasClass('open');
}));
}, 50);
/*jslint bitwise: true*/
// Base64 encode / decode
// http://www.webtoolkit.info/
@ -2742,7 +2865,7 @@ Base64 = {
}
};
/*jslint bitwise: false*/
/*jslint bitwise: false*/
/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */
ko.bindingHandlers.tooltip = {
@ -3585,7 +3708,7 @@ ko.observable.fn.validateFunc = function (fFunc)
return this;
};
/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */
/**
@ -3891,7 +4014,7 @@ LinkBuilder.prototype.socialFacebook = function ()
{
return this.sServer + 'SocialFacebook' + ('' !== this.sSpecSuffix ? '/' + this.sSpecSuffix + '/' : '');
};
/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */
/**
@ -3987,7 +4110,7 @@ Plugins.settingsGet = function (sPluginSection, sName)
};
/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */
/**
@ -4063,7 +4186,7 @@ CookieDriver.prototype.get = function (sKey)
return mResult;
};
/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */
/**
@ -4136,7 +4259,7 @@ LocalStorageDriver.prototype.get = function (sKey)
return mResult;
};
/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */
/**
@ -4181,7 +4304,7 @@ LocalStorage.prototype.get = function (iKey)
{
return this.oDriver ? this.oDriver.get('p' + iKey) : null;
};
/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */
/**
@ -4196,7 +4319,7 @@ KnoinAbstractBoot.prototype.bootstart = function ()
{
};
/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */
/**
@ -4291,7 +4414,7 @@ KnoinAbstractViewModel.prototype.registerPopupKeyDown = function ()
return true;
});
};
/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */
/**
@ -4369,7 +4492,7 @@ KnoinAbstractScreen.prototype.__start = function ()
this.oCross = oRoute;
}
};
/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */
/**
@ -4785,7 +4908,7 @@ Knoin.prototype.bootstart = function ()
};
kn = new Knoin();
/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */
/**
@ -5151,7 +5274,7 @@ EmailModel.prototype.inputoTagLine = function ()
{
return 0 < this.name.length ? this.name + ' (' + this.email + ')' : this.email;
};
/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */
/**
@ -5197,7 +5320,7 @@ ContactTagModel.prototype.toLine = function (bEncodeHtml)
return (Utils.isUnd(bEncodeHtml) ? false : !!bEncodeHtml) ?
Utils.encodeHtml(this.name()) : this.name();
};
/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */
/**
@ -5494,7 +5617,7 @@ PopupsDomainViewModel.prototype.clearForm = function ()
this.smtpAuth(true);
this.whiteList('');
};
/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */
/**
@ -5638,7 +5761,7 @@ PopupsPluginViewModel.prototype.onBuild = function ()
return false;
}, this));
};
/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */
/**
@ -5756,7 +5879,7 @@ PopupsActivateViewModel.prototype.validateSubscriptionKey = function ()
{
var sValue = this.key();
return '' === sValue || !!/^RL[\d]+-[A-Z0-9\-]+Z$/.test(Utils.trim(sValue));
};
};
/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */
/**
@ -5818,7 +5941,7 @@ PopupsLanguagesViewModel.prototype.changeLanguage = function (sLang)
RL.data().mainLanguage(sLang);
this.cancelCommand();
};
/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */
/**
@ -5931,7 +6054,7 @@ PopupsAskViewModel.prototype.onBuild = function ()
}, this));
};
/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */
/**
@ -6020,7 +6143,7 @@ AdminLoginViewModel.prototype.onHide = function ()
{
this.loginFocus(false);
};
/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */
/**
@ -6046,7 +6169,7 @@ AdminMenuViewModel.prototype.link = function (sRoute)
{
return '#/' + sRoute;
};
/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */
/**
@ -6072,7 +6195,7 @@ AdminPaneViewModel.prototype.logoutClick = function ()
RL.remote().adminLogout(function () {
RL.loginAndLogoutReload();
});
};
};
/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */
/**
@ -6200,7 +6323,7 @@ AdminGeneral.prototype.phpInfoLink = function ()
return RL.link().phpInfo();
};
/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */
/**
@ -6247,7 +6370,7 @@ AdminLogin.prototype.onBuild = function ()
}, 50);
};
/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */
/**
@ -6318,7 +6441,7 @@ AdminBranding.prototype.onBuild = function ()
}, 50);
};
/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */
/**
@ -6540,7 +6663,7 @@ AdminContacts.prototype.onBuild = function ()
}, 50);
};
/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */
/**
@ -6631,7 +6754,7 @@ AdminDomains.prototype.onDomainListChangeRequest = function ()
{
RL.reloadDomainList();
};
/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */
/**
@ -6746,7 +6869,7 @@ AdminSecurity.prototype.phpInfoLink = function ()
{
return RL.link().phpInfo();
};
/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */
/**
@ -6874,7 +6997,7 @@ AdminSocial.prototype.onBuild = function ()
}, 50);
};
/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */
/**
@ -6973,7 +7096,7 @@ AdminPlugins.prototype.onPluginDisableRequest = function (sResult, oData)
RL.reloadPluginList();
};
/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */
/**
@ -7073,7 +7196,7 @@ AdminPackages.prototype.installPackage = function (oPackage)
RL.remote().packageInstall(this.requestHelper(oPackage, true), oPackage);
}
};
/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */
/**
@ -7130,7 +7253,7 @@ AdminLicensing.prototype.licenseExpiredMomentValue = function ()
;
return iTime && 1898625600 === iTime ? 'Never' : (oDate.format('LL') + ' (' + oDate.from(moment()) + ')');
};
};
/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */
/**
@ -7207,7 +7330,7 @@ AdminAbout.prototype.updateCoreData = function ()
RL.updateCoreData();
}
};
/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */
/**
@ -7340,7 +7463,7 @@ AbstractData.prototype.populateDataOnStart = function()
this.contactsIsAllowed(!!RL.settingsGet('ContactsIsAllowed'));
};
/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */
/**
@ -7393,7 +7516,7 @@ _.extend(AdminDataStorage.prototype, AbstractData.prototype);
AdminDataStorage.prototype.populateDataOnStart = function()
{
AbstractData.prototype.populateDataOnStart.call(this);
};
};
/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */
/**
@ -7669,7 +7792,7 @@ AbstractAjaxRemoteStorage.prototype.jsVersion = function (fCallback, sVersion)
'Version': sVersion
});
};
/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */
/**
@ -7932,7 +8055,7 @@ AdminAjaxRemoteStorage.prototype.adminPing = function (fCallback)
{
this.defaultRequest(fCallback, 'AdminPing');
};
/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */
/**
@ -7993,7 +8116,7 @@ AbstractCacheStorage.prototype.setServicesData = function (oData)
{
this.oServices = oData;
};
/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */
/**
@ -8006,7 +8129,7 @@ function AdminCacheStorage()
}
_.extend(AdminCacheStorage.prototype, AbstractCacheStorage.prototype);
/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */
/**
@ -8188,7 +8311,7 @@ AbstractSettings.prototype.routes = function ()
['', oRules]
];
};
/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */
/**
@ -8205,7 +8328,7 @@ _.extend(AdminLoginScreen.prototype, KnoinAbstractScreen.prototype);
AdminLoginScreen.prototype.onShow = function ()
{
RL.setTitle('');
};
};
/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */
/**
@ -8225,7 +8348,7 @@ _.extend(AdminSettingsScreen.prototype, AbstractSettings.prototype);
AdminSettingsScreen.prototype.onShow = function ()
{
RL.setTitle('');
};
};
/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */
/**
@ -8585,7 +8708,7 @@ AbstractApp.prototype.bootstart = function ()
ssm.ready();
};
/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */
/**
@ -8888,7 +9011,7 @@ AdminApp.prototype.bootstart = function ()
* @type {AdminApp}
*/
RL = new AdminApp();
/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */
$html.addClass(Globals.bMobileDevice ? 'mobile' : 'no-mobile');
@ -8941,7 +9064,7 @@ window['__RLBOOT'] = function (fCall) {
window['__RLBOOT'] = null;
});
};
if (window.SimplePace) {
window.SimplePace.add(10);
}

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,88 @@
/*
* Linkify - v1.1.6
* Find URLs in plain text and return HTML for discovered links.
* https://github.com/HitSend/jQuery-linkify/
*
* Made by SoapBox Innovations, Inc.
* Under MIT License
*/
!function($, window, document) {
"use strict";
function Linkified(element, options) {
this._defaults = defaults, this.element = element, this.setOptions(options), this.init();
}
var defaults = {
tagName: "a",
newLine: "\n",
target: "_blank",
linkClass: null,
linkClasses: [],
linkAttributes: null
};
Linkified.prototype = {
constructor: Linkified,
init: function() {
1 === this.element.nodeType ? Linkified.linkifyNode.call(this, this.element) : this.element = Linkified.linkify.call(this, this.element.toString());
},
setOptions: function(options) {
this.settings = Linkified.extendSettings(options, this.settings);
},
toString: function() {
return this.element.toString();
}
}, Linkified.extendSettings = function(options, settings) {
var prop;
settings = settings || {};
for (prop in defaults) settings[prop] || (settings[prop] = defaults[prop]);
for (prop in options) settings[prop] = options[prop];
return settings;
}, Linkified.linkMatch = new RegExp([ "(", '\\s|[^a-zA-Z0-9.\\+_\\/"\\>\\-]|^', ")(?:", "(", "[a-zA-Z0-9\\+_\\-]+", "(?:", "\\.[a-zA-Z0-9\\+_\\-]+", ")*@", ")?(", "http:\\/\\/|https:\\/\\/|ftp:\\/\\/", ")?(", "(?:(?:[a-zA-Z0-9][a-zA-Z0-9_%\\-_+]*\\.)+)", ")(", "(?:com|ca|co|edu|gov|net|org|dev|biz|cat|int|pro|tel|mil|aero|asia|coop|info|jobs|mobi|museum|name|post|travel|local|[a-z]{2})", ")(", "(?::\\d{1,5})", ")?(", "(?:", "[\\/|\\?]", "(?:", "[\\-a-zA-Z0-9_%#*&+=~!?,;:.\\/]*", ")*", ")", "[\\-\\/a-zA-Z0-9_%#*&+=~]", "|", "\\/?", ")?", ")(", '[^a-zA-Z0-9\\+_\\/"\\<\\-]|$', ")" ].join(""), "g"),
Linkified.emailLinkMatch = /(<[a-z]+ href=\")(http:\/\/)([a-zA-Z0-9\+_\-]+(?:\.[a-zA-Z0-9\+_\-]+)*@)/g,
Linkified.linkify = function(text, options) {
var attr, settings, linkClasses, linkReplace = [];
this.constructor === Linkified && this.settings ? (settings = this.settings, options && (settings = Linkified.extendSettings(options, settings))) : settings = Linkified.extendSettings(options),
linkClasses = settings.linkClass ? settings.linkClass.split(/\s+/) : [], linkClasses.push.apply(linkClasses, settings.linkClasses),
text = text.replace(/</g, "&lt;").replace(/(\s)/g, "$1$1"), linkReplace.push("$1<" + settings.tagName, 'href="http://$2$4$5$6$7"'),
linkReplace.push('class="linkified' + (linkClasses.length > 0 ? " " + linkClasses.join(" ") : "") + '"'),
settings.target && linkReplace.push('target="' + settings.target + '"');
for (attr in settings.linkAttributes) linkReplace.push([ attr, '="', settings.linkAttributes[attr].replace(/\"/g, "&quot;").replace(/\$/g, "&#36;"), '"' ].join(""));
return linkReplace.push(">$2$3$4$5$6$7</" + settings.tagName + ">$8"), text = text.replace(Linkified.linkMatch, linkReplace.join(" ")),
text = text.replace(Linkified.emailLinkMatch, "$1mailto:$3"), text = text.replace(/(\s){2}/g, "$1"),
text = text.replace(/\n/g, settings.newLine);
}, Linkified.linkifyNode = function(node) {
var children, childNode, childCount, dummyElement, i;
if (node && "object" == typeof node && 1 === node.nodeType && "a" !== node.tagName.toLowerCase() && !/[^\s]linkified[\s$]/.test(node.className)) {
for (children = [], dummyElement = Linkified._dummyElement || document.createElement("div"),
childNode = node.firstChild, childCount = node.childElementCount; childNode; ) {
if (3 === childNode.nodeType) {
for (;dummyElement.firstChild; ) dummyElement.removeChild(dummyElement.firstChild);
for (dummyElement.innerHTML = Linkified.linkify.call(this, childNode.textContent || childNode.innerText || childNode.nodeValue),
children.push.apply(children, dummyElement.childNodes); dummyElement.firstChild; ) dummyElement.removeChild(dummyElement.firstChild);
} else 1 === childNode.nodeType ? children.push(Linkified.linkifyNode(childNode)) : children.push(childNode);
childNode = childNode.nextSibling;
}
for (;node.firstChild; ) node.removeChild(node.firstChild);
for (i = 0; i < children.length; i++) node.appendChild(children[i]);
}
return node;
}, Linkified._dummyElement = document.createElement("div"), $.fn.linkify = function(options) {
return this.each(function() {
var linkified;
(linkified = $.data(this, "plugin-linkify")) ? (linkified.setOptions(options), linkified.init()) : $.data(this, "plugin-linkify", new Linkified(this, options));
});
}, $.fn.linkify.Constructor = Linkified, $(window).on("load", function() {
$("[data-linkify]").each(function() {
var $target, $this = $(this), target = $this.attr("data-linkify"), options = {
tagName: $this.attr("data-linkify-tagname"),
newLine: $this.attr("data-linkify-newline"),
target: $this.attr("data-linkify-target"),
linkClass: $this.attr("data-linkify-linkclass")
};
for (var option in options) "undefined" == typeof options[option] && delete options[option];
$target = "this" === target ? $this : $this.find(target), $target.linkify(options);
});
}), $("body").on("click", ".linkified", function() {
var $link = $(this), url = $link.attr("href"), isEmail = /^mailto:/i.test(url), target = $link.attr("target");
return isEmail ? window.location.href = url : window.open(url, target), !1;
});
}(jQuery, window, document);

View file

@ -0,0 +1,9 @@
/*
* Linkify - v1.1.6
* Find URLs in plain text and return HTML for discovered links.
* https://github.com/HitSend/jQuery-linkify/
*
* Made by SoapBox Innovations, Inc.
* Under MIT License
*/
!function(a,b,c){"use strict";function d(a,b){this._defaults=e,this.element=a,this.setOptions(b),this.init()}var e={tagName:"a",newLine:"\n",target:"_blank",linkClass:null,linkClasses:[],linkAttributes:null};d.prototype={constructor:d,init:function(){1===this.element.nodeType?d.linkifyNode.call(this,this.element):this.element=d.linkify.call(this,this.element.toString())},setOptions:function(a){this.settings=d.extendSettings(a,this.settings)},toString:function(){return this.element.toString()}},d.extendSettings=function(a,b){var c;b=b||{};for(c in e)b[c]||(b[c]=e[c]);for(c in a)b[c]=a[c];return b},d.linkMatch=new RegExp(["(",'\\s|[^a-zA-Z0-9.\\+_\\/"\\>\\-]|^',")(?:","(","[a-zA-Z0-9\\+_\\-]+","(?:","\\.[a-zA-Z0-9\\+_\\-]+",")*@",")?(","http:\\/\\/|https:\\/\\/|ftp:\\/\\/",")?(","(?:(?:[a-zA-Z0-9][a-zA-Z0-9_%\\-_+]*\\.)+)",")(","(?:com|ca|co|edu|gov|net|org|dev|biz|cat|int|pro|tel|mil|aero|asia|coop|info|jobs|mobi|museum|name|post|travel|local|[a-z]{2})",")(","(?::\\d{1,5})",")?(","(?:","[\\/|\\?]","(?:","[\\-a-zA-Z0-9_%#*&+=~!?,;:.\\/]*",")*",")","[\\-\\/a-zA-Z0-9_%#*&+=~]","|","\\/?",")?",")(",'[^a-zA-Z0-9\\+_\\/"\\<\\-]|$',")"].join(""),"g"),d.emailLinkMatch=/(<[a-z]+ href=\")(http:\/\/)([a-zA-Z0-9\+_\-]+(?:\.[a-zA-Z0-9\+_\-]+)*@)/g,d.linkify=function(a,b){var c,e,f,g=[];this.constructor===d&&this.settings?(e=this.settings,b&&(e=d.extendSettings(b,e))):e=d.extendSettings(b),f=e.linkClass?e.linkClass.split(/\s+/):[],f.push.apply(f,e.linkClasses),a=a.replace(/</g,"&lt;").replace(/(\s)/g,"$1$1"),g.push("$1<"+e.tagName,'href="http://$2$4$5$6$7"'),g.push('class="linkified'+(f.length>0?" "+f.join(" "):"")+'"'),e.target&&g.push('target="'+e.target+'"');for(c in e.linkAttributes)g.push([c,'="',e.linkAttributes[c].replace(/\"/g,"&quot;").replace(/\$/g,"&#36;"),'"'].join(""));return g.push(">$2$3$4$5$6$7</"+e.tagName+">$8"),a=a.replace(d.linkMatch,g.join(" ")),a=a.replace(d.emailLinkMatch,"$1mailto:$3"),a=a.replace(/(\s){2}/g,"$1"),a=a.replace(/\n/g,e.newLine)},d.linkifyNode=function(a){var b,e,f,g,h;if(a&&"object"==typeof a&&1===a.nodeType&&"a"!==a.tagName.toLowerCase()&&!/[^\s]linkified[\s$]/.test(a.className)){for(b=[],g=d._dummyElement||c.createElement("div"),e=a.firstChild,f=a.childElementCount;e;){if(3===e.nodeType){for(;g.firstChild;)g.removeChild(g.firstChild);for(g.innerHTML=d.linkify.call(this,e.textContent||e.innerText||e.nodeValue),b.push.apply(b,g.childNodes);g.firstChild;)g.removeChild(g.firstChild)}else 1===e.nodeType?b.push(d.linkifyNode(e)):b.push(e);e=e.nextSibling}for(;a.firstChild;)a.removeChild(a.firstChild);for(h=0;h<b.length;h++)a.appendChild(b[h])}return a},d._dummyElement=c.createElement("div"),a.fn.linkify=function(b){return this.each(function(){var c;(c=a.data(this,"plugin-linkify"))?(c.setOptions(b),c.init()):a.data(this,"plugin-linkify",new d(this,b))})},a.fn.linkify.Constructor=d,a(b).on("load",function(){a("[data-linkify]").each(function(){var b,c=a(this),d=c.attr("data-linkify"),e={tagName:c.attr("data-linkify-tagname"),newLine:c.attr("data-linkify-newline"),target:c.attr("data-linkify-target"),linkClass:c.attr("data-linkify-linkclass")};for(var f in e)"undefined"==typeof e[f]&&delete e[f];b="this"===d?c:c.find(d),b.linkify(e)})}),a("body").on("click",".linkified",function(){var c=a(this),d=c.attr("href"),e=/^mailto:/i.test(d),f=c.attr("target");return e?b.location.href=d:b.open(d,f),!1})}(jQuery,window,document);