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

@calpano/ddot-prismjs

v0.1.1

Published

Prism.js language definition for ddot.it (Knowledge Graph Notation).

Readme

@calpano/ddot-prismjs

Prism.js language definition for ddot.it — a minimal text format for typed knowledge graphs.

Install

npm install @calpano/ddot-prismjs prismjs

prismjs is a peer dependency.

Use

import Prism from 'prismjs';
import '@calpano/ddot-prismjs';   // side-effect: registers the language

const html = Prism.highlight(code, Prism.languages['ddot.it'], 'ddot.it');

Aliases registered: ddot.it, ddot, ddotit.

Theme styling

Prism's stock themes don't know about ddot scopes. Add CSS for: .token.subject, .token.relation, .token.object, .token.operator, .token.command, .token.meta-delim, .token.meta-operator, .token.meta-relation, .token.meta-object, .token.meta-text, .token.disabled.

Conformance

Verified against the cross-implementation golden corpus — identical to the TextMate, Shiki, Pygments, Chroma, Rouge, and highlight.js ports. See tools/conformance-prismjs.mjs.

npm run conformance:prismjs

Implementation note

Prism's tokenizer applies patterns in priority order, splitting the remaining un-tokenized text as it goes. inside patterns can't reach across already-tokenized chunks, so subject/relation/object slot detection couldn't use the obvious "match operator first, then look at the gaps" approach.

The lexer instead does everything at the top level with Prism's lookbehind: true mechanism. The first capture group of each slot pattern absorbs the preceding .. (or ^[ \t]* for subject) — Prism strips it from the token but leaves it in the residual text for the later operator pattern to claim. Slot patterns therefore run BEFORE operator so their lookbehind can see the .. markers; operator mops them up afterwards.

Multi-line regions (off-on span, free-form ,,…,,, typed-meta region) are matched at the very top with their own inside grammars. The typed-meta region is anchored to body lines starting with .., so the opener line (a normal triple ending in ,,) is left for the top-level slot patterns to handle — this is what keeps the opener's operators scoped as operator instead of meta-operator.

License

MIT