ããã³ããã¿ãŒããããŒã¯ããŠã³ã³ã³ãã³ããèªã¿ããã äŸãã°ïŒ
halfBlocksïŒ -ã¿ã€ãã«ïŒããã¯æåã®ã¿ã€ãã«ã§ã ã³ã³ãã³ãïŒ>- ###ããã¯** MarkDown **圢åŒã®å®éã®ã³ã³ãã³ãã§ãã -ããã¯æåã®è¡ã§ã -ããã¯2è¡ç®ã§ã -ããã¯3è¡ç®ã§ã -ã¿ã€ãã«ïŒããã¯2çªç®ã®ã¿ã€ãã«ã§ã ã³ã³ãã³ãïŒ>- ###ããã¯** MarkDown **圢åŒã®å®éã®ã³ã³ãã³ãã§ãã -ããã¯æåã®è¡ã§ã -ããã¯2è¡ç®ã§ã -ããã¯3è¡ç®ã§ã
ç§ã¯æ¬¡ã®graphqlã䜿çšããŠããŸãïŒ
halfBlocks { é¡å ç»å ã³ã³ãã³ã }
HTMLã«å€æãããã³ã³ãã³ããèªã¿åãããŸãã¯HTMLãšããŠè¡šç€ºããã«ã¯ã©ãããã°ããã§ããïŒ
'index.md'ãšããããŒã¯ããŠã³ãã¡ã€ã«ãããããèªã¿åã£ãŠãHTMLãšããŠã¬ã³ããªã³ã°ã§ãããšæåŸ ããŠããŸãã
ããŒã¯ããŠã³ã¯è§£éãªãã§ãã®ãŸãŸè¡šç€ºãããŸãã
npm list gatsby
ïŒïŒgatsby@^1.9.247gatsby --version
ïŒïŒ1.1.50ãã¥ãŒããªã¢ã«ã§ã¯ããããç¹ã«ããŒã5ã7ã«ã€ããŠèª¬æããŸãhttps://www.gatsbyjs.org/tutorial/
ã¹ã¿ãŒã¿ãŒã®1ã€ããå§ããããšãã§ããŸãâãã®å€ãã¯ãã§ã«ããŒã¯ããŠã³ãµããŒããã»ããã¢ãããããŠããŸãâ https://www.gatsbyjs.org/docs/gatsby-starters/
質åã¯ãã埮åŠã§ããã¥ãŒããªã¢ã«ã§ã¯ã«ããŒãããŠããªãã®ã§ããããåéããŸãã
ç§ã®æèŠã§ã¯ã2ã€ã®éžæè¢ããããŸãã
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
}
}
```
createNodeField
ä»ããŠããããè¿œå ããŸãã ããã¯ãã£ãšè€éã§ãã ãããããContentfulãœãŒã¹ãã©ã°ã€ã³ãåç
§ããŠãMarkdownRemarkããŒããäœæããæ¹æ³ã確èªããå¿
èŠããããŸããããã«ã¡ã¯@KyleAMathewsããªãã®ææ¡ãããããšãã ç§ã¯ããããèªã¿ãŸãããããããã©ããã£ãŠè¡ãããå®å šã«ç解ããã®ã¯å°é£ã§ããã ç§ã¯ã¹ã¿ãŒã¿ãŒã䜿çšããŠããŸãããããã¯ãã£ãšè€éã§ããã 䜿çšããã¹ã¿ãŒã¿ãŒïŒ https ïŒ
@piehãæ¡å ããããšãããããŸãã ããªããæ£ããã§ãã å°ããªãã¡ã€ã«ãå€ããããšæã£ãã®ã§ã以äžã®ã³ãŒãã§ãããæ©èœãããŸããã ç§ã¯ããã§ãããææžåããŠããã®ã§ãä»ã®èª°ããåãåé¡ãæ±ããŠããå Žåã圌ãããããèŠãããšãã§ããŸãã
ç§ã¯éåžžGraphqlãä»ããŠã³ã³ãã³ããèªãã§ããŸãã ããã«ãããããŒã¯ããŠã³ãæååãšããŠè¡šç€ºãããŸãã ç§ã¯ãŸã ãããå€æããå¿ èŠããããŸãã
ãã®ããã«ãããã衚瀺ããå®éã®ã³ã³ããŒãã³ãã«å°éãããŸã§ãã³ã³ãã³ããæååãšããŠèš±å¯ããããšã«ããŸããã ããã§ç§ã¯ãããããŒã¯ããŠã³ã«å€æããŸãã
ãããããã°ã©ã ã§è¡ãããã®ã³ã¡ã³ããè¿œå ããŸãã remark-preset-lint-recommendedãç¡èŠã§ããå ŽåããããŸãã
ã€ã³ã¹ããŒã«åè
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ãšããŠå解éã§ããããã«ãªããŸããã
ç§ãééãããã1ã€ã®èœãšãç©ŽããããŸãã >-
è€æ°è¡ã䜿çšããŠãããšãããã©ãŒããããé©åã§ã¯ãããŸãã
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-transformer-remarkã§çŽæ¥ãµããŒããããŠãããã®ãããããŸãããããããŸã§ã®éã https ïŒ ã -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æ£åžžã«åäœããŠããŸããããreact-flickity-componentãã©ã€ãã©ãªãã€ã³ã¹ããŒã«ãããããæ¬çªãã«ãããã»ã¹ãå®å šã«ã¯ã©ãã·ã¥ããŸãã
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)
Webpackããã©ã€ãã©ãªãé€å€ããããšããŠããŸããæ©èœããŸããïŒ @see https://github.com/gatsbyjs/gatsby/issues/7599ïŒ
ããã«ã¡ã¯ããããïŒ@comxdïŒãç³ãèš³ãããŸãããç§ã¯æ
è¡ããŠããŸããã
æ®å¿µãªãããç§ã«ã¯ããã«ã€ããŠã®æŽå¯ããããŸããã ã³ãŒãããã§ãã¯ã€ã³ããŠã¿ãŸããã nullã®ã³ã³ãã€ã©ã¯ããªããŒã¯ã©ã€ãã©ãªããååŸãããŠããããã§ãã
gatsby-node.jsãã¡ã€ã«ã§ã«ãŒãã䜿çšããŠããããã§ãã
ããã¯ãããŒã¯ããŠã³ã§ã¯ãªãããŸãã¯ããã«æªãããšã«ç©ºã§ã¯ãªããããªãããããåŠçããããšããŠããããã€ãã®ã³ã³ãã³ãã«é¢é£ããŠããå¯èœæ§ããããŸãã ãã®äžã«ããã€ãã®console.logã¹ããŒãã¡ã³ããå
¥ããŠã¿ãŠã空ã®äœãããããåŒãèµ·ãããŠãããã¿ãŒã³ãèŠã€ãããã©ããã確èªããŠãã ããã
ããã¯å®å šã«ãªãã§ããå¯èœæ§ããããŸããã以äžã®ãããªããŒã¯ããŠã³ã³ã³ããŒãã³ããäœæããŠãããŒã¯ããŠã³ã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ã¯ééããªãå®å šã«ãªãã§ã¯ãããŸããïŒ ããã¯åççãªã¢ãããŒãã§ãã
ãšã¯ãããGatsbyã®å€§ããªå©ç¹ã®1ã€ã¯ããã«ãæã«ãããã®æäœãå®è¡ã§ããããšã§ããããã¯ããšã³ããŠãŒã¶ãŒã«MarkdownããŒãµãŒãè³Œå ¥ããå¿ èŠããªããã䟿å©ã§ãã
@DSchauã¢ããªãåæ°Žåããããšãã«ãMarkdownããŒãµãŒãå®éã«ãŠãŒã¶ãŒã«åºè·ãããŸãããïŒ
@blakenollç¬åµçãªèãæ¹ã倧奜ãã§ãïŒ
gatsby-config.js
ã«å«ãŸããŠãããã¹ãŠã®ãªããŒã¯ãã©ã°ã€ã³/æ§æããã«ã€ã³ããããã«å©çšã§ãããã®ã¯ãããŸããïŒã®ã£ãããŒã®ãªããŒã¯ã®å®è£
ãæäŸããŠããèå°è£ã§è¡ããããã¹ãŠã®æ©èœãè€è£œããå¿
èŠã¯ãããŸããïŒ ããã«ãããããŒããã£ãŒã«ãã®çæãå°ãç°¡åã«ãªããŸãã ãããããã¹ããããç¹°ãè¿ãå¯èœãªãã£ãŒã«ããšããŒãžããšã®ã³ã³ãã³ãã®ããªãšãŒã·ã§ã³ã«ã€ããŠèãããšãéåžžã«é¢åã§ãã
@blakenoll察決ã®ãã³ããããããšãã éåžžã«åœ¹ã«ç«ã¡ãããã³ããã¿ãŒã§HTMLã䜿çšããããã«å¿ èŠãªããšãå®è¡ããŸããã ãšã¯ãããMarkdownã䜿çšããŠãããŒãžã®ããŸããŸãªéšåã«ããŸããŸãªã³ã³ãã³ããæž¡ãå¿ èŠãããWebããŒãžãäœæããããã®äžæ Œå¥œãªã¢ãããŒãã®ããã§ãã
ããçš®ã®markdownParseré¢æ°ãgraphQLã¯ãšãªã®frontmatterã»ã¯ã·ã§ã³å ã«é©çšããŠïŒç»åãæäœããæ¹æ³ãšåæ§ã«ïŒãfrontmatterå ã®çä¿¡ããŒã¯ããŠã³æååã解æããŠHTMLã«å€æããæ¹æ³ã¯ãããŸããïŒ graphQLã®å°é家ã§ã¯ãããŸãã...ãã èããããšããŠããã ãã§ãã
ããã¯ãNetifly CMSã§Gatsbyã䜿çšããŠããå ŽåãIMO b / cã®éèŠãªåé¡ã§ããNetiflyã«ã¯ãããŸããŸãªããã³ããã¿ãŒãã£ãŒã«ãã«Markdownãå€ãšããŠåãå ¥ãããªãã·ã§ã³ããããŸãã ãã ãããããã®ãã£ãŒã«ããã¯ãšãªãããšãHTMLã«è§£æãããã®ã§ã¯ãªããæååã§ããŒã¯ããŠã³ãšããŠè¿ãããŸãã @amitjindalãš@blakenollã®ãœãªã¥ãŒã·ã§ã³ã¯æ©èœããŸããã @ DSchauãè¿°ã¹ãããã«ãåé¿ã§ããã®ã§ããã°ãå§ãã§ããŸããã ç§ããGatbsyã«ç²ŸéããŠãã人ããã®èãã¯ãããŸããïŒ
@skylarweaverç§ã¯ééããªãããªããšåãããŒãžã«ããŸãã ãã®æ å ±ã解æã§ããããŒããã£ãŒã«ããäœæããæ§è³ªã¯ç解ããŠããŸãããç¹°ãè¿ãå¯èœãªãã£ãŒã«ããšããµããã«ããããã£ãŒã«ãåã®ããªãšãŒã·ã§ã³ãå€ãCMSããŒã¿ã§ã¯å°ãæ±ãã«ââãããªããŸãã ãã®æç¹ã§GatsbyRemarkãã©ã°ã€ã³ã®äžéšãŸãã¯ãã¹ãŠãåå©çšããæ確ãªæ¹æ³ããªãããšã«å ããŠã
@skylarweaverãèšã£ãããšã+1ããŠ
@amitjindalã°ããã質åãããããŸãããã ">-"ã¯äœãããŸããïŒ netlify cmsã¹ã¿ãŒã¿ãŒã䜿çšãããšã>ã>-ã|ããããããŸã£ãããªããã«ããããããçæãããåºåã«ãŸã£ããéãããªãããã§ãã
@ãåç §ããŠãã ãããããã¯ã¹ã«ã©ãŒããããã¯æ¹è¡ã«ã€ããŠã§ãã
ã©ãããã°ããŒãã«ãæ¿å ¥ã§ããŸããïŒ ããã¯åäœããŸãã
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|
ããã¯çæããŸãïŒ
ãã¹ã
|æ|ç¯çŽ|æ¯åº| | --- | --- | --- | | 1æ| $ 100 | $ 900 | | 7æ| $ 750 | $ 1000 | | 12æ| $ 250 | $ 300 | | 4æ| $ 400 | $ 700 |
@KyleAMathewsããããšãããã®çš®ã®äœæ¥ã§ãããæããã«ã frontmattermd
ãã£ãŒã«ããšçã®frontmatter
ïŒ
@omeidããããèšç»ã¯ãããŸããâããã¯ã誰ããäœæããŠã³ãã¥ããã£ãšå ±æããããã®åªãããã©ã°ã€ã³ã«ãªããŸãã
ãããè¡ããã©ã°ã€ã³ãäœæããŸããïŒ gatsby-transformer-remark-frontmatter ã ç§ã®ãã¹ãããã¯ããŸãããããã§ãç§ãã¯ã©ã€ã¢ã³ãã®ããã«è¡ã£ãŠãããããžã§ã¯ãã§ããã䜿çšããããšãèšç»ããŠããŸãããçãããèŠãŠãééã£ãŠããããã«èŠãããã®ããããã©ããæããŠããã ããã°å¹žãã§ããgatsbyãã©ã°ã€ã³ãæžãã®ã¯åããŠãªã®ã§ã @omeidã«ãã£ãŠææ¡ãããã«ãŒããåããMarkdownRemarkããŒãã«frontmattermd
ãã£ãŒã«ããè¿œå ããŸãã
åœåãgatsby-transformer-remarkãæ¶è²»ããæ°ããããŒã¯ããŠã³ãã¡ã€ã«ããŒããäœæã§ããããšã«æ°ä»ãåã«ãgatsby-transformer-remarkã®setFieldsOnGraphQLNodeTypeé¢æ°ã«ãã£ãŠãšã¯ã¹ããŒãããããªãŸã«ããŒãåŒã³åºããæ°ããå¥ã®ãªãŸã«ããŒå ã«äœæãããããŒã¯ããŠã³ããŒãã ããã«ãããã°ã«ãŒãé¢æ°ã«äœ¿çšããããããªãã£ãŒã«ãenumã䜿çšããŠMarkdownRemarkããŒãäžã®ä»»æã®ãã£ãŒã«ããã¯ãšãªã§ããããã«ãªããŸãããããã¯ç§ãæ¬åœã«æ°ã«å ¥ã£ããã®ã§ãããå®éã«äœãã«äœ¿çšããã®ã¯ããã¯ã®ããã«æããŸããã åŸäžã®ããã«ããã«ä¿åããŸããã
ããã«ã¡ã¯@WhiteAbeLincolnç§ã¯ã€ã³ã¹ããŒã«ããŠãã¹ãããããšããŸããïŒ
npm i gatsby-transformer-remark-frontmatter
npm ERR! code ENOVERSIONS
npm ERR! No valid versions available for gatsby-transformer-remark-frontmatter
ç³ãèš³ãããŸãããããŸã npmã«å ¬éããŠããªãããšã«æ°ä»ããŸããã ä»äºãçµãããå ¬éããŸãã®ã§ãç¥ããããŸãã
âé¿éšãã¯ã€ã
2019幎6æ17æ¥ã«ã¯ãåå22æ53ã§ãbroeker [email protected]æžããŸããïŒ
ããã«ã¡ã¯@WhiteAbeLincolnç§ã¯ã€ã³ã¹ããŒã«ããŠãã¹ãããããšããŸããïŒ
npm i gatsby-transformer-remark-frontmatter npm ERRïŒ ã³ãŒãENOVERSIONSnpm ERRïŒ gatsby-transformer-remark-frontmatterã«äœ¿çšã§ããæå¹ãªããŒãžã§ã³ã¯ãããŸããâ
ããªããèšåãããã®ã§ããªãã¯ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããããGitHubã§è¡šç€ºããããã¹ã¬ããããã¥ãŒãããŠãã ããã
@WhiteAbeLincoln gatsby-transformer-remark- frontmatterãè©ŠããŸãããããšã©ãŒãçºçããŸããã
ãšã©ãŒïŒ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
ã䜿çšããã«äžèšãå®çŸããããã«ã«ã¹ã¿ã YAMLã¿ã°ã解æãããã©ã°ã€ã³ãäœæããããšã«èå³ããããŸãïŒã·ã£ãŒããç»åã®URLã解æããã®ãšåãæ¹æ³ïŒã
誰ããç§ã«ç»åã®URLã解æãããã³ãŒããæããŠããããçŸåšã·ã£ãŒãã§ã©ã®ããã«è¡ãããŠãããã®äŸãèŠãããšãã§ããŸããïŒ
ðMDXã䜿çšããŠãã人ã®ããã«ãfrontmatterãµããŒããè¿œå ãããã©ã°ã€ã³ãäœæããŸããhttps://www.gatsbyjs.org/packages/gatsby-plugin-mdx-frontmatter/
@zslabs ãã9æéåãã«è§£æ±ºçãæçš¿ãããããšã¯
ããŒãžã®1ã€ã«ãã£ãšè€éãªããŒã¿æ§é ã䜿çšãããã£ãã®ã§ãããã«èŠåŽããŠããŸããã
ããã³ããã¿ãŒã«ã¯ãã¿ã€ãã«ã泚ç®ã®ç»åãªã©ã®ããã€ãã®ãã£ãŒã«ããå«ãäžé£ã®ã»ã¯ã·ã§ã³ããããããããã«ããŒã¯ããŠã³ã§äœæãããããã£ããããŸããã
createNodeFieldã䜿çšããŠããæ¢åã®ããã³ããã¿ãŒæ§é ã«è¿œå ãããŠããªãç¬èªã®ãã£ãŒã«ãã§äœæãããŠãããããè«ççã«ãªã³ã¯ããã®ã«åé¡ããã£ããããããã¯ã§ããŸããã§ããã
æçµçã«createFieldExtensionã䜿çšããŠãsection.bodyãç
§äŒããããšãã«ã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")
}
ç§ã¯ãããå°ãéãæ¹æ³ã§è§£æ±ºããŸããã
ããã¯ç§ã«ã¯ããŸããããŸããã æåã«ãåŒæ°from
ã®defaultValue: true
ãæåŠãããšã©ãŒãçºçããŸããããã¯æååã§ããå¿
èŠããããŸãã ããã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") }, }, } ] }
ãã®æ¹æ³ãè©ŠããŠã¿ããšããgatsby-transformer-remarkãã®ãã©ã°ã€ã³ãªãã·ã§ã³ãç¡å¹ã«ãªããŸãã
æãåèã«ãªãã³ã¡ã³ã
ããã¯å®å šã«ãªãã§ããå¯èœæ§ããããŸããã以äžã®ãããªããŒã¯ããŠã³ã³ã³ããŒãã³ããäœæããŠãããŒã¯ããŠã³ãHTMLã«å€æããå¿ èŠãããå Žæã§ãã³ãã¬ãŒãã§äœ¿çšããããšã¯ã§ããŸããã