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 🙏

© 2026 – Pkg Stats / Ryan Hefner

@fevol/lang-criticmarkup

v2.1.0

Published

CriticMarkup language support for CodeMirror

Readme

CriticMarkup Lezer grammar

This is a CriticMarkup grammar for CodeMirror's Lezer parser system. Originally developed by kometenstaub, this fork aims to make some improvements to the grammar in terms of extensibility, testing, and resolving some nesting issues of the original grammar.

This repository is not affiliated with the CriticMarkup maintainers, and is intended to be used with CodeMirror 6.

The grammar and parser are developed alongside with the CriticMarkup plugin for Obsidian.

Usage

There are five types of ranges that will be outputted by the grammar's parser, which are defined as follows:

  • Addition: {++ ... ++}
  • Deletion: {-- ... --}
  • Substitution: {~~ ... ~> ... ~~}
  • Comment: {>> ... <<}
  • Highlight: {== ... ==}

To get the text contexts for each of these ranges, you can simply splice the first and last three characters off of the node's text.

For Substitution, in order to get the text contexts for the two sides of the substitution, you simply have to peek at the next node in the tree, which is a MSub node, and get its from/to text contexts. When walking through the tree, you can simply skip over the MSub node, since it does not provide any other useful information.

Tests

There are four different test files that attempt to, each testing a different aspect of the grammar:

  • basic_markdown.txt: Tests the interaction of the Parser with Markdown text and the CriticMarkup grammar.
  • basic_ranges.txt: Tests well-formedness of each node type.
  • malformed_ranges.txt: Tests cases where ranges should not get parsed.
  • edge_cases.txt: Tests edge cases of the grammar.

Issues

Currently, there is one issue with the grammar that is not easily resolvable, without hampering performance or the simplicity of the grammar.

The error is that unclosed opening brackets {++ will match all subsequent tokens, and thus later ranges might not get parsed correctly.

Contributors

@kometenstaub - Developing the original grammar and plugin, and providing much needed guidance and support. @marijnh - Answering my incessant questions about Lezer and how grammars should be constructed.