Gatsby: рдкреНрд░рд╢реНрди - рдлреНрд░рдВрдЯрдореИрдЯрд░ рд╕реЗ рдорд╛рд░реНрдХрдбрд╛рдЙрди рдХреИрд╕реЗ рдкрдврд╝реЗрдВ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 17 рдЕрдкреНрд░реИрд▓ 2018  ┬╖  41рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: gatsbyjs/gatsby

рд╡рд┐рд╡рд░рдг

рдореИрдВ рдлреНрд░рдВрдЯрдореИрдЯрд░ рд╕реЗ рдорд╛рд░реНрдХрдбрд╛рдЙрди рдХрдВрдЯреЗрдВрдЯ рдкрдврд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

 рдЖрдзреЗ рдмреИрд▓:
 - рд╢реАрд░реНрд╖рдХ: рдпрд╣ рдкрд╣рд▓рд╛ рд╢реАрд░реНрд╖рдХ рд╣реИ
 рд╕рд╛рдордЧреНрд░реА:> -
 ### рдпрд╣ ** рдорд╛рд░реНрдХрдбрд╛рдЙрди ** рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рд╛рдордЧреНрд░реА рд╣реИред

 - рдпрд╣ рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рд╣реИ
 - рдпрд╣ рджреВрд╕рд░реА рдкрдВрдХреНрддрд┐ рд╣реИ
 - рдпрд╣ рддреАрд╕рд░реА рдкрдВрдХреНрддрд┐ рд╣реИ
 - рд╢реАрд░реНрд╖рдХ: рдпрд╣ рджреВрд╕рд░рд╛ рд╢реАрд░реНрд╖рдХ рд╣реИ
 рд╕рд╛рдордЧреНрд░реА:> -
 ### рдпрд╣ ** рдорд╛рд░реНрдХрдбрд╛рдЙрди ** рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рд╛рдордЧреНрд░реА рд╣реИред

 - рдпрд╣ рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рд╣реИ
 - рдпрд╣ рджреВрд╕рд░реА рдкрдВрдХреНрддрд┐ рд╣реИ
 - рдпрд╣ рддреАрд╕рд░реА рдкрдВрдХреНрддрд┐ рд╣реИ

рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЖрд▓реЗрдЦ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ:

 рдЖрдзрд╛ рдмреИрд▓реЗрдВрд╕ {
 рд╢реАрд░реНрд╖рдХ
 рдЫрд╡рд┐
 рд╕рд╛рдордЧреНрд░реА
 }

рдореИрдВ HTML рдореЗрдВ рд░реВрдкрд╛рдВрддрд░рд┐рдд рд╕рд╛рдордЧреНрд░реА рдпрд╛ HTML рдХреЗ рд░реВрдк рдореЗрдВ рдХреИрд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реВрдБ?

рдЕрдкреЗрдХреНрд╖рд┐рдд рдкрд░рд┐рдгрд╛рдо

рдореИрдВ рдЗрд╕реЗ 'index.md' рдХрд╣рдиреЗ рд╡рд╛рд▓реА рдорд╛рд░реНрдХрдбрд╛рдЙрди рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдкрдврд╝рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдЗрд╕реЗ HTML рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реВрдВред

рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рдгрд╛рдо

рдорд╛рд░реНрдХрдбрд╛рдЙрди рдХреЛ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╡рд╛рддрд╛рд╡рд░рдг

  • Gatsby рд╕рдВрд╕реНрдХрд░рдг ( npm list gatsby ): gatsby@^1.9.247
  • gatsby-cli рд╕рдВрд╕реНрдХрд░рдг ( gatsby --version ): 1.1.50
question or discussion

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмрдВрдж рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдЖрдк рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдорд╛рд░реНрдХрдбрд╛рдЙрди рдШрдЯрдХ рдХреА рддрд░рд╣ рдирд╣реАрдВ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдЖрдк рдЕрдкрдиреЗ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд╣реАрдВ рднреА рдорд╛рд░реНрдХрдбрд╛рдЙрди рдХреЛ HTML рдореЗрдВ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ

import React from 'react'
import PropTypes from 'prop-types'
import showdown from 'showdown'

const converter = new showdown.Converter()

const MarkdownContent = ({ content, className }) => (
  <div className={className} dangerouslySetInnerHTML={{ __html: converter.makeHtml(content) }} />
)

MarkdownContent.propTypes = {
  content: PropTypes.string,
  className: PropTypes.string,
}


export default MarkdownContent

рд╕рднреА 41 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рддрд╛ рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рднрд╛рдЧреЛрдВ 5-7 https://www.gatsbyjs.org/tutorial/

рдЖрдк рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдХреЗ рд╕рд╛рде рднреА рд╢реБрд░реВ рдХрд░рдирд╛ рдЪрд╛рд╣ рд╕рдХрддреЗ рд╣реИрдВ - рдЬрд┐рдирдореЗрдВ рд╕реЗ рдХрдИ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реЗрдЯрдЕрдк рдХрд╛ рдорд╛рд░реНрдХрдбрд╛рдЙрди рд╕рдорд░реНрдерди рд╣реИ - https://www.gatsbyjs.org/docs/gatsby-starter/

рдкреНрд░рд╢реНрди рдЕрдзрд┐рдХ рдмрд╛рд░реАрдХ рд╣реИ рдФрд░ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рджреНрд╡рд╛рд░рд╛ рдХрд╡рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓реВрдВрдЧрд╛ред

рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рдЖрдкрдХреЗ рдкрд╛рд╕ 2 рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ:

  1. рдЖрдк рдЕрдкрдиреА рдорд╛рд░реНрдХрдбрд╛рдЙрди рд╕рд╛рдордЧреНрд░реА рдХреЛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдФрд░ рдкрде рд▓рд┐рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
Separate file - let's call it `someContent.md`
```md
### This is the actual content in **MarkDown** format.

- This is the first row
- This is second row
- This is third row
```
and reference that file in your main file (by relative path):
```md
halfBlocks:
  - title: This is first title
    content: "./someContent.md"
```
then in query you could
```
halfBlocks {
  content {
    childMarkdownRemark {
      html
    }
}
```
  1. рдЕрдиреНрдп рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЗрд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рд╕рдВрднрд╛рд▓ рд░рд╣реЗ рд╣реЛрдВрдЧреЗ - рдЖрдкрдХреЗ рдЕрдЧреНрд░рднреВрдорд┐ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдорд╛рд░реНрдХрдбрд╛рдЙрди рдиреЛрдбреНрд╕ рдмрдирд╛рдирд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ createNodeField рдорд╛рдзреНрдпрдо рд╕реЗ рдЬреЛрдбрд╝рдирд╛ред рдпрд╣ рдЕрдзрд┐рдХ рд╢рд╛рдорд┐рд▓ рд╣реИред рдЖрдкрдХреЛ рд╢рд╛рдпрдж рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕реНрд░реЛрдд рдХреЛ рдмреНрд░рд╛рдЙрдЬрд╝ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдкреНрд▓рдЧрдЗрди рджреЗрдЦреЗрдВ рдХрд┐ рдХреИрд╕реЗ MarkdownR рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдиреЛрдб рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдПред

