Code Monkey home page Code Monkey logo

gatsby-remark-embedder's Introduction

gatsby-remark-embedder logo

gatsby-remark-embedder

Gatsby Remark plugin to embed well known services by their URL.


Build Status Code Coverage version downloads MIT License All Contributors PRs Welcome Code of Conduct

The problem

Trying to embed well known services (like CodePen, CodeSandbox, GIPHY, Instagram, Lichess, Pinterest, Slides, SoundCloud, Spotify, Streamable, Testing Playground, Twitch, Twitter or YouTube) into your Gatsby website can be hard, since you have to know how this needs to be done for all of these different services.

This solution

gatsby-remark-embedder tries to solve this problem for you by letting you just copy-paste the link to the gif/pen/pin/player/playground/post/sandbox/tweet/video you want to embed right from within your browser onto a separate line (surrounded by empty lines) and replace it with the proper embed-code.

Table of Contents

Installation

This module is distributed via npm which is bundled with node and should be installed as one of your project's dependencies:

npm install gatsby-remark-embedder

or

yarn add gatsby-remark-embedder

This library has a required peerDependencies listing for gatsby and should be used as a plugin for gatsby-transformer-remark or gatsby-plugin-mdx.
Depending on the services you want to embed, you should also install gatsby-plugin-instagram-embed, gatsby-plugin-pinterest and/or gatsby-plugin-twitter.

Usage

// In your gatsby-config.js

module.exports = {
  // Find the 'plugins' array
  plugins: [
    {
      resolve: `gatsby-transformer-remark`,
      options: {
        plugins: [
          {
            resolve: `gatsby-remark-embedder`,
            options: {
              customTransformers: [
                // Your custom transformers
              ],
              services: {
                // The service-specific options by the name of the service
              },
            },
          },

          // Other plugins here...
        ],
      },
    },
  ],
};

or

// In your gatsby-config.js

module.exports = {
  // Find the 'plugins' array
  plugins: [
    {
      resolve: `gatsby-plugin-mdx`,
      options: {
        gatsbyRemarkPlugins: [
          {
            resolve: `gatsby-remark-embedder`,
            options: {
              customTransformers: [
                // Your custom transformers
              ],
              services: {
                // The service-specific options by the name of the service
              },
            },
          },

          // Other plugins here...
        ],
      },
    },
  ],
};

Supported services

CodePen

Usage

https://codepen.io/team/codepen/pen/PNaGbb
Result
<iframe
  src="https://codepen.io/team/codepen/embed/preview/PNaGbb"
  style="width:100%; height:300px;"
></iframe>

CodeSandbox

Usage

https://codesandbox.io/s/ynn88nx9x?view=split
Result
<iframe
  src="https://codesandbox.io/embed/ynn88nx9x?view=split"
  style="width:100%; height:500px; border:0; border-radius: 4px; overflow:hidden;"
  allow="geolocation; microphone; camera; midi; vr; accelerometer; gyroscope; payment; ambient-light-sensor; encrypted-media; usb"
  sandbox="allow-modals allow-forms allow-popups allow-scripts allow-same-origin"
></iframe>

GIPHY

Usage

https://giphy.com/gifs/howtogiphygifs-how-to-XatG8bioEwwVO
Result
<div style="width:100%;height:0;padding-bottom:63%;position:relative;">
  <iframe
    src="https://giphy.com/embed/XatG8bioEwwVO"
    width="100%"
    height="100%"
    style="position:absolute"
    frameborder="0"
    class="giphy-embed"
    allowfullscreen
  ></iframe>
</div>

Instagram

The returned HTML snippet from the Instagram transformer will only be automatically recognized as an embedded post when Instagram's embed JavaScript is included on the page.
Since the Instagram transformer doesn't include this JavaScript (because we don't want to include it multiple times on a page when having multiple embeds), you have to include it yourself. The recommended way of including it is by using gatsby-plugin-instagram-embed.

Usage

https://instagram.com/p/B60jPE6J8U-
Result
<blockquote
  class="instagram-media"
  data-instgrm-captioned
  data-instgrm-permalink="https://www.instagram.com/p/B60jPE6J8U-/?utm_source=ig_embed&amp;utm_campaign=loading"
  data-instgrm-version="12"
  style="background:#FFF; border:0; border-radius:3px; box-shadow:0 0 1px 0 rgba(0,0,0,0.5),0 1px 10px 0 rgba(0,0,0,0.15); margin: 1px; max-width:540px; min-width:326px; padding:0; width:99.375%; width:-webkit-calc(100% - 2px); width:calc(100% - 2px);"
