Gatsby: Variáveis ​​no Markdown?

Criado em 28 nov. 2018  ·  1Comentário  ·  Fonte: gatsbyjs/gatsby

Resumo

Existe uma maneira de ter variáveis ​​nas páginas de redução que serão substituídas por valores? Estou escrevendo documentação sobre um serviço que é um URL. O URL está em alguns arquivos markdown e eu gostaria de não ter que encontrar e substituir caso ele mude.

É a minha melhor opção para adicionar um componente personalizado no Markdown? Parece mão pesada para isso.

question or discussion

Comentários muito úteis

Você pode escrever um pequeno auxiliar personalizado para isso (ou usar algo como lodash.template https://lodash.com/docs/4.17.11#template)

Aqui está uma solução rápida e suja:

Dado um arquivo markdown sample.md com o seguinte conteúdo:

---
title: Sample
---

## Hello World

This is a [link](%URL%/sub-path), and so is [this](%URL%/sub-path)

Você pode criar um arquivo (vamos chamá-lo de src/utils/template.js ) e escrever algo assim

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
  });
}

Agora conectando tudo junto, você só precisa _usar_ esta função de modelo para substituir seu conteúdo. O objeto data pode ser o que você quiser e pode ser obtido de qualquer lugar (por exemplo, graphql, algum arquivo de constantes, variáveis ​​de ambiente, etc.).

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
      })
    }} />
  )
}

Isso faz sentido? Este poderia ser um plugin gatsby -note bastante útil, mas não tenho certeza se existe! Se você tiver algum interesse em escrever isso, seria legal, mas por enquanto, certamente funcionará para o seu caso de uso!

Vou fechar como respondido, mas sinta-se à vontade para reabrir se algum de nós puder ajudar mais. Obrigado por usar o Gatsby!

>Todos os comentários

Você pode escrever um pequeno auxiliar personalizado para isso (ou usar algo como lodash.template https://lodash.com/docs/4.17.11#template)

Aqui está uma solução rápida e suja:

Dado um arquivo markdown sample.md com o seguinte conteúdo:

---
title: Sample
---

## Hello World

This is a [link](%URL%/sub-path), and so is [this](%URL%/sub-path)

Você pode criar um arquivo (vamos chamá-lo de src/utils/template.js ) e escrever algo assim

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
  });
}

Agora conectando tudo junto, você só precisa _usar_ esta função de modelo para substituir seu conteúdo. O objeto data pode ser o que você quiser e pode ser obtido de qualquer lugar (por exemplo, graphql, algum arquivo de constantes, variáveis ​​de ambiente, etc.).

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
      })
    }} />
  )
}

Isso faz sentido? Este poderia ser um plugin gatsby -note bastante útil, mas não tenho certeza se existe! Se você tiver algum interesse em escrever isso, seria legal, mas por enquanto, certamente funcionará para o seu caso de uso!

Vou fechar como respondido, mas sinta-se à vontade para reabrir se algum de nós puder ajudar mais. Obrigado por usar o Gatsby!

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

KyleAMathews picture KyleAMathews  ·  3Comentários

timbrandin picture timbrandin  ·  3Comentários

benstr picture benstr  ·  3Comentários

rossPatton picture rossPatton  ·  3Comentários

jimfilippou picture jimfilippou  ·  3Comentários