Skip to content

Commit 0669a14

Browse files
committed
支持配置显示行号
1 parent 6317d63 commit 0669a14

File tree

4 files changed

+58
-6
lines changed

4 files changed

+58
-6
lines changed

docs/content/usage/code.md

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
---
2+
title: CodeBlock
3+
icon: code
4+
---
5+
6+
PageForge 支持使用代码块,用户可以自定义代码块的样式,以便更好地展示代码的语法和格式。
7+
8+
## 基本语法
9+
10+
---
11+
12+
以下是一个简单的示例:
13+
14+
```java
15+
public class HelloWorld {
16+
public static void main(String[] args) {
17+
System.out.println("Hello, World!");
18+
}
19+
}
20+
```
21+
22+
## 配置行号
23+
24+
---
25+
26+
> 默认情况下,代码块不会显示行号,但可以通过配置 `showLineNumbers` 或者 `showLineNumbers=true` 参数来启用行号显示。格式为
27+
> **```java showLineNumbers**
28+
> 或者
29+
> **```java showLineNumbers=true**
30+
31+
```java showLineNumbers
32+
public class HelloWorld {
33+
public static void main(String[] args) {
34+
System.out.println("Hello, World!");
35+
}
36+
}
37+
```

docs/pageforge.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ i18n:
2929
Setup: Setup
3030
Usage: Usage Docs
3131
EjsTemplate: EJS Template
32+
CodeBlock: Code Block
3233
ReleaseNotes: Release Notes
3334
zh-CN:
3435
name: 中文
@@ -38,6 +39,7 @@ i18n:
3839
Setup: 设置
3940
Usage: 使用文档
4041
EjsTemplate: EJS 模板
42+
CodeBlock: 代码块
4143
ReleaseNotes: 发布日志
4244

4345
footer:
@@ -92,6 +94,7 @@ nav:
9294
- /usage/alert
9395
- /usage/tab
9496
- /usage/ejs
97+
- /usage/code
9598
- ReleaseNotes:
9699
- /release/2025.1.0
97100
- /release/1.0.0

lib/extension/marked/pageforge-code-block.js

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,12 +48,13 @@ const PageForgeCodeBlockExtension = {
4848
return src.match(/^```/)?.index;
4949
},
5050
tokenizer(src, tokens) {
51-
const rule = /^```(\w*)\n([\s\S]*?)\n```/;
51+
const rule = /^```(\w*)(?:\s+showLineNumbers(?:=(true|false))?)?\n([\s\S]*?)\n```/;
5252
const match = rule.exec(src);
5353

5454
if (match) {
5555
let language = match[1].toLowerCase();
56-
const code = match[2].replace(/</g, '&lt;').replace(/>/g, '&gt;');
56+
const showLineNumbers = match[2] === undefined && match[0].includes('showLineNumbers') ? true : match[2] === 'true';
57+
const code = match[3].trim().replace(/</g, '&lt;').replace(/>/g, '&gt;');
5758

5859
// 处理特殊语言映射
5960
const languageMap = {
@@ -76,10 +77,12 @@ const PageForgeCodeBlockExtension = {
7677
raw: match[0],
7778
lang: language,
7879
text: highlightedCode,
80+
showLineNumbers,
7981
tokens: []
8082
};
8183
}
82-
} catch (e) {
84+
}
85+
catch (e) {
8386
console.warn(`Failed to highlight code for language: ${language}`, e);
8487
}
8588

@@ -88,6 +91,7 @@ const PageForgeCodeBlockExtension = {
8891
raw: match[0],
8992
lang: language,
9093
text: code,
94+
showLineNumbers,
9195
tokens: []
9296
};
9397
}
@@ -96,7 +100,8 @@ const PageForgeCodeBlockExtension = {
96100
renderer(item) {
97101
return loadComponent('block-code', {
98102
language: item.lang,
99-
text: item.text
103+
text: item.text,
104+
showLineNumbers: item.showLineNumbers
100105
});
101106
}
102107
};

templates/components/block-code.js

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,17 @@ module.exports = function template(item) {
33
const language = item.language ? `language-${item.language}` : '';
44
const languageLabel = item.language ? `<div class="!absolute !right-2 !top-2 !text-sm !text-gray-500 !dark:text-gray-400 !bg-gray-100 !dark:bg-gray-800 !z-10">${item.language}</div>` : '';
55

6+
const lines = item.text.split('\n');
7+
const lineNumbers = lines.map((_, i) => `<span class="!block !w-8 !pr-2 !text-right !text-gray-500 !select-none">${i + 1}</span>`).join('');
8+
const lineNumbersDiv = item.showLineNumbers ? `<div class="!py-2.5 !bg-gray-200 !dark:bg-gray-700">${lineNumbers}</div>` : '';
9+
610
return `<div class="${wrapperClass}">
711
${languageLabel}
8-
<div class="!overflow-x-auto">
9-
<pre class="!px-3 !py-2.5 !m-0"><code class="${language}">${item.text}</code></pre>
12+
<div class="!overflow-x-auto !flex">
13+
${lineNumbersDiv}
14+
<div class="!flex-1">
15+
<pre class="!px-3 !py-2.5 !m-0"><code class="${language}">${item.text}</code></pre>
16+
</div>
1017
</div>
1118
</div>`;
1219
};

0 commit comments

Comments
 (0)