>
  <div style="padding:16px;">
    <a
      href="https://www.instagram.com/p/B60jPE6J8U-/?utm_source=ig_embed&amp;utm_campaign=loading"
      style="background:#FFFFFF; line-height:0; padding:0 0; text-align:center; text-decoration:none; width:100%;"
      target="_blank"
    >
      <div style="display: flex; flex-direction: row; align-items: center;">
        <div
          style="background-color: #F4F4F4; border-radius: 50%; flex-grow: 0; height: 40px; margin-right: 14px; width: 40px;"
        ></div>
        <div
          style="display: flex; flex-direction: column; flex-grow: 1; justify-content: center;"
        >
          <div
            style="background-color: #F4F4F4; border-radius: 4px; flex-grow: 0; height: 14px; margin-bottom: 6px; width: 100px;"
          ></div>
          <div
            style="background-color: #F4F4F4; border-radius: 4px; flex-grow: 0; height: 14px; width: 60px;"
          ></div>
        </div>
      </div>
      <div style="padding: 19% 0;"></div>
      <div style="display:block; height:50px; margin:0 auto 12px; width:50px;">
        <svg
          width="50px"
          height="50px"
          viewBox="0 0 60 60"
          version="1.1"
          xmlns="https://www.w3.org/2000/svg"
          xmlns:xlink="https://www.w3.org/1999/xlink"
        >
          <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
            <g transform="translate(-511.000000, -20.000000)" fill="#000000">
              <g>
                <path
                  d="M556.869,30.41 C554.814,30.41 553.148,32.076 553.148,34.131 C553.148,36.186 554.814,37.852 556.869,37.852 C558.924,37.852 560.59,36.186 560.59,34.131 C560.59,32.076 558.924,30.41 556.869,30.41 M541,60.657 C535.114,60.657 530.342,55.887 530.342,50 C530.342,44.114 535.114,39.342 541,39.342 C546.887,39.342 551.658,44.114 551.658,50 C551.658,55.887 546.887,60.657 541,60.657 M541,33.886 C532.1,33.886 524.886,41.1 524.886,50 C524.886,58.899 532.1,66.113 541,66.113 C549.9,66.113 557.115,58.899 557.115,50 C557.115,41.1 549.9,33.886 541,33.886 M565.378,62.101 C565.244,65.022 564.756,66.606 564.346,67.663 C563.803,69.06 563.154,70.057 562.106,71.106 C561.058,72.155 560.06,72.803 558.662,73.347 C557.607,73.757 556.021,74.244 553.102,74.378 C549.944,74.521 548.997,74.552 541,74.552 C533.003,74.552 532.056,74.521 528.898,74.378 C525.979,74.244 524.393,73.757 523.338,73.347 C521.94,72.803 520.942,72.155 519.894,71.106 C518.846,70.057 518.197,69.06 517.654,67.663 C517.244,66.606 516.755,65.022 516.623,62.101 C516.479,58.943 516.448,57.996 516.448,50 C516.448,42.003 516.479,41.056 516.623,37.899 C516.755,34.978 517.244,33.391 517.654,32.338 C518.197,30.938 518.846,29.942 519.894,28.894 C520.942,27.846 521.94,27.196 523.338,26.654 C524.393,26.244 525.979,25.756 528.898,25.623 C532.057,25.479 533.004,25.448 541,25.448 C548.997,25.448 549.943,25.479 553.102,25.623 C556.021,25.756 557.607,26.244 558.662,26.654 C560.06,27.196 561.058,27.846 562.106,28.894 C563.154,29.942 563.803,30.938 564.346,32.338 C564.756,33.391 565.244,34.978 565.378,37.899 C565.522,41.056 565.552,42.003 565.552,50 C565.552,57.996 565.522,58.943 565.378,62.101 M570.82,37.631 C570.674,34.438 570.167,32.258 569.425,30.349 C568.659,28.377 567.633,26.702 565.965,25.035 C564.297,23.368 562.623,22.342 560.652,21.575 C558.743,20.834 556.562,20.326 553.369,20.18 C550.169,20.033 549.148,20 541,20 C532.853,20 531.831,20.033 528.631,20.18 C525.438,20.326 523.257,20.834 521.349,21.575 C519.376,22.342 517.703,23.368 516.035,25.035 C514.368,26.702 513.342,28.377 512.574,30.349 C511.834,32.258 511.326,34.438 511.181,37.631 C511.035,40.831 511,41.851 511,50 C511,58.147 511.035,59.17 511.181,62.369 C511.326,65.562 511.834,67.743 512.574,69.651 C513.342,71.625 514.368,73.296 516.035,74.965 C517.703,76.634 519.376,77.658 521.349,78.425 C523.257,79.167 525.438,79.673 528.631,79.82 C531.831,79.965 532.853,80.001 541,80.001 C549.148,80.001 550.169,79.965 553.369,79.82 C556.562,79.673 558.743,79.167 560.652,78.425 C562.623,77.658 564.297,76.634 565.965,74.965 C567.633,73.296 568.659,71.625 569.425,69.651 C570.167,67.743 570.674,65.562 570.82,62.369 C570.966,59.17 571,58.147 571,50 C571,41.851 570.966,40.831 570.82,37.631"
                ></path>
              </g>
            </g>
          </g>
        </svg>
      </div>
      <div style="padding-top: 8px;">
        <div
          style="color:#3897f0; font-family:Arial,sans-serif; font-size:14px; font-style:normal; font-weight:550; line-height:18px;"
        >
          View this post on Instagram
        </div>
      </div>
      <div style="padding: 12.5% 0;"></div>
      <div
        style="display: flex; flex-direction: row; margin-bottom: 14px; align-items: center;"
      >
        <div>
          <div
            style="background-color: #F4F4F4; border-radius: 50%; height: 12.5px; width: 12.5px; transform: translateX(0px) translateY(7px);"
          ></div>
          <div
            style="background-color: #F4F4F4; height: 12.5px; transform: rotate(-45deg) translateX(3px) translateY(1px); width: 12.5px; flex-grow: 0; margin-right: 14px; margin-left: 2px;"
          ></div>
          <div
            style="background-color: #F4F4F4; border-radius: 50%; height: 12.5px; width: 12.5px; transform: translateX(9px) translateY(-18px);"
          ></div>
        </div>
        <div style="margin-left: 8px;">
          <div
            style="background-color: #F4F4F4; border-radius: 50%; flex-grow: 0; height: 20px; width: 20px;"
          ></div>
          <div
            style="width: 0; height: 0; border-top: 2px solid transparent; border-left: 6px solid #f4f4f4; border-bottom: 2px solid transparent; transform: translateX(16px) translateY(-4px) rotate(30deg)"
          ></div>
        </div>
        <div style="margin-left: auto;">
          <div
            style="width: 0; border-top: 8px solid #F4F4F4; border-right: 8px solid transparent; transform: translateY(16px);"
          ></div>
          <div
            style="background-color: #F4F4F4; flex-grow: 0; height: 12px; width: 16px; transform: translateY(-4px);"
          ></div>
          <div
            style="width: 0; height: 0; border-top: 8px solid #F4F4F4; border-left: 8px solid transparent; transform: translateY(-4px) translateX(8px);"
          ></div>
        </div></div
    ></a>
    <p style="margin:8px 0 0 0; padding:0 4px;">
      <a
        href="https://www.instagram.com/p/B60jPE6J8U-/?utm_source=ig_embed&amp;utm_campaign=loading"
        style="color:#000; font-family:Arial,sans-serif; font-size:14px; font-style:normal; font-weight:normal; line-height:17px; text-decoration:none; word-wrap:break-word;"
        target="_blank"
        >Good morning New York! 🗽 #newyork #nyc #brotrip #newyear #2020 #city
        #bluesky #clearsky #timessquare #nycitylife #nycityworld #urban
        #manhattan #travel #cold #winter #citytrip #lastday #streetview
        #citythatneversleeps #bucketlist #buildings #skyscraper #midtown</a
      >
    </p>
    <p
      style="color:#c9c8cd; font-family:Arial,sans-serif; font-size:14px; line-height:17px; margin-bottom:0; margin-top:8px; overflow:hidden; padding:8px 0 7px; text-align:center; text-overflow:ellipsis; white-space:nowrap;"
    >
      A post shared by
      <a
        href="https://www.instagram.com/michaeldeboey/?utm_source=ig_embed&amp;utm_campaign=loading"
        style="color:#c9c8cd; font-family:Arial,sans-serif; font-size:14px; font-style:normal; font-weight:normal; line-height:17px;"
        target="_blank"
      >
        Michaël De Boey</a
      >
      (@michaeldeboey) on
      <time
        style="font-family:Arial,sans-serif; font-size:14px; line-height:17px;"
        datetime="2020-01-02T14:45:30+00:00"
        >Jan 2, 2020 at 6:45am PST</time
      >
    </p>
  </div>
