mirror of
https://github.com/explosion/spaCy.git
synced 2025-01-10 01:06:33 +03:00
145 lines
4.3 KiB
JavaScript
145 lines
4.3 KiB
JavaScript
import React from 'react'
|
|
import PropTypes from 'prop-types'
|
|
import Helmet from 'react-helmet'
|
|
import { StaticQuery, graphql } from 'gatsby'
|
|
|
|
import socialImageDefault from '../images/social_default.jpg'
|
|
import socialImageApi from '../images/social_api.jpg'
|
|
import socialImageUniverse from '../images/social_universe.jpg'
|
|
import socialImageNightly from '../images/social_nightly.jpg'
|
|
|
|
function getPageTitle(title, sitename, slogan, sectionTitle, nightly) {
|
|
if (sectionTitle && title) {
|
|
return `${title} · ${sitename} ${sectionTitle}${nightly ? ' (nightly)' : ''}`
|
|
}
|
|
if (title) {
|
|
return `${title} · ${sitename}`
|
|
}
|
|
return `${sitename} · ${slogan}`
|
|
}
|
|
|
|
function getImage(section, nightly) {
|
|
if (nightly) return socialImageNightly
|
|
if (section === 'api') return socialImageApi
|
|
if (section === 'universe') return socialImageUniverse
|
|
return socialImageDefault
|
|
}
|
|
|
|
export default function SEO({
|
|
description,
|
|
lang = 'en',
|
|
title,
|
|
section,
|
|
sectionTitle,
|
|
bodyClass,
|
|
nightly,
|
|
}) {
|
|
return (
|
|
<StaticQuery
|
|
query={query}
|
|
render={data => {
|
|
const siteMetadata = data.site.siteMetadata
|
|
const metaDescription = description || siteMetadata.description
|
|
const pageTitle = getPageTitle(
|
|
title,
|
|
siteMetadata.title,
|
|
siteMetadata.slogan,
|
|
sectionTitle,
|
|
nightly
|
|
)
|
|
const socialImage = siteMetadata.siteUrl + getImage(section, nightly)
|
|
const meta = [
|
|
{
|
|
name: 'description',
|
|
content: metaDescription,
|
|
},
|
|
{
|
|
property: 'og:title',
|
|
content: pageTitle,
|
|
},
|
|
{
|
|
property: 'og:description',
|
|
content: metaDescription,
|
|
},
|
|
{
|
|
property: 'og:type',
|
|
content: `website`,
|
|
},
|
|
{
|
|
property: 'og:site_name',
|
|
content: title,
|
|
},
|
|
{
|
|
property: 'og:image',
|
|
content: socialImage,
|
|
},
|
|
{
|
|
name: 'twitter:card',
|
|
content: 'summary_large_image',
|
|
},
|
|
{
|
|
name: 'twitter:image',
|
|
content: socialImage,
|
|
},
|
|
{
|
|
name: 'twitter:creator',
|
|
content: `@${siteMetadata.social.twitter}`,
|
|
},
|
|
{
|
|
name: 'twitter:site',
|
|
content: `@${siteMetadata.social.twitter}`,
|
|
},
|
|
{
|
|
name: 'twitter:title',
|
|
content: pageTitle,
|
|
},
|
|
{
|
|
name: 'twitter:description',
|
|
content: metaDescription,
|
|
},
|
|
{
|
|
name: 'docsearch:language',
|
|
content: lang,
|
|
},
|
|
]
|
|
|
|
return (
|
|
<Helmet
|
|
defer={false}
|
|
htmlAttributes={{ lang }}
|
|
bodyAttributes={{ class: bodyClass }}
|
|
title={pageTitle}
|
|
meta={meta}
|
|
/>
|
|
)
|
|
}}
|
|
/>
|
|
)
|
|
}
|
|
|
|
SEO.propTypes = {
|
|
description: PropTypes.string,
|
|
lang: PropTypes.string,
|
|
meta: PropTypes.array,
|
|
keywords: PropTypes.arrayOf(PropTypes.string),
|
|
title: PropTypes.string,
|
|
section: PropTypes.string,
|
|
bodyClass: PropTypes.string,
|
|
}
|
|
|
|
const query = graphql`
|
|
query DefaultSEOQuery {
|
|
site {
|
|
siteMetadata {
|
|
title
|
|
description
|
|
slogan
|
|
siteUrl
|
|
social {
|
|
twitter
|
|
}
|
|
}
|
|
}
|
|
}
|
|
`
|