前言
看了一下 Highlight.js 的说明文档,不支持RISCV的汇编。只能自己摸索怎么高亮了。
因为Hexo在启动时就会对Markdown文件进行编译并转换成HTML文件,因此修改本地安装好的node库就行。
Highlight.js
在Hexo项目下的node_modules\highlight.js\lib内新建riscvasm.js和riscvasm.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 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 : '.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 : '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 ' + 'pc ' + '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 ' + '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(' + '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|' + 'lwu|ld|sd|addiw|slliw|srliw|sraiw|addw|subw|sllw|srlw|sraw|' + 'mul|mulh|mulhsu|mulhu|div|divu|rem|remu|' + 'mulw|divw|divuw|remw|remuw|' + '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|' + '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|' + 'lr\\.w|sc\\.w|amoswap\\.w|amoadd\\.w|amoxor\\.w|amoand\\.w|amoor\\.w|' + 'amomin\\.w|amomax\\.w|amominu\\.w|amomaxu\\.w|' + 'lr\\.d|sc\\.d|amoswap\\.d|amoadd\\.d|amoxor\\.d|amoand\\.d|amoor\\.d|' + 'amomin\\.d|amomax\\.d|amominu\\.d|amomaxu\\.d|' + 'csrrw|csrrs|csrrc|csrrwi|csrrsi|csrrci|' + 'fence\\.i|' + '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|' + '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|$)' }, COMMENT , hljs.QUOTE_STRING_MODE , { className : 'number' , variants : [ { begin : '0x[0-9a-f]+' }, { begin : '0b[01]+' }, { begin : '(?<![\\w.])-?(0|[1-9]\\d*)(?![:\\w])' }, { begin : '\\b-?\\d+\\.\\d+' } ], relevance : 0 }, { className : 'symbol' , variants : [ { begin : '^\\s*[A-Za-z._?][A-Za-z0-9_$#@~.?]*(:|\\s+label)' }, { begin : '^\\s*%%[A-Za-z0-9_$#@~.?]*:' }, { begin : '^\\s*[0-9]+:' }, { 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 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 }, { 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 / │ │ │ ├── core_portme.c │ ├── core_portme.h │ │ │ ├── core_portme.mak │ ├── cvt.c │ └── ee_printf.c │ ├── barebones_porting.md │ ├── core_list_join.c ├── core_main.c ├── core_matrix.c ├── core_state.c ├── core_util.c ├── coremark.h │ ├── Makefile └── README.md