</blockquote>

Options

All options should go under the Instagram namespace.

name Type Required Default Description
accessToken string An App Access Token (recommended) or Client Access Token
accessToken

To get an App Access Token (recommended) or Client Access Token for the Instagram embed, check out the Instagram oEmbed access token docs and requirements.

The safest way to enter your accessToken is to set is as an environment variable.

Example
const GatsbyRemarkEmbedderOptions = {
  services: {
    Instagram: {
      accessToken: process.env.INSTAGRAM_ACCESS_TOKEN,
    },
  },
};

Lichess

Usage

https://lichess.org/MPJcy1JW
Result
<iframe
  src="https://lichess.org/embed/MPJcy1JW"
  width="600"
  height="397"
  frameborder="0"
></iframe>

Pinterest

The returned HTML snippet from the Pinterest transformer will only be automatically recognized as an embedded pin when Pinterest's embed JavaScript is included on the page.
Since the Pinterest transformer doesn't include this JavaScript (because we don't want to include it multiple times on a page when having multiple embeds), you have to include it yourself. The recommended way of including it is by using gatsby-plugin-pinterest.

Usage

https://pinterest.com/pin/99360735500167749
Result
<a
  data-pin-do="embedPin"
  href="https://pinterest.com/pin/99360735500167749"
></a>

Slides

Usage

https://slides.com/kentcdodds/oss-we-want
Result
<iframe
  src="https://slides.com/kentcdodds/oss-we-want/embed"
  width="576"
  height="420"
  scrolling="no"
  frameborder="0"
  webkitallowfullscreen
  mozallowfullscreen
  allowfullscreen
></iframe>

SoundCloud

Usage

https://soundcloud.com/clemenswenners/africa
Result
<iframe
  width="100%"
  height="300"
  scrolling="no"
  frameborder="no"
  src=https://w.soundcloud.com/player?url=https://soundcloud.com/clemenswenners/africa&color=ff5500&auto_play=false&hide_related=true&show_comments=true&show_user=true&show_reposts=false&show_teaser=false&visual=true
></iframe>

Spotify

Usage

https://open.spotify.com/track/0It2bnTdLl2vyymzOkBI3L
Result
<iframe
  src="https://open.spotify.com/embed/track/0It2bnTdLl2vyymzOkBI3L"
  width="100%"
  height="380"
  frameborder="0"
  allowtransparency="true"
  allow="encrypted-media"
></iframe>

Streamable

Usage

https://streamable.com/moo
Result
<iframe
  class="streamable-embed"
  src="https://streamable.com/o/moo"
  frameborder="0"
  scrolling="no"
  width="1920"
  height="1080"
  allowfullscreen
></iframe>

Testing Playground

Usage

https://testing-playground.com/gist/fb336c386145b235372a0f57d5c58205/6d13e4ee508301c8b42f9d2cc8584e70bb05fb4a
Result
<iframe
  src="https://testing-playground.com/embed/fb336c386145b235372a0f57d5c58205/6d13e4ee508301c8b42f9d2cc8584e70bb05fb4a?panes=query,preview"
  height="450"
  width="100%"
  scrolling="no"
  frameborder="0"
  allowTransparency="true"
  style="overflow: hidden; display: block; width: 100%"
