eleventy-plugin-markdown-copy-button

0.7.0 • Public • Published

eleventy-plugin-markdown-copy-button

Important: currently only works with the default 11ty library markdown-it.

module.exports = (eleventyConfig) => {
  const MarkdownCopyButton = require("eleventy-plugin-markdown-copy-button");
  eleventyConfig.addPlugin(MarkdownCopyButton);
};

With markdown-it customisation

If you want to have custom markdown-it options then ensure you setLibrary for markdown (md) before adding the plugin, like so:

module.exports = (eleventyConfig) => {
  const markdownIt = require("markdown-it");
  let markdownLibrary = markdownIt({
    html: true,
    breaks: true,
    linkify: true,
  });
  eleventyConfig.setLibrary("md", markdownLibrary);
  const MarkdownCopyButton = require("eleventy-plugin-markdown-copy-button");
  eleventyConfig.addPlugin(MarkdownCopyButton);
};

Internally this library defines markdownIt.renderer.rules.fence. This library will respect any prior modifications to this rule. However, if you modify this rule yourself after importing eleventy-plugin-markdown-copy-button the plugin may stop working.

Styling

However you do css style the components that are added however you like, for example:

#copy-component {
  position: relative;
  display: flex;
}

copy-component *:not([slot="button"]) {
  margin: 0;
}
copy-component button {
  position: absolute;
  text-transform: uppercase;
  background: rgba(0, 0, 0, 0.5);
  color: white;
  top: 0;
  right: 0;
  border: none;
}

copy-component button:active {
  background: rgba(255, 255, 255, 0.7);
  color: black;
}

Custom text

If all you want to do is customise the text for the button you can do the following:

module.exports = (eleventyConfig) => {
  const MarkdownCopyButton = require("eleventy-plugin-markdown-copy-button");
  eleventyConfig.addPlugin(MarkdownCopyButton, {
    copyText: "Copy text",
    copiedText: "Done!",
  });
};

Custom html

So you want full control of the HTML? Go for it!

Internally this plugin uses copy-component from npm, check out the demos.

module.exports = (eleventyConfig) => {
  const MarkdownCopyButton = require("eleventy-plugin-markdown-copy-button");
  eleventyConfig.addPlugin(MarkdownCopyButton, {
    renderer: (content) =>
      `<copy-component oncopy="this.querySelector('[slot=button]').textContent='${copiedText}'" style="display: block;">${content}<button slot="button">Copy</button></copy-component>`,
  });
};

Options

Internally this plugin uses eleventy-plugin-add-web-component-definitions which can be customised using webComponentDefinitionsOptions.

For example you could change the path to the copy-component

module.exports = (eleventyConfig) => {
  eleventyConfig.addPlugin(require("eleventy-plugin-markdown-copy-button"), {
    webComponentDefinitionsOptions: {
      specifiers: {
        "copy-component": "/copy-component/index.js",
      },
    },
  });

  eleventyConfig.addPassthroughCopy({
    "./node_modules/copy-component": "./copy-component",
  });
};

Package Sidebar

Install

npm i eleventy-plugin-markdown-copy-button

Weekly Downloads

2

Version

0.7.0

License

MIT

Unpacked Size

6.18 kB

Total Files

4

Last publish

Collaborators

  • georgegriff