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
sText = '',
sQuoteChar = '> ',
iPos = 0,
iP1 = 0,
iP2 = 0,
iP3 = 0,
iLimit = 0,
convertBlockquote = function () {
if (arguments && 1 < arguments.length)
sText = '',
splitPlainText = function (sText)
{
var sText = $.trim(arguments[1])
.replace(/__bq__start__(.|[\s\S\n\r]*)__bq__end__/gm, convertBlockquote)
var
iLen = 100,
sPrefix = '',
sSubText = '',
sResult = sText,
iSpacePos = 0,
iNewLinePos = 0
;
sText = '\n' + sQuoteChar + $.trim(sText).replace(/\n/gm, '\n' + sQuoteChar) + '\n>\n';
while (sResult.length > iLen)
{
sSubText = sResult.substring(0, iLen);
iSpacePos = sSubText.lastIndexOf(' ');
iNewLinePos = sSubText.lastIndexOf('\n');
return sText.replace(/\n([> ]+)/gm, function () {
return (arguments && 1 < arguments.length) ? '\n' + $.trim(arguments[1].replace(/[\s]/, '')) + ' ' : '';
});
if (-1 !== iNewLinePos)
{
iSpacePos = iNewLinePos;
}
return '';
if (-1 === iSpacePos)
{
iSpacePos = iLen;
}
sPrefix += sSubText.substring(0, iSpacePos) + '\n';
sResult = sResult.substring(iSpacePos + 1);
}
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([]);
@ -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

@ -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;

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

@ -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"
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."
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!"
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,35 +12,64 @@
htmlToPlain = function (sHtml)
{
var
sText = '',
sQuoteChar = '> ',
iPos = 0,
iP1 = 0,
iP2 = 0,
iP3 = 0,
iLimit = 0,
convertBlockquote = function () {
if (arguments && 1 < arguments.length)
sText = '',
splitPlainText = function (sText)
{
var
sText = trim(arguments[1])
.replace(/__bq__start__([\s\S\n\r]*)__bq__end__/gm, convertBlockquote)
iLen = 100,
sPrefix = '',
sSubText = '',
sResult = sText,
iSpacePos = 0,
iNewLinePos = 0
;
sText = '\n' + sQuoteChar + trim(sText).replace(/\n/gm, '\n' + sQuoteChar) + '\n>\n';
while (sResult.length > iLen)
{
sSubText = sResult.substring(0, iLen);
iSpacePos = sSubText.lastIndexOf(' ');
iNewLinePos = sSubText.lastIndexOf('\n');
return sText.replace(/\n([> ]+)/gm, function () {
return (arguments && 1 < arguments.length) ? '\n' + trim(arguments[1].replace(/[\s]/, '')) + ' ' : '';
});
if (-1 !== iNewLinePos)
{
iSpacePos = iNewLinePos;
}
return '';
if (-1 === iSpacePos)
{
iSpacePos = iLen;
}
sPrefix += sSubText.substring(0, iSpacePos) + '\n';
sResult = sResult.substring(iSpacePos + 1);
}
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;
@ -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;
}
;

View file

@ -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

@ -203,7 +203,6 @@ Globals.oHtmlEditorDefaultConfig = {
'allowedContent': true,
'autoParagraph': false,
'fillEmptyBlocks': false,
'enterMode': window.CKEDITOR.ENTER_BR,
'shiftEnterMode': window.CKEDITOR.ENTER_BR,
@ -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
sText = '',
sQuoteChar = '> ',
iPos = 0,
iP1 = 0,
iP2 = 0,
iP3 = 0,
iLimit = 0,
convertBlockquote = function () {
if (arguments && 1 < arguments.length)
sText = '',
splitPlainText = function (sText)
{
var sText = $.trim(arguments[1])
.replace(/__bq__start__(.|[\s\S\n\r]*)__bq__end__/gm, convertBlockquote)
var
iLen = 100,
sPrefix = '',
sSubText = '',
sResult = sText,
iSpacePos = 0,
iNewLinePos = 0
;
sText = '\n' + sQuoteChar + $.trim(sText).replace(/\n/gm, '\n' + sQuoteChar) + '\n>\n';
while (sResult.length > iLen)
{
sSubText = sResult.substring(0, iLen);
iSpacePos = sSubText.lastIndexOf(' ');
iNewLinePos = sSubText.lastIndexOf('\n');
return sText.replace(/\n([> ]+)/gm, function () {
return (arguments && 1 < arguments.length) ? '\n' + $.trim(arguments[1].replace(/[\s]/, '')) + ' ' : '';
});
if (-1 !== iNewLinePos)
{
iSpacePos = iNewLinePos;
}
return '';
if (-1 === iSpacePos)
{
iSpacePos = iLen;
}
sPrefix += sSubText.substring(0, iSpacePos) + '\n';
sResult = sResult.substring(iSpacePos + 1);
}
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)

File diff suppressed because one or more lines are too long

View file

@ -206,7 +206,6 @@ Globals.oHtmlEditorDefaultConfig = {
'allowedContent': true,
'autoParagraph': false,
'fillEmptyBlocks': false,
'enterMode': window.CKEDITOR.ENTER_BR,
'shiftEnterMode': window.CKEDITOR.ENTER_BR,
@ -2261,6 +2260,7 @@ Utils.settingsSaveHelperSimpleFunction = function (koTrigger, oContext)
return Utils.settingsSaveHelperFunction(null, koTrigger, oContext, 1000);
};
Utils.$div = $('<div></div>');
/**
* @param {string} sHtml
@ -2269,24 +2269,54 @@ Utils.settingsSaveHelperSimpleFunction = function (koTrigger, oContext)
Utils.htmlToPlain = function (sHtml)
{
var
sText = '',
sQuoteChar = '> ',
iPos = 0,
iP1 = 0,
iP2 = 0,
iP3 = 0,
iLimit = 0,
convertBlockquote = function () {
if (arguments && 1 < arguments.length)
sText = '',
splitPlainText = function (sText)
{
var sText = $.trim(arguments[1])
.replace(/__bq__start__(.|[\s\S\n\r]*)__bq__end__/gm, convertBlockquote)
var
iLen = 100,
sPrefix = '',
sSubText = '',
sResult = sText,
iSpacePos = 0,
iNewLinePos = 0
;
sText = '\n' + sQuoteChar + $.trim(sText).replace(/\n/gm, '\n' + sQuoteChar) + '\n>\n';
while (sResult.length > iLen)
{
sSubText = sResult.substring(0, iLen);
iSpacePos = sSubText.lastIndexOf(' ');
iNewLinePos = sSubText.lastIndexOf('\n');
return sText.replace(/\n([> ]+)/gm, function () {
return (arguments && 1 < arguments.length) ? '\n' + $.trim(arguments[1].replace(/[\s]/, '')) + ' ' : '';
});
if (-1 !== iNewLinePos)
{
iSpacePos = iNewLinePos;
}
return '';
if (-1 === iSpacePos)
{
iSpacePos = iLen;
}
sPrefix += sSubText.substring(0, iSpacePos) + '\n';
sResult = sResult.substring(iSpacePos + 1);
}
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 () {
@ -2295,40 +2325,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]) : '';
}
;
@ -2343,25 +2356,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;
};
/**
@ -2370,9 +2425,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)
@ -6703,7 +6826,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([]);
@ -6881,7 +7003,6 @@ MessageModel.prototype.clear = function ()
this.attachmentsMainType('');
this.body = null;
this.isRtl(false);
this.isHtml(false);
this.hasImages(false);
this.attachments([]);
@ -7474,7 +7595,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([]);
@ -7639,7 +7759,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());
@ -7668,7 +7787,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'));
@ -16849,7 +16967,7 @@ WebMailDataStorage.prototype.setMessage = function (oData, bCached)
oBody = null,
oTextBody = null,
sId = '',
sPlain = '',
sPlainAsHtml = '',
bPgpSigned = false,
bPgpEncrypted = false,
oMessagesBodiesDom = this.messagesBodiesDom(),
@ -16885,17 +17003,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)
@ -16907,7 +17028,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()
@ -16915,7 +17036,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()
@ -16928,7 +17049,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
{
@ -16940,12 +17065,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)
{

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);