></iframe>

Twitch

Twitch embeds can only be embedded on HTTPS websites. Check out the Gatsby docs for setting this up when developing locally.

Usage

https://twitch.tv/videos/546761743
Result
<iframe
  src="https://player.twitch.tv/?video=546761743"
  height="300"
  width="100%"
  frameborder="0"
  scrolling="no"
  allowfullscreen
></iframe>

Options

All options should go under the Twitch namespace.

name Type Required Default Description
parent string / string[] Domain(s) that will be embedding Twitch. You must have one parent key for each domain your site uses.
parent

You could either put in (a) hardcoded value(s) or you could use environment variables that are available during the build process.

Netlify

Netlify has the URL, DEPLOY_URL and DEPLOY_PRIME_URL environment variables. Take a look at the Netlify docs for more info.

Example
const GatsbyRemarkEmbedderOptions = {
  services: {
    Twitch: {
      parent: [
        process.env.URL,
        process.env.DEPLOY_URL,
        process.env.DEPLOY_PRIME_URL,

        // Other domains here...
      ],
    },
  },
};
Vercel

Vercel has the VERCEL_URL environment variable. Take a look at the Vercel docs for more info.

Example
const GatsbyRemarkEmbedderOptions = {
  services: {
    Twitch: {
      parent: [
        process.env.VERCEL_URL,

        // Other domains here...
      ],
    },
  },
};

Twitter

The returned HTML snippet from the Twitter transformer will only be automatically recognized as an Embedded Tweet when Twitter's widget JavaScript is included on the page.
Since the Twitter transformer doesn't include this JavaScript (because we don't want to include it multiple times on a page when having multiple embeds), you have to include it yourself. The recommended way of including it is by using gatsby-plugin-twitter.

Usage

https://twitter.com/MichaelDeBoey93/status/1152991421789548546

https://twitter.com/i/moments/994601867987619840

https://twitter.com/wesbos/timelines/1189618481672667136
Result
<blockquote class="twitter-tweet" data-dnt="true">
  <p lang="en" dir="ltr" class="css-yw8fqx e11rucy10">
    Happy to announce I just published the first gatsby-remark-embedder 🎉🎉🎉
    <br />
    <br />
    This first version is an extract of
    <a href="https://twitter.com/kentcdodds">@kentcdodds</a>' personal website
    remark-embedder plugin, but I'm planning on adding extra services then
    <a href="https://twitter.com/codesandbox">@codesandbox</a>,<a
      href="https://twitter.com/Twitter"
    >
      @Twitter
    </a>
    &amp; <a href="https://twitter.com/YouTube">@YouTube</a> too.
    <a href="https://t.co/M4PA9aFZdG">https://t.co/M4PA9aFZdG</a>
  </p>
  — Michaël De Boey (@MichaelDeBoey93)
  <a href="https://twitter.com/MichaelDeBoey93/status/1152991421789548546">
    July 21, 2019
  </a>
</blockquote>

<a
  class="twitter-moment"
  href="https://twitter.com/i/moments/994601867987619840"
>
  🔥 Design Tips
</a>

<a
  class="twitter-timeline"
  href="https://twitter.com/wesbos/timelines/1189618481672667136"
>
  🔥 Hot Tips from Wes Bos - Curated tweets by wesbos
</a>

YouTube

