mumuki-gobstones-runner 2.7.1 → 2.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/assets_server.rb +20 -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
|
-
|