Add support for links with no scheme in composer

This commit is contained in:
Paul Frazee 2022-11-22 14:30:35 -06:00
parent 1df48d4dad
commit e488cf8f44
4 changed files with 216 additions and 46 deletions

View file

@ -82,13 +82,18 @@ export function extractEntities(
}
{
// links
const re = /(^|\s)(https?:\/\/[\S]+)(\b)/dg
const re =
/(^|\s)((https?:\/\/[\S]+)|([a-z][a-z0-9]*\.[a-z0-9\.]+[\S]*))(\b)/dg
while ((match = re.exec(text))) {
let value = match[2]
if (!value.startsWith('http')) {
value = `https://${value}`
}
ents.push({
type: 'link',
value: match[2],
value,
index: {
start: match.indices[1][0], // skip the (^|\s) but include the '@'
start: match.indices[2][0], // skip the (^|\s)
end: match.indices[2][1],
},
})
@ -97,6 +102,41 @@ export function extractEntities(
return ents.length > 0 ? ents : undefined
}
interface DetectedLink {
link: string
}
type DetectedLinkable = string | DetectedLink
export function detectLinkables(text: string): DetectedLinkable[] {
const re =
/((^|\s)@[a-z0-9\.-]*)|((^|\s)https?:\/\/[\S]+)|((^|\s)[a-z][a-z0-9]*\.[a-z0-9\.]+[\S]*)/gi
const segments = []
let match
let start = 0
while ((match = re.exec(text))) {
let matchIndex = match.index
let matchValue = match[0]
if (/\s/.test(matchValue)) {
// HACK
// skip the starting space
// we have to do this because RN doesnt support negative lookaheads
// -prf
matchIndex++
matchValue = matchValue.slice(1)
}
if (start !== matchIndex) {
segments.push(text.slice(start, matchIndex))
}
segments.push({link: matchValue})
start = matchIndex + matchValue.length
}
if (start < text.length) {
segments.push(text.slice(start))
}
return segments
}
export function makeValidHandle(str: string): string {
if (str.length > 20) {
str = str.slice(0, 20)