Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/cedricdelpoux/gatsby-source-google-docs
Gatsby plugin to use Google Docs as a data source
https://github.com/cedricdelpoux/gatsby-source-google-docs
gatsby gatsby-plugin gatsby-plugin-source gatsby-plugins google-docs google-docs-api google-drive-api
Last synced: 2 months ago
JSON representation
Gatsby plugin to use Google Docs as a data source
- Host: GitHub
- URL: https://github.com/cedricdelpoux/gatsby-source-google-docs
- Owner: cedricdelpoux
- License: mit
- Created: 2019-02-05T09:59:24.000Z (almost 6 years ago)
- Default Branch: master
- Last Pushed: 2024-09-10T08:50:57.000Z (4 months ago)
- Last Synced: 2024-09-14T15:20:26.229Z (4 months ago)
- Topics: gatsby, gatsby-plugin, gatsby-plugin-source, gatsby-plugins, google-docs, google-docs-api, google-drive-api
- Language: JavaScript
- Homepage: https://cedricdelpoux.github.io/gatsby-source-google-docs/
- Size: 18.6 MB
- Stars: 212
- Watchers: 6
- Forks: 55
- Open Issues: 5
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- Funding: .github/FUNDING.yml
Awesome Lists containing this project
- awesome - gatsby-source-google-docs - Gatsby plugin to use Google Docs as a data source (JavaScript)
- awesome-list - gatsby-source-google-docs
README
gatsby-source-google-docs
[![Npm][badge-npm]][npm]
[![Build Status][badge-build]][travis]
[![Coverage][badge-coverage]][codecov]
[![Downloads][badge-downloads]][npm]
[![PRs welcome][badge-prs]](#contributing)
[![MIT license][badge-licence]](./LICENCE.md)
[![Paypal][badge-paypal]](https://paypal.me/cedricdelpoux)---
`gatsby-source-google-docs` is a [Gatsby](https://www.gatsbyjs.org/) plugin to use [Google Docs](https://docs.google.com/) as a data source.
Why use Google Docs to write your content ?
- 🖋 Best online WYSIWYG editor
- 🖥 Desktop web app
- 📱 Mobile app
- 🛩 Offline redaction
- 🔥 No need for external CMS
- ✅ No more content in your source code## Features
- **Google Docs** formatting options (headings, bullets, tables, images...)
- `MDX` support to use `` in your documents
- **Gatsby** v3 & v4 support
- `gatsby-plugin-image` and `gatsby-image` support
- 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](https://cedricdelpoux.github.io/gatsby-source-google-docs/).
- 👨🏻💻 [Source code](/examples/website)
- 🗂 [Google Docs content](https://drive.google.com/drive/folders/1YJWX_FRoVusp-51ztedm6HSZqpbJA3ag)> 💯 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](/examples/website))
```shell
yarn add gatsby-source-google-docs gatsby-transformer-remark
```- `gatsby-source-google-docs` transform **Google Docs** to **Markdown**
- `gatsby-transformer-remark` transform **Markdown** to **HTML**
- `gatsby-plugin-mdx` transform **Markdown** to **MDX**## Token generation
The package needs 3 `.env` variables.
Preview variables
```dotenv
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```shell
npx gatsby-source-google-docs-token
```## Usage
### Organize your documents
Go to your [Google Drive](https://drive.google.com/drive/), create a folder and put some documents inside it.
```js
↳ 🗂 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`
```🤡 How to enhance documents with metadata?
- Fill the document (or folder) `description` field in Google Drive with a `YAML` object
```yaml
locale: fr
template: post
category: Category Name
tags: [tag1, tag2]
slug: /custom-slug
date: 2019-01-01
```> There are special metadata
>
> - For folders:
> - `exclude: true`: Exclude the folder and its documents
> - `skip: true`: Remove the folder from slug but keep its documents
> - For documents:
> - `index:true`: Use document as the folder index
> - `page: false`: Prevent page creation when `createPages` option is set to `true`- Spread metadata into the tree using folders metadata.
> ⬆️ For the tree example above:
>
> - Every node will have `template: page` defined as default excepts if you redefine it later.
> - You need to create 3 different templates: `page` (default), `home`, `post`. [Checkout the example template](./example/src/templates/page.js)
> - "en" folder will be removed from slug because of `skip: true`- Exclude folders and documents using `exclude: true`. Perfect to keep drafts documents. One you want to publish a page, juste move the document one level up.
> ⬆️ For the tree example above:
>
> - Documents under `Drafts` will be exclude because of `exclude: true`.- Every metadata will be available in `GoogleDocs` nodes and you can use everywhere in you `Gatsby` site
🌄 How to add cover?
Add an image in your [Google Document first page header](https://support.google.com/docs/answer/86629)
🍞 How to add slug and breadcrumb?
`slug` and `breadcrumb` fields add automatically generated using the folders tree structure and transformed using `kebab-case`.
> ⬆️ For the tree example above:
> The `GoogleDocs` node for document `My year 2020`
>
> ```js
> {
> 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 !
> }
> ```
>
> The `GoogleDocs` node for document `Post 2` will have a custom slug
>
> ```js
> {
> 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
> }
> ```You also can add metadata (`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` |```js
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](https://using-gatsby-image.gatsbyjs.org/blur-up/).
```shell
yarn add gatsby-plugin-sharp gatsby-transformer-sharp gatsby-remark-images
``````js
module.exports = {
plugins: [
"gatsby-source-google-docs",
"gatsby-plugin-sharp",
"gatsby-transformer-sharp",
{
resolve: "gatsby-transformer-remark",
options: {
plugins: ["gatsby-remark-images"],
},
},
],
}
```⚛️ How to use codes blocks ?
Use [Code Blocks](https://gsuite.google.com/marketplace/app/code_blocks/100740430168) 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 `lang:javascript`.
To get Syntax highlighting, I recommend using `prismjs` but it's not mandatory.
```shell
yarn add gatsby-remark-prismjs prismjs
```Add the `gatsby-remark-prismjs` plugin to your `gatsby-config.js`
```js
module.exports = {
plugins: [
"gatsby-source-google-docs",
{
resolve: "gatsby-transformer-remark",
options: {
plugins: ["gatsby-remark-prismjs"],
},
},
],
}
```Import a `prismjs` theme in your `gatsby-browser.js`
```js
require("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: false` metadata for a document to prevent a page creation
Checkout the [example template](./example/src/templates/page.js) and adapt it to your needs.
> You can use `pageContext` option if you need extra data into the context of your pages.
How to create pages manualy?
If you prefer to create pages manualy, checkout the [createPages API](./src/utils/create-pages.js) et adapt it to your needs.
### Trigger production builds
- Go to [Google Drive example folder](https://drive.google.com/drive/folders/1YJWX_FRoVusp-51ztedm6HSZqpbJA3ag)
- 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:- [documentation](https://cedricdelpoux.github.io/gatsby-source-google-docs/)
- [cedricdelpoux](https://cedricdelpoux.fr/en)## Contributing
- ⇄ Pull/Merge requests and ★ Stars are always welcome.
- For bugs and feature requests, please [create an issue][github-issue].[badge-paypal]: https://img.shields.io/badge/sponsor-PayPal-3b7bbf.svg?style=flat-square
[badge-npm]: https://img.shields.io/npm/v/gatsby-source-google-docs.svg?style=flat-square
[badge-downloads]: https://img.shields.io/npm/dt/gatsby-source-google-docs.svg?style=flat-square
[badge-build]: https://img.shields.io/travis/cedricdelpoux/gatsby-source-google-docs/master?style=flat-square
[badge-coverage]: https://img.shields.io/codecov/c/github/cedricdelpoux/gatsby-source-google-docs/master.svg?style=flat-square
[badge-licence]: https://img.shields.io/badge/license-MIT-blue.svg?style=flat-square
[badge-prs]: https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square
[npm]: https://www.npmjs.org/package/gatsby-source-google-docs
[travis]: https://travis-ci.com/cedricdelpoux/gatsby-source-google-docs
[codecov]: https://codecov.io/gh/cedricdelpoux/gatsby-source-google-docs
[github-issue]: https://github.com/cedricdelpoux/gatsby-source-google-docs/issues/new