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

mmd-js

v0.3.0

Published

This project is a lightweight wrapper around `multimarkdown-6`'s C library. Node.js scripts use it to parse Multimarkdown documents and walk their ASTs.

Downloads

6

Readme

mmd-js npm version

This project is a lightweight wrapper around multimarkdown-6's C library. Node.js scripts use it to parse Multimarkdown documents and walk their ASTs.

Demo / Context

mmd-js demo

Installation

npm install mmd-js
# or `yarn add mmd-js`
# or `pnpm add mmd-js`

Usage

mmd-js currently exposes a very small interface:

import * as mmd from "mmd-js";

// Usually you'd read a file, or maybe stdin
const buf = Buffer.from("Title: My Document\n\n# Header\n\nSome body text");

// Parse the MultiMarkdown document's root token from the buffer
const rootToken = mmd.parse(buf);

// Now you can walk the token tree
mmd.walk(rootToken, console.log);

// You can also render any node's text as a string
const text = mmd.read(buf, rootToken);
// const title = mmd.readTitle(buf, aTitleToken);

console.log(text);
// Title: My Document
//
// # Header
//
// Some body text

This API powers the bin/demo.ts script, which takes a MultiMarkdown file and:

  • Creates a directory for each "Part" (header level-1)
  • Creates a file for each "Section" within a part (header level-2)
  • Prints the Section's content into the file, after stripping:
    • The section title itself;
    • Any footnotes or footnote anchors within the section's text; and
    • Any whitespace before / after the section's text

If you would like to do something mmd-js does not yet support, please open an issue.

Wasm Notes

mmd-js also exposes a WebAssembly interface, with a few minor differences:

// Import the `/wasm.js` JS module instead of the default one
import * as mmd from "mmd-js/wasm.js";

// Load and instantiate the WebAssembly `.wasm` module.
// You may optionally pass a string (or string-returning function) to tell
// the JS where to find the `.wasm` file, if it is having trouble.
await mmd.load();

// Now you can use the same `mmd.*` APIs as above, albeit with
// browser-friendly `ArrayBuffer`s instead of Node.js `Buffer`s.
const buf = new TextEncoder().encode(
  "Title: My Document\n\n# Header\n\nSome body text"
);

// ...

Development

Installation

Tested with pnpm, but npm should work fine.

# you can skip the `git submodule` steps by using the `--recurse-submodules` flag while cloning:
# $ git clone --recurse-submodules [email protected]:anulman/mmd-js.git

# install `packages/MultiMarkdown-6`
git submodule init
git submodule update

# install emscripten, for wasm builds
brew install emscripten

# install js/ts deps
pnpm install

# configure wasm before building
pnpm run wasm:configure

Build && Run

pnpm build:napi # builds a node.js addon
pnpm build:wasm # builds a wasm module
pnpm build:js # compiles and emits typescript to js
pnpm build # runs all of the above

pnpm demo:bin # invokes `bin/demo.ts`; pass it a filepath
pnpm demo:web # starts the `demo/` dir's next.js dev server

Publishing

pnpm version [patch|minor|major] # uptick the version
pnpm publish # publish to the npm registry