import React, { useContext } from 'react'; import BaseUrlContext from '../contexts/BaseUrl'; // Nabbed from here: // https://github.com/readmeio/api-explorer/blob/0dedafcf71102feedaa4145040d3f57d79d95752/packages/api-explorer/src/lib/markdown/renderer.js#L52 export function getHref(href: string, baseUrl: string) { const [path, hash] = href.split('#'); const hashStr = hash ? `#${hash}` : ''; const base = baseUrl === '/' ? '' : baseUrl; const doc = path.match(/^doc:([-_a-zA-Z0-9#]*)$/); if (doc) { return `${base}/docs/${doc[1]}${hashStr}`; } const ref = path.match(/^ref:([-_a-zA-Z0-9#]*)$/); if (ref) { return `${base}/reference-link/${ref[1]}${hashStr}`; } // we need to perform two matches for changelogs in case // of legacy links that use 'blog' instead of 'changelog' const blog = path.match(/^blog:([-_a-zA-Z0-9#]*)$/); const changelog = path.match(/^changelog:([-_a-zA-Z0-9#]*)$/); const changelogMatch = blog || changelog; if (changelogMatch) { return `${base}/changelog/${changelogMatch[1]}${hashStr}`; } const custompage = path.match(/^page:([-_a-zA-Z0-9#]*)$/); if (custompage) { return `${base}/page/${custompage[1]}${hashStr}`; } return href; } function docLink(href: string) { const doc = href.match(/^doc:([-_a-zA-Z0-9#]*)$/); if (!doc) return false; return { className: 'doc-link', 'data-sidebar': doc[1], }; } interface Props { children: React.ReactNode; download?: string; href?: string; target?: string; title?: string; } function Anchor(props: Props) { const { children, href = '', target = '', title = '', ...attrs } = props; const baseUrl: string = useContext(BaseUrlContext); // Unwrap any nested anchor elements that GFM's autolinker may have created. // This prevents invalid nested tags when the Anchor's text content looks like a URL. const unwrappedChildren = React.Children.map(children, child => { if (React.isValidElement(child) && child.type === 'a') { return child.props.children; } return child; }); return ( // eslint-disable-next-line react/jsx-props-no-spreading {unwrappedChildren} ); } export default Anchor;