рд╣рд╛рдп @KyleAMathews рдЖрдкрдХреЗ рд╕реБрдЭрд╛рд╡ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореИрдВрдиреЗ рдЙрдиреНрд╣реЗрдВ рдкрдврд╝рд╛ рдерд╛ рд▓реЗрдХрд┐рди рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдордЭ рдкрд╛рдирд╛ рдореЗрд░реЗ рд▓рд┐рдП рдХрдард┐рди рдерд╛ред рдореИрдВ рдПрдХ рд╕реНрдЯрд╛рд░реНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдзрд┐рдХ рд╢рд╛рдорд┐рд▓ рдерд╛ред рд╕реНрдЯрд╛рд░реНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: https://github.com/v4iv/gatsby-starter-business

@ рдбрдл рдореБрдЭреЗ рдорд╛рд░реНрдЧрджрд░реНрд╢рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рджред рддреБрдо рд╕рд╣реА рд╣реЛред рдореБрдЭреЗ рд▓рдЧрд╛ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдмрд╣реБрдд рд╕рд╛рд░реА рдЫреЛрдЯреА рдлрд╛рдЗрд▓реЗрдВ рд╣реЛрдВрдЧреА, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдХреЛрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдкрдбрд╝рд╛ред рдореИрдВ рдпрд╣рд╛рдВ рдпрд╣ рджрд╕реНрддрд╛рд╡реЗрдЬ рджреЗ рд░рд╣рд╛ рд╣реВрдВ рддрд╛рдХрд┐ рдЕрдЧрд░ рдХрд┐рд╕реА рдФрд░ рдХреЛ рднреА рдпрд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реЛ рддреЛ рд╡реЗ рднреА рдЗрд╕реЗ рджреЗрдЦ рд╕рдХреЗрдВред

рдЪрд░рдг 1: рд╕рд╛рдордЧреНрд░реА рдкрдврд╝рдирд╛

рдореИрдВ рдЧреНрд░рд╛рдлрд╝рд┐рдХрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╕рд╛рдордЧреНрд░реА рдкрдврд╝ рд░рд╣рд╛ рд╣реВрдВред рдпрд╣ рдореБрдЭреЗ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рд░реНрдХрдбрд╛рдЙрди рджреЗрддрд╛ рд╣реИред рдореБрдЭреЗ рдЕрднреА рднреА рдЗрд╕реЗ рдмрджрд▓рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред

рдЪрд░рдг 2: HTML рдореЗрдВ рдмрджрд▓рдирд╛

рдЗрд╕рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдХрдВрдЯреЗрдВрдЯ рдХреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реЗ рддрдм рддрдХ рдЬрд╛рдиреЗ рджреЗрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдЬрдм рддрдХ рд╣рдо рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдШрдЯрдХ рддрдХ рдирд╣реАрдВ рдкрд╣реБрдБрдЪ рдЬрд╛рддреЗ рдЬреЛ рдЗрд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИред рд╡рд╣рд╛рдВ рдореИрдВрдиреЗ рдЗрд╕реЗ рдорд╛рд░реНрдХрдбрд╛рдЙрди рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ред

рдЗрд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВред рдЖрдк рдЯрд┐рдкреНрдкрдгреА-рдкреНрд░реАрд╕реЗрдЯ-рд▓рд┐рдВрдЯ-рдЕрдиреБрд╢рдВрд╕рд┐рдд рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ:

рд░рд┐рдорд╛рд░реНрдХ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ

yarn add remark remark-preset-lint-recommended remark-html

рдЖрдпрд╛рдд

import remark from 'remark';
import recommended from 'remark-preset-lint-recommended';
import remarkHtml from 'remark-html';

рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛
рдмрд╛рдж рдореЗрдВ рд░реЗрдВрдбрд░ рднрд╛рдЧ рдореЗрдВ content рдХрд╛ рдорд╛рд░реНрдХрдбрд╛рдЙрди рд╣реИ рдЬреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдкрдврд╝рд╛ рдЧрдпрд╛ рдерд╛:

content = remark()
      .use(recommended)
      .use(remarkHtml)
      .processSync(content).toString();

рдЕрдм рдореИрдВ HTML рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд╛рдордЧреНрд░реА рдХреЛ рдлрд┐рд░ рд╕реЗ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реВрдВред

рдЪрд░рдг 3: рдорд╛рд░реНрдХрдбрд╛рдЙрди рдореЗрдВ рд╕рд╛рдордЧреНрд░реА рдЬреЛрдбрд╝рдирд╛

рдПрдХ рдФрд░ рдЧреИрдЪрд╛ рд╣реИ рдЬреЛ рдореБрдЭреЗ рдЖрдпрд╛ рд╣реИред рдЬрдм рдореИрдВ >- рд╕рд╛рде рдорд▓реНрдЯреАрд▓рд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛ рддреЛ рдлрд╝реЙрд░реНрдореЗрдЯ рдХрд░рдирд╛ рдЙрдЪрд┐рдд рдирд╣реАрдВ рдерд╛:

content: >-
    ### This is the actual content in **MarkDown** format.
    - This is the first row
    - This is second row

рд▓реЗрдХрд┐рди рдкрд╛рдЗрдк рдкреНрд░рддреАрдХ | рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

content: |
    ### This is the actual content in **MarkDown** format.
    - This is the first row
    - This is second row

рдЕрднреА рдХреЗ рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рдмрдВрдж рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдпрджрд┐ рдЖрдк рдЪрд╛рд╣реЗрдВ рддреЛ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВред

рдзрдиреНрдпрд╡рд╛рдж!!

рдореИрдВ рдлреНрд░рдВрдЯрдореИрдЯрд░ рдХреЗ рд▓рд┐рдП рдорд╛рд░реНрдХрдбрд╛рдЙрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ (рд╢реАрд░реНрд╖рдХ, рдФрд░ рд╕рдЯреАрдХ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдВрд╢), рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕рдорд░реНрдерд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдирд╛рдордХрд░рдг рд╕рдореНрдореЗрд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛, рддрд╛рдХрд┐ gatsby-transformer-remark рдпрд╣ рд╕рдордЭ рд╕рдХреЗ рдХрд┐ рдЙрджрд╛ title.md рдПрдХ рдорд╛рд░реНрдХрдбрд╛рдЙрди рдлрд╝реАрд▓реНрдб рд╣реИред

