-
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
0 parents
commit 7dc3719
Showing
5 changed files
with
250 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
node_modules |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,36 @@ | ||
# rehype-starry-night | ||
|
||
## What is it? | ||
|
||
It's a [rehype](https://github.com/rehypejs/rehype) plugin to transform `<code>` blocks with language attribute with @wooorm's [starry-night](https://github.com/wooorm/starry-night) code syntax highlighter. | ||
|
||
You may want to try this if you were unhappy with results from [prism](https://github.com/PrismJS/prism/) or [shiki](https://github.com/shikijs/shiki). | ||
|
||
## How to use? | ||
|
||
1. Install the plugin with npm (`npm install rehype-starry-night`) | ||
2. Use in a unified pipeline like this: | ||
|
||
```js | ||
import fs from 'node:fs/promises' | ||
import { unified } from 'unified' | ||
import remarkParse from 'remark-parse' | ||
import remarkRehype from 'remark-rehype' | ||
import rehypeStringify from 'rehype-stringify' | ||
import rehypeStarryNight from 'rehype-starry-night' | ||
|
||
const file = await unified() | ||
.use(remarkParse) | ||
.use(remarkRehype) | ||
.use(rehypeStarryNight) | ||
.use(rehypeStringify) | ||
.process(await fs.readFile('example.md')) | ||
|
||
console.log(String(file)) | ||
``` | ||
|
||
## Configure? | ||
|
||
The options you can pass are the same as the original project, which you can find [here](https://github.com/wooorm/starry-night#createstarrynightgrammars-options). | ||
|
||
Since _most of the time_ this plugin will be used in a larger context which involves pre-processing of markdown, i took the freedom to default `grammars` to `all` which means all languages should be supported out of the box. There's no extra cost at install since this `all` is brought by starry night, and should not impact performance as long as you don't run this in the browser. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
import { selectAll } from "hast-util-select" | ||
import { createStarryNight, all } from '@wooorm/starry-night'; | ||
|
||
export default function rehypeStarryNight(args = {}) { | ||
let factory = null | ||
let highlighter = null | ||
|
||
const { grammars = all, ...options } = args | ||
|
||
return async function transform(tree) { | ||
if (!factory) { | ||
factory = createStarryNight(grammars, options) | ||
} | ||
|
||
if (!highlighter) { | ||
highlighter = await factory | ||
} | ||
|
||
selectAll('code', tree) | ||
.forEach(node => { | ||
const { className = [] } = node.properties ?? {} | ||
|
||
const lang = className.find(cx => cx?.startsWith('language-')) ?? '' | ||
const scope = highlighter.flagToScope(lang.replace('language-', '')) | ||
|
||
if (!scope) return | ||
|
||
const [child] = node.children ?? [] | ||
const { children = [] } = highlighter.highlight(child.value, scope) ?? {} | ||
|
||
if (children.length) node.children = children | ||
}) | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
{ | ||
"name": "rehype-starry-night", | ||
"type": "module", | ||
"version": "1.0.2", | ||
"description": "syntaxhighlight using starry-night", | ||
"homepage": "https://github.com/y-nk/rehype-starry-night", | ||
"keywords": [ | ||
"rehype", | ||
"plugin", | ||
"starry-night", | ||
"syntax", | ||
"hightlight" | ||
], | ||
"author": "Julien Barbay <julien.barbay@gmail.com>", | ||
"license": "MIT", | ||
"main": "index.js", | ||
"files": [ | ||
"./index.js" | ||
], | ||
"scripts": { | ||
"deploy": "npm publish --access public" | ||
}, | ||
"dependencies": { | ||
"@wooorm/starry-night": "^1.5.0", | ||
"hast-util-select": "^5.0.4" | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,152 @@ | ||
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. | ||
# yarn lockfile v1 | ||
|
||
|
||
"@types/hast@^2.0.0": | ||
version "2.3.4" | ||
resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.4.tgz#8aa5ef92c117d20d974a82bdfb6a648b08c0bafc" | ||
integrity sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g== | ||
dependencies: | ||
"@types/unist" "*" | ||
|
||
"@types/unist@*", "@types/unist@^2.0.0": | ||
version "2.0.6" | ||
resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.6.tgz#250a7b16c3b91f672a24552ec64678eeb1d3a08d" | ||
integrity sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ== | ||
|
||
"@wooorm/starry-night@^1.5.0": | ||
version "1.5.0" | ||
resolved "https://registry.yarnpkg.com/@wooorm/starry-night/-/starry-night-1.5.0.tgz#61b74d78ed451c925e9311f606d31a1d2abcc626" | ||
integrity sha512-YEkNgM8IxKwzRQgTp1nyiraB5rc4LiLpnMTrJvX5+SVs7zgVqkTx6QAZgZFqrZrqq/UCWVYBzE9+zZfxpLPTYQ== | ||
dependencies: | ||
"@types/hast" "^2.0.0" | ||
import-meta-resolve "^2.0.0" | ||
vscode-oniguruma "^1.0.0" | ||
vscode-textmate "^7.0.0" | ||
|
||
bcp-47-match@^2.0.0: | ||
version "2.0.3" | ||
resolved "https://registry.yarnpkg.com/bcp-47-match/-/bcp-47-match-2.0.3.tgz#603226f6e5d3914a581408be33b28a53144b09d0" | ||
integrity sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ== | ||
|
||
boolbase@^1.0.0: | ||
version "1.0.0" | ||
resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" | ||
integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== | ||
|
||
comma-separated-tokens@^2.0.0: | ||
version "2.0.3" | ||
resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz#4e89c9458acb61bc8fef19f4529973b2392839ee" | ||
integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg== | ||
|
||
css-selector-parser@^1.0.0: | ||
version "1.4.1" | ||
resolved "https://registry.yarnpkg.com/css-selector-parser/-/css-selector-parser-1.4.1.tgz#03f9cb8a81c3e5ab2c51684557d5aaf6d2569759" | ||
integrity sha512-HYPSb7y/Z7BNDCOrakL4raGO2zltZkbeXyAd6Tg9obzix6QhzxCotdBl6VT0Dv4vZfJGVz3WL/xaEI9Ly3ul0g== | ||
|
||
direction@^2.0.0: | ||
version "2.0.1" | ||
resolved "https://registry.yarnpkg.com/direction/-/direction-2.0.1.tgz#71800dd3c4fa102406502905d3866e65bdebb985" | ||
integrity sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA== | ||
|
||
hast-util-has-property@^2.0.0: | ||
version "2.0.1" | ||
resolved "https://registry.yarnpkg.com/hast-util-has-property/-/hast-util-has-property-2.0.1.tgz#8ec99c3e8f02626304ee438cdb9f0528b017e083" | ||
integrity sha512-X2+RwZIMTMKpXUzlotatPzWj8bspCymtXH3cfG3iQKV+wPF53Vgaqxi/eLqGck0wKq1kS9nvoB1wchbCPEL8sg== | ||
|
||
hast-util-select@^5.0.4: | ||
version "5.0.4" | ||
resolved "https://registry.yarnpkg.com/hast-util-select/-/hast-util-select-5.0.4.tgz#125750250060dd3438ece13a8f9a93313dcd5d6e" | ||
integrity sha512-iHfI+j4UFfYpQO0CMyFXB/ZFX+6R71y60hzHMW4D1zfAyyzHAto8RrRFdVKmg3X4uBVkDiMDe+QhMCQ3mW6fAg== | ||
dependencies: | ||
"@types/hast" "^2.0.0" | ||
"@types/unist" "^2.0.0" | ||
bcp-47-match "^2.0.0" | ||
comma-separated-tokens "^2.0.0" | ||
css-selector-parser "^1.0.0" | ||
direction "^2.0.0" | ||
hast-util-has-property "^2.0.0" | ||
hast-util-to-string "^2.0.0" | ||
hast-util-whitespace "^2.0.0" | ||
not "^0.1.0" | ||
nth-check "^2.0.0" | ||
property-information "^6.0.0" | ||
space-separated-tokens "^2.0.0" | ||
unist-util-visit "^4.0.0" | ||
zwitch "^2.0.0" | ||
|
||
hast-util-to-string@^2.0.0: | ||
version "2.0.0" | ||
resolved "https://registry.yarnpkg.com/hast-util-to-string/-/hast-util-to-string-2.0.0.tgz#b008b0a4ea472bf34dd390b7eea1018726ae152a" | ||
integrity sha512-02AQ3vLhuH3FisaMM+i/9sm4OXGSq1UhOOCpTLLQtHdL3tZt7qil69r8M8iDkZYyC0HCFylcYoP+8IO7ddta1A== | ||
dependencies: | ||
"@types/hast" "^2.0.0" | ||
|
||
hast-util-whitespace@^2.0.0: | ||
version "2.0.1" | ||
resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz#0ec64e257e6fc216c7d14c8a1b74d27d650b4557" | ||
integrity sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng== | ||
|
||
import-meta-resolve@^2.0.0: | ||
version "2.2.1" | ||
resolved "https://registry.yarnpkg.com/import-meta-resolve/-/import-meta-resolve-2.2.1.tgz#80fdeddbc15d7f3992c37425023ffb4aca7cb583" | ||
integrity sha512-C6lLL7EJPY44kBvA80gq4uMsVFw5x3oSKfuMl1cuZ2RkI5+UJqQXgn+6hlUew0y4ig7Ypt4CObAAIzU53Nfpuw== | ||
|
||
not@^0.1.0: | ||
version "0.1.0" | ||
resolved "https://registry.yarnpkg.com/not/-/not-0.1.0.tgz#c9691c1746c55dcfbe54cbd8bd4ff041bc2b519d" | ||
integrity sha512-5PDmaAsVfnWUgTUbJ3ERwn7u79Z0dYxN9ErxCpVJJqe2RK0PJ3z+iFUxuqjwtlDDegXvtWoxD/3Fzxox7tFGWA== | ||
|
||
nth-check@^2.0.0: | ||
version "2.1.1" | ||
resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" | ||
integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== | ||
dependencies: | ||
boolbase "^1.0.0" | ||
|
||
property-information@^6.0.0: | ||
version "6.2.0" | ||
resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.2.0.tgz#b74f522c31c097b5149e3c3cb8d7f3defd986a1d" | ||
integrity sha512-kma4U7AFCTwpqq5twzC1YVIDXSqg6qQK6JN0smOw8fgRy1OkMi0CYSzFmsy6dnqSenamAtj0CyXMUJ1Mf6oROg== | ||
|
||
space-separated-tokens@^2.0.0: | ||
version "2.0.2" | ||
resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz#1ecd9d2350a3844572c3f4a312bceb018348859f" | ||
integrity sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q== | ||
|
||
unist-util-is@^5.0.0: | ||
version "5.1.1" | ||
resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-5.1.1.tgz#e8aece0b102fa9bc097b0fef8f870c496d4a6236" | ||
integrity sha512-F5CZ68eYzuSvJjGhCLPL3cYx45IxkqXSetCcRgUXtbcm50X2L9oOWQlfUfDdAf+6Pd27YDblBfdtmsThXmwpbQ== | ||
|
||
unist-util-visit-parents@^5.1.1: | ||
version "5.1.1" | ||
resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-5.1.1.tgz#868f353e6fce6bf8fa875b251b0f4fec3be709bb" | ||
integrity sha512-gks4baapT/kNRaWxuGkl5BIhoanZo7sC/cUT/JToSRNL1dYoXRFl75d++NkjYk4TAu2uv2Px+l8guMajogeuiw== | ||
dependencies: | ||
"@types/unist" "^2.0.0" | ||
unist-util-is "^5.0.0" | ||
|
||
unist-util-visit@^4.0.0: | ||
version "4.1.1" | ||
resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-4.1.1.tgz#1c4842d70bd3df6cc545276f5164f933390a9aad" | ||
integrity sha512-n9KN3WV9k4h1DxYR1LoajgN93wpEi/7ZplVe02IoB4gH5ctI1AaF2670BLHQYbwj+pY83gFtyeySFiyMHJklrg== | ||
dependencies: | ||
"@types/unist" "^2.0.0" | ||
unist-util-is "^5.0.0" | ||
unist-util-visit-parents "^5.1.1" | ||
|
||
vscode-oniguruma@^1.0.0: | ||
version "1.7.0" | ||
resolved "https://registry.yarnpkg.com/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz#439bfad8fe71abd7798338d1cd3dc53a8beea94b" | ||
integrity sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA== | ||
|
||
vscode-textmate@^7.0.0: | ||
version "7.0.4" | ||
resolved "https://registry.yarnpkg.com/vscode-textmate/-/vscode-textmate-7.0.4.tgz#a30df59ce573e998e4e2ffbca5ab82d57bc3126f" | ||
integrity sha512-9hJp0xL7HW1Q5OgGe03NACo7yiCTMEk3WU/rtKXUbncLtdg6rVVNJnHwD88UhbIYU2KoxY0Dih0x+kIsmUKn2A== | ||
|
||
zwitch@^2.0.0: | ||
version "2.0.4" | ||
resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-2.0.4.tgz#c827d4b0acb76fc3e685a4c6ec2902d51070e9d7" | ||
integrity sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A== |