import React from 'react' import PropTypes from 'prop-types' import classNames from 'classnames' import highlightCode from 'gatsby-remark-prismjs/highlight-code.js' import rangeParser from 'parse-numeric-range' import { StaticQuery, graphql } from 'gatsby' import { window } from 'browser-monads' import { isString, htmlToReact } from './util' import Link from './link' import GitHubCode from './github' import classes from '../styles/code.module.sass' export default props => (
        
    
) export const Pre = props => { return
{props.children}
} export const InlineCode = ({ wrap, className, children, ...props }) => { const codeClassNames = classNames(classes.inlineCode, className, { [classes.wrap]: wrap || (isString(children) && children.length >= 20), }) return ( {children} ) } InlineCode.defaultProps = { wrap: false, } InlineCode.propTypes = { wrap: PropTypes.bool, className: PropTypes.string, children: PropTypes.node, } export class Code extends React.Component { state = { Juniper: null } static defaultProps = { lang: 'none', executable: null, github: false, } static propTypes = { lang: PropTypes.string, title: PropTypes.string, executable: PropTypes.oneOf(['true', 'false', true, false, null]), github: PropTypes.oneOf(['true', 'false', true, false, null]), prompt: PropTypes.string, highlight: PropTypes.string, className: PropTypes.string, children: PropTypes.node, } updateJuniper() { if (this.state.Juniper == null && window.Juniper !== null) { this.setState({ Juniper: window.Juniper }) } } componentDidMount() { this.updateJuniper() } componentDidUpdate() { this.updateJuniper() } render() { const { lang, title, executable, github, prompt, wrap, highlight, className, children, } = this.props const codeClassNames = classNames(classes.code, className, `language-${lang}`, { [classes.wrap]: !!highlight || !!wrap, }) const ghClassNames = classNames(codeClassNames, classes.maxHeight) const { Juniper } = this.state if (github) { return } if (!!executable && Juniper) { return ( {children} ) } const codeText = Array.isArray(children) ? children.join('') : children || '' const highlightRange = highlight ? rangeParser.parse(highlight).filter(n => n > 0) : [] const html = lang === 'none' ? codeText : highlightCode(lang, codeText, highlightRange) return ( <> {title &&

{title}

} {htmlToReact(html)} ) } } const JuniperWrapper = ({ Juniper, title, lang, children }) => ( { const { binderUrl, binderBranch, binderVersion } = data.site.siteMetadata const juniperTitle = title || 'Editable Code' return (

{juniperTitle} spaCy v{binderVersion} · Python 3 · via{' '} Binder

{children}
) }} /> ) const query = graphql` query JuniperQuery { site { siteMetadata { binderUrl binderBranch binderVersion } } } `