@omeid @ thorn0 рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рд╣рдо рд╕реАрдзреЗ gatsby- рдЯреНрд░рд╛рдВрд╕рдлрд╛рд░реНрдорд░-рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕ рдмреАрдЪ, рдЖрдк рдПрдХ рдкреНрд▓рдЧрдЗрди рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рдХрд░рддрд╛ рд╣реИ рдЬреИрд╕реЗ https://github.com/gatsbyjs/gatsby/issues-5729#issuecomment -395701042 рдФрд░ createNodeField

рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрдВрдж рдореБрджреНрджреЗ рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд╖рдорд╛ рдпрд╛рдЪрдирд╛, рд▓реЗрдХрд┐рди рд╕рд┐рд░реНрдл рдПрдХ рд╕реНрдирд┐рдкреЗрдЯ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдЕрдкрдиреЗ gatsby-node.js рдХрд┐рдпрд╛ рдерд╛, рдЬреЛ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рдерд╛, рдЬрд┐рд╕рдХрд╛ рдЕрдиреБрд╕рд░рдг рдЖрдк рд╕рднреА рдиреЗ рдХрд┐рдпрд╛ рд╣реИ:

// Need to `yarn add remark remark-html`, then include the following code in
// gatsby-node.js.
const remark = require('remark');
const remarkHTML = require('remark-html');

exports.onCreateNode = ({ node }) => {
  // Conditionals, etc. can be used here, but I omitted those just for example's sake.
  const markdown = node.frontmatter.my_field;
  node.frontmatter.my_field = remark()
    .use(remarkHTML)
    .processSync(markdown)
    .toString();
  return node;
};

рддреЛ рдХреНрдпрд╛ createNodeField рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рдРрд╕рд╛ рдХрд░рдирд╛ рдареАрдХ рд╣реИ? рдореИрдВ рдЙрд▓рдЭрди рдореЗрдВ рд╣реВрдВред

@ thorn0 рдмреЗрд╣рддрд░ рдЗрд╕реНрддреЗрдорд╛рд▓ createNodeField рдХреЗ рдмрдЬрд╛рдп node.frontmatter.my_field = рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рдХреНрдпреЛрдВрдХрд┐ node рдордИ рдбрд┐рдмрдЧ рдХреАрдбрд╝реЗ рдХреЗ рд▓рд┐рдП рдХрдбрд╝реА рдореЗрд╣рдирдд рдХреЗ рдкрд░рд┐рдгрд╛рдо

@amitjindal @nshki рдпрд╣ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рд╕реЗ рдореИрдВрдиреЗ "рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдЭрд┐рд▓рдорд┐рд▓рд╛рд╣рдЯ-рдШрдЯрдХ" рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдореЗрд░реА рдЙрддреНрдкрд╛рджрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рджреБрд░реНрдШрдЯрдирд╛рдЧреНрд░рд╕реНрдд рдХрд░ рд░рд╣рд╛ рд╣реИ:

success delete html and css files from previous builds тАФ 0.626 s
success open and validate gatsby-config тАФ 0.018 s
success copy gatsby files тАФ 0.075 s
success onPreBootstrap тАФ 2.782 s
error UNHANDLED EXCEPTION


  TypeError: Cannot set property 'Compiler' of null

  - index.js:16 plugin
    [blog]/[remark-html]/index.js:16:17

  - index.js:271 Function.use
    [blog]/[unified]/index.js:271:25

  - gatsby-node.js:63 exports.onCreateNode.postscriptumsMarkdown.forEach.postscr    iptum
    /home/projects/blog/gatsby-node.js:63:12

  - Array.forEach

  - gatsby-node.js:61 Object.exports.onCreateNode
    /home/projects/blog/gatsby-node.js:61:29

  - api-runner-node.js:110 runAPI
    [blog]/[gatsby]/dist/utils/api-runner-node.js:110:36

  - api-runner-node.js:187 
    [blog]/[gatsby]/dist/utils/api-runner-node.js:187:33

  - map.js:27 
    [blog]/[async]/internal/map.js:27:9

  - eachOfLimit.js:66 replenish
    [blog]/[async]/internal/eachOfLimit.js:66:17

  - eachOfLimit.js:50 iterateeCallback
    [blog]/[async]/internal/eachOfLimit.js:50:17

  - onlyOnce.js:12 module.exports
    [blog]/[async]/internal/onlyOnce.js:12:16

  - map.js:29 
    [blog]/[async]/internal/map.js:29:13

  - util.js:16 tryCatcher
    [blog]/[bluebird]/js/release/util.js:16:23

  - nodeify.js:23 Promise.successAdapter
    [blog]/[bluebird]/js/release/nodeify.js:23:30

  - promise.js:566 Promise.module.exports.Promise._settlePromise
    [blog]/[bluebird]/js/release/promise.js:566:21

  - promise.js:606 Promise.module.exports.Promise._settlePromiseCtx
    [blog]/[bluebird]/js/release/promise.js:606:10


Waiting for the debugger to disconnect...

Process finished with exit code 130 (interrupted by signal 2: SIGINT)

рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдХрд╛рдо рди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗ рдмрд╛рд╣рд░ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ ( @see https://github.com/gatsbyjs/gatsby/issues/7599)

рд╣рд╛рдп рдбреЗрд╡рд┐рдб (@comxd), рдХреНрд╖рдорд╛ рдХрд░реЗрдВ рдореИрдВ рдпрд╛рддреНрд░рд╛ рдХрд░ рд░рд╣рд╛ рдерд╛ред
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдЗрд╕рдореЗрдВ рдореЗрд░реА рдХреЛрдИ рдЕрдВрддрд░реНрджреГрд╖реНрдЯрд┐ рдирд╣реАрдВ рд╣реИред рдореИрдВрдиреЗ рдХреЛрдб рдореЗрдВ рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред рдЕрд╢рдХреНрдд рдкрд░ рд╕рдВрдХрд▓рдХ рдЯрд┐рдкреНрдкрдгреА рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗ рдЖ рд░рд╣рд╛ рд╣реИред

рдЖрдк рдЕрдкрдиреА gatsby-node.js рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдПрдХ рд▓реВрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред
рдпрд╣ рдХреБрдЫ рдРрд╕реА рд╕рд╛рдордЧреНрд░реА рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдорд╛рд░реНрдХрдбрд╛рдЙрди рдпрд╛ рдЦрд░рд╛рдм рдЦрд╛рд▓реА рдирд╣реАрдВ рд╣реИ рдФрд░ рдЖрдк рдЗрд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЙрд╕ рдореЗрдВ рдХреБрдЫ рдХрдВрд╕реЛрд▓.рд▓реЙрдЧ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдбрд╛рд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдЖрдкрдХреЛ рдПрдХ рдкреИрдЯрд░реНрди рдорд┐рд▓рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдХреБрдЫ рдЦрд╛рд▓реА рд╣реЛ рд░рд╣рд╛ рд╣реИред

рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмрдВрдж рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдЖрдк рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдорд╛рд░реНрдХрдбрд╛рдЙрди рдШрдЯрдХ рдХреА рддрд░рд╣ рдирд╣реАрдВ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдЖрдк рдЕрдкрдиреЗ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд╣реАрдВ рднреА рдорд╛рд░реНрдХрдбрд╛рдЙрди рдХреЛ HTML рдореЗрдВ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ

import React from 'react'
import PropTypes from 'prop-types'
import showdown from 'showdown'

const converter = new showdown.Converter()

const MarkdownContent = ({ content, className }) => (
  <div className={className} dangerouslySetInnerHTML={{ __html: converter.makeHtml(content) }} />
)

MarkdownContent.propTypes = {
  content: PropTypes.string,
  className: PropTypes.string,
}


export default MarkdownContent

@blakenoll рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмрдВрдж рдирд╣реАрдВ рд╣реИ! рдпрд╣ рдПрдХ рдЙрдЪрд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИред

рдЙрд╕ рдиреЗ рдХрд╣рд╛, рдЧреИрдЯреНрд╕рдмреА рдХрд╛ рдПрдХ рдмрдбрд╝рд╛ рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рд╕рдордп рдкрд░ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдЕрдЪреНрдЫрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рддрдм рд╣рдореЗрдВ рдЕрдВрддрд┐рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдорд╛рд░реНрдХрдбрд╛рдЙрди рдкрд╛рд░реНрд╕рд░ рдХреА рдЦрд░реАрджрд╛рд░реА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ!

@DSchau рдорд╛рд░реНрдХрдбрд╛рдЙрди рдкрд╛рд░реНрд╕рд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдПрдк-рд╣рд╛рдЗрдбреНрд░реЗрдЯреЗрдб рд╣реЛрдиреЗ рдкрд░ рдиреАрдЪреЗ рдирд╣реАрдВ рднреЗрдЬрд╛ рдЬрд╛рдПрдЧрд╛?

@blakenoll рд╕реЛрдЪ рд╕реЗ рдмрд╛рд╣рд░ рдХрд╛ рдкреНрдпрд╛рд░!

рдХреНрдпрд╛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЙрдкрд▓рдмреНрдз рд╕рднреА рдЯрд┐рдкреНрдкрдгреА рдкреНрд▓рдЧрдЗрдиреНрд╕ / рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рд╕реЗ рдХреБрдЫ рднреА рдЙрдкрд▓рдмреНрдз рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдордиреЗ gatsby-config.js рднреАрддрд░ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдкрд░реНрджреЗ рдХреЗ рдкреАрдЫреЗ рдХреА рдЧрдИ рд╕рднреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреА рдирдХрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, Gatsby рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣рдореЗрдВ рдкреНрд░рджрд╛рди рдХрд░ рд░рд╣рд╛ рд╣реИред ? рдпрд╣ рдиреЛрдб рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдереЛрдбрд╝рд╛ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИ; рд▓реЗрдХрд┐рди рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рдмреЛрдЭрд┐рд▓ рдЬрдм рдЖрдк рдиреЗрд╕реНрдЯреЗрдб, рджреЛрд╣рд░рд╛рдиреЗ рдпреЛрдЧреНрдп рдХреНрд╖реЗрддреНрд░реЛрдВ рдФрд░ рдкреНрд░рддрд┐ рдкреГрд╖реНрда рд╕рд╛рдордЧреНрд░реА рдХреА рднрд┐рдиреНрдирддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддреЗ рд╣реИрдВред

@blakenoll рдЕрдкрдиреЗ рддрд╕рд▓реАрдо рдЯрд┐рдк рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рджред рд╕реБрдкрд░ рдорджрджрдЧрд╛рд░ рд╣реИ рдФрд░ рдореБрдЭреЗ рдлреНрд░рдВрдЯрдореИрдЯрд░ рдореЗрдВ HTML рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЙрд╕ рдиреЗ рдХрд╣рд╛, рдорд╛рд░реНрдХрдбрд╛рдЙрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реЗрдм рдкреЗрдЬ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рднрджреНрджрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд▓рдЧрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдкреЗрдЬ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╣рд┐рд╕реНрд╕реЛрдВ рдореЗрдВ рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдЯреБрдХрдбрд╝реЛрдВ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдХреНрдпрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ рдХрд┐ рд╣рдо рдХрд┐рд╕реА рддрд░рд╣ рдХреЗ markdownParser рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЕрдкрдиреА рдЧреНрд░рд╛рдлрдХрд▓рд╛рдЗрди рдХреНрд╡реЗрд░реА рдХреЗ рдЕрдЧреНрд░ рднрд╛рдЧ (рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рд╣рдо рдЫрд╡рд┐рдпреЛрдВ рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ) рдХреЗ рднреАрддрд░ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдлреНрд░рдВрдЯрдореИрдЯрд░ рдореЗрдВ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдорд╛рд░реНрдХрдбрд╛рдЙрди рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░реЗрдЧрд╛ рдФрд░ рдЗрд╕реЗ HTML рдореЗрдВ рдмрджрд▓ рджреЗрдЧрд╛? рд░реЗрдЦрд╛рдВрдХрди рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдирд╣реАрдВ ... рд╕рд┐рд░реНрдл рд╕реЛрдЪрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИред

рдпрд╣ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдореБрджреНрджрд╛ рд╣реИ IMO b / c рдЕрдЧрд░ рдХреЛрдИ рдиреЗрдЯреНрд╕реАрд▓реА рд╕реАрдПрдордПрд╕ рдХреЗ рд╕рд╛рде Gatsby рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ, рддреЛ Netifly рд╡рд┐рднрд┐рдиреНрди рдлреНрд░рдВрдЯрдореАрдЯрд░ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдорд╛рд░реНрдХрдбрд╛рдЙрди рдХреЛ рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЬрдм рдЙрди рдлрд╝реАрд▓реНрдб рдХреЛ рдХреНрд╡реЗрд░реА рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЙрдиреНрд╣реЗрдВ HTML рдХреЗ рд▓рд┐рдП рдкрд╛рд░реНрд╕ рдХрд┐рдП рдЧрдП рдХреЗ рдмрдЬрд╛рдп рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдорд╛рд░реНрдХрдбрд╛рдЙрди рдХреЗ рд░реВрдк рдореЗрдВ рд▓реМрдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред @amitjindal рдФрд░ @blakenoll рдХреЗ рд╕рдорд╛рдзрд╛рди рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ @DSchau рдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП

@skylarweaver рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╣рд╛рдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рдкреГрд╖реНрда рдкрд░ рд╣реВрдВред рдЬрдм рдореИрдВ рдПрдХ рдиреЛрдб рдлрд╝реАрд▓реНрдб рдмрдирд╛рдиреЗ рдХреА рдкреНрд░рдХреГрддрд┐ рдХреЛ рд╕рдордЭрддрд╛ рд╣реВрдВ, рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рдкрд╛рд░реНрд╕ рд╣реЛ рд╕рдХрддреА рд╣реИ, рддреЛ рдпрд╣ рд╕реАрдПрдордПрд╕ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдереЛрдбрд╝рд╛ рд╕рд╛ рдЕрдирдкреЗрдХреНрд╖рд┐рдд рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рджреЛрд╣рд░рд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдлрд╝реАрд▓реНрдб рдФрд░ рдлрд╝реАрд▓реНрдб рдирд╛рдореЛрдВ рдХреА рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдмрджрд▓рд╛рд╡ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ; рдЙрд╕ рд╕рдордп рдХрд┐рд╕реА рднреА / рд╕рднреА рдЧреИрдЯреНрд╕рдмреА рд░реАрдорд╛рд░реНрдХ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╕реНрдкрд╖реНрдЯ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ред

+1 рдХреНрдпрд╛ @skylarweaver рдиреЗ рдХрд╣рд╛!

@amitjindal рд╢рд╛рдпрдж рдмреЗрд╡рдХреВрдл рд╕рд╡рд╛рд▓ рд╣реИ рд▓реЗрдХрд┐рди "> -" рднреА рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ? Netlify cms рд╕реНрдЯрд╛рд░реНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдФрд░ рдЙрддреНрдкрдиреНрди рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рдХреЛрдИ рдЕрдВрддрд░ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рд╣реИ, рдЪрд╛рд╣реЗ рдореЗрд░реЗ рдкрд╛рд╕>>,> -;, рдпрд╛ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИред

@ nol13 рдмреНрд▓реЙрдХ рд╕реНрдХреЗрд▓рд░ рджреЗрдЦреЗрдВ, рдпрд╣ рдирдИ рдХрд╣рд╛рдирд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИред

рдореИрдВ рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдХреИрд╕реЗ рдбрд╛рд▓ рд╕рдХрддрд╛ рд╣реВрдВ? рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛

content: |
        |   |   |   |   |   |
        |---|---|---|---|---|
        |   |   |   |   |   |
        |   |   |   |   |   |
        |   |   |   |   |   |

@ qnguyen12 рдореИрдВ рд░реВрдкрд╛рдВрддрд░рдг рдХреЗ рд╕рд╛рде рдЖрдкрдХреА рд╕рд╣рд╛рдпрддрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП https://jmalarcon.github.io/markdowntables/ рдЬреИрд╕реЗ рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реВрдВрдЧрд╛ ред

рд╣рд╛рдВ, рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдпрд╣ рд╕реНрд░реЛрдд рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ рд╣реИ, рддрд╛рд▓рд┐рдХрд╛ рдирд╣реАрдВ
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

text: |
        test   
        ### This is the actual content in **MarkDown** format.  
        |Month|Savings|Spending|
        |--- |--- |--- |
        |January|$100|$900|
        |July|$750|$1000|
        |December|$250|$300|
        |April|$400|$700|

рдпрд╣ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ:
рдкрд░реАрдХреНрд╖рд╛

рдпрд╣ рдорд╛рд░реНрдХрдбрд╛рдЙрди рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рд╛рдордЧреНрд░реА рд╣реИред

| рдорд╣реАрдирд╛ | рдмрдЪрдд | рдЦрд░реНрдЪ | | --- | --- | --- | | рдЬрдирд╡рд░реА | $ 100 | $ 900 | | рдЬреБрд▓рд╛рдИ | $ 750 | $ 1000 | | рджрд┐рд╕рдВрдмрд░ | $ 250 | $ 300 | | рдЕрдкреНрд░реИрд▓ | $ 400 | $ 700 |

@KyleAMathews рдзрдиреНрдпрд╡рд╛рдж, рдЙрд╕ рддрд░рд╣ рдХрд╛ рдХрд╛рдо, рд▓реЗрдХрд┐рди рдЬрд╛рд╣рд┐рд░ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдпрд╛ рддреЛ рдЯрд┐рдкреНрдкрдгреА рдкреНрд▓рдЧрдЗрди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдФрд░ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдпрд╛ рдЖрдкрдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓рддреЗ рд╣реИрдВред рдорд╛рд░реНрдХрдбрд╛рдЙрди рдлреНрд░рдВрдЯрдореИрдЯрд░ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдпреЛрдЬрдирд╛? рд╢рд╛рдпрдж рдПрдХ frontmattermd рдХрдЪреНрдЪреЗ рдХреЗ рд╕рд╛рде рд╕рд╛рде рдХреНрд╖реЗрддреНрд░ frontmatter ?

@ рдореЗрд░реЗ рдкрд╛рд╕ рдХреЛрдИ рдпреЛрдЬрдирд╛ рдирд╣реАрдВ рд╣реИ - рдпрд╣ рд╕рдореБрджрд╛рдп рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рдХреЛ рдмрдирд╛рдиреЗ рдФрд░ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╣рд╛рди рдкреНрд▓рдЧрдЗрди рд╣реЛрдЧрд╛!

рдореИрдВрдиреЗ рдПрдХ рдкреНрд▓рдЧрдЗрди рдмрдирд╛рдпрд╛ рдЬреЛ рдпрд╣ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП: рдЧреИрдЯреНрд╕рдмреА-рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдорд░-рдХрдореЗрдВрдЯ-рдлреНрд░рдВрдЯрдореИрдЯрд░ ред рдпрд╣ рдореЗрд░реЗ рдкрд░реАрдХреНрд╖рдг рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рд▓рдЧрддрд╛ рд╣реИ, рдФрд░ рдореИрдВ рдЗрд╕реЗ рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рдореИрдВ рдПрдХ рдЧреНрд░рд╛рд╣рдХ рдХреЗ рд▓рд┐рдП рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░реВрдВрдЧрд╛ рдпрджрд┐ рдЖрдк рд▓реЛрдЧ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВрдЧреЗ рдФрд░ рдореБрдЭреЗ рдмрддрд╛рдПрдВрдЧреЗ рдХрд┐ рдХреНрдпрд╛ рдРрд╕рд╛ рдХреБрдЫ рд╣реИ рдЬреЛ рдЧрд▓рдд рджрд┐рдЦрддрд╛ рд╣реИ , рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдореЗрд░реА рдкрд╣рд▓реА рдмрд╛рд░ рдПрдХ gatsby рдкреНрд▓рдЧрдЗрди рд▓реЗрдЦрди рд╣реИред рдпрд╣ рдорд╛рд░реНрдЧ @omid рджреНрд╡рд╛рд░рд╛ рд╕реБрдЭрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ frontmattermd рдлрд╝реАрд▓реНрдб рдЬреЛрдбрд╝рддрд╛ рд╣реИред

рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдореИрдВ рдЙрдкрднреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП gatsby- рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдорд░-рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд▓рд┐рдП рдмрд╕ рдирдП рдорд╛рд░реНрдХрдбрд╛рдЙрди рдлрд╝рд╛рдЗрд▓ рдиреЛрдбреНрд╕ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реВрдВ, рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣реИрдХреА рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде рдЖрдпрд╛, рдЬрд┐рд╕рдореЗрдВ рдЧреИрдЯреНрд╕рдмреА-рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдорд░-рдЯрд┐рдкреНрдкрдгреА рдХреЗ setFieldsGraphQLNodeType рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдП рдЧрдП рд░рд┐рдЬрд╝реЙрд▓реНрд╡рд░ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдФрд░ рдПрдХ рдирдпрд╛ рдкрд╛рд╕ рдХрд░рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ рдПрдХ рдФрд░ рд░рд┐рд╡рд╛рд▓реНрд╡рд░ рдХреЗ рднреАрддрд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдорд╛рд░реНрдХрдбрд╛рдЙрди рдиреЛрдбред рдпрд╣ рдорд╛рд░реНрдХрдбрд╛рдЙрдирдорд╛рд░реНрдХ рдиреЛрдб рдкрд░ рдХрд┐рд╕реА рднреА рдХреНрд╖реЗрддреНрд░ рдХреЛ рдХреНрд╡реЗрд░реА рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рдПрдХ рдлрд╝реАрд▓реНрдб рдПрдирдо рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рдореВрд╣ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд╕рдВрдж рдХрд░рддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИрдХ рдХреА рддрд░рд╣ред рдореИрдВрдиреЗ рдЗрд╕реЗ рдпрд╣рд╛рдБ рдкреЛрд╕реНрдЯреАрд░рд┐рдЯреА рдХреЗ рд▓рд┐рдП рд╕рд╣реЗрдЬрд╛ рд╣реИред

рд╣рд╛рдп @WhiteAbeLincoln рдореИрдВ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА:
npm i gatsby-transformer-remark-frontmatter npm ERR! code ENOVERSIONS npm ERR! No valid versions available for gatsby-transformer-remark-frontmatter

рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдЕрднреА рддрдХ npm рдкрд░ рдкреНрд░рдХрд╛рд╢рд┐рдд рдирд╣реАрдВ рд╣реБрдЖ рд╣реИред рдПрдХ рдмрд╛рд░ рдХрд╛рдо рд╕реЗ рд╣рдЯрдиреЗ рдХреЗ рдмрд╛рдж рдореИрдВ рдЗрд╕реЗ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░ рджреВрдВрдЧрд╛ рдФрд░ рдЖрдкрдХреЛ рдмрддрд╛ рджреВрдВрдЧрд╛ред

- рдЕрдмреЗ рд╕рдлреЗрдж

17 рдЬреВрди 2019 рдХреЛ, 22:53 рдмрдЬреЗ, broeker рд╕реВрдЪрдирд╛рдПрдВ @github.com рдиреЗ рд▓рд┐рдЦрд╛:

рд╣рд╛рдп @WhiteAbeLincoln рдореИрдВ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА:
npm i gatsby- рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдорд░-рдЯрд┐рдкреНрдкрдгреА-рдлреНрд░рдВрдЯ-рдлреНрд░рдВрдЯ npm ERR! рдХреЛрдб рдПрдирд╡реАрдЖрд░ рдИрдЖрд░рдЖрд░! Gatsby- рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдорд░-рдЯрд┐рдкреНрдкрдгреА-рдлреНрд░рдВрдЯрдореИрдЯрд░ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдорд╛рдиреНрдп рд╕рдВрд╕реНрдХрд░рдг рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИ

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рдЙрддреНрддрд░ рд╕реАрдзреЗ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ, рдпрд╛ рдереНрд░реЗрдб рдХреЛ рдореНрдпреВрдЯ рдХрд░реЗрдВред

@HiteAbeLincoln рдореИрдВрдиреЗ рдЧреИрдЯреНрд╕рдмреА-рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдорд░-рдЯрд┐рдкреНрдкрдгреА-рдлреНрд░рдВрдЯрдореЗрдЯрд░ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди рдЗрд╕рдиреЗ рдореБрдЭреЗ рдПрдХ рддреНрд░реБрдЯрд┐ рджреАред

рддреНрд░реБрдЯрд┐ # 11325

рдЖрдкрдХреА рд╕рд╛рдЗрдЯ рдХреЗ "gatsby-node.js" рдиреЗ рдПрдХ рдШрдЯрдХ рдХреЗ рд╕рд╛рде рдПрдХ рдкреГрд╖реНрда рдмрдирд╛рдпрд╛ рдЬреЛ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИред

рдХреНрдпрд╛ рдЖрдкрдХреЛ рдпрд╣ рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ?

рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ рдЖрдкрдХреЗ рд░реЗрдкреЛ рдХреЗ рдЗрд╢реНрдпреВ рд▓реЙрдЧ рдкрд░ @obeid рджреНрд╡рд╛рд░рд╛ рд░рд┐рдкреЛрд░реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рд╢рд╛рдпрдж рдореИрдВ рдЗрд╕реЗ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдБред рддреЛ рдХреБрдЫ рдорджрдж рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХреАред

@Nshki рдЙрддреНрддрд░ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдФрд░ рдиреЛрдб рдХреЗ рдореНрдпреВрдЯреЗрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ @pieh рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд╕рд╛рде

const remark = require("remark");
const remarkHTML = require("remark-html");

exports.onCreateNode = ({ node, actions: { createNodeField } }) => {
  const my_field = node.frontmatter.my_field;

  if (my_field) {
    const value = remark()
      .use(remarkHTML)
      .processSync(my_field)
      .toString();

    // new node at:
    // fields {
    //   my_field_html
    // }
    createNodeField({
      name: `my_field_html`,
      node,
      value
    });
  }
};

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: my_field => my_field_html

@aziaziazi рдореИрдВ рдПрдХ рд╣реА рдЪреАрдЬрд╝ рдХреЗ рд▓рд┐рдП рдХреИрд╕реЗ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдБ, рд▓реЗрдХрд┐рди рд╕рд░рдгреА рдореЗрдВ рдШреЛрдВрд╕рд▓реЗ рд╡рд╛рд▓реЗ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд▓рд┐рдП?

---
pressEventsList:
  - body: >-
      *My md content...*
    image: 'https://res.cloudinary.com/press/01.jpg'
  - body: >-
      *My md content...*
    image: 'https://res.cloudinary.com/press/02.jpg'
---

рдореБрдЭреЗ рдкреНрд░рддреНрдпреЗрдХ pressEventsList[i].body рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

@alexeychikk рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдкрд░рд┐рдгрд╛рдо рдХреА рдПрдХ рд╕рд░рдгреА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдордЧреНрд░реА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ pressEventList рдХреА рддрд▓рд╛рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

const remark = require("remark");
const remarkHTML = require("remark-html");

exports.onCreateNode = ({ node, actions: { createNodeField } }) => {
const pressEventList = node.frontmatter.pressEventList;

if (pressEventList) {
  const value = pressEventList.map(event =>
     remark()
    .use(remarkHTML)
    .processSync(event.body)
    .toString()
  )

  createNodeField({
    name: `pressEventList`,
    node,
    value
  });
}
};

рдореИрдВ createNodeField (рдЙрд╕реА рддрд░рд╣ рддреЗрдЬ рдкрд╛рд░реНрд╕ рдЗрдореЗрдЬ URL) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рдКрдкрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╕реНрдЯрдо YAML рдЯреИрдЧ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд▓рдЧрдЗрди рдмрдирд╛рдиреЗ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд░рдЦрддрд╛ рд╣реВрдВред
рдХреНрдпрд╛ рдХреЛрдИ рдореБрдЭреЗ рдЙрд╕ рдХреЛрдб рдХреА рдУрд░ рд╕рдВрдХреЗрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЫрд╡рд┐ URL рдХреЛ рдЗрд╕ рдмрд╛рдд рдХрд╛ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рд░реНрд╕ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдпрд╣ рдХреИрд╕реЗ рддреЗрдЬ рд╣реИ?

ЁЯСЛ MDX рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ frontmatter рд╕рдорд░реНрдерди рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд▓рдЧрдЗрди рдмрдирд╛рдпрд╛ https://www.gatsbyjs.org/packages/gatsby-plugin-mdx-frontmatter/

@zslabs , рдпрд╣ рдЕрдХреНрд╕рд░ рдЖрдк рдПрдХ рд╕рдорд╛рдзрд╛рди "9 рдШрдВрдЯреЗ рдкрд╣рд▓реЗ" рдкреЛрд╕реНрдЯ рджреЗрдЦрд╛ рдирд╣реАрдВ рд╣реИ! рдореИрдВ рдЗрд╕реЗ рдПрдХ рд╕реНрдкрд┐рди рджреЗ рджреВрдБрдЧрд╛! рдЕрдЪреНрдЫрд╛ рдХрд╛рдоред

рдЬрдм рд╕реЗ рдореИрдВ рдЕрдкрдиреЗ рдкреГрд╖реНрдареЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рддрдм рд╕реЗ рдореИрдВ рдЗрд╕рд╕реЗ рдЬреВрдЭ рд░рд╣рд╛ рд╣реВрдВред
рдлреНрд░рдВрдЯрдореИрдЯрд░ рдореЗрдВ рдореЗрд░реЗ рдкрд╛рд╕ рдХреБрдЫ рдЦрдВрдб рдереЗ, рдЬреИрд╕реЗ рдХреБрдЫ рдлрд╝реАрд▓реНрдб рдЬреИрд╕реЗ рд╢реАрд░реНрд╖рдХ рдФрд░ рдЪрд┐рддреНрд░рд┐рдд рдЫрд╡рд┐, рдФрд░ рдлрд┐рд░ рдкреНрд░рддреНрдпреЗрдХ рдкрд░ рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╢рд░реАрд░ рдерд╛, рдЬреЛ рдорд╛рд░реНрдХрд╛рдбрд╛рдЙрди рд╕реЗ рдмрдирд╛ рдерд╛ред
CreateNodeField рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдореЗрд░реЗ рд▓рд┐рдП рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдЙрдиреНрд╣реЗрдВ рддрд╛рд░реНрдХрд┐рдХ рд░реВрдк рд╕реЗ рд▓рд┐рдВрдХ рдХрд░рдиреЗ рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рдереА рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдмрдирд╛рдП рдЧрдП рд╣реИрдВ, рдореМрдЬреВрджрд╛ рдлреНрд░рдВрдЯрдореИрдЯрд░ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рд╕рдВрд▓рдЧреНрди рдирд╣реАрдВ рд╣реИрдВред
рдореИрдВрдиреЗ createFieldExtension рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рд╕рдорд╛рдкреНрдд рдХрд┐рдпрд╛, рддрд╛рдХрд┐ рдЬрдм рдореЗрд░рд╛ рдЕрдиреБрднрд╛рдЧред рдХрд┐рд╕реА рд╡реНрдпрдХреНрддрд┐ рдХреЛ рд╕рдордЭрд╛ рдЬрд╛рдП, рддреЛ рд╡рд╣ HTML рдореЗрдВ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПред
рдХреГрдкрдпрд╛ рдХрд┐рд╕реА рдиреЗ рдореБрдЭреЗ рд╕рд╣реА рдХрд┐рдпрд╛ рдЕрдЧрд░ рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИ, рддреЛ рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╣реЛрдиреЗ рдХрд╛ рдЧрд▓рдд рддрд░реАрдХрд╛ рд╣реИред

рдореЗрд░реА рд╕реАрдорд╛ рд░реЗрдЦрд╛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИ:

templateKey: project-entry
date: 2020-06-22T13:16:57.702Z
featuredproject: true
title: Project title
description: Description for listing the project on other pages
featuredimage: Image for listing the project on other pages
featuredpost: false
sections:
  - heading: Section heading
    standout: false
    intro: >-
      Introduction to be displayed separately to body
    body: >-
       ## section title
       * bullet point
       * bullet point
       Some other text here

рдФрд░ рдЬрд┐рд╕ рдХреЛрдб рдХрд╛ рдореИрдВрдиреЗ gatsby-node.js рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ

exports.createSchemaCustomization = ({actions}) => {
  const { createTypes, createFieldExtension} = actions

  createFieldExtension({
    name: 'toHTML',
    extend:() => ({
        resolve(source) {
          return remark().use(remarkHTML).processSync(source.body).toString()
        }
      })
  })
  const typeDefs = `
  type MarkdownRemark implements Node {
    frontmatter: Frontmatter
  }
  type Frontmatter <strong i="14">@infer</strong> {
    sections: [section]
  }
  type section <strong i="15">@infer</strong> {
    body: String <strong i="16">@toHTML</strong>
  }
  `
  createTypes(typeDefs)
}

рдХрд┐рд╕реА рдФрд░ рдХреЗ рд▓рд┐рдП рдЬреЛ рдореЗрд░реА рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ, рдореИрдВрдиреЗ рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рдордирдорд╛рдиреЗ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╕реНрдЯрдо YAML рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛:

---
title: My Page
inline: !md Some **bold** and _italic_ text
block: !md |
  ## I'm a H2 title
  [I'm an inline-style link](https://www.google.com)
---

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╕реНрдЯрдо рдкреНрд░рдХрд╛рд░ рдмрдирд╛рдПрдВ рдФрд░ рдлрд┐рд░ рдЧреНрд░реЗ-рдореИрдЯрд░ рдХреЗ YAML рдкрд╛рд░реНрд╕рд░ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░реЗрдВ:

// custom-yaml.js
const yaml = require('js-yaml')
const remark = require('remark')
const remarkHTML = require('remark-html')

const MarkdownYamlType = new yaml.Type('!md', {
  kind: 'scalar',
  construct: data => remark().use(remarkHTML).processSync(data).toString(),
})

const MARKDOWN_SCHEMA = yaml.Schema.create(MarkdownYamlType)

module.exports = doc => yaml.safeLoad(doc, { schema: MARKDOWN_SCHEMA })
// gatsby-config.js
module.exports = {
  plugins: [
    {
      resolve: `gatsby-transformer-remark`,
      options: {
        engines: { yaml: require("path/to/custom-yaml.js") },
      },
    }
  ]
}

рдореИрдВрдиреЗ рдЗрд╕реЗ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рд╣рд▓ рдХрд┐рдпрд╛ред рдореИрдВрдиреЗ @md рдирд╛рдо рд╕реЗ рдПрдХ рдлрд╝реАрд▓реНрдб рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдмрдирд╛рдпрд╛ рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ

exports.createSchemaCustomization = ({ actions }) => {
  actions.createFieldExtension({
    name: "md",
    args: {
      from: {
        type: "String!",
        defaultValue: true,
      },
    },

    extend() {
      return {
        args: {
          from: "String!",
        },
        resolve(source, args) {
          const fieldValue = source[args.from]
          return convertToHTML(fieldValue)
        },
      }
    },
  })
  const typeDefs = `
    type MarkdownRemark implements Node <strong i="7">@infer</strong> {
      frontmatter: Frontmatter
    }
    type Frontmatter {
      markdownField: String! <strong i="8">@md</strong>
    }
  `
  actions.createTypes(typeDefs)
}

рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ:

...
frontmatter {
        title: markdownField(from: "title")
        subtitle: markdownField(from: "subtitle")
}

рдореИрдВрдиреЗ рдЗрд╕реЗ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рд╣рд▓ рдХрд┐рдпрд╛ред

рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдлреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдореИрдВ рдЦрд╛рд░рд┐рдЬ рдПрдХ рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ defaultValue: true рддрд░реНрдХ рдХреЗ рд▓рд┐рдП from рдпрд╣ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП -ред defaultValue: '' рдмрджрд▓рдиреЗ рд╕реЗ, рдореБрдЭреЗ рддрдм рдпрд╣ рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ:

Encountered an error parsing the provided GraphQL type definitions:
Argument "from" of required type "String!" was not provided.

  1 |
  2 |     type MarkdownRemark implements Node <strong i="11">@infer</strong> {
  3 |       frontmatter: Frontmatter
  4 |     }
  5 |     type Frontmatter {
> 6 |       markdownField: String! <strong i="12">@md</strong>
    |                              ^
  7 |     }

рдпрд╣ рдореИрдВ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдХрд┐ рдХреИрд╕реЗ рд╣рд▓ рдХрд░рдирд╛ рд╣реИред

рдХрд┐рд╕реА рдФрд░ рдХреЗ рд▓рд┐рдП рдЬреЛ рдореЗрд░реА рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ, рдореИрдВрдиреЗ рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рдордирдорд╛рдиреЗ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╕реНрдЯрдо YAML рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛:

---
title: My Page
inline: !md Some **bold** and _italic_ text
block: !md |
  ## I'm a H2 title
  [I'm an inline-style link](https://www.google.com)
---

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╕реНрдЯрдо рдкреНрд░рдХрд╛рд░ рдмрдирд╛рдПрдВ рдФрд░ рдлрд┐рд░ рдЧреНрд░реЗ-рдореИрдЯрд░ рдХреЗ YAML рдкрд╛рд░реНрд╕рд░ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░реЗрдВ:

// custom-yaml.js
const yaml = require('js-yaml')
const remark = require('remark')
const remarkHTML = require('remark-html')

const MarkdownYamlType = new yaml.Type('!md', {
  kind: 'scalar',
  construct: data => remark().use(remarkHTML).processSync(data).toString(),
})

const MARKDOWN_SCHEMA = yaml.Schema.create(MarkdownYamlType)

module.exports = doc => yaml.safeLoad(doc, { schema: MARKDOWN_SCHEMA })
// gatsby-config.js
module.exports = {
  plugins: [
    {
      resolve: `gatsby-transformer-remark`,
      options: {
        engines: { yaml: require("path/to/custom-yaml.js") },
      },
    }
  ]
}

рдЕрдЧрд░ рдореБрдЭреЗ рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдЖрдЬрд╝рдорд╛рдиреЗ рдХреЗ рд▓рд┐рдП "рдЧреИрдЯреНрд╕рдмреА-рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдорд░-рдХрдореЗрдВрдЯ" рдХреЗ рд▓рд┐рдП 'рдЕрдорд╛рдиреНрдп рдкреНрд▓рдЧрдЗрди рд╡рд┐рдХрд▓реНрдк' рдорд┐рд▓рддреЗ рд╣реИрдВ?

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

mikestopcontinues picture mikestopcontinues  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

dustinhorton picture dustinhorton  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

theduke picture theduke  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

brandonmp picture brandonmp  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

hobochild picture hobochild  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