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
linguaevalia
1
linguaevalia
2
3
lib

+ 25 - 0
go/linguaevalia/Makefile

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
	fmt.Printf("running on %s:%d\n", addr, port)
135
	fmt.Printf("running on %s:%d\n", addr, port)
136
136
137
	http.HandleFunc("/run", runCodeHandler)
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
	http.HandleFunc("/", homePageHandler)
144
	http.HandleFunc("/", homePageHandler)
139
145
140
	err := http.ListenAndServe(fmt.Sprintf("%s:%d", addr, port), nil)
146
	err := http.ListenAndServe(fmt.Sprintf("%s:%d", addr, port), nil)
163
      position: absolute;
169
      position: absolute;
164
      right: 0;
170
      right: 0;
165
      top: 0;
171
      top: 0;
172
      z-index: 10; /* above codemirror */
166
    }
173
    }
167
174
168
    .error { color: red; }
175
    .error { color: red; }
169
    </style>
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
  </head>
183
  </head>
171
184
172
  <body>
185
  <body>
204
        }
217
        }
205
      }
218
      }
206
219
220
207
      function sendCode(code, language, cb) {
221
      function sendCode(code, language, cb) {
208
        var xhr = new XMLHttpRequest();
222
        var xhr = new XMLHttpRequest();
209
        xhr.open("POST", "/run?language=" + language);
223
        xhr.open("POST", "/run?language=" + language);
215
        xhr.send(code);
229
        xhr.send(code);
216
      }
230
      }
217
    </script>
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
  </body>
262
  </body>
219
</html>
263
</html>
220
`
264
`