UNPKG

@readme/markdown

Version:

ReadMe's React-based Markdown parser

79 lines (72 loc) 2.57 kB
/* eslint-disable react/jsx-props-no-spreading, jsx-a11y/iframe-has-title */ const React = require('react'); const propTypes = require('prop-types'); const Favicon = ({ src, alt = 'favicon', ...attr }) => <img {...attr} alt={alt} height="14" src={src} width="14" />; Favicon.propTypes = { alt: propTypes.string, src: propTypes.string, }; class Embed extends React.Component { render() { const { provider, url, title, html, iframe, image, favicon, ...attrs } = this.props; if ('iframe' in this.props) { return <iframe {...attrs} border="none" src={url} style={{ border: 'none' }} />; } const classes = ['embed', image && 'embed_hasImg']; return ( <div className={classes.join(' ')}> {html ? ( <div className="embed-media" dangerouslySetInnerHTML={{ __html: html }}></div> ) : ( <a className="embed-link" href={url} rel="noopener noreferrer" target="_blank"> {!image || <img alt={title} className="embed-img" loading="lazy" src={image} />} {title ? ( <div className="embed-body"> {!favicon || ( <Favicon alt={provider} className="embed-favicon" loading="lazy" src={favicon} style={{ float: 'left' }} /> )} {provider && ( <small className="embed-provider"> {provider.search(/^@{1}/) < 0 ? ( provider ) : ( <code style={{ fontFamily: 'var(--md-code-font, monospace)' }}>{url}</code> )} </small> )} <div className="embed-title">{title}</div> </div> ) : ( <div className="embed-body"> <b>View</b>: <span className="embed-body-url">{url}</span> </div> )} </a> )} </div> ); } } Embed.propTypes = { children: propTypes.oneOfType([propTypes.string, propTypes.array, propTypes.shape({}), propTypes.element]), favicon: propTypes.string, height: propTypes.string, html: propTypes.string, iframe: propTypes.any, image: propTypes.string, provider: propTypes.string, title: propTypes.string, url: propTypes.oneOfType([propTypes.string, propTypes.shape({})]), width: propTypes.string, }; Embed.defaultProps = { height: '300px', width: '100%', }; module.exports = () => Embed;