Skip to content

Commit c6da449

Browse files
committed
feat: update line numbers transformer with activateByDefault option and update docs
1 parent f13188a commit c6da449

File tree

3 files changed

+42
-16
lines changed

3 files changed

+42
-16
lines changed

apps/website/src/docs/shiki/line-numbers.mdx

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ export { rehypeShikiOptions };
6464

6565
1. Import the transformer in your [`highlight()`](/docs/shiki/highlighter):
6666

67-
```ts {2,8} title="Using lineNumbers with highlighter"
67+
```ts {2,8} title="Usage with highlighter"
6868
import { highlight } from "@/utils/shiki";
6969
import { showLineNumbers } from "@/utils/shiki/transformers/show-line-numbers";
7070

@@ -85,3 +85,13 @@ const html = highlighter.codeToHtml(code, {
8585
</code>
8686
</pre>
8787
```
88+
89+
## Properties
90+
91+
### ``activateByDefault``
92+
93+
By default, line numbers are only shown when the `lineNumbers` meta property is present in the MDX code block. You can activate line numbers for all code blocks by default by passing the `activateByDefault` option to the transformer:
94+
95+
```ts title="Activating Line Numbers by Default"
96+
showLineNumbers({ activateByDefault: true })
97+
```

apps/website/src/styles/shiki.css

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -42,16 +42,12 @@ pre.shiki-word-wrap span.line {
4242
pre.shiki-line-numbers code {
4343
counter-reset: step;
4444
counter-increment: step 0;
45-
}
46-
47-
pre.shiki-line-numbers code:has(.line:nth-child(2)) .line::before {
48-
content: counter(step);
49-
counter-increment: step;
50-
width: 0.5rem;
51-
margin-right: 1.3rem;
52-
margin-left: 0.2rem;
53-
display: inline-block;
54-
@apply text-right font-mono text-xs text-neutral-500;
45+
.line {
46+
&::before {
47+
counter-increment: step;
48+
@apply mr-6 inline-block border-transparent text-right text-xs whitespace-nowrap text-neutral-500 content-[counter(step)];
49+
}
50+
}
5551
}
5652

5753
/* Shiki Highlight */

apps/website/src/utils/shiki/transformers/show-line-numbers.ts

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,43 @@
11
import type { ShikiTransformer } from "shiki";
22

3-
const showLineNumbers = (): ShikiTransformer => {
3+
interface ShowLineNumbersOptions {
4+
/**
5+
* Always show line numbers regardless of meta properties
6+
* @default false
7+
*/
8+
activateByDefault?: boolean;
9+
}
10+
11+
const showLineNumbers = (
12+
options: ShowLineNumbersOptions = {},
13+
): ShikiTransformer => {
14+
const { activateByDefault = false } = options;
15+
416
return {
517
name: "AddLineNumbers",
618
pre(node) {
719
const rawMeta = this.options.meta?.__raw;
8-
const addLineNumbers = rawMeta?.includes("lineNumbers") || false;
20+
const hasLineNumbersMeta = rawMeta?.includes("lineNumbers") ?? false;
21+
const addLineNumbers = activateByDefault || hasLineNumbersMeta;
922

1023
if (!addLineNumbers) {
1124
return;
1225
}
1326

1427
const existingClass = node.properties.class;
28+
const className = "shiki-line-numbers";
29+
1530
if (Array.isArray(existingClass)) {
16-
existingClass.push("shiki-line-numbers");
31+
if (!existingClass.includes(className)) {
32+
existingClass.push(className);
33+
}
1734
} else if (typeof existingClass === "string") {
18-
node.properties.class = `${existingClass} shiki-line-numbers`;
35+
const classes = existingClass.split(" ");
36+
if (!classes.includes(className)) {
37+
node.properties.class = `${existingClass} ${className}`;
38+
}
1939
} else {
20-
node.properties.class = "shiki-line-numbers";
40+
node.properties.class = [className];
2141
}
2242
},
2343
};

0 commit comments

Comments
 (0)