npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

rehype-cl-img

v1.1.6

Published

A rehype plugin for Contentlayer to copy body images to the public folder.

Downloads

30

Readme

Rehype plugin for Contentlayer image processing

This rehype plugin simply copies images from Contentlayer documents to the Nextjs public folder.

Typical usecase

Say you have a folder full of .md or .mdx files. You wish to use images in the body of those documents. Problem is, Contentlayer only supports images defined in the frontmatter. Images defined in the body will be searched for in the public folder. But if you want to keep your images in the same folder structure as your markdown files (say you have a git submodule for all of your content), that is not an option.

This plugin solves that by finding all of the images defined in your markdown body and copying them over to the public folder.

Usage

In your contentlayer.config.js include this:

export default makeSource({
    mdx: {
        rehypePlugins: [[rehypeClImg, {resourceDir: "/<subdirectory in public folder>", excludeDir: "<subdir to ignore>"}]]
    }
});

In your Nextjs page, override the img tag with a custom component:

const mdxComponent: MDXComponents = {
    img: ({src, alt, width, height}) =>
        <Image src={src!} alt={alt!} width={width as number} height={height as number}/>
}

export default function Page() {
    // ...

    const MDXContent = useMDXComponent(post.body.code);
    return (
        <div>
            {/* ... */}
            <MDXContent components={mdxComponent} />
        </div>
    );
}

rehypeClImg accepts the following options:

publicDir?: string: is the name of your public directory. By default this is public.

resourceDir: string: is the desired subdirectory within the public folder where the images will be copied to.

excludeDir?: string: will be removed from the target directory path. For example, if you keep your images in an */images/* but don't want it to appear in the public directory (e.g. /public/**/images/*), you can add it to excludeDir.

Example

Say you have the following file structure

├── app
├── public
└── contentlayer-pages
    └── documentation
        └── foobar
            ├── images
            │   └── foo.png
            └── bar.mdx

foo.png is referenced in bar.mdx as follows:

![some alt text](images/foo.png)

With the following plugin settings:

rehypePlugins: [[rehypeClImg, {resourceDir: "docs", excludeDir: "images"}]]

the plugin will copy foo.png to the public folder and preserve its folder structure:

├── app
├── public
│   └── docs                    // This comes from 'resourceDir' setting
│       └── documentation
│           └── foobar          // 'images' subdirectory is ignored due to 'excludeDir' setting
│               └──foo.png
└── contentlayer-pages
    └── documentation
        └── foobar
            ├── images          // this subdirectory is ignored
            │   └── foo.png
            └── bar.mdx

Finally, the compiled html will look like this:

<img alt="some alt text" loading="lazy" width="658" height="112" decoding="async" data-nimg="1" style="color:transparent" src="/docs/documentation/foobar/foo.png">

The src="/docs/documentation/foobar/foo.png" comes from the resourceDir setting.