Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | 309x 309x 309x 58x 58x 58x 58x 7x 7x 7x 6x 7x 7x 58x 52x 58x 309x 6x 6x 6x 10x 3x 7x | /* * Copyright 2021 Harness Inc. All rights reserved. * Use of this source code is governed by the PolyForm Shield 1.0.0 license * that can be found in the licenses directory at the root of this repository, also available at * https://polyformproject.org/wp-content/uploads/2020/06/PolyForm-Shield-1.0.0.txt. */ import React from 'react' import { Text, TextProps } from '@wings-software/uicore' interface BrokenText { type: 'TEXT' | 'URL' content: string } /** * adopted from https://github.com/nteract/ansi-to-react/blob/master/src/index.ts#L104 */ export const breakOnLinks = (content = ''): BrokenText[] => { const LINK_REGEX = /(\s*|^)(https?:\/\/(?:www\.|(?!www))[^\s.]+\.[^\s]{2,}|www\.[^\s]+\.[^\s]{2,})/g const nodes: BrokenText[] = [] let index = 0 let match: RegExpExecArray | null while ((match = LINK_REGEX.exec(content)) !== null) { const [, pre, url] = match const startIndex = match.index + pre.length if (startIndex > index) { nodes.push({ type: 'TEXT', content: content.substring(index, startIndex) }) } nodes.push({ type: 'URL', content: url }) index = LINK_REGEX.lastIndex } if (index < content.length) { nodes.push({ type: 'TEXT', content: content.substring(index) }) } return nodes } export const LinkifyText: React.FC<{ content?: string; textProps?: TextProps; linkStyles?: string }> = props => { const { content, textProps = {}, linkStyles = '' } = props const textItems: BrokenText[] = breakOnLinks(content) return ( <> {textItems.map((textItem, index) => { if (textItem.type === 'URL') { return ( <a key={index} href={textItem.content} target="_blank" rel="noreferrer" className={linkStyles}> {textItem.content} </a> ) } else { return ( <Text key={index} {...textProps} inline> {textItem.content} </Text> ) } })} </> ) } |