前言

看了一下 Highlight.js 的说明文档,不支持RISCV的汇编。只能自己摸索怎么高亮了。

因为Hexo在启动时就会对Markdown文件进行编译并转换成HTML文件,因此修改本地安装好的node库就行。

Highlight.js

在Hexo项目下的node_modules\highlight.js\lib内新建riscvasm.jsriscvasm.js.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
/*
Language: RISC-V Assembly
Author: Custom
Description: RISC-V Assembly including RV32/RV64 instructions
Category: assembler
*/

/** @type LanguageFn */
function riscvasm(hljs) {
const COMMENT = { variants: [
hljs.COMMENT('#', '$', { relevance: 0 }),
hljs.C_BLOCK_COMMENT_MODE
] };

return {
name: 'RISC-V Assembly',
case_insensitive: true,
aliases: [ 'riscv', 'assembly' ],
keywords: {
$pattern: '\\.?[0-9a-z]+(\\.[0-9a-z]+){0,2}',
meta:
// Assembler directives
'.align .file .globl .local .comm .common .ident .section .size .text .data .rodata .bss .string .asciz .equ .marco .endm .type .option .2byte .half .short .4byte .word .long .8byte .dword .quad .float .double .dtprelword .dtpreldword .sleb128 .uleb128 .p2align .balign .zero .variant_cc .attribute ',
built_in:
// Integer registers (x0-x31)
'x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 x13 x14 x15 '
+ 'x16 x17 x18 x19 x20 x21 x22 x23 x24 x25 x26 x27 x28 x29 x30 x31 '
// Program counter
+ 'pc '
// Floating-point registers (f0-f31)
+ 'f0 f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12 f13 f14 f15 '
+ 'f16 f17 f18 f19 f20 f21 f22 f23 f24 f25 f26 f27 f28 f29 f30 f31 '
// ABI register names
+ 'zero ra sp gp tp t0 t1 t2 s0 s1 a0 a1 a2 a3 a4 a5 a6 a7 '
+ 's2 s3 s4 s5 s6 s7 s8 s9 s10 s11 t3 t4 t5 t6 fp '
},
contains: [
{
className: 'keyword',
begin: '\\b('
// RV32I Base Integer Instructions
+ 'lui|auipc|jal|jalr|beq|bne|blt|bge|bltu|bgeu|'
+ 'lb|lh|lw|lbu|lhu|sb|sh|sw|'
+ 'addi|slti|sltiu|xori|ori|andi|slli|srli|srai|'
+ 'add|sub|sll|slt|sltu|xor|srl|sra|or|and|'
+ 'fence|ecall|ebreak|'
// RV64I Base Integer Instructions
+ 'lwu|ld|sd|addiw|slliw|srliw|sraiw|addw|subw|sllw|srlw|sraw|'
// RV32M Multiply Extension
+ 'mul|mulh|mulhsu|mulhu|div|divu|rem|remu|'
// RV64M Multiply Extension
+ 'mulw|divw|divuw|remw|remuw|'
// RV32F Single-Precision Floating-Point
+ 'flw|fsw|fmadd\\.s|fmsub\\.s|fnmsub\\.s|fnmadd\\.s|'
+ 'fadd\\.s|fsub\\.s|fmul\\.s|fdiv\\.s|fsqrt\\.s|'
+ 'fsgnj\\.s|fsgnjn\\.s|fsgnjx\\.s|fmin\\.s|fmax\\.s|'
+ 'fcvt\\.w\\.s|fcvt\\.wu\\.s|fmv\\.x\\.w|'
+ 'feq\\.s|flt\\.s|fle\\.s|fclass\\.s|'
+ 'fcvt\\.s\\.w|fcvt\\.s\\.wu|fmv\\.w\\.x|'
+ 'fcvt\\.l\\.s|fcvt\\.lu\\.s|fcvt\\.s\\.l|fcvt\\.s\\.lu|'
// RV32D Double-Precision Floating-Point
+ 'fld|fsd|fmadd\\.d|fmsub\\.d|fnmsub\\.d|fnmadd\\.d|'
+ 'fadd\\.d|fsub\\.d|fmul\\.d|fdiv\\.d|fsqrt\\.d|'
+ 'fsgnj\\.d|fsgnjn\\.d|fsgnjx\\.d|fmin\\.d|fmax\\.d|'
+ 'fcvt\\.s\\.d|fcvt\\.d\\.s|feq\\.d|flt\\.d|fle\\.d|fclass\\.d|'
+ 'fcvt\\.w\\.d|fcvt\\.wu\\.d|fcvt\\.d\\.w|fcvt\\.d\\.wu|'
+ 'fcvt\\.l\\.d|fcvt\\.lu\\.d|fmv\\.x\\.d|fcvt\\.d\\.l|fcvt\\.d\\.lu|fmv\\.d\\.x|'
// RV32A Atomic Extension
+ 'lr\\.w|sc\\.w|amoswap\\.w|amoadd\\.w|amoxor\\.w|amoand\\.w|amoor\\.w|'
+ 'amomin\\.w|amomax\\.w|amominu\\.w|amomaxu\\.w|'
// RV64A Atomic Extension
+ 'lr\\.d|sc\\.d|amoswap\\.d|amoadd\\.d|amoxor\\.d|amoand\\.d|amoor\\.d|'
+ 'amomin\\.d|amomax\\.d|amominu\\.d|amomaxu\\.d|'
// Zicsr Extension
+ 'csrrw|csrrs|csrrc|csrrwi|csrrsi|csrrci|'
// Zifencei Extension
+ 'fence\\.i|'
// Pseudoinstructions
+ 'la|lla|nop|li|mv|not|neg|negw|sext\\.w|seqz|snez|sltz|sgtz|'
+ 'fmv\\.s|fabs\\.s|fneg\\.s|fmv\\.d|fabs\\.d|fneg\\.d|'
+ 'beqz|bnez|blez|bgez|bltz|bgtz|bgt|ble|bgtu|bleu|'
+ 'j|jr|ret|call|tail|'
+ 'rdinstret|rdcycle|rdtime|'
+ 'csrr|csrw|csrs|csrc|csrwi|csrsi|csrci|'
+ 'frcsr|fscsr|frrm|fsrm|frflags|fsflags|'
// Privileged Instructions
+ 'sret|mret|wfi|sfence\\.vma|sinval\\.vma|'
+ 'sfence\\.w\\.inval|sfence\\.inval\\.ir|'
+ 'hfence\\.vvma|hfence\\.gvma|hinval\\.vvma|hinval\\.gvma|'
+ 'hlv\\.b|hlv\\.bu|hlv\\.h|hlv\\.hu|hlvx\\.hu|'
+ 'hlv\\.w|hlvx\\.wu|hsv\\.b|hsv\\.h|hsv\\.w|hlv\\.wu|hlv\\.d|hsv\\.d'
+ ')'
+ '(?=\\s|$)' // followed by space or end
},
COMMENT,
hljs.QUOTE_STRING_MODE,
{
className: 'number',
variants: [
{ // hex
begin: '0x[0-9a-f]+' },
{ // bin
begin: '0b[01]+' },
{ // decimal with optional negative
begin: '(?<![\\w.])-?(0|[1-9]\\d*)(?![:\\w])' },
{ // float
begin: '\\b-?\\d+\\.\\d+' }
],
relevance: 0
},
{
className: 'symbol',
variants: [
{ // label definition
begin: '^\\s*[A-Za-z._?][A-Za-z0-9_$#@~.?]*(:|\\s+label)' },
{ // local label with %%
begin: '^\\s*%%[A-Za-z0-9_$#@~.?]*:' },
{ // numeric label
begin: '^\\s*[0-9]+:' },
{ // numeric label reference (forward/backward)
begin: '[0-9]+[bf](?!\\w)' }
],
relevance: 0
}
]
};
}

