1 | #!/usr/bin/env node
|
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 | "use strict" ;
|
29 |
|
30 |
|
31 |
|
32 | const termkit = require( '..' ) ;
|
33 | const term = termkit.terminal ;
|
34 |
|
35 | var isHd = process.argv[ 2 ] === 'hd' ;
|
36 |
|
37 |
|
38 |
|
39 | function terminate() {
|
40 | setTimeout( () => {
|
41 |
|
42 | term.grabInput( false ) ;
|
43 | term.fullscreen( false ) ;
|
44 | term.applicationKeypad( false ) ;
|
45 | term.beep() ;
|
46 |
|
47 |
|
48 | setTimeout( () => { process.exit() ; } , 100 ) ;
|
49 | } , 100 ) ;
|
50 | }
|
51 |
|
52 |
|
53 |
|
54 | term.fullscreen() ;
|
55 | term.moveTo( 1 , 1 ).bgWhite.blue( 'Welcome to Neon! ' ).bgWhite.green( 'Ctrl-C to quit' ) ;
|
56 | term.grabInput() ;
|
57 |
|
58 |
|
59 |
|
60 | var attrs , emptyAttrs , attrsIndex = 0 , emptyAttrsIndex = 0 ;
|
61 |
|
62 | if ( isHd ) {
|
63 | attrs = [
|
64 | termkit.ScreenBufferHD.DEFAULT_ATTR ,
|
65 | {
|
66 | color: { r: 200 , g: 50 , b: 50 } , bgColor: { r: 0 , g: 0 , b: 0 }
|
67 | } ,
|
68 | {
|
69 | color: { r: 230 , g: 70 , b: 70 } , bgColor: { r: 0 , g: 0 , b: 0 }
|
70 | } ,
|
71 | {
|
72 | color: { r: 200 , g: 50 , b: 50 } , bgColor: { r: 0 , g: 0 , b: 70 } , bold: true , italic: true
|
73 | } ,
|
74 | {
|
75 | color: { r: 30 , g: 170 , b: 170 } , bgColor: { r: 70 , g: 0 , b: 0 }
|
76 | }
|
77 | ] ;
|
78 |
|
79 | emptyAttrs = [
|
80 | { bgColor: { r: 200 , g: 200 , b: 0 } } ,
|
81 | { bgColor: { r: 250 , g: 250 , b: 0 } } ,
|
82 | { bgColor: { r: 230 , g: 10 , b: 0 } } ,
|
83 | { bgColor: { r: 0 , g: 10 , b: 230 } } ,
|
84 | termkit.ScreenBufferHD.DEFAULT_ATTR
|
85 | ] ;
|
86 | }
|
87 | else {
|
88 | attrs = [
|
89 | termkit.ScreenBuffer.DEFAULT_ATTR ,
|
90 | { color: 'red' , bgColor: 'black' } ,
|
91 | { color: 'green' , bgColor: 'black' } ,
|
92 | { color: 'blue' , bgColor: 'black' } ,
|
93 | {
|
94 | color: 'red' , bgColor: 'black' , bold: true , italic: true
|
95 | } ,
|
96 | { color: 'red' , bgColor: 'yellow' }
|
97 | ] ;
|
98 |
|
99 | emptyAttrs = [
|
100 | { bgColor: 'yellow' } ,
|
101 | { bgColor: 'brightYellow' } ,
|
102 | { bgColor: 'red' } ,
|
103 | { bgColor: 'blue' } ,
|
104 | termkit.ScreenBuffer.DEFAULT_ATTR
|
105 | ] ;
|
106 | }
|
107 |
|
108 |
|
109 |
|
110 | term.on( 'key' , ( key , matches , data ) => {
|
111 |
|
112 | var draw , drawCursor ;
|
113 |
|
114 |
|
115 | if ( data.isCharacter ) {
|
116 | tbuf.insert( key , attrs[ attrsIndex ] ) ;
|
117 | draw = drawCursor = true ;
|
118 | }
|
119 | else {
|
120 | switch ( key ) {
|
121 | case 'CTRL_K' :
|
122 | term.saveCursor() ;
|
123 | term.moveTo.styleReset.eraseLine.eraseDisplayBelow( 1 , 12 , 'Current: %Y\n%Y' , tbuf.getText() , tbuf.buffer.map( line => line.map( cell => JSON.stringify( cell ) ) ) ) ;
|
124 | term.restoreCursor() ;
|
125 | break ;
|
126 | case 'CTRL_S' :
|
127 | attrsIndex = ( attrsIndex + 1 ) % attrs.length ;
|
128 | break ;
|
129 | case 'CTRL_B' :
|
130 | emptyAttrsIndex = ( emptyAttrsIndex + 1 ) % emptyAttrs.length ;
|
131 | tbuf.setEmptyCellAttr( emptyAttrs[ emptyAttrsIndex ] ) ;
|
132 | draw = drawCursor = true ;
|
133 | break ;
|
134 | case 'UP' :
|
135 | tbuf.move( 0 , -1 ) ;
|
136 | drawCursor = true ;
|
137 | break ;
|
138 | case 'DOWN' :
|
139 | tbuf.move( 0 , 1 ) ;
|
140 | drawCursor = true ;
|
141 | break ;
|
142 | case 'LEFT' :
|
143 |
|
144 | tbuf.moveBackward() ;
|
145 | drawCursor = true ;
|
146 | break ;
|
147 | case 'RIGHT' :
|
148 |
|
149 | tbuf.moveForward() ;
|
150 | drawCursor = true ;
|
151 | break ;
|
152 | case 'END' :
|
153 | tbuf.moveToEndOfLine() ;
|
154 | drawCursor = true ;
|
155 | break ;
|
156 | case 'HOME' :
|
157 | tbuf.moveToColumn( 0 ) ;
|
158 | drawCursor = true ;
|
159 | break ;
|
160 | case 'ENTER' :
|
161 | tbuf.newLine() ;
|
162 | draw = drawCursor = true ;
|
163 | break ;
|
164 | case 'DELETE' :
|
165 | tbuf.delete( 1 ) ;
|
166 | draw = drawCursor = true ;
|
167 | break ;
|
168 | case 'BACKSPACE' :
|
169 | tbuf.backDelete( 1 ) ;
|
170 | draw = drawCursor = true ;
|
171 | break ;
|
172 | case 'TAB' :
|
173 | tbuf.insert( '\t' , attrs[ attrsIndex ] ) ;
|
174 | draw = drawCursor = true ;
|
175 | break ;
|
176 | case 'CTRL_C' :
|
177 | terminate() ;
|
178 | break ;
|
179 | }
|
180 | }
|
181 |
|
182 |
|
183 | if ( draw ) {
|
184 | tbuf.draw() ;
|
185 | sbuf.draw() ;
|
186 | }
|
187 |
|
188 | if ( drawCursor ) {
|
189 | tbuf.drawCursor() ;
|
190 | sbuf.drawCursor() ;
|
191 | }
|
192 | } ) ;
|
193 |
|
194 |
|
195 |
|
196 | var sbuf ;
|
197 |
|
198 | if ( isHd ) {
|
199 | sbuf = termkit.ScreenBufferHD.create( {
|
200 | dst: term , width: 20 , height: 8 , x: 2 , y: 2
|
201 | } ) ;
|
202 | }
|
203 | else {
|
204 | sbuf = termkit.ScreenBuffer.create( {
|
205 | dst: term , width: 20 , height: 8 , x: 2 , y: 2
|
206 | } ) ;
|
207 | }
|
208 |
|
209 | var tbuf = termkit.TextBuffer.create( { dst: sbuf } ) ;
|
210 | tbuf.setEmptyCellAttr( emptyAttrs[ emptyAttrsIndex ] ) ;
|
211 |
|
212 | tbuf.draw() ;
|
213 | sbuf.draw() ;
|
214 | tbuf.drawCursor() ;
|
215 | sbuf.drawCursor() ;
|
216 |
|
217 |
|
218 |
|
219 |
|
220 |
|
221 |
|