Show item page in internal links (#807)
* Include item page in link text * Fix invalid URLs parsed
This commit is contained in:
parent
8238d4d5be
commit
894a73d713
|
@ -186,12 +186,25 @@ export default memo(function Text ({ nofollow, imgproxyUrls, children, tab, item
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
// parse internal links and show as #<itemId>
|
||||||
const url = new URL(href)
|
const url = new URL(href)
|
||||||
const { pathname, searchParams } = url
|
const { pathname, searchParams } = url
|
||||||
const itemId = pathname.match(/items\/(\w+)/)[1]
|
// ignore empty parts which exist due to pathname starting with '/'
|
||||||
// don't format invalid item links
|
const emptyPart = part => !!part
|
||||||
const valid = !/[a-zA-Z_]/.test(itemId)
|
const parts = pathname.split('/').filter(emptyPart)
|
||||||
if (valid && itemId) {
|
if (parts[0] === 'items' && /^[0-9]+$/.test(parts[1])) {
|
||||||
|
const itemId = parts[1]
|
||||||
|
// check for valid item page due to referral links like /items/123456/r/ekzyis
|
||||||
|
const itemPages = ['edit', 'ots', 'related']
|
||||||
|
const itemPage = itemPages.includes(parts[2]) ? parts[2] : null
|
||||||
|
if (itemPage) {
|
||||||
|
// parse https://stacker.news/items/1/related?commentId=2
|
||||||
|
// as #1/related
|
||||||
|
// and not #2
|
||||||
|
// since commentId will be ignored anyway
|
||||||
|
const linkText = `#${itemId}/${itemPage}`
|
||||||
|
return <a target='_blank' href={href} rel='noreferrer'>{linkText}</a>
|
||||||
|
}
|
||||||
const commentId = searchParams.get('commentId')
|
const commentId = searchParams.get('commentId')
|
||||||
const linkText = `#${commentId || itemId}`
|
const linkText = `#${commentId || itemId}`
|
||||||
return <a target='_blank' href={href} rel='noreferrer'>{linkText}</a>
|
return <a target='_blank' href={href} rel='noreferrer'>{linkText}</a>
|
||||||
|
|
Loading…
Reference in New Issue