@@ -4,11 +4,16 @@ import styles from './highlighter.module.css';
4
4
5
5
enum RendererType {
6
6
EmptyLines ,
7
+ TaskDefinitions ,
7
8
FunctionDefinitions ,
9
+ Sections ,
8
10
Comments ,
9
11
Variables ,
12
+ TaskCalls ,
10
13
Conditionals ,
11
14
EchoStatements ,
15
+ Titles ,
16
+ FunctionEnds ,
12
17
}
13
18
14
19
type LineRenderer = {
@@ -21,23 +26,48 @@ export const lineRenderers: Record<RendererType, LineRenderer> = {
21
26
test : ( line ) => line . trim ( ) === '' ,
22
27
render : ( _ , i ) => < div key = { i } > </ div > ,
23
28
} ,
24
- [ RendererType . FunctionDefinitions ] : {
25
- test : ( line ) => / ^ f u n c t i o n \s + [ a - z A - Z _ : ] + / . test ( line ) ,
29
+ [ RendererType . TaskDefinitions ] : {
30
+ test : ( line ) => / ^ f u n c t i o n \s t a s k : + [ a -z A -Z - _ :] + / . test ( line ) ,
26
31
render : ( line , i ) => {
27
- const [ , name , rest ] = line . match ( / ^ f u n c t i o n \s + ( [ a - z A - Z _ : ] + ) ( .* ) / ) || [ ] ;
32
+ const [ , name , rest ] = line . match ( / ^ f u n c t i o n \s t a s k : + ( [ a - z A - Z - _ :] + ) \s { \s # # ( . * ) / ) || [ ] ;
28
33
return (
29
34
< div key = { i } className = { styles . line } >
30
- < span className = { styles [ 'text-purple' ] } > function </ span >
35
+ < span className = { styles [ 'text-gray' ] } > function</ span >
36
+ < span className = { styles [ 'text-white' ] } > task:</ span >
31
37
< span className = { styles [ 'text-yellow' ] } > { name } </ span >
38
+ < span className = { styles [ 'text-gray' ] } > { ' {' } </ span >
39
+ < span className = { styles [ 'text-green' ] } > { ' ##' } </ span >
32
40
< span className = { styles [ 'text-white' ] } > { rest } </ span >
33
41
</ div >
34
42
) ;
35
43
} ,
36
44
} ,
45
+ [ RendererType . FunctionDefinitions ] : {
46
+ test : ( line ) => / ^ f u n c t i o n \s + [ a -z A -Z -_ :] + / . test ( line ) ,
47
+ render : ( line , i ) => {
48
+ const [ , name , rest ] = line . match ( / ^ f u n c t i o n \s + ( [ a -z A -Z -_ :] + ) ( .* ) / ) || [ ] ;
49
+ return (
50
+ < div key = { i } className = { styles . line } >
51
+ < span className = { styles [ 'text-gray' ] } > function </ span >
52
+ < span className = { styles [ 'text-white' ] } > { name } </ span >
53
+ < span className = { styles [ 'text-gray' ] } > { rest } </ span >
54
+ </ div >
55
+ ) ;
56
+ } ,
57
+ } ,
58
+ [ RendererType . Sections ] : {
59
+ test : ( line ) => line . startsWith ( '## ' ) ,
60
+ render : ( line , i ) => (
61
+ < div key = { i } className = { styles . line } >
62
+ < span className = { styles [ 'text-green' ] } > ## </ span >
63
+ < span className = { styles [ 'text-white' ] } > { line . substring ( 3 ) } </ span >
64
+ </ div >
65
+ ) ,
66
+ } ,
37
67
[ RendererType . Comments ] : {
38
68
test : ( line ) => line . trim ( ) . startsWith ( '#' ) ,
39
69
render : ( line , i ) => (
40
- < div key = { i } className = { styles [ 'text-gray ' ] } >
70
+ < div key = { i } className = { styles [ 'text-green ' ] } >
41
71
{ line }
42
72
</ div >
43
73
) ,
@@ -49,14 +79,14 @@ export const lineRenderers: Record<RendererType, LineRenderer> = {
49
79
return (
50
80
< div key = { i } className = { styles . line } >
51
81
< span className = { styles [ 'text-blue' ] } > { varName } </ span >
52
- < span className = { styles [ 'text-white ' ] } > =</ span >
53
- < span className = { styles [ 'text-yellow-light ' ] } > { rest . join ( '=' ) } </ span >
82
+ < span className = { styles [ 'text-gray ' ] } > =</ span >
83
+ < span className = { styles [ 'text-white ' ] } > { rest . join ( '=' ) } </ span >
54
84
</ div >
55
85
) ;
56
86
} ,
57
87
} ,
58
88
[ RendererType . Conditionals ] : {
59
- test : ( line ) => / ^ \s * i f \s + | ^ \s * t h e n \s + | ^ \s * e l s e \s + | ^ \s * f i \s * / . test ( line ) ,
89
+ test : ( line ) => / ^ i f + | ^ t h e n + | ^ e l s e + | ^ f i / . test ( line . trim ( ) ) ,
60
90
render : ( line , i ) => (
61
91
< div key = { i } className = { styles [ 'text-pink' ] } >
62
92
{ line }
@@ -69,11 +99,43 @@ export const lineRenderers: Record<RendererType, LineRenderer> = {
69
99
const parts = line . split ( 'echo' ) ;
70
100
return (
71
101
< div key = { i } className = { styles . line } >
72
- < span className = { styles [ 'text-white' ] } > { parts [ 0 ] } </ span >
73
- < span className = { styles [ 'text-blue-light' ] } > echo</ span >
102
+ < span className = { styles [ 'text-white' ] } > { parts [ 0 ] } echo</ span >
103
+ < span className = { styles [ 'text-yellow-light' ] } > { parts [ 1 ] } </ span >
104
+ </ div >
105
+ ) ;
106
+ } ,
107
+ } ,
108
+ [ RendererType . Titles ] : {
109
+ test : ( line ) => line . trim ( ) . startsWith ( 'title' ) ,
110
+ render : ( line , i ) => {
111
+ const parts = line . split ( 'title' ) ;
112
+ return (
113
+ < div key = { i } className = { styles . line } >
114
+ < span className = { styles [ 'text-white' ] } > { parts [ 0 ] } title</ span >
74
115
< span className = { styles [ 'text-yellow-light' ] } > { parts [ 1 ] } </ span >
75
116
</ div >
76
117
) ;
77
118
} ,
78
119
} ,
120
+ [ RendererType . TaskCalls ] : {
121
+ test : ( line ) => / ^ \s t a s k : + [ a -z A -Z -_ :] + / . test ( line ) ,
122
+ render : ( line , i ) => {
123
+ const [ , space , task ] = line . match ( / ( \s ) t a s k : + ( [ a -z A -Z -_ :] + ) / ) || [ ] ;
124
+
125
+ return (
126
+ < div key = { i } className = { styles . line } >
127
+ < span className = { styles [ 'text-white' ] } > { space } task:</ span >
128
+ < span className = { styles [ 'text-yellow' ] } > { task } </ span >
129
+ </ div >
130
+ ) ;
131
+ } ,
132
+ } ,
133
+ [ RendererType . FunctionEnds ] : {
134
+ test : ( line ) => line . trim ( ) . startsWith ( '}' ) ,
135
+ render : ( line , i ) => (
136
+ < div key = { i } className = { styles [ 'text-gray' ] } >
137
+ { line }
138
+ </ div >
139
+ ) ,
140
+ } ,
79
141
} ;
0 commit comments