mirror of
https://github.com/explosion/spaCy.git
synced 2025-01-10 09:16:31 +03:00
70 lines
2.2 KiB
JavaScript
70 lines
2.2 KiB
JavaScript
|
import React, { useState, useEffect } from 'react'
|
||
|
import PropTypes from 'prop-types'
|
||
|
import classNames from 'classnames'
|
||
|
import highlightCode from 'gatsby-remark-prismjs/highlight-code.js'
|
||
|
|
||
|
import Icon from './icon'
|
||
|
import Link from './link'
|
||
|
import classes from '../styles/code.module.sass'
|
||
|
|
||
|
const defaultErrorMsg = `Can't fetch code example from GitHub :(
|
||
|
|
||
|
Please use the link below to view the example. If you've come across
|
||
|
a broken link, we always appreciate a pull request to the repository,
|
||
|
or a report on the issue tracker. Thanks!`
|
||
|
|
||
|
const GitHubCode = ({ url, lang, errorMsg, className }) => {
|
||
|
const [initialized, setInitialized] = useState(false)
|
||
|
const [code, setCode] = useState(errorMsg)
|
||
|
const codeClassNames = classNames(classes.code, classes.maxHeight, className)
|
||
|
|
||
|
const rawUrl = url
|
||
|
.replace('github.com', 'raw.githubusercontent.com')
|
||
|
.replace('/blob', '')
|
||
|
.replace('/tree', '')
|
||
|
|
||
|
useEffect(() => {
|
||
|
if (!initialized) {
|
||
|
setCode(null)
|
||
|
fetch(rawUrl)
|
||
|
.then(res => res.text().then(text => ({ text, ok: res.ok })))
|
||
|
.then(({ text, ok }) => {
|
||
|
setCode(ok ? text : errorMsg)
|
||
|
})
|
||
|
.catch(err => {
|
||
|
setCode(errorMsg)
|
||
|
})
|
||
|
setInitialized(true)
|
||
|
}
|
||
|
}, [])
|
||
|
|
||
|
const highlighted = lang === 'none' || !code ? code : highlightCode(lang, code)
|
||
|
|
||
|
return (
|
||
|
<>
|
||
|
<header className={classes.header}>
|
||
|
<Link to={url} hidden>
|
||
|
<Icon name="github" width={16} inline />
|
||
|
<code className={classNames(classes.inlineCode, classes.inlineCodeDark)}>
|
||
|
{rawUrl.split('.com/')[1]}
|
||
|
</code>
|
||
|
</Link>
|
||
|
</header>
|
||
|
<code className={codeClassNames} dangerouslySetInnerHTML={{ __html: highlighted }} />
|
||
|
</>
|
||
|
)
|
||
|
}
|
||
|
|
||
|
GitHubCode.defaultProps = {
|
||
|
errorMsg: defaultErrorMsg,
|
||
|
}
|
||
|
|
||
|
GitHubCode.propTypes = {
|
||
|
url: PropTypes.string.isRequired,
|
||
|
lang: PropTypes.string,
|
||
|
errorMsg: PropTypes.string,
|
||
|
className: PropTypes.string,
|
||
|
}
|
||
|
|
||
|
export default React.memo(GitHubCode)
|