This plug-in adds support for directly embedding code examples as links to
popular REPLs such as Babel,
Codepen, and CodeSandbox. This
enables example code to be stored along side of, and revisioned with, your
website content.
This plug-in was created to solve a couple of problems the React team has faced
with reactjs.org:
- Examples were stored separately from documentation (eg in Codepen) which made
it more difficult to coordinate updates. (It was easy to forget to update an
example when an API changes.)
- Examples (eg Codepens) were owned by a single author, so the community
couldn't contribute PRs to update them without forking and fragmenting
ownership.
- It was easy to create invalid links (eg Babel REPL links that _don't quite
work).
Overview
For example, given the following project directory structure:
./examples/
├── components-and-props
│ ├── composing-components.js
│ ├── extracting-components.js
│ └── rendering-a-component.js
├── hello-world.js
├── introducing-jsx.js
These example files can be referenced via links in markdown that get transformed
to HTML links that open the embedded code examples in a REPL. For example:
[See it in Babel](babel://hello-world)
<a href="https://babeljs.io/repl/#?presets=react&code_lz=...">
See it in Babel
</a>
[Try it on CodePen](codepen://components-and-props/rendering-a-component)
<a href="/redirect-to-codepen/components-and-props/rendering-a-component">
Try it on CodePen
</a>
[Try it on CodeSandbox](codesandbox://components-and-props/rendering-a-component)
<a href="https://codesandbox.io/api/v1/sandboxes/define?parameters=...">
Try it on CodeSandbox
</a>
How does it work?
Codepen links point to Gatsby pages (also created by this plug-in) that redirect
using the
Codepen prefill API to
create a working, runnable demo with the linked example code.
Babel and CodeSandbox links use the
same URL compression schema used by the Babel REPL
to embed the local code example in a URL that enables it to be viewed directly
within the target REPL.
All example links are also verified to ensure that they reference valid example
files. For example, if there is a link to
codepen://components-and-props/rendering-a-component
, this plug-in will verify
that a file components-and-props/rendering-a-component.js
exists within the
specified examples directory. (This will avoid broken links at runtime.)
Installation
npm install --save gatsby-remark-code-repls
Usage
{
resolve: 'gatsby-remark-code-repls',
options: {
defaultText: 'Click here',
dependencies: [],
directory: `${__dirname}/examples/`,
externals: [],
html: '',
redirectTemplate: `${__dirname}/src/redirect-template.js`),
target: '_blank',
},
},