рдХреНрдпрд╛ рдорд╛рд░реНрдХрдбрд╛рдЙрди рдкреГрд╖реНрдареЛрдВ рдореЗрдВ рдЪрд░ рд░рдЦрдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ рдЬреЛ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдмрджрд▓ рдЬрд╛рдПрдЧрд╛? рдореИрдВ рдПрдХ рд╕реЗрд╡рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рд▓рд┐рдЦ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рдПрдХ URL рдХреЗ рд░реВрдк рдореЗрдВ рд╣реИред URL рдорд╛рд░реНрдХрдбрд╛рдЙрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдПрдХ рдЬреЛрдбрд╝реА рдореЗрдВ рд╣реИ рдФрд░ рдореИрдВ рдЗрд╕реЗ рдмрджрд▓рдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рдФрд░ рдЗрд╕реЗ рдмрджрд▓рдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ред
рдХреНрдпрд╛ рдорд╛рд░реНрдХрдбрд╛рдЙрди рдореЗрдВ рдХрд╕реНрдЯрдо рдШрдЯрдХ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдореЗрд░рд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реИ? рдЗрд╕рдХреЗ рд▓рд┐рдП рднрд╛рд░реА рд╣рд╛рде рд▓рдЧрддрд╛ рд╣реИред
рдЖрдк рдЗрд╕рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рдХрд╕реНрдЯрдо рд╕рд╣рд╛рдпрдХ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ (рдпрд╛ lodash.template
https://lodash.com/docs/4.17.11#template рдХреА рддрд░рд╣ рдХреБрдЫ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ)
рдпрд╣рд╛рдБ рдПрдХ рддреНрд╡рд░рд┐рдд рдФрд░ рдЧрдВрджрд╛ рд╕рдорд╛рдзрд╛рди рд╣реИ:
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рдПрдХ рдорд╛рд░реНрдХрдбрд╛рдЙрди рдлрд╛рдЗрд▓ sample.md
рджрд┐рдпрд╛ рдЧрдпрд╛:
---
title: Sample
---
## Hello World
This is a [link](%URL%/sub-path), and so is [this](%URL%/sub-path)
рдЖрдк рдПрдХ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ (рдЖрдЗрдП рдЗрд╕реЗ src/utils/template.js
) рдФрд░ рдРрд╕рд╛ рдХреБрдЫ рд▓рд┐рдЦреЗрдВ
export default function template(content, data) {
return content.replace(/%(.+)%/g, (match, key) => {
const value = data[key]
if (typeof value !== 'undefined') {
return value
}
return match // guards against some unintentional prefix
});
}
рдЕрдм рдпрд╣ рд╕рдм рдПрдХ рд╕рд╛рде рд╡рд╛рдпрд░рд┐рдВрдЧ, рдЖрдкрдХреЛ рдЕрдкрдиреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╕ _use_ рдЗрд╕ рдЯреЗрдореНрдкрд▓реЗрдЯ рдлрд╝рдВрдХреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред data
рдСрдмреНрдЬреЗрдХреНрдЯ рдЬреЛ рдХреБрдЫ рднреА рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдЬрд╣рд╛рдВ рд╕реЗ рднреА рдЦреАрдВрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЧреНрд░рд╛рдлрд╝рдХ, рдХреБрдЫ рд╕реНрдерд┐рд░рд╛рдВрдХ рдлрд╝рд╛рдЗрд▓, рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░, рдЖрджрд┐)ред
import React from 'react'
import template from '../utils/template';
const URL = 'https://google.com'; // this can be from wherever
export default function SomeMarkdownPage({ data }) {
// data is from GraphQL, presume the parent is data.markdown
return (
<div dangerouslySetInnerHTML={{
__html: template(data.markdown.html, {
URL
})
}} />
)
}
рдЗрд╕рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рднреА рд╣реИ рдХреНрдпрд╛? рдпрд╣ рдПрдХ рдХрд╛рдлреА рдЙрдкрдпреЛрдЧреА рдЧреИрдЯреНрд╕рдмреА-рдЯрд┐рдкреНрдкрдгреА-рдкреНрд▓рдЧрдЗрди рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореМрдЬреВрдж рд╣реИ! рдЕрдЧрд░ рдЖрдкрдХреЛ рдпрд╣ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдХреЛрдИ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ, рддреЛ рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрднреА рдХреЗ рд▓рд┐рдП, рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЖрдкрдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдХрд╛рдо рдХрд░реЗрдЧрд╛!
рдЙрддреНрддрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реЗ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреГрдкрдпрд╛ рдмреЗрдЭрд┐рдЭрдХ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓реЗрдВ рдЕрдЧрд░ рд╣рдо рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдЖрдЧреЗ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЧреИрдЯреНрд╕рдмреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдЖрдк рдЗрд╕рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рдХрд╕реНрдЯрдо рд╕рд╣рд╛рдпрдХ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ (рдпрд╛
lodash.template
https://lodash.com/docs/4.17.11#template рдХреА рддрд░рд╣ рдХреБрдЫ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ)рдпрд╣рд╛рдБ рдПрдХ рддреНрд╡рд░рд┐рдд рдФрд░ рдЧрдВрджрд╛ рд╕рдорд╛рдзрд╛рди рд╣реИ:
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рдПрдХ рдорд╛рд░реНрдХрдбрд╛рдЙрди рдлрд╛рдЗрд▓
sample.md
рджрд┐рдпрд╛ рдЧрдпрд╛:рдЖрдк рдПрдХ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ (рдЖрдЗрдП рдЗрд╕реЗ
src/utils/template.js
) рдФрд░ рдРрд╕рд╛ рдХреБрдЫ рд▓рд┐рдЦреЗрдВрдЕрдм рдпрд╣ рд╕рдм рдПрдХ рд╕рд╛рде рд╡рд╛рдпрд░рд┐рдВрдЧ, рдЖрдкрдХреЛ рдЕрдкрдиреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╕ _use_ рдЗрд╕ рдЯреЗрдореНрдкрд▓реЗрдЯ рдлрд╝рдВрдХреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
data
рдСрдмреНрдЬреЗрдХреНрдЯ рдЬреЛ рдХреБрдЫ рднреА рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдЬрд╣рд╛рдВ рд╕реЗ рднреА рдЦреАрдВрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЧреНрд░рд╛рдлрд╝рдХ, рдХреБрдЫ рд╕реНрдерд┐рд░рд╛рдВрдХ рдлрд╝рд╛рдЗрд▓, рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░, рдЖрджрд┐)редрдЗрд╕рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рднреА рд╣реИ рдХреНрдпрд╛? рдпрд╣ рдПрдХ рдХрд╛рдлреА рдЙрдкрдпреЛрдЧреА рдЧреИрдЯреНрд╕рдмреА-рдЯрд┐рдкреНрдкрдгреА-рдкреНрд▓рдЧрдЗрди рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореМрдЬреВрдж рд╣реИ! рдЕрдЧрд░ рдЖрдкрдХреЛ рдпрд╣ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдХреЛрдИ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ, рддреЛ рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрднреА рдХреЗ рд▓рд┐рдП, рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЖрдкрдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдХрд╛рдо рдХрд░реЗрдЧрд╛!
рдЙрддреНрддрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реЗ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреГрдкрдпрд╛ рдмреЗрдЭрд┐рдЭрдХ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓реЗрдВ рдЕрдЧрд░ рд╣рдо рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдЖрдЧреЗ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЧреИрдЯреНрд╕рдмреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!