module.exports = riscvasm;

1
2
3
4
5
6
7
8
9
10
function emitWarning() {
if (!emitWarning.warned) {
emitWarning.warned = true;
console.log(
'Deprecation (warning): Using file extension in specifier is deprecated, use "highlight.js/lib/languages/riscvasm" instead of "highlight.js/lib/languages/riscvasm.js"'
);
}
}
emitWarning();
module.exports = require('./riscvasm.js');

然后修改index.js,加一行:

1
hljs.registerLanguage('riscvasm', require('./languages/riscvasm'));

Hexo_util

上面改完还不够,Hexo不认识。研究了半天才找到解决方案。

修改node_modules\hexo-util\highlight_alias.json

1
2
3
4
5
6
7
8
9
10
{
"languages": [
"riscvasm",
// ...
],
"aliases": {
"riscv": "riscvasm",
// ...
}
}

然后执行hexo clean后再重新部署即可。

Tree 目录树结构

类似的,我们可以加上目录树结构的高亮:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
/*
Language: Tree (Directory Structure)
Author: Custom
Description: Syntax highlighting for tree/directory structure output
Category: common
*/

/** @type LanguageFn */
function tree(hljs) {
const COMMENT = hljs.COMMENT('#', '$', { relevance: 0 });

return {
name: 'tree',
case_insensitive: false,
aliases: ['directory', 'dir-tree'],
contains: [
// 注释 (# 开头)
COMMENT,
// 树形连接符
{
className: 'meta',
begin: '[│├└─┬┐┘┌┼]+',
relevance: 10
},
// ASCII 风格的树形连接符
{
className: 'meta',
begin: '\\|',
relevance: 0
},
// 目录(以 / 结尾或明确标注)
{
className: 'title',
begin: '(?<=[─\\s])[A-Za-z0-9_\\-\\.]+(?=/|\\s+#.*目录|\\s+#.*folder)',
relevance: 5
},
// 带扩展名的文件
{
className: 'string',
begin: '(?<=[─\\s])[A-Za-z0-9_\\-]+\\.[A-Za-z0-9]+',
relevance: 5
},
// 通用文件/目录名(无扩展名)
{
className: 'variable',
begin: '(?<=[─\\s])[A-Za-z0-9_\\-\\.]+(?=\\s|$)',
relevance: 0
},
// 标记符号 (如 *)
{
className: 'symbol',
begin: '\\*',
relevance: 0
}
]
};
}

module.exports = tree;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
├── barebones/            # barebones 移植
# 这两个文件需要修改
├── core_portme.c # coremark 的平台移植层实现模板
├── core_portme.h # 核心可移植层头文件

├── core_portme.mak # Makefile
├── cvt.c # 用于浮点数到字符串转换的实现 可不需要
└── ee_printf.c # printf 格式化实现

├── barebones_porting.md # barebones移植说明

├── core_list_join.c # 以下六个为 coremark 核心代码
├── core_main.c # 原则上不需要修改
├── core_matrix.c # 修改也禁止修改算法相关
├── core_state.c # 需保证计算后的校验值一致
├── core_util.c #
├── coremark.h #

├── Makefile # Makefile
└── README.md # 移植说明