Skip to content

Commit e59355b

Browse files
authored
feat(theme): code block showLineNumbers=start metastring (#10846)
1 parent fcc9e5c commit e59355b

File tree

5 files changed

+73
-24
lines changed

5 files changed

+73
-24
lines changed

packages/docusaurus-theme-classic/src/theme-classic.d.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -412,7 +412,7 @@ declare module '@theme/CodeBlock' {
412412
readonly metastring?: string;
413413
readonly title?: string;
414414
readonly language?: string;
415-
readonly showLineNumbers?: boolean;
415+
readonly showLineNumbers?: boolean | number;
416416
}
417417

418418
export default function CodeBlock(props: Props): ReactNode;

packages/docusaurus-theme-classic/src/theme/CodeBlock/Content/String.tsx

+14-6
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import {
1212
parseCodeBlockTitle,
1313
parseLanguage,
1414
parseLines,
15-
containsLineNumbers,
15+
getLineNumbersStart,
1616
useCodeWordWrap,
1717
} from '@docusaurus/theme-common/internal';
1818
import {Highlight, type Language} from 'prism-react-renderer';
@@ -59,8 +59,10 @@ export default function CodeBlockString({
5959
language,
6060
magicComments,
6161
});
62-
const showLineNumbers =
63-
showLineNumbersProp ?? containsLineNumbers(metastring);
62+
const lineNumbersStart = getLineNumbersStart({
63+
showLineNumbers: showLineNumbersProp,
64+
metastring,
65+
});
6466

6567
return (
6668
<Container
@@ -87,16 +89,22 @@ export default function CodeBlockString({
8789
<code
8890
className={clsx(
8991
styles.codeBlockLines,
90-
showLineNumbers && styles.codeBlockLinesWithNumbering,
91-
)}>
92+
lineNumbersStart !== undefined &&
93+
styles.codeBlockLinesWithNumbering,
94+
)}
95+
style={
96+
lineNumbersStart === undefined
97+
? undefined
98+
: {counterReset: `line-count ${lineNumbersStart - 1}`}
99+
}>
92100
{tokens.map((line, i) => (
93101
<Line
94102
key={i}
95103
line={line}
96104
getLineProps={getLineProps}
97105
getTokenProps={getTokenProps}
98106
classNames={lineClassNames[i]}
99-
showLineNumbers={showLineNumbers}
107+
showLineNumbers={lineNumbersStart !== undefined}
100108
/>
101109
))}
102110
</code>

packages/docusaurus-theme-common/src/internal.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ export {
3737
parseCodeBlockTitle,
3838
parseLanguage,
3939
parseLines,
40-
containsLineNumbers,
40+
getLineNumbersStart,
4141
} from './utils/codeBlockUtils';
4242

4343
export {DEFAULT_SEARCH_TAG} from './utils/searchUtils';

packages/docusaurus-theme-common/src/utils/codeBlockUtils.ts

+31-2
Original file line numberDiff line numberDiff line change
@@ -151,8 +151,37 @@ export function parseCodeBlockTitle(metastring?: string): string {
151151
return metastring?.match(codeBlockTitleRegex)?.groups!.title ?? '';
152152
}
153153

154-
export function containsLineNumbers(metastring?: string): boolean {
155-
return Boolean(metastring?.includes('showLineNumbers'));
154+
function getMetaLineNumbersStart(metastring?: string): number | undefined {
155+
const showLineNumbersMeta = metastring
156+
?.split(' ')
157+
.find((str) => str.startsWith('showLineNumbers'));
158+
159+
if (showLineNumbersMeta) {
160+
if (showLineNumbersMeta.startsWith('showLineNumbers=')) {
161+
const value = showLineNumbersMeta.replace('showLineNumbers=', '');
162+
return parseInt(value, 10);
163+
}
164+
return 1;
165+
}
166+
167+
return undefined;
168+
}
169+
170+
export function getLineNumbersStart({
171+
showLineNumbers,
172+
metastring,
173+
}: {
174+
showLineNumbers: boolean | number | undefined;
175+
metastring: string | undefined;
176+
}): number | undefined {
177+
const defaultStart = 1;
178+
if (typeof showLineNumbers === 'boolean') {
179+
return showLineNumbers ? defaultStart : undefined;
180+
}
181+
if (typeof showLineNumbers === 'number') {
182+
return showLineNumbers;
183+
}
184+
return getMetaLineNumbersStart(metastring);
156185
}
157186

158187
/**

website/docs/guides/markdown-features/markdown-features-code-blocks.mdx

+26-14
Original file line numberDiff line numberDiff line change
@@ -395,37 +395,49 @@ The `Line` component will receive the list of class names, based on which you ca
395395
You can enable line numbering for your code block by using `showLineNumbers` key within the language meta string (don't forget to add space directly before the key).
396396

397397
````md
398-
```jsx {1,4-6,11} showLineNumbers
398+
```jsx showLineNumbers
399399
import React from 'react';
400400

401-
function MyComponent(props) {
402-
if (props.isBar) {
403-
return <div>Bar</div>;
404-
}
405-
401+
export default function MyComponent(props) {
406402
return <div>Foo</div>;
407403
}
408-
409-
export default MyComponent;
410404
```
411405
````
412406

413407
```mdx-code-block
414408
<BrowserWindow>
415409
```
416410

417-
```jsx {1,4-6,11} showLineNumbers
411+
```jsx showLineNumbers
418412
import React from 'react';
419413

420-
function MyComponent(props) {
421-
if (props.isBar) {
422-
return <div>Bar</div>;
423-
}
414+
export default function MyComponent(props) {
415+
return <div>Foo</div>;
416+
}
417+
```
424418

419+
```mdx-code-block
420+
</BrowserWindow>
421+
```
422+
423+
By default, the counter starts at line number 1. It's possible to pass a custom counter start value to split large code blocks for readability:
424+
425+
````md
426+
```jsx showLineNumbers=3
427+
export default function MyComponent(props) {
425428
return <div>Foo</div>;
426429
}
430+
```
431+
````
427432

428-
export default MyComponent;
433+
```mdx-code-block
434+
<BrowserWindow>
435+
```
436+
437+
```jsx showLineNumbers=3
438+
export default function MyComponent(props) {
439+
return <div>Foo</div>;
440+
}
429441
```
430442

431443
```mdx-code-block

0 commit comments

Comments
 (0)