mumuki-gobstones-runner 2.7.1 → 2.8.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/assets_server.rb +21 -1
- data/lib/checker.rb +2 -2
- data/lib/game_framework/default.gbs.erb +3 -0
- data/lib/game_framework/default.xml.erb +3 -0
- data/lib/game_framework/extra.gbs.erb +84 -0
- data/lib/game_framework/program.gbs.erb +5 -0
- data/lib/game_framework/program.xml.erb +17 -0
- data/lib/gobstones.rb +1 -0
- data/lib/gobstones/batch.rb +4 -2
- data/lib/gobstones/batch_parser.rb +5 -1
- data/lib/gobstones/compilation_mode.rb +60 -0
- data/lib/gobstones_runner.rb +3 -1
- data/lib/public/full-kindergarten-toolbox.xml +5 -0
- data/lib/public/local-media/bool-false.svg +24 -0
- data/lib/public/local-media/bool-true.svg +17 -0
- data/lib/public/local-media/clean.png +0 -0
- data/lib/public/local-media/color-azul.svg +44 -0
- data/lib/public/local-media/color-negro.svg +44 -0
- data/lib/public/local-media/color-rojo.svg +44 -0
- data/lib/public/local-media/color-verde.svg +44 -0
- data/lib/public/local-media/direccion-este.svg +38 -0
- data/lib/public/local-media/direccion-norte.svg +38 -0
- data/lib/public/local-media/direccion-oeste.svg +38 -0
- data/lib/public/local-media/direccion-sur.svg +38 -0
- data/lib/public/local-media/hand.png +0 -0
- data/lib/public/local-media/main-procedure.png +0 -0
- data/lib/public/local-media/minus.png +0 -0
- data/lib/public/local-media/plus.png +0 -0
- data/lib/public/local-media/program.png +0 -0
- data/lib/public/local-media/repeticion-simple.png +0 -0
- data/lib/public/media/1x1.gif +0 -0
- data/lib/public/media/ShiftDown.png +0 -0
- data/lib/public/media/ShiftLeft.png +0 -0
- data/lib/public/media/ShiftRight.png +0 -0
- data/lib/public/media/ShiftUp.png +0 -0
- data/lib/public/media/click.mp3 +0 -0
- data/lib/public/media/click.ogg +0 -0
- data/lib/public/media/click.wav +0 -0
- data/lib/public/media/delete.mp3 +0 -0
- data/lib/public/media/delete.ogg +0 -0
- data/lib/public/media/delete.wav +0 -0
- data/lib/public/media/disconnect.mp3 +0 -0
- data/lib/public/media/disconnect.ogg +0 -0
- data/lib/public/media/disconnect.wav +0 -0
- data/lib/public/media/quote0.png +0 -0
- data/lib/public/media/quote1.png +0 -0
- data/lib/public/media/sprites.png +0 -0
- data/lib/public/media/sprites.svg +74 -0
- data/lib/public/minimal-kindergarten-toolbox.xml +2 -0
- data/lib/render/boards.html.erb +4 -6
- data/lib/render/editor/editor.css +9 -0
- data/lib/render/editor/{editor.html → editor.html.erb} +143 -18
- data/lib/render/html_renderer.rb +2 -2
- data/lib/render/with_renderer.rb +6 -3
- data/lib/version_hook.rb +1 -1
- metadata +91 -34
@@ -0,0 +1,44 @@
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
2
|
+
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
3
|
+
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
4
|
+
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
5
|
+
width="14.173px" height="14.173px" viewBox="0 0 14.173 14.173" enable-background="new 0 0 14.173 14.173" xml:space="preserve">
|
6
|
+
<g id="Layer_2" display="none">
|
7
|
+
<g display="inline">
|
8
|
+
<rect x="-5.132" y="-3.933" fill="#5CBEFF" width="67.306" height="25.396"/>
|
9
|
+
</g>
|
10
|
+
</g>
|
11
|
+
<g id="Layer_3" display="none">
|
12
|
+
</g>
|
13
|
+
<g id="Layer_7">
|
14
|
+
</g>
|
15
|
+
<g id="Layer_1">
|
16
|
+
|
17
|
+
<circle fill="#E25242" stroke="#231F20" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" cx="7.087" cy="7.086" r="3.688"/>
|
18
|
+
</g>
|
19
|
+
<g id="Layer_6" display="none">
|
20
|
+
<g display="inline">
|
21
|
+
<g>
|
22
|
+
|
23
|
+
<path fill="#231F20" stroke="#231F20" stroke-width="0.9761" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
24
|
+
M7.082,3.701c0.021,1.21-0.007,5.512,0,6.771L0.889,7.086L7.082,3.701z"/>
|
25
|
+
</g>
|
26
|
+
<g>
|
27
|
+
|
28
|
+
<path fill="none" stroke="#231F20" stroke-width="0.9761" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
29
|
+
M7.09,3.701c-0.021,1.21,0.008,5.512,0,6.771l6.194-3.386L7.09,3.701z"/>
|
30
|
+
</g>
|
31
|
+
</g>
|
32
|
+
</g>
|
33
|
+
<g id="Layer_5" display="none">
|
34
|
+
|
35
|
+
<line display="inline" fill="#FFFFFF" stroke="#231F20" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="3.836" y1="3.836" x2="10.336" y2="10.336"/>
|
36
|
+
|
37
|
+
<line display="inline" fill="#FFFFFF" stroke="#231F20" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="10.336" y1="3.836" x2="3.836" y2="10.336"/>
|
38
|
+
</g>
|
39
|
+
<g id="Layer_4" display="none">
|
40
|
+
|
41
|
+
<polyline display="inline" fill="none" stroke="#231F20" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" points="
|
42
|
+
10.958,4.801 6.388,9.372 3.215,6.094 "/>
|
43
|
+
</g>
|
44
|
+
</svg>
|
@@ -0,0 +1,44 @@
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
2
|
+
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
3
|
+
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
4
|
+
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
5
|
+
width="14.173px" height="14.173px" viewBox="0 0 14.173 14.173" enable-background="new 0 0 14.173 14.173" xml:space="preserve">
|
6
|
+
<g id="Layer_2" display="none">
|
7
|
+
<g display="inline">
|
8
|
+
<rect x="-5.132" y="-3.933" fill="#5CBEFF" width="67.306" height="25.396"/>
|
9
|
+
</g>
|
10
|
+
</g>
|
11
|
+
<g id="Layer_3" display="none">
|
12
|
+
</g>
|
13
|
+
<g id="Layer_7">
|
14
|
+
</g>
|
15
|
+
<g id="Layer_1">
|
16
|
+
|
17
|
+
<circle fill="#13B47B" stroke="#231F20" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" cx="7.087" cy="7.086" r="3.688"/>
|
18
|
+
</g>
|
19
|
+
<g id="Layer_6" display="none">
|
20
|
+
<g display="inline">
|
21
|
+
<g>
|
22
|
+
|
23
|
+
<path fill="#231F20" stroke="#231F20" stroke-width="0.9761" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
24
|
+
M7.082,3.701c0.021,1.21-0.007,5.512,0,6.771L0.889,7.086L7.082,3.701z"/>
|
25
|
+
</g>
|
26
|
+
<g>
|
27
|
+
|
28
|
+
<path fill="none" stroke="#231F20" stroke-width="0.9761" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
29
|
+
M7.09,3.701c-0.021,1.21,0.008,5.512,0,6.771l6.194-3.386L7.09,3.701z"/>
|
30
|
+
</g>
|
31
|
+
</g>
|
32
|
+
</g>
|
33
|
+
<g id="Layer_5" display="none">
|
34
|
+
|
35
|
+
<line display="inline" fill="#FFFFFF" stroke="#231F20" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="3.836" y1="3.836" x2="10.336" y2="10.336"/>
|
36
|
+
|
37
|
+
<line display="inline" fill="#FFFFFF" stroke="#231F20" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="10.336" y1="3.836" x2="3.836" y2="10.336"/>
|
38
|
+
</g>
|
39
|
+
<g id="Layer_4" display="none">
|
40
|
+
|
41
|
+
<polyline display="inline" fill="none" stroke="#231F20" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" points="
|
42
|
+
10.958,4.801 6.388,9.372 3.215,6.094 "/>
|
43
|
+
</g>
|
44
|
+
</svg>
|
@@ -0,0 +1,38 @@
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
2
|
+
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
3
|
+
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
4
|
+
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
5
|
+
width="14.173px" height="14.173px" viewBox="0 0 14.173 14.173" enable-background="new 0 0 14.173 14.173" xml:space="preserve">
|
6
|
+
<g id="Layer_2" display="none">
|
7
|
+
<g display="inline">
|
8
|
+
<rect x="-5.132" y="-3.933" fill="#5CBEFF" width="67.306" height="25.396"/>
|
9
|
+
</g>
|
10
|
+
</g>
|
11
|
+
<g id="Layer_3" display="none">
|
12
|
+
</g>
|
13
|
+
<g id="Layer_1">
|
14
|
+
<g>
|
15
|
+
<g>
|
16
|
+
|
17
|
+
<path fill="#231F20" stroke="#231F20" stroke-width="0.9761" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
18
|
+
M7.091,3.701c-0.021,1.21,0.007,5.512,0,6.771l6.193-3.386L7.091,3.701z"/>
|
19
|
+
</g>
|
20
|
+
<g>
|
21
|
+
|
22
|
+
<path fill="none" stroke="#231F20" stroke-width="0.9761" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
23
|
+
M7.083,3.701c0.021,1.21-0.008,5.512,0,6.771L0.889,7.086L7.083,3.701z"/>
|
24
|
+
</g>
|
25
|
+
</g>
|
26
|
+
</g>
|
27
|
+
<g id="Layer_5" display="none">
|
28
|
+
|
29
|
+
<line display="inline" fill="#FFFFFF" stroke="#231F20" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="3.836" y1="3.836" x2="10.336" y2="10.336"/>
|
30
|
+
|
31
|
+
<line display="inline" fill="#FFFFFF" stroke="#231F20" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="10.336" y1="3.836" x2="3.836" y2="10.336"/>
|
32
|
+
</g>
|
33
|
+
<g id="Layer_4" display="none">
|
34
|
+
|
35
|
+
<polyline display="inline" fill="none" stroke="#231F20" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" points="
|
36
|
+
10.958,4.801 6.388,9.372 3.215,6.094 "/>
|
37
|
+
</g>
|
38
|
+
</svg>
|
@@ -0,0 +1,38 @@
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
2
|
+
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
3
|
+
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
4
|
+
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
5
|
+
width="14.173px" height="14.173px" viewBox="0 0 14.173 14.173" enable-background="new 0 0 14.173 14.173" xml:space="preserve">
|
6
|
+
<g id="Layer_2" display="none">
|
7
|
+
<g display="inline">
|
8
|
+
<rect x="-5.132" y="-3.933" fill="#5CBEFF" width="67.306" height="25.396"/>
|
9
|
+
</g>
|
10
|
+
</g>
|
11
|
+
<g id="Layer_3" display="none">
|
12
|
+
</g>
|
13
|
+
<g id="Layer_1">
|
14
|
+
<g>
|
15
|
+
<g>
|
16
|
+
|
17
|
+
<path fill="#231F20" stroke="#231F20" stroke-width="0.9761" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
18
|
+
M10.472,7.083c-1.21,0.021-5.512-0.007-6.771,0l3.386-6.193L10.472,7.083z"/>
|
19
|
+
</g>
|
20
|
+
<g>
|
21
|
+
|
22
|
+
<path fill="none" stroke="#231F20" stroke-width="0.9761" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
23
|
+
M10.472,7.09c-1.21-0.021-5.512,0.008-6.771,0l3.386,6.194L10.472,7.09z"/>
|
24
|
+
</g>
|
25
|
+
</g>
|
26
|
+
</g>
|
27
|
+
<g id="Layer_5" display="none">
|
28
|
+
|
29
|
+
<line display="inline" fill="#FFFFFF" stroke="#231F20" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="3.836" y1="3.836" x2="10.336" y2="10.336"/>
|
30
|
+
|
31
|
+
<line display="inline" fill="#FFFFFF" stroke="#231F20" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="10.336" y1="3.836" x2="3.836" y2="10.336"/>
|
32
|
+
</g>
|
33
|
+
<g id="Layer_4" display="none">
|
34
|
+
|
35
|
+
<polyline display="inline" fill="none" stroke="#231F20" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" points="
|
36
|
+
10.958,4.801 6.388,9.372 3.215,6.094 "/>
|
37
|
+
</g>
|
38
|
+
</svg>
|
@@ -0,0 +1,38 @@
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
2
|
+
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
3
|
+
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
4
|
+
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
5
|
+
width="14.173px" height="14.173px" viewBox="0 0 14.173 14.173" enable-background="new 0 0 14.173 14.173" xml:space="preserve">
|
6
|
+
<g id="Layer_2" display="none">
|
7
|
+
<g display="inline">
|
8
|
+
<rect x="-5.132" y="-3.933" fill="#5CBEFF" width="67.306" height="25.396"/>
|
9
|
+
</g>
|
10
|
+
</g>
|
11
|
+
<g id="Layer_3" display="none">
|
12
|
+
</g>
|
13
|
+
<g id="Layer_1">
|
14
|
+
<g>
|
15
|
+
<g>
|
16
|
+
|
17
|
+
<path fill="#231F20" stroke="#231F20" stroke-width="0.9761" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
18
|
+
M7.082,3.701c0.021,1.21-0.007,5.512,0,6.771L0.889,7.086L7.082,3.701z"/>
|
19
|
+
</g>
|
20
|
+
<g>
|
21
|
+
|
22
|
+
<path fill="none" stroke="#231F20" stroke-width="0.9761" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
23
|
+
M7.09,3.701c-0.021,1.21,0.008,5.512,0,6.771l6.194-3.386L7.09,3.701z"/>
|
24
|
+
</g>
|
25
|
+
</g>
|
26
|
+
</g>
|
27
|
+
<g id="Layer_5" display="none">
|
28
|
+
|
29
|
+
<line display="inline" fill="#FFFFFF" stroke="#231F20" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="3.836" y1="3.836" x2="10.336" y2="10.336"/>
|
30
|
+
|
31
|
+
<line display="inline" fill="#FFFFFF" stroke="#231F20" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="10.336" y1="3.836" x2="3.836" y2="10.336"/>
|
32
|
+
</g>
|
33
|
+
<g id="Layer_4" display="none">
|
34
|
+
|
35
|
+
<polyline display="inline" fill="none" stroke="#231F20" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" points="
|
36
|
+
10.958,4.801 6.388,9.372 3.215,6.094 "/>
|
37
|
+
</g>
|
38
|
+
</svg>
|
@@ -0,0 +1,38 @@
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
2
|
+
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
3
|
+
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
4
|
+
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
5
|
+
width="14.173px" height="14.173px" viewBox="0 0 14.173 14.173" enable-background="new 0 0 14.173 14.173" xml:space="preserve">
|
6
|
+
<g id="Layer_2" display="none">
|
7
|
+
<g display="inline">
|
8
|
+
<rect x="-5.132" y="-3.933" fill="#5CBEFF" width="67.306" height="25.396"/>
|
9
|
+
</g>
|
10
|
+
</g>
|
11
|
+
<g id="Layer_3" display="none">
|
12
|
+
</g>
|
13
|
+
<g id="Layer_1">
|
14
|
+
<g>
|
15
|
+
<g>
|
16
|
+
|
17
|
+
<path fill="#231F20" stroke="#231F20" stroke-width="0.9761" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
18
|
+
M10.472,7.091c-1.21-0.021-5.512,0.007-6.771,0l3.386,6.193L10.472,7.091z"/>
|
19
|
+
</g>
|
20
|
+
<g>
|
21
|
+
|
22
|
+
<path fill="none" stroke="#231F20" stroke-width="0.9761" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
23
|
+
M10.472,7.083c-1.21,0.021-5.512-0.008-6.771,0l3.386-6.194L10.472,7.083z"/>
|
24
|
+
</g>
|
25
|
+
</g>
|
26
|
+
</g>
|
27
|
+
<g id="Layer_5" display="none">
|
28
|
+
|
29
|
+
<line display="inline" fill="#FFFFFF" stroke="#231F20" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="3.836" y1="3.836" x2="10.336" y2="10.336"/>
|
30
|
+
|
31
|
+
<line display="inline" fill="#FFFFFF" stroke="#231F20" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="10.336" y1="3.836" x2="3.836" y2="10.336"/>
|
32
|
+
</g>
|
33
|
+
<g id="Layer_4" display="none">
|
34
|
+
|
35
|
+
<polyline display="inline" fill="none" stroke="#231F20" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" points="
|
36
|
+
10.958,4.801 6.388,9.372 3.215,6.094 "/>
|
37
|
+
</g>
|
38
|
+
</svg>
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -0,0 +1,74 @@
|
|
1
|
+
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
2
|
+
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="96px" height="124px">
|
3
|
+
<style type="text/css">
|
4
|
+
#background {
|
5
|
+
fill: none;
|
6
|
+
}
|
7
|
+
.arrows {
|
8
|
+
fill: #000;
|
9
|
+
stroke: none;
|
10
|
+
}
|
11
|
+
.selected>.arrows {
|
12
|
+
fill: #fff;
|
13
|
+
}
|
14
|
+
.checkmark {
|
15
|
+
fill: #000;
|
16
|
+
font-family: sans-serif;
|
17
|
+
font-size: 10pt;
|
18
|
+
text-anchor: middle;
|
19
|
+
}
|
20
|
+
.trash {
|
21
|
+
fill: #888;
|
22
|
+
}
|
23
|
+
.zoom {
|
24
|
+
fill: none;
|
25
|
+
stroke: #888;
|
26
|
+
stroke-width: 2;
|
27
|
+
stroke-linecap: round;
|
28
|
+
}
|
29
|
+
.zoom>.center {
|
30
|
+
fill: #888;
|
31
|
+
stroke-width: 0;
|
32
|
+
}
|
33
|
+
</style>
|
34
|
+
<rect id="background" width="96" height="124" x="0" y="0" />
|
35
|
+
|
36
|
+
<g>
|
37
|
+
<path class="arrows" d="M 13,1.5 13,14.5 1.74,8 z" />
|
38
|
+
<path class="arrows" d="M 17.5,3 30.5,3 24,14.26 z" />
|
39
|
+
<path class="arrows" d="M 35,1.5 35,14.5 46.26,8 z" />
|
40
|
+
</g>
|
41
|
+
<g class="selected" transform="translate(0, 16)">
|
42
|
+
<path class="arrows" d="M 13,1.5 13,14.5 1.74,8 z" />
|
43
|
+
<path class="arrows" d="M 17.5,3 30.5,3 24,14.26 z" />
|
44
|
+
<path class="arrows" d="M 35,1.5 35,14.5 46.26,8 z" />
|
45
|
+
</g>
|
46
|
+
|
47
|
+
<text class="checkmark" x="55.5" y="28">✓</text>
|
48
|
+
|
49
|
+
<g class="trash">
|
50
|
+
<path d="M 2,41 v 6 h 42 v -6 h -10.5 l -3,-3 h -15 l -3,3 z" />
|
51
|
+
<rect width="36" height="20" x="5" y="50" />
|
52
|
+
<rect width="36" height="42" x="5" y="50" rx="4" ry="4" />
|
53
|
+
</g>
|
54
|
+
|
55
|
+
<g class="zoom">
|
56
|
+
<circle r="11.5" cx="16" cy="108" />
|
57
|
+
<circle r="4.3" cx="16" cy="108" class="center" />
|
58
|
+
<path d="m 28,108 h3" />
|
59
|
+
<path d="m 1,108 h3" />
|
60
|
+
<path d="m 16,120 v3" />
|
61
|
+
<path d="m 16,93 v3" />
|
62
|
+
</g>
|
63
|
+
|
64
|
+
<g class="zoom">
|
65
|
+
<circle r="15" cx="48" cy="108" />
|
66
|
+
<path d="m 48,101.6 v12.8" />
|
67
|
+
<path d="m 41.6,108 h12.8" />
|
68
|
+
</g>
|
69
|
+
|
70
|
+
<g class="zoom">
|
71
|
+
<circle r="15" cx="80" cy="108" />
|
72
|
+
<path d="m 73.6,108 h12.8" />
|
73
|
+
</g>
|
74
|
+
</svg>
|
data/lib/render/boards.html.erb
CHANGED
@@ -4,6 +4,10 @@
|
|
4
4
|
display: inline-flex;
|
5
5
|
}
|
6
6
|
|
7
|
+
.results-list .boards-container {
|
8
|
+
margin: 20px 10px 30px;
|
9
|
+
}
|
10
|
+
|
7
11
|
.error-text {
|
8
12
|
color: #d9534f;
|
9
13
|
}
|
@@ -25,12 +29,6 @@
|
|
25
29
|
|
26
30
|
</style>
|
27
31
|
|
28
|
-
<% if @result[:error] %>
|
29
|
-
<p class="error-text">
|
30
|
-
<%=I18n.t @result[:error], @result %>
|
31
|
-
</p>
|
32
|
-
<% end %>
|
33
|
-
|
34
32
|
<div class="boards-container">
|
35
33
|
|
36
34
|
<% @result[:boards].each do |it| %>
|
@@ -29,16 +29,49 @@
|
|
29
29
|
board.updateStyles();
|
30
30
|
}
|
31
31
|
|
32
|
+
const compilationModes = {
|
33
|
+
gameFramework: {
|
34
|
+
compile: ({ main, teacher, ...args }) => {
|
35
|
+
const extra = `<%= @game_framework_extra %>`;
|
36
|
+
const program = `<%= @game_framework_program %>`;
|
37
|
+
|
38
|
+
const append = (code, anotherCode) => `${code}\n\n${anotherCode}`
|
39
|
+
|
40
|
+
return {
|
41
|
+
main: append(main, program),
|
42
|
+
teacher: append(teacher, extra),
|
43
|
+
...args
|
44
|
+
};
|
45
|
+
},
|
46
|
+
|
47
|
+
scrollToMainBlock: (blockly) => {
|
48
|
+
const mainBlock = blockly.getBlocksOfType('procedures_defnoreturnnoparams')[0];
|
49
|
+
blockly.scrollToBlock(mainBlock.id);
|
50
|
+
},
|
51
|
+
|
52
|
+
defaultCode: `<%= @game_framework_default %>`
|
53
|
+
},
|
54
|
+
classic: {
|
55
|
+
compile: (code) => code,
|
56
|
+
|
57
|
+
scrollToMainBlock: (blockly) => {
|
58
|
+
blockly.scrollToBlock();
|
59
|
+
},
|
60
|
+
|
61
|
+
defaultCode: ''
|
62
|
+
}
|
63
|
+
};
|
64
|
+
|
32
65
|
Polymer({
|
33
66
|
is: 'mu-gobstones-custom-editor',
|
34
67
|
properties: {
|
35
68
|
mediaUrl: {
|
36
69
|
type: String,
|
37
|
-
value: "
|
70
|
+
value: "<%= @assets_url %>/media/"
|
38
71
|
},
|
39
72
|
localMediaUrl: {
|
40
73
|
type: String,
|
41
|
-
value: "
|
74
|
+
value: "<%= @assets_url %>/local-media/"
|
42
75
|
},
|
43
76
|
readOnly: {
|
44
77
|
type: Boolean,
|
@@ -47,6 +80,13 @@
|
|
47
80
|
teacherMode: {
|
48
81
|
type: Boolean,
|
49
82
|
default: false
|
83
|
+
},
|
84
|
+
defaultIcons: {
|
85
|
+
type: Object,
|
86
|
+
value: {
|
87
|
+
procedureDeclarations: { /** for future use */ },
|
88
|
+
functionDeclarations: { /** for future use */ }
|
89
|
+
}
|
50
90
|
}
|
51
91
|
},
|
52
92
|
|
@@ -70,7 +110,8 @@
|
|
70
110
|
Blockly.MUMUKI_COLORS = {
|
71
111
|
pink: "#FF5C82",
|
72
112
|
blue: "#5CBEFF",
|
73
|
-
yellow: "#FFC95C"
|
113
|
+
yellow: "#FFC95C",
|
114
|
+
green: "#5CED71"
|
74
115
|
};
|
75
116
|
|
76
117
|
// reserved
|
@@ -81,8 +122,10 @@
|
|
81
122
|
Blockly.CUSTOM_COLORS.function = Blockly.MUMUKI_COLORS.pink;
|
82
123
|
Blockly.CUSTOM_COLORS.complete = Blockly.MUMUKI_COLORS.pink;
|
83
124
|
|
125
|
+
// control structures
|
126
|
+
Blockly.CUSTOM_COLORS.controlStructure = this._isKindergarten() ? Blockly.MUMUKI_COLORS.green : Blockly.MUMUKI_COLORS.yellow;
|
127
|
+
|
84
128
|
// commands
|
85
|
-
Blockly.CUSTOM_COLORS.controlStructure = Blockly.MUMUKI_COLORS.yellow;
|
86
129
|
Blockly.CUSTOM_COLORS.primitiveCommand = Blockly.MUMUKI_COLORS.yellow;
|
87
130
|
Blockly.CUSTOM_COLORS.primitiveProcedure = Blockly.MUMUKI_COLORS.yellow;
|
88
131
|
Blockly.CUSTOM_COLORS.procedure_call = Blockly.MUMUKI_COLORS.yellow;
|
@@ -105,6 +148,12 @@
|
|
105
148
|
|
106
149
|
const setBlocklyCustomSettings = () => {
|
107
150
|
if (typeof Blockly === 'undefined' || !Blockly.CUSTOM_COLORS) return postpone(setBlocklyCustomSettings);
|
151
|
+
|
152
|
+
// The display mode configuration could be monkey-patched here, like this:
|
153
|
+
Blockly.displayModes.iconic.iconSize = 64;
|
154
|
+
Blockly.displayModes.iconic.procedureDefIcon = `${this.localMediaUrl}main-procedure.png`;
|
155
|
+
|
156
|
+
Blockly.displayMode = this._isKindergarten() ? 'iconic' : 'text';
|
108
157
|
setBlocklySounds();
|
109
158
|
setBlocklyColors();
|
110
159
|
|
@@ -173,6 +222,8 @@
|
|
173
222
|
|
174
223
|
if (!blockly || !blockly.workspace) return initialize();
|
175
224
|
|
225
|
+
blockly.showCategories = !this._isKindergarten();
|
226
|
+
|
176
227
|
if (!this.readOnly) {
|
177
228
|
relocateTrash(blockly);
|
178
229
|
}
|
@@ -190,6 +241,8 @@
|
|
190
241
|
|
191
242
|
const hasCustomToolbox = $('gs-toolbox').length;
|
192
243
|
if(!hasCustomToolbox) this.enableContextButton();
|
244
|
+
|
245
|
+
this._registerLayoutChangedEvent();
|
193
246
|
});
|
194
247
|
};
|
195
248
|
|
@@ -208,6 +261,12 @@
|
|
208
261
|
document.dispatchEvent(event);
|
209
262
|
},
|
210
263
|
|
264
|
+
reset(code) {
|
265
|
+
const blockly = this.getBlockly();
|
266
|
+
blockly.workspaceXml = code || blockly.initialXml;
|
267
|
+
this._scrollToMainBlock();
|
268
|
+
},
|
269
|
+
|
211
270
|
setInteractiveLayout() {
|
212
271
|
this.$exerciseContainer.addClass('mu-kids-interactive');
|
213
272
|
$('.mu-final-state').html('<gs-keyboard/>');
|
@@ -223,14 +282,31 @@
|
|
223
282
|
if (teacherCode) {
|
224
283
|
setTimeout(() => {
|
225
284
|
const actions = new Parser().getActionsFromSource(teacherCode);
|
226
|
-
|
227
|
-
blockly.
|
285
|
+
|
286
|
+
blockly.primitiveProcedures = this._withDefaultIcons(actions, 'procedureDeclarations');
|
287
|
+
blockly.primitiveFunctions = this._withDefaultIcons(actions, 'functionDeclarations');
|
228
288
|
});
|
229
289
|
}
|
230
290
|
},
|
231
291
|
|
292
|
+
setGameActions(blockly) {
|
293
|
+
if (this._isGame()) {
|
294
|
+
blockly.primitiveProcedures = blockly.primitiveProcedures || [];
|
295
|
+
blockly.primitiveProcedures = blockly.primitiveProcedures.concat([
|
296
|
+
this.gamePrimitive('ShiftUp'),
|
297
|
+
this.gamePrimitive('ShiftDown'),
|
298
|
+
this.gamePrimitive('ShiftLeft'),
|
299
|
+
this.gamePrimitive('ShiftRight')
|
300
|
+
]);
|
301
|
+
}
|
302
|
+
},
|
303
|
+
|
304
|
+
gamePrimitive(name) {
|
305
|
+
return { alias: 'procedureDeclaration', name: name, attributes: {block_icon: `<%= @assets_url %>/media/${name}.png`} };
|
306
|
+
},
|
307
|
+
|
232
308
|
enableContextButton() {
|
233
|
-
if(
|
309
|
+
if(mumuki.kids && mumuki.assetsLoadedFor) {
|
234
310
|
return mumuki.assetsLoadedFor('editor');
|
235
311
|
} else {
|
236
312
|
return postpone(this.enableContextButton.bind(this));
|
@@ -275,6 +351,55 @@
|
|
275
351
|
return $("#mu-custom-editor-test")[0];
|
276
352
|
},
|
277
353
|
|
354
|
+
compile(code) {
|
355
|
+
return this._compilationMode().compile(code);
|
356
|
+
},
|
357
|
+
|
358
|
+
_registerLayoutChangedEvent() {
|
359
|
+
if (!this.teacherMode) {
|
360
|
+
return;
|
361
|
+
}
|
362
|
+
|
363
|
+
mumuki.events.on('layoutChanged', () => {
|
364
|
+
this.getEditorDefaultValue().value = this._compilationMode().defaultCode;
|
365
|
+
});
|
366
|
+
},
|
367
|
+
|
368
|
+
_scrollToMainBlock() {
|
369
|
+
this._compilationMode().scrollToMainBlock(this.getBlockly());
|
370
|
+
},
|
371
|
+
|
372
|
+
_withDefaultIcons(actions, type) {
|
373
|
+
const addIcon = (declaration, block_icon) =>
|
374
|
+
({ ...declaration, attributes: { ...declaration.attributes, block_icon } });
|
375
|
+
|
376
|
+
return actions[type].map((declaration) => {
|
377
|
+
const defaultIcon = this.defaultIcons[type][declaration.name];
|
378
|
+
if (defaultIcon) {
|
379
|
+
return addIcon(declaration, defaultIcon);
|
380
|
+
} else {
|
381
|
+
return declaration;
|
382
|
+
}
|
383
|
+
});
|
384
|
+
},
|
385
|
+
|
386
|
+
_isKindergarten() {
|
387
|
+
return mumuki.exercise.layout === 'input_kindergarten';
|
388
|
+
},
|
389
|
+
|
390
|
+
_isGame() {
|
391
|
+
if (mumuki.exercise.settings) {
|
392
|
+
return mumuki.exercise.settings.game_framework;
|
393
|
+
} else {
|
394
|
+
// for backwards compatibility
|
395
|
+
return this._isKindergarten();
|
396
|
+
}
|
397
|
+
},
|
398
|
+
|
399
|
+
_compilationMode() {
|
400
|
+
return this._isGame() ? compilationModes.gameFramework : compilationModes.classic;
|
401
|
+
},
|
402
|
+
|
278
403
|
_setInitialXml: function (blockly) {
|
279
404
|
const editorDefaultContent = this.getEditorDefaultValue();
|
280
405
|
if (editorDefaultContent && editorDefaultContent.value) {
|
@@ -293,7 +418,7 @@
|
|
293
418
|
? "<xml></xml>"
|
294
419
|
: blockly.initialXml
|
295
420
|
);
|
296
|
-
|
421
|
+
this._scrollToMainBlock();
|
297
422
|
|
298
423
|
callback();
|
299
424
|
});
|
@@ -433,13 +558,7 @@
|
|
433
558
|
is: 'kids-reset-button',
|
434
559
|
|
435
560
|
_onButtonClick: function () {
|
436
|
-
|
437
|
-
blockly.workspaceXml = blockly.initialXml;
|
438
|
-
blockly.scrollToBlock();
|
439
|
-
},
|
440
|
-
|
441
|
-
_getBlockly: function () {
|
442
|
-
return this._getEditor().getBlockly();
|
561
|
+
this._getEditor().reset();
|
443
562
|
},
|
444
563
|
|
445
564
|
_getEditor: function () {
|
@@ -559,11 +678,11 @@
|
|
559
678
|
|
560
679
|
controller.start({
|
561
680
|
initialState: this.targetState,
|
562
|
-
code: {
|
681
|
+
code: editor.compile({
|
563
682
|
main: code,
|
564
683
|
library: "",
|
565
684
|
teacher: teacherCode
|
566
|
-
}
|
685
|
+
})
|
567
686
|
}, {
|
568
687
|
onResult: (state, fullState) => {
|
569
688
|
const region = this._getLastRegion(fullState);
|
@@ -785,9 +904,16 @@
|
|
785
904
|
const editor = $("mu-gobstones-custom-editor")[0];
|
786
905
|
const blockly = editor.getBlockly();
|
787
906
|
if(blockly.readOnly) return;
|
907
|
+
const previousCode = editor.getEditorValue().value;
|
788
908
|
$.get(this.toolboxUrl, function (toolboxXml) {
|
789
909
|
blockly.toolbox = { defaultToolbox: toolboxXml };
|
790
910
|
editor.setTeacherActions(blockly);
|
911
|
+
editor.setGameActions(blockly);
|
912
|
+
// @faloi - I couldn't figure out why the workspace gets replaced with a generic code,
|
913
|
+
// so here I force a reset with the code previously saved. Sorry not sorry.
|
914
|
+
postpone(() => {
|
915
|
+
editor.reset(previousCode);
|
916
|
+
});
|
791
917
|
}).always(function () {
|
792
918
|
editor.enableContextButton();
|
793
919
|
});
|
@@ -1065,4 +1191,3 @@
|
|
1065
1191
|
});
|
1066
1192
|
</script>
|
1067
1193
|
</dom-module>
|
1068
|
-
|