-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathdo-kata.html
More file actions
108 lines (89 loc) · 4.57 KB
/
do-kata.html
File metadata and controls
108 lines (89 loc) · 4.57 KB
1
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
<!DOCTYPE html>
<html>
<head>
<title>ruby-kata</title>
<meta name="viewport" content="width=device-width,initial-scale=1">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/6.65.7/codemirror.min.css">
<link rel="stylesheet" href="./codekata.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/6.65.7/codemirror.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/6.65.7/keymap/sublime.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/6.65.7/addon/comment/comment.min.js"></script>
<script src="https://codemirror.net/mode/ruby/ruby.js"></script>
<script type="module">
const queryString = window.location.search;
const urlParams = new URLSearchParams(queryString);
const kata = urlParams.get('kata')
document.getElementById('kata-name').textContent = `/${kata}`
import { DefaultRubyVM } from "https://cdn.jsdelivr.net/npm/@ruby/wasm-wasi@2.5.0/dist/browser/+esm";
import { Application, Controller } from "https://unpkg.com/@hotwired/stimulus/dist/stimulus.js"
window.Stimulus = Application.start()
Stimulus.register("lazy", class extends Controller {
static values = { file: String }
connect() {
this.load()
}
load() {
fetch(`https://ruby-kata.github.io/${kata}/${this.fileValue}`, {mode: "no-cors"})
.then(response => response.text())
.then(content => {
this.element.value = content
})
.catch(error => console.log(error))
}
})
Stimulus.register("codekata", class extends Controller {
connect() {
this.setup()
}
async setup() {
this.editor = CodeMirror.fromTextArea(document.getElementById('editor'), {
mode: "ruby",
lineNumbers: true,
keyMap: 'sublime',
extraKeys: {
"Alt-Up": "swapLineUp",
"Alt-Down": "swapLineDown",
}
});
const initCodeResponse = await fetch(`https://ruby-kata.github.io/${kata}/init_code.rb`, {mode: "no-cors"})
const initCode = await initCodeResponse.text()
this.editor.setValue(initCode)
const response = await fetch("https://cdn.jsdelivr.net/npm/@ruby/3.3-wasm-wasi@2.5.0/dist/ruby+stdlib.wasm");
const module = await WebAssembly.compileStreaming(response);
const { vm } = await DefaultRubyVM(module);
this.vm = vm
}
async run() {
const testHelperResponse = await fetch("https://ruby-kata.github.io/test_helper/assertion.rb", {mode: "no-cors"})
const testHelperCode = await testHelperResponse.text()
const code = this.editor.getValue()
const testcases = document.getElementById('testcases').value
const result = this.vm.eval(`
begin
${code}
${testHelperCode}
run(%(${testcases}))
rescue => error
error
end
`);
document.getElementById('result').value = result
}
})
</script>
</head>
<body>
<div data-controller="codekata" class="page">
<textarea class="kata" data-controller="lazy" data-lazy-file-value="introduction.txt" readonly></textarea>
<div class="solution">
<textarea id="editor"></textarea>
<textarea id="testcases" class="result" data-controller="lazy" data-lazy-file-value="test_cases.rb"></textarea>
<button data-action="click->codekata#run" class="run">run</button>
<textarea id="result" class="result" readonly></textarea>
</div>
</div>
<div class="footer">
<a href="./index.html">./ruby-kata-list</a><span id="kata-name"></span>
</div>
</body>
</html>