The YouTube transformer (currently) only supports videos in the following formats:

  • Full url (https://youtube.com/watch?v=dQw4w9WgXcQ)
  • Short url (https://youtu.be/dQw4w9WgXcQ)

Usage

https://youtu.be/dQw4w9WgXcQ
Result
<iframe
  width="100%"
  height="315"
  src="https://www.youtube-nocookie.com/embed/dQw4w9WgXcQ?rel=0"
  frameborder="0"
  allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture"
  allowfullscreen
></iframe>

Options

customTransformers

The plugin allows you to pass an array of custom transformers that will be executed additionally to the default ones.

Properties

Each transformer should be an object which has the following properties:

getHTML(url, options)

The getHTML method is executed when the given URL has been matched to transform. It should return the transformed HTML.
This asynchronous function receives the URL to transform together with an options object to take into account when transforming.

name

The name is the value that needs to be used as a key in the services plugin option. The value for this key will be provided as the second argument to getHTML.

shouldTransform(url)

The shouldTransform method should check if the given URL matches the one intended to transform. It should return a boolean value.

Example transformer

// some-site-transformer.js
const getHTML = (url) => `<iframe src="${url}"></iframe>`;

const name = 'someSite';

const regex = /^https?:\/\/some-site\.com\//;
const shouldTransform = (url) => regex.test(url);

module.exports = { getHTML, name, shouldTransform };

services

The plugin also allows you to pass an object which keys that represent the name of the service to transform and the value that's an object with options for that specific service.

Inspiration

This whole plugin was extracted out of Kent C. Dodds' personal website.

The intention is to make this available to be used independently.

Issues

Looking to contribute? Look for the Good First Issue label.

🐛 Bugs

Please file an issue for bugs, missing documentation, or unexpected behavior.

See Bugs

💡 Feature Requests

Please file an issue to suggest new features. Vote on feature requests by adding a 👍. This helps maintainers prioritize what to work on.

See Feature Requests

Contributors ✨

Thanks goes to these people (emoji key):


Kent C. Dodds

💻 📖 🤔 🚇 ⚠️

Michaël De Boey

🐛 💻 📖 ⚠️

Kornel Dubieniecki

🐛

Nick Nish

💻 ⚠️

Caneco

🎨

Anurag Hazra

🐛 💻 ⚠️ 📖

Yash Joshi

💻 ⚠️

Christian C. Salvadó

💻 ⚠️

James Simone

💻 ⚠️

Agastya Chandrakant

💻 ⚠️

Fábio Rosado

💻 ⚠️

Arryangga Aliev Pratamaputra

🐛

Eduardo Reveles

💻 ⚠️

Michal Piechowiak

🐛 💻 ⚠️

Brad Garropy

🐛

Ilya Lyamkin

💻

Simon MacDonald

🐛 💻 ⚠️

Nicky Meuleman

💻

Ayush

💻

TEEAARBEE

🐛

Trevor Blades

📖

Titus

⚠️ 👀 💻

Joe Previte

🐛

This project follows the all-contributors specification. Contributions of any kind welcome!

LICENSE

MIT

gatsby-remark-embedder's People

Contributors

acagastya avatar allcontributors[bot] avatar anuraghazra avatar caneco avatar cms avatar dependabot-preview[bot] avatar dependabot[bot] avatar fabiorosado avatar heyayushh avatar ilyamkin avatar imgbot[bot] avatar jamessimone avatar jyash97 avatar kentcdodds avatar macdonst avatar michaeldeboey avatar nicknish avatar nickymeuleman avatar osiux avatar pieh avatar trevorblades avatar wooorm avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

gatsby-remark-embedder's Issues

Instragram fails to transform

  • gatsby-remark-embedder version: ^1.9.0
  • gatsby-plugin-instagram-embed version: ^1.1.0
  • node version: v13.6.0
  • npm version: 6.13.4

Relevant code or config
gatsby-config.js

[
    `gatsby-plugin-instagram-embed`,
    {
      resolve: 'gatsby-transformer-remark',
      options: {
        plugins: [
          `gatsby-remark-embedder`
        ]
      }
    }
]

markdown

I have done a funny work with this:

https://instagram.com/p/B60jPE6J8U-

What you did: Add instragram url to markdown file.

What happened:

 ERROR #85901  GRAPHQL

There was an error in your GraphQL query:

Cannot read property 'Symbol(Body internals)' of undefined

   1 | query CodeTipsPostByID($id: String!) {
   2 |   markdownRemark(id: {eq: $id}) {
   3 |     id
>  4 |     html
     |     ^
   5 |     frontmatter {
   6 |       date(formatString: "MMMM DD, YYYY")
   7 |       title
   8 |       description
   9 |       author
  10 |       tags
  11 |     }
  12 |   }
  13 | }
  14 |

Support user-specified HTML getters

I don't know how the configuration would look, but my original idea was to allow for customization of this:

const transformers = [getYouTubeHTML, getTwitterHTML, getCodeSandboxHTML];

via some sort of configuration. That way people could add their own embedder transforms without requiring any changes within this project.

Documentation: Services Options Explanation missing

The documentation lacks information about the services options. It says, we can use options to manipulate the service, but does not give an example. I am trying to add options as follows:

{
  resolve: `gatsby-remark-embedder`,
  options: {
    services: {
      // I want to manipulate SoundCloud to change width and height:
      SoundCloud: {
        width: `50%`,
        height: `600`,
      }
    },
  },
},

This does not change anything in the embed.

Support JotForm

Problem description:
JotForm is a popular online form builder. It would be great if a JotForm URL can be transformed into an embedded section.
Suggested solution:
JotForm provides some inbuilt embed form features that can be leveraged.
image

Youtube channel links are broken

  • gatsby-remark-embedder version: 1.1.2
  • node version: v10.16.0
  • npm (or yarn) version: 6.9.0

What you did:

Pasted a link to a youtube channel in a markdown document

What happened:

Link is transformed into an iframe which is broken

Screenshot 2019-09-13 at 12 48 43

Suggested solution:

I'm not sure if there's a way of embedding youtube channels, if there is I would use if not I would make the plugin ignore those links.

Twitter embed creates blockquote inside p

  • gatsby-remark-embedder version: 1.5.0
  • node version: 12
  • npm (or yarn) version: yarn 1.19.1

What you did: Embed tweet inside MDX file

What happened:

2 error messages in the console:

Warning: validateDOMNesting(...): <p> cannot appear as a descendant of <p>.

and

Warning: validateDOMNesting(...): <blockquote> cannot appear as a descendant of <p>.

The reason is that the generated HTML for the tweet is:

<p>
  <blockquote>
    <p>Tweet content</p>
    ...
  </blockquote>
</p>

Suggested solution: I haven't looked into it yet. Just wanna report back. It's just an annoyance at the moment, no worries. I can help take a look when my schedule frees up a bit. Otherwise, hope you can provide a fix soon. Thank you!

Support custom transformers

The way that I organized this originally was to make it so people could create custom transformers (think of it as a form of Inversion of Control). I think an API like this might be nice:

// In your gatsby-config.js
import someSiteTransformer from './src/some-site-transformer'

// config...
plugins: [
  {
    resolve: `gatsby-transformer-remark`,
    options: {
      plugins: [
        {
          resolve: 'gatsby-remark-embedder',
          options: {
            customTransformers: [
              someSiteTransformer,
            ],
          },
        },
      ],
    },
  },
];

I don't think it should be too much of a challenge to implement. Thoughts?

UNHANDLED REJECTION Unable to find plugin "gatsby-remark-embedder"

  • gatsby-remark-embedder version: 1.0.2
  • node version: 10.15.0
  • npm (or yarn) version: Yarn 1.13.0

Relevant code or config

This is my package.json

{
  "name": "nero-portfolio",
  "private": true,
  "description": "Personal website for finallynero and also where he writes about tech.",
  "version": "0.1.0",
  "author": "finallynero <[email protected]>",
  "dependencies": {
    "@weknow/gatsby-remark-codepen": "^0.1.0",
    "@weknow/gatsby-remark-twitter": "^0.2.0",
    "gatsby": "^2.0.76",
    "gatsby-image": "^2.0.20",
    "gatsby-plugin-canonical-urls": "^2.0.12",
    "gatsby-plugin-favicon": "^3.1.6",
    "gatsby-plugin-manifest": "^2.0.9",
    "gatsby-plugin-offline": "^2.0.16",
    "gatsby-plugin-react-helmet": "^3.0.2",
    "gatsby-plugin-react-svg": "^2.0.0-beta1",
    "gatsby-plugin-robots-txt": "^1.4.0",
    "gatsby-plugin-sass": "^2.0.7",
    "gatsby-plugin-sharp": "^2.0.14",
    "gatsby-remark-embedder": "^1.0.2",
    "gatsby-remark-images": "^3.0.10",
    "gatsby-remark-prismjs": "^3.2.6",
    "gatsby-source-filesystem": "^2.0.24",
    "gatsby-transformer-remark": "^2.3.2",
    "gatsby-transformer-sharp": "^2.1.8",
    "node-sass": "^4.11.0",
    "prismjs": "^1.15.0",
    "prop-types": "^15.6.2",
    "react": "^16.6.3",
    "react-dom": "^16.6.3",
    "react-helmet": "^5.2.0",
    "react-typist": "^2.0.5"
  },
  "keywords": [
    "gatsby"
  ],
  "license": "MIT",
  "scripts": {
    "build": "gatsby build",
    "develop": "gatsby develop",
    "start": "npm run develop",
    "format": "prettier --write \"src/**/*.js\"",
    "test": "echo \"Write tests! -> https://gatsby.app/unit-testing\""
  },
  "devDependencies": {
    "prettier": "^1.15.2"
  },
  "repository": {
    "type": "git",
    "url": "https://github.com/gatsbyjs/gatsby-starter-default"
  },
  "bugs": {
    "url": "https://github.com/gatsbyjs/gatsby/issues"
  }
}

gatsby-config.js

module.exports = {
  siteMetadata: {
    title: `Finallynero Portfolio`,
    description: `Hi, I am Nero, a Frontend developer, Open-source contributor, Technical writer, Dog lover and Humanist.`,
    siteUrl: `https://www.finallynero.dev`,
    author: `@finallynero`,
    social: [
      { title: 'Github', link: 'https://github.com/nero2009', icon: 'github' },
      {
        title: 'Twitter',
        link: 'https://twitter.com/finallynero',
        icon: 'twitter',
      },
      {
        title: 'Linkedin',
        link: 'https://www.linkedin.com/in/adaware-oghenero-529200ba/',
        icon: 'linkedin',
      },
    ],
  },
  plugins: [
    `gatsby-plugin-react-helmet`,
    `gatsby-plugin-sass`,
    {
      resolve: `gatsby-source-filesystem`,
      options: {
        name: `images`,
        path: `${__dirname}/src/images`,
      },
    },
    {
      resolve: `gatsby-source-filesystem`,
      options: {
        name: `articles`,
        path: `${__dirname}/src/articles`,
      },
    },
    {
      resolve: `gatsby-transformer-remark`,
      options: {
        plugins: [
          `gatsby-remark-embedder`,
          {
            resolve: `gatsby-remark-prismjs`,
            options: {},
          },
          {
            resolve: '@weknow/gatsby-remark-codepen',
            options: {
              theme: 'dark',
              height: 400,
            },
          },
          `@weknow/gatsby-remark-twitter`,
          {
            resolve: `gatsby-remark-images`,
            options: {
              maxWidth: 590,
            },
          },
        ],
      },
    },
    {
      resolve: 'gatsby-plugin-react-svg',
      options: {
        rule: {
          include: /assets/,
        },
      },
    },
    `gatsby-transformer-sharp`,
    `gatsby-plugin-sharp`,
    {
      resolve: `gatsby-plugin-canonical-urls`,
      options: {
        siteUrl: `https://www.finallynero.dev`,
      },
    },
    `gatsby-plugin-robots-txt`,
    {
      resolve: `gatsby-plugin-manifest`,
      options: {
        name: 'finallynero-portfolio',
        short_name: 'finallynero',
        start_url: '/',
        background_color: '#94B2C6',
        theme_color: '#94B2C6',
        display: 'minimal-ui',
        logo: 'src/images/logo-icon.svg',
      },
    },
    `gatsby-plugin-offline`,
    `gatsby-plugin-favicon`,
  ],
}

What you did
I wanted to add a codesandbox demo to my markdown blogpost, I was able to install the gatsby-remark-embedder plugin and modified the gatsby.config.js accordingly but when I tried to run my gatsby
What happened:

error11

Reproduction repository:
Reproduction repository link

Problem description:

Suggested solution:

Empty link causes build error in gatsby develop

  • gatsby-remark-embedder version: 1.11.1
  • node version: 12.14.1
  • npm (or yarn) version: 6.13.4

Relevant code or config

[](https://example.com)

What you did:

We had a markdown file that had a weird link formatted like [](https://example.com). The text portion of the link was empty.

What happened:

When the graphQL query was run on that file we got an error.

 ERROR #85901  GRAPHQL

There was an error in your GraphQL query:

Cannot query field "htmlAst" on type "MarkdownRemark".

GraphQL request:9:9
 8 |       childMarkdownRemark {
 9 |         htmlAst
   |         ^
10 |         tableOfContents

File: src/templates/markdownTemplate.js:92:9

Basically everything under childMarkdownRemark was null.

Reproduction repository:

Just add a link like [](https://example.com) to any markdown document in a gatsby project that uses this plugin and you'll be able to reproduce this error.

Problem description:

See above.

Suggested solution:

PR coming in a minute.

Handle twitter error for missing or private tweets

Sometimes, a tweet that I have linked to will get turned to private or be otherwise unavailable. This has happened to me a few times when people have made their profiles private or deleted the tweet I linked to:

{
  error: 'Sorry, you are not authorized to see this status.',
  request: '/oembed?url=https://twitter.com/carloscastrodev/status/1156951507125714945&dnt=true&omit_script=true'
}

I feel like there are probably other errors which should be addressed. I'm thinking that we should choose one of two paths forward for this:

  1. log a warning to the console, don't fail the build, but replace the tweet URL with something like: [This tweet is unavailable](link to tweet)
  2. Fail the build with a more helpful error message

I'm leaning to option 2 here. Right now the error message is:

Cannot read property 'replace' of undefined



  TypeError: Cannot read property 'replace' of undefined
  
  - Twitter.js:36 
    [kentcdodds.com]/[gatsby-remark-embedder]/dist/transformers/Twitter.js:36:21
  

Which isn't altogether helpful.

allow title/linktext in links

Allow links with title, so that the transformer can use a title if needed:

[Set up a Gatsby site](https://egghead.io/lessons/some-lesson)

Youtube link detection failed

  • gatsby-remark-embedder version: 1.3.1

What you did:
trying to embed youtube video with www.youtube.com

What happened:
did not embed

Problem description:
https://youtube.com/watch?v=dQw4w9WgXcQ is embedding correctly but https://www.youtube.com/watch?v=dQw4w9WgXcQ is not

Suggested solution:
Fixing shouldTransform function

More strict link handling

  • gatsby-remark-embedder version: 1.1.2
  • node version: v10.16.0
  • npm (or yarn) version: 6.9.0

What you did:

Used a markdown syntax of pasting a link

<https://www.youtube.com/watch?v=dQw4w9WgXcQ>

or

[https://www.youtube.com/watch?v=dQw4w9WgXcQ](https://www.youtube.com/watch?v=dQw4w9WgXcQ)

What happened:

Links are getting transformed into a video

Suggested solution:

I would transform only those links which are at the beginning of the new line to make sure that users have a way of posting an actual link if they want to.

instagram embed showing 'view this post on instagram'

Dependencies

  • gatsby-remark-embedder version: v1.11.2
  • node version: v12.13.1
  • npm (or yarn) version: v6.13.7

Relevant Code

// gatsby-config.js

module.exports = {
    plugins: [
        {
            resolve: "gatsby-source-filesystem",
            options: {
                name: "posts",
                path: "content/posts",
            },
        },
        {
            resolve: "gatsby-transformer-remark",
            options: {
                plugins: [
                    {
                        resolve: "gatsby-remark-embedder",
                    },
                ],
            },
        },
        {
            resolve: "gatsby-plugin-instagram-embed",
        },
    ],
}
// content/posts/instagram/index.md

---
slug: instagram
---

# Instagram

https://www.instagram.com/p/B8pnuX6BFzB/

What you did

  • Installed gatsby-remark-embedder.
  • Added it to the plugins array of gatsby-transformer-remark.

Didn't show embedded post properly.

  • Installed gatsby-plugin-instagram-embed.
  • Added it to the plugins array for gatsby.

Still didn't show embedded post properly.

What happened

Instead of showing the embedded Instagram photo, it showed a blank Instagram block that said View this post on Instagram.

Reproduction repository

Not a 100% minimal reproduction, but it's the very beginnings of a gatsby site using gatsby-source-filesystem and remark to transform the markdown.

https://github.com/bradgarropy/dailytexascountry.com

Problem description

On any blog post that includes an Instagram embed (example), the embedded post doesn't actually show the image, but it states View this post on Instagram.

Suggested solution

None at this time.

links to tweets whose author limited who can view them crashes builds

  • gatsby-remark-embedder version: 1.12.0
  • node version: 10.16.3
  • npm (or yarn) version: [email protected]

Relevant code or config

In gatsby-config (from reproduction site repository linked below)

    {
      resolve: `gatsby-transformer-remark`,
      options: {
        plugins: [`gatsby-remark-embedder`],
      },
    },

What you did:

Author of tweet I had link for limited who can see their tweets - for example https://twitter.com/mattconvente/status/1099706762897342465

What happened:

Got following error when trying to build site:

 ERROR #85901  GRAPHQL

There was an error in your GraphQL query:

Cannot read property 'replace' of undefined

   1 | query BlogPostBySlug($slug: String!) {
   2 |   site {
   3 |     id
   4 |     siteMetadata {
   5 |       title
   6 |     }
   7 |   }
   8 |   markdownRemark(fields: {slug: {eq: $slug}}) {
   9 |     id
  10 |     excerpt(pruneLength: 160)
> 11 |     html
     |     ^
  12 |     frontmatter {
  13 |       title
  14 |       date(formatString: "MMMM DD, YYYY")
  15 |       description
  16 |     }
  17 |   }
  18 | }
  19 |

File path: /Users/misiek/test/limited-tweets-repro/src/templates/blog-post.js
Url path: /hello-world/
Plugin: none

Reproduction repository:

https://github.com/pieh/limited-tweets-repro

Problem description:

The error description ( Cannot read property 'replace' of undefined ) was not very helpful

Suggested solution:

Add some error checking and throw nicer error. In this instance error orignated from this expression -

.map(s => s.replace(/\?ref_src=twsrc.*?fw/g, ''))

which tried to use .replace on undefined

Response from twtiter oembed ( https://publish.twitter.com/oembed?url=https://twitter.com/mattconvente/status/1099706762897342465&dnt=true&omit_script=true ) looks like this:

{
    "error": "Sorry, you are not authorized to see this status.",
    "request": "/oembed?url=https://twitter.com/mattconvente/status/1099706762897342465&dnt=true&omit_script=true"
}

It also report 403 status which I guess is not checked anywhere and is assumed. everything goes as planned.

Not sure if this should be twtitter specific check or fetchOEmbedData utility should check status and throw if it's not 200? Doing this only in fetchOEmbedData would only have url for oembed which might not give enough information, so probably combination of throwing in that utility + catching in twitter transformer and showing problematic tweet url might be most robust as it would handle twitter related issues and also would have some handling for other providers?

youtube embed not working once deployed to netlify

  • gatsby-remark-embedder version: 1.7.0
  • node version: 8.17.0
  • npm (or yarn) version: 6.13.4

Relevant code or config

// gatsby-config.js

{
    resolve: "gatsby-transformer-remark",
    options: {
        plugins: [
            {
                resolve: "gatsby-remark-images",
                options: {
                    maxWidth: 700,
                },
            },
            {
                resolve: "gatsby-remark-autolink-headers",
                options: {
                    maintainCase: false,
                    removeAccents: true,
                },
            },
            {
                resolve: "gatsby-remark-prismjs",
            },
            {
                resolve: "gatsby-remark-embedder",
            },
        ],
    },
},
// post.md

https://youtu.be/ZL4NA9mXns8

What you did:
Pasted the above YouTube link into a Markdown document to be processed by remark, which should include gatsby-remark-emedder. Everything works great locally running gatsby develop and gatsby build with node v12.13.1. Then I pushed to Netlify where gatsby build ran successfully.

What happened:
The published site does not embed the YouTube video successfully. There are no failed network requests or console errors.

Reproduction repository:
https://github.com/bradgarropy/bradgarropy.com/tree/66ce959721b485949e2d3ac3f87dfbef880a3d9a

Problem description:
YouTube embed not inserted when building on Netlify.

Suggested solution:
???

Chore: extract string literals into constants for better code quality

  • gatsby-remark-embedder version: 1.3.3
  • node version: latest
  • npm (or yarn) version: latest

Relevant code or config

export const shouldTransform = url => {
  const { host, pathname, searchParams } = new URL(url);

  return (
    host === 'youtu.be' ||
    ((host === 'youtube.com' || host === 'www.youtube.com') &&
      pathname.includes('/watch') &&
      Boolean(searchParams.get('v')))
  );
};

What you did: I want to extract the string literals to reusable constants for better maintenability.

What happened: this is a chore, not a bug.

Reproduction repository:

Problem description: Currently, if one of the supported embeds have a change in url or part of the url, the plugin may break. To mitigate this, we can have such high severity strings into constants that can be updated in a single place.

Suggested solution: Create a src/utils/constants.js file to have all the string literals and all other files should refer to this file for those constant literals.

Add ability to pass embed-specific options

If we can let users to add certain options to specific embeds thought gatsby-config.js then it will increase the flexiblity.

for example we can do :

{
  resolve: `gatsby-remark-embedder`,
  options: {
    codepen: {
      height: 800,
      theme: `light`
    },
    youtube: {
      height: 500
    }
  }
},

That way we can set embed specific parameters like height or theme

intermittent network errors ( socket hang up )

  • gatsby-remark-embedder version: 1.8.0
  • node version: 10.16.3
  • npm (or yarn) version: [email protected]

Relevant code or config

https://github.com/gatsbyjs/gatsby/blob/4b3ce3ee0f6bf2ae4b70a88ce19d78ee9e1e637b/www/gatsby-config.js#L139-L151

(usage with gatsby-plugin-mdx - probably not relavant)

What happened:

We are getting intermittent network errors when sourcing data for gatsbyjs.org resulting in logs like:

ERROR #11321  PLUGIN
"gatsby-plugin-mdx" threw an error while running the onCreateNode lifecycle:
request to https://publish.twitter.com/oembed?url=https://twitter.com/ryanflorence/status/906233888560758784&dnt=true&omit_script=true failed, reason: socket hang up
  FetchError: request to https://publish.twitter.com/oembed  ?url=https://twitter.com/ryanflorence/status/906233888560  758784&dnt=true&omit_script=true failed, reason: socket h  ang up
  - index.js:1455 ClientRequest.<anonymous>
    [www]/[node-fetch]/lib/index.js:1455:11
  - next_tick.js:63 process._tickCallback
    internal/process/next_tick.js:63:19

It's not particular embed specific - when it shows up it's usually different one. This doesn't happen every time, so it might be tricky to reproduce (might also depend on network condition)

Reproduction repository:

https://github.com/gatsbyjs/gatsby/tree/master/www

Suggested solution:

Implement retry mechanism in fetchOEmbedData helper function -

export const fetchOEmbedData = url => fetch(url).then(data => data.json());
to make the plugin more resilient to network failures

GDPR compliance?

How would I make this gdpr compliant like “click to load external ressources” before displaying the embedded iframes?

Add Support For CodePen

I installed the plugin expecting that somehow codepen embeds will magically appear on my markdown, but i found out its not supported?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.