gatsby-source-google-docs is a Gatsby plugin to use Google Docs as a data source.
Why use Google Docs to write your content ?
Features
- Google Docs formatting options (headings, bullets, tables, images…)
MDXsupport to use<ReactComponents />in your documents- Gatsby v3 & v4 support
gatsby-plugin-imageandgatsby-imagesupport- Code blocs support
- Gatsby Cloud support
- Slug generation from Google Drive tree
- Crosslinks between pages
- Related content
- Custom metadata to enhance documents
Documentation
To preview what you can do, please checkout the documentation website.
- 👨🏻💻 Source code
- 🗂 Google Docs content
💯 100% content of the website is from Google Docs. Please suggest edits to improve it.
Installation
Download gatsby-source-google-docs and gatsby-transformer-remark (or gatsby-plugin-mdx for advanced usage)
yarn add gatsby-source-google-docs gatsby-transformer-remarkgatsby-source-google-docstransform Google Docs to Markdowngatsby-transformer-remarktransform Markdown to HTMLgatsby-plugin-mdxtransform Markdown to MDX
Token generation
The package needs 3 .env variables.
Preview variables
GOOGLE_OAUTH_CLIENT_ID=2...m.apps.googleusercontent.com
GOOGLE_OAUTH_CLIENT_SECRET=Q...axL
GOOGLE_DOCS_TOKEN={"access_token":"ya...J0","refresh_token":"1..mE","scope":"https://www.googleapis.com/auth/drive.metadata.readonly https://www.googleapis.com/auth/documents.readonly","token_type":"Bearer","expiry_date":1598284554759}
gatsby-source-google-docs expose a script to generate it.
- Open a terminal at the root of your project
- Type the following command
npx gatsby-source-google-docs-tokenUsage
Organize your documents
Go to your Google Drive, create a folder and put some documents inside it.
↳ 🗂 Root folder `template: page`
↳ 🗂 en `locale: en` `skip: true`
↳ 📝 Home `template: home`
↳ 📝 About
↳ 🗂 Posts `template: post`
↳ 🗂 Drafts `exclude: true`
↳ 📝 Draft 1
↳ 📝 My year 2020 `date: 2021-01-01`
↳ 📝 Post 2 `slug: /custom/slug` `template: special-post`
↳ 🗂 fr `locale: fr`
↳ 📝 Accueil `template: home`There are special metadata For folders: For documents: ⬆️ For the tree example above: ⬆️ For the tree example above:🤡 How to enhance documents with metadata?
description field in Google Drive with a YAML objectlocale: fr
template: post
category: Category Name
tags: [tag1, tag2]
slug: /custom-slug
date: 2019-01-01
exclude: true: Exclude the folder and its documentsskip: true: Remove the folder from slug but keep its documents
index:true: Use document as the folder indexpage: false: Prevent page creation when createPages option is set to true
template: page defined as default excepts if you redefine it later.page (default), home, post. Checkout the example templateskip: true
exclude: true. Perfect to keep drafts documents. One you want to publish a page, juste move the document one level up.
Drafts will be exclude because of exclude: true.
GoogleDocs nodes and you can use everywhere in you Gatsby site
Add an image in your Google Document first page header🌄 How to add cover?
⬆️ For the tree example above:
The The You also can add metadata (🍞 How to add slug and breadcrumb?
slug and breadcrumb fields add automatically generated using the folders tree structure and transformed using kebab-case.
GoogleDocs node for document My year 2020{
path: "/en/posts/my-year-2020" // Original Google Drive path
slug: "/posts/my-year-2020" // `en` is out because of `skip: true`
breadcrumb: [
{name: "Posts", slug: "/posts"},
{name: "My year 2020", slug: "/posts/my-year-2020"},
],
template: "post" ,// src/templates/post.js
locale: "fr",
date: "2021-01-01" // Fixed date !
}GoogleDocs node for document Post 2 will have a custom slug{
path: "/en/posts/post-2"
slug: "/custom/slug"
breadcrumb: [
{name: "Posts", slug: "/posts"},
{name: "Post 2", slug: "/custom/slug"},
],
template: "special-post", // src/templates/special-post.js
locale: "en",
date: "2020-09-12" // Google Drive document creation date
}locale, date, template, …) to your documents.
Add the plugin to your gatsby-config.js file
| Option | Required | Type | Default | Example |
|---|---|---|---|---|
| folder | true |
String | null |
"1Tn1dCbIc" |
| createPages | false |
Boolean | false |
true |
| pageContext | false |
Array | [] |
["locale"] |
| demoteHeadings | false |
Boolean | true |
false |
| imagesOptions | false |
Object | null |
{width: 512} |
| keepDefaultStyle | false |
Boolean | false |
true |
| skipCodes | false |
Boolean | false |
true |
| skipFootnotes | false |
Boolean | false |
true |
| skipHeadings | false |
Boolean | false |
true |
| skipImages | false |
Boolean | false |
true |
| skipLists | false |
Boolean | false |
true |
| skipQuotes | false |
Boolean | false |
true |
| skipTables | false |
Boolean | false |
true |
| debug | false |
Boolean | false |
true |
module.exports = {
plugins: [
{
resolve: "gatsby-source-google-docs",
options: {
// https://drive.google.com/drive/folders/FOLDER_ID
folder: "FOLDER_ID",
createPages: true,
},
},
"gatsby-transformer-remark",
//
// OR "gatsby-plugin-mdx" for advanced usage using MDX
//
// You need some transformations?
// Checkout https://www.gatsbyjs.com/plugins/?=gatsby-remark
// And pick-up some plugins
],
}📷 How to use images ?
gatsby-plugin-sharp, gatsby-transformer-sharp and gatsby-remark-images are required if you want to take advantage of gatsby-image blur-up technique.yarn add gatsby-plugin-sharp gatsby-transformer-sharp gatsby-remark-imagesmodule.exports = {
plugins: [
"gatsby-source-google-docs",
"gatsby-plugin-sharp",
"gatsby-transformer-sharp",
{
resolve: "gatsby-transformer-remark",
options: {
plugins: ["gatsby-remark-images"],
},
},
],
}
Use Code Blocks Google Docs extension to format your code blocks. To specify the lang, you need to add a fist line in your code block following the format To get Syntax highlighting, I recommend using Add the Import a ⚛️ How to use codes blocks ?
lang:javascript.prismjs but it’s not mandatory.yarn add gatsby-remark-prismjs prismjsgatsby-remark-prismjs plugin to your gatsby-config.jsmodule.exports = {
plugins: [
"gatsby-source-google-docs",
{
resolve: "gatsby-transformer-remark",
options: {
plugins: ["gatsby-remark-prismjs"],
},
},
],
}prismjs theme in your gatsby-browser.jsrequire("prismjs/themes/prism.css")
Create templates and pages
Using createPages: true option, pages will be created automatically.
You need to create templates and define wich template to use using YAML metadata.
You can set
page: falsemetadata for a document to prevent a page creation
Checkout the example template and adapt it to your needs.
You can use
pageContextoption if you need extra data into the context of your pages.
If you prefer to create pages manualy, checkout the createPages API et adapt it to your needs.How to create pages manualy?
Trigger production builds
- Go to Google Drive example folder
- Make a copy of Trigger Gatsby Build file using
Right Click -> Make a copy - Open your copy and update the Build Webhook URL in
A2 - Click the Deploy button to trigger a new build
This method works with any hosting services: Gatsby Cloud, Netlify…
Showcase
You are using gatsby-source-google-docs for your website? Thank you!
Please add the link bellow:
Contributing
- ⇄ Pull/Merge requests and ★ Stars are always welcome.
- For bugs and feature requests, please create an issue.