280 lines
6.8 KiB
Markdown
280 lines
6.8 KiB
Markdown
# gatsby-transformer-remark
|
|
|
|
Parses Markdown files using [Remark](http://remark.js.org/).
|
|
|
|
## Install
|
|
|
|
`npm install --save gatsby-transformer-remark`
|
|
|
|
## How to use
|
|
|
|
```javascript
|
|
// In your gatsby-config.js
|
|
plugins: [
|
|
{
|
|
resolve: `gatsby-transformer-remark`,
|
|
options: {
|
|
// CommonMark mode (default: true)
|
|
commonmark: true,
|
|
// Footnotes mode (default: true)
|
|
footnotes: true,
|
|
// Pedantic mode (default: true)
|
|
pedantic: true,
|
|
// GitHub Flavored Markdown mode (default: true)
|
|
gfm: true,
|
|
// Plugins configs
|
|
plugins: [],
|
|
},
|
|
},
|
|
],
|
|
```
|
|
|
|
The following parts of `options` are passed down to Remark as options:
|
|
|
|
- `options.commonmark`
|
|
- `options.footnotes`
|
|
- `options.pedantic`
|
|
- `options.gfm`
|
|
|
|
The details of the Remark options above could be found in [`remark-parse`'s documentation](https://github.com/remarkjs/remark/tree/master/packages/remark-parse#processoruseparse-options)
|
|
|
|
A full explanation of how to use markdown in Gatsby can be found here:
|
|
[Creating a Blog with Gatsby](https://www.gatsbyjs.org/blog/2017-07-19-creating-a-blog-with-gatsby/)
|
|
|
|
There are many Gatsby Remark plugins which you can install to customize how Markdown is processed. Many of them are demoed at https://using-remark.gatsbyjs.org/. See also the [source code for using-remark](https://github.com/gatsbyjs/gatsby/tree/master/examples/using-remark).
|
|
|
|
## Parsing algorithm
|
|
|
|
It recognizes files with the following extensions as Markdown:
|
|
|
|
- md
|
|
- markdown
|
|
|
|
Each Markdown file is parsed into a node of type `MarkdownRemark`.
|
|
|
|
All frontmatter fields are converted into GraphQL fields. TODO link to docs on
|
|
auto-inferring types/fields.
|
|
|
|
This plugin adds additional fields to the `MarkdownRemark` GraphQL type
|
|
including `html`, `excerpt`, `headings`, etc. Other Gatsby plugins can also add
|
|
additional fields.
|
|
|
|
## How to query
|
|
|
|
A sample GraphQL query to get MarkdownRemark nodes:
|
|
|
|
```graphql
|
|
{
|
|
allMarkdownRemark {
|
|
edges {
|
|
node {
|
|
html
|
|
headings {
|
|
depth
|
|
value
|
|
}
|
|
frontmatter {
|
|
# Assumes you're using title in your frontmatter.
|
|
title
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
### Getting table of contents
|
|
|
|
Using the following GraphQL query you'll be able to get the table of contents
|
|
|
|
```graphql
|
|
{
|
|
allMarkdownRemark {
|
|
edges {
|
|
node {
|
|
html
|
|
tableOfContents
|
|
}
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
### Configuring the tableOfContents
|
|
|
|
By default the tableOfContents is using the field `slug` to generate URLs. You can however provide another field using the pathToSlugField parameter. **Note** that providing a non existing field will cause the result to be null. To alter the default values for tableOfContents generation, include values for `heading` (string) and/or `maxDepth` (number 1 to 6) in graphQL query. If a value for `heading` is given, the first heading that matches will be omitted and the toc is generated from the next heading of the same depth onwards. Value for `maxDepth` sets the maximum depth of the toc (i.e. if a maxDepth of 3 is set, only h1 to h3 headings will appear in the toc).
|
|
|
|
```graphql
|
|
{
|
|
allMarkdownRemark {
|
|
edges {
|
|
node {
|
|
html
|
|
tableOfContents(
|
|
pathToSlugField: "frontmatter.path"
|
|
heading: "only show toc from this heading onwards"
|
|
maxDepth: 2
|
|
)
|
|
frontmatter {
|
|
# Assumes you're using path in your frontmatter.
|
|
path
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
To pass default options to the plugin generating the tableOfContents, configure it in gatsby-config.js as shown below. The options shown below are the defaults used by the plugin.
|
|
|
|
```javascript
|
|
// In your gatsby-config.js
|
|
plugins: [
|
|
{
|
|
resolve: `gatsby-transformer-remark`,
|
|
options: {
|
|
tableOfContents: {
|
|
heading: null,
|
|
maxDepth: 6,
|
|
},
|
|
},
|
|
},
|
|
]
|
|
```
|
|
|
|
### Excerpts
|
|
|
|
#### Length
|
|
|
|
By default, excerpts have a maximum length of 140 characters. You can change the default using the `pruneLength` argument. For example, if you need 500 characters, you can specify:
|
|
|
|
```graphql
|
|
{
|
|
allMarkdownRemark {
|
|
edges {
|
|
node {
|
|
html
|
|
excerpt(pruneLength: 500)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
#### Format
|
|
|
|
By default, Gatsby will return excerpts as plain text. This might be useful for populating [opengraph](https://en.wikipedia.org/wiki/Facebook_Platform#Open_Graph_protocol) HTML tags for SEO reasons. You can also explicitly specify a `PLAIN` format like so:
|
|
|
|
```graphql
|
|
{
|
|
allMarkdownRemark {
|
|
edges {
|
|
node {
|
|
excerpt(format: PLAIN)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
It's also possible to ask Gatsby to return excerpts formatted as HTML. You might use this if you have a blog post whose an excerpt contains markdown content--e.g. header, link, etc.--and you want these links to render as HTML.
|
|
|
|
```graphql
|
|
{
|
|
allMarkdownRemark {
|
|
edges {
|
|
node {
|
|
excerpt(format: HTML)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
You can also get excerpts in Markdown format.
|
|
|
|
```graphql
|
|
{
|
|
allMarkdownRemark {
|
|
edges {
|
|
node {
|
|
excerpt(format: MARKDOWN)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
## gray-matter options
|
|
|
|
`gatsby-transformer-remark` uses [gray-matter](https://github.com/jonschlinkert/gray-matter) to parse markdown frontmatter, so you can specify any of the options mentioned [here](https://github.com/jonschlinkert/gray-matter#options) in the `gatsby-config.js` file.
|
|
|
|
### Example: Excerpts
|
|
|
|
If you don't want to use `pruneLength` for excerpts but a custom separator, you can specify an `excerpt_separator` in the `gatsby-config.js` file:
|
|
|
|
```javascript
|
|
{
|
|
"resolve": `gatsby-transformer-remark`,
|
|
"options": {
|
|
"excerpt_separator": `<!-- end -->`
|
|
}
|
|
}
|
|
```
|
|
|
|
Any file that does not have the given `excerpt_separator` will fall back to the default pruning method.
|
|
|
|
## Troubleshooting
|
|
|
|
### Excerpts for non-latin languages
|
|
|
|
By default, `excerpt` uses `underscore.string/prune` which doesn't handle non-latin characters ([https://github.com/epeli/underscore.string/issues/418](https://github.com/epeli/underscore.string/issues/418)).
|
|
|
|
If that is the case, you can set `truncate` option on `excerpt` field, like:
|
|
|
|
```graphql
|
|
{
|
|
markdownRemark {
|
|
excerpt(truncate: true)
|
|
}
|
|
}
|
|
```
|
|
|
|
### Excerpts for HTML embedded in Markdown files
|
|
|
|
If your Markdown file contains HTML `except` will not return a value.
|
|
|
|
In that case, you can set an `excerpt_separator` in the `gatsby-config.js` file:
|
|
|
|
```javascript
|
|
{
|
|
"resolve": `gatsby-transformer-remark`,
|
|
"options": {
|
|
"excerpt_separator": `<!-- endexcerpt -->`
|
|
}
|
|
}
|
|
```
|
|
|
|
Edit your Markdown files to include that HTML tag after the text you'd like to appear in the excerpt:
|
|
|
|
```markdown
|
|
---
|
|
title: "my little pony"
|
|
date: "2017-09-18T23:19:51.246Z"
|
|
---
|
|
|
|
<p>Where oh where is that pony?</p>
|
|
<!-- endexcerpt -->
|
|
<p>Is he in the stable or down by the stream?</p>
|
|
```
|
|
|
|
Then specify `MARKDOWN` as the format in your graphql query:
|
|
|
|
```graphql
|
|
{
|
|
markdownRemark {
|
|
excerpt(format: MARKDOWN)
|
|
}
|
|
}
|
|
```
|