Parcourir la Source

use codemirror for syntax highlighting

Lucas Stadler 11 ans auparavant
Parent
commit
44106d5cbd
3 fichiers modifiés avec 71 ajouts et 0 suppressions
  1. 2 0
      go/linguaevalia/.gitignore
  2. 25 0
      go/linguaevalia/Makefile
  3. 44 0
      go/linguaevalia/linguaevalia.go

+ 2 - 0
go/linguaevalia/.gitignore

@ -1 +1,3 @@
1 1
linguaevalia
2
3
lib

+ 25 - 0
go/linguaevalia/Makefile

@ -0,0 +1,25 @@
1
all: lib/codemirror.js lib/codemirror.css
2
3
lib:
4
	mkdir lib
5
6
lib/codemirror.js: lib
7
	curl -o $@ 'http://marijnhaverbeke.nl/uglifyjs' --data 'download=codemirror-compressed.js' \
8
		--data 'code_url=http://codemirror.net/lib/codemirror.js' \
9
		--data 'code_url=http://codemirror.net/mode/clike/clike.js'\
10
		--data 'code_url=http://codemirror.net/mode/clojure/clojure.js'\
11
		--data 'code_url=http://codemirror.net/mode/go/go.js'\
12
		--data 'code_url=http://codemirror.net/mode/haskell/haskell.js'\
13
		--data 'code_url=http://codemirror.net/mode/javascript/javascript.js'\
14
		--data 'code_url=http://codemirror.net/mode/lua/lua.js'\
15
		--data 'code_url=http://codemirror.net/mode/python/python.js'\
16
		--data 'code_url=http://codemirror.net/mode/ruby/ruby.js'\
17
		--data 'code_url=http://codemirror.net/mode/rust/rust.js'\
18
		--data 'code_url=http://codemirror.net/mode/shell/shell.js'\
19
		--data 'header=%2F*+CodeMirror+-+Minified+%26+Bundled+*%2F'
20
21
lib/codemirror.css: lib
22
	curl -o $@ http://codemirror.net/lib/codemirror.css
23
24
clean:
25
	rm -rf lib

+ 44 - 0
go/linguaevalia/linguaevalia.go

@ -135,6 +135,12 @@ func main() {
135 135
	fmt.Printf("running on %s:%d\n", addr, port)
136 136
137 137
	http.HandleFunc("/run", runCodeHandler)
138
	http.HandleFunc("/codemirror.js", func(w http.ResponseWriter, r *http.Request) {
139
		http.ServeFile(w, r, "lib/codemirror.js")
140
	})
141
	http.HandleFunc("/codemirror.css", func(w http.ResponseWriter, r *http.Request) {
142
		http.ServeFile(w, r, "lib/codemirror.css")
143
	})
138 144
	http.HandleFunc("/", homePageHandler)
139 145
140 146
	err := http.ListenAndServe(fmt.Sprintf("%s:%d", addr, port), nil)
@ -163,10 +169,17 @@ const homePageTemplateStr = `
163 169
      position: absolute;
164 170
      right: 0;
165 171
      top: 0;
172
      z-index: 10; /* above codemirror */
166 173
    }
167 174
168 175
    .error { color: red; }
169 176
    </style>
177
    <link rel="stylesheet" type="text/css" href="/codemirror.css" />
178
    <style type="text/css">
179
    .CodeMirror {
180
      min-width: 80ex;
181
    }
182
    </style>
170 183
  </head>
171 184
172 185
  <body>
@ -204,6 +217,7 @@ func main() {
204 217
        }
205 218
      }
206 219
220
207 221
      function sendCode(code, language, cb) {
208 222
        var xhr = new XMLHttpRequest();
209 223
        xhr.open("POST", "/run?language=" + language);
@ -215,6 +229,36 @@ func main() {
215 229
        xhr.send(code);
216 230
      }
217 231
    </script>
232
233
    <script src="/codemirror.js"></script>
234
    <script>
235
      var cm = CodeMirror.fromTextArea(codeEl, {mode: languageToMode(languageEl.value)});
236
237
      cm.on("changes", function(cm) { codeEl.value = cm.getValue(); });
238
239
      cm.setOption("extraKeys", {
240
        "Ctrl-Enter": function(cm) {
241
          resultEl.textContent = "";
242
          sendCode(cm.getValue(), languageEl.value, function(xhr) {
243
            resultEl.className = xhr.status == 200 ? "success" : "error";
244
            resultEl.textContent = xhr.response;
245
          });
246
        }
247
      });
248
249
      languageEl.onchange = function(ev) {
250
        cm.setOption("mode", languageToMode(languageEl.value));
251
      };
252
253
      function languageToMode(language) {
254
        switch(language) {
255
        case "bash": return "shell";
256
        case "pixie": return "clojure";
257
        case "c": return "text/x-csrc";
258
        default: return language;
259
        }
260
      }
261
    </script>
218 262
  </body>
219 263
</html>
220 264
`