mirror of
https://github.com/explosion/spaCy.git
synced 2025-08-05 21:00:19 +03:00
Remove static queries
Import JSON meta data directly, to simplify components
This commit is contained in:
parent
90590d92c7
commit
a114c2b15f
|
@ -78,6 +78,7 @@ bit of time.
|
||||||
```yaml
|
```yaml
|
||||||
├── docs # the actual markdown content
|
├── docs # the actual markdown content
|
||||||
├── meta # JSON-formatted site metadata
|
├── meta # JSON-formatted site metadata
|
||||||
|
| ├── dynamicMeta.js # At build time generated meta data
|
||||||
| ├── languages.json # supported languages and statistical models
|
| ├── languages.json # supported languages and statistical models
|
||||||
| ├── sidebars.json # sidebar navigations for different sections
|
| ├── sidebars.json # sidebar navigations for different sections
|
||||||
| ├── site.json # general site metadata
|
| ├── site.json # general site metadata
|
||||||
|
|
|
@ -13,16 +13,11 @@ const codeBlocksPlugin = require('./src/plugins/remark-code-blocks.js')
|
||||||
|
|
||||||
// Import metadata
|
// Import metadata
|
||||||
const site = require('./meta/site.json')
|
const site = require('./meta/site.json')
|
||||||
const sidebars = require('./meta/sidebars.json')
|
const { domain, nightly: isNightly, legacy: isLegacy } = site
|
||||||
const models = require('./meta/languages.json')
|
const { siteUrl } = require('./meta/dynamicMeta')
|
||||||
const universe = require('./meta/universe.json')
|
|
||||||
|
|
||||||
const DEFAULT_TEMPLATE = path.resolve('./src/templates/index.js')
|
const DEFAULT_TEMPLATE = path.resolve('./src/templates/index.js')
|
||||||
|
|
||||||
const domain = process.env.BRANCH || site.domain
|
|
||||||
const siteUrl = `https://${domain}`
|
|
||||||
const isNightly = site.nightlyBranches.includes(domain)
|
|
||||||
const isLegacy = site.legacy || !!+process.env.SPACY_LEGACY
|
|
||||||
const favicon = `src/images/icon${isNightly ? '_nightly' : isLegacy ? '_legacy' : ''}.png`
|
const favicon = `src/images/icon${isNightly ? '_nightly' : isLegacy ? '_legacy' : ''}.png`
|
||||||
const branch = isNightly ? 'develop' : 'master'
|
const branch = isNightly ? 'develop' : 'master'
|
||||||
|
|
||||||
|
@ -34,30 +29,11 @@ const replacements = {
|
||||||
SPACY_PKG_FLAGS: isNightly ? ' --pre' : '',
|
SPACY_PKG_FLAGS: isNightly ? ' --pre' : '',
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Compute the overall total counts of models and languages
|
|
||||||
*/
|
|
||||||
function getCounts(langs = []) {
|
|
||||||
return {
|
|
||||||
langs: langs.length,
|
|
||||||
modelLangs: langs.filter(({ models }) => models && !!models.length).length,
|
|
||||||
models: langs.map(({ models }) => (models ? models.length : 0)).reduce((a, b) => a + b, 0),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
siteMetadata: {
|
siteMetadata: {
|
||||||
...site,
|
...site,
|
||||||
sidebars,
|
|
||||||
...models,
|
|
||||||
counts: getCounts(models.languages),
|
|
||||||
universe,
|
|
||||||
nightly: isNightly,
|
|
||||||
legacy: isLegacy,
|
|
||||||
binderBranch: domain,
|
|
||||||
siteUrl,
|
siteUrl,
|
||||||
},
|
},
|
||||||
|
|
||||||
plugins: [
|
plugins: [
|
||||||
{
|
{
|
||||||
resolve: `gatsby-plugin-sass`,
|
resolve: `gatsby-plugin-sass`,
|
||||||
|
|
|
@ -4,6 +4,9 @@ const { createFilePath } = require('gatsby-source-filesystem')
|
||||||
const DEFAULT_TEMPLATE = path.resolve('./src/templates/index.js')
|
const DEFAULT_TEMPLATE = path.resolve('./src/templates/index.js')
|
||||||
const BASE_PATH = 'docs'
|
const BASE_PATH = 'docs'
|
||||||
const PAGE_EXTENSIONS = ['.md', '.mdx']
|
const PAGE_EXTENSIONS = ['.md', '.mdx']
|
||||||
|
const siteMetadata = require('./meta/site.json')
|
||||||
|
const universe = require('./meta/universe.json')
|
||||||
|
const models = require('./meta/languages.json')
|
||||||
|
|
||||||
function replacePath(pagePath) {
|
function replacePath(pagePath) {
|
||||||
return pagePath === `/` ? pagePath : pagePath.replace(/\/$/, ``)
|
return pagePath === `/` ? pagePath : pagePath.replace(/\/$/, ``)
|
||||||
|
@ -26,37 +29,6 @@ exports.createPages = ({ graphql, actions }) => {
|
||||||
graphql(
|
graphql(
|
||||||
`
|
`
|
||||||
{
|
{
|
||||||
site {
|
|
||||||
siteMetadata {
|
|
||||||
sections {
|
|
||||||
id
|
|
||||||
title
|
|
||||||
theme
|
|
||||||
}
|
|
||||||
languages {
|
|
||||||
code
|
|
||||||
name
|
|
||||||
models
|
|
||||||
example
|
|
||||||
has_examples
|
|
||||||
}
|
|
||||||
universe {
|
|
||||||
resources {
|
|
||||||
id
|
|
||||||
title
|
|
||||||
slogan
|
|
||||||
}
|
|
||||||
categories {
|
|
||||||
label
|
|
||||||
items {
|
|
||||||
id
|
|
||||||
title
|
|
||||||
description
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
allFile(filter: { ext: { in: [".md", ".mdx"] } }) {
|
allFile(filter: { ext: { in: [".md", ".mdx"] } }) {
|
||||||
edges {
|
edges {
|
||||||
node {
|
node {
|
||||||
|
@ -107,8 +79,10 @@ exports.createPages = ({ graphql, actions }) => {
|
||||||
reject(result.errors)
|
reject(result.errors)
|
||||||
}
|
}
|
||||||
|
|
||||||
const sectionData = result.data.site.siteMetadata.sections
|
const sections = Object.assign(
|
||||||
const sections = Object.assign({}, ...sectionData.map((s) => ({ [s.id]: s })))
|
{},
|
||||||
|
...siteMetadata.sections.map((s) => ({ [s.id]: s }))
|
||||||
|
)
|
||||||
|
|
||||||
/* Regular pages */
|
/* Regular pages */
|
||||||
|
|
||||||
|
@ -183,8 +157,8 @@ exports.createPages = ({ graphql, actions }) => {
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
const universe = result.data.site.siteMetadata.universe.resources
|
const universeResources = universe.resources
|
||||||
universe.forEach((page) => {
|
universeResources.forEach((page) => {
|
||||||
const slug = `/universe/project/${page.id}`
|
const slug = `/universe/project/${page.id}`
|
||||||
|
|
||||||
createPage({
|
createPage({
|
||||||
|
@ -202,7 +176,7 @@ exports.createPages = ({ graphql, actions }) => {
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
const universeCategories = result.data.site.siteMetadata.universe.categories
|
const universeCategories = universe.categories
|
||||||
const categories = [].concat.apply(
|
const categories = [].concat.apply(
|
||||||
[],
|
[],
|
||||||
universeCategories.map((cat) => cat.items)
|
universeCategories.map((cat) => cat.items)
|
||||||
|
@ -227,7 +201,7 @@ exports.createPages = ({ graphql, actions }) => {
|
||||||
|
|
||||||
/* Models */
|
/* Models */
|
||||||
|
|
||||||
const langs = result.data.site.siteMetadata.languages
|
const langs = models.languages
|
||||||
const modelLangs = langs.filter(({ models }) => models && models.length)
|
const modelLangs = langs.filter(({ models }) => models && models.length)
|
||||||
modelLangs.forEach(({ code, name, models, example, has_examples }, i) => {
|
modelLangs.forEach(({ code, name, models, example, has_examples }, i) => {
|
||||||
const slug = `/models/${code}`
|
const slug = `/models/${code}`
|
||||||
|
|
11
website/meta/dynamicMeta.js
Normal file
11
website/meta/dynamicMeta.js
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
const site = require('./site.json')
|
||||||
|
|
||||||
|
const domain = process.env.BRANCH || site.domain
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
domain,
|
||||||
|
siteUrl: `https://${domain}`,
|
||||||
|
nightly: site.nightlyBranches.includes(domain),
|
||||||
|
legacy: site.legacy || !!+process.env.SPACY_LEGACY,
|
||||||
|
binderBranch: domain,
|
||||||
|
}
|
|
@ -27,7 +27,6 @@
|
||||||
"indexName": "spacy"
|
"indexName": "spacy"
|
||||||
},
|
},
|
||||||
"binderUrl": "explosion/spacy-io-binder",
|
"binderUrl": "explosion/spacy-io-binder",
|
||||||
"binderBranch": "spacy.io",
|
|
||||||
"binderVersion": "3.4",
|
"binderVersion": "3.4",
|
||||||
"sections": [
|
"sections": [
|
||||||
{ "id": "usage", "title": "Usage Documentation", "theme": "blue" },
|
{ "id": "usage", "title": "Usage Documentation", "theme": "blue" },
|
||||||
|
|
|
@ -4,7 +4,6 @@ import classNames from 'classnames'
|
||||||
import highlightCode from 'gatsby-remark-prismjs/highlight-code.js'
|
import highlightCode from 'gatsby-remark-prismjs/highlight-code.js'
|
||||||
import 'prismjs-bibtex'
|
import 'prismjs-bibtex'
|
||||||
import rangeParser from 'parse-numeric-range'
|
import rangeParser from 'parse-numeric-range'
|
||||||
import { StaticQuery, graphql } from 'gatsby'
|
|
||||||
import { window } from 'browser-monads'
|
import { window } from 'browser-monads'
|
||||||
|
|
||||||
import CUSTOM_TYPES from '../../meta/type-annotations.json'
|
import CUSTOM_TYPES from '../../meta/type-annotations.json'
|
||||||
|
@ -12,6 +11,8 @@ import { isString, htmlToReact } from './util'
|
||||||
import Link, { OptionalLink } from './link'
|
import Link, { OptionalLink } from './link'
|
||||||
import GitHubCode from './github'
|
import GitHubCode from './github'
|
||||||
import classes from '../styles/code.module.sass'
|
import classes from '../styles/code.module.sass'
|
||||||
|
import siteMetadata from '../../meta/site.json'
|
||||||
|
import { binderBranch } from '../../meta/dynamicMeta'
|
||||||
|
|
||||||
const WRAP_THRESHOLD = 30
|
const WRAP_THRESHOLD = 30
|
||||||
const CLI_GROUPS = ['init', 'debug', 'project', 'ray', 'huggingface-hub']
|
const CLI_GROUPS = ['init', 'debug', 'project', 'ray', 'huggingface-hub']
|
||||||
|
@ -270,51 +271,34 @@ export class Code extends React.Component {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const JuniperWrapper = ({ Juniper, title, lang, children }) => (
|
const JuniperWrapper = ({ Juniper, title, lang, children }) => {
|
||||||
<StaticQuery
|
const { binderUrl, binderVersion } = siteMetadata
|
||||||
query={query}
|
const juniperTitle = title || 'Editable Code'
|
||||||
render={(data) => {
|
return (
|
||||||
const { binderUrl, binderBranch, binderVersion } = data.site.siteMetadata
|
<div className={classes.juniperWrapper}>
|
||||||
const juniperTitle = title || 'Editable Code'
|
<h4 className={classes.juniperTitle}>
|
||||||
return (
|
{juniperTitle}
|
||||||
<div className={classes.juniperWrapper}>
|
<span className={classes.juniperMeta}>
|
||||||
<h4 className={classes.juniperTitle}>
|
spaCy v{binderVersion} · Python 3 · via{' '}
|
||||||
{juniperTitle}
|
<Link to="https://mybinder.org/" hidden>
|
||||||
<span className={classes.juniperMeta}>
|
Binder
|
||||||
spaCy v{binderVersion} · Python 3 · via{' '}
|
</Link>
|
||||||
<Link to="https://mybinder.org/" hidden>
|
</span>
|
||||||
Binder
|
</h4>
|
||||||
</Link>
|
|
||||||
</span>
|
|
||||||
</h4>
|
|
||||||
|
|
||||||
<Juniper
|
<Juniper
|
||||||
repo={binderUrl}
|
repo={binderUrl}
|
||||||
branch={binderBranch}
|
branch={binderBranch}
|
||||||
lang={lang}
|
lang={lang}
|
||||||
classNames={{
|
classNames={{
|
||||||
cell: classes.juniperCell,
|
cell: classes.juniperCell,
|
||||||
input: classes.juniperInput,
|
input: classes.juniperInput,
|
||||||
button: classes.juniperButton,
|
button: classes.juniperButton,
|
||||||
output: classes.juniperOutput,
|
output: classes.juniperOutput,
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
{children}
|
{children}
|
||||||
</Juniper>
|
</Juniper>
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
}}
|
}
|
||||||
/>
|
|
||||||
)
|
|
||||||
|
|
||||||
const query = graphql`
|
|
||||||
query JuniperQuery {
|
|
||||||
site {
|
|
||||||
siteMetadata {
|
|
||||||
binderUrl
|
|
||||||
binderBranch
|
|
||||||
binderVersion
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
`
|
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
import React from 'react'
|
import React from 'react'
|
||||||
import PropTypes from 'prop-types'
|
import PropTypes from 'prop-types'
|
||||||
import { StaticQuery, graphql } from 'gatsby'
|
|
||||||
import classNames from 'classnames'
|
import classNames from 'classnames'
|
||||||
|
|
||||||
import Link from './link'
|
import Link from './link'
|
||||||
|
@ -8,89 +7,55 @@ import Grid from './grid'
|
||||||
import Newsletter from './newsletter'
|
import Newsletter from './newsletter'
|
||||||
import ExplosionLogo from '-!svg-react-loader!../images/explosion.svg'
|
import ExplosionLogo from '-!svg-react-loader!../images/explosion.svg'
|
||||||
import classes from '../styles/footer.module.sass'
|
import classes from '../styles/footer.module.sass'
|
||||||
|
import siteMetadata from '../../meta/site.json'
|
||||||
|
|
||||||
export default function Footer({ wide = false }) {
|
export default function Footer({ wide = false }) {
|
||||||
|
const { companyUrl, company, footer, newsletter } = siteMetadata
|
||||||
return (
|
return (
|
||||||
<StaticQuery
|
<footer className={classes.root}>
|
||||||
query={query}
|
<Grid cols={wide ? 4 : 3} narrow className={classes.content}>
|
||||||
render={(data) => {
|
{footer.map(({ label, items }, i) => (
|
||||||
const { companyUrl, company, footer, newsletter } = data.site.siteMetadata
|
<section key={i}>
|
||||||
return (
|
<ul className={classes.column}>
|
||||||
<footer className={classes.root}>
|
<li className={classes.label}>{label}</li>
|
||||||
<Grid cols={wide ? 4 : 3} narrow className={classes.content}>
|
{items.map(({ text, url }, j) => (
|
||||||
{footer.map(({ label, items }, i) => (
|
<li key={j}>
|
||||||
<section key={i}>
|
<Link to={url} hidden>
|
||||||
<ul className={classes.column}>
|
{text}
|
||||||
<li className={classes.label}>{label}</li>
|
</Link>
|
||||||
{items.map(({ text, url }, j) => (
|
</li>
|
||||||
<li key={j}>
|
|
||||||
<Link to={url} hidden>
|
|
||||||
{text}
|
|
||||||
</Link>
|
|
||||||
</li>
|
|
||||||
))}
|
|
||||||
</ul>
|
|
||||||
</section>
|
|
||||||
))}
|
))}
|
||||||
<section className={wide ? null : classes.full}>
|
</ul>
|
||||||
<ul className={classes.column}>
|
</section>
|
||||||
<li className={classes.label}>Stay in the loop!</li>
|
))}
|
||||||
<li>Receive updates about new releases, tutorials and more.</li>
|
<section className={wide ? null : classes.full}>
|
||||||
<li>
|
<ul className={classes.column}>
|
||||||
<Newsletter {...newsletter} />
|
<li className={classes.label}>Stay in the loop!</li>
|
||||||
</li>
|
<li>Receive updates about new releases, tutorials and more.</li>
|
||||||
</ul>
|
<li>
|
||||||
</section>
|
<Newsletter {...newsletter} />
|
||||||
</Grid>
|
</li>
|
||||||
<div className={classNames(classes.content, classes.copy)}>
|
</ul>
|
||||||
<span>
|
</section>
|
||||||
© 2016-{new Date().getFullYear()}{' '}
|
</Grid>
|
||||||
<Link to={companyUrl} hidden>
|
<div className={classNames(classes.content, classes.copy)}>
|
||||||
{company}
|
<span>
|
||||||
</Link>
|
© 2016-{new Date().getFullYear()}{' '}
|
||||||
</span>
|
<Link to={companyUrl} hidden>
|
||||||
<Link
|
{company}
|
||||||
to={companyUrl}
|
</Link>
|
||||||
aria-label={company}
|
</span>
|
||||||
hidden
|
<Link to={companyUrl} aria-label={company} hidden className={classes.logo}>
|
||||||
className={classes.logo}
|
<ExplosionLogo width={45} height={45} />
|
||||||
>
|
</Link>
|
||||||
<ExplosionLogo width={45} height={45} />
|
<Link to={`${companyUrl}/legal`} hidden>
|
||||||
</Link>
|
Legal / Imprint
|
||||||
<Link to={`${companyUrl}/legal`} hidden>
|
</Link>
|
||||||
Legal / Imprint
|
</div>
|
||||||
</Link>
|
</footer>
|
||||||
</div>
|
|
||||||
</footer>
|
|
||||||
)
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
Footer.propTypes = {
|
Footer.propTypes = {
|
||||||
wide: PropTypes.bool,
|
wide: PropTypes.bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
const query = graphql`
|
|
||||||
query FooterQuery {
|
|
||||||
site {
|
|
||||||
siteMetadata {
|
|
||||||
company
|
|
||||||
companyUrl
|
|
||||||
footer {
|
|
||||||
label
|
|
||||||
items {
|
|
||||||
text
|
|
||||||
url
|
|
||||||
}
|
|
||||||
}
|
|
||||||
newsletter {
|
|
||||||
user
|
|
||||||
id
|
|
||||||
list
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
`
|
|
||||||
|
|
|
@ -1,13 +1,14 @@
|
||||||
import React from 'react'
|
import React from 'react'
|
||||||
import PropTypes from 'prop-types'
|
import PropTypes from 'prop-types'
|
||||||
import Helmet from 'react-helmet'
|
import Helmet from 'react-helmet'
|
||||||
import { StaticQuery, graphql } from 'gatsby'
|
|
||||||
|
|
||||||
import socialImageDefault from '../images/social_default.jpg'
|
import socialImageDefault from '../images/social_default.jpg'
|
||||||
import socialImageApi from '../images/social_api.jpg'
|
import socialImageApi from '../images/social_api.jpg'
|
||||||
import socialImageUniverse from '../images/social_universe.jpg'
|
import socialImageUniverse from '../images/social_universe.jpg'
|
||||||
import socialImageNightly from '../images/social_nightly.jpg'
|
import socialImageNightly from '../images/social_nightly.jpg'
|
||||||
import socialImageLegacy from '../images/social_legacy.jpg'
|
import socialImageLegacy from '../images/social_legacy.jpg'
|
||||||
|
import siteMetadata from '../../meta/site.json'
|
||||||
|
import { siteUrl } from '../../meta/dynamicMeta'
|
||||||
|
|
||||||
function getPageTitle(title, sitename, slogan, sectionTitle, nightly, legacy) {
|
function getPageTitle(title, sitename, slogan, sectionTitle, nightly, legacy) {
|
||||||
if (sectionTitle && title) {
|
if (sectionTitle && title) {
|
||||||
|
@ -38,86 +39,78 @@ export default function SEO({
|
||||||
nightly,
|
nightly,
|
||||||
legacy,
|
legacy,
|
||||||
}) {
|
}) {
|
||||||
return (
|
const metaDescription = description || siteMetadata.description
|
||||||
<StaticQuery
|
const pageTitle = getPageTitle(
|
||||||
query={query}
|
title,
|
||||||
render={(data) => {
|
siteMetadata.title,
|
||||||
const siteMetadata = data.site.siteMetadata
|
siteMetadata.slogan,
|
||||||
const metaDescription = description || siteMetadata.description
|
sectionTitle,
|
||||||
const pageTitle = getPageTitle(
|
nightly,
|
||||||
title,
|
legacy
|
||||||
siteMetadata.title,
|
)
|
||||||
siteMetadata.slogan,
|
const socialImage = siteUrl + getImage(section, nightly, legacy)
|
||||||
sectionTitle,
|
const meta = [
|
||||||
nightly,
|
{
|
||||||
legacy
|
name: 'description',
|
||||||
)
|
content: metaDescription,
|
||||||
const socialImage = siteMetadata.siteUrl + getImage(section, nightly, legacy)
|
},
|
||||||
const meta = [
|
{
|
||||||
{
|
property: 'og:title',
|
||||||
name: 'description',
|
content: pageTitle,
|
||||||
content: metaDescription,
|
},
|
||||||
},
|
{
|
||||||
{
|
property: 'og:description',
|
||||||
property: 'og:title',
|
content: metaDescription,
|
||||||
content: pageTitle,
|
},
|
||||||
},
|
{
|
||||||
{
|
property: 'og:type',
|
||||||
property: 'og:description',
|
content: `website`,
|
||||||
content: metaDescription,
|
},
|
||||||
},
|
{
|
||||||
{
|
property: 'og:site_name',
|
||||||
property: 'og:type',
|
content: title,
|
||||||
content: `website`,
|
},
|
||||||
},
|
{
|
||||||
{
|
property: 'og:image',
|
||||||
property: 'og:site_name',
|
content: socialImage,
|
||||||
content: title,
|
},
|
||||||
},
|
{
|
||||||
{
|
name: 'twitter:card',
|
||||||
property: 'og:image',
|
content: 'summary_large_image',
|
||||||
content: socialImage,
|
},
|
||||||
},
|
{
|
||||||
{
|
name: 'twitter:image',
|
||||||
name: 'twitter:card',
|
content: socialImage,
|
||||||
content: 'summary_large_image',
|
},
|
||||||
},
|
{
|
||||||
{
|
name: 'twitter:creator',
|
||||||
name: 'twitter:image',
|
content: `@${siteMetadata.social.twitter}`,
|
||||||
content: socialImage,
|
},
|
||||||
},
|
{
|
||||||
{
|
name: 'twitter:site',
|
||||||
name: 'twitter:creator',
|
content: `@${siteMetadata.social.twitter}`,
|
||||||
content: `@${siteMetadata.social.twitter}`,
|
},
|
||||||
},
|
{
|
||||||
{
|
name: 'twitter:title',
|
||||||
name: 'twitter:site',
|
content: pageTitle,
|
||||||
content: `@${siteMetadata.social.twitter}`,
|
},
|
||||||
},
|
{
|
||||||
{
|
name: 'twitter:description',
|
||||||
name: 'twitter:title',
|
content: metaDescription,
|
||||||
content: pageTitle,
|
},
|
||||||
},
|
{
|
||||||
{
|
name: 'docsearch:language',
|
||||||
name: 'twitter:description',
|
content: lang,
|
||||||
content: metaDescription,
|
},
|
||||||
},
|
]
|
||||||
{
|
|
||||||
name: 'docsearch:language',
|
|
||||||
content: lang,
|
|
||||||
},
|
|
||||||
]
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Helmet
|
<Helmet
|
||||||
defer={false}
|
defer={false}
|
||||||
htmlAttributes={{ lang }}
|
htmlAttributes={{ lang }}
|
||||||
bodyAttributes={{ class: bodyClass }}
|
bodyAttributes={{ class: bodyClass }}
|
||||||
title={pageTitle}
|
title={pageTitle}
|
||||||
meta={meta}
|
meta={meta}
|
||||||
/>
|
|
||||||
)
|
|
||||||
}}
|
|
||||||
/>
|
/>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -131,19 +124,3 @@ SEO.propTypes = {
|
||||||
section: PropTypes.string,
|
section: PropTypes.string,
|
||||||
bodyClass: PropTypes.string,
|
bodyClass: PropTypes.string,
|
||||||
}
|
}
|
||||||
|
|
||||||
const query = graphql`
|
|
||||||
query DefaultSEOQuery {
|
|
||||||
site {
|
|
||||||
siteMetadata {
|
|
||||||
title
|
|
||||||
description
|
|
||||||
slogan
|
|
||||||
siteUrl
|
|
||||||
social {
|
|
||||||
twitter
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
`
|
|
||||||
|
|
|
@ -3,10 +3,11 @@ import { Parser as HtmlToReactParser } from 'html-to-react'
|
||||||
import remark from 'remark'
|
import remark from 'remark'
|
||||||
import remark2react from 'remark-react'
|
import remark2react from 'remark-react'
|
||||||
import siteMetadata from '../../meta/site.json'
|
import siteMetadata from '../../meta/site.json'
|
||||||
|
import { domain } from '../../meta/dynamicMeta'
|
||||||
|
|
||||||
const htmlToReactParser = new HtmlToReactParser()
|
const htmlToReactParser = new HtmlToReactParser()
|
||||||
|
|
||||||
const isNightly = siteMetadata.nightlyBranches.includes(siteMetadata.domain)
|
const isNightly = siteMetadata.nightlyBranches.includes(domain)
|
||||||
export const DEFAULT_BRANCH = isNightly ? 'develop' : 'master'
|
export const DEFAULT_BRANCH = isNightly ? 'develop' : 'master'
|
||||||
export const repo = siteMetadata.repo
|
export const repo = siteMetadata.repo
|
||||||
export const modelsRepo = siteMetadata.modelsRepo
|
export const modelsRepo = siteMetadata.modelsRepo
|
||||||
|
|
|
@ -1,16 +1,15 @@
|
||||||
import React from 'react'
|
import React from 'react'
|
||||||
import { window } from 'browser-monads'
|
import { window } from 'browser-monads'
|
||||||
import { graphql } from 'gatsby'
|
|
||||||
|
|
||||||
import Template from '../templates/index'
|
import Template from '../templates/index'
|
||||||
import { LandingHeader, LandingTitle } from '../components/landing'
|
import { LandingHeader, LandingTitle } from '../components/landing'
|
||||||
import Button from '../components/button'
|
import Button from '../components/button'
|
||||||
|
import { nightly, legacy } from '../../meta/dynamicMeta'
|
||||||
|
|
||||||
const page404 = ({ data, location }) => {
|
const page404 = ({ location }) => {
|
||||||
const { nightly, legacy } = data.site.siteMetadata
|
|
||||||
const pageContext = { title: '404 Error', searchExclude: true, isIndex: false }
|
const pageContext = { title: '404 Error', searchExclude: true, isIndex: false }
|
||||||
return (
|
return (
|
||||||
<Template data={data} pageContext={pageContext} location={location}>
|
<Template pageContext={pageContext} location={location}>
|
||||||
<LandingHeader style={{ minHeight: 400 }} nightly={nightly} legacy={legacy}>
|
<LandingHeader style={{ minHeight: 400 }} nightly={nightly} legacy={legacy}>
|
||||||
<LandingTitle>
|
<LandingTitle>
|
||||||
Ooops, this page
|
Ooops, this page
|
||||||
|
@ -27,25 +26,3 @@ const page404 = ({ data, location }) => {
|
||||||
}
|
}
|
||||||
|
|
||||||
export default page404
|
export default page404
|
||||||
|
|
||||||
export const pageQuery = graphql`
|
|
||||||
query {
|
|
||||||
site {
|
|
||||||
siteMetadata {
|
|
||||||
nightly
|
|
||||||
legacy
|
|
||||||
title
|
|
||||||
description
|
|
||||||
navigation {
|
|
||||||
text
|
|
||||||
url
|
|
||||||
}
|
|
||||||
docSearch {
|
|
||||||
apiKey
|
|
||||||
indexName
|
|
||||||
appId
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
`
|
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
import React from 'react'
|
import React from 'react'
|
||||||
import PropTypes from 'prop-types'
|
import PropTypes from 'prop-types'
|
||||||
import { StaticQuery, graphql } from 'gatsby'
|
|
||||||
|
|
||||||
import Models from './models'
|
import Models from './models'
|
||||||
|
|
||||||
|
@ -13,98 +12,99 @@ import Sidebar from '../components/sidebar'
|
||||||
import Main from '../components/main'
|
import Main from '../components/main'
|
||||||
import { getCurrentSource, github } from '../components/util'
|
import { getCurrentSource, github } from '../components/util'
|
||||||
|
|
||||||
const Docs = ({ pageContext, children }) => (
|
import siteMetadata from '../../meta/site.json'
|
||||||
<StaticQuery
|
import sidebars from '../../meta/sidebars.json'
|
||||||
query={query}
|
import models from '../../meta/languages.json'
|
||||||
render={({ site }) => {
|
import { nightly, legacy } from '../../meta/dynamicMeta'
|
||||||
const {
|
|
||||||
id,
|
|
||||||
slug,
|
|
||||||
title,
|
|
||||||
section,
|
|
||||||
teaser,
|
|
||||||
source,
|
|
||||||
tag,
|
|
||||||
isIndex,
|
|
||||||
next,
|
|
||||||
menu,
|
|
||||||
theme,
|
|
||||||
version,
|
|
||||||
apiDetails,
|
|
||||||
} = pageContext
|
|
||||||
const { sidebars = [], modelsRepo, languages, nightly, legacy } = site.siteMetadata
|
|
||||||
const isModels = section === 'models'
|
|
||||||
const sidebar = pageContext.sidebar
|
|
||||||
? { items: pageContext.sidebar }
|
|
||||||
: sidebars.find((bar) => bar.section === section)
|
|
||||||
let pageMenu = menu ? menu.map(([text, id]) => ({ text, id })) : []
|
|
||||||
|
|
||||||
if (isModels) {
|
const Docs = ({ pageContext, children }) => {
|
||||||
sidebar.items[1].items = languages
|
const {
|
||||||
.filter(({ models }) => models && models.length)
|
id,
|
||||||
.sort((a, b) => a.name.localeCompare(b.name))
|
slug,
|
||||||
.map((lang) => ({
|
title,
|
||||||
text: lang.name,
|
section,
|
||||||
url: `/models/${lang.code}`,
|
teaser,
|
||||||
isActive: id === lang.code,
|
source,
|
||||||
menu: lang.models.map((model) => ({
|
tag,
|
||||||
text: model,
|
isIndex,
|
||||||
id: model,
|
next,
|
||||||
})),
|
menu,
|
||||||
}))
|
theme,
|
||||||
}
|
version,
|
||||||
const sourcePath = source ? github(source) : null
|
apiDetails,
|
||||||
const currentSource = getCurrentSource(slug, isIndex)
|
} = pageContext
|
||||||
|
const { modelsRepo } = siteMetadata
|
||||||
|
const { languages } = models
|
||||||
|
const isModels = section === 'models'
|
||||||
|
const sidebar = pageContext.sidebar
|
||||||
|
? { items: pageContext.sidebar }
|
||||||
|
: sidebars.find((bar) => bar.section === section)
|
||||||
|
let pageMenu = menu ? menu.map(([text, id]) => ({ text, id })) : []
|
||||||
|
|
||||||
const subFooter = (
|
if (isModels) {
|
||||||
<Grid cols={2}>
|
sidebar.items[1].items = languages
|
||||||
<div style={{ marginTop: 'var(--spacing-lg)' }}>
|
.filter(({ models }) => models && models.length)
|
||||||
{(!isModels || (isModels && isIndex)) && (
|
.sort((a, b) => a.name.localeCompare(b.name))
|
||||||
<Button to={currentSource} icon="code">
|
.map((lang) => ({
|
||||||
Suggest edits
|
text: lang.name,
|
||||||
</Button>
|
url: `/models/${lang.code}`,
|
||||||
)}
|
isActive: id === lang.code,
|
||||||
</div>
|
menu: lang.models.map((model) => ({
|
||||||
{next && <ReadNext title={next.title} to={next.slug} />}
|
text: model,
|
||||||
</Grid>
|
id: model,
|
||||||
)
|
})),
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
const sourcePath = source ? github(source) : null
|
||||||
|
const currentSource = getCurrentSource(slug, isIndex)
|
||||||
|
|
||||||
return (
|
const subFooter = (
|
||||||
<>
|
<Grid cols={2}>
|
||||||
{sidebar && <Sidebar items={sidebar.items} pageMenu={pageMenu} slug={slug} />}
|
<div style={{ marginTop: 'var(--spacing-lg)' }}>
|
||||||
<Main
|
{(!isModels || (isModels && isIndex)) && (
|
||||||
section={section}
|
<Button to={currentSource} icon="code">
|
||||||
theme={nightly ? 'nightly' : legacy ? 'legacy' : theme}
|
Suggest edits
|
||||||
sidebar
|
</Button>
|
||||||
asides
|
)}
|
||||||
wrapContent
|
</div>
|
||||||
footer={<Footer />}
|
{next && <ReadNext title={next.title} to={next.slug} />}
|
||||||
>
|
</Grid>
|
||||||
{isModels && !isIndex ? (
|
)
|
||||||
<Models pageContext={pageContext} repo={modelsRepo}>
|
|
||||||
{subFooter}
|
return (
|
||||||
</Models>
|
<>
|
||||||
) : (
|
{sidebar && <Sidebar items={sidebar.items} pageMenu={pageMenu} slug={slug} />}
|
||||||
<>
|
<Main
|
||||||
<Title
|
section={section}
|
||||||
title={title}
|
theme={nightly ? 'nightly' : legacy ? 'legacy' : theme}
|
||||||
teaser={teaser}
|
sidebar
|
||||||
source={sourcePath}
|
asides
|
||||||
tag={tag}
|
wrapContent
|
||||||
version={version}
|
footer={<Footer />}
|
||||||
id="_title"
|
>
|
||||||
apiDetails={apiDetails}
|
{isModels && !isIndex ? (
|
||||||
/>
|
<Models pageContext={pageContext} repo={modelsRepo}>
|
||||||
{children}
|
{subFooter}
|
||||||
{subFooter}
|
</Models>
|
||||||
</>
|
) : (
|
||||||
)}
|
<>
|
||||||
</Main>
|
<Title
|
||||||
</>
|
title={title}
|
||||||
)
|
teaser={teaser}
|
||||||
}}
|
source={sourcePath}
|
||||||
/>
|
tag={tag}
|
||||||
)
|
version={version}
|
||||||
|
id="_title"
|
||||||
|
apiDetails={apiDetails}
|
||||||
|
/>
|
||||||
|
{children}
|
||||||
|
{subFooter}
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
</Main>
|
||||||
|
</>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
Docs.propTypes = {
|
Docs.propTypes = {
|
||||||
pageContext: PropTypes.shape({
|
pageContext: PropTypes.shape({
|
||||||
|
@ -125,32 +125,3 @@ Docs.propTypes = {
|
||||||
}
|
}
|
||||||
|
|
||||||
export default Docs
|
export default Docs
|
||||||
|
|
||||||
const query = graphql`
|
|
||||||
query DocsQuery {
|
|
||||||
site {
|
|
||||||
siteMetadata {
|
|
||||||
repo
|
|
||||||
modelsRepo
|
|
||||||
languages {
|
|
||||||
code
|
|
||||||
name
|
|
||||||
models
|
|
||||||
}
|
|
||||||
nightly
|
|
||||||
legacy
|
|
||||||
sidebars {
|
|
||||||
section
|
|
||||||
items {
|
|
||||||
label
|
|
||||||
items {
|
|
||||||
text
|
|
||||||
url
|
|
||||||
tag
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
`
|
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
import React from 'react'
|
import React from 'react'
|
||||||
import PropTypes from 'prop-types'
|
import PropTypes from 'prop-types'
|
||||||
import { graphql } from 'gatsby'
|
|
||||||
import { MDXProvider } from '@mdx-js/tag'
|
import { MDXProvider } from '@mdx-js/tag'
|
||||||
import { withMDXScope } from 'gatsby-mdx/context'
|
import { withMDXScope } from 'gatsby-mdx/context'
|
||||||
import useOnlineStatus from '@rehooks/online-status'
|
import useOnlineStatus from '@rehooks/online-status'
|
||||||
|
@ -35,6 +34,9 @@ import Search from '../components/search'
|
||||||
import Project from '../widgets/project'
|
import Project from '../widgets/project'
|
||||||
import { Integration, IntegrationLogo } from '../widgets/integration'
|
import { Integration, IntegrationLogo } from '../widgets/integration'
|
||||||
|
|
||||||
|
import siteMetadata from '../../meta/site.json'
|
||||||
|
import { nightly, legacy } from '../../meta/dynamicMeta'
|
||||||
|
|
||||||
const mdxComponents = {
|
const mdxComponents = {
|
||||||
a: Link,
|
a: Link,
|
||||||
p: P,
|
p: P,
|
||||||
|
@ -167,9 +169,8 @@ class Layout extends React.Component {
|
||||||
const { data, pageContext, location, children } = this.props
|
const { data, pageContext, location, children } = this.props
|
||||||
const { file, site = {} } = data || {}
|
const { file, site = {} } = data || {}
|
||||||
const mdx = file ? file.childMdx : null
|
const mdx = file ? file.childMdx : null
|
||||||
const meta = site.siteMetadata || {}
|
|
||||||
const { title, section, sectionTitle, teaser, theme = 'blue', searchExclude } = pageContext
|
const { title, section, sectionTitle, teaser, theme = 'blue', searchExclude } = pageContext
|
||||||
const uiTheme = meta.nightly ? 'nightly' : meta.legacy ? 'legacy' : theme
|
const uiTheme = nightly ? 'nightly' : legacy ? 'legacy' : theme
|
||||||
const bodyClass = classNames(`theme-${uiTheme}`, { 'search-exclude': !!searchExclude })
|
const bodyClass = classNames(`theme-${uiTheme}`, { 'search-exclude': !!searchExclude })
|
||||||
const isDocs = ['usage', 'models', 'api', 'styleguide'].includes(section)
|
const isDocs = ['usage', 'models', 'api', 'styleguide'].includes(section)
|
||||||
const content = !mdx ? null : (
|
const content = !mdx ? null : (
|
||||||
|
@ -182,19 +183,19 @@ class Layout extends React.Component {
|
||||||
<>
|
<>
|
||||||
<SEO
|
<SEO
|
||||||
title={title}
|
title={title}
|
||||||
description={teaser || meta.description}
|
description={teaser || siteMetadata.description}
|
||||||
section={section}
|
section={section}
|
||||||
sectionTitle={sectionTitle}
|
sectionTitle={sectionTitle}
|
||||||
bodyClass={bodyClass}
|
bodyClass={bodyClass}
|
||||||
nightly={meta.nightly}
|
nightly={nightly}
|
||||||
/>
|
/>
|
||||||
<AlertSpace nightly={meta.nightly} legacy={meta.legacy} />
|
<AlertSpace nightly={nightly} legacy={legacy} />
|
||||||
<Navigation
|
<Navigation
|
||||||
title={meta.title}
|
title={siteMetadata.title}
|
||||||
items={meta.navigation}
|
items={siteMetadata.navigation}
|
||||||
section={section}
|
section={section}
|
||||||
search={<Search settings={meta.docSearch} />}
|
search={<Search settings={siteMetadata.docSearch} />}
|
||||||
alert={meta.nightly ? null : navAlert}
|
alert={nightly ? null : navAlert}
|
||||||
>
|
>
|
||||||
<Progress key={location.href} />
|
<Progress key={location.href} />
|
||||||
</Navigation>
|
</Navigation>
|
||||||
|
@ -219,33 +220,3 @@ class Layout extends React.Component {
|
||||||
}
|
}
|
||||||
|
|
||||||
export default withMDXScope(Layout)
|
export default withMDXScope(Layout)
|
||||||
|
|
||||||
export const pageQuery = graphql`
|
|
||||||
query ($slug: String!) {
|
|
||||||
site {
|
|
||||||
siteMetadata {
|
|
||||||
nightly
|
|
||||||
legacy
|
|
||||||
title
|
|
||||||
description
|
|
||||||
navigation {
|
|
||||||
text
|
|
||||||
url
|
|
||||||
}
|
|
||||||
docSearch {
|
|
||||||
apiKey
|
|
||||||
indexName
|
|
||||||
appId
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
file(fields: { slug: { eq: $slug } }) {
|
|
||||||
childMdx {
|
|
||||||
code {
|
|
||||||
scope
|
|
||||||
body
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
`
|
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
import React, { useEffect, useState, useMemo, Fragment } from 'react'
|
import React, { useEffect, useState, useMemo, Fragment } from 'react'
|
||||||
import { StaticQuery, graphql } from 'gatsby'
|
|
||||||
import { window } from 'browser-monads'
|
import { window } from 'browser-monads'
|
||||||
|
|
||||||
import Title from '../components/title'
|
import Title from '../components/title'
|
||||||
|
@ -17,6 +16,9 @@ import Accordion from '../components/accordion'
|
||||||
import { join, arrayToObj, abbrNum, markdownToReact } from '../components/util'
|
import { join, arrayToObj, abbrNum, markdownToReact } from '../components/util'
|
||||||
import { isString, isEmptyObj } from '../components/util'
|
import { isString, isEmptyObj } from '../components/util'
|
||||||
|
|
||||||
|
import siteMetadata from '../../meta/site.json'
|
||||||
|
import languages from '../../meta/languages.json'
|
||||||
|
|
||||||
const COMPONENT_LINKS = {
|
const COMPONENT_LINKS = {
|
||||||
tok2vec: '/api/tok2vec',
|
tok2vec: '/api/tok2vec',
|
||||||
transformer: '/api/transformer',
|
transformer: '/api/transformer',
|
||||||
|
@ -415,43 +417,23 @@ const Models = ({ pageContext, repo, children }) => {
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<Title title={title} teaser={`Available trained pipelines for ${title}`} />
|
<Title title={title} teaser={`Available trained pipelines for ${title}`} />
|
||||||
<StaticQuery
|
{models.map((modelName) => (
|
||||||
query={query}
|
<Model
|
||||||
render={({ site }) =>
|
key={modelName}
|
||||||
models.map((modelName) => (
|
name={modelName}
|
||||||
<Model
|
langId={id}
|
||||||
key={modelName}
|
langName={title}
|
||||||
name={modelName}
|
compatibility={compatibility}
|
||||||
langId={id}
|
baseUrl={baseUrl}
|
||||||
langName={title}
|
repo={repo}
|
||||||
compatibility={compatibility}
|
licenses={arrayToObj(languages.licenses, 'id')}
|
||||||
baseUrl={baseUrl}
|
hasExamples={meta.hasExamples}
|
||||||
repo={repo}
|
prereleases={siteMetadata.nightly}
|
||||||
licenses={arrayToObj(site.siteMetadata.licenses, 'id')}
|
/>
|
||||||
hasExamples={meta.hasExamples}
|
))}
|
||||||
prereleases={site.siteMetadata.nightly}
|
|
||||||
/>
|
|
||||||
))
|
|
||||||
}
|
|
||||||
/>
|
|
||||||
|
|
||||||
{children}
|
{children}
|
||||||
</>
|
</>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
export default Models
|
export default Models
|
||||||
|
|
||||||
const query = graphql`
|
|
||||||
query ModelsQuery {
|
|
||||||
site {
|
|
||||||
siteMetadata {
|
|
||||||
nightly
|
|
||||||
licenses {
|
|
||||||
id
|
|
||||||
url
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
`
|
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
import React from 'react'
|
import React from 'react'
|
||||||
import PropTypes from 'prop-types'
|
import PropTypes from 'prop-types'
|
||||||
import { StaticQuery, graphql } from 'gatsby'
|
|
||||||
|
|
||||||
import Card from '../components/card'
|
import Card from '../components/card'
|
||||||
import Link from '../components/link'
|
import Link from '../components/link'
|
||||||
|
@ -19,6 +18,9 @@ import { H3, H5, Label, InlineList } from '../components/typography'
|
||||||
import { YouTube, SoundCloud, Iframe } from '../components/embed'
|
import { YouTube, SoundCloud, Iframe } from '../components/embed'
|
||||||
import { github, markdownToReact } from '../components/util'
|
import { github, markdownToReact } from '../components/util'
|
||||||
|
|
||||||
|
import { nightly, legacy } from '../../meta/dynamicMeta'
|
||||||
|
import universe from '../../meta/universe.json'
|
||||||
|
|
||||||
function getSlug(data) {
|
function getSlug(data) {
|
||||||
if (data.isCategory) return `/universe/category/${data.id}`
|
if (data.isCategory) return `/universe/category/${data.id}`
|
||||||
if (data.isProject) return `/universe/project/${data.id}`
|
if (data.isProject) return `/universe/project/${data.id}`
|
||||||
|
@ -333,73 +335,18 @@ const Project = ({ data, components }) => (
|
||||||
</>
|
</>
|
||||||
)
|
)
|
||||||
|
|
||||||
const Universe = ({ pageContext, location, mdxComponents }) => (
|
const Universe = ({ pageContext, location, mdxComponents }) => {
|
||||||
<StaticQuery
|
const theme = nightly ? 'nightly' : legacy ? 'legacy' : pageContext.theme
|
||||||
query={query}
|
return (
|
||||||
render={(data) => {
|
<UniverseContent
|
||||||
const { universe, nightly, legacy } = data.site.siteMetadata
|
content={universe.resources}
|
||||||
const theme = nightly ? 'nightly' : legacy ? 'legacy' : pageContext.theme
|
categories={universe.categories}
|
||||||
return (
|
pageContext={pageContext}
|
||||||
<UniverseContent
|
location={location}
|
||||||
content={universe.resources}
|
mdxComponents={mdxComponents}
|
||||||
categories={universe.categories}
|
theme={theme}
|
||||||
pageContext={pageContext}
|
/>
|
||||||
location={location}
|
)
|
||||||
mdxComponents={mdxComponents}
|
}
|
||||||
theme={theme}
|
|
||||||
/>
|
|
||||||
)
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
)
|
|
||||||
|
|
||||||
export default Universe
|
export default Universe
|
||||||
|
|
||||||
const query = graphql`
|
|
||||||
query UniverseQuery {
|
|
||||||
site {
|
|
||||||
siteMetadata {
|
|
||||||
nightly
|
|
||||||
legacy
|
|
||||||
universe {
|
|
||||||
resources {
|
|
||||||
type
|
|
||||||
id
|
|
||||||
title
|
|
||||||
slogan
|
|
||||||
url
|
|
||||||
github
|
|
||||||
description
|
|
||||||
spacy_version
|
|
||||||
pip
|
|
||||||
cran
|
|
||||||
category
|
|
||||||
thumb
|
|
||||||
image
|
|
||||||
cover
|
|
||||||
code_example
|
|
||||||
code_language
|
|
||||||
youtube
|
|
||||||
soundcloud
|
|
||||||
iframe
|
|
||||||
iframe_height
|
|
||||||
author
|
|
||||||
author_links {
|
|
||||||
twitter
|
|
||||||
github
|
|
||||||
website
|
|
||||||
}
|
|
||||||
}
|
|
||||||
categories {
|
|
||||||
label
|
|
||||||
items {
|
|
||||||
id
|
|
||||||
title
|
|
||||||
description
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
`
|
|
||||||
|
|
|
@ -1,74 +1,65 @@
|
||||||
import React from 'react'
|
import React from 'react'
|
||||||
import { graphql, StaticQuery } from 'gatsby'
|
|
||||||
|
|
||||||
import { Ul, Li } from '../components/list'
|
import { Ul, Li } from '../components/list'
|
||||||
|
|
||||||
const Features = () => (
|
import models from '../../meta/languages.json'
|
||||||
<StaticQuery
|
|
||||||
query={query}
|
/**
|
||||||
render={({ site }) => {
|
* Compute the overall total counts of models and languages
|
||||||
const { counts } = site.siteMetadata
|
*/
|
||||||
return (
|
function getCounts(langs = []) {
|
||||||
<Ul>
|
return {
|
||||||
<Li>
|
langs: langs.length,
|
||||||
✅ Support for <strong>{counts.langs}+ languages</strong>
|
modelLangs: langs.filter(({ models }) => models && !!models.length).length,
|
||||||
</Li>
|
models: langs.map(({ models }) => (models ? models.length : 0)).reduce((a, b) => a + b, 0),
|
||||||
<Li>
|
}
|
||||||
✅ <strong>{counts.models} trained pipelines</strong> for{' '}
|
}
|
||||||
{counts.modelLangs} languages
|
|
||||||
</Li>
|
const Features = () => {
|
||||||
<Li>
|
const counts = getCounts(models.languages)
|
||||||
✅ Multi-task learning with pretrained <strong>transformers</strong> like
|
return (
|
||||||
BERT
|
<Ul>
|
||||||
</Li>
|
<Li>
|
||||||
<Li>
|
✅ Support for <strong>{counts.langs}+ languages</strong>
|
||||||
✅ Pretrained <strong>word vectors</strong>
|
</Li>
|
||||||
</Li>
|
<Li>
|
||||||
<Li>✅ State-of-the-art speed</Li>
|
✅ <strong>{counts.models} trained pipelines</strong> for {counts.modelLangs}{' '}
|
||||||
<Li>
|
languages
|
||||||
✅ Production-ready <strong>training system</strong>
|
</Li>
|
||||||
</Li>
|
<Li>
|
||||||
<Li>
|
✅ Multi-task learning with pretrained <strong>transformers</strong> like BERT
|
||||||
✅ Linguistically-motivated <strong>tokenization</strong>
|
</Li>
|
||||||
</Li>
|
<Li>
|
||||||
<Li>
|
✅ Pretrained <strong>word vectors</strong>
|
||||||
✅ Components for <strong>named entity</strong> recognition, part-of-speech
|
</Li>
|
||||||
tagging, dependency parsing, sentence segmentation,{' '}
|
<Li>✅ State-of-the-art speed</Li>
|
||||||
<strong>text classification</strong>, lemmatization, morphological analysis,
|
<Li>
|
||||||
entity linking and more
|
✅ Production-ready <strong>training system</strong>
|
||||||
</Li>
|
</Li>
|
||||||
<Li>
|
<Li>
|
||||||
✅ Easily extensible with <strong>custom components</strong> and attributes
|
✅ Linguistically-motivated <strong>tokenization</strong>
|
||||||
</Li>
|
</Li>
|
||||||
<Li>
|
<Li>
|
||||||
✅ Support for custom models in <strong>PyTorch</strong>,{' '}
|
✅ Components for <strong>named entity</strong> recognition, part-of-speech tagging,
|
||||||
<strong>TensorFlow</strong> and other frameworks
|
dependency parsing, sentence segmentation, <strong>text classification</strong>,
|
||||||
</Li>
|
lemmatization, morphological analysis, entity linking and more
|
||||||
<Li>
|
</Li>
|
||||||
✅ Built in <strong>visualizers</strong> for syntax and NER
|
<Li>
|
||||||
</Li>
|
✅ Easily extensible with <strong>custom components</strong> and attributes
|
||||||
<Li>
|
</Li>
|
||||||
✅ Easy <strong>model packaging</strong>, deployment and workflow management
|
<Li>
|
||||||
</Li>
|
✅ Support for custom models in <strong>PyTorch</strong>,{' '}
|
||||||
<Li>✅ Robust, rigorously evaluated accuracy</Li>
|
<strong>TensorFlow</strong> and other frameworks
|
||||||
</Ul>
|
</Li>
|
||||||
)
|
<Li>
|
||||||
}}
|
✅ Built in <strong>visualizers</strong> for syntax and NER
|
||||||
/>
|
</Li>
|
||||||
)
|
<Li>
|
||||||
|
✅ Easy <strong>model packaging</strong>, deployment and workflow management
|
||||||
|
</Li>
|
||||||
|
<Li>✅ Robust, rigorously evaluated accuracy</Li>
|
||||||
|
</Ul>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
export default Features
|
export default Features
|
||||||
|
|
||||||
const query = graphql`
|
|
||||||
query FeaturesQuery {
|
|
||||||
site {
|
|
||||||
siteMetadata {
|
|
||||||
counts {
|
|
||||||
langs
|
|
||||||
modelLangs
|
|
||||||
models
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
`
|
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
import React from 'react'
|
import React from 'react'
|
||||||
import PropTypes from 'prop-types'
|
import PropTypes from 'prop-types'
|
||||||
import { StaticQuery, graphql } from 'gatsby'
|
|
||||||
|
|
||||||
import {
|
import {
|
||||||
LandingHeader,
|
LandingHeader,
|
||||||
|
@ -19,13 +18,15 @@ import { Ul, Li } from '../components/list'
|
||||||
import Button from '../components/button'
|
import Button from '../components/button'
|
||||||
import Link from '../components/link'
|
import Link from '../components/link'
|
||||||
|
|
||||||
import QuickstartTraining from './quickstart-training'
|
import QuickstartTraining from '../widgets/quickstart-training'
|
||||||
import Project from './project'
|
import Project from '../widgets/project'
|
||||||
import Features from './features'
|
import Features from '../widgets/features'
|
||||||
|
import Layout from '../components/layout'
|
||||||
import courseImage from '../../docs/images/course.jpg'
|
import courseImage from '../../docs/images/course.jpg'
|
||||||
import prodigyImage from '../../docs/images/prodigy_overview.jpg'
|
import prodigyImage from '../../docs/images/prodigy_overview.jpg'
|
||||||
import projectsImage from '../../docs/images/projects.png'
|
import projectsImage from '../../docs/images/projects.png'
|
||||||
import tailoredPipelinesImage from '../../docs/images/spacy-tailored-pipelines_wide.png'
|
import tailoredPipelinesImage from '../../docs/images/spacy-tailored-pipelines_wide.png'
|
||||||
|
import { nightly, legacy } from '../../meta/dynamicMeta'
|
||||||
|
|
||||||
import Benchmarks from '../../docs/usage/_benchmarks-models.mdx'
|
import Benchmarks from '../../docs/usage/_benchmarks-models.mdx'
|
||||||
|
|
||||||
|
@ -56,8 +57,7 @@ for entity in doc.ents:
|
||||||
`
|
`
|
||||||
}
|
}
|
||||||
|
|
||||||
const Landing = ({ data }) => {
|
const Landing = () => {
|
||||||
const { nightly, legacy } = data
|
|
||||||
const codeExample = getCodeExample(nightly)
|
const codeExample = getCodeExample(nightly)
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
|
@ -289,31 +289,4 @@ const Landing = ({ data }) => {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
Landing.propTypes = {
|
export default Landing
|
||||||
data: PropTypes.shape({
|
|
||||||
repo: PropTypes.string,
|
|
||||||
languages: PropTypes.arrayOf(
|
|
||||||
PropTypes.shape({
|
|
||||||
models: PropTypes.arrayOf(PropTypes.string),
|
|
||||||
})
|
|
||||||
),
|
|
||||||
}),
|
|
||||||
}
|
|
||||||
|
|
||||||
const PageLanding = () => (
|
|
||||||
<StaticQuery query={landingQuery} render={({ site }) => <Landing data={site.siteMetadata} />} />
|
|
||||||
)
|
|
||||||
|
|
||||||
export default PageLanding
|
|
||||||
|
|
||||||
const landingQuery = graphql`
|
|
||||||
query LandingQuery {
|
|
||||||
site {
|
|
||||||
siteMetadata {
|
|
||||||
nightly
|
|
||||||
legacy
|
|
||||||
repo
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
`
|
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
import React from 'react'
|
import React from 'react'
|
||||||
import { StaticQuery, graphql } from 'gatsby'
|
|
||||||
|
|
||||||
import Link from '../components/link'
|
import Link from '../components/link'
|
||||||
import { InlineCode } from '../components/code'
|
import { InlineCode } from '../components/code'
|
||||||
|
@ -8,6 +7,8 @@ import { Ul, Li } from '../components/list'
|
||||||
import Infobox from '../components/infobox'
|
import Infobox from '../components/infobox'
|
||||||
import { github, join } from '../components/util'
|
import { github, join } from '../components/util'
|
||||||
|
|
||||||
|
import models from '../../meta/languages.json'
|
||||||
|
|
||||||
const Language = ({ name, code, models }) => (
|
const Language = ({ name, code, models }) => (
|
||||||
<Tr>
|
<Tr>
|
||||||
<Td>{name}</Td>
|
<Td>{name}</Td>
|
||||||
|
@ -31,77 +32,54 @@ const Language = ({ name, code, models }) => (
|
||||||
</Tr>
|
</Tr>
|
||||||
)
|
)
|
||||||
|
|
||||||
const Languages = () => (
|
const Languages = () => {
|
||||||
<StaticQuery
|
const langs = models.languages
|
||||||
query={query}
|
const withModels = langs
|
||||||
render={({ site }) => {
|
.filter(({ models }) => models && !!models.length)
|
||||||
const langs = site.siteMetadata.languages
|
.sort((a, b) => a.name.localeCompare(b.name))
|
||||||
const withModels = langs
|
const withoutModels = langs
|
||||||
.filter(({ models }) => models && !!models.length)
|
.filter(({ models }) => !models || !models.length)
|
||||||
.sort((a, b) => a.name.localeCompare(b.name))
|
.sort((a, b) => a.name.localeCompare(b.name))
|
||||||
const withoutModels = langs
|
const withDeps = langs.filter(({ dependencies }) => dependencies && dependencies.length)
|
||||||
.filter(({ models }) => !models || !models.length)
|
return (
|
||||||
.sort((a, b) => a.name.localeCompare(b.name))
|
<>
|
||||||
const withDeps = langs.filter(({ dependencies }) => dependencies && dependencies.length)
|
<Table>
|
||||||
return (
|
<thead>
|
||||||
<>
|
<Tr>
|
||||||
<Table>
|
<Th>Language</Th>
|
||||||
<thead>
|
<Th>Code</Th>
|
||||||
<Tr>
|
<Th>Language Data</Th>
|
||||||
<Th>Language</Th>
|
<Th>Pipelines</Th>
|
||||||
<Th>Code</Th>
|
</Tr>
|
||||||
<Th>Language Data</Th>
|
</thead>
|
||||||
<Th>Pipelines</Th>
|
<tbody>
|
||||||
</Tr>
|
{withModels.map((model) => (
|
||||||
</thead>
|
<Language {...model} key={model.code} />
|
||||||
<tbody>
|
))}
|
||||||
{withModels.map((model) => (
|
{withoutModels.map((model) => (
|
||||||
<Language {...model} key={model.code} />
|
<Language {...model} key={model.code} />
|
||||||
))}
|
))}
|
||||||
{withoutModels.map((model) => (
|
</tbody>
|
||||||
<Language {...model} key={model.code} />
|
</Table>
|
||||||
))}
|
<Infobox title="Dependencies">
|
||||||
</tbody>
|
<p>Some language tokenizers require external dependencies.</p>
|
||||||
</Table>
|
<Ul>
|
||||||
<Infobox title="Dependencies">
|
{withDeps.map(({ code, name, dependencies }) => (
|
||||||
<p>Some language tokenizers require external dependencies.</p>
|
<Li key={code}>
|
||||||
<Ul>
|
<strong>{name}:</strong>{' '}
|
||||||
{withDeps.map(({ code, name, dependencies }) => (
|
{join(
|
||||||
<Li key={code}>
|
dependencies.map((dep, i) => (
|
||||||
<strong>{name}:</strong>{' '}
|
<Link key={i} to={dep.url}>
|
||||||
{join(
|
{dep.name}
|
||||||
dependencies.map((dep, i) => (
|
</Link>
|
||||||
<Link key={i} to={dep.url}>
|
))
|
||||||
{dep.name}
|
)}
|
||||||
</Link>
|
</Li>
|
||||||
))
|
))}
|
||||||
)}
|
</Ul>
|
||||||
</Li>
|
</Infobox>
|
||||||
))}
|
</>
|
||||||
</Ul>
|
)
|
||||||
</Infobox>
|
}
|
||||||
</>
|
|
||||||
)
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
)
|
|
||||||
|
|
||||||
export default Languages
|
export default Languages
|
||||||
|
|
||||||
const query = graphql`
|
|
||||||
query LanguagesQuery {
|
|
||||||
site {
|
|
||||||
siteMetadata {
|
|
||||||
languages {
|
|
||||||
code
|
|
||||||
name
|
|
||||||
models
|
|
||||||
dependencies {
|
|
||||||
name
|
|
||||||
url
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
`
|
|
||||||
|
|
|
@ -1,8 +1,9 @@
|
||||||
import React, { useState } from 'react'
|
import React, { useState } from 'react'
|
||||||
import { StaticQuery, graphql } from 'gatsby'
|
|
||||||
|
|
||||||
import { Quickstart, QS } from '../components/quickstart'
|
import { Quickstart, QS } from '../components/quickstart'
|
||||||
import { repo, DEFAULT_BRANCH } from '../components/util'
|
import { repo, DEFAULT_BRANCH } from '../components/util'
|
||||||
|
import siteMetadata from '../../meta/site.json'
|
||||||
|
import models from '../../meta/languages.json'
|
||||||
|
|
||||||
const DEFAULT_OS = 'mac'
|
const DEFAULT_OS = 'mac'
|
||||||
const DEFAULT_PLATFORM = 'x86'
|
const DEFAULT_PLATFORM = 'x86'
|
||||||
|
@ -51,215 +52,178 @@ const QuickstartInstall = ({ id, title }) => {
|
||||||
]
|
]
|
||||||
.filter((e) => e)
|
.filter((e) => e)
|
||||||
.join(',')
|
.join(',')
|
||||||
return (
|
|
||||||
<StaticQuery
|
|
||||||
query={query}
|
|
||||||
render={({ site }) => {
|
|
||||||
const { nightly, languages } = site.siteMetadata
|
|
||||||
const pkg = nightly ? 'spacy-nightly' : 'spacy'
|
|
||||||
const models = languages.filter(({ models }) => models !== null)
|
|
||||||
const data = [
|
|
||||||
{
|
|
||||||
id: 'os',
|
|
||||||
title: 'Operating system',
|
|
||||||
options: [
|
|
||||||
{ id: 'mac', title: 'macOS / OSX', checked: true },
|
|
||||||
{ id: 'windows', title: 'Windows' },
|
|
||||||
{ id: 'linux', title: 'Linux' },
|
|
||||||
],
|
|
||||||
defaultValue: DEFAULT_OS,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'platform',
|
|
||||||
title: 'Platform',
|
|
||||||
options: [
|
|
||||||
{ id: 'x86', title: 'x86', checked: true },
|
|
||||||
{ id: 'arm', title: 'ARM / M1' },
|
|
||||||
],
|
|
||||||
defaultValue: DEFAULT_PLATFORM,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'package',
|
|
||||||
title: 'Package manager',
|
|
||||||
options: [
|
|
||||||
{ id: 'pip', title: 'pip', checked: true },
|
|
||||||
!nightly ? { id: 'conda', title: 'conda' } : null,
|
|
||||||
{ id: 'source', title: 'from source' },
|
|
||||||
].filter((o) => o),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'hardware',
|
|
||||||
title: 'Hardware',
|
|
||||||
options: [
|
|
||||||
{ id: 'cpu', title: 'CPU', checked: DEFAULT_HARDWARE === 'cpu' },
|
|
||||||
{ id: 'gpu', title: 'GPU', checked: DEFAULT_HARDWARE == 'gpu' },
|
|
||||||
],
|
|
||||||
dropdown: Object.keys(CUDA).map((id) => ({
|
|
||||||
id: CUDA[id],
|
|
||||||
title: `CUDA ${id}`,
|
|
||||||
})),
|
|
||||||
defaultValue: DEFAULT_CUDA,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'config',
|
|
||||||
title: 'Configuration',
|
|
||||||
multiple: true,
|
|
||||||
options: [
|
|
||||||
{
|
|
||||||
id: 'venv',
|
|
||||||
title: 'virtual env',
|
|
||||||
help: 'Use a virtual environment',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'train',
|
|
||||||
title: 'train models',
|
|
||||||
help: 'Check this if you plan to train your own models with spaCy to install extra dependencies and data resources',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'models',
|
|
||||||
title: 'Trained pipelines',
|
|
||||||
multiple: true,
|
|
||||||
options: models
|
|
||||||
.sort((a, b) => a.name.localeCompare(b.name))
|
|
||||||
.map(({ code, name }) => ({
|
|
||||||
id: code,
|
|
||||||
title: name,
|
|
||||||
checked: DEFAULT_MODELS.includes(code),
|
|
||||||
})),
|
|
||||||
},
|
|
||||||
]
|
|
||||||
if (selectedModels.length) {
|
|
||||||
data.push({
|
|
||||||
id: 'optimize',
|
|
||||||
title: 'Select pipeline for',
|
|
||||||
options: [
|
|
||||||
{
|
|
||||||
id: 'efficiency',
|
|
||||||
title: 'efficiency',
|
|
||||||
checked: DEFAULT_OPT === 'efficiency',
|
|
||||||
help: 'Faster and smaller pipeline, but less accurate',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'accuracy',
|
|
||||||
title: 'accuracy',
|
|
||||||
checked: DEFAULT_OPT === 'accuracy',
|
|
||||||
help: 'Larger and slower pipeline, but more accurate',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
})
|
|
||||||
}
|
|
||||||
return (
|
|
||||||
<Quickstart
|
|
||||||
data={data}
|
|
||||||
title={title}
|
|
||||||
id={id}
|
|
||||||
setters={setters}
|
|
||||||
showDropdown={showDropdown}
|
|
||||||
>
|
|
||||||
<QS os="mac" hardware="gpu" platform="arm">
|
|
||||||
# Note M1 GPU support is experimental, see{' '}
|
|
||||||
<a href="https://github.com/explosion/thinc/issues/792">
|
|
||||||
Thinc issue #792
|
|
||||||
</a>
|
|
||||||
</QS>
|
|
||||||
<QS package="pip" config="venv">
|
|
||||||
python -m venv .env
|
|
||||||
</QS>
|
|
||||||
<QS package="pip" config="venv" os="mac">
|
|
||||||
source .env/bin/activate
|
|
||||||
</QS>
|
|
||||||
<QS package="pip" config="venv" os="linux">
|
|
||||||
source .env/bin/activate
|
|
||||||
</QS>
|
|
||||||
<QS package="pip" config="venv" os="windows">
|
|
||||||
.env\Scripts\activate
|
|
||||||
</QS>
|
|
||||||
<QS package="source" config="venv">
|
|
||||||
python -m venv .env
|
|
||||||
</QS>
|
|
||||||
<QS package="source" config="venv" os="mac">
|
|
||||||
source .env/bin/activate
|
|
||||||
</QS>
|
|
||||||
<QS package="source" config="venv" os="linux">
|
|
||||||
source .env/bin/activate
|
|
||||||
</QS>
|
|
||||||
<QS package="source" config="venv" os="windows">
|
|
||||||
.env\Scripts\activate
|
|
||||||
</QS>
|
|
||||||
<QS package="conda" config="venv">
|
|
||||||
conda create -n venv
|
|
||||||
</QS>
|
|
||||||
<QS package="conda" config="venv">
|
|
||||||
conda activate venv
|
|
||||||
</QS>
|
|
||||||
<QS package="pip">pip install -U pip setuptools wheel</QS>
|
|
||||||
<QS package="source">pip install -U pip setuptools wheel</QS>
|
|
||||||
<QS package="pip">
|
|
||||||
{pipExtras
|
|
||||||
? `pip install -U '${pkg}[${pipExtras}]'`
|
|
||||||
: `pip install -U ${pkg}`}
|
|
||||||
{nightly ? ' --pre' : ''}
|
|
||||||
</QS>
|
|
||||||
<QS package="conda">conda install -c conda-forge spacy</QS>
|
|
||||||
<QS package="conda" hardware="gpu" os="windows">
|
|
||||||
conda install -c conda-forge cupy
|
|
||||||
</QS>
|
|
||||||
<QS package="conda" hardware="gpu" os="linux">
|
|
||||||
conda install -c conda-forge cupy
|
|
||||||
</QS>
|
|
||||||
<QS package="conda" hardware="gpu" os="mac" platform="x86">
|
|
||||||
conda install -c conda-forge cupy
|
|
||||||
</QS>
|
|
||||||
<QS package="conda" config="train">
|
|
||||||
conda install -c conda-forge spacy-transformers
|
|
||||||
</QS>
|
|
||||||
<QS package="source">
|
|
||||||
git clone https://github.com/{repo}
|
|
||||||
{nightly ? ` --branch ${DEFAULT_BRANCH}` : ''}
|
|
||||||
</QS>
|
|
||||||
<QS package="source">cd spaCy</QS>
|
|
||||||
<QS package="source">pip install -r requirements.txt</QS>
|
|
||||||
<QS package="source">
|
|
||||||
pip install --no-build-isolation --editable{' '}
|
|
||||||
{train || hardware == 'gpu' ? `'.[${pipExtras}]'` : '.'}
|
|
||||||
</QS>
|
|
||||||
<QS config="train" package="conda" comment prompt={false}>
|
|
||||||
# packages only available via pip
|
|
||||||
</QS>
|
|
||||||
<QS config="train" package="conda">
|
|
||||||
pip install spacy-lookups-data
|
|
||||||
</QS>
|
|
||||||
|
|
||||||
{models.map(({ code, models: modelOptions }) => {
|
const { nightly } = siteMetadata
|
||||||
const pkg = modelOptions[efficiency ? 0 : modelOptions.length - 1]
|
const pkg = nightly ? 'spacy-nightly' : 'spacy'
|
||||||
return (
|
const languages = models.languages.filter(({ models }) => !!models)
|
||||||
<QS models={code} key={code}>
|
const data = [
|
||||||
python -m spacy download {pkg}
|
{
|
||||||
</QS>
|
id: 'os',
|
||||||
)
|
title: 'Operating system',
|
||||||
})}
|
options: [
|
||||||
</Quickstart>
|
{ id: 'mac', title: 'macOS / OSX', checked: true },
|
||||||
|
{ id: 'windows', title: 'Windows' },
|
||||||
|
{ id: 'linux', title: 'Linux' },
|
||||||
|
],
|
||||||
|
defaultValue: DEFAULT_OS,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'platform',
|
||||||
|
title: 'Platform',
|
||||||
|
options: [
|
||||||
|
{ id: 'x86', title: 'x86', checked: true },
|
||||||
|
{ id: 'arm', title: 'ARM / M1' },
|
||||||
|
],
|
||||||
|
defaultValue: DEFAULT_PLATFORM,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'package',
|
||||||
|
title: 'Package manager',
|
||||||
|
options: [
|
||||||
|
{ id: 'pip', title: 'pip', checked: true },
|
||||||
|
!nightly ? { id: 'conda', title: 'conda' } : null,
|
||||||
|
{ id: 'source', title: 'from source' },
|
||||||
|
].filter((o) => o),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'hardware',
|
||||||
|
title: 'Hardware',
|
||||||
|
options: [
|
||||||
|
{ id: 'cpu', title: 'CPU', checked: DEFAULT_HARDWARE === 'cpu' },
|
||||||
|
{ id: 'gpu', title: 'GPU', checked: DEFAULT_HARDWARE == 'gpu' },
|
||||||
|
],
|
||||||
|
dropdown: Object.keys(CUDA).map((id) => ({
|
||||||
|
id: CUDA[id],
|
||||||
|
title: `CUDA ${id}`,
|
||||||
|
})),
|
||||||
|
defaultValue: DEFAULT_CUDA,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'config',
|
||||||
|
title: 'Configuration',
|
||||||
|
multiple: true,
|
||||||
|
options: [
|
||||||
|
{
|
||||||
|
id: 'venv',
|
||||||
|
title: 'virtual env',
|
||||||
|
help: 'Use a virtual environment',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'train',
|
||||||
|
title: 'train models',
|
||||||
|
help: 'Check this if you plan to train your own models with spaCy to install extra dependencies and data resources',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'models',
|
||||||
|
title: 'Trained pipelines',
|
||||||
|
multiple: true,
|
||||||
|
options: languages
|
||||||
|
.sort((a, b) => a.name.localeCompare(b.name))
|
||||||
|
.map(({ code, name }) => ({
|
||||||
|
id: code,
|
||||||
|
title: name,
|
||||||
|
checked: DEFAULT_MODELS.includes(code),
|
||||||
|
})),
|
||||||
|
},
|
||||||
|
]
|
||||||
|
if (selectedModels.length) {
|
||||||
|
data.push({
|
||||||
|
id: 'optimize',
|
||||||
|
title: 'Select pipeline for',
|
||||||
|
options: [
|
||||||
|
{
|
||||||
|
id: 'efficiency',
|
||||||
|
title: 'efficiency',
|
||||||
|
checked: DEFAULT_OPT === 'efficiency',
|
||||||
|
help: 'Faster and smaller pipeline, but less accurate',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'accuracy',
|
||||||
|
title: 'accuracy',
|
||||||
|
checked: DEFAULT_OPT === 'accuracy',
|
||||||
|
help: 'Larger and slower pipeline, but more accurate',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
})
|
||||||
|
}
|
||||||
|
return (
|
||||||
|
<Quickstart data={data} title={title} id={id} setters={setters} showDropdown={showDropdown}>
|
||||||
|
<QS os="mac" hardware="gpu" platform="arm">
|
||||||
|
# Note M1 GPU support is experimental, see{' '}
|
||||||
|
<a href="https://github.com/explosion/thinc/issues/792">Thinc issue #792</a>
|
||||||
|
</QS>
|
||||||
|
<QS package="pip" config="venv">
|
||||||
|
python -m venv .env
|
||||||
|
</QS>
|
||||||
|
<QS package="pip" config="venv" os="mac">
|
||||||
|
source .env/bin/activate
|
||||||
|
</QS>
|
||||||
|
<QS package="pip" config="venv" os="linux">
|
||||||
|
source .env/bin/activate
|
||||||
|
</QS>
|
||||||
|
<QS package="pip" config="venv" os="windows">
|
||||||
|
.env\Scripts\activate
|
||||||
|
</QS>
|
||||||
|
<QS package="source" config="venv">
|
||||||
|
python -m venv .env
|
||||||
|
</QS>
|
||||||
|
<QS package="source" config="venv" os="mac">
|
||||||
|
source .env/bin/activate
|
||||||
|
</QS>
|
||||||
|
<QS package="source" config="venv" os="linux">
|
||||||
|
source .env/bin/activate
|
||||||
|
</QS>
|
||||||
|
<QS package="source" config="venv" os="windows">
|
||||||
|
.env\Scripts\activate
|
||||||
|
</QS>
|
||||||
|
<QS package="conda" config="venv">
|
||||||
|
conda create -n venv
|
||||||
|
</QS>
|
||||||
|
<QS package="conda" config="venv">
|
||||||
|
conda activate venv
|
||||||
|
</QS>
|
||||||
|
<QS package="pip">pip install -U pip setuptools wheel</QS>
|
||||||
|
<QS package="source">pip install -U pip setuptools wheel</QS>
|
||||||
|
<QS package="pip">
|
||||||
|
{pipExtras ? `pip install -U '${pkg}[${pipExtras}]'` : `pip install -U ${pkg}`}
|
||||||
|
{nightly ? ' --pre' : ''}
|
||||||
|
</QS>
|
||||||
|
<QS package="conda">conda install -c conda-forge spacy</QS>
|
||||||
|
<QS package="conda" hardware="gpu">
|
||||||
|
conda install -c conda-forge cupy
|
||||||
|
</QS>
|
||||||
|
<QS package="conda" config="train">
|
||||||
|
conda install -c conda-forge spacy-transformers
|
||||||
|
</QS>
|
||||||
|
<QS package="source">
|
||||||
|
git clone https://github.com/{repo}
|
||||||
|
{nightly ? ` --branch ${DEFAULT_BRANCH}` : ''}
|
||||||
|
</QS>
|
||||||
|
<QS package="source">cd spaCy</QS>
|
||||||
|
<QS package="source">pip install -r requirements.txt</QS>
|
||||||
|
<QS package="source">
|
||||||
|
pip install --no-build-isolation --editable{' '}
|
||||||
|
{train || hardware == 'gpu' ? `'.[${pipExtras}]'` : '.'}
|
||||||
|
</QS>
|
||||||
|
<QS config="train" package="conda" comment prompt={false}>
|
||||||
|
# packages only available via pip
|
||||||
|
</QS>
|
||||||
|
<QS config="train" package="conda">
|
||||||
|
pip install spacy-lookups-data
|
||||||
|
</QS>
|
||||||
|
|
||||||
|
{languages.map(({ code, models: modelOptions }) => {
|
||||||
|
const pkg = modelOptions[efficiency ? 0 : modelOptions.length - 1]
|
||||||
|
return (
|
||||||
|
<QS models={code} key={code}>
|
||||||
|
python -m spacy download {pkg}
|
||||||
|
</QS>
|
||||||
)
|
)
|
||||||
}}
|
})}
|
||||||
/>
|
</Quickstart>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
export default QuickstartInstall
|
export default QuickstartInstall
|
||||||
|
|
||||||
const query = graphql`
|
|
||||||
query QuickstartInstallQuery {
|
|
||||||
site {
|
|
||||||
siteMetadata {
|
|
||||||
nightly
|
|
||||||
languages {
|
|
||||||
code
|
|
||||||
name
|
|
||||||
models
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
`
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import React, { Fragment, useState } from 'react'
|
import React, { Fragment, useState } from 'react'
|
||||||
import { StaticQuery, graphql } from 'gatsby'
|
|
||||||
|
|
||||||
import { Quickstart, QS } from '../components/quickstart'
|
import { Quickstart, QS } from '../components/quickstart'
|
||||||
|
import models from '../../meta/languages.json'
|
||||||
|
|
||||||
const DEFAULT_LANG = 'en'
|
const DEFAULT_LANG = 'en'
|
||||||
const DEFAULT_OPT = 'efficiency'
|
const DEFAULT_OPT = 'efficiency'
|
||||||
|
@ -62,80 +62,59 @@ const QuickstartInstall = ({ id, title, description, children }) => {
|
||||||
lang: setLang,
|
lang: setLang,
|
||||||
optimize: (v) => setEfficiency(v.includes('efficiency')),
|
optimize: (v) => setEfficiency(v.includes('efficiency')),
|
||||||
}
|
}
|
||||||
return (
|
|
||||||
<StaticQuery
|
|
||||||
query={query}
|
|
||||||
render={({ site }) => {
|
|
||||||
const models = site.siteMetadata.languages.filter(({ models }) => models !== null)
|
|
||||||
data[0].dropdown = models
|
|
||||||
.sort((a, b) => a.name.localeCompare(b.name))
|
|
||||||
.map(({ code, name }) => ({
|
|
||||||
id: code,
|
|
||||||
title: name,
|
|
||||||
}))
|
|
||||||
return (
|
|
||||||
<Quickstart
|
|
||||||
data={data}
|
|
||||||
title={title}
|
|
||||||
id={id}
|
|
||||||
description={description}
|
|
||||||
setters={setters}
|
|
||||||
copy={false}
|
|
||||||
>
|
|
||||||
{models.map(({ code, models, example }) => {
|
|
||||||
const pkg = efficiency ? models[0] : models[models.length - 1]
|
|
||||||
const exampleText = example || 'No text available yet'
|
|
||||||
return lang !== code ? null : (
|
|
||||||
<Fragment key={code}>
|
|
||||||
<QS>python -m spacy download {pkg}</QS>
|
|
||||||
<QS divider />
|
|
||||||
<QS load="spacy" prompt="python">
|
|
||||||
import spacy
|
|
||||||
</QS>
|
|
||||||
<QS load="spacy" prompt="python">
|
|
||||||
nlp = spacy.load("{pkg}")
|
|
||||||
</QS>
|
|
||||||
<QS load="module" prompt="python">
|
|
||||||
import {pkg}
|
|
||||||
</QS>
|
|
||||||
<QS load="module" prompt="python">
|
|
||||||
nlp = {pkg}.load()
|
|
||||||
</QS>
|
|
||||||
<QS config="example" prompt="python">
|
|
||||||
doc = nlp("{exampleText}")
|
|
||||||
</QS>
|
|
||||||
<QS config="example" prompt="python">
|
|
||||||
print([
|
|
||||||
{code === 'xx'
|
|
||||||
? '(ent.text, ent.label) for ent in doc.ents'
|
|
||||||
: '(w.text, w.pos_) for w in doc'}
|
|
||||||
])
|
|
||||||
</QS>
|
|
||||||
</Fragment>
|
|
||||||
)
|
|
||||||
})}
|
|
||||||
|
|
||||||
{children}
|
const languages = models.languages.filter(({ models }) => !!models)
|
||||||
</Quickstart>
|
data[0].dropdown = languages
|
||||||
|
.sort((a, b) => a.name.localeCompare(b.name))
|
||||||
|
.map(({ code, name }) => ({
|
||||||
|
id: code,
|
||||||
|
title: name,
|
||||||
|
}))
|
||||||
|
return (
|
||||||
|
<Quickstart
|
||||||
|
data={data}
|
||||||
|
title={title}
|
||||||
|
id={id}
|
||||||
|
description={description}
|
||||||
|
setters={setters}
|
||||||
|
copy={false}
|
||||||
|
>
|
||||||
|
{languages.map(({ code, models, example }) => {
|
||||||
|
const pkg = efficiency ? models[0] : models[models.length - 1]
|
||||||
|
const exampleText = example || 'No text available yet'
|
||||||
|
return lang !== code ? null : (
|
||||||
|
<Fragment key={code}>
|
||||||
|
<QS>python -m spacy download {pkg}</QS>
|
||||||
|
<QS divider />
|
||||||
|
<QS load="spacy" prompt="python">
|
||||||
|
import spacy
|
||||||
|
</QS>
|
||||||
|
<QS load="spacy" prompt="python">
|
||||||
|
nlp = spacy.load("{pkg}")
|
||||||
|
</QS>
|
||||||
|
<QS load="module" prompt="python">
|
||||||
|
import {pkg}
|
||||||
|
</QS>
|
||||||
|
<QS load="module" prompt="python">
|
||||||
|
nlp = {pkg}.load()
|
||||||
|
</QS>
|
||||||
|
<QS config="example" prompt="python">
|
||||||
|
doc = nlp("{exampleText}")
|
||||||
|
</QS>
|
||||||
|
<QS config="example" prompt="python">
|
||||||
|
print([
|
||||||
|
{code === 'xx'
|
||||||
|
? '(ent.text, ent.label) for ent in doc.ents'
|
||||||
|
: '(w.text, w.pos_) for w in doc'}
|
||||||
|
])
|
||||||
|
</QS>
|
||||||
|
</Fragment>
|
||||||
)
|
)
|
||||||
}}
|
})}
|
||||||
/>
|
|
||||||
|
{children}
|
||||||
|
</Quickstart>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
export default QuickstartInstall
|
export default QuickstartInstall
|
||||||
|
|
||||||
const query = graphql`
|
|
||||||
query QuickstartModelsQuery {
|
|
||||||
site {
|
|
||||||
siteMetadata {
|
|
||||||
languages {
|
|
||||||
code
|
|
||||||
name
|
|
||||||
models
|
|
||||||
example
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
`
|
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
import React, { useState } from 'react'
|
import React, { useState } from 'react'
|
||||||
import { StaticQuery, graphql } from 'gatsby'
|
|
||||||
import highlightCode from 'gatsby-remark-prismjs/highlight-code.js'
|
import highlightCode from 'gatsby-remark-prismjs/highlight-code.js'
|
||||||
|
|
||||||
import { Quickstart } from '../components/quickstart'
|
import { Quickstart } from '../components/quickstart'
|
||||||
import generator, { DATA as GENERATOR_DATA } from './quickstart-training-generator'
|
import generator, { DATA as GENERATOR_DATA } from './quickstart-training-generator'
|
||||||
import { htmlToReact } from '../components/util'
|
import { htmlToReact } from '../components/util'
|
||||||
|
import models from '../../meta/languages.json'
|
||||||
|
|
||||||
const DEFAULT_LANG = 'en'
|
const DEFAULT_LANG = 'en'
|
||||||
const DEFAULT_HARDWARE = 'cpu'
|
const DEFAULT_HARDWARE = 'cpu'
|
||||||
|
@ -112,43 +112,18 @@ export default function QuickstartTraining({ id, title, download = 'base_config.
|
||||||
.split('\n')
|
.split('\n')
|
||||||
.map((line) => (line.startsWith('#') ? `<span class="token comment">${line}</span>` : line))
|
.map((line) => (line.startsWith('#') ? `<span class="token comment">${line}</span>` : line))
|
||||||
.join('\n')
|
.join('\n')
|
||||||
|
|
||||||
|
let data = DATA
|
||||||
|
data[0].dropdown = models.languages
|
||||||
|
.map(({ name, code }) => ({
|
||||||
|
id: code,
|
||||||
|
title: name,
|
||||||
|
}))
|
||||||
|
.sort((a, b) => a.title.localeCompare(b.title))
|
||||||
|
if (!_components.includes('textcat')) {
|
||||||
|
data = data.map((field) => (field.id === 'textcat' ? { ...field, hidden: true } : field))
|
||||||
|
}
|
||||||
return (
|
return (
|
||||||
<<<<<<< Updated upstream
|
|
||||||
<StaticQuery
|
|
||||||
query={query}
|
|
||||||
render={({ site }) => {
|
|
||||||
let data = DATA
|
|
||||||
const langs = site.siteMetadata.languages
|
|
||||||
data[0].dropdown = langs
|
|
||||||
.map(({ name, code }) => ({
|
|
||||||
id: code,
|
|
||||||
title: name,
|
|
||||||
}))
|
|
||||||
.sort((a, b) => a.title.localeCompare(b.title))
|
|
||||||
if (!_components.includes('textcat')) {
|
|
||||||
data = data.map((field) =>
|
|
||||||
field.id === 'textcat' ? { ...field, hidden: true } : field
|
|
||||||
)
|
|
||||||
}
|
|
||||||
return (
|
|
||||||
<Quickstart
|
|
||||||
Container="div"
|
|
||||||
download={download}
|
|
||||||
rawContent={rawContent}
|
|
||||||
data={data}
|
|
||||||
title={title}
|
|
||||||
id={id}
|
|
||||||
setters={setters}
|
|
||||||
hidePrompts
|
|
||||||
small
|
|
||||||
codeLang="ini"
|
|
||||||
>
|
|
||||||
{htmlToReact(displayContent)}
|
|
||||||
</Quickstart>
|
|
||||||
)
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
=======
|
|
||||||
<Quickstart
|
<Quickstart
|
||||||
Container="div"
|
Container="div"
|
||||||
download={download}
|
download={download}
|
||||||
|
@ -163,19 +138,5 @@ export default function QuickstartTraining({ id, title, download = 'base_config.
|
||||||
>
|
>
|
||||||
{htmlToReact(displayContent)}
|
{htmlToReact(displayContent)}
|
||||||
</Quickstart>
|
</Quickstart>
|
||||||
>>>>>>> Stashed changes
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
const query = graphql`
|
|
||||||
query QuickstartTrainingQuery {
|
|
||||||
site {
|
|
||||||
siteMetadata {
|
|
||||||
languages {
|
|
||||||
code
|
|
||||||
name
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
`
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user