Tomoki Ota's Blog

article icon

Rehype Pretty Codeの使用例

作成日 

はじめに

Rehype Pretty CodeはShikiベースのシンタックスハイライト機能を提供するrehypeプラグイン。

GitHub - rehype-pretty/rehype-pretty-code: Beautiful code blocks for Markdown or MDX.Beautiful code blocks for Markdown or MDX. Contribute to rehype-pretty/rehype-pretty-code development by creating an account on GitHub.
favicon of https://github.com/rehype-pretty/rehype-pretty-codegithub.com
ogp of https://opengraph.githubassets.com/75325b1ebe4850bc52c39dd26cf9b66a91256033431210baf41c6fb5b88c826a/rehype-pretty/rehype-pretty-code
ShikiA beautiful yet powerful syntax highlighter
favicon of shiki.style
ogp of https://shiki.style/og.png

この記事では、実際にRehype Pretty Codを使用した例を挙げていきます。

シンタックスハイライト

タイトル

title=""でタイトルがつけられる。

```go title="hello"
func main() {
  fmt.Println("hello")
}
```
hello
func main() {
  fmt.Println("hello")
}

キャプション

caption=""でタイトルがつけられる。

```go caption="hello"
func main() {
  fmt.Println("hello")
}
```
func main() {
  fmt.Println("hello")
}
hello

行番号の追加

showLineNumbersをつけると行番号をつけられる。

```go showLineNumbers
func main() {
  fmt.Println("hello")
}
```
func main() {
  fmt.Println("hello")
}

showLineNumber{4}のようにしたら最初の数字を変更できる。

```go showLineNumbers{5}
func main() {
  fmt.Println("hello")
}
```
func main() {
  fmt.Println("hello")
}

行ハイライト

go {2}のように行番号で指定する。

```go {2}
func main() {
  fmt.Println("hello")
}
```
func main() {
  fmt.Println("hello")
}

文字のハイライト

go /Println/`のように単語を指定すると、特定の単語にハイライトをつけられる。 "Println"のように"でも可能。複数追加する場合は、js /carrot/ /apple/`のようにする。

```go /Println/
func main() {
  fmt.Println("hello")
}
```
func main() {
  fmt.Println("hello")
}

マーカー

グループを設定して、マーカをつけることができる。

```js /age/#r /name/#r /setAge/#y /setName/#y /50/#p /"Taylor"/#p
const [age, setAge] = useState(50);
const [name, setName] = useState("Taylor");
```
const [age, setAge] = useState(50);
const [name, setName] = useState("Taylor");

以下のcssを修正すると、マーカーの色やグループIDを変えたり追加したりすることができる。

[data-chars-id="r"] {
  @apply !text-pink-300 bg-rose-800/50 border-b-pink-600 font-bold;
}
 
[data-chars-id="y"] {
  @apply !text-yellow-300 bg-yellow-800/50 border-b-yellow-600 font-bold;
}
 
[data-chars-id="p"] {
  @apply !text-purple-200 bg-purple-800/50 border-b-purple-600 font-bold;
}

diff

diff + 言語のシンタックスハイライトを付与する。 Shikiのtransformerで実現している。

// [!code --]をつけると、-// [!code ++] をつけると+になる。

表示されないのでmarkdownの方では/の後のスペースを抜いている。

```go
func main() {
  fmt.Println("hello")  //[!code --]
  fmt.Println("see you") //[!code ++]
}
```
func main() {
  fmt.Println("hello")
  fmt.Println("see you")
}

ANSIコード

ANSIコードのハイライトもできる。おそらく使用することはなさそう。

```ansi
  vite v5.0.0 dev server running at:
 
  > Local: http://localhost:3000/
  > Network: use `--host` to expose
 
  ready in 125ms.
 
8:38:02 PM [vite] hmr update /src/App.jsx
```
 
Inline ANSI: `> Local: http://localhost:3000/{:ansi}`
  vite v5.0.0 dev server running at:
 
  > Local: http://localhost:3000/
  > Network: use `--host` to expose
 
  ready in 125ms.
 
8:38:02 PM [vite] hmr update /src/App.jsx

Inline ANSI: > Local: http://localhost:3000/

インラインコードのハイライト

インラインコード内のプログラミング言語のシンタックスハイライト

`[1, 2, 3].join('-'){:js}`

[1, 2, 3].join('-')

Context Aware Inline Code

これは使えるが、自分の環境ではshikiのCSS変数と衝突して、文字の色が変化しない。

function getStringLength(str) {
  return str.length;
}
`getStringLength{:.entity.name.function}`
`function{:.keyword}`
`str{:.variable.parameter}`
`str{:.variable.other.object}`

getStringLength function str str

カスタムコンポーネント

以下の例は既存のアイテムではなく、独自に作成したコンポーネント、CSSを適応して実装しています。

BlogCard

ブログカードを表示します。

<BlogCard url="https://tomokiota.com/" />
tomokiota.comThe Official Website of Tomoki Ota, Traveler and Photographer.
favicon of tomokiota.com
ogp of https://tomokiota.com/opengraph-image.png?198f1afa7cb526e9

Accordion

アコーディオンです。折りたたみ表示を実現します。中身はdetailsタグとsummaryタグで実装してます。

<Accordion title="アコーディオンの例だよ!">
  こんにちは!
</Accordion>
アコーディオンの例だよ!

こんにちは!

この記事をシェアするx icon
アイコン画像
Tomoki Ota

フルスタックエンジニア。Goが好き。趣味はカメラと旅行です📷