Add support for links with no scheme in composer
This commit is contained in:
parent
1df48d4dad
commit
e488cf8f44
4 changed files with 216 additions and 46 deletions
|
@ -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)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue