Fine-tune linkification technique for link previews

This commit is contained in:
Scott Nonnenberg 2019-02-11 15:10:32 -08:00
parent 021e807180
commit 858c7e629f
3 changed files with 104 additions and 3 deletions

View file

@ -1,5 +1,6 @@
/* global URL */
const { isNumber, compact } = require('lodash');
const he = require('he');
const LinkifyIt = require('linkify-it');
@ -96,9 +97,28 @@ function getImageMetaTag(html) {
return _getMetaTag(html, META_IMAGE);
}
function findLinks(text) {
function findLinks(text, caretLocation) {
const haveCaretLocation = isNumber(caretLocation);
const textLength = text ? text.length : 0;
const matches = linkify.match(text || '') || [];
return matches.map(match => match.text);
return compact(
matches.map(match => {
if (!haveCaretLocation) {
return match.text;
}
if (match.lastIndex === textLength && caretLocation === textLength) {
return match.text;
}
if (match.index > caretLocation || match.lastIndex < caretLocation) {
return match.text;
}
return null;
})
);
}
function getDomain(url) {

View file

@ -1700,6 +1700,7 @@
}
const messageText = this.$messageField.val().trim();
const caretLocation = this.$messageField.get(0).selectionStart;
if (!messageText) {
this.resetLinkPreview();
@ -1709,7 +1710,10 @@
return;
}
const links = window.Signal.LinkPreviews.findLinks(messageText);
const links = window.Signal.LinkPreviews.findLinks(
messageText,
caretLocation
);
const { currentlyMatchedLink } = this;
if (links.includes(currentlyMatchedLink)) {
return;