1
+ < section class ="hero is-fullheight ">
2
+ < div class ="hero-body " style ="padding: 0; ">
3
+ < div class ="container ">
4
+ < div class ="columns ">
5
+ < div class ="column is-flex ">
6
+ < div class ="column-child terminal shadow ">
7
+ < div class ="terminal-bar ">
8
+ < div class ="icon-btn close "> </ div >
9
+ < div class ="icon-btn min "> </ div >
10
+ < div class ="icon-btn max "> </ div >
11
+ < div class ="terminal-bar-text is-hidden-mobile dark-mode-text "> explorer@dataherb: ~</ div >
12
+ </ div >
13
+ < div class ="terminal-window primary-bg " onclick ="document.getElementById('dummyKeyboard').focus(); ">
14
+ < div class ="terminal-output " id ="terminalOutput ">
15
+ < div class ="terminal-line ">
16
+ < span class ="help-msg "> The DataHerb Terminal — Type < span class ="code "> help</ span > .</ span >
17
+ </ div >
18
+ </ div >
19
+ < div class ="terminal-line ">
20
+ < span class ="success "> ➜</ span > < span class ="directory "> ~</ span > < span class ="user-input "
21
+ id ="userInput "> </ span >
22
+ < input type ="text " id ="dummyKeyboard " class ="dummy-keyboard ">
23
+ </ div >
24
+ </ div >
25
+ </ div >
26
+ </ div >
27
+ </ div >
28
+ </ div >
29
+ </ div >
30
+ </ section >
31
+
32
+ < script >
33
+ var dataset = { }
34
+ const BLACKLISTED_KEY_CODES = [ 38 ] ;
35
+ const COMMANDS = {
36
+ help :
37
+ `DataHerb Terminal Help:
38
+ <span class="code">about</span>,
39
+ <span class="code">dataset</span>.` ,
40
+ about :
41
+ "DataHerb terminal is developed for more advanced data explorations on DataHerb." ,
42
+ dataset :
43
+ `Dataset name: <span class="code">{{page.name}}</span><br>
44
+ GitHub Repository: <span class="code"><a href="https://github.com/{{ page.repository }}">{{ page.repository }}</a></span><br>
45
+ {% if page.data %}
46
+ {% for data in page.data %}
47
+ {% assign data_path_base_url = 'https://raw.githubusercontent.com/' %}
48
+ {% assign data_path_branch = '/master/' %}
49
+ {% assign data_path = data_path_base_url | append: page.repository | append: data_path_branch | append: data.path %}
50
+ <div class="is-divider" style="border-top:.05rem dashed #dbdbdb !important; margin: 0!important;"></div>
51
+ {% if data.name %}Name: <span class="code">{{ data.name }}</span> <br>{% endif %}
52
+ File: <span class="code">{{data.path}}</span><br>
53
+ {% endfor %}
54
+ {% endif %}` ,
55
+ "load" : `Load dataset into console in the developer tool. <span class="code">load(file_path_in_dataset)</span>` ,
56
+ { % if page . data % }
57
+ { % for data in page . data % }
58
+ { % assign data_path_base_url = 'https://raw.githubusercontent.com/' % }
59
+ { % assign data_path_branch = '/master/' % }
60
+ { % assign data_path = data_path_base_url | append : page . repository | append : data_path_branch | append : data . path % }
61
+ "load({{data.path}})" : `Load {{data.path}} into console.` { % unless forloop . last % } , { % endunless % }
62
+ { % endfor % }
63
+ { % endif % }
64
+ } ;
65
+ let userInput , terminalOutput ;
66
+
67
+ const app = ( ) => {
68
+ userInput = document . getElementById ( "userInput" ) ;
69
+ terminalOutput = document . getElementById ( "terminalOutput" ) ;
70
+ document . getElementById ( "dummyKeyboard" ) . focus ( ) ;
71
+ console . log ( "Application loaded" ) ;
72
+ } ;
73
+
74
+ const execute = function executeCommand ( input ) {
75
+ let output ;
76
+ input = input . toLowerCase ( ) ;
77
+ if ( input . length === 0 ) {
78
+ return ;
79
+ }
80
+ output = `<div class="terminal-line"><span class="success">➜</span> <span class="directory">~</span> ${ input } </div>` ;
81
+ if ( ! COMMANDS . hasOwnProperty ( input ) ) {
82
+ output += `<div class="terminal-line">no such command: ${ input } </div>` ;
83
+ console . log ( "Oops! no such command" ) ;
84
+ } else if ( input === "load" ) {
85
+ { % if page . data % }
86
+ { % for data in page . data % }
87
+ { % assign data_path_base_url = 'https://raw.githubusercontent.com/' % }
88
+ { % assign data_path_branch = '/master/' % }
89
+ { % assign data_path = data_path_base_url | append : page . repository | append : data_path_branch | append : data . path % }
90
+ d3 . csv ( "{{data_path}}" ) . then ( function ( data ) { dataset [ "{{data.path}}" ] = data } )
91
+ { % endfor % }
92
+ { % endif % }
93
+
94
+ }
95
+ else {
96
+ output += COMMANDS [ input ] ;
97
+ }
98
+
99
+ terminalOutput . innerHTML = `${
100
+ terminalOutput . innerHTML
101
+ } <div class="terminal-line">${ output } </div>`;
102
+ terminalOutput . scrollTop = terminalOutput . scrollHeight ;
103
+ } ;
104
+
105
+ const key = function keyEvent ( e ) {
106
+ const input = userInput . innerHTML ;
107
+
108
+ if ( BLACKLISTED_KEY_CODES . includes ( e . keyCode ) ) {
109
+ return ;
110
+ }
111
+
112
+ if ( e . key === "Enter" ) {
113
+ execute ( input ) ;
114
+ userInput . innerHTML = "" ;
115
+ return ;
116
+ }
117
+
118
+ userInput . innerHTML = input + e . key ;
119
+ } ;
120
+
121
+ const backspace = function backSpaceKeyEvent ( e ) {
122
+ if ( e . keyCode !== 8 && e . keyCode !== 46 ) {
123
+ return ;
124
+ }
125
+ userInput . innerHTML = userInput . innerHTML . slice (
126
+ 0 ,
127
+ userInput . innerHTML . length - 1
128
+ ) ;
129
+ } ;
130
+
131
+ document . addEventListener ( "keydown" , backspace ) ;
132
+ document . addEventListener ( "keypress" , key ) ;
133
+ document . addEventListener ( "DOMContentLoaded" , app ) ;
134
+
135
+ </ script >
0 commit comments