diff --git a/src/lang.ts b/src/lang.ts index 1c38802e..49e195b3 100644 --- a/src/lang.ts +++ b/src/lang.ts @@ -403,6 +403,9 @@ const lang = { "HidAccount": "The account was hidden by the user", "TelegramFeatures": "Telegram Features", "SetColor": "Set a color", + "Open": "Open", + "OpenUrlTitle": "Open Link", + "OpenUrlAlert2": "Do you want to open %1$s?", // * macos "AccountSettings.Filters": "Chat Folders", diff --git a/src/lib/appManagers/appImManager.ts b/src/lib/appManagers/appImManager.ts index 56a42acc..3db26806 100644 --- a/src/lib/appManagers/appImManager.ts +++ b/src/lib/appManagers/appImManager.ts @@ -49,6 +49,7 @@ import { hslaStringToHex } from '../../helpers/color'; import { copy, getObjectKeysAndSort } from '../../helpers/object'; import { getFilesFromEvent } from '../../helpers/files'; import PeerTitle from '../../components/peerTitle'; +import PopupPeer from '../../components/popups/peer'; //console.log('appImManager included33!'); @@ -172,6 +173,30 @@ export class AppImManager { sessionStorage.get('chatPositions').then((c) => { sessionStorage.setToCache('chatPositions', c || {}); }); + + (window as any).showMaskedAlert = (element: HTMLAnchorElement, e: Event) => { + cancelEvent(null); + + const href = element.href; + + const a = element.cloneNode(true) as HTMLAnchorElement; + a.innerText = href; + a.removeAttribute('onclick'); + + new PopupPeer('popup-masked-url', { + titleLangKey: 'OpenUrlTitle', + descriptionLangKey: 'OpenUrlAlert2', + descriptionLangArgs: [a], + buttons: [{ + langKey: 'Open', + callback: () => { + a.click(); + }, + }] + }).show(); + + return false; + }; } private onHashChange = () => { diff --git a/src/lib/richtextprocessor.ts b/src/lib/richtextprocessor.ts index 9efa983b..e65f862e 100644 --- a/src/lib/richtextprocessor.ts +++ b/src/lib/richtextprocessor.ts @@ -384,7 +384,8 @@ namespace RichTextProcessor { } }; - for(const entity of entities) { + for(let i = 0, length = entities.length; i < length; ++i) { + const entity = entities[i]; switch(entity._) { case 'messageEntityBold': { if(!options.noTextFormat) { @@ -506,9 +507,18 @@ namespace RichTextProcessor { let inner: string; let url: string; + let masked = false; if(entity._ === 'messageEntityTextUrl') { url = (entity as MessageEntity.messageEntityTextUrl).url; url = wrapUrl(url, true); + + const nextEntity = entities[i + 1]; + if(nextEntity?._ === 'messageEntityUrl' && + nextEntity.length === entity.length && + nextEntity.offset === entity.offset) { + i++; + masked = true; + } } else { url = wrapUrl(entityText, false); //inner = encodeEntities(replaceUrlEncodings(entityText)); @@ -516,7 +526,7 @@ namespace RichTextProcessor { const currentContext = url[0] === '#'; - insertPart(entity, ``, ''); + insertPart(entity, ``, ''); } break;