Skip to content

Starlight | Power the code block

โ€œExpressive Codeโ€๋ผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๊ณต์‹ ๋ ˆํฌ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค๋ช…ํ•œ๋‹ค:

Expressive Code is an engine for presenting source code on the web, aiming to make your code easy to understand and visually stunning.

์ฆ‰, ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ฝ”๋“œ ๋ธ”๋ก์„ ๋” ๋งค๋ ฅ์ ์œผ๋กœ ๋งŒ๋“œ๋Š” ์ถ”๊ฐ€์ ์ธ ์Šคํƒ€์ผ๋ง๊ณผ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค. Next.js์™€ Astro์™€ ๊ฐ™์ด Rehype ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ง€์›ํ•˜๋Š” ๋‹ค์–‘ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, Astro๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” Starlight์—์„œ๋Š” ๊ธฐ๋ณธ ์ฝ”๋“œ ๋ธ”๋ก ๋ Œ๋”๋ง ์—”์ง„์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

Expressive Code๋Š” ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์ง€๋งŒ, ๊ธฐ๋ณธ ์ƒํƒœ์—์„œ๋Š” ์—†๋Š” ๋‘ ๊ฐ€์ง€ ๊ณต์‹ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ(ํ”Œ๋Ÿฌ๊ทธ์ธ)์ด ์žˆ๋‹ค. ์ด ๊ธ€์—์„œ๋Š” Starlight์—์„œ ์ด ์ถ”๊ฐ€์ ์ธ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์†Œ๊ฐœํ•œ๋‹ค.

๋‘ ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค:

  1. Collapsible Sections (์ค„ ๋ฒ”์œ„ ์ถ•์†Œ)
    : ๊ธด ์ฝ”๋“œ ์˜ˆ์ œ์—์„œ ํŠน์ • ์ค„ ๋ฒ”์œ„๋ฅผ ์ถ•์†Œํ•˜์—ฌ, ํ•ต์‹ฌ ๋ถ€๋ถ„์— ์ง‘์ค‘ํ•˜๋„๋ก ๋•๋Š” ๊ธฐ๋Šฅ
  2. Line Numbers (์ค„ ๋ฒˆํ˜ธ ํ‘œ์‹œ)
    : ์ฝ”๋“œ ๋ธ”๋ก์— ์ค„ ๋ฒˆํ˜ธ๋ฅผ ํ‘œ์‹œํ•˜์—ฌ, ์ฝ”๋“œ์˜ ํŠน์ • ์œ„์น˜๋ฅผ ์‰ฝ๊ฒŒ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ธฐ๋Šฅ

์–ด๋–ค ๋ชจ์Šต์ธ์ง€๋ถ€ํ„ฐ ๋ณด๋ฉด ๋” ์ง๊ด€์ ์œผ๋กœ ๊ฐ ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ์˜์˜๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.
์•„๋ž˜์˜ ๊ณต์‹ ๋ฌธ์„œ์—์„œ ์˜ˆ์‹œ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ํ™œ์„ฑํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„œ์ˆ ํ•œ๋‹ค.
โ€Expressive Codeโ€์˜ ๊ณต์‹ ๋ฌธ์„œ์™€ ๋‹ฌ๋ฆฌ, ๋‘ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋ถ„๋ฆฌํ•˜์ง€ ์•Š๊ณ  ๋ชจ๋‘ ์„ค์น˜ํ•˜๋Š” ์ƒํ™ฉ์œผ๋กœ ๊ฐ€์ •ํ•œ๋‹ค.

๋˜ํ•œ, Starlight์—์„œ๋Š” Expressive Code๊ฐ€ ์ด๋ฏธ ์„ค์น˜๋˜์–ด ์žˆ์Œ์— ๋”ฐ๋ผ ์ถ”๊ฐ€ ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ค์น˜๋กœ ๋ฐ”๋กœ ๋„˜์–ด๊ฐ„๋‹ค.

Terminal window
npm i @expressive-code/plugin-collapsible-sections
npm i @expressive-code/plugin-line-numbers

์„ค์น˜ ํ›„ ec.config.mjs ํŒŒ์ผ์„ ์ƒ์„ฑํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์ •ํ•œ๋‹ค:

ec.config.mjs
import { pluginCollapsibleSections } from '@expressive-code/plugin-collapsible-sections'
import { pluginLineNumbers } from '@expressive-code/plugin-line-numbers'
/** @type {import('@astrojs/starlight/expressive-code').StarlightExpressiveCodeOptions} */
export default {
plugins: [pluginCollapsibleSections(), pluginLineNumbers()],
10 collapsed lines
defaultProps: {
// Disable line numbers by default
showLineNumbers: false,
// But enable line numbers for certain languages
overridesByLang: {
'js,ts,html,python': {
showLineNumbers: true,
},
},
},
}

7~16๋ฒˆ ์ค„์€ ์ถ”๊ฐ€์ ์ธ ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ค์ • ๋ถ€๋ถ„์œผ๋กœ, ์„ ํƒ ์‚ฌํ•ญ์ด๋‹ค. ์œ„ ์˜ˆ์‹œ์—์„œ๋Š” ์ฝ”๋“œ ๋ธ”๋ก ์ƒ์„ฑ ์‹œ ๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” ์ค„ ๋ฒˆํ˜ธ๋ฅผ ํ‘œ์‹œํ•˜์ง€ ์•Š์ง€๋งŒ, JavaScript, TypeScript, HTML, Python ์–ธ์–ด๋ฅผ ํ‘œ์‹œํ•˜๋Š” ์ฝ”๋“œ ๋ธ”๋ก์— ๋Œ€ํ•ด์„œ๋Š” ์ค„ ๋ฒˆํ˜ธ๋ฅผ ํ‘œ์‹œํ•˜๋„๋ก ์„ค์ •ํ–ˆ๋‹ค.

์•„๋ž˜๋Š” Starlight์—์„œ ์ฝ”๋“œ ๋ธ”๋ก์„ ๋ Œ๋”๋งํ•  ๋•Œ, ์œ„์—์„œ ์„ค์ •ํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” ์˜ˆ์‹œ์ด๋‹ค.
๋” ์ž์„ธํ•œ ์‚ฌ์šฉ๋ฒ•์€ Expressive Code ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค.

```js showLineNumbers=true collapse={7-8} collapseStyle="collapsible-start"
function exampleFunction() {
console.log("This is an example function.");
โ‹ฎ
}
```
example.js
function exampleFunction() {
console.log("This is an example function.");
console.log("It has multiple lines of code.");
console.log("Some lines can be collapsed.");
console.log("This is the last line before collapse.");
2 collapsed lines
// This line will be collapsed
console.log("This line is hidden by default.");
}
```js showLineNumbers=false collapse={6-7} collapseStyle="github"
function anotherExampleFunction() {
console.log("This is another example function.");
โ‹ฎ
}
```
anotherExample.js
function anotherExampleFunction() {
console.log("This is another example function.");
// The two lines under are collapsed until expanded
// ("github" style, irreversible)
2 collapsed lines
console.log("It also has multiple lines of code.");
console.log("This line is hidden by default.");
}