Important: This documentation covers Yarn 1 (Classic).
For Yarn 2+ docs and migration guide, see yarnpkg.com.

Package detail

prosemirror-highlight

ocavue163.2kMIT0.13.0TypeScript support: included

A ProseMirror plugin to highlight code blocks

prosemirror, editor, highlight.js, shiki, refractor, lowlight, prism

readme

prosemirror-highlight

NPM version

Highlight your ProseMirror code blocks with any syntax highlighter you like!

Usage

With Shiki

<summary>Static loading of a fixed set of languages</summary>
import { getSingletonHighlighter } from 'shiki'

import { createHighlightPlugin } from 'prosemirror-highlight'
import { createParser } from 'prosemirror-highlight/shiki'

const highlighter = await getSingletonHighlighter({
  themes: ['github-light'],
  langs: ['javascript', 'typescript', 'python'],
})
const parser = createParser(highlighter)
export const shikiPlugin = createHighlightPlugin({ parser })
<summary>Dynamic loading of arbitrary languages</summary>
import {
  getSingletonHighlighter,
  type BuiltinLanguage,
  type Highlighter,
} from 'shiki'

import { createHighlightPlugin } from 'prosemirror-highlight'
import { createParser, type Parser } from 'prosemirror-highlight/shiki'

let highlighter: Highlighter | undefined
let parser: Parser | undefined

/**
 * Lazy load highlighter and highlighter languages.
 *
 * When the highlighter or the required language is not loaded, it returns a
 * promise that resolves when the highlighter or the language is loaded.
 * Otherwise, it returns an array of decorations.
 */
const lazyParser: Parser = (options) => {
  if (!highlighter) {
    return getSingletonHighlighter({
      themes: ['github-light'],
      langs: [],
    }).then((h) => {
      highlighter = h
    })
  }

  const language = options.language as BuiltinLanguage
  if (language && !highlighter.getLoadedLanguages().includes(language)) {
    return highlighter.loadLanguage(language)
  }

  if (!parser) {
    parser = createParser(highlighter)
  }

  return parser(options)
}

export const shikiLazyPlugin = createHighlightPlugin({ parser: lazyParser })
<summary>Set code block background color based on theme</summary>

When using Shiki, two CSS variables are set automatically to the <pre> element:

  • --prosemirror-highlight: The text color of the code block
  • --prosemirror-highlight-bg: The background color of the code block

You can use these variables to set the background color and text color of the code block.

.ProseMirror pre {
  color: var(--prosemirror-highlight, inherit);
  background-color: var(--prosemirror-highlight-bg, inherit);
}

With lowlight (based on Highlight.js)

<summary>Static loading of all languages</summary>
import 'highlight.js/styles/default.css'

import { common, createLowlight } from 'lowlight'

import { createHighlightPlugin } from 'prosemirror-highlight'
import { createParser } from 'prosemirror-highlight/lowlight'

const lowlight = createLowlight(common)
const parser = createParser(lowlight)
export const lowlightPlugin = createHighlightPlugin({ parser })

With refractor (based on Prism)

<summary>Static loading of all languages</summary>
import { refractor } from 'refractor/all'

import { createHighlightPlugin } from 'prosemirror-highlight'
import { createParser } from 'prosemirror-highlight/refractor'

const parser = createParser(refractor)
export const refractorPlugin = createHighlightPlugin({ parser })

With Sugar high

<summary>Highlight with CSS</summary>
import { createHighlightPlugin } from 'prosemirror-highlight'
import { createParser } from 'prosemirror-highlight/sugar-high'

const parser = createParser()
export const sugarHighPlugin = createHighlightPlugin({ parser })
:root {
  --sh-class: #2d5e9d;
  --sh-identifier: #354150;
  --sh-sign: #8996a3;
  --sh-property: #0550ae;
  --sh-entity: #249a97;
  --sh-jsxliterals: #6266d1;
  --sh-string: #00a99a;
  --sh-keyword: #f47067;
  --sh-comment: #a19595;
}

Online demo

Open in StackBlitz

Credits

License

MIT

changelog

Changelog

0.13.0 (2025-03-14)

Features

0.12.2 (2025-02-06)

Bug Fixes

0.12.1 (2025-02-02)

Bug Fixes

0.12.0 (2025-02-02)

Features

0.11.1 (2025-01-22)

Bug Fixes

  • support shiki v2 and sugar-high v0.8 (#67) (b7fff1d)

0.11.0 (2024-12-03)

Features

  • add codeBlock as one of the default node type names (#61) (e96ec9e)

0.10.0 (2024-10-11)

Features

  • support shiki's object token.htmlStyle (#55) (70fc971)

0.9.0 (2024-09-04)

Features

0.8.0 (2024-06-21)

Features

0.7.0 (2024-06-21)

⚠ BREAKING CHANGES

  • remove shikiji support (#36)

Miscellaneous Chores

Code Refactoring

0.6.0 (2024-05-21)

Features

0.5.0 (2024-02-07)

Features

0.4.1 (2024-01-23)

Bug Fixes

0.4.0 (2024-01-01)

Features

  • allow the parser to return a promise (#16) (83751b3)

0.3.3 (2023-12-16)

Bug Fixes

0.3.2 (2023-12-14)

Bug Fixes

0.3.1 (2023-12-12)

Bug Fixes

0.3.0 (2023-12-10)

Features

0.2.0 (2023-12-10)

Features

0.1.0 (2023-12-10)

Features

Documentation