diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e69de29 diff --git a/README.md b/README.md index 26bce4a..2203552 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,13 @@ + # Machine translation for everyone +[Direct link to the [activity explorer](https://github.io/jaspock/mt4everyone)] + “Machine translation for everyone” is a course developed by the [MultitraiNMT](https://multitrainmt.eu/) Erasmus+ project. It consists of an open innovative syllabus in machine translation, focusing on neural machine translation (NMT) and targeting both language learners and translators. The training materials include an open access coursebook ("Machine translation for everyone: empowering users in the age of artificial intelligence", to be published in 2022) together with more than 220 activities and a pedagogical NMT interface called [MutNMT](https://github.com/Prompsit/mutnmt) that allows users to learn how neural machine translation works. -This repository contains the learning activities and supplementary teaching materials. Activities are implemented with the [H5P web tool](https://h5p.org/) that allows you to download them and embed them into your own teaching materials on Moodle or Wordpress. You can get all the activities by cloning this repository and copying all the files with extension `h5p` in the `activities` folder. You can also browse each chapter's activities and click on the embed button to download specific ones via the [explorer](http://github.io/jaspock/mt4everyone) developed with the [H5P Standalone Player](https://github.com/tunapanda/h5p-standalone). +This repository contains the learning activities and supplementary teaching materials. Activities are implemented with the [H5P web tool](https://h5p.org/) that allows you to download them and embed them into your own teaching materials on Moodle or Wordpress. You can easily get all the activities by cloning this repository (or downloading a [zipped version](https://github.com/jaspock/mt4everyone/archive/refs/heads/main.zip)) and copying all the files with extension `h5p` in the different subdirectories in the `activities` folder. + +You can also browse each chapter's activities and click on the `Reuse` option at the bottom to download specific ones via the [explorer](https://github.io/jaspock/mt4everyone) developed with the [H5P Standalone Player](https://github.com/tunapanda/h5p-standalone). Each activity has additional comments for instructors in the H5P metadata that they can read after embedding it into their Moodle or Wordpress sites. The course is organized in 9 units: @@ -16,4 +21,4 @@ The course is organized in 9 units: 8. Custom neural machine translation. 9. Machine translation for language learners. -All these materials are outcomes of the EU Erasmus+ project "[MultiTraiNMT](https://multitrainmt.eu/): machine translation training for multilingual citizens" that took place between 2019 and 2022. +All these materials are outcomes of the EU Erasmus+ project "[MultiTraiNMT](https://multitrainmt.eu/): machine translation training for multilingual citizens" (2019–2022). diff --git a/activities/config.json b/activities/config.json new file mode 100644 index 0000000..c521e6e --- /dev/null +++ b/activities/config.json @@ -0,0 +1 @@ +{"modules": ["module01","module07"], "module01":{"title":"Chapter 1: Multilingualism", "activities":["essay-395","single-choice-set-61"]}, "module07":{"title":"Chapter 7: How neural machine translation works", "activities":["column-136","drag-text-21"]}} \ No newline at end of file diff --git a/activities/module01/essay-395.h5p b/activities/module01/essay-395.h5p new file mode 100644 index 0000000..24cae16 Binary files /dev/null and b/activities/module01/essay-395.h5p differ diff --git a/activities/module01/essay-395/Drop-1.0/css/drop-theme-arrows-bounce.min.css b/activities/module01/essay-395/Drop-1.0/css/drop-theme-arrows-bounce.min.css new file mode 100644 index 0000000..c5c8030 --- /dev/null +++ b/activities/module01/essay-395/Drop-1.0/css/drop-theme-arrows-bounce.min.css @@ -0,0 +1 @@ +.drop-element,.drop-element *,.drop-element :after,.drop-element :before,.drop-element:after,.drop-element:before{box-sizing:border-box}.drop-element{position:absolute;display:none}.drop-element.drop-open{display:block}.drop-element.drop-theme-arrows-bounce .drop-content{border-radius:5px;position:relative;font-family:inherit;background:#fff;color:#444;padding:1em;font-size:1.1em;line-height:1.5em;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-filter:drop-shadow(0 1px 4px rgba(0, 0, 0, .2));filter:drop-shadow(0 1px 4px rgba(0, 0, 0, .2))}.drop-element.drop-theme-arrows-bounce .drop-content:before{content:"";display:block;position:absolute;width:0;height:0;border-color:transparent;border-width:12px;border-style:solid}.drop-element.drop-theme-arrows-bounce.drop-element-attached-bottom.drop-element-attached-center .drop-content:before{top:100%;left:50%;margin-left:-12px;border-top-color:#fff}.drop-element.drop-theme-arrows-bounce.drop-element-attached-top.drop-element-attached-center .drop-content{margin-top:12px}.drop-element.drop-theme-arrows-bounce.drop-element-attached-top.drop-element-attached-center .drop-content:before{bottom:100%;left:50%;margin-left:-12px;border-bottom-color:#fff}.drop-element.drop-theme-arrows-bounce.drop-element-attached-right.drop-element-attached-middle .drop-content:before{left:100%;top:50%;margin-top:-12px;border-left-color:#fff}.drop-element.drop-theme-arrows-bounce.drop-element-attached-left.drop-element-attached-middle .drop-content:before{right:100%;top:50%;margin-top:-12px;border-right-color:#fff}.drop-element.drop-theme-arrows-bounce.drop-element-attached-top.drop-element-attached-left.drop-target-attached-bottom .drop-content:before{bottom:100%;left:12px;border-bottom-color:#fff}.drop-element.drop-theme-arrows-bounce.drop-element-attached-top.drop-element-attached-right.drop-target-attached-bottom .drop-content:before{bottom:100%;right:12px;border-bottom-color:#fff}.drop-element.drop-theme-arrows-bounce.drop-element-attached-bottom.drop-element-attached-left.drop-target-attached-top .drop-content:before{top:100%;left:12px;border-top-color:#fff}.drop-element.drop-theme-arrows-bounce.drop-element-attached-bottom.drop-element-attached-right.drop-target-attached-top .drop-content:before{top:100%;right:12px;border-top-color:#fff}.drop-element.drop-theme-arrows-bounce.drop-element-attached-top.drop-element-attached-right.drop-target-attached-left .drop-content:before{top:12px;left:100%;border-left-color:#fff}.drop-element.drop-theme-arrows-bounce.drop-element-attached-top.drop-element-attached-left.drop-target-attached-right .drop-content:before{top:12px;right:100%;border-right-color:#fff}.drop-element.drop-theme-arrows-bounce.drop-element-attached-bottom.drop-element-attached-right.drop-target-attached-left .drop-content:before{bottom:12px;left:100%;border-left-color:#fff}.drop-element.drop-theme-arrows-bounce.drop-element-attached-bottom.drop-element-attached-left.drop-target-attached-right .drop-content:before{bottom:12px;right:100%;border-right-color:#fff}.drop-element.drop-theme-arrows-bounce{max-width:100%;max-height:100%;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-transition:opacity .1s;transition:opacity .1s;opacity:0}.drop-element.drop-theme-arrows-bounce .drop-content{-webkit-transition:-webkit-transform .3s cubic-bezier(0,0,.265,1.55);transition:transform .3s cubic-bezier(0,0,.265,1.55);-webkit-transform:scale(0) translateZ(0);transform:scale(0) translateZ(0)}.drop-element.drop-theme-arrows-bounce.drop-open{display:none}.drop-element.drop-theme-arrows-bounce.drop-open-transitionend{display:block}.drop-element.drop-theme-arrows-bounce.drop-after-open{-webkit-transition:none;transition:none;opacity:1}.drop-element.drop-theme-arrows-bounce.drop-after-open .drop-content{-webkit-transform:scale(1) translateZ(0);transform:scale(1) translateZ(0)}.drop-element.drop-theme-arrows-bounce.drop-element-attached-bottom.drop-element-attached-center .drop-content{margin-bottom:12px;-webkit-transform-origin:50%,calc(100% + 12px);-ms-transform-origin:50%,calc(100% + 12px);transform-origin:50%,calc(100% + 12px)}.drop-element.drop-theme-arrows-bounce.drop-element-attached-top.drop-element-attached-center .drop-content{-webkit-transform-origin:50%,-12px;-ms-transform-origin:50%,-12px;transform-origin:50%,-12px}.drop-element.drop-theme-arrows-bounce.drop-element-attached-right.drop-element-attached-middle .drop-content{margin-right:12px;-webkit-transform-origin:calc(100% + 12px),50%;-ms-transform-origin:calc(100% + 12px),50%;transform-origin:calc(100% + 12px),50%}.drop-element.drop-theme-arrows-bounce.drop-element-attached-left.drop-element-attached-middle .drop-content{margin-left:12px;-webkit-transform-origin:-12px,50%;-ms-transform-origin:-12px,50%;transform-origin:-12px,50%}.drop-element.drop-theme-arrows-bounce.drop-element-attached-top.drop-element-attached-left.drop-target-attached-bottom .drop-content{margin-top:12px;-webkit-transform-origin:0,-12px;-ms-transform-origin:0,-12px;transform-origin:0,-12px}.drop-element.drop-theme-arrows-bounce.drop-element-attached-top.drop-element-attached-right.drop-target-attached-bottom .drop-content{margin-top:12px;-webkit-transform-origin:100%,-12px;-ms-transform-origin:100%,-12px;transform-origin:100%,-12px}.drop-element.drop-theme-arrows-bounce.drop-element-attached-bottom.drop-element-attached-left.drop-target-attached-top .drop-content{margin-bottom:12px;-webkit-transform-origin:0,calc(100% + 12px);-ms-transform-origin:0,calc(100% + 12px);transform-origin:0,calc(100% + 12px)}.drop-element.drop-theme-arrows-bounce.drop-element-attached-bottom.drop-element-attached-right.drop-target-attached-top .drop-content{margin-bottom:12px;-webkit-transform-origin:100%,calc(100% + 12px);-ms-transform-origin:100%,calc(100% + 12px);transform-origin:100%,calc(100% + 12px)}.drop-element.drop-theme-arrows-bounce.drop-element-attached-top.drop-element-attached-right.drop-target-attached-left .drop-content{margin-right:12px;-webkit-transform-origin:calc(100% + 12px),0;-ms-transform-origin:calc(100% + 12px),0;transform-origin:calc(100% + 12px),0}.drop-element.drop-theme-arrows-bounce.drop-element-attached-top.drop-element-attached-left.drop-target-attached-right .drop-content{margin-left:12px;-webkit-transform-origin:-12px,0;-ms-transform-origin:-12px,0;transform-origin:-12px,0}.drop-element.drop-theme-arrows-bounce.drop-element-attached-bottom.drop-element-attached-right.drop-target-attached-left .drop-content{margin-right:12px;-webkit-transform-origin:calc(100% + 12px),100%;-ms-transform-origin:calc(100% + 12px),100%;transform-origin:calc(100% + 12px),100%}.drop-element.drop-theme-arrows-bounce.drop-element-attached-bottom.drop-element-attached-left.drop-target-attached-right .drop-content{margin-left:12px;-webkit-transform-origin:-12px,100%;-ms-transform-origin:-12px,100%;transform-origin:-12px,100%} \ No newline at end of file diff --git a/activities/module01/essay-395/Drop-1.0/js/drop.min.js b/activities/module01/essay-395/Drop-1.0/js/drop.min.js new file mode 100644 index 0000000..262412d --- /dev/null +++ b/activities/module01/essay-395/Drop-1.0/js/drop.min.js @@ -0,0 +1,7 @@ +var oldDrop = window.Drop; +var oldTether = window.Tether; +Tether = H5P.Tether; +!function(t,e){"function"==typeof define&&define.amd?define(["tether"],e):"object"==typeof exports?module.exports=e(require("tether")):t.Drop=e(t.Tether)}(this,function(t){"use strict";function e(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function n(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function o(t){var e=t.split(" "),n=a(e,2),o=n[0],i=n[1];if(["left","right"].indexOf(o)>=0){var s=[i,o];o=s[0],i=s[1]}return[o,i].join(" ")}function i(t,e){for(var n=void 0,o=[];-1!==(n=t.indexOf(e));)o.push(t.splice(n,1));return o}function s(){var a=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],u=function(){for(var t=arguments.length,e=Array(t),n=0;t>n;n++)e[n]=arguments[n];return new(r.apply(b,[null].concat(e)))};p(u,{createContext:s,drops:[],defaults:{}});var g={classPrefix:"drop",defaults:{position:"bottom left",openOn:"click",beforeClose:null,constrainToScrollParent:!0,constrainToWindow:!0,classes:"",remove:!1,tetherOptions:{}}};p(u,g,a),p(u.defaults,g.defaults,a.defaults),"undefined"==typeof x[u.classPrefix]&&(x[u.classPrefix]=[]),u.updateBodyClasses=function(){for(var t=!1,e=x[u.classPrefix],n=e.length,o=0;n>o;++o)if(e[o].isOpened()){t=!0;break}t?d(document.body,u.classPrefix+"-open"):c(document.body,u.classPrefix+"-open")};var b=function(s){function r(t){if(e(this,r),l(Object.getPrototypeOf(r.prototype),"constructor",this).call(this),this.options=p({},u.defaults,t),this.target=this.options.target,"undefined"==typeof this.target)throw new Error("Drop Error: You must provide a target.");var n="data-"+u.classPrefix,o=this.target.getAttribute(n);o&&(this.options.content=o);for(var i=["position","openOn"],s=0;s=0)for(var n=function(e){t.toggle(e),e.preventDefault()},o=function(e){t.isOpened()&&(e.target===t.drop||t.drop.contains(e.target)||e.target===t.target||t.target.contains(e.target)||t.close(e))},i=0;i=0&&(this._on(this.target,"mouseover",h),this._on(this.drop,"mouseover",h),this._on(this.target,"mouseout",l),this._on(this.drop,"mouseout",l)),e.indexOf("focus")>=0&&(this._on(this.target,"focus",h),this._on(this.drop,"focus",h),this._on(this.target,"blur",l),this._on(this.drop,"blur",l))}}},{key:"isOpened",value:function(){return this.drop?f(this.drop,u.classPrefix+"-open"):void 0}},{key:"toggle",value:function(t){this.isOpened()?this.close(t):this.open(t)}},{key:"open",value:function(t){var e=this;this.isOpened()||(this.drop.parentNode||document.body.appendChild(this.drop),"undefined"!=typeof this.tether&&this.tether.enable(),d(this.drop,u.classPrefix+"-open"),d(this.drop,u.classPrefix+"-open-transitionend"),setTimeout(function(){e.drop&&d(e.drop,u.classPrefix+"-after-open")}),"undefined"!=typeof this.tether&&this.tether.position(),this.trigger("open"),u.updateBodyClasses())}},{key:"_transitionEndHandler",value:function(t){t.target===t.currentTarget&&(f(this.drop,u.classPrefix+"-open")||c(this.drop,u.classPrefix+"-open-transitionend"),this.drop.removeEventListener(m,this.transitionEndHandler))}},{key:"beforeCloseHandler",value:function(t){var e=!0;return this.isClosing||"function"!=typeof this.options.beforeClose||(this.isClosing=!0,e=this.options.beforeClose(t,this)!==!1),this.isClosing=!1,e}},{key:"close",value:function(t){this.isOpened()&&this.beforeCloseHandler(t)&&(c(this.drop,u.classPrefix+"-open"),c(this.drop,u.classPrefix+"-after-open"),this.drop.addEventListener(m,this.transitionEndHandler),this.trigger("close"),"undefined"!=typeof this.tether&&this.tether.disable(),u.updateBodyClasses(),this.options.remove&&this.remove(t))}},{key:"remove",value:function(t){this.close(t),this.drop.parentNode&&this.drop.parentNode.removeChild(this.drop)}},{key:"position",value:function(){this.isOpened()&&"undefined"!=typeof this.tether&&this.tether.position()}},{key:"destroy",value:function(){this.remove(),"undefined"!=typeof this.tether&&this.tether.destroy();for(var t=0;t + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/activities/module01/essay-395/FontAwesome-4.5/fontawesome-webfont.ttf b/activities/module01/essay-395/FontAwesome-4.5/fontawesome-webfont.ttf new file mode 100644 index 0000000..26dea79 Binary files /dev/null and b/activities/module01/essay-395/FontAwesome-4.5/fontawesome-webfont.ttf differ diff --git a/activities/module01/essay-395/FontAwesome-4.5/fontawesome-webfont.woff b/activities/module01/essay-395/FontAwesome-4.5/fontawesome-webfont.woff new file mode 100644 index 0000000..dc35ce3 Binary files /dev/null and b/activities/module01/essay-395/FontAwesome-4.5/fontawesome-webfont.woff differ diff --git a/activities/module01/essay-395/FontAwesome-4.5/fontawesome-webfont.woff2 b/activities/module01/essay-395/FontAwesome-4.5/fontawesome-webfont.woff2 new file mode 100644 index 0000000..500e517 Binary files /dev/null and b/activities/module01/essay-395/FontAwesome-4.5/fontawesome-webfont.woff2 differ diff --git a/activities/module01/essay-395/FontAwesome-4.5/h5p-font-awesome.min.css b/activities/module01/essay-395/FontAwesome-4.5/h5p-font-awesome.min.css new file mode 100644 index 0000000..e7df424 --- /dev/null +++ b/activities/module01/essay-395/FontAwesome-4.5/h5p-font-awesome.min.css @@ -0,0 +1,4 @@ +/*! + * Font Awesome 4.5.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:'H5PFontAwesome4';src:url('fontawesome-webfont.eot?v=4.5.0');src:url('fontawesome-webfont.eot?#iefix&v=4.5.0') format('embedded-opentype'),url('fontawesome-webfont.woff2?v=4.5.0') format('woff2'),url('fontawesome-webfont.woff?v=4.5.0') format('woff'),url('fontawesome-webfont.ttf?v=4.5.0') format('truetype'),url('fontawesome-webfont.svg?v=4.5.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 H5PFontAwesome4;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"} diff --git a/activities/module01/essay-395/FontAwesome-4.5/library.json b/activities/module01/essay-395/FontAwesome-4.5/library.json new file mode 100644 index 0000000..f6943f4 --- /dev/null +++ b/activities/module01/essay-395/FontAwesome-4.5/library.json @@ -0,0 +1,16 @@ +{ + "title": "Font Awesome", + "contentType": "Font", + "majorVersion": 4, + "minorVersion": 5, + "patchVersion": 4, + "runnable": 0, + "machineName": "FontAwesome", + "license": "MIT", + "author": "Dave Gandy", + "preloadedCss": [ + { + "path": "h5p-font-awesome.min.css" + } + ] +} \ No newline at end of file diff --git a/activities/module01/essay-395/H5P.Essay-1.4/icon.svg b/activities/module01/essay-395/H5P.Essay-1.4/icon.svg new file mode 100644 index 0000000..601bf79 --- /dev/null +++ b/activities/module01/essay-395/H5P.Essay-1.4/icon.svg @@ -0,0 +1,70 @@ + + + + +fill in the blanks + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/activities/module01/essay-395/H5P.Essay-1.4/language/af.json b/activities/module01/essay-395/H5P.Essay-1.4/language/af.json new file mode 100644 index 0000000..db5e87a --- /dev/null +++ b/activities/module01/essay-395/H5P.Essay-1.4/language/af.json @@ -0,0 +1,287 @@ +{ + "semantics": [ + { + "label": "Media", + "fields": [ + { + "label": "Tipe", + "description": "Opsionele media wat bo die vraag vertoon word." + }, + { + "label": "Deaktiveer zoomfunksie by prente" + } + ] + }, + { + "label": "Taak beskrywing", + "description": "Beskryf jou taak hier. Die taakbeskrywing sal verskyn bo die teksinvoerarea.", + "placeholder": "Som die boek in 500 karakters op ..." + }, + { + "label": "Hulpteks", + "description": "Hierdie teks moet die gebruiker help om te begin.", + "placeholder": "Hierdie boek handel oor ..." + }, + { + "label": "Voorbeeld antwoord", + "description": "Jy kan ook 'n voorbeeld antwoord byvoeg wat vertoon word nadat die student 'n teks geskep het. Dit word 'n voorbeeld antwoord genoem, omdat daar waarskynlik meer as een regte antwoord is.", + "fields": [ + { + "label": "Inleiding", + "description": "Jy kan ook 'n paar verduidelikings oor jou voorbeeld aan die studente gee. Die verduidelikings sal slegs verskyn as jy ook 'n voorbeeld byvoeg.", + "placeholder": "Onthou asb. dat daar nie verwag word dat jy met presies dieselfde oplossing vorendag kom nie. Dit is net 'n goeie voorbeeld." + }, + { + "label": "Voorbeeld antwoord teks", + "description": "Die student sal 'n \"Wys antwoord\" -knoppie sien nadat hy dit ingedien het as jy hier teks verskaf." + } + ] + }, + { + "label": "Sleutelwoorde", + "widgets": [ + { + "label": "Verstek" + } + ], + "entity": "Sleutelwoord", + "field": { + "label": "Sleutelwoord", + "fields": [ + { + "label": "Sleutelwoord", + "description": "Sleutelwoord of frase om voor uit te kyk. Gebruik 'n sterretjie '*' as 'n wisselkarakter vir een of meer karakters. Gebruik 'n flap '/' by die begin en einde om 'n gewone uitdrukking te gebruik." + }, + { + "label": "Variasies", + "description": "Voeg 'n opsionele variasie vir hierdie sleutelwoord by. Byvoorbeeld: Vir 'n 'stad' voeg alternatiewe 'dorp', 'munisipaliteit' ens. by. Punte sal toegeken word indien die gebruiker enige van die gespesifiseerde alternatiewe bygevoeg het.", + "entity": "variasie", + "field": { + "label": "Sleutelwoord variasie" + } + }, + { + "label": "Punte, opsies en terugvoer", + "fields": [ + { + "label": "Punte", + "description": "Punte wat die gebruiker sal kry indien hy/sy hierdie sleutelwoord of sy alternatiewe in die antwoord insluit." + }, + { + "label": "Voorvalle", + "description": "Definieer hoeveel voorkomste van die trefwoord of die variasies daarvan met punte toegeken kan word." + }, + { + "label": "Hooflettergevoelig", + "description": "Maak seker dat die gebruiker se antwoord presies dieselfde as die vereisde antwoord is." + }, + { + "label": "Vergewe geringe foute", + "description": "Dit sal geringe spelfoute (3-9 karakters: 1 fout, meer as 9 karakters: 2 foute) aanvaar." + }, + { + "label": "Terugvoer indien sleutelwoord ingesluit word", + "description": "Hierdie terugvoer sal vertoon word indien die gebruiker hierdie sleutelwoord of alternatiewe in die antwoord insluit." + }, + { + "label": "Terugvoer indien sleutelwoord ontbreek", + "description": "Hierdie terugvoer sal vertoon word as die gebruiker nie hierdie sleutelwoord of die alternatiewe daarvan in die antwoord insluit nie." + }, + { + "label": "Terugvoerwoord wat gewys word indien sleutelwoord ingesluit is", + "description": "Met hierdie opsie kan jy spesifiseer watter woord voor jou terugvoer moet verskyn as 'n sleutelwoord in die teks gevind is.", + "options": [ + { + "label": "sleutelwoord" + }, + { + "label": "alternatief gevind" + }, + { + "label": "antwoord gegee" + }, + { + "label": "geen" + } + ] + }, + { + "label": "Terugvoerwoord wat gewys word indien sleutelwoord ontbreek", + "description": "Met hierdie opsie kan jy spesifiseer watter woord voor jou terugvoer getoon moet word as 'n sleutelwoord nie in die teks gevind is nie.", + "options": [ + { + "label": "sleutelwoord" + }, + { + "label": "geen" + } + ] + } + ] + } + ] + } + }, + { + "label": "Algehele terugvoer", + "fields": [ + { + "widgets": [ + { + "label": "Verstek" + } + ], + "label": "Bepaal verstekterugvoer vir enige reeks tellings", + "description": "Kliek op die \"Voeg reeks by\" knoppie om so veel as moontlik reekse by te voeg. Byvoorbeeld: 0-20% Swak Punt, 21-91% Gemiddelde Punt, 91-100% Uitstekende Punt!", + "entity": "reeks", + "field": { + "fields": [ + { + "label": "Telreeks" + }, + {}, + { + "label": "Terugvoer vir gedefinieerde telling reeks", + "placeholder": "Vul die terugvoer in" + } + ] + } + } + ] + }, + { + "label": "Gedragsinstellings", + "description": "Hierdie keuses laat jou beheer hoe die onderskeie take uitgevoer moet word.", + "fields": [ + { + "label": "Minimum aantal karakters", + "description": "Spesifiseer die minimum aantal karakters wat die gebruiker moet invoer." + }, + { + "label": "Maksimum aantal karakters", + "description": "Spesifiseer die maksimum aantal karakters wat die gebruiker kan invoer." + }, + { + "label": "Invoerveld grootte", + "description": "Die grootte van die invoerveld in hoeveelheid lyne dit sal dek", + "options": [ + { + "label": "1 lyn" + }, + { + "label": "3 lyne" + }, + { + "label": "10 lyne" + } + ] + }, + { + "label": "Aktiveer \"Probeer weer\"", + "description": "Indien gemerk, kan leerlinge die taak oordoen." + }, + { + "label": "Ignoreer telling", + "description": "Indien gemerk, sal leerlinge slegs die terugvoer wat jy verskaf het vir die sleutelterme sien, maar nie die telling nie." + }, + { + "label": "Punte in gasheeromgewing", + "description": "Word gebruik om punte in die gasheeromgewing toe te ken slegs vir beantwoording (nie aan leerder gewys nie)." + }, + { + "label": "Slaagpersentasie", + "description": "Slaagpersentasie wat nodig is om deur te kom" + }, + { + "label": "Bemeestering persentasie", + "description": "Persentasie nodig vir bemeestering. Deur die bemeestering persentasie onder 100% te stel sal die maksimum moontlike telling hiervolgens aangepas word. Dit is bedoel om speling vir studente te gee, nie om \"vrylik oplossings te aanvaar\" wat nie al die sleutelterme bevat nie." + }, + { + "label": "Oorskry hooflettergevoeligheid", + "description": "Hierdie opsie bepaal of die \"Hooflettergevoeligheid\" opsie vir alle sleutelwoorde aktiveer sal word.", + "options": [ + { + "label": "Aktiveer" + }, + { + "label": "Deaktiveer" + } + ] + }, + { + "label": "Negeer vergewing van foute", + "description": "Hierdie opsie bepaal of die \"Vergewe foute\" opsie vir alle sleutelwoorde geaktiveer sal word.", + "options": [ + { + "label": "Aktiveer" + }, + { + "label": "Deaktiveer" + } + ] + } + ] + }, + { + "label": "Teks vir \"Toets\" knoppie", + "default": "Toets" + }, + { + "label": "Text for \"Submit\" button", + "default": "Submit" + }, + { + "label": "Teks vir \"Probeer weer\" knoppie", + "default": "Probeer weer" + }, + { + "label": "Teks vir \"Wys antwoord\" knoppie", + "default": "Wys antwoord" + }, + { + "label": "Opskrif vir paneel wat terugvoer bevat vir ingeslote/ontbrekende sleutelwoorde", + "default": "Terugvoer" + }, + { + "label": "Etiket vir oplossing", + "default": "Voorbeeld antwoord" + }, + { + "label": "Oorblywende karakters", + "default": "Oorblywende karakters: @chars", + "description": "Boodskap vir oorblywende karakters. Jy kan @chars gebruik wat sal vervang word deur die korresponderende aantal." + }, + { + "label": "Te min karakters", + "default": "Jy moet ten minste @chars karakters invoer!", + "description": "Boodskap om aan te dui dat die teks nie genoeg karakters bevat nie. Jy kan @chars gebruik wat vervang sal word met die korresponderende aantal." + }, + { + "label": "Stoor boodskap", + "description": "Boodskap wat aandui dat die teks gestoor is", + "default": "gestoor" + }, + { + "label": "Jou uitslae (word nie vertoon nie)", + "description": "Toeganklikheidsteks gebruik vir spreeklesers. @score sal vervang word met die aantal punte. @total sal vervang word met die maksimum aantal punte.", + "default": "Jy het @score uit @total punte gekry" + }, + { + "label": "Navigasieboodskap (word nie vertoon nie)", + "description": "Toeganklikheidsteks om te gebruik met spreeklesers", + "default": "Navigeer na nuwe ingeslote voorbeeld-antwoorde na teksarea." + }, + { + "label": "Hulptegnologie-beskrywing vir die \"Toets\" -knoppie", + "default": "Toets die antwoorde." + }, + { + "label": "Hulptegnologieë beskrywing vir \"Wys oplossing\" knoppie", + "default": "Wys die antwoord. Jy sal voorsien word met 'n voorbeeld-antwoord." + }, + { + "label": "Hulptegnologieë beskrywing vir \"Probeer weer\" knoppie", + "default": "Probeer die taak weer. Jy kan verbeter aan jou vorige antwoord indien die outeur dit toegelaat het." + } + ] +} diff --git a/activities/module01/essay-395/H5P.Essay-1.4/language/de.json b/activities/module01/essay-395/H5P.Essay-1.4/language/de.json new file mode 100644 index 0000000..033af58 --- /dev/null +++ b/activities/module01/essay-395/H5P.Essay-1.4/language/de.json @@ -0,0 +1,287 @@ +{ + "semantics": [ + { + "label": "Medium", + "fields": [ + { + "label": "Typ", + "description": "Medium, das wahlweise oberhalb der Aufgabe angezeigt wird." + }, + { + "label": "Bild-Zoom deaktivieren" + } + ] + }, + { + "label": "Aufgabenbeschreibung", + "description": "Die Beschreibung wird oberhalb des Texteingabefeldes erscheinen.", + "placeholder": "Fasse das Buch in maximal 500 Zeichen zusammen ..." + }, + { + "label": "Hilfetext", + "description": "Dieser Text soll die Lernenden am Anfang unterstützen.", + "placeholder": "Dieses Buch handelt von ..." + }, + { + "label": "Lösungsvorschlag", + "description": "Du kannst wahlweise einen Lösungsvorschlag angeben, der angesehen werden kann, wenn die Lernenden ihre Lösung geprüft haben. Es heißt Lösungsvorschlag, weil es sicher mehr als eine richtige Lösung gibt.", + "fields": [ + { + "label": "Einleitung", + "description": "Du kannst deinem Lösungsvorschlag optional eine Erklärung voranstellen. Sie wird nur angezeigt, wenn du auch einen Vorschlag angibst.", + "placeholder": "Bitte bedenke, dass es von dir nicht erwartet war, exakt dieselbe Lösung zu finden. Sie ist lediglich ein gutes Beispiel." + }, + { + "label": "Text des Lösungsvorschlags", + "description": "Die Lernenden sehen nach dem Prüfen ihrer Lösung einen \"Lösung zeigen\"-Button, wenn du hier Text angibst." + } + ] + }, + { + "label": "Schlagworte", + "widgets": [ + { + "label": "Eingabemaske" + } + ], + "entity": "Schlagwort", + "field": { + "label": "Schlagwort", + "fields": [ + { + "label": "Schlagwort", + "description": "Gesuchtes Schlagwort oder gesuchte Phrase. Du kannst ein Sternchen '*' als Platzhalter für einen oder mehrerer Buchstaben verwenden. Du kannst Schrägstriche '/' am Anfang und Ende für reguläre Ausdrücke benutzen." + }, + { + "label": "Variationen", + "description": "Füge dem Schlagwort optional Variationen hinzu. Beispiel: Für 'Stadt' könnten auch 'Ortschaft', 'Gemeinde', etc. passen. Punkte werden für auch für gefundene Alternativen vergeben.", + "entity": "Variation", + "field": { + "label": "Schlagwortvariation" + } + }, + { + "label": "Punkte, Optionen und Rückmeldung", + "fields": [ + { + "label": "Punkte", + "description": "Punkte, die Lernende erhalten, wenn sie das Schlagwort oder eine Variation verwenden." + }, + { + "label": "Fundstellen", + "description": "Lege fest, wie viele Fundstellen desselben Schlagworts oder seiner Variationen mit Punkten versehen werden sollen." + }, + { + "label": "Auf Groß-/Kleinschreibung achten", + "description": "Stellt sicher, dass die Lösung exakt der Vorgabe entsprechen muss." + }, + { + "label": "Kleine Rechtschreibfehler akzeptieren", + "description": "Wenn diese Option gewählt wird, wird eine Antwort bei kleinen Rechtschreibfehlern noch als richtig gewertet. (3-9 Zeichen: 1 Fehler, mehr als 9 Zeichen: 2 Fehler)." + }, + { + "label": "Rückmeldung, wenn Schlagwort verwendet", + "description": "Diese Rückmeldung wird angezeigt, wenn die Lernenden das Schlagwort oder seine Variationen im Text verwendet haben." + }, + { + "label": "Rückmeldung, wenn Schlagwort nicht verwendet", + "description": "Diese Rückmeldung wird angezeigt, wenn die Lernenden das Schlagwort oder seine Variationen im Text nicht verwendet haben." + }, + { + "label": "Wort bei Rückmeldung, wenn Schlagwort verwendet", + "description": "Diese Option erlaubt es anzugeben, welches Wort vor der Rückmeldung angezeigt wird, wenn ein Schlagwort verwendet wurde.", + "options": [ + { + "label": "Schlagwort" + }, + { + "label": "gefundene Alternative" + }, + { + "label": "gegebene Antwort" + }, + { + "label": "nichts" + } + ] + }, + { + "label": "Wort bei Rückmeldung, wenn Schlagwort nicht verwendet", + "description": "Diese Option erlaubt es anzugeben, welches Wort vor der Rückmeldung angezeigt wird, wenn ein Schlagwort verwendet wurde.", + "options": [ + { + "label": "Schlagwort" + }, + { + "label": "nichts" + } + ] + } + ] + } + ] + } + }, + { + "label": "Allgemeine Rückmeldung", + "fields": [ + { + "widgets": [ + { + "label": "Vorgabe" + } + ], + "label": "Lege Rückmeldungen für einzelne Punktebereiche fest", + "description": "Klicke auf den \"Bereich hinzufügen\"-Button, um so viele Bereiche hinzuzufügen, wie du brauchst. Beispiel: 0-20% Schlechte Punktzahl, 21-91% Durchschnittliche Punktzahl, 91-100% Großartige Punktzahl!", + "entity": "Bereich", + "field": { + "fields": [ + { + "label": "Punktebereich" + }, + {}, + { + "label": "Rückmeldung für festgelegte Punktebereiche", + "placeholder": "Trage die Rückmeldung ein" + } + ] + } + } + ] + }, + { + "label": "Verhaltenseinstellungen", + "description": "Hier kannst Du einstellen, wie sich die Aufgabe verhält.", + "fields": [ + { + "label": "Minimale Zeichenzahl", + "description": "Gib die minimale Zeichenzahl an, die Lernende eingeben müssen." + }, + { + "label": "Maximale Zeichenzahl", + "description": "Gib die maximale Zeichenzahl an, die Lernende eingeben dürfen." + }, + { + "label": "Größe des Eingabefelds", + "description": "Die Größe des Eingabefelds als Zahl der Zeilen", + "options": [ + { + "label": "1 Zeile" + }, + { + "label": "3 Zeilen" + }, + { + "label": "10 Zeilen" + } + ] + }, + { + "label": "\"Wiederholen\" zulassen", + "description": "Wenn diese Option angewählt ist, können Lernende die Aufgabe wiederholen." + }, + { + "label": "Ignoriere die Bepunktung", + "description": "Wenn diese Option gewählt ist, sehen die Lernenden nur deine Rückmeldung, nicht aber die Bepunktung. Es wird nichts gewertet." + }, + { + "label": "Punkte im Wirtssystem", + "description": "Wird verwendet, um im Wirtssystem Punkte einzig für die Bearbeitung der Aufgabe zu vergeben (wird den Lernenden nicht angezeigt)." + }, + { + "label": "Prozentsatz zum Bestehen", + "description": "Prozentsatz, der zum Bestehen nötig ist" + }, + { + "label": "Prozentsatz zum Meistern", + "description": "Prozentsatz, der zum Meistern nötig ist. Ein Prozenzsatz unter 100 % verringert die maximale Punktzahl entsprechend. Lerndenden soll damit Spielraum gegeben werden, statt \"gnädigerweise\" Lösungen ohne alle Schlagworte zu akzeptieren." + }, + { + "label": "Einstellung für \"Groß-Kleinschreibung\" überschreiben", + "description": "Diese Option legt fest, ob die Option \"Auf Groß-/Kleinschreibung achten\" für alle Schlagworte aktiviert wird oder deaktiviert wird.", + "options": [ + { + "label": "Aktiviert" + }, + { + "label": "Deaktiviert" + } + ] + }, + { + "label": "Einstellung für \"Kleine Rechtschreibfehler akzeptieren\" überschreiben", + "description": "Diese Option legt fest, ob die Option \"Kleine Rechtschreibfehler akzeptieren\" für alle Schlagworte aktiviert wird oder deaktiviert wird.", + "options": [ + { + "label": "Aktiviert" + }, + { + "label": "Deaktiviert" + } + ] + } + ] + }, + { + "label": "Beschriftung des \"Überprüfen\"-Buttons", + "default": "Überprüfen" + }, + { + "label": "Beschriftung des \"Absenden\"-Buttons", + "default": "Submit" + }, + { + "label": "Beschriftung des \"Wiederholen\"-Buttons", + "default": "Wiederholen" + }, + { + "label": "Beschriftung des \"Lösung anzeigen\"-Buttons", + "default": "Lösung anzeigen" + }, + { + "label": "Überschrift für den Abschnitt mit Rückeldung zu den Schlagworten", + "default": "Rückmeldung" + }, + { + "label": "Beschriftung für den Lösungsvorschlag", + "default": "Lösungsvorschlag" + }, + { + "label": "Verbleibende Zeichenzahl", + "default": "Verbleibende Zeichen: @chars", + "description": "Nachricht für die verbleibende Zeichenzahl. Du kannst @chars einsetzen, das später durch die entsprechende Zahl ersetzt wird." + }, + { + "label": "Nicht genügend Zeichen", + "default": "Du musst mindestens @chars Zeichen eingeben!", + "description": "Nachricht die darauf hinweist, dass der Text noch nicht genügend Zeichen umfasst. Du kannst @chars einsetzen, das später durch die entsprechende Zahl ersetzt wird." + }, + { + "label": "Speichernachricht", + "description": "Nachricht, die darauf hinweist, dass der Text gespeichert wurde", + "default": "gespeichert" + }, + { + "label": "Dein Ergebnis (nicht angezeigt)", + "description": "Anzeigetext für Readspeakers (Barrierefreiheit). @score wird durch die erreichten Punkte ersetzt. @total wird durch die maximal mögliche Punktzahl ersetzt.", + "default": "Du hast @score von @total Punkten" + }, + { + "label": "Navigationsmeldung (nicht angezeigt)", + "description": "Anzeigetext für Readspeakers (Barrierefreiheit)", + "default": "Unterhalb des Texteingabefeldes wurde eine Musterlösung eingefügt. Dorthin navigiert." + }, + { + "label": "Beschreibung des \"Überprüfen\"-Buttons (für Hilfsmittel zur Barrierefreiheit)", + "default": "Die Antwort überprüfen." + }, + { + "label": "Beschreibung des \"Lösung anzeigen\"-Buttons (für Hilfsmittel zur Barrierefreiheit)", + "default": "Zeige die Lösung an. Du erhältst dann eine Musterlösung." + }, + { + "label": "Beschreibung des \"Wiederholen\"-Buttons (für Hilfsmittel zur Barrierefreiheit)", + "default": "Wiederhole die Aufgabe. Du kannst deine vorherige Antwort verbessern, sofern dies für diese Aufgabe erlaubt ist." + } + ] +} diff --git a/activities/module01/essay-395/H5P.Essay-1.4/language/el.json b/activities/module01/essay-395/H5P.Essay-1.4/language/el.json new file mode 100644 index 0000000..916f3b9 --- /dev/null +++ b/activities/module01/essay-395/H5P.Essay-1.4/language/el.json @@ -0,0 +1,287 @@ +{ + "semantics": [ + { + "label": "Στοιχεία πολυμέσων", + "fields": [ + { + "label": "Τύπος", + "description": "Προσθήκη στοιχείου πολυμέσων προς εμφάνιση πάνω από την ερώτηση (προαιρετικό)." + }, + { + "label": "Απενεργοποίηση της επιλογής zoom για την εικόνα της ερώτησης" + } + ] + }, + { + "label": "Περιγραφή δραστηριότητας", + "description": "Περιγράψτε εδώ τη δραστηριότητα. Η περιγραφή της δραστηριότητας θα εμφανιστεί πάνω από την περιοχή εισαγωγής κειμένου.", + "placeholder": "Γράψτε μια περίληψη του βιβλίου σε 500 χαρακτήρες..." + }, + { + "label": "Βοηθητικό κείμενο", + "description": "Το κείμενο αυτό θα βοηθήσει τον χρήστη να ξεκινήσει.", + "placeholder": "Το βιβλίο αναφέρεται σε..." + }, + { + "label": "Ενδεικτική απάντηση", + "description": "Μπορείτε να προσθέσετε μια ενδεικτική απάντηση που θα εμφανίζεται στο χρήστη αφού γράψει το κείμενό του. It's called sample solution because there probably is not only one solution.", + "fields": [ + { + "label": "Εισαγωγή", + "description": "Μπορείτε να δώσετε στον χρήστη κάποιες επεξηγήσεις σχετικά με την ενδεικτική απάντηση. (προαιρετικά)", + "placeholder": "Να θυμάσαι πως δεν χρειαζόταν να δώσεις ακριβώς την ίδια απάντηση. Η απάντηση που σου δίνεται αποτελεί απλώς ένα αντιπροσωπευτικό παράδειγμα." + }, + { + "label": "Κείμενο ενδεικτικής απάντησης", + "description": "Αν συμπληρώσετε κάποιο κείμενο στο συγκεκριμένο πεδίο, θα εμφανιστεί στον χρήστη το κουμπί \"Ενδεικτική Απάντηση\" μετά την υποβολή του κειμένου." + } + ] + }, + { + "label": "Λέξεις - κλειδιά", + "widgets": [ + { + "label": "Βασικό" + } + ], + "entity": "Λεξη - κλειδι", + "field": { + "label": "Λέξη - κλειδί", + "fields": [ + { + "label": "Λέξη - κλειδί", + "description": "Λέξη - κλειδί ή σύντομη φράση. Χρησιμοποιήστε έναν αστερίσκο '*' ως μπαλαντέρ για έναν ή περισσότερους χαρακτήρες. Π.χ. με τους χαρακτήρες θερμ* εντοπίζονται οι λέξεις θερμός, θερμότητα, θερμοκήπιο κ.λπ." + }, + { + "label": "Εναλλακτικές λέξεις - κλειδιά", + "description": "Προσθέστε εναλλακτικές εκδοχές της λέξης - κλειδί. Π.χ. για \"πόλη\" προσθέστε εναλλακτικά \"άστυ\", \"δήμος\". Ο χρήστης θα κερδίσει επιπλέον βαθμούς αν συμπεριλάβει στο κείμενό του τις καθορισμένες εναλλακτικές λέξεις - κλειδιά. (προαιρετικά)", + "entity": "εναλλακτικης λεξης - κλειδι", + "field": { + "label": "Εναλλακτική λέξη - κλειδί" + } + }, + { + "label": "Βαθμοί, επιλογές και ανατροφοδότηση", + "fields": [ + { + "label": "Βαθμοί", + "description": "Βαθμοί με τους οποίους θα ανταμειφθεί ο χρήστης, αν συμπεριλάβει στο κείμενό του τη συγκεκριμένη λέξη - κλειδί ή τις εναλλακτικές εκδοχές της." + }, + { + "label": "Συχνότητα εμφάνισης", + "description": "Καθορίστε για πόσες φορές εμφάνισης της λέξης-κλειδί ή των εναλλακτικών εκδοχών της ο μαθητής θα κερδίζει βαθμούς." + }, + { + "label": "Διάκριση πεζών - κεφαλαίων", + "description": "Το κείμενο που εισάγει ο μαθητής πρέπει να είναι ακριβώς το ίδιο (πεζά - κεφαλαία) με την απάντηση." + }, + { + "label": "Παράβλεψη μικρών λαθών", + "description": "Γίνονται αποδεκτά κάποια ορθογραφικά λάθη (3-9 χαρακτήρες: 1 λάθος, περισσότεροι από 9 χαρακτήρες: 2 λάθη)." + }, + { + "label": "Ανατροφοδότηση όταν συμπεριλαμβάνεται η λέξη - κλειδί", + "description": "Αυτό το σχόλιο θα εμφανιστεί αν ο χρήστης συμπεριλάβει στο κείμενό του τη συγκεκριμένη λέξη - κλειδί ή εναλλακτικές εκδοχές της." + }, + { + "label": "Ανατροφοδότηση όταν παραλείπεται η λέξη - κλειδί", + "description": "Αυτό το σχόλιο θα εμφανιστεί αν ο χρήστης παραλείψει να συμπεριλάβει στο κείμενό του τη συγκεκριμένη λέξη - κλειδί ή εναλλακτικές εκδοχές της." + }, + { + "label": "Εμφάνιση λέξης ανατροφοδότησης όταν συμπεριλαμβάνεται η λέξη - κλειδί", + "description": "Αυτή η επιλογή σας επιτρέπει να καθορίσετε τη μπροστινή λέξη της ανατροφοδότησης, εάν η συγκεκριμένη λέξη - κλειδί βρεθεί στο κείμενο.", + "options": [ + { + "label": "λέξη - κλειδί" + }, + { + "label": "βρέθηκε εναλλακτική" + }, + { + "label": "δόθηκε απάντηση" + }, + { + "label": "καμία" + } + ] + }, + { + "label": "Εμφάνιση λέξης ανατροφοδότησης όταν παραλείπεται η λέξη - κλειδί", + "description": "Αυτή η επιλογή σας επιτρέπει να καθορίσετε τη μπροστινή λέξη της ανατροφοδότησης, εάν η συγκεκριμένη λέξη - κλειδί δε βρεθεί στο κείμενο.", + "options": [ + { + "label": "λέξη - κλειδί" + }, + { + "label": "καμία" + } + ] + } + ] + } + ] + } + }, + { + "label": "Συνολική ανατροφοδότηση", + "fields": [ + { + "widgets": [ + { + "label": "Βασικό" + } + ], + "label": "Χαρακτηρισμός κάθε κλίμακας βαθμολογίας", + "description": "Κάντε κλικ στο κουμπί \"Προσθήκη κλίμακας\" για να προσθέσετε όσες κλίμακες ή διαβαθμίσεις επιθυμείτε. Παράδειγμα: 0-20% Χαμηλή βαθμολογία, 21-91% Μέτρια βαθμολογία, 91-100% Εξαιρετική βαθμολογία!", + "entity": "κλιμακας", + "field": { + "fields": [ + { + "label": "Βαθμολογία" + }, + {}, + { + "label": "Χαρακτηρισμός", + "placeholder": "Συμπληρώστε τον χαρακτηρισμό" + } + ] + } + } + ] + }, + { + "label": "Ρυθμίσεις άσκησης", + "description": "Αυτές οι ρυθμίσεις σας επιτρέπουν να καθορίσετε τον τρόπο λειτουργίας της άσκησης.", + "fields": [ + { + "label": "Ελάχιστος αριθμός χαρακτήρων", + "description": "Προσδιορίστε τον ελάχιστο αριθμό απαιτούμενων χαρακτήρων." + }, + { + "label": "Μέγιστος αριθμός χαρακτήρων", + "description": "Προσδιορίστε τον μέγιστο αριθμό επιτρεπόμενων χαρακτήρων." + }, + { + "label": "Μέγεθος πεδίου εισαγωγής κειμένου", + "description": "Καθορίστε πόσες γραμμές θα καλύπτει το πεδίο εισαγωγής κειμένου", + "options": [ + { + "label": "1 γραμμή" + }, + { + "label": "3 γραμμές" + }, + { + "label": "10 γραμμές" + } + ] + }, + { + "label": "Ενεργοποίηση κουμπιού \"Επανάληψη\"", + "description": "Αν επιλεγεί, ο χρήστης μπορεί να επαναλάβει τη δραστηριότητα." + }, + { + "label": "Χωρίς βαθμολογία", + "description": "Αν επιλεγεί, ο χρήστης θα δει μόνο την ανατροφοδότηση που παρέχεται για τις λέξεις-κλειδιά και όχι τη βαθμολογία." + }, + { + "label": "Βαθμολογία στο περιβάλλον υποδοχής", + "description": "Χρησιμοποιείται για να βαθμολογήσει απαντήσεις στο περιβάλλον υποδοχής (δεν εμφανίζεται στον μαθητή)." + }, + { + "label": "Ποσοστό επιτυχίας", + "description": "Ποσοστό που απαιτείται για να θεωρηθεί η προσπάθεια επιτυχημένη" + }, + { + "label": "Ποσοστό αριστείας", + "description": "Ποσοστό που απαιτείται για να θεωρηθεί η προσπάθεια άριστη" + }, + { + "label": "Αντικατάσταση προεπιλεγμένης ρύθμισης για τη διάκριση πεζών - κεφαλαίων", + "description": "Αυτή η επιλογή καθορίζει το αν η διάκριση πεζών - κεφαλαίων ισχύει για όλες τις λέξεις - κλειδιά.", + "options": [ + { + "label": "Ενεργοποιημένη" + }, + { + "label": "Απενεργοποιημένη" + } + ] + }, + { + "label": "Αντικατάσταση προεπιλεγμένης ρύθμισης για την παράβλεψη λαθών", + "description": "Αυτή η επιλογή καθορίζει το αν η παράβλεψη λαθών ισχύει για όλες τις λέξεις-κλειδιά.", + "options": [ + { + "label": "Ενεργοποιημένη" + }, + { + "label": "Απενεργοποιημένη" + } + ] + } + ] + }, + { + "label": "Ετικέτα κουμπιού ελέγχου απάντησης", + "default": "Έλεγχος" + }, + { + "label": "Text for \"Submit\" button", + "default": "Submit" + }, + { + "label": "Ετικέτα κουμπιού νέας προσπάθειας", + "default": "Επανάληψη" + }, + { + "label": "Ετικέτα κουμπιού εμφάνισης απάντησης", + "default": "Ενδεικτική Απάντηση" + }, + { + "label": "Επικεφαλίδα πλαισίου ανατροφοδότησης για τις λέξεις - κλειδιά", + "default": "Ανατροφοδότηση" + }, + { + "label": "Ετικέτα απάντησης", + "default": "Ενδεικτική απάντηση" + }, + { + "label": "Χαρακτήρες που απομένουν", + "default": "Απομένουν: @chars χαρακτήρες", + "description": "Μήνυμα που ενημερώνει για το πόσοι χαρακτήρες απομένουν. Μπορείτε να χρησιμοποιήσετε τη μεταβλητή @chars που θα αντικατασταθεί με τον αντίστοιχο αριθμό." + }, + { + "label": "Μη επαρκής αριθμός χαρακτήρων", + "default": "Πρέπει να συμπληρώσετε τουλάχιστον @chars χαρακτήρες!", + "description": "Μήνυμα που ενημερώνει ότι το κείμενο δεν περιλαμβάνει επαρκή αριθμό χαρακτήρων. Μπορείτε να χρησιμοποιήσετε τη μεταβλητή @chars που θα αντικατασταθεί με τον κατάλληλο αριθμό." + }, + { + "label": "Μήνυμα αποθήκευσης", + "description": "Μήνυμα που ενημερώνει ότι το κείμενο έχει αποθηκευτεί", + "default": "Έχει αποθηκευτεί" + }, + { + "label": "Το αποτέλεσμά σου (δεν εμφανίζεται)", + "description": "Κείμενο ακουστικής υποβοήθησης. Η μεταβλητή @score θα αντικατασταθεί από τη βαθμολογία. Η μεταβλητή @total θα αντικατασταθεί από τη μέγιστη δυνατή βαθμολογία.", + "default": "Πήρες @score από @total βαθμούς" + }, + { + "label": "Μήνυμα πλοήγησης (δεν εμφανίζεται)", + "description": "Κείμενο ακουστικής υποβοήθησης", + "default": "Πλοηγήθηκες στην πρόσφατα συμπεριληφθείσα ενδεικτική απάντηση." + }, + { + "label": "Assistive technology description for \"Check\" button", + "default": "Check the answers." + }, + { + "label": "Assistive technology description for \"Show Solution\" button", + "default": "Show the solution. You will be provided with a sample solution." + }, + { + "label": "Assistive technology description for \"Retry\" button", + "default": "Retry the task. You can improve your previous answer if the author allowed that." + } + ] +} diff --git a/activities/module01/essay-395/H5P.Essay-1.4/language/es-mx.json b/activities/module01/essay-395/H5P.Essay-1.4/language/es-mx.json new file mode 100644 index 0000000..0f36ba4 --- /dev/null +++ b/activities/module01/essay-395/H5P.Essay-1.4/language/es-mx.json @@ -0,0 +1,287 @@ +{ + "semantics": [ + { + "label": "Medio", + "fields": [ + { + "label": "Tipo", + "description": "Medio opcional a mostrar arriba de la pregunta." + }, + { + "label": "Deshabilitar acercamiento de imagen" + } + ] + }, + { + "label": "Descripción del trabajo", + "description": "Describa aquí su trabajo. La descripción del trabajo aparecerá arriba del área para la entrada del texto.", + "placeholder": "Resuma el libro en 500 caracteres ..." + }, + { + "label": "Texto de ayuda", + "description": "Este texto debería ayudarle al usuario a comenzar.", + "placeholder": "Este libro es acerca de ..." + }, + { + "label": "Solución de muestra", + "description": "Opcionalmente Usted puede añadir una solución de muestra sencilla que es mostrada después que el estudiante creó un texto. Se llama solución de muestra porque probablemente no sea la única solución.", + "fields": [ + { + "label": "Introducción", + "description": "Opcionalmente Usted puede dejarles a los estudiantes unas explicaciones acerca de su ejemplo. La explicación solamente se mostrará si Usted también añade un ejemplo.", + "placeholder": "Por favor recuerde que no se espera que Usted proporcione exactamente la misma solución. Solamente es un buen ejemplo." + }, + { + "label": "Texto de solución de muestra", + "description": "El estudiante verá un botón para \"Mostrar solución\" después de enviar si Usted proporciona un texto aquí." + } + ] + }, + { + "label": "Palabras clave", + "widgets": [ + { + "label": "Predeterminado" + } + ], + "entity": "Palabra clave", + "field": { + "label": "Palabra clave", + "fields": [ + { + "label": "Palabra clave", + "description": "Palabra clave o frase a buscar. Use un asterisco '*' como un comodín para uno o más caracteres. Use una diagonal '/' al principio y al final para emplear una expresión regular." + }, + { + "label": "Variaciones", + "description": "Añada variaciones opcionales para esta palabra clave. Ejemplo: Para una 'ciudad' añada las alternativas 'poblado', 'municipio' etc. Se otorgarán puntos si el usuario incluye cualquiera de las alternativas especificadas.", + "entity": "variación", + "field": { + "label": "Variación de palabra clave" + } + }, + { + "label": "Puntos, Opciones y Retroalimentación", + "fields": [ + { + "label": "Puntos", + "description": "Puntos que obtendrá el usuario si incluye esta palabra clave o sus alternativas en la respuesta." + }, + { + "label": "Ocurrencias", + "description": "Define cuantas ocurrencias de la palabra clave o sus variaciones deberían ser recompensadas con puntos." + }, + { + "label": "MAYÚSCULAS/minúsculas si importan", + "description": "Asegurarse que la entrada del usuario tenga que ser exactamente la misma que la respuesta." + }, + { + "label": "Perdonar errores menores", + "description": "Esto aceptará errores tipográficos menores (3-9 caracteres: 1 error, más de 9 caracteres: 2 errores)." + }, + { + "label": "Retroalimentación si palabra clave incluida", + "description": "Esta retroalimentación será mostrada si el usuario incluye esta palabra clave o sus alternativas en la respuesta." + }, + { + "label": "Retroalimentación si palabra clave falta", + "description": "Esta retroalimentación será mostrada si el usuario no incluye esta palabra clave o sus alternativas en la respuesta." + }, + { + "label": "Palabra de retroalimentación mostrada si palabra clave incluida", + "description": "Esta opción le permite especificar cual palabra será mostrada al frente de su retroalimentación si una palabra clave fue encontrada en el texto.", + "options": [ + { + "label": "palabra clave" + }, + { + "label": "alternativa encontrada" + }, + { + "label": "respuesta dada" + }, + { + "label": "ninguna" + } + ] + }, + { + "label": "Palabra de Retroalimentación mostrada si palabra clave falta", + "description": "Esta opción le permite especificar cual palabra clave será mostrada al frente de su retroalimentación si una palabra clave no fue encontrada en el texto.", + "options": [ + { + "label": "palabra clave" + }, + { + "label": "ninguna" + } + ] + } + ] + } + ] + } + }, + { + "label": "Retroalimentación Global", + "fields": [ + { + "widgets": [ + { + "label": "Predeterminado" + } + ], + "label": "Definir retroalimentación personalizada para cualquier rango de puntaje", + "description": "Hacer clic en el botón \"Añadir rango\" para añadir cuantos rangos necesite. Ejemplo: 0-20% Mal puntaje, 21-91% Puntaje Promedio, 91-100% ¡Magnífico Puntaje!", + "entity": "rango", + "field": { + "fields": [ + { + "label": "Rango de Puntaje" + }, + {}, + { + "label": "Retroalimentación para rango definido de puntaje", + "placeholder": "Complete la retroalimentación" + } + ] + } + } + ] + }, + { + "label": "Configuraciones del comportamiento", + "description": "Estas opciones le permitirán controlar como se comporta el trabajo.", + "fields": [ + { + "label": "Número mínimo de caracteres", + "description": "Especificar el número mínimo de caracteres que debe ingresar el usuario." + }, + { + "label": "Número máximo de caracteres", + "description": "Especificar el número máximo de caracteres que puede ingresar el usuario." + }, + { + "label": "Tamaño de campo de entrada", + "description": "El tamaño del campo para entrada en cantidad de líneas que cubrirá", + "options": [ + { + "label": "1 línea" + }, + { + "label": "3 líneas" + }, + { + "label": "10 líneas" + } + ] + }, + { + "label": "Habilitar \"Reintentar\"", + "description": "Si se activa, los estudiantes pueden reintentar el trabajo." + }, + { + "label": "Ignorar puntaje", + "description": "Si se activa, los estudiantes solamente verán la retroalimentación que Usted proporcione para las palabras clave, pero sin puntaje." + }, + { + "label": "Puntos en el entorno del anfitrión", + "description": "Usado para otorgar puntos en el entorno del anfitrión meramente por contestar (no mostrado al estudiante)." + }, + { + "label": "Porcentaje aprobatorio", + "description": "Porcentaje que es necesario para pasar" + }, + { + "label": "Porcentaje de dominio", + "description": "Porcentaje que es necesario para el dominio. Configurar el porcentaje de dominio debajo de 100 % disminuirá el puntaje máximo posible respectivamente. Se usa para darle holgura a los estudiantes, no es para \"aceptar graciosamente\" soluciones que no contienen todas las palabras clave." + }, + { + "label": "Anular sensibilidad a MAYÚSCULAS/minúsculas", + "description": "Esta opción determina si la opción de \"MAYÚSCULAS/minúsculas importan\" estará activada para todas las palabras clave.", + "options": [ + { + "label": "Habilitada" + }, + { + "label": "Deshabilitada" + } + ] + }, + { + "label": "Anular perdonar errores", + "description": "Esta opción determina si la opción para \"Perdonar errores\" estará activada para todas las palabras clave.", + "options": [ + { + "label": "Habilitada" + }, + { + "label": "Deshabilitada" + } + ] + } + ] + }, + { + "label": "Texto para botón \"Comprobar\"", + "default": "Comprobar" + }, + { + "label": "Texto para botón \"Enviar\"", + "default": "Submit" + }, + { + "label": "Texto para botón \"Reintentar\"", + "default": "Reintentar" + }, + { + "label": "Texto para botón \"Mostrar solución\"", + "default": "Mostrar solución" + }, + { + "label": "Encabezado para panel que contiene retroalimentación para palabras clave incluidas/faltantes", + "default": "Retroalimentación" + }, + { + "label": "Etiqueta para solución", + "default": "Solución de muestra" + }, + { + "label": "Caracteres restantes", + "default": "Caracteres restantes: @chars", + "description": "Mensaje para caracteres restantes. Puede usar @chars que será remplazado por el número correspondiente." + }, + { + "label": "No hay suficientes caracteres", + "default": "¡Usted debe ingresar al menos @chars caracteres!", + "description": "Mensaje para indicar que el texto no contiene suficientes caracteres. Puede usar @chars que será remplazado por el número correspondiente." + }, + { + "label": "Guardar mensaje", + "description": "Mensaje que indica que el texto ha sido guardado", + "default": "guardado" + }, + { + "label": "Su resultado (no mostrado)", + "description": "Texto de accesibilidad usado para lectores en voz alta. @score será remplazado por el número de puntos. @total será remplazado por los puntos posibles máximos.", + "default": "Usted obtuvo @score de un total de @total puntos" + }, + { + "label": "Mensaje de navegación (no mostrado)", + "description": "Texto de accesibilidad usado para lectores en voz alta", + "default": "Navegado a solución de muestra recientemente incluida después de área de texto." + }, + { + "label": "Descripción de tecnología asistiva para botón \"Comprobar\"", + "default": "Comprobar las respuestas." + }, + { + "label": "Descripción de tecnología asistiva para botón \"Mostrar Solución\"", + "default": "Mostrar la solución. Se le proporcionará una solución de muestra." + }, + { + "label": "Descripción de tecnología asistiva para botón \"Reintentar\"", + "default": "Reintentar el trabajo. Puede mejorar su respuesta anterior si el autor lo permitió." + } + ] +} diff --git a/activities/module01/essay-395/H5P.Essay-1.4/language/es.json b/activities/module01/essay-395/H5P.Essay-1.4/language/es.json new file mode 100644 index 0000000..8494f37 --- /dev/null +++ b/activities/module01/essay-395/H5P.Essay-1.4/language/es.json @@ -0,0 +1,287 @@ +{ + "semantics": [ + { + "label": "Medio", + "fields": [ + { + "label": "Tipo", + "description": "Medio opcional a mostrar arriba de la pregunta." + }, + { + "label": "Deshabilitar acercamiento de imagen" + } + ] + }, + { + "label": "Descripción del trabajo", + "description": "Describa aquí su trabajo. La descripción del trabajo aparecerá arriba del área para la entrada del texto.", + "placeholder": "Resuma el libro en 500 caracteres ..." + }, + { + "label": "Texto de ayuda", + "description": "Este texto debería ayudarle al usuario a comenzar.", + "placeholder": "Este libro es acerca de ..." + }, + { + "label": "Solución de muestra", + "description": "Opcionalmente Usted puede añadir una solución de muestra sencilla que es mostrada después que ele estudiante creó un texto. Se llama solución de muestra porque probablemente no sea la única solución.", + "fields": [ + { + "label": "Introducción", + "description": "Opcionalmente Usted puede dejarles a los estudiantes unas explicaciones acerca de su ejemplo. La explicación solamente se mostrará si Usted también añade un ejemplo.", + "placeholder": "Por favor recuerde que no se espera que Usted proporcione exactamente la misma solución. Solamente es un buen ejemplo." + }, + { + "label": "Texto de solución de muestra", + "description": "El estudiante verá un botón para \"Mostrar solución\" después de enviar si Usted proporciona el texto aquí." + } + ] + }, + { + "label": "Palabras clave", + "widgets": [ + { + "label": "Predeterminado" + } + ], + "entity": "Palabra clave", + "field": { + "label": "Palabra clave", + "fields": [ + { + "label": "Palabra clave", + "description": "Palabra clave o frase a buscar. Use un asterisco '*' como un comodín para uno o más caracteres. Use una diagonal '/' al principio y al final para emplear una expresión regular." + }, + { + "label": "Variaciones", + "description": "Añada variaciones opcionales para esta palabra clave. Ejemplo: Para una 'ciudad' añada las alternativas 'poblado', 'municipio' etc. Se otorgarán puntos si el usuario incluye cualquiera de las alternativas especificadas.", + "entity": "variación", + "field": { + "label": "Variación de palabra clave" + } + }, + { + "label": "Puntos, Opciones y Retroalimentación", + "fields": [ + { + "label": "Puntos", + "description": "Puntos que obtendrá el usuario si incluye esta palabra clave o sus alternativas en la respuesta." + }, + { + "label": "Ocurrencias", + "description": "Define cuantas ocurrencias de la palabra clave o sus variaciones deberían ser recompensadas con puntos." + }, + { + "label": "MAYÚSCULAS/minúsculas si importan", + "description": "Asegurarse que la entrada del usuario tenga que ser exactamente la misma que la respuesta." + }, + { + "label": "Perdonar errores menores", + "description": "Esto aceptará errores tipográficos menores (3-9 caracteres: 1 error, más de 9 caracteres: 2 errores)." + }, + { + "label": "Retroalimentación si palabra clave incluida", + "description": "Esta retroalimentación será mostrada si el usuario incluye esta palabra clave o sus alternativas en la respuesta." + }, + { + "label": "Retroalimentación si palabra clave falta", + "description": "Esta retroalimentación será mostrada si el usuario no incluye esta palabra clave o sus alternativas en la respuesta." + }, + { + "label": "Palabra de retroalimentación mostrada si palabra clave incluida", + "description": "Esta opción le permite especificar cual palabra será mostrada al frente de su retroalimentación si una palabra clave fue encontrada en el texto.", + "options": [ + { + "label": "palabra clave" + }, + { + "label": "alternativa encontrada" + }, + { + "label": "respuesta dada" + }, + { + "label": "ninguna" + } + ] + }, + { + "label": "Palabra de Retroalimentación mostrada si palabra clave falta", + "description": "Esta opción le permite especificar cual palabra clave será mostrada al frente de su retroalimentación si una palabra clave no fue encontrada en el texto.", + "options": [ + { + "label": "palabra clave" + }, + { + "label": "ninguna" + } + ] + } + ] + } + ] + } + }, + { + "label": "Retroalimentación Global", + "fields": [ + { + "widgets": [ + { + "label": "Predeterminado" + } + ], + "label": "Definir retroalimentación personalizada para cualquier rango de puntaje", + "description": "Haga clic en el botón \"Añadir rango\" para añadir cuantos rangos necesite. Ejemplo: 0-20% Mal puntaje, 21-91% Puntaje Promedio, 91-100% ¡Magnífico Puntaje!", + "entity": "rango", + "field": { + "fields": [ + { + "label": "Rango de Puntaje" + }, + {}, + { + "label": "Retroalimentación para rango definido de puntaje", + "placeholder": "Complete la retroalimentación" + } + ] + } + } + ] + }, + { + "label": "Configuraciones del comportamiento", + "description": "Estas opciones le permitirán controlar como se comporta el trabajo.", + "fields": [ + { + "label": "Número mínimo de caracteres", + "description": "Especificar el número mínimo de caracteres que debe ingresar el usuario." + }, + { + "label": "Número máximo de caracteres", + "description": "Especificar el número máximo de caracteres que puede ingresar el usuario." + }, + { + "label": "Tamaño de campo de entrada", + "description": "El tamaño del campo para entrada en cantidad de líneas que cubrirá", + "options": [ + { + "label": "1 línea" + }, + { + "label": "3 líneas" + }, + { + "label": "10 líneas" + } + ] + }, + { + "label": "Habilitar \"Reintentar\"", + "description": "Si se activa, los estudiantes pueden reintentar el trabajo." + }, + { + "label": "Ignorar puntaje", + "description": "Si se activa, los estudiantes solamente verán la retroalimentación que Usted proporcione para las palabras clave, pero sin puntaje." + }, + { + "label": "Puntos en el entorno del anfitrión", + "description": "Usado para otorgar puntos en el entorno del anfitrión meramente por contestar (no mostrado al estudiante)." + }, + { + "label": "Porcentaje aprobatorio", + "description": "Porcentaje que es necesario para pasar" + }, + { + "label": "Porcentaje de dominio", + "description": "Porcentaje que es necesario para el dominio. Configurar el porcentaje de dominio debajo de 100 % disminuirá el puntaje máximo posible respectivamente. Se usa para darle holgura a los estudiantes, no es para \"aceptar graciosamente\" soluciones que no contienen todas las palabras clave." + }, + { + "label": "Anular sensibilidad a MAYÚSCULAS/minúsculas", + "description": "Esta opción determina si la opción de \"MAYÚSCULAS/minúsculas importan\" estará activada para todas las palabras clave.", + "options": [ + { + "label": "Habilitada" + }, + { + "label": "Deshabilitada" + } + ] + }, + { + "label": "Anular perdonar errores", + "description": "Esta opción determina si la opción para \"Perdonar errores\" estará activada para todas las palabras clave.", + "options": [ + { + "label": "Habilitada" + }, + { + "label": "Deshabilitada" + } + ] + } + ] + }, + { + "label": "Texto para botón \"Comprobar\"", + "default": "Comprobar" + }, + { + "label": "Texto para botón \"Enviar\"", + "default": "Submit" + }, + { + "label": "Texto para botón \"Reintentar\"", + "default": "Reintentar" + }, + { + "label": "Texto para botón \"Mostrar solución\"", + "default": "Mostrar solución" + }, + { + "label": "Encabezado para panel que contiene retroalimentación para palabras clave incluidas/faltantes", + "default": "Retroalimentación" + }, + { + "label": "Etiqueta para solución", + "default": "Solución de muestra" + }, + { + "label": "Caracteres restantes", + "default": "Caracteres restantes: @chars", + "description": "Mensaje para caracteres restantes. Puede usar @chars que serán remplazados por el número correspondiente." + }, + { + "label": "No hay suficientes caracteres", + "default": "¡Usted debe ingresar al menos @chars caracteres!", + "description": "Mensaje para indicar que el texto no contiene suficientes caracteres. Puede usar @chars que será remplazado por el número correspondiente." + }, + { + "label": "Guardar mensaje", + "description": "Mensaje que indica que el texto ha sido guardado", + "default": "guardado" + }, + { + "label": "Su resultado (no mostrado)", + "description": "Texto de accesibilidad usado para lectores en voz alta. @score será remplazado por el número de puntos. @total será remplazado por los puntos posibles máximos.", + "default": "Usted obtuvo @score de un total de @total puntos" + }, + { + "label": "Mensaje de navegación (no mostrado)", + "description": "Texto de accesibilidad usado para lectores en voz alta", + "default": "Navegado a solución de muestra recientemente incluida después de área de texto." + }, + { + "label": "Descripción de tecnología asistiva para botón \"Comprobar\"", + "default": "Comprobar las respuestas." + }, + { + "label": "Descripción de tecnología asistiva para botón \"Mostrar solución\"", + "default": "Mostrar la solución. Se le proporcionará una solución de muestra." + }, + { + "label": "Descripción de tecnología asistiva para botón \"Reintentar\"", + "default": "Reintentar la tarea. Puede mejorar su respuesta anterior si el autor lo permitió." + } + ] +} diff --git a/activities/module01/essay-395/H5P.Essay-1.4/language/et.json b/activities/module01/essay-395/H5P.Essay-1.4/language/et.json new file mode 100644 index 0000000..12c0302 --- /dev/null +++ b/activities/module01/essay-395/H5P.Essay-1.4/language/et.json @@ -0,0 +1,287 @@ +{ + "semantics": [ + { + "label": "Meedia", + "fields": [ + { + "label": "Tüüp", + "description": "Valikuline meedia pildi kohal näitamiseks." + }, + { + "label": "Keela pildi suumimine." + } + ] + }, + { + "label": "Ülesande kirjeldus", + "description": "Kirjelda oma ülesannet siin. Ülesande kirjeldus ilmub tekstisisestusala kohale.", + "placeholder": "Tee raamatu sisukokkuvõte 500 tähega ..." + }, + { + "label": "Abitekst", + "description": "See tekst peaks kasutajat aitama alustada.", + "placeholder": "See raamat räägib ..." + }, + { + "label": "Näidislahendus", + "description": "Sa saad valikuliselt lisada näidislahenduse, mida näidatakse pärast seda, kui õpilane on teksti loonud. See on nimetatud näidislahenduseks, kuna ilmselt ei ole ülesandel ainult üks lahendus.", + "fields": [ + { + "label": "Sissejuhatus", + "description": "Sa saad valikuliselt jätta õpilastele mõned selgitused oma näite kohta. Selgitusi on näha ainult siis, kui sa lisad ka näite.", + "placeholder": "Palun pea meeles, et sa ei pidanud täpselt samasugust lahendust välja mõtlema. See on lihtsalt hea näide." + }, + { + "label": "Näita lahendust tekst", + "description": "Kui sa siia veidi teksti paned, siis õpilane näeb \"Näita lahendust\" nuppu pärast sisestamist." + } + ] + }, + { + "label": "Märksõnad", + "widgets": [ + { + "label": "Vaikimisi" + } + ], + "entity": "Märksõna", + "field": { + "label": "Märksõna", + "fields": [ + { + "label": "Märksõna", + "description": "Märksõna või fraas, mida otsida. Kasuta asteriski '*' metamärgina ühe või rohkema tähemärgi asemel. Kasuta kaldkriipsu '/' alguses ja lõpus, et kasutada regulaaravaldust." + }, + { + "label": "Variatsioonid", + "description": "Lisa sellele märksõnale valikulisi variatsioone. Näiteks 'linn' jaoks lisa alternatiive 'küla', 'omavalitsus' jne. Punkte antakse, kui kasutaja kasutab ühtegi määratud alternatiividest.", + "entity": "variatsioon", + "field": { + "label": "Märksõna variatsioon" + } + }, + { + "label": "Punktid, seaded ja tagasiside", + "fields": [ + { + "label": "Punktid", + "description": "Punktid, mis kasutaja saab selle märksõna või selle asenduste vastuses kasutamise eest." + }, + { + "label": "Esinemised", + "description": "Määra, kui mitme sõna või selle variatsioonide esinemise eest peaks punkte andma." + }, + { + "label": "Tõstutundlik", + "description": "Teeb kindlaks, et kasutaja sisend peab olema täpselt samasugune nagu vastus." + }, + { + "label": "Andesta pisivead", + "description": "See aktsepteerib väikesed kirjavead (3-9 tähte: 1 viga, rohkem kui 9 tähte: 2 viga)." + }, + { + "label": "Tagasiside, kui märksõna on sisaldatud", + "description": "Seda tagasiside näidatakse, kui kasutaja kasutab seda märksõna või selle alternatiive oma vastuses." + }, + { + "label": "Tagasiside, kui märksõna on puudu", + "description": "Seda tagasiside näidatakse, kui kasutaja ei kasuta seda märksõna või selle alternatiive oma vastuses." + }, + { + "label": "Tagasiside sõna mida näidatakse, kui märksõna on sisaldatud", + "description": "See seade võimaldab sul määrata, millist sõna peaks su tagasiside alguses näitama, kui tekstist leiti märksõna.", + "options": [ + { + "label": "märksõna" + }, + { + "label": "alternatiiv leitud" + }, + { + "label": "vastus antud" + }, + { + "label": "mitte midagi" + } + ] + }, + { + "label": "Tagasiside sõna mida näidatakse, kui märksõna on puudu", + "description": "See seade võimaldab sul määrata, millist sõna peaks su tagasiside alguses näitama, kui tekstist ei leitud märksõna.", + "options": [ + { + "label": "märksõna" + }, + { + "label": "mitte midagi" + } + ] + } + ] + } + ] + } + }, + { + "label": "Üldine tagasiside", + "fields": [ + { + "widgets": [ + { + "label": "Vaikimisi" + } + ], + "label": "Määratle kohandatud tagasiside ükskõik mis tulemusvahemiku jaoks", + "description": "Vajuta \"Lisa vahemik\" nuppu, et lisada nii mitu vahemikku, kui sul vaja on. Näide: 0-20% Halb tulemus, 21-91% Keskmine tulemus, 91-100% Hea tulemus!", + "entity": "vahemik", + "field": { + "fields": [ + { + "label": "Tulemusvahemik" + }, + {}, + { + "label": "Tagasiside määratud tulemusvahemiku jaoks", + "placeholder": "Kirjuta tagasiside" + } + ] + } + } + ] + }, + { + "label": "Käitumise seaded", + "description": "Need seaded lasevad sul juhtida, kuidas ülesanne käitub.", + "fields": [ + { + "label": "Minimaalne karakterite arv", + "description": "Määra minimaalne karakterite arv, mida kasutaja peab sisestama." + }, + { + "label": "Maksimaalne karakterite arv", + "description": "Määra maksimaalne karakterite arv, mida kasutaja saab sisestada." + }, + { + "label": "Sisendivälja suurus", + "description": "Sisendivälja suurus ridades, mida see katab.", + "options": [ + { + "label": "1 rida" + }, + { + "label": "3 rida" + }, + { + "label": "10 rida" + } + ] + }, + { + "label": "Luba \"Proovi uuesti\"", + "description": "Kui valitud, siis õppijad saavad ülesannet uuesti proovida." + }, + { + "label": "Eira punktisüsteemi", + "description": "Kui valitud, siis õppijad näevad ainult sinu poolt märksõnade eest antud tagasisidet, aga mitte oma tulemust." + }, + { + "label": "Punkte peremeeskeskkonnas", + "description": "Kasutatud punktide andmiseks peremeeskeskkonnas ainult vastamiseks (mitte näidatud õppijale)." + }, + { + "label": "Läbi saamise protsent.", + "description": "Läbi saamiseks vajalik protsendimäär." + }, + { + "label": "Omandamise protsent", + "description": "Omandamiseks vajalik protsendimäär. Omandamise protsendimäära alla 100% seadmine vähendab ka vastavalt maksimaalset võimalikku tulemust. Selle eesmärk on anda õpilastele veidi liikumisruumi, mitte \"vastutulelikult vastu võtta\" lahendusi, mis ei sisalda kõiki märksõnu." + }, + { + "label": "Kirjuta üle tõstutundlikkus", + "description": "See seade määrab, kas \"Tõstutundlik\" valik aktiveeritakse kõikidel märksõnadel.", + "options": [ + { + "label": "Lubatud" + }, + { + "label": "Keelatud" + } + ] + }, + { + "label": "Kirjuta üle andesta pisivead", + "description": "See seade määrab, kas \"Andesta pisivead\" valik aktiveeritakse kõikidel märksõnadel.", + "options": [ + { + "label": "Lubatud" + }, + { + "label": "Keelatud" + } + ] + } + ] + }, + { + "label": "Tekst \"Kontrolli\" nupule", + "default": "Kontrolli" + }, + { + "label": "Text for \"Submit\" button", + "default": "Submit" + }, + { + "label": "Tekst \"Proovi uuesti\" nupule", + "default": "Proovi uuesti" + }, + { + "label": "Tekst \"Näita lahendust\" nupule", + "default": "Näita lahendust" + }, + { + "label": "Sisaldatud/puuduvate märksõnade tagasiside sisaldava paneeli pealkiri.", + "default": "Pealkiri" + }, + { + "label": "Silt lahendusele", + "default": "Näidislahendus" + }, + { + "label": "Alles jäänud tähemärke", + "default": "Tähemärke alles: @chars", + "description": "Sõnum alles jäänud tähemärkide jaoks. Sa saad kasutada @chars, mis asendatakse vastava numbriga." + }, + { + "label": "Pole piisavalt tähemärke", + "default": "Sa pead sisestama vähemalt @chars tähemärki!", + "description": "Sõnum näitamaks, et tekstis pole piisavalt tähemärke. Sa saad kasutada @chars, mis asendatakse vastava numbriga." + }, + { + "label": "Salvestamise sõnum", + "description": "Sõnum näitamakas, et tekst on salvestatud.", + "default": "salvestatud" + }, + { + "label": "Sinu vastus (seda ei näidata)", + "description": "Ligipääsetavuse tekst lugeritele kasutamiseks. @score asendatakse punktide arvuga. @total asendatakse maksimaalse võimaliku punktide arvuga.", + "default": "Sa said @score punkti @total-st." + }, + { + "label": "Navigatsioonisõnum (seda ei näidata)", + "description": "Ligipääsetavuse tekst lugeritele kasutamiseks.", + "default": "Navigeeriti vastsisaldatud näidislahendusele tekstiala järel." + }, + { + "label": "Assistive technology description for \"Check\" button", + "default": "Check the answers." + }, + { + "label": "Assistive technology description for \"Show Solution\" button", + "default": "Show the solution. You will be provided with a sample solution." + }, + { + "label": "Assistive technology description for \"Retry\" button", + "default": "Retry the task. You can improve your previous answer if the author allowed that." + } + ] +} \ No newline at end of file diff --git a/activities/module01/essay-395/H5P.Essay-1.4/language/eu.json b/activities/module01/essay-395/H5P.Essay-1.4/language/eu.json new file mode 100644 index 0000000..633e45d --- /dev/null +++ b/activities/module01/essay-395/H5P.Essay-1.4/language/eu.json @@ -0,0 +1,287 @@ +{ + "semantics": [ + { + "label": "Multimedia", + "fields": [ + { + "label": "Mota", + "description": "Galderaren gainean erakusteko aukerazko multimedia." + }, + { + "label": "Desgaitu irudien zooma" + } + ] + }, + { + "label": "Atazaren deskribapena", + "description": "Deskribatu ezazu hemen zure lana. Lanaren deskribapena idazteko testu-eremuaren gainean agertuko da.", + "placeholder": "Laburtu ezazu liburua 500 karaktereetan..." + }, + { + "label": "Laguntza-testua", + "description": "Testu honek erabiltzaileari hasten lagundu beharko lioke.", + "placeholder": "Liburu hau honi buruz da..." + }, + { + "label": "Adibidezko emaitza", + "description": "Nahi baduzu emaitzaren adibide bat gehitu dezakezu ikasleak testua sortu ondoren erakusteko. Adibidezko emaitza deitzen zaio emaitza zuzen bat baino gehiago egon daitekeelako.", + "fields": [ + { + "label": "Sarrera", + "description": "Zure adibidearen inguruko ikasleentzako azalpena gehitu dezakezu. Azalpena soilik erakutsiko da adibide bat ere gehitzen baduzu.", + "placeholder": "Gogoratu ezazu mesedez ez duzula zertan emaitza berbera derrigorrez eman behar. Adibide on bat baino ez da." + }, + { + "label": "Emaitza-adibidearen testua", + "description": "Ikasleak bidalketa egin ondoren \"Erakutsi emaitza\" botoia ikusiko du hemen testu bat idazten baduzu." + } + ] + }, + { + "label": "Hitz-gakoak", + "widgets": [ + { + "label": "Lehenetsitakoa" + } + ], + "entity": "Hitz-gakoa", + "field": { + "label": "Hitz-gakoa", + "fields": [ + { + "label": "Hitz-gakoa", + "description": "Bilatu beharreko hitz-gako edo esaldia. Izartxoa '*' erabili ezazu karaktere bat edo gehiagoren komodin gisa. Barra '/' erabili ezazu hasiera eta amaieran adierazpen erregular bat erabiltzeko." + }, + { + "label": "Aldakuntzak", + "description": "Gehitu hitz-gako honentzako aukerazko bariazioak. Adibidez, 'hiria' gakoaren alternatibak 'herria', 'udalerria'... izan daitezke. Erabiltzaileak puntuak eskuratuko ditu zehaztutako alternatibaren bat idazten badu.", + "entity": "aldakuntza", + "field": { + "label": "Aldakuntzaren hitz-gakoa" + } + }, + { + "label": "Puntuak, Aukerak eta Feedbacka", + "fields": [ + { + "label": "Puntuak", + "description": "Erabiltzaileak erantzunean hitz-gako hau edo alternatibaren bat idazten badu lortuko dituen puntuak." + }, + { + "label": "Gertakariak", + "description": "Hitz-gakoa edo bere aldakuntzei puntuatu beharko diren gertakari kopurua definitzen du." + }, + { + "label": "Bereizi maiuskulak eta minuskulak", + "description": "Erabiltzaileak idatzitakoa erantzunaren berdin-berdina dela ziurtatzen du." + }, + { + "label": "Barkatu akats txikiak", + "description": "Honek letreiatze-akats txikiak onartuko ditu (3-9 karakteretan: akats 1, 9 karaktere baino gehiagotan: 2 akats)." + }, + { + "label": "Feedbacka hitz-gakoa badago", + "description": "Feedback hau erakutsiko da erabiltzaileak erantzunean hitz-gako hau edo bere alternatibak gehitzen baditu." + }, + { + "label": "Feedbacka hitz-gakoa falta bada", + "description": "Feedback hau erakutsiko da erabiltzaileak erantzunean ez badu hitz-gako hau edo bere alternatibak sartzen." + }, + { + "label": "Erakutsi beharrezko feedback-hitza hitz-gakoa badago", + "description": "Aukera honek hitz-gako bat testuan agertuz gero zure feedbackaren aurrean erakutsiko den hitza zehaztea ahalbidetzen du.", + "options": [ + { + "label": "hitz-gakoa" + }, + { + "label": "alternatiba aurkitu da" + }, + { + "label": "emandako erantzuna" + }, + { + "label": "bat ere ez" + } + ] + }, + { + "label": "Erakutsi beharrezko feedback-hitza hitz-gakoa ez badago", + "description": "Aukera honek hitz-gako bat testuan ez bada agertzen zure feedbackaren aurrean erakutsiko den hitza zehaztea ahalbidetzen du.", + "options": [ + { + "label": "hitz-gakoa" + }, + { + "label": "bat ere ez" + } + ] + } + ] + } + ] + } + }, + { + "label": "Feedback Orokorra", + "fields": [ + { + "widgets": [ + { + "label": "Lehenetsitakoa" + } + ], + "label": "Zehaztu ezazu edozein puntuazio-tarterako feedback pertsonalizatua", + "description": "Egin klik \"Gehitu tartea\" botoian behar dituzun tarte guztiak gehitzeko. Adibidez: 0-20% Puntuazio eskasa, 21-91% Batez besteko puntuazioa, 91-100% Puntuazio bikaina!", + "entity": "tartea", + "field": { + "fields": [ + { + "label": "Puntuazio-tartea" + }, + {}, + { + "label": "Zehaztutako tartearentzako feedbacka", + "placeholder": "Idatzi ezazu feedbacka" + } + ] + } + } + ] + }, + { + "label": "Portaeraren ezarpenak", + "description": "Aukera hauek lanaren portaera kontrolatzea ahalbidetzen dizute.", + "fields": [ + { + "label": "Gutxienezko karaktere kopurua", + "description": "Zehaztu ezazu erabiltzaileak idatzi beharreko gutxieneko karaktere kopurua." + }, + { + "label": "Gehieneko karaktere kopurua", + "description": "Zehaztu ezazu erabiltzaileak idatzi dezakeen gehienezko karaktere kopurua." + }, + { + "label": "Sarrera-eremuaren tamaina", + "description": "Sarrera-eremuaren tamaina (erakutsiko dituen errenkada kopurua)", + "options": [ + { + "label": "lerro 1" + }, + { + "label": "3 lerro" + }, + { + "label": "10 lerro" + } + ] + }, + { + "label": "Gaitu \"Saiatu berriro\"", + "description": "Markatuz gero, ikasleek lana berriz egiten saiatu ahalko dira." + }, + { + "label": "Alde batera utzi puntuazioa", + "description": "Markatuz gero, ikasleek emandako hitz-gakoentzako zuk emandako feedbacka ikusiko dute, baina puntuaziorik ez." + }, + { + "label": "Harrera-inguruneko puntuak", + "description": "Harrera-ingurunean soilik erantzun izanagatik puntuak emateko erabilia (ez zaio ikasleari erakusten)." + }, + { + "label": "Gainditzeko ehunekoa", + "description": "Gainditzeko lortu beharreko ehunekoa" + }, + { + "label": "Domeinua erakusteko ehunekoa", + "description": "Domeinua erakusteko lortu beharreko ehunekoa. Domeinua erakusteko ehunekoa %100etik behera zehazteak gehienezko puntuazioa neurri berean jaitsiko du. Ikasleei tarte pixka bat emateko pentsatuta dago, eta ez hitz-gako guztiak ez dituzten emaitzak \"adeitasunez onartzeko\"." + }, + { + "label": "Baliogabetu maiuskulak eta minuskulak bereiztea", + "description": "Aukera honek \"Bereizi maiuskulak eta minuskulak\" aukera hitz-gako guztientzako gaituko den zehazten du.", + "options": [ + { + "label": "Gaituta" + }, + { + "label": "Desgaituta" + } + ] + }, + { + "label": "Baliogabetu akatsak barkatzea", + "description": "Aukera honek \"Barkatu akats txikiak\" aukera hitz-gako guztientzat gaituko den zehazten du.", + "options": [ + { + "label": "Gaituta" + }, + { + "label": "Desgaituta" + } + ] + } + ] + }, + { + "label": "\"Egiaztatu\" botoiarentzako testua", + "default": "Egiaztatu" + }, + { + "label": "\"Bidali\" botoiaren testua", + "default": "Bidali" + }, + { + "label": "\"Saiatu berriro\" botoiarentzako testua", + "default": "Saiatu berriro" + }, + { + "label": "\"Erakutsi emaitza\" botoiaren testua", + "default": "Erakutsi emaitza" + }, + { + "label": "Gehitutako/falta diren hitz-gakoen feedbackaren panelarentzako goiburua", + "default": "Feedbacka" + }, + { + "label": "Emaitzarentzako etiketa", + "default": "Adibidezko emaitza" + }, + { + "label": "Falta diren karaktereak", + "default": "Falta diren karaktereak: @chars", + "description": "Falta diren karaktereentzako mezua. Dagokion zenbakiarekin ordezkatuko den @chars aldagaia erabili dezakezu." + }, + { + "label": "Ez dago karaktere nahikorik", + "default": "Gutxienez @chars karaktere idatzi behar dituzu!", + "description": "Mezuak behar beste karaktere ez dituela adierazteko mezua. Dagokion zenbakiarekin ordezkatuko den @chars aldagaia erabili dezakezu." + }, + { + "label": "Gorde mezua", + "description": "Testua gorde dela adierazteko mezua", + "default": "gordeta" + }, + { + "label": "Zure emaitza (ez erakutsia)", + "description": "Irakurgailuetarako erabilerraztasun testua. @score lortutako puntuazioarekin ordezkatuko da. @total lortu daitezkeen gehienezko puntuekin ordezkatuko da.", + "default": "@total puntutatik @score puntu lortu duzu" + }, + { + "label": "Nabigazio-mezua (ez da erakusten)", + "description": "Irakurgailuetarako erabilerraztasun testua", + "default": "Testu-eremuaren ondoren duela gutxi gehitutako adibidezko erantzunera nabigatuta." + }, + { + "label": "\"Egiaztatu\" botoiaren laguntza-teknologientzako etiketa", + "default": "Egiaztatu erantzunak." + }, + { + "label": "\"Erakutsi emaitza\" botoiaren laguntza-teknologientzako etiketa", + "default": "Erakutsi emaitza. Adibiderako erantzun bat emango zaizu." + }, + { + "label": "\"Saiatu berriro\" botoiaren laguntza-teknologientzako etiketa", + "default": "Ataza berriz egiten saiatu. Egileak baimenduz gero zure aurreko erantzunaren emaitza hobetu dezakezu." + } + ] +} diff --git a/activities/module01/essay-395/H5P.Essay-1.4/language/fi.json b/activities/module01/essay-395/H5P.Essay-1.4/language/fi.json new file mode 100644 index 0000000..daa0536 --- /dev/null +++ b/activities/module01/essay-395/H5P.Essay-1.4/language/fi.json @@ -0,0 +1,287 @@ +{ + "semantics": [ + { + "label": "Media", + "fields": [ + { + "label": "Tyyppi", + "description": "Vapaaehtoinen, esitetään kysymyksen yläpuolella" + }, + { + "label": "Estä kuvan zoomaaminen" + } + ] + }, + { + "label": "Tehtävänkuvaus", + "description": "Kirjoita tähän tehtävänkuvaus. Tämä teksti näytetään tekstinsyöttöalueen yläpuolella.", + "placeholder": "Kirjoita maksimissaan 500 merkin yhteenveto kirjasta..." + }, + { + "label": "Aputeksti", + "description": "Tämä teksti auttaa käyttäjän alkuun tehtävässä", + "placeholder": "Tämä kirja kertoo ...." + }, + { + "label": "Yksinkertainen esimerkkivastaus", + "description": "Voit halutessasi kirjoittaa tähän yksinkertaisen esimerkkivastauksen joka näytetään opiskelijoille sen jälkeen kun he ovat palauttaneet tehtävän. Tämä on nimetty yksinkertaiseksi esimerkkivastaukseksi koska absoluuttisesti oikeaa vastausta ei esseekysymyksiin ole vaan ns. oikeita vastauksia voi olla useita.", + "fields": [ + { + "label": "Esittely", + "description": "Voit halutessasi kirjoittaa tähän tarkemman selvityksen yksinkertaisesta esimerkkivastauksestasi. Tämä näytetään vain jos olet kirjoittanut yksinkertaisen esimerkkivastauksen.", + "placeholder": "Muista ettei yhtä oikeaa vastausta ole ja tehtävänlaatija ei olettanut sinun kirjoittavan täsmälleen samanlaista tekstiä kuin esimerkissä, se on vain esimerkki hyvästä vastauksesta." + }, + { + "label": "Näytä vastaukset -painikkeen teksti", + "description": "Jos kirjoitat tähän tekstiä niin opiskelija näkee \"Show solution\" tehtävän palautettuaan ja näytä vastaukset -painiketta painettuaan tämän tekstin " + } + ] + }, + { + "label": "Avainsanat", + "widgets": [ + { + "label": "Oletus" + } + ], + "entity": "Avainsana", + "field": { + "label": "Avainsana", + "fields": [ + { + "label": "Avainsana", + "description": "Avainsana tai virke jota järjestelmä tarkkailee/etsii automaattisesti. Käytä asteriskia '*' villinä korttina yhdelle tai usemmalle merkille esimerkiksi avainsana *ho jolloin tähän tavupariin päättyvät vastaukset kuten tarmo ja tenho hyväksytään. Käytä kenoviivaa '/' alussa tai lopussa merkitsemään säännöllistä lauseketta." + }, + { + "label": "Variaatiot", + "description": "Lisää halutessasi avainsanalle erilaisia variaatioita jotka hyväksyt. Esimerkiksi avainsanalle auto voit hyväksyä variaatiot biili, kaara, menopeli ja automobiili. Kysymyksestä saa täydet pisteet tietämällä minkä tahansa avainsanavaihtoehdoista oikein.", + "entity": "variation", + "field": { + "label": "Avainsanan variaatio" + } + }, + { + "label": "Pisteet, asetukset ja Palaute.", + "fields": [ + { + "label": "Pisteet", + "description": "Pistemäärä jonka käyttäjä ansaitsee kirjoittamalla tämän avainsanan tai yhdenkään sen variaatioista esseessään." + }, + { + "label": "Esiintymät", + "description": "Määritä kuinka monta kertaa tämän avainsanan on esiinnyttävä tekstissä jotta siitä myönnetään yllämääritellyt pisteet." + }, + { + "label": "Merkkikokoriippuvainen", + "description": "Jos asetat tämän päälle vastauksen on oltava merkkikohtaisesti identtinen esimerkkisi kanssa jotta se hyväksytään eli suuret ja pienet kirjaimet huomioidaan." + }, + { + "label": "Anna anteeksi kirjoitusvirheet", + "description": "Tämä hyväksyy pienet kirjoitusvirheet (3-9 merkkiä väärin: 1 virhe, yli 9 merkkiä väärin: 2 virhettä)" + }, + { + "label": "Palaute jos avainsana mainitaan tekstissä.", + "description": "Tämä palaute näytetään opiskelijalle mikäli avainsana tai jokin sen variaatioista löytyy hänen tekstistään." + }, + { + "label": "Palaute jos avainsana puuttuu tekstistä.", + "description": "Tämä palaute näytetään jos avainsana tai jokin sen variaatioista puuttuu opiskelijan tekstistä." + }, + { + "label": "Sana joka näytetään avainsanan edessä jos avainsana löytyy opiskelijan tekstistä.", + "description": "Tämä asetus mahdollistaa sinun määritellä mikä sana näytetään palautteesi edessä jos määritelty avainsana löytyy opiskelijan tekstistä.", + "options": [ + { + "label": "avainsana" + }, + { + "label": "variaatio löydetty" + }, + { + "label": "kirjoitettu vastaus" + }, + { + "label": "ei yhtään" + } + ] + }, + { + "label": "Sana joka näytetään avainsanan edessä jos avainsana puuttuu opiskelijan tekstistä.", + "description": "Tämä asetus mahdollistaa sinun määritellä mikä sana näytetään palautteesi edessä jos määritelty avainsana puuttuu opiskelijan tekstistä.", + "options": [ + { + "label": "avainsana" + }, + { + "label": "ei yhtään" + } + ] + } + ] + } + ] + } + }, + { + "label": "Yleispalaute", + "fields": [ + { + "widgets": [ + { + "label": "Oletus" + } + ], + "label": "Määritä prosenttimääräiset pisterajat ja tekstipalaute niille", + "description": "Painat \"Add range\" painiketta lisätäksesi niin monta tietuetta kuin tarvitset. Esimerkki: 0-20% Huono arvosana, 21-91% Keskinkertainen arvosana, 91-100% Hyvä arvosana!", + "entity": "range", + "field": { + "fields": [ + { + "label": "Pisteraja" + }, + {}, + { + "label": "Pisterajojen palautetekstit", + "placeholder": "Täytä tähän pisterajan palaute" + } + ] + } + } + ] + }, + { + "label": "Lisäasetukset", + "description": "Nämä asetukset muuttavat miten tehtävä käyttäytyy", + "fields": [ + { + "label": "Minimimerkkimäärä.", + "description": "Minimimäärä merkkejä jotka opiskelijan tulee kirjoittaa jotta hän voi palauttaa tehtävän" + }, + { + "label": "Maksimimerkkimäärä.", + "description": "Maksimimerkkimäärä jonka opiskelija voi kirjoittaa" + }, + { + "label": "Tekstinsyöttökentän koko", + "description": "Tekstinsyöttäkentän koko riveinä.", + "options": [ + { + "label": "1 rivi" + }, + { + "label": "3 riviä" + }, + { + "label": "10 riviä" + } + ] + }, + { + "label": "Salli \"Retry\"", + "description": "Jos päällä opiskelijat voivat suorittaa tehtävän uudelleen alusta" + }, + { + "label": "Ei pisteytystä", + "description": "Jos valittuna opiskelija näkevät vain avansanojen sanallisen palautteen mutta eivät siitä saamiaan pisteitä." + }, + { + "label": "Isäntäympäristön pisteet", + "description": "Pisteet jotka opiskelijalle myönnetään pelkästä vastauksesta (oli se mitä tahansa) (näitä pisteitä ei näytetä opiskelijoille)" + }, + { + "label": "Hyväksymisraja", + "description": "Prosenttimääräinen hyväksymisraja jolla tehtävä lasketaan suoritetuksi" + }, + { + "label": "Mastering percentage", + "description": "Percentage that's necessary for mastering. Setting the mastering percentage below 100 % will lower the maximum possible score accordingly. It's intended to give some leeway to students, not to \"graciously accept\" solutions that do not contain all keywords." + }, + { + "label": "Pakota Merkkikokoriippuvainen asetus", + "description": "Tämä asetus pakottaa päälle tai pois päältä \"Case sensitive\" asetuksen kaikille avainsanoille. ", + "options": [ + { + "label": "Pakota" + }, + { + "label": "Pois päältä" + } + ] + }, + { + "label": "Pakota kirjoitusvirheiden anteeksiantaminen", + "description": "Tämä asetus pakottaa päälle tai pois päältä \"Forgive mistakes\" asetuksen kaikille avainsanoille", + "options": [ + { + "label": "Pakota" + }, + { + "label": "Pois päältä" + } + ] + } + ] + }, + { + "label": "Painikkeen \"Check\" teksti", + "default": "Tarkista" + }, + { + "label": "Text for \"Submit\" button", + "default": "Submit" + }, + { + "label": "Painikkeen \"Retry\" teksti", + "default": "Yritä uudelleen" + }, + { + "label": "Painikkeen \"Show solution\" teksti", + "default": "Näytä vastaukset" + }, + { + "label": "Palauteosion otsikko, tämä osio listaa puuttuvat tai sisältyvät avainsanat.", + "default": "Palaute" + }, + { + "label": "Esimerkkiratkaisun teksti", + "default": "Esimerkkiratkaisu" + }, + { + "label": "Merkkiä jäljellä", + "default": "Merkkiä jäljellä: @chars", + "description": "Teksti jäljellä oleville merkeille. Voit käyttää muuttujaa @chars merkitsemään paikkaa tekstissä johon merkkien lukumäärä merkitään." + }, + { + "label": "Ei tarpeeksi merkkejä", + "default": "Sinun täytyy syöttää vähintään @chars merkkiä!", + "description": "Teksti joka näytetään jos essee ei sisällä tarpeksi merkkejä ja henkilö yrittää palauttaa sen. Voit käyttää muuttujaa @chars merkitsemään paikkaa tekstissä johon merkkien lukumäärä merkitään." + }, + { + "label": "Tallennusviesti", + "description": "Teksti joka näytetään kun viesti on tallennettu.", + "default": "tallennettu" + }, + { + "label": "Sinun tuloksesi", + "description": "Teksti ruudunlukijoille muuttuja @score korvataan henkilön saamalla pistemäärällä ja muuttuja @total tehtävän maksimipistemäärällä.", + "default": "Sait @score pistettä @total pisteestä" + }, + { + "label": "Navigaation teksti", + "description": "Teksti ruudunlukijoille.", + "default": "Navigoitiin esimerkkivastaukseen tekstialueen jälkeen." + }, + { + "label": "Assistive technology description for \"Check\" button", + "default": "Check the answers." + }, + { + "label": "Assistive technology description for \"Show Solution\" button", + "default": "Show the solution. You will be provided with a sample solution." + }, + { + "label": "Assistive technology description for \"Retry\" button", + "default": "Retry the task. You can improve your previous answer if the author allowed that." + } + ] +} \ No newline at end of file diff --git a/activities/module01/essay-395/H5P.Essay-1.4/language/fr.json b/activities/module01/essay-395/H5P.Essay-1.4/language/fr.json new file mode 100644 index 0000000..72a6203 --- /dev/null +++ b/activities/module01/essay-395/H5P.Essay-1.4/language/fr.json @@ -0,0 +1,287 @@ +{ + "semantics": [ + { + "label": "Média", + "fields": [ + { + "label": "Type", + "description": "Média à afficher au-dessus de la question (facultatif)." + }, + { + "label": "Disable image zooming" + } + ] + }, + { + "label": "Description de l'activité", + "description": "Décrivez l'activité. Cette description apparaîtra au dessus de la zone de saisie de texte.", + "placeholder": "Résumez ce livre dans un texte de 500 caractères maximum." + }, + { + "label": "Texte d'aide", + "description": "Ce texte doit aider l'utilisateur à commencer son texte.", + "placeholder": "Ce livre a pour thème..." + }, + { + "label": "Exemple de solution", + "description": "Optionnel. Cette solution apparaît après l'introduction de la réponse. Elle sert d'exemple sans être l'unique réponse correcte.", + "fields": [ + { + "label": "Introduction", + "description": "Optionnel. Vous pouvez fournir des explications sur cette solution. Les explications ne sont affichées que si vous ajoutez un exemple.", + "placeholder": "Rappelez-vous que chaque réponse est unique et ne doit pas forcément correspondre à cette solution. Ce n'est qu'un bon exemple." + }, + { + "label": "Texte pour la solution", + "description": "L'utilisateur verra un bouton \"Afficher la solution\" après soumission si vous entrez un texte ici." + } + ] + }, + { + "label": "Mots clés", + "widgets": [ + { + "label": "Par défaut" + } + ], + "entity": "Mot clé", + "field": { + "label": "Mot clé", + "fields": [ + { + "label": "Mot clé", + "description": "Mot clé ou phrase que le texte doit comporter. Utilisez un astérisque '*' comme masque de remplacement d'un ou plusieurs caractères. Use a slash '/' at the beginning and the end to use a regular expression." + }, + { + "label": "Réponses alternatives", + "description": "Optionnel. Ajoutez des alternatives pour ce mot clé. Exemple: Pour 'cité', ajoutez 'ville', 'municipalité', etc. Toutes les alternatives indiquées vont être acceptées comme de bonnes réponses.", + "entity": "mot-clé alternatif", + "field": { + "label": "mot clé" + } + }, + { + "label": "Points, Options et Feedback", + "fields": [ + { + "label": "Points", + "description": "Points que l'utilisateur gagne si le mot clé ou ses alternatives sont inclues dans la réponse." + }, + { + "label": "Apparitions", + "description": "Définit le nombre d'apparations de ce mot clé ou de ses alternatives qui doivent être récompensées par des points." + }, + { + "label": "Sensible à la casse", + "description": "Impose que la saisie de l'utilisateur soit strictement identique à la réponse attendue." + }, + { + "label": "Accepter de petites fautes d'orthographe", + "description": "Si cette option est activée, les réponses avec des fautes d'orthographe seront également considérées comme correctes (de 3 à 9 caractères : 1 faute acceptée, plus que 9 caractères : 2 fautes acceptées)." + }, + { + "label": "Feedback si le mot clé est inclus", + "description": "Ce feedback est affiché si le mot clé ou ses alternatives sont inclus dans la réponse." + }, + { + "label": "Feedback si le mot clé est absent", + "description": "Ce feedback est affiché si le mot clé ou ses alternatives ne sont pas inclus dans la réponse." + }, + { + "label": "Feedback word shown if keyword included", + "description": "This option allows you to specify which word should be shown in front of your feedback if a keyword was found in the text.", + "options": [ + { + "label": "keyword" + }, + { + "label": "alternative found" + }, + { + "label": "answer given" + }, + { + "label": "none" + } + ] + }, + { + "label": "Feedback word shown if keyword missing", + "description": "This option allows you to specify which word should be shown in front of your feedback if a keyword was not found in the text.", + "options": [ + { + "label": "keyword" + }, + { + "label": "none" + } + ] + } + ] + } + ] + } + }, + { + "label": "Feedback Global", + "fields": [ + { + "widgets": [ + { + "label": "Par défaut" + } + ], + "label": "Définit le feedback pour chaque intervalle de scores", + "description": "Cliquez sur \"Ajouter Intervalle\" pour ajouter autant d'intervalles que vous le souhaitez. Exemple: 0-20% Mauvais score, 21-91% Score moyen, 91-100% Score excellent !", + "entity": "intervalle", + "field": { + "fields": [ + { + "label": "Intervalle de scores" + }, + {}, + { + "label": "Feedback de l'intervalle de scores défini", + "placeholder": "Définir le feedback" + } + ] + } + } + ] + }, + { + "label": "Paramètres comportementaux", + "description": "Ces options permettent de contrôler le déroulement de l'activité.", + "fields": [ + { + "label": "Nombre minimum de caractères", + "description": "Indiquez le nombre minimum de caractères que doit entrer l'utilisateur." + }, + { + "label": "Nombre maximum de caractères", + "description": "Indiquez le nombre maximum de caractères que peut entrer l'utilisateur." + }, + { + "label": "Taille de la zone de remplissage", + "description": "La taille de la zone de remplissage en nombre de lignes qu'elle permet de saisir.", + "options": [ + { + "label": "1 ligne" + }, + { + "label": "3 lignes" + }, + { + "label": "10 lignes" + } + ] + }, + { + "label": "Activer \"Recommencer\"", + "description": "Permet aux utilisateurs de recommencer." + }, + { + "label": "Ignorer le score obtenu", + "description": "Si coché, les utilisateurs verront uniquement les messages de feedback que vous avez fournis pour les mots clés, mais pas le score obtenu." + }, + { + "label": "Points in host environment", + "description": "Used to award points in host environment merely for answering (not shown to learner)." + }, + { + "label": "Seuil de réussite", + "description": "Pourcentage à atteindre pour réussir l'activité." + }, + { + "label": "Seuil de maîtrise", + "description": "Pourcentage à atteindre pour maîtriser l'activité." + }, + { + "label": "Surcharger la sensibilité à la casse", + "description": "Cette option indique si l'option \"Sensible à la casse\" va être activée pour tous les mot clés.", + "options": [ + { + "label": "Activée" + }, + { + "label": "Désactivée" + } + ] + }, + { + "label": "Accepter des petites fautes d'orthographe", + "description": "Cete option indique si l'option \"Accepter de petites fautes d'orthopraphe\" va être activée pour tous les mot clés.", + "options": [ + { + "label": "Activée" + }, + { + "label": "Désactivée" + } + ] + } + ] + }, + { + "label": "Texte du bouton \"Vérifier\"", + "default": "Vérifier" + }, + { + "label": "Text for \"Submit\" button", + "default": "Submit" + }, + { + "label": "Texte pour le bouton \"Recommencer\"", + "default": "Recommencer" + }, + { + "label": "Texte pour le bouton \"Montrer la solution\"", + "default": "Montrer la solution" + }, + { + "label": "En-tête du panneau affichant le feedback pour les mots clés utilisés et manquants", + "default": "Feedback" + }, + { + "label": "Titre pour la solution", + "default": "Exemple de solution" + }, + { + "label": "Caractères restants", + "default": "Il reste : @chars", + "description": "Message indiquant le nombre de caractères restants. La variable @chars va être remplacée par le nombre correspondant." + }, + { + "label": "Caractères manquants", + "default": "Il faudrait introduire au moins @chars caractères !", + "description": "Message pour indiquer que le texte ne contient pas suffisamment de caractères. La variable @chars va être remplacée par le nombre correspondant." + }, + { + "label": "Sauvegarder le message", + "description": "Message indiquant que le texte a été sauvegardé.", + "default": "texte sauvegardé" + }, + { + "label": "Your result (not displayed)", + "description": "Accessibility text used for readspeakers. @score will be replaced by the number of points. @total will be replaced by the maximum possible points.", + "default": "You got @score out of @total points" + }, + { + "label": "Navigation message (not displayed)", + "description": "Accessibility text used for readspeakers", + "default": "Navigated to newly included sample solution after textarea." + }, + { + "label": "Assistive technology description for \"Check\" button", + "default": "Check the answers." + }, + { + "label": "Assistive technology description for \"Show Solution\" button", + "default": "Show the solution. You will be provided with a sample solution." + }, + { + "label": "Assistive technology description for \"Retry\" button", + "default": "Retry the task. You can improve your previous answer if the author allowed that." + } + ] +} \ No newline at end of file diff --git a/activities/module01/essay-395/H5P.Essay-1.4/language/gl.json b/activities/module01/essay-395/H5P.Essay-1.4/language/gl.json new file mode 100644 index 0000000..3f8f7de --- /dev/null +++ b/activities/module01/essay-395/H5P.Essay-1.4/language/gl.json @@ -0,0 +1,287 @@ +{ + "semantics": [ + { + "label": "Medios", + "fields": [ + { + "label": "Tipo", + "description": "Medios opcionais amosados enriba da pregunta." + }, + { + "label": "Desactivar zoom de imaxes" + } + ] + }, + { + "label": "Descrición da tarefa", + "description": "Describe aquí a túa tarefa. A descrición aparecerá enriba da área de entrada de texto.", + "placeholder": "Resume o libro en 500 caracteres ..." + }, + { + "label": "Texto de axuda", + "description": "Este texto debería axudar a que o usuario soupese como comezar a tarefa.", + "placeholder": "Este libro trata de ..." + }, + { + "label": "Exemplo de solución", + "description": "Podes engadir un exemplo de solución opcional que se amosará despois de que o alumno cree un texto. Chámase exemplo de solución porque probablemente non sexa a única solución posible.", + "fields": [ + { + "label": "Introdución", + "description": "Podes proporcionar explicacións opcionais sobre o teu exemplo. As explicacións só se amosarán se ti tamén engades un exemplo.", + "placeholder": "Por favor, lembra que non tes porqué dar exactamente esta mesma solución. Só é un bo exemplo." + }, + { + "label": "Texto do exemplo de solución", + "description": "O alumno verá un botón \"Amosar solución\" despois de enviar o seu traballo se escribes un texto aquí." + } + ] + }, + { + "label": "Palabras chave", + "widgets": [ + { + "label": "Por defecto" + } + ], + "entity": "Palabra chave", + "field": { + "label": "Palabra chave", + "fields": [ + { + "label": "Palabra chave", + "description": "Palabra ou frase chave que buscar. Podes usar un asterísco como comodín para un ou máis caracteres. Usa unha barra '/' ao principio e ao final para usar unha expresión regular." + }, + { + "label": "Variacións", + "description": "Engade variacións opcionais para esta palabra chave. Exemplo: Para unha 'cidade', engade as alternativas 'pobo', 'municipalidade' etc. O usuario conseguirá puntos se inclúe calquera das alternativas especificadas.", + "entity": "variación", + "field": { + "label": "Variación da palabra chave" + } + }, + { + "label": "Puntos, Opcións e Retroalimentación", + "fields": [ + { + "label": "Puntos", + "description": "Puntos que o usuario recibirá se inclúe na resposta esta palabra chave ou as súas alternativas." + }, + { + "label": "Coincidencias", + "description": "Define cantas coincidencias da palabra chave ou as súas variacións deberían recibir puntos." + }, + { + "label": "Distinguir entre maiúsculas e minúsculas", + "description": "Fau que a entrada do usuario teña que ser exactamente igual que a resposta." + }, + { + "label": "Perdoar erros menores", + "description": "Aceptar erros ortográficos menores (3-9 caracteres: 1 erro, máis de 9 caracteres: 2 erros)." + }, + { + "label": "Retroalimentación para palabra chave incluída", + "description": "Esta retroalimentación amosarase se o usuario inclúe na súa resposta esta palabra chave ou as súas alternativas." + }, + { + "label": "Retroalimentación para palabra chave ausente", + "description": "Esta retroalimentación amosarase se o usuario non inclúe na súa resposta esta palabra chave ou as súas alternativas." + }, + { + "label": "Palabra de retroalimentación amosada se se inclúe unha palabra chave", + "description": "Esta opción permite especificar que palabra debería amosarse diante da túa retroalimentación se se atopa unha plabra chave no texto.", + "options": [ + { + "label": "palabra chave" + }, + { + "label": "alternativa atopada" + }, + { + "label": "resposta dada" + }, + { + "label": "ninguha" + } + ] + }, + { + "label": "Palabra de retroalimentación en caso de ausencia de palabra chave", + "description": "Esta opción permite especificar que palabra debería amosarse diante da túa retroalimentación se non se atopa unha plabra chave no texto.", + "options": [ + { + "label": "palabra chave" + }, + { + "label": "ningunha" + } + ] + } + ] + } + ] + } + }, + { + "label": "Retroalimentación Xeral", + "fields": [ + { + "widgets": [ + { + "label": "Por defecto" + } + ], + "label": "Definir retroalimentación personalizada para calquera rango de puntuación", + "description": "Preme o botón \"Engadir rango\" para engadir todos os rangos que precises. Exemplo: 0-20% Puntuación mala, 21-91% Puntuación media, 91-100% Puntuación xenial!", + "entity": "rango", + "field": { + "fields": [ + { + "label": "Rango de puntuación" + }, + {}, + { + "label": "Retroalimentación para rango de puntuación definido", + "placeholder": "Escribe a retroalimentación" + } + ] + } + } + ] + }, + { + "label": "Configuración de comportamento", + "description": "Estas opcións permitiranche controlar o comportamento da tarefa.", + "fields": [ + { + "label": "Número mínimo de caracteres", + "description": "Especifica o número mínimo de caracteres que debe escribir o usuario." + }, + { + "label": "Número máximo de caracteres", + "description": "Especifica o número máximo de caracteres que pode escribir o usuario." + }, + { + "label": "Tamaño do campo de entrada", + "description": "O número de liñas que ocupará o campo de entrada", + "options": [ + { + "label": "1 liña" + }, + { + "label": "3 liñas" + }, + { + "label": "10 liñas" + } + ] + }, + { + "label": "Activar \"Reintentar\"", + "description": "Os usuarios poderán reintentar a tarefa se se activa." + }, + { + "label": "Ignorar puntuación", + "description": "Se se activa, os usuarios verán a retroalimentación proporcionada para as palabras chave pero non a puntuación." + }, + { + "label": "Puntos no entorno anfitrión", + "description": "Usada para dar puntos no entorno anfitrión simplemente por contestar (non amosados ao usuario)." + }, + { + "label": "Porcentaxe para aprobar", + "description": "Porcentaxe necesaria para aprobar" + }, + { + "label": "Porcentaxe de mestría", + "description": "Porcentaxe requirido para a mestría. Unha porcentaxe de mestría por debaixo do 100 % fará que baixe a puntuación máxima proporcionalmente. O seu propósito é dar aos alumnos certa marxe de manobra, non \"aceptar xenerosamente\" as solucióons que non conteñan todas as plabras chave." + }, + { + "label": "Anular distinción entre maiúsculas e minúsculas", + "description": "Esta opción determina se se activará a opción \"Distinguir entre maiúsculas e minúsculas\" para todas as palabras chave.", + "options": [ + { + "label": "Activada" + }, + { + "label": "Desactivada" + } + ] + }, + { + "label": "Anular perdoar erros", + "description": "Esta opción determina se se activará a opción \"Perdoar erros\" para todas as palabras chave.", + "options": [ + { + "label": "Activada" + }, + { + "label": "Desactivada" + } + ] + } + ] + }, + { + "label": "Texto para o botón \"Comprobar\"", + "default": "Comprobar" + }, + { + "label": "Text for \"Submit\" button", + "default": "Submit" + }, + { + "label": "Texto para o botón \"Reintentar\"", + "default": "Reintentar" + }, + { + "label": "Texto para o botón \"Amosar solución\"", + "default": "Amosar solución" + }, + { + "label": "Cabeceira para o panel que contén a retroalimentación para palabras chave incluídas ou ausentes", + "default": "Retroalimentación" + }, + { + "label": "Etiqueta para a solución", + "default": "Exemplo de solución" + }, + { + "label": "Caracteres restantes", + "default": "Caracteres restantes: @chars", + "description": "Mensaxe para caracteres restantes. Podes usar @chars que se substituirá polo número correspondente." + }, + { + "label": "Caracteres insufucientes", + "default": "Debes escribir polo menos @chars caracteres!", + "description": "Mensaxe para indicar que o texto non contén caracteres abondos. Podes usar @chars que se substituirá polo número correspondente." + }, + { + "label": "Mensaxe de gardado", + "description": "Mensaxe indicando que o texto foi gardado", + "default": "gardado" + }, + { + "label": "O teu resultado (non amosado)", + "description": "Texto de accesibilidade usado para os lectores de pantalla. @score substituirase polo número de puntos e @total polo número máximo de puntos posibles.", + "default": "Conseguiches @score puntos de @total" + }, + { + "label": "Mensaxe de navegación (non amosado)", + "description": "Texto de accesibilidade usado para os lectores de pantalla", + "default": "Navegaches ao exemplo de solución recentemente incluído despois da área de texto." + }, + { + "label": "Descrición para as tecnoloxías de asistencia do botón \"Comprobar\"", + "default": "Comproba as respostas." + }, + { + "label": "Descrición para as tecnoloxías de asistencia do botón \"Amosar Solución\"", + "default": "Amosar a solución. Proporcionarase un exemplo de solución." + }, + { + "label": "Descrición para as tecnoloxías de asistencia do botón \"Reintentar\"", + "default": "Reintenta a tarefa. Podes mellorar a resposta anterior se o autor o permite." + } + ] +} diff --git a/activities/module01/essay-395/H5P.Essay-1.4/language/it.json b/activities/module01/essay-395/H5P.Essay-1.4/language/it.json new file mode 100644 index 0000000..2ebf6b6 --- /dev/null +++ b/activities/module01/essay-395/H5P.Essay-1.4/language/it.json @@ -0,0 +1,287 @@ +{ + "semantics": [ + { + "label": "Media", + "fields": [ + { + "label": "Tipo", + "description": "Media facoltativo da mostrare sopra la domanda" + }, + { + "label": "Disabilita lo zoom dell'immagine" + } + ] + }, + { + "label": "Descrizione attività", + "description": "Descrivi qui il tuo compito. La descrizione apparirà sopra la casella per l'immissione del testo", + "placeholder": "Sintetizza il libro in 500 caratteri..." + }, + { + "label": "Testo di aiuto", + "description": "Questo testo dovrebbe aiutare a iniziare il lavoro", + "placeholder": "Questo libro parla di..." + }, + { + "label": "Esempio di soluzione", + "description": "Se vuoi, puoi aggiungere una soluzione di esempio che viene mostrata dopo che lo studente ha creato un testo. È detta di esempio perché probabilmente non sarà l'unica soluzione.", + "fields": [ + { + "label": "Introduzione", + "description": "Se vuoi, puoi lasciare agli studenti qualche spiegazione sul tuo esempio", + "placeholder": "Ricorda che non esiste un'unica soluzione. Questo è solo un esempio valido" + }, + { + "label": "Testo della soluzione di esempio", + "description": "Dopo l'invio, lo studente vedrà un pulsante \"Mostra soluzione\" se qui è stato inserito del testo" + } + ] + }, + { + "label": "Parole chiave", + "widgets": [ + { + "label": "Predefinito" + } + ], + "entity": "Parole chiave", + "field": { + "label": "Parole chiave", + "fields": [ + { + "label": "Parola chiave", + "description": "Parola chiave o frase da cercare. Usa un asterisco '*' come carta jolly per significare uno o più caratteri" + }, + { + "label": "Alternative", + "description": "Se vuoi, puoi aggiungere delle alternative a questa parola chiave. Per esempio, per una 'nazione' puoi indicare alternative come 'stato', 'Paese' ecc. Se lo studente utilizza le alternative qui specificate riceverà il punteggio che gli spetta per la risposta giusta", + "entity": "alternativa", + "field": { + "label": "Parola chiave alternativa" + } + }, + { + "label": "Punti, opzioni e feedback", + "fields": [ + { + "label": "Punti", + "description": "Punti che lo studente otterrà se nella risposta usa questa parola chiave o una sua alternativa" + }, + { + "label": "Occorrenze", + "description": "Specifica quante occorrenze della parola chiave o delle sue alternative danno diritto a ricevere punti" + }, + { + "label": "Maiuscolo/minuscolo", + "description": "Assicurati che il testo inserito sia esattamente quello giusto" + }, + { + "label": "Tralascia gli errori meno gravi", + "description": "Questa opzione permette di accettare errori ortografici meno gravi (da 3 a 9 caratteri: 1 errore; più di 9 characters: 2 errori)" + }, + { + "label": "Feedback per la parola chiave", + "description": "Questo feedback sarà visualizzato se nella risposta lo studente usa questa parola chiave o una sua alternativa" + }, + { + "label": "Feedback in mancanza della parola chiave", + "description": "Questo feedback sarà visualizzato se nella risposta lo studente non usa né questa parola chiave, né una sua alternativa" + }, + { + "label": "Parola di feedback mostrata se c'è la parola chiave", + "description": "Questa opzione permette di specificare quale parola dovrebbe essere mostrata come feedback se una data parola chiave è presente nel testo", + "options": [ + { + "label": "parola chiave" + }, + { + "label": "alternativa trovata" + }, + { + "label": "risposta data" + }, + { + "label": "nessuna" + } + ] + }, + { + "label": "Parola di feedback mostrata se manca la parola chiave", + "description": "Questa opzione permette di specificare quale parola dovrebbe essere mostrata come feedback se una parola chiave non è presente nel testo", + "options": [ + { + "label": "parola chiave" + }, + { + "label": "nessuna" + } + ] + } + ] + } + ] + } + }, + { + "label": "Feedback complessivo", + "fields": [ + { + "widgets": [ + { + "label": "Predefinito" + } + ], + "label": "Specifica un feedback per ogni intervallo di punteggio", + "description": "Clicca sul pulsante \"Aggiungi intervallo\" per aggiungere gli intervalli che ti servono. Per esempio: 0-20%, Punteggio scarso; 21-90%, Punteggio medio; 91-100% Punteggio ottimo!", + "entity": "intervallo", + "field": { + "fields": [ + { + "label": "Intervallo di punteggio" + }, + {}, + { + "label": "Feedback per l'intervallo di punteggio definito", + "placeholder": "Scrivi qui il feedback" + } + ] + } + } + ] + }, + { + "label": "Impostazioni di esecuzione", + "description": "Queste opzioni permettono di controllare il comportamento del compito", + "fields": [ + { + "label": "Numero minimo di caratteri", + "description": "Specifica il numero minimo di caratteri che l'utente deve immettere" + }, + { + "label": "Numero massimo di caratteri", + "description": "Specifica il numero massimo di caratteri che l'utente deve immettere" + }, + { + "label": "Dimensione del campo di immissione", + "description": "La dimensione della casella di testo in numero di righe", + "options": [ + { + "label": "1 riga" + }, + { + "label": "3 righe" + }, + { + "label": "10 righe" + } + ] + }, + { + "label": "Attiva \"Riprova\"", + "description": "Se selezionato, gli studenti possono riprovare a fare il compito" + }, + { + "label": "Ignora il punteggio", + "description": "Se selezionato, gli studenti vedranno soltanto il feedback che hai fornito per le parole chiave, ma non avranno nessun punteggio" + }, + { + "label": "Punti assegnati in piattaforma", + "description": "Usato per assegnare punti in piattaforma per il solo aver dato una risposta (non mostrato allo studente)" + }, + { + "label": "Percentuale di superamento", + "description": "Percentuale necessaria per superare la prova" + }, + { + "label": "Percentuale di eccellenza", + "description": "Percentuale necessaria per l'eccellenza. Impostare la percentuale di eccellenza al di sotto del 100% ridurrà conseguentemente il massimo punteggio ottenibile. Lo scopo non è ammettere soluzioni che non contengano tutte le parole chiave ma offrire agli studenti un qualche margine di manovra" + }, + { + "label": "Non considerare \"maiuscolo/minuscolo\"", + "description": "Consente di specificare se l'opzione \"maiuscolo/minuscolo\" debba essere attiva su tutte le parole chiave", + "options": [ + { + "label": "Abilitata" + }, + { + "label": "Disabilitata" + } + ] + }, + { + "label": "Non considerare \"Tralascia gli errori meno gravi\"", + "description": "Consente di specificare se l'opzione \"Tralascia gli errori meno gravi\" debba essere abilitata su tutte le parole chiave", + "options": [ + { + "label": "Abilitata" + }, + { + "label": "Disabilitata" + } + ] + } + ] + }, + { + "label": "Testo per il pulsante \"Verifica\"", + "default": "Verifica" + }, + { + "label": "Text for \"Submit\" button", + "default": "Submit" + }, + { + "label": "Testo per il pulsante \"Riprova\"", + "default": "Riprova" + }, + { + "label": "Testo per il pulsante \"Mostra soluzione\"", + "default": "Mostra soluzione" + }, + { + "label": "Intestazione della scheda con il feedback per le parole chiave", + "default": "Feedback" + }, + { + "label": "Etichetta per la soluzione", + "default": "Esempio di soluzione" + }, + { + "label": "Caratteri rimanenti", + "default": "Caratteri rimanenti: @chars", + "description": "Messaggio per i caratteri rimanenti. Puoi usare @chars, che sarà rimpiazzato dal numero corrispondente" + }, + { + "label": "Caratteri insufficienti", + "default": "Devi inserire almeno @chars caratteri!", + "description": "Messaggio per indicare che il testo prodotto non è sufficientemente lungo. Puoi usare @chars, che sarà rimpiazzato dal numero corrispondente" + }, + { + "label": "Salva messaggio", + "description": "Messaggio per indicare che il testo è stato salvato", + "default": "salvato" + }, + { + "label": "Il tuo risultato (non visualizzato)", + "description": "Testo di accessibilità utilizzato per lettori vocali. @score sarà sostituito dal numero di punti. @total sarà sostituito dai punti massimi possibili", + "default": "Il tuo punteggio è di @score su @total" + }, + { + "label": "Messaggio di navigazione (non visualizzato)", + "description": "Testo di accessibilità utilizzato per lettori vocali", + "default": "Passato alla soluzione di esempio appena inclusa dopo l'area di testo" + }, + { + "label": "Assistive technology description for \"Check\" button", + "default": "Check the answers." + }, + { + "label": "Assistive technology description for \"Show Solution\" button", + "default": "Show the solution. You will be provided with a sample solution." + }, + { + "label": "Assistive technology description for \"Retry\" button", + "default": "Retry the task. You can improve your previous answer if the author allowed that." + } + ] +} diff --git a/activities/module01/essay-395/H5P.Essay-1.4/language/lv.json b/activities/module01/essay-395/H5P.Essay-1.4/language/lv.json new file mode 100644 index 0000000..2f37249 --- /dev/null +++ b/activities/module01/essay-395/H5P.Essay-1.4/language/lv.json @@ -0,0 +1,287 @@ +{ + "semantics": [ + { + "fields": [ + { + "label": "Tips", + "description": "Papildu multivide, kuru atspoguļot virs jautājuma." + }, + { + "label": "Atspējot attēla tālummaiņu" + } + ], + "label": "Multivide" + }, + { + "label": "Uzdevuma apraksts", + "description": "Aprakstiet savu uzdevumu šeit. Uzdevuma apraksts parādīsies virs teksta ievades apgabala.", + "placeholder": "Apkopojiet grāmatu 500 rakstzīmēs..." + }, + { + "label": "Palīdzības teksts", + "placeholder": "Šī grāmata ir par...", + "description": "Šim tekstam vajadzētu palīdzēt lietotājam sākt darbu." + }, + { + "label": "Risinājuma paraugs", + "fields": [ + { + "label": "Ievads", + "description": "Ja vēlaties variet atstāt izglītojamajiem dažus paskaidrojumus par savu piemēru. Paskaidrojumi tiks parādīti tikai tad, ja pievienosiet arī piemēru.", + "placeholder": "Lūdzu, atcerieties, ka jums nebija paredzēts iesniegt tieši tādu pašu risinājumu. Tas ir tikai labs piemērs." + }, + { + "label": "Risinājuma parauga teksts", + "description": "Pēc iesniegšanas izglītojamais redzēs pogu \"Rādīt risinājumu\", ja šeit norādīsiet tekstu." + } + ], + "description": "Ja vēlaties variet pievienot risinājuma paraugu, kas tiks parādīts pēc tam, kad izglītojamais būs izveidojis tekstu. To sauc par risinājuma paraugu, jo, iespējams, uzdevumam nav tikai viens risinājums." + }, + { + "label": "Atslēgvārdi", + "widgets": [ + { + "label": "Pēc noklusējuma" + } + ], + "entity": "Atslēgvārds", + "field": { + "label": "Atslēgvārds", + "fields": [ + { + "label": "Atslēgvārds", + "description": "Atslēgvārds vai frāze, ko meklēt. Izmantojiet zvaigznīti '*' kā aizstājējzīmi vienai vai vairākām rakstzīmēm. Lai izmantotu regulāro izteiksmi, sākumā un beigās izmantojiet slīpsvītru '/'." + }, + { + "entity": "variācija", + "field": { + "label": "Atslēgvārda variācija" + }, + "label": "Variācijas", + "description": "Pievienojiet šim atslēgvārdam dažādus variantus. Piemērs: 'Lielpilsēta' pievienojiet alternatīvas 'pilsēta', 'valstspilsēta' utt. Punkti tiks piešķirti, ja lietotājs iekļauj kādu no norādītajām alternatīvām." + }, + { + "label": "Punkti, izvēles un atgriezeniskā saite", + "fields": [ + { + "label": "Punkti", + "description": "Punkti, ko lietotājs iegūs, ja atbildē iekļaus šo atslēgvārdu vai tā alternatīvas." + }, + { + "label": "Gadījumi", + "description": "Nosakiet, par cik atslēgvārda vai tā variantu gadījumiem ir jāpiešķir punkti." + }, + { + "label": "Reģistrjutīgs", + "description": "Nodrošina, ka lietotāja ievade ir tieši tāda pati kā atbilde." + }, + { + "label": "Atļaut nelielas kļūdas", + "description": "Tiks pieņemtas nelielas pareizrakstības kļūdas (3-9 rakstzīmes: 1 kļūda, vairāk nekā 9 rakstzīmes: 2 kļūdas)." + }, + { + "label": "Atgriezeniskā saite, ja atslēgvārds ir iekļauts", + "description": "Šī atgriezeniskā saite tiks parādīta, ja lietotājs atbildē iekļaus šo atslēgvārdu vai tā alternatīvas." + }, + { + "label": "Atgriezeniskā saite, ja atslēgvārds nav iekļauts", + "description": "Šī atgriezeniskā saite tiks parādīta, ja lietotājs atbildē neiekļaus šo atslēgvārdu vai tā alternatīvas." + }, + { + "label": "Atgriezeniskās saites vārds ko rādīt, ja atslēgvārds ir iekļauts", + "description": "Šī opcija ļauj norādīt, kurš vārds ir jāparāda pirms atsauksmēm, ja tekstā tika atrasts atslēgvārds.", + "options": [ + { + "label": "atslēgvārds" + }, + { + "label": "atrasta alternatīva" + }, + { + "label": "sniegta atbilde" + }, + { + "label": "neviens" + } + ] + }, + { + "label": "Atgriezeniskās saites vārds ko rādīt, ja atslēgvārds nav iekļauts", + "options": [ + { + "label": "atslēgvārds" + }, + { + "label": "neviens" + } + ], + "description": "Šī opcija ļauj norādīt, kurš vārds ir jāparāda pirms atgriezeniskās saites, ja atslēgvārds tekstā netika atrasts." + } + ] + } + ] + } + }, + { + "label": "Kopējā atgriezeniskā saite", + "fields": [ + { + "widgets": [ + { + "label": "Pēc noklusējuma" + } + ], + "label": "Iestatiet pielāgotu atgriezenisko saiti katram rezultātu intervālam", + "entity": "diapazons", + "field": { + "fields": [ + { + "label": "Rezultātu diapazons" + }, + {}, + { + "label": "Norādītā diapazona atgriezeniskā saite", + "placeholder": "Aizpildiet atgriezenisko saiti" + } + ] + }, + "description": "Klikšķiniet pogu \"Pievienot diapazonu\", lai pievienotu tik diapazonus cik vēlaties. Piemēram, 0-20% Slikts rezultāts, 21-91% Viduvējs rezultāts, 91-100% Lielisks rezultāts!" + } + ] + }, + { + "fields": [ + { + "label": "Minimālais rakstzīmju skaits", + "description": "Norādiet minimālo rakstzīmju skaitu, kas lietotājam jāievada." + }, + { + "label": "Maksimālais rakstzīmju skaits", + "description": "Norādiet maksimālo rakstzīmju skaitu, ko lietotājs var ievadīt." + }, + { + "description": "Ievades lauka lielums rindās", + "options": [ + { + "label": "1 rinda" + }, + { + "label": "3 rindas" + }, + { + "label": "10 rindas" + } + ], + "label": "Ievades lauka lielums" + }, + { + "label": "Atļaut \"Mēģināt vēlreiz\"", + "description": "Ja atzīmēts, izglītojamie var mēģināt vēlreiz izpildīt uzdevumu." + }, + { + "label": "Ignorēt punktu skaitīšanu", + "description": "Ja atzīmēts, izglītojamie redzēs tikai atsauksmes, ko sniedzāt par atslēgvārdiem, bet ne rezultātu." + }, + { + "label": "Punkti galvenajā vidē", + "description": "Izmanto, lai piešķirtu punktus galvenajā vidē par atbildes sniegšanas faktu (netiek rādīts izglītojamajam)." + }, + { + "label": "Nokārtošanas procents", + "description": "Procentuālā daļa, kas nepieciešama pārbaudījuma nokārtošanai" + }, + { + "label": "Lietpratības procents", + "description": "Procentuālā daļa, kas nepieciešama apguvei lietpratēja līmenī. Iestatot apguves procentuālo vērtību zem 100%, attiecīgi samazināsies maksimālais iespējamais punktu skaits. Tas ir paredzēts, lai sniegtu izglītojamajiem zināmu rezervi, nevis \"visžēlīgi\" pieņemtu risinājumus, kas nesatur visus atslēgvārdus." + }, + { + "label": "Ignorēt reģistrjutību", + "description": "Šis iestatījums nosaka, vai opcija “Reģistrjutīgs” tiks piemērota visiem atslēgvārdiem.", + "options": [ + { + "label": "Iespējots" + }, + { + "label": "Atspējots" + } + ] + }, + { + "label": "Ignorēt kļūdu piedošanu", + "description": "Šis iestatījums nosaka, vai opcija \"Piedod kļūdas\" tiks piemērota visiem atslēgvārdiem.", + "options": [ + { + "label": "Iespējots" + }, + { + "label": "Atspējots" + } + ] + } + ], + "label": "Uzvedības iestatījumi", + "description": "Šie iestatījumi ļaus jums kontrolēt uzdevuma uzvedību." + }, + { + "label": "Pogas \"Pārbaudīt\" teksts", + "default": "Pārbaudīt" + }, + { + "label": "Pogas \"Iesniegt\" teksts", + "default": "Iesniegt" + }, + { + "label": "Pogas \"Mēģināt vēlreiz\" teksts", + "default": "Mēģināt vēlreiz" + }, + { + "label": "Pogas \"Parādīt risinājumu\" teksts", + "default": "Parādīt risinājumu" + }, + { + "label": "Atgriezeniskās saites par iekļautajiem/trūkstošajiem atslēgvārdiem paneļa galvene", + "default": "Atgriezeniskā saite" + }, + { + "default": "Risinājuma paraugs", + "label": "Risinājuma etiķete" + }, + { + "label": "Atlikušās rakstzīmes", + "default": "Atlikušās rakstzīmes: @chars", + "description": "Ziņojums atlikušajām rakstzīmēm. Variet izmantot @chars, kas tiks aizstāts ar atbilstošo rakstzīmju skaitu." + }, + { + "label": "Nepietiekams rakstzīmju skaits", + "default": "Jāievada vismaz @chars rakstzīmes!", + "description": "Ziņojums, kas norāda, ka tekstā nav pietiekami daudz rakstzīmju. Variet izmantot @chars, kas tiks aizstāts ar atbilstošo rakstzīmju skaitu." + }, + { + "label": "Saglabāšanas ziņojums", + "description": "Ziņojums, kas norāda, ka teksts ir saglabāts", + "default": "saglabāts" + }, + { + "label": "Jūsu rezultāts (netiek parādīts)", + "default": "Jūs saņēmāt @score no @total punktiem", + "description": "Pieejamības teksts, ko izmanto asistīvās tehnoloģijas. @score tiks aizstāts ar punktu skaitu. @total tiks aizstāts ar maksimāli iespējamo punktu skaitu." + }, + { + "label": "Navigācijas ziņojums (netiek parādīts)", + "description": "Pieejamības teksts, ko izmanto asistīvās tehnoloģijas", + "default": "Pāriets uz jaunveidoto parauga risinājumu pēc teksta apgabala." + }, + { + "default": "Pārbaudīt atbildes.", + "label": "Pogas \"Pārbaudīt\" apraksts asistīvajām tehnoloģijām" + }, + { + "label": "Pogas \"Rādīt risinājumu\" apraksts priekš asistīvajām tehnoloģijām", + "default": "Parādīt risinājumu. Jums tiks nodrošināts risinājuma paraugs." + }, + { + "default": "Mēģināt vēlreiz izpildīt uzdevumu. Jūs varat uzlabot savu iepriekšējo atbildi, ja autors to atļāvis.", + "label": "Pogas \"Mēģināt vēlreiz\" apraksts priekš asistīvajām tehnoloģijām" + } + ] +} diff --git a/activities/module01/essay-395/H5P.Essay-1.4/language/nb.json b/activities/module01/essay-395/H5P.Essay-1.4/language/nb.json new file mode 100644 index 0000000..bf364f2 --- /dev/null +++ b/activities/module01/essay-395/H5P.Essay-1.4/language/nb.json @@ -0,0 +1,287 @@ +{ + "semantics": [ + { + "label": "Media", + "fields": [ + { + "label": "Type", + "description": "Optional media to display above the question." + }, + { + "label": "Disable image zooming" + } + ] + }, + { + "label": "Task description", + "description": "Describe your task here. The task description will appear above text input area.", + "placeholder": "Summarize the book in 500 characters ..." + }, + { + "label": "Help text", + "description": "This text should help the user to get started.", + "placeholder": "This book is about ..." + }, + { + "label": "Sample solution", + "description": "You can optionally add a sample solution that's shown after the student created a text. It's called sample solution because there probably is not only one solution.", + "fields": [ + { + "label": "Introduction", + "description": "You can optionally leave the students some explanations about your example. The explanations will only show up if you add an example, too.", + "placeholder": "Please remember that you were not expected to come up with the exact same solution. It's just a good example." + }, + { + "label": "Sample solution text", + "description": "The student will see a \"Show solution\" button after submitting if you provide some text here." + } + ] + }, + { + "label": "Keywords", + "widgets": [ + { + "label": "Standard" + } + ], + "entity": "Keyword", + "field": { + "label": "Keyword", + "fields": [ + { + "label": "Keyword", + "description": "Keyword or phrase to look for. Use an asterisk '*' as a wildcard for one or more characters. Use a slash '/' at the beginning and the end to use a regular expression." + }, + { + "label": "Variations", + "description": "Add optional variations for this keyword. Example: For a 'city' add alternatives 'town', 'municipality' etc. Points will be awarded if the user includes any of the specified alternatives.", + "entity": "variation", + "field": { + "label": "Keyword variation" + } + }, + { + "label": "Points, Options and Feedback", + "fields": [ + { + "label": "Points", + "description": "Points that the user will get if he/she includes this keyword or its alternatives in the answer." + }, + { + "label": "Occurrences", + "description": "Define how many occurrences of the keyword or its variations should be awarded with points." + }, + { + "label": "Case sensitive", + "description": "Makes sure the user input has to be exactly the same as the answer." + }, + { + "label": "Forgive minor mistakes", + "description": "This will accept minor spelling mistakes (3-9 characters: 1 mistake, more than 9 characters: 2 mistakes)." + }, + { + "label": "Feedback if keyword included", + "description": "This feedback will be displayed if the user includes this keyword or its alternatives in the answer." + }, + { + "label": "Feedback if keyword missing", + "description": "This feedback will be displayed if the user doesn’t include this keyword or its alternatives in the answer." + }, + { + "label": "Feedback word shown if keyword included", + "description": "This option allows you to specify which word should be shown in front of your feedback if a keyword was found in the text.", + "options": [ + { + "label": "keyword" + }, + { + "label": "alternative found" + }, + { + "label": "answer given" + }, + { + "label": "none" + } + ] + }, + { + "label": "Feedback word shown if keyword missing", + "description": "This option allows you to specify which word should be shown in front of your feedback if a keyword was not found in the text.", + "options": [ + { + "label": "keyword" + }, + { + "label": "none" + } + ] + } + ] + } + ] + } + }, + { + "label": "Overall Feedback", + "fields": [ + { + "widgets": [ + { + "label": "Default" + } + ], + "label": "Define custom feedback for any score range", + "description": "Click the \"Add range\" button to add as many ranges as you need. Example: 0-20% Bad score, 21-91% Average Score, 91-100% Great Score!", + "entity": "range", + "field": { + "fields": [ + { + "label": "Score Range" + }, + {}, + { + "label": "Feedback for defined score range", + "placeholder": "Fill in the feedback" + } + ] + } + } + ] + }, + { + "label": "Behavioural settings", + "description": "These options will let you control how the task behaves.", + "fields": [ + { + "label": "Minimum number of characters", + "description": "Specify the minimum number of characters that the user must enter." + }, + { + "label": "Maximum number of characters", + "description": "Specify the maximum number of characters that the user can enter." + }, + { + "label": "Input field size", + "description": "The size of the input field in amount of lines it will cover", + "options": [ + { + "label": "1 line" + }, + { + "label": "3 lines" + }, + { + "label": "10 lines" + } + ] + }, + { + "label": "Enable \"Retry\"", + "description": "If checked, learners can retry the task." + }, + { + "label": "Ignore scoring", + "description": "If checked, learners will only see the feedback that you provided for the keywords, but no score." + }, + { + "label": "Points in host environment", + "description": "Used to award points in host environment merely for answering (not shown to learner)." + }, + { + "label": "Passing percentage", + "description": "Percentage that's necessary for passing" + }, + { + "label": "Mastering percentage", + "description": "Percentage that's necessary for mastering. Setting the mastering percentage below 100 % will lower the maximum possible score accordingly. It's intended to give some leeway to students, not to \"graciously accept\" solutions that do not contain all keywords." + }, + { + "label": "Override case sensitive", + "description": "This option determines if the \"Case sensitive\" option will be activated for all keywords.", + "options": [ + { + "label": "Enabled" + }, + { + "label": "Disabled" + } + ] + }, + { + "label": "Override forgive mistakes", + "description": "This option determines if the \"Forgive mistakes\" option will be activated for all keywords.", + "options": [ + { + "label": "Enabled" + }, + { + "label": "Disabled" + } + ] + } + ] + }, + { + "label": "Text for \"Check\" button", + "default": "Check" + }, + { + "label": "Text for \"Submit\" button", + "default": "Submit" + }, + { + "label": "Text for \"Retry\" button", + "default": "Retry" + }, + { + "label": "Text for \"Show solution\" button", + "default": "Show solution" + }, + { + "label": "Header for panel containing feedback for included/missing keywords", + "default": "Feedback" + }, + { + "label": "Label for solution", + "default": "Sample solution" + }, + { + "label": "Remaining characters", + "default": "Remaining characters: @chars", + "description": "Message for remaining characters. You can use @chars which will be replaced by the corresponding number." + }, + { + "label": "Not enough characters", + "default": "You must enter at least @chars characters!", + "description": "Message to indicate that the text doesn't contain enough characters. You can use @chars which will be replaced by the corresponding number." + }, + { + "label": "Save message", + "description": "Message indicating that the text has been saved", + "default": "saved" + }, + { + "label": "Your result (not displayed)", + "description": "Accessibility text used for readspeakers. @score will be replaced by the number of points. @total will be replaced by the maximum possible points.", + "default": "You got @score out of @total points" + }, + { + "label": "Navigation message (not displayed)", + "description": "Accessibility text used for readspeakers", + "default": "Navigated to newly included sample solution after textarea." + }, + { + "label": "Assistive technology description for \"Check\" button", + "default": "Check the answers." + }, + { + "label": "Assistive technology description for \"Show Solution\" button", + "default": "Show the solution. You will be provided with a sample solution." + }, + { + "label": "Assistive technology description for \"Retry\" button", + "default": "Retry the task. You can improve your previous answer if the author allowed that." + } + ] +} diff --git a/activities/module01/essay-395/H5P.Essay-1.4/language/nl.json b/activities/module01/essay-395/H5P.Essay-1.4/language/nl.json new file mode 100644 index 0000000..a830e4b --- /dev/null +++ b/activities/module01/essay-395/H5P.Essay-1.4/language/nl.json @@ -0,0 +1,287 @@ +{ + "semantics": [ + { + "label": "Media", + "fields": [ + { + "label": "Type", + "description": "Optionele media, die boven de vraag wordt getoond." + }, + { + "label": "Beeld zoomen uitschakelen" + } + ] + }, + { + "label": "Taakomschrijving", + "description": "Beschrijf hier je taak. Deze zal boven het tekstinvoerveld verschijnen.", + "placeholder": "Vat het boek in maximaal 500 tekens samen ..." + }, + { + "label": "Helptekst", + "description": "Deze tekst dient de gebruiker te helpen bij het starten.", + "placeholder": "Dit boek gaat over ..." + }, + { + "label": "Voorbeeld oplossing", + "description": "Je kunt optioneel een voorbeeldoplossing toevoegen, die wordt getoond wordt nadat de gebruiker de tekst heeft geschreven. Het wordt een voorbeeldoplossing genoemd omdat het waarschijnlijk niet de enige oplossing is.", + "fields": [ + { + "label": "Introductie", + "description": "Optioneel kun je de gebruikers uitleg geven over jouw voorbeeld. De uitleg verschijnt alleen als je ook een voorbeeld toevoegt.", + "placeholder": "Onthoud dat er niet van je wordt verwacht, dat je met de exact dezelfde oplossing komt. Het is gewoon een goed voorbeeld." + }, + { + "label": "Voorbeeld oplossingstekst", + "description": "De gebruiker zal een \"Toon oplossing\"-knop zien na het indienen als je hier tekst plaatst." + } + ] + }, + { + "label": "Trefwoorden", + "widgets": [ + { + "label": "Standaard" + } + ], + "entity": "Trefwoord", + "field": { + "label": "Trefwoord", + "fields": [ + { + "label": "Trefwoord", + "description": "Trefwoord of zinsdeel waarnaar moet worden gezocht. Gebruik een asterisk '*' als jokerteken voor één of meerdere tekens. Gebruik een schuine streep '/' aan het begin en het einde om een reguliere expressie te gebruiken." + }, + { + "label": "Variaties", + "description": "Voeg optioneel variaties toe voor dit trefwoord. Voorbeeld: Voor een 'stad' voeg alternatieven toe als 'plaats', 'gemeente' etc. Punten worden toegekend als de gebruiker een van de opgegeven alternatieven hanteert.", + "entity": "variatie", + "field": { + "label": "Trefwoord variatie" + } + }, + { + "label": "Punten, opties en feedback", + "fields": [ + { + "label": "Punten", + "description": "Punten die de gebruiker krijgt als hij/zij dit trefwoord of de alternatieven in het antwoord opneemt." + }, + { + "label": "Verschijningen", + "description": "Geef op hoeveel punten, aan het verschenen trefwoord of de varianten ervan, moeten worden toegekend." + }, + { + "label": "Hoofdlettergevoelig", + "description": "Zorgt ervoor dat de invoer van de gebruiker exact hetzelfde is als het antwoord." + }, + { + "label": "Kleine vergissingen negeren", + "description": "Dit zal kleine spelfouten accepteren (3-9 tekens: 1 fout, meer dan 9 tekens: 2 fouten)." + }, + { + "label": "Feedback als het trefwoord is opgenomen", + "description": "Deze feedback wordt getoond als de gebruiker dit trefwoord of de alternatieven in het antwoord opneemt." + }, + { + "label": "Feedback als het trefwoord ontbreekt", + "description": "Deze feedback wordt getoond als de gebruiker dit trefwoord of de alternatieven niet in het antwoord opneemt." + }, + { + "label": "De getoonde feedback als het trefwoord is opgenomen", + "description": "Met deze optie kun je opgeven welk woord voorafgaand aan je feedback moet worden weergegeven als er een trefwoord in de tekst is gevonden.", + "options": [ + { + "label": "trefwoord" + }, + { + "label": "alternatief gevonden" + }, + { + "label": "antwoord gegeven" + }, + { + "label": "geen" + } + ] + }, + { + "label": "De getoonde feedback als het trefwoord ontbreekt", + "description": "Met deze optie kun je opgeven welk woord voorafgaand aan je feedback moet worden weergegeven als er geen trefwoord in de tekst is gevonden.", + "options": [ + { + "label": "trefwoord" + }, + { + "label": "geen" + } + ] + } + ] + } + ] + } + }, + { + "label": "Algehele feedback", + "fields": [ + { + "widgets": [ + { + "label": "Standaard" + } + ], + "label": "Definieer aangepaste feedback voor elke scorereeks", + "description": "Druk op de \"Voeg scorereeks\"-knop om zoveel reeksen toe te voegen als nodig. Voorbeeld: 0-20% Onvoldoende, 21-91% Gemiddelde score, 91-100% Uitstekende score!", + "entity": "reeks", + "field": { + "fields": [ + { + "label": "Scorereeks" + }, + {}, + { + "label": "Feedback voor de gedefinieerde scorereeks", + "placeholder": "Vul de feedback in" + } + ] + } + } + ] + }, + { + "label": "Gedragsinstellingen", + "description": "Met deze opties kun je bepalen hoe de taak zich gedraagt.", + "fields": [ + { + "label": "Minimum aantal tekens", + "description": "Bepaal het minimum aantal tekens dat de gebruiker moet invoeren." + }, + { + "label": "Maximum aantal tekens", + "description": "Bepaal het maximum aantal tekens dat de gebruiker kan invoeren." + }, + { + "label": "Invoerveld grootte", + "description": "De grootte van het invoerveld uitgedrukt in het aantal regels dat het omvat", + "options": [ + { + "label": "1 regel" + }, + { + "label": "3 regels" + }, + { + "label": "10 regels" + } + ] + }, + { + "label": "Schakel \"Opnieuw\" in", + "description": "Indien aangevinkt, kunnen gebruikers de taak opnieuw proberen." + }, + { + "label": "Negeer score", + "description": "Indien aangevinkt, zien de gebruikers alleen de feedback die je hebt gegeven voor de trefwoorden, maar geen score." + }, + { + "label": "Punten in de hostingomgeving", + "description": "Dit wordt gebruikt om in de hostingomgeving alleen punten toe te kennen voor het beantwoorden (deze worden niet getoond aan de gebruiker)." + }, + { + "label": "Slagingspercentage", + "description": "Het percentage dat nodig is om te slagen" + }, + { + "label": "Beheersingspercentage", + "description": "Het percentage dat nodig is om de stof te beheersen. Door de beheersingsscore lager dan 100 % in te stellen wordt ook de maximaal mogelijke score lager. Het is bedoeld om speelruimte te geven aan studenten, om oplossingen die niet alle trefwoorden bevatten, niet zomaar te accepteren." + }, + { + "label": "Overschrijf hoofdlettergevoeligheid", + "description": "Deze optie bepaalt of de \"Hooflettergevoelig\" instelling wordt geactiveerd voor alle trefwoorden.", + "options": [ + { + "label": "Ingeschakeld" + }, + { + "label": "Uitgeschakeld" + } + ] + }, + { + "label": "Overschrijf fouten negeren", + "description": "Deze optie bepaalt of de \"Kleine fouten negeren\" instelling wordt geactiveerd voor alle trefwoorden.", + "options": [ + { + "label": "Ingeschakeld" + }, + { + "label": "Uitgeschakeld" + } + ] + } + ] + }, + { + "label": "Tekst voor \"Controleer\"-knop", + "default": "Controleer" + }, + { + "label": "Tekst voor \"Verzend\"-knop", + "default": "Verzend" + }, + { + "label": "Tekst voor \"Opnieuw\"-knop", + "default": "Opnieuw" + }, + { + "label": "Tekst voor \"Toon oplossing\"-knop", + "default": "Toon oplossing" + }, + { + "label": "Koptekst voor het feedbackpaneel met opgenomen/ontbrekende trefwoorden", + "default": "Feedback" + }, + { + "label": "Label voor oplossing", + "default": "Voorbeeld oplossing" + }, + { + "label": "Resterende tekens", + "default": "Resterende tekens: @chars", + "description": "Bericht voor resterende tekens. Je kunt @chars gebruiken, die worden vervangen door het bijbehorende aantal." + }, + { + "label": "Niet genoeg tekens", + "default": "Je moet minstens @chars tekens invoeren!", + "description": "Bericht om aan te geven dat de tekst niet genoeg tekens bevat. Je kan @chars gebruiken, die worden vervangen door het bijbehorende aantal." + }, + { + "label": "Opslaan bericht", + "description": "Bericht om aan te geven dat de tekst is opgeslagen", + "default": "opgeslagen" + }, + { + "label": "Je resultaat (niet getoond)", + "description": "Toegankelijkheidstekst voor schermlezers. @score wordt vervangen door het aantal punten. @total wordt vervangen door het maximum aantal punten.", + "default": "Je hebt @score van de @total punten" + }, + { + "label": "Navigatie bericht (niet getoond)", + "description": "Toegankelijkheidstekst voor schermlezers", + "default": "Genavigeerd naar recent ingevoegde voorbeeld oplossing na het tekstinvoerveld." + }, + { + "label": "Ondersteunende technologie beschrijving voor \"Controleer\"-knop", + "default": "Controleer de antwoorden." + }, + { + "label": "Ondersteunende technologie beschrijving voor \"Toon oplossing\"-knop", + "default": "Toon de oplossing. Je krijgt een voorbeeld oplossing aangeboden." + }, + { + "label": "Ondersteunende technologie beschrijving voor \"Opnieuw\"-knop", + "default": "Probeer de opdracht opnieuw. Je kunt je vorige antwoord verbeteren als de auteur dat toestaat." + } + ] +} diff --git a/activities/module01/essay-395/H5P.Essay-1.4/language/ru.json b/activities/module01/essay-395/H5P.Essay-1.4/language/ru.json new file mode 100644 index 0000000..64c7478 --- /dev/null +++ b/activities/module01/essay-395/H5P.Essay-1.4/language/ru.json @@ -0,0 +1,287 @@ +{ + "semantics": [ + { + "label": "Медиа", + "fields": [ + { + "label": "Тип", + "description": "Необязательная медиа, отображающаяся над вопросом." + }, + { + "label": "Отключить приближение изображения" + } + ] + }, + { + "label": "Описание задания", + "description": "Опишите задание. Этот текст отобразиться над областью ввода.", + "placeholder": "Резюимируйте книгу используя не менее 500 символов..." + }, + { + "label": "Вспомогающий текст", + "description": "Этот текст должен помочь пользователю с началом.", + "placeholder": "Эта книга о том..." + }, + { + "label": "Пример решения", + "description": "Вы можете добавить пример решения, который покажется после того, как пользователь ввёл свой текст. Называется примером решения, потому что у задания, вероятно, нет единственного верного решения.", + "fields": [ + { + "label": "Введение", + "description": "Вы можете добавить объяснения своего примера (необязательно). Объяснения покажутся в случае, если Вы добавили пример решения.", + "placeholder": "Пожалуйста, помните, что от вас не ожидается точно такое же решение. Это всего лишь хороший пример." + }, + { + "label": "Текст примера решения", + "description": "Если Вы напишите текст примера, пользователь увидит кнопку \"Показать решение\" после подтверждения своего ответа." + } + ] + }, + { + "label": "Ключевые слова", + "widgets": [ + { + "label": "По умолчанию" + } + ], + "entity": "Ключевые слова", + "field": { + "label": "Ключевое слово", + "fields": [ + { + "label": "Ключевое слово", + "description": "Ключевое слово или фраза для поиска. Используйте звёздочку '*' для одного или нескольких символов. Используйте слэш '/' в начале и в конце для использования выражения." + }, + { + "label": "Вариации", + "description": "Добавьте вариации для этого ключевого слова. Пример: Для слова 'город' добавьте альтернативу 'центр', 'мегаполис' и тд. Баллы будут засчитаны в случае использования одного из назначенных альтернатив.", + "entity": "вариация", + "field": { + "label": "Вариация ключевого слова" + } + }, + { + "label": "Баллы, настройки и обратная связь", + "fields": [ + { + "label": "Баллы", + "description": "Баллы, которые пользователь получит в случае, если использует ключевые слова или альтернативы в ответе." + }, + { + "label": "Частота выступления", + "description": "Определите, в каком количестве слова или их вариации будут зачислять баллы." + }, + { + "label": "Чувствительность", + "description": "Определяет, что пользователем введённый текст и ответ должны быть одинаковы." + }, + { + "label": "Прощать незначительные ошибки", + "description": "Принимает мелкие орфографические ошибки (3-9 символов: 1 ошибка, более 9 символов: 2 ошибки)." + }, + { + "label": "Обратная связь в случае использования ключевого слова", + "description": "Эта обратная связь отобразиться, если пользователь использует ключевое слово или его альтернативы." + }, + { + "label": "Обратная связь в случае отсутствия ключевого слова", + "description": "Эта обратная связь отобразиться, если пользователь не использует ключевое слово или его альтернативы." + }, + { + "label": "Слово обратной связи при использовании ключевого слова", + "description": "Настройка позволяет решить, какое слово будет отображено в качестве обратной связи при обнаружении ключевого слова в тексте.", + "options": [ + { + "label": "ключевое слово" + }, + { + "label": "альтернатива найдена" + }, + { + "label": "отвечено" + }, + { + "label": "ничего" + } + ] + }, + { + "label": "Слово обратной связи при отсутствии ключевого слова", + "description": "Настройка позволяет решить, какое слово будет отображено в качестве обратной связи, если ключевое слово не будет найдено.", + "options": [ + { + "label": "ключевое слово" + }, + { + "label": "ничего" + } + ] + } + ] + } + ] + } + }, + { + "label": "Общая обратная связь", + "fields": [ + { + "widgets": [ + { + "label": "По умолчанию" + } + ], + "label": "Определить обычную обратную связь для любого диапазона баллов", + "description": "Нажмите кнопку \"Добавить диапазон\" для добавления необходимого количества диапазонов. Пример: 0-20% Низкий результат, 21-91% Средний результат, 91-100% Отличный результат!", + "entity": "диапазон", + "field": { + "fields": [ + { + "label": "Диапазон баллов" + }, + {}, + { + "label": "обратная связь для определённого диапазона баллов", + "placeholder": "Заполните обратную связь" + } + ] + } + } + ] + }, + { + "label": "Настройки", + "description": "Эти настройки помогут вам управлять поведением задания.", + "fields": [ + { + "label": "Минимальное число символов", + "description": "Установите минимальное число символов, который пользователь должен ввести." + }, + { + "label": "Максимальное число символов", + "description": "Установите максимальное число символов, который пользователь должен ввести." + }, + { + "label": "Размер области ввода", + "description": "Размер области ввода в количестве содержащихся строк", + "options": [ + { + "label": "1 строка" + }, + { + "label": "3 строки" + }, + { + "label": "10 строк" + } + ] + }, + { + "label": "Разрешить \"Повторить\"", + "description": "При разрешении пользователь может повторить задание." + }, + { + "label": "Игнорировать оценивание", + "description": "При разрешении пользователь увидит только обратную связь, связвнную с ключевыми словами, но не баллы." + }, + { + "label": "Баллы в главной среде", + "description": "Используется для начисления баллов в среде только за ответы (скрыто от пользователей)." + }, + { + "label": "Проходной процент", + "description": "Проценты, необходимые для прохождения" + }, + { + "label": "Процент освоения", + "description": "Процент, необходимый для освоения. При установлении процента менее 100% снизится соответственно возможный максимум. Он предназначен для того, чтобы дать студентам некоторую свободу действий, а не \"любезно принять\" решения, которые не содержат все ключевые слова." + }, + { + "label": "Заглушить чувствительность", + "description": "Эта настройка поможет установить, будет ли \"чувствительность\" активирована для всех ключевых слов.", + "options": [ + { + "label": "Разрешить" + }, + { + "label": "Отключить" + } + ] + }, + { + "label": "Заглушить прощение орфографических ошибок", + "description": "Эта настройка поможет установить, будет ли \"прощение незначительных ошибок\" активирована для всех ключевых слов.", + "options": [ + { + "label": "Разрешить" + }, + { + "label": "Отключить" + } + ] + } + ] + }, + { + "label": "Текст для кнопки \"Проверить\" ", + "default": "Проверить" + }, + { + "label": "Text for \"Submit\" button", + "default": "Submit" + }, + { + "label": "Текст для кнопки \"Повторить\" ", + "default": "Повторить" + }, + { + "label": "Текст для кнопки \"Показать решение\" ", + "default": "Показать решение" + }, + { + "label": "Заголовок для панели обратной связи с отсутствующими/совпадающими ключевыми словами", + "default": "Обратная связь" + }, + { + "label": "Ярлык для решения", + "default": "Пример решения" + }, + { + "label": "Оставшиеся символы", + "default": "Оставшиеся символы: @chars", + "description": "Сообщение об оставшихся символах. Можете использовать @chars, который будет заменён на соответствующую цифру." + }, + { + "label": "Недостаточно символов", + "default": "Вы должны использовать ещё хотя бы @chars символов!", + "description": "Сообщение, определяющее, что текст содержит недостаточное количество символов. Можете использовать @chars, который будет заменён на соответствующую цифру." + }, + { + "label": "Сохранить сообщение", + "description": "Сообщение о том, что текст сохранён", + "default": "сохранено" + }, + { + "label": "Ваш результат (не отображается)", + "description": "Текст, используемый для ассистирующих технологии. @score будет заменено количеством баллов. @total будет заменено на максимальное возможное количество баллов.", + "default": "У тебя @score из @total баллов" + }, + { + "label": "Сообщение о навигации (не отображается)", + "description": "Текст, используемый для ассистирующих технологии", + "default": "Навигация после текстовой области примера решения." + }, + { + "label": "Assistive technology description for \"Check\" button", + "default": "Check the answers." + }, + { + "label": "Assistive technology description for \"Show Solution\" button", + "default": "Show the solution. You will be provided with a sample solution." + }, + { + "label": "Assistive technology description for \"Retry\" button", + "default": "Retry the task. You can improve your previous answer if the author allowed that." + } + ] +} \ No newline at end of file diff --git a/activities/module01/essay-395/H5P.Essay-1.4/language/sl.json b/activities/module01/essay-395/H5P.Essay-1.4/language/sl.json new file mode 100644 index 0000000..8d1a152 --- /dev/null +++ b/activities/module01/essay-395/H5P.Essay-1.4/language/sl.json @@ -0,0 +1,287 @@ +{ + "semantics": [ + { + "label": "Mediji", + "fields": [ + { + "label": "Tip", + "description": "Neobvezna nastavitev dodatnega medija za prikaz nad vprašanjem." + }, + { + "label": "Onemogoči povečavo slike" + } + ] + }, + { + "label": "Navodilo udeležencem", + "description": "Opis reševanja zadane naloge.", + "placeholder": "Povzemi knjigo v 500 znakih ..." + }, + { + "label": "Pomoč udeležencem", + "description": "Besedilo udeležencem pomaga pri začetku pisanja.", + "placeholder": "Ta knjiga opisuje ..." + }, + { + "label": "Vzorčni primer rešitve", + "description": "Neobvezen primer besedila, ki se udeležencu prikaže po lastnem vnosu. Gre za vzorec, saj enoznačna rešitev najverjetneje ne obstaja.", + "fields": [ + { + "label": "Pojasnilo", + "description": "Neobvezno pojasnilo vzorčnega primera. Prikazano je le, če je na voljo tudi primer.", + "placeholder": "Esej ne zahteva popolnoma enakega vnosa. To je zgolj vzorčen primer besedila, ki bi bil ustrezen." + }, + { + "label": "Besedilo vzorčnega primera", + "description": "Udeležencu se prikaže po izbiri gumba \"Prikaži rešitev\"." + } + ] + }, + { + "label": "Ključne besede", + "widgets": [ + { + "label": "Privzeto" + } + ], + "entity": "ključno besedo", + "field": { + "label": "Ključna beseda", + "fields": [ + { + "label": "Ključna beseda", + "description": "Iskana ključna beseda ali besedna zveza. Zvezdica '*' nadomesti en ali več znakov. Regularne izraze se na vsaki strani omeji s poševnicama '/'." + }, + { + "label": "Alternative", + "description": "Neobvezne alternative za ključno besedo, ki se štejejo kot enako pravilen odgovor. Primer: 'besedilo' se lahko zapiše tudi kot 'tekst'.", + "entity": "alternativa", + "field": { + "label": "Alternativa ključne besede" + } + }, + { + "label": "Točke, možnosti in povratna informacija", + "fields": [ + { + "label": "Točke", + "description": "Prejete točke za vključeno ključno besedo oz. alternative." + }, + { + "label": "Pojavitve", + "description": "Število pojavitev, ko se posamezna ključna beseda točkuje." + }, + { + "label": "Loči velike/male črke", + "description": "Razlikuje med zapisom v velikih ali malih tiskanih črkah." + }, + { + "label": "Toleriraj manjše napake", + "description": "Nastavitev tolerance in upoštevanje pravilnosti odgovora kljub manjšim napakam (npr. 1 napačen znak v besedah med 3 do 9 znaki, 2 napačna znaka v besedah dolgih nad 9 znakov)." + }, + { + "label": "Povratna informacija ob vnosu ključne besede", + "description": "Povratna informacija se prikaže, če udeleženec v odgovoru vnese ključno besedo." + }, + { + "label": "Povratna informacija ob manjkajoči ključni besedi", + "description": "Povratna informacija se prikaže, če udeleženec v odgovoru ne vnese ključne besede." + }, + { + "label": "Odgovora ob najdeni ključni besedi", + "description": "Izbran odgovor je prikazan pred povratno informacijo, ko je najdena tudi ključna beseda.", + "options": [ + { + "label": "ključna beseda" + }, + { + "label": "najdena alternativa ključne besede" + }, + { + "label": "upoštevan odgovor udeleženca" + }, + { + "label": "prazno polje" + } + ] + }, + { + "label": "Odgovor ob manjkajoči ključni besedi", + "description": "Izbran odgovor je prikazan pred povratno informacijo, ko ključna beseda manjka.", + "options": [ + { + "label": "ključna beseda" + }, + { + "label": "prazno polje" + } + ] + } + ] + } + ] + } + }, + { + "label": "Splošna povratna informacija", + "fields": [ + { + "widgets": [ + { + "label": "Privzeto" + } + ], + "label": "Določi ločeno povratno informacijo za vsak razpon rezultatov", + "description": "Kliknite gumb \"Dodaj razpon\" za dodajanje dodatnih razponov. Primer: 0-20 % Slab rezultat, 21-91 % Povprečen rezultat, 91-100 % Odličen rezultat!", + "entity": "razpon", + "field": { + "fields": [ + { + "label": "Razpon rezultatov" + }, + {}, + { + "label": "Povratna informacija za definiran razpon rezultatov", + "placeholder": "Vnesite povratno informacijo" + } + ] + } + } + ] + }, + { + "label": "Nastavitve interakcije", + "description": "Nastavitve omogočajo nadzor nad interakcijo aktivnosti za udeležence.", + "fields": [ + { + "label": "Najmanjše število znakov", + "description": "Določitev dolžine najmanjšega dovoljenega obsega besedila." + }, + { + "label": "Največje število znakov", + "description": "Določitev dolžine največjega dovoljenega obsega besedila." + }, + { + "label": "Velikost vnosnega polja", + "description": "Velikost določa število vrstic vnosnega polja", + "options": [ + { + "label": "1 vrstica" + }, + { + "label": "3 vrstice" + }, + { + "label": "10 vrstic" + } + ] + }, + { + "label": "Omogoči gumb \"Poskusi ponovno\"", + "description": "Udeležencem je dovoljen ponoven vnos besedila." + }, + { + "label": "Ne točkuj", + "description": "Udeležencem se pokažejo zgolj povratne informacije. Vnos se ne točkuje." + }, + { + "label": "Točke v učnem okolju", + "description": "Točke so podeljene zgolj za beleženje odgovora in udeležencu niso prikazane." + }, + { + "label": "Prag za napredovanje", + "description": "Odstotek, ki je potreben za uspešen zaključek naloge." + }, + { + "label": "Prag za obvladanje vsebine", + "description": "Odstotek, ki je potreben za obvladanje vsebine. Odstotek nižji od 100% bo sorazmerno prilagodil tudi največje možno število točk. Nastavitev je namenjena za pridobitev manevrskega prostora udeležencev in ne za nižanje standardov znanja." + }, + { + "label": "Privzeto loči velike/male črke", + "description": "Nastavitev vpliva na vse vnesene ključne besede (npr. onemogočeno povsod, omogočeno individualno).", + "options": [ + { + "label": "Omogočeno" + }, + { + "label": "Onemogočeno" + } + ] + }, + { + "label": "Privzeto toleriraj manjše napake", + "description": "Nastavitev vpliva na vse vnesene ključne besede (npr. onemogočeno povsod, omogočeno individualno).", + "options": [ + { + "label": "Omogočeno" + }, + { + "label": "Onemogočeno" + } + ] + } + ] + }, + { + "label": "Besedilo za gumb \"Preveri\"", + "default": "Preveri" + }, + { + "label": "Text for \"Submit\" button", + "default": "Submit" + }, + { + "label": "Besedilo za gumb \"Poskusi ponovno\"", + "default": "Poskusi ponovno" + }, + { + "label": "Besedilo za gumb \"Prikaži rešitev\"", + "default": "Prikaži rešitev" + }, + { + "label": "Naslov pogovornega okna s povratno informacijo o vključenih/manjkajočih besedah", + "default": "Povratna informacija" + }, + { + "label": "Besedilo za naslov vzorčnega primera rešitve", + "default": "Vzorčni primer rešitve" + }, + { + "label": "Števec preostalih znakov", + "default": "Preostalo število znakov: @chars", + "description": "Sporočilo o preostalem številu znakov za besedilo odgovora. @chars je spremenljivka." + }, + { + "label": "Premalo znakov", + "default": "Besedilo mora vsebovati najmanj naslednje število znakov: @chars", + "description": "Sporočilo o nedoseganju najmanjšega števila znakov za besedilo odgovora. @chars je spremenljivka." + }, + { + "label": "Sporočilo o shranjenem odgovoru", + "description": "Besedilo udeležencu potrdi oddajo odgovora.", + "default": "shranjeno" + }, + { + "label": "Oddan odgovor (ni prikazano)", + "description": "Besedilo je namenjeno bralnikom zaslona. @score in @total sta spremenljivki.", + "default": "Seštevek točk: @score od @total" + }, + { + "label": "Sporočilo o navigaciji po oknu (ni prikazano)", + "description": "Besedilo je namenjeno bralnikom zaslona.", + "default": "Pomaknjeno do na novo vključenega vzorčnega primera." + }, + { + "label": "Assistive technology description for \"Check\" button", + "default": "Check the answers." + }, + { + "label": "Assistive technology description for \"Show Solution\" button", + "default": "Show the solution. You will be provided with a sample solution." + }, + { + "label": "Assistive technology description for \"Retry\" button", + "default": "Retry the task. You can improve your previous answer if the author allowed that." + } + ] +} diff --git a/activities/module01/essay-395/H5P.Essay-1.4/library.json b/activities/module01/essay-395/H5P.Essay-1.4/library.json new file mode 100644 index 0000000..2c22332 --- /dev/null +++ b/activities/module01/essay-395/H5P.Essay-1.4/library.json @@ -0,0 +1,65 @@ +{ + "title": "Essay", + "description": "Score a student's essay automatically", + "majorVersion": 1, + "minorVersion": 4, + "patchVersion": 3, + "runnable": 1, + "embedTypes": [ + "iframe" + ], + "author": "Oliver Tacke", + "license": "MIT", + "machineName": "H5P.Essay", + "coreApi": { + "majorVersion": 1, + "minorVersion": 13 + }, + "preloadedJs": [ + { + "path": "scripts/essay.js" + }, + { + "path": "scripts/inputfield.js" + } + ], + "preloadedCss": [ + { + "path": "styles/essay.css" + } + ], + "preloadedDependencies": [ + { + "machineName": "H5P.Question", + "majorVersion": 1, + "minorVersion": 5 + }, + { + "machineName": "H5P.JoubelUI", + "majorVersion": 1, + "minorVersion": 3 + }, + { + "machineName": "H5P.TextUtilities", + "majorVersion": 1, + "minorVersion": 3 + } + ], + "editorDependencies": [ + { + "machineName": "H5PEditor.VerticalTabs", + "majorVersion": 1, + "minorVersion": 3 + }, + { + "machineName": "H5PEditor.RangeList", + "majorVersion": 1, + "minorVersion": 0 + }, + { + "machineName": "H5PEditor.ShowWhen", + "majorVersion": 1, + "minorVersion": 0 + } + ] +} diff --git a/activities/module01/essay-395/H5P.Essay-1.4/scripts/essay.js b/activities/module01/essay-395/H5P.Essay-1.4/scripts/essay.js new file mode 100644 index 0000000..2cb4cf6 --- /dev/null +++ b/activities/module01/essay-395/H5P.Essay-1.4/scripts/essay.js @@ -0,0 +1,991 @@ +var H5P = H5P || {}; + +H5P.Essay = function ($, Question) { + 'use strict'; + + // CSS Classes + const SOLUTION_CONTAINER = 'h5p-essay-solution-container'; + const SOLUTION_TITLE = 'h5p-essay-solution-title'; + const SOLUTION_INTRODUCTION = 'h5p-essay-solution-introduction'; + const SOLUTION_SAMPLE = 'h5p-essay-solution-sample'; + const SOLUTION_SAMPLE_TEXT = 'h5p-essay-solution-sample-text'; + + // The H5P feedback right now only expects true (green)/false (red) feedback, not neutral feedback + const FEEDBACK_EMPTY = '...'; + + /** + * @constructor + * @param {Object} config - Config from semantics.json. + * @param {string} contentId - ContentId. + * @param {Object} [contentData] - contentData. + */ + function Essay(config, contentId, contentData) { + // Initialize + if (!config) { + return; + } + + // Inheritance + Question.call(this, 'essay'); + + // Sanitize defaults + this.params = Essay.extend( + { + media: {}, + taskDescription: '', + solution: {}, + keywords: [], + overallFeedback: [], + behaviour: { + minimumLength: 0, + inputFieldSize: 10, + enableCheckButton: true, + enableRetry: true, + ignoreScoring: false, + pointsHost: 1 + }, + checkAnswer: 'Check', + submitAnswer: 'Submit', + tryAgain: 'Retry', + showSolution: 'Show solution', + feedbackHeader: 'Feedback', + solutionTitle: 'Sample solution', + remainingChars: 'Remaining characters: @chars', + notEnoughChars: 'You must enter at least @chars characters!', + messageSave: 'saved', + ariaYourResult: 'You got @score out of @total points', + ariaNavigatedToSolution: 'Navigated to newly included sample solution after textarea.', + ariaCheck: 'Check the answers.', + ariaShowSolution: 'Show the solution. You will be provided with a sample solution.', + ariaRetry: 'Retry the task. You can improve your previous answer if the author allowed that.' + }, + config); + this.contentId = contentId; + this.extras = contentData; + + const defaultLanguage = (this.extras && this.extras.metadata) ? this.extras.metadata.defaultLanguage || 'en' : 'en'; + this.languageTag = Essay.formatLanguageCode(defaultLanguage); + + this.score = 0; + this.internalShowSolutionsCall = false; + + // Sanitize HTML encoding + this.params.placeholderText = this.htmlDecode(this.params.placeholderText || ''); + + // Get previous state from content data + if (typeof contentData !== 'undefined' && typeof contentData.previousState !== 'undefined') { + this.previousState = contentData.previousState; + } + + this.isAnswered = this.previousState && this.previousState.inputField && this.previousState.inputField !== '' || false; + /* + * this.params.behaviour.enableSolutionsButton and this.params.behaviour.enableRetry are used by + * contract at {@link https://h5p.org/documentation/developers/contracts#guides-header-8} and + * {@link https://h5p.org/documentation/developers/contracts#guides-header-9} + */ + this.params.behaviour.enableSolutionsButton = (typeof this.params.solution.sample !== 'undefined' && this.params.solution.sample !== ''); + this.params.behaviour.enableRetry = this.params.behaviour.enableRetry || false; + + // Determine the minimum number of characters that should be entered + this.params.behaviour.minimumLength = this.params.behaviour.minimumLength || 0; + if (this.params.behaviour.maximumLength !== undefined) { + this.params.behaviour.minimumLength = Math.min(this.params.behaviour.minimumLength, this.params.behaviour.maximumLength); + } + + // map function + const toPoints = function (keyword) { + return (keyword.keyword && keyword.options && keyword.options.points || 0) * (keyword.options.occurrences || 1); + }; + + // reduce function + const sum = function (a, b) { + return a + b; + }; + + // scoreMax = Maximum number of points available by all keyword groups + const scoreMax = this.params.keywords + .map(toPoints) + .reduce(sum, 0); + + // scoreMastering: score indicating mastery and maximum number on progress bar (can be < scoreMax) + this.scoreMastering = this.params.behaviour.percentageMastering === undefined ? + scoreMax : + this.params.behaviour.percentageMastering * scoreMax / 100; + + // scorePassing: score to pass the task (<= scoreMastering) + this.scorePassing = Math.min( + this.getMaxScore(), + this.params.behaviour.percentagePassing * scoreMax / 100 || 0); + + this.solution = this.buildSolution(); + } + + // Extends Question + Essay.prototype = Object.create(Question.prototype); + Essay.prototype.constructor = Essay; + + /** + * Register the DOM elements with H5P.Question. + */ + Essay.prototype.registerDomElements = function () { + const that = this; + + // Set optional media + const media = (this.params.media) ? this.params.media.type : undefined; + if (media && media.library) { + const type = media.library.split(' ')[0]; + if (type === 'H5P.Image') { + if (media.params.file) { + this.setImage(media.params.file.path, { + disableImageZooming: this.params.media.disableImageZooming, + alt: media.params.alt, + title: media.params.title + }); + } + } + else if (type === 'H5P.Video') { + if (media.params.sources) { + this.setVideo(media); + } + } + else if (type === 'H5P.Audio') { + if (media.params.files) { + this.setAudio(media); + } + } + } + + // Check whether status bar is needed + const statusBar = ( + this.params.behaviour.minimumLength || + this.params.behaviour.maximumLength || + (H5PIntegration && H5PIntegration.saveFreq) + ); + + // Create InputField + this.inputField = new H5P.Essay.InputField({ + taskDescription: this.params.taskDescription, + placeholderText: this.params.placeholderText, + maximumLength: this.params.behaviour.maximumLength, + remainingChars: this.params.remainingChars, + inputFieldSize: this.params.behaviour.inputFieldSize, + previousState: this.previousState, + statusBar: statusBar + }, { + onInteracted: (function (params) { + that.handleInteracted(params); + }), + onInput: (function () { + that.handleInput(); + }) + }); + + // Register task introduction text + this.setIntroduction(this.inputField.getIntroduction()); + + // Register content + this.content = this.inputField.getContent(); + this.setContent(this.content); + + // Register Buttons + this.addButtons(); + }; + + /** + * Add all the buttons that shall be passed to H5P.Question. + */ + Essay.prototype.addButtons = function () { + const that = this; + + // Show solution button + that.addButton('show-solution', that.params.showSolution, function () { + // Not using a parameter for showSolutions to not mess with possibe future contract changes + that.internalShowSolutionsCall = true; + that.showSolutions(); + that.internalShowSolutionsCall = false; + }, false, { + 'aria-label': this.params.ariaShowSolution + }, {}); + + // Check answer button + that.addButton('check-answer', that.params.checkAnswer, function () { + // Show message if the minimum number of characters has not been met + if (that.inputField.getText().length < that.params.behaviour.minimumLength) { + const message = that.params.notEnoughChars.replace(/@chars/g, that.params.behaviour.minimumLength); + that.inputField.setMessageChars(message, true); + that.read(message); + return; + } + + that.inputField.disable(); + /* + * Only set true on "check". Result computation may take some time if + * there are many keywords due to the fuzzy match checking, so it's not + * a good idea to do this while typing. + */ + that.isAnswered = true; + that.handleEvaluation(); + + if (that.params.behaviour.enableSolutionsButton === true) { + that.showButton('show-solution'); + } + that.hideButton('check-answer'); + }, this.params.behaviour.enableCheckButton, { + 'aria-label': this.params.ariaCheck + }, { + contentData: this.extras, + textIfSubmitting: this.params.submitAnswer, + }); + + // Retry button + that.addButton('try-again', that.params.tryAgain, function () { + that.resetTask(); + }, false, { + 'aria-label': this.params.ariaRetry + }, {}); + }; + + /** + * Get the user input from DOM. + * @param {string} [linebreakReplacement=' '] Replacement for line breaks. + * @return {string} Cleaned input. + */ + Essay.prototype.getInput = function (linebreakReplacement) { + linebreakReplacement = linebreakReplacement || ' '; + + return this.inputField + .getText() + .replace(/(\r\n|\r|\n)/g, linebreakReplacement) + .replace(/\s\s/g, ' '); + }; + + /** + * Handle user interacted. + * @param {object} params Parameters. + * @param {boolean} [params.updateScore] If true, will trigger score computation. + */ + Essay.prototype.handleInteracted = function (params) { + params = params || {}; + + // Deliberately keeping the state once answered + this.isAnswered = this.isAnswered || this.inputField.getText().length > 0; + if (params.updateScore) { + // Only triggered when explicitly requested due to potential complexity + this.updateScore(); + } + + this.triggerXAPI('interacted'); + }; + + /** + * Check if Essay has been submitted/minimum length met. + * @return {boolean} True, if answer was given. + * @see contract at {@link https://h5p.org/documentation/developers/contracts#guides-header-1} + */ + Essay.prototype.getAnswerGiven = function () { + return this.isAnswered; + }; + + /** + * Get latest score. + * @return {number} latest score. + * @see contract at {@link https://h5p.org/documentation/developers/contracts#guides-header-2} + */ + Essay.prototype.getScore = function () { + // Return value is rounded because reporting module for moodle's H5P plugin expects integers + return (this.params.behaviour.ignoreScoring) ? this.getMaxScore() : Math.round(this.score); + }; + + /** + * Get maximum possible score. + * @return {number} Score necessary for mastering. + * @see contract at {@link https://h5p.org/documentation/developers/contracts#guides-header-3} + */ + Essay.prototype.getMaxScore = function () { + // Return value is rounded because reporting module for moodle's H5P plugin expects integers + return (this.params.behaviour.ignoreScoring) ? this.params.behaviour.pointsHost || 0 : Math.round(this.scoreMastering); + }; + + /** + * Show solution. + * @see contract at {@link https://h5p.org/documentation/developers/contracts#guides-header-4} + */ + Essay.prototype.showSolutions = function () { + this.inputField.disable(); + + if (typeof this.params.solution.sample !== 'undefined' && this.params.solution.sample !== '') { + // We add the sample solution here to make cheating at least a little more difficult + if (this.solution.getElementsByClassName(SOLUTION_SAMPLE)[0].children.length === 0) { + const text = document.createElement('div'); + text.classList.add(SOLUTION_SAMPLE_TEXT); + text.innerHTML = this.params.solution.sample; + this.solution.getElementsByClassName(SOLUTION_SAMPLE)[0].appendChild(text); + } + + // Insert solution after explanations or content. + const predecessor = this.content.parentNode; + + predecessor.parentNode.insertBefore(this.solution, predecessor.nextSibling); + + // Useful for accessibility, but seems to jump to wrong position on some Safari versions + this.solutionAnnouncer.focus(); + } + + this.hideButton('show-solution'); + + // Handle calls from the outside + if (!this.internalShowSolutionsCall) { + this.hideButton('check-answer'); + this.hideButton('try-again'); + } + + this.trigger('resize'); + }; + + /** + * Reset task. + * @see contract at {@link https://h5p.org/documentation/developers/contracts#guides-header-5} + */ + Essay.prototype.resetTask = function () { + this.setExplanation(); + this.removeFeedback(); + this.hideSolution(); + + this.hideButton('show-solution'); + this.hideButton('try-again'); + + // QuestionSet can control check button despite not in Question Type contract + if (this.params.behaviour.enableCheckButton) { + this.showButton('check-answer'); + } + + this.inputField.enable(); + this.inputField.focus(); + + this.isAnswered = false; + }; + + /** + * Get xAPI data. + * @return {Object} xAPI statement. + * @see contract at {@link https://h5p.org/documentation/developers/contracts#guides-header-6} + */ + Essay.prototype.getXAPIData = function () { + return { + statement: this.getXAPIAnswerEvent().data.statement + }; + }; + + /** + * Determine whether the task has been passed by the user. + * @return {boolean} True if user passed or task is not scored. + */ + Essay.prototype.isPassed = function () { + return (this.params.behaviour.ignoreScoring || this.getScore() >= this.scorePassing); + }; + + /** + * Update score. + * @param {object} results Results. + */ + Essay.prototype.updateScore = function (results) { + results = results || this.computeResults(); + this.score = Math.min(this.computeScore(results), this.getMaxScore()); + }; + + /** + * Handle the evaluation. + */ + Essay.prototype.handleEvaluation = function () { + const results = this.computeResults(); + + // Build explanations + const explanations = this.buildExplanation(results); + + // Show explanations + if (explanations.length > 0) { + this.setExplanation(explanations, this.params.feedbackHeader); + } + + // Not all keyword groups might be necessary for mastering + this.updateScore(results); + const textScore = H5P.Question + .determineOverallFeedback(this.params.overallFeedback, this.getScore() / this.getMaxScore()) + .replace('@score', this.getScore()) + .replace('@total', this.getMaxScore()); + + if (!this.params.behaviour.ignoreScoring && this.getMaxScore() > 0) { + const ariaMessage = (this.params.ariaYourResult) + .replace('@score', ':num') + .replace('@total', ':total'); + this.setFeedback(textScore, this.getScore(), this.getMaxScore(), ariaMessage); + } + + // Show and hide buttons as necessary + this.handleButtons(this.getScore()); + + // Trigger xAPI statements as necessary + this.handleXAPI(); + + this.trigger('resize'); + }; + + /** + * Build solution DOM object. + * @return {Object} DOM object. + */ + Essay.prototype.buildSolution = function () { + const solution = document.createElement('div'); + solution.classList.add(SOLUTION_CONTAINER); + + this.solutionAnnouncer = document.createElement('div'); + this.solutionAnnouncer.setAttribute('tabindex', '0'); + this.solutionAnnouncer.setAttribute('aria-label', this.params.ariaNavigatedToSolution); + this.solutionAnnouncer.addEventListener('focus', function (event) { + // Just temporary tabbable element. Will be announced by readspaker. + event.target.blur(); + event.target.setAttribute('tabindex', '-1'); + }); + solution.appendChild(this.solutionAnnouncer); + + const solutionTitle = document.createElement('div'); + solutionTitle.classList.add(SOLUTION_TITLE); + solutionTitle.innerHTML = this.params.solutionTitle; + solution.appendChild(solutionTitle); + + const solutionIntroduction = document.createElement('div'); + solutionIntroduction.classList.add(SOLUTION_INTRODUCTION); + solutionIntroduction.innerHTML = this.params.solution.introduction; + solution.appendChild(solutionIntroduction); + + const solutionSample = document.createElement('div'); + solutionSample.classList.add(SOLUTION_SAMPLE); + solution.appendChild(solutionSample); + + return solution; + }; + + /** + * Hide the solution. + */ + Essay.prototype.hideSolution = function () { + if (this.solution.parentNode !== null) { + this.solution.parentNode.removeChild(this.solution); + } + }; + + /** + * Compute results. + * @return {Object[]} Results: [[{"keyword": keyword, "match": match, "index": index}*]*]. + */ + Essay.prototype.computeResults = function () { + const that = this; + const results = []; + + // Should not happen, but just to be sure ... + this.params.keywords = this.params.keywords || []; + + // Filter out keywords that have not been set. + this.params.keywords = this.params.keywords.filter(function (element) { + return typeof element.keyword !== 'undefined'; + }); + + this.params.keywords.forEach(function (alternativeGroup) { + const resultsGroup = []; + const options = alternativeGroup.options; + const caseSensitive = (that.params.behaviour.overrideCaseSensitive !== 'off') && + (that.params.behaviour.overrideCaseSensitive === 'on' || options.caseSensitive); + + let alternatives = [alternativeGroup.keyword || []] + .concat(alternativeGroup.alternatives || []) + .map(function (alternative) { + return that.htmlDecode(alternative); + }); + + /* + * Get all matches to regular expressions and pretend the matches were + * given as alternative answers in order to be able to detect them. + * This result computation might need a rewrite ... + */ + const regularExpressionMatches = that + .getRegExpAlternatives(alternatives, that.getInput(), caseSensitive) + .map(function (match) { + // Allow to differentiate from wildcard asterisk + return match = match.replace(/\*/, Essay.REGULAR_EXPRESSION_ASTERISK); + }); + + // Not chained, because we still need the old value inside + alternatives = alternatives + // only "normal" alternatives + .filter(function (alternative) { + return (alternative[0] !== '/' || alternative[alternative.length - 1] !== '/'); + }) + // regular matches found in text for alternatives + .concat(regularExpressionMatches) + // regular matches could match empty string + .filter(function (alternative) { + return alternative !== ''; + }); + + // Detect all matches + alternatives.forEach(function (alternative) { + let inputTest = that.getInput(); + + // Check for case sensitivity + const caseSensitive = that.params.behaviour.overrideCaseSensitive === 'on' || options.caseSensitive; + if (!caseSensitive) { + alternative = alternative.toLowerCase(); + inputTest = inputTest.toLowerCase(); + } + + // Build array of matches for each type of match + const matchesExact = that.detectExactMatches(alternative, inputTest); + const matchesWildcard = alternative.indexOf('*') !== -1 ? that.detectWildcardMatches(alternative, inputTest, caseSensitive) : []; + const matchesFuzzy = options.forgiveMistakes ? that.detectFuzzyMatches(alternative, inputTest) : []; + + // Merge matches without duplicates + that.mergeMatches(matchesExact, matchesWildcard, matchesFuzzy).forEach(function (item) { + resultsGroup.push(item); + }); + }); + results.push(resultsGroup); + }); + return results; + }; + + /** + * Compute the score for the results. + * @param {Object[]} results - Results from the task. + * @return {number} Score. + */ + Essay.prototype.computeScore = function (results) { + let score = 0; + this.params.keywords.forEach(function (keyword, i) { + score += Math.min(results[i].length, keyword.options.occurrences) * keyword.options.points; + }); + return score; + }; + + /** + * Build the explanations for H5P.Question.setExplanation. + * @param {Object} results - Results from the task. + * @return {Object[]} Explanations for H5P.Question. + */ + Essay.prototype.buildExplanation = function (results) { + const explanations = []; + + let word; + this.params.keywords.forEach(function (keyword, i) { + word = FEEDBACK_EMPTY; + // Keyword was not found and feedback is provided for this case + if (results[i].length === 0 && keyword.options.feedbackMissed) { + if (keyword.options.feedbackMissedWord === 'keyword') { + // Main keyword defined + word = keyword.keyword; + } + explanations.push({correct: word, text: keyword.options.feedbackMissed}); + } + + // Keyword found and feedback is provided for this case + if (results[i].length > 0 && keyword.options.feedbackIncluded) { + // Set word in front of feedback + switch (keyword.options.feedbackIncludedWord) { + case 'keyword': + // Main keyword defined + word = keyword.keyword; + break; + case 'alternative': + // Alternative that was found + word = results[i][0].keyword; + break; + case 'answer': + // Answer matching an alternative at the learner typed it + word = results[i][0].match; + break; + } + explanations.push({correct: word, text: keyword.options.feedbackIncluded}); + } + }); + + if (explanations.length > 0) { + // Sort "included" before "not included", but keep order otherwise + explanations.sort(function (a, b) { + return a.correct === FEEDBACK_EMPTY && b.correct !== FEEDBACK_EMPTY; + }); + } + return explanations; + }; + + /** + * Handle buttons' visibility. + * @param {number} score - Score the user received. + */ + Essay.prototype.handleButtons = function (score) { + if (this.params.solution.sample && !this.solution) { + this.showButton('show-solution'); + } + + // We need the retry button if the mastering score has not been reached or scoring is irrelevant + if (score < this.getMaxScore() || this.params.behaviour.ignoreScoring || this.getMaxScore() === 0) { + if (this.params.behaviour.enableRetry) { + this.showButton('try-again'); + } + } + else { + this.hideButton('try-again'); + } + }; + + /** + * Handle xAPI event triggering + * @param {number} score - Score the user received. + */ + Essay.prototype.handleXAPI = function () { + this.trigger(this.getXAPIAnswerEvent()); + + // Additional xAPI verbs that might be useful for making analytics easier + if (!this.params.behaviour.ignoreScoring && this.getMaxScore() > 0) { + if (this.getScore() < this.scorePassing) { + this.trigger(this.createEssayXAPIEvent('failed')); + } + else { + this.trigger(this.createEssayXAPIEvent('passed')); + } + if (this.getScore() >= this.getMaxScore()) { + this.trigger(this.createEssayXAPIEvent('mastered')); + } + } + }; + + /** + * Create an xAPI event for Essay. + * @param {string} verb - Short id of the verb we want to trigger. + * @return {H5P.XAPIEvent} Event template. + */ + Essay.prototype.createEssayXAPIEvent = function (verb) { + const xAPIEvent = this.createXAPIEventTemplate(verb); + Essay.extend( + xAPIEvent.getVerifiedStatementValue(['object', 'definition']), + this.getxAPIDefinition()); + return xAPIEvent; + }; + + /** + * Get the xAPI definition for the xAPI object. + * return {Object} XAPI definition. + */ + Essay.prototype.getxAPIDefinition = function () { + const definition = {}; + definition.name = {}; + definition.name[this.languageTag] = this.getTitle(); + // Fallback for h5p-php-reporting, expects en-US + definition.name['en-US'] = definition.name[this.languageTag]; + // The H5P reporting module expects the "blanks" to be added to the description + definition.description = {}; + definition.description[this.languageTag] = this.params.taskDescription + Essay.FILL_IN_PLACEHOLDER; + // Fallback for h5p-php-reporting, expects en-US + definition.description['en-US'] = definition.description[this.languageTag]; + definition.type = 'http://id.tincanapi.com/activitytype/essay'; + definition.interactionType = 'long-fill-in'; + /* + * The official xAPI documentation discourages to use a correct response + * pattern it if the criteria for a question are complex and correct + * responses cannot be exhaustively listed. They can't. + */ + return definition; + }; + + /** + * Build xAPI answer event. + * @return {H5P.XAPIEvent} xAPI answer event. + */ + Essay.prototype.getXAPIAnswerEvent = function () { + const xAPIEvent = this.createEssayXAPIEvent('answered'); + + xAPIEvent.setScoredResult(this.getScore(), this.getMaxScore(), this, true, this.isPassed()); + xAPIEvent.data.statement.result.response = this.inputField.getText(); + + return xAPIEvent; + }; + + /** + * Detect exact matches of needle in haystack. + * @param {string} needle - Word or phrase to find. + * @param {string} haystack - Text to find the word or phrase in. + * @return {Object[]} Results: [{'keyword': needle, 'match': needle, 'index': front + pos}*]. + */ + Essay.prototype.detectExactMatches = function (needle, haystack) { + // Simply detect all exact matches and its positions in the haystack + const result = []; + let pos = -1; + let front = 0; + + needle = needle + .replace(/\*/, '') // Wildcards checked separately + .replace(new RegExp(Essay.REGULAR_EXPRESSION_ASTERISK, 'g'), '*'); // Asterisk from regexp + + while (((pos = haystack.indexOf(needle))) !== -1 && needle !== '') { + if (H5P.TextUtilities.isIsolated(needle, haystack)) { + result.push({'keyword': needle, 'match': needle, 'index': front + pos}); + } + front += pos + needle.length; + haystack = haystack.substr(pos + needle.length); + } + return result; + }; + + /** + * Detect wildcard matches of needle in haystack. + * @param {string} needle - Word or phrase to find. + * @param {string} haystack - Text to find the word or phrase in. + * @param {boolean} caseSensitive - If true, alternative is case sensitive. + * @return {Object[]} Results: [{'keyword': needle, 'match': needle, 'index': front + pos}*]. + */ + Essay.prototype.detectWildcardMatches = function (needle, haystack, caseSensitive) { + if (needle.indexOf('*') === -1) { + return []; + } + + // Clean needle from successive wildcards + needle = needle.replace(/[*]{2,}/g, '*'); + + // Clean needle from regular expression characters, * needed for wildcard + const regexpChars = ['\\', '.', '[', ']', '?', '+', '(', ')', '{', '}', '|', '!', '^', '-']; + regexpChars.forEach(function (char) { + needle = needle.split(char).join('\\' + char); + }); + + // We accept only characters for the wildcard + const regexp = new RegExp(needle.replace(/\*/g, Essay.CHARS_WILDCARD + '+'), this.getRegExpModifiers(caseSensitive)); + const result = []; + let match; + while ((match = regexp.exec(haystack)) !== null ) { + if (H5P.TextUtilities.isIsolated(match[0], haystack, {'index': match.index})) { + result.push({'keyword': needle, 'match': match[0], 'index': match.index}); + } + } + return result; + }; + + /** + * Detect fuzzy matches of needle in haystack. + * @param {string} needle - Word or phrase to find. + * @param {string} haystack - Text to find the word or phrase in. + * @param {Object[]} Results. + */ + Essay.prototype.detectFuzzyMatches = function (needle, haystack) { + // Ideally, this should be the maximum number of allowed transformations for the Levenshtein disctance. + const windowSize = 2; + /* + * We cannot simple split words because we're also looking for phrases. + * If we were just looking for exact matches, we could use something smarter + * such as the KMP algorithm. Because we're dealing with fuzzy matches, using + * this intuitive exhaustive approach might be the best way to go. + */ + const results = []; + // Without looking at the surroundings we'd miss words that have additional or missing chars + for (let size = -windowSize; size <= windowSize; size++) { + for (let pos = 0; pos < haystack.length; pos++) { + const straw = haystack.substr(pos, needle.length + size); + if (H5P.TextUtilities.areSimilar(needle, straw) && H5P.TextUtilities.isIsolated(straw, haystack, {'index': pos})) { + // This will only add the match if it's not a duplicate that we found already in the proximity of pos + if (!this.contains(results, pos)) { + results.push({'keyword': needle, 'match': straw, 'index': pos}); + } + } + } + } + return results; + }; + + /** + * Get all the matches found to a regular expression alternative. + * @param {string[]} alternatives - Alternatives. + * @param {string} inputTest - Original text by student. + * @param {boolean} caseSensitive - If true, alternative is case sensitive. + * @return {string[]} Matches by regular expressions. + */ + Essay.prototype.getRegExpAlternatives = function (alternatives, inputTest, caseSensitive) { + const that = this; + + return alternatives + .filter(function (alternative) { + return (alternative[0] === '/' && alternative[alternative.length - 1] === '/'); + }) + .map(function (alternative) { + const regNeedle = new RegExp(alternative.slice(1, -1), that.getRegExpModifiers(caseSensitive)); + return inputTest.match(regNeedle); + }) + .reduce(function (a, b) { + return a.concat(b); + }, []) + .filter(function (item) { + return item !== null; + }); + }; + + /** + * Get modifiers for regular expressions. + * @param {boolean} caseSensitive - If true, alternative is case sensitive. + * @return {string} Modifiers for regular expressions. + */ + Essay.prototype.getRegExpModifiers = function (caseSensitive) { + const modifiers = ['g']; + if (!caseSensitive) { + modifiers.push('i'); + } + + return modifiers.join(''); + }; + + /** + * Merge the matches. + * @param {...Object[]} matches - Detected matches. + * @return {Object[]} Merged matches. + */ + Essay.prototype.mergeMatches = function () { + // Sanitization + if (arguments.length === 0) { + return []; + } + if (arguments.length === 1) { + return arguments[0]; + } + + // Add all elements from args[1+] to args[0] if not already there close by. + const results = (arguments[0] || []).slice(); + for (let i = 1; i < arguments.length; i++) { + const match2 = arguments[i] || []; + for (let j = 0; j < match2.length; j++) { + if (!this.contains(results, match2[j].index)) { + results.push(match2[j]); + } + } + } + return results.sort(function (a, b) { + return a.index > b.index; + }); + }; + + /** + * Check if an array of detected results contains the same match in the word's proximity. + * Used to prevent double entries that can be caused by fuzzy matching. + * @param {Object} results - Preliminary results. + * @param {string} results.match - Match that was found before at a particular position. + * @param {number} results.index - Starting position of the match. + * @param {number} index - Index of solution to be checked for double entry. + */ + Essay.prototype.contains = function (results, index) { + return results.some(function (result) { + return Math.abs(result.index - index) <= result.match.length; + }); + }; + + /** + * Extend an array just like JQuery's extend. + * @param {...Object} arguments - Objects to be merged. + * @return {Object} Merged objects. + */ + Essay.extend = function () { + for (let i = 1; i < arguments.length; i++) { + for (let key in arguments[i]) { + if (Object.prototype.hasOwnProperty.call(arguments[i], key)) { + if (typeof arguments[0][key] === 'object' && + typeof arguments[i][key] === 'object') { + this.extend(arguments[0][key], arguments[i][key]); + } + else { + arguments[0][key] = arguments[i][key]; + } + } + } + } + return arguments[0]; + }; + + /** + * Get task title. + * @return {string} Title. + */ + Essay.prototype.getTitle = function () { + let raw; + if (this.extras.metadata) { + raw = this.extras.metadata.title; + } + raw = raw || Essay.DEFAULT_DESCRIPTION; + + // H5P Core function: createTitle + return H5P.createTitle(raw); + }; + + /** + * Format language tag (RFC 5646). Assuming "language-coutry". No validation. + * Cmp. https://tools.ietf.org/html/rfc5646 + * @param {string} languageTag Language tag. + * @return {string} Formatted language tag. + */ + Essay.formatLanguageCode = function (languageCode) { + if (typeof languageCode !== 'string') { + return languageCode; + } + + /* + * RFC 5646 states that language tags are case insensitive, but + * recommendations may be followed to improve human interpretation + */ + const segments = languageCode.split('-'); + segments[0] = segments[0].toLowerCase(); // ISO 639 recommendation + if (segments.length > 1) { + segments[1] = segments[1].toUpperCase(); // ISO 3166-1 recommendation + } + languageCode = segments.join('-'); + + return languageCode; + }; + + /** + * Retrieve true string from HTML encoded string + * @param {string} input - Input string. + * @return {string} Output string. + */ + Essay.prototype.htmlDecode = function (input) { + const dparser = new DOMParser().parseFromString(input, 'text/html'); + return dparser.documentElement.textContent; + }; + + /** + * Get current state for H5P.Question. + * @return {Object} Current state. + */ + Essay.prototype.getCurrentState = function () { + this.inputField.updateMessageSaved(this.params.messageSave); + + // We could have just used a string, but you never know when you need to store more parameters + return { + 'inputField': this.inputField.getText() + }; + }; + + /** @constant {string} + * latin special chars: \u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF + * greek chars: \u0370-\u03FF + * kyrillic chars: \u0400-\u04FF + * hiragana + katakana: \u3040-\u30FF + * common CJK characters: \u4E00-\u62FF\u6300-\u77FF\u7800-\u8CFF\u8D00-\u9FFF + * thai chars: \u0E00-\u0E7F + */ + Essay.CHARS_WILDCARD = '[A-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF\u0370-\u03FF\u0400-\u04FF\u3040-\u309F\u3040-\u30FF\u4E00-\u62FF\u6300-\u77FF\u7800-\u8CFF\u8D00-\u9FFF\u0E00-\u0E7F]'; + + /** @constant {string} + * Required to be added to xAPI object description for H5P reporting + */ + Essay.FILL_IN_PLACEHOLDER = '__________'; + + /** @constant {string} */ + Essay.DEFAULT_DESCRIPTION = 'Essay'; + + /** @constant {string} */ + Essay.REGULAR_EXPRESSION_ASTERISK = ':::H5P-Essay-REGEXP-ASTERISK:::'; + + return Essay; +}(H5P.jQuery, H5P.Question); diff --git a/activities/module01/essay-395/H5P.Essay-1.4/scripts/inputfield.js b/activities/module01/essay-395/H5P.Essay-1.4/scripts/inputfield.js new file mode 100644 index 0000000..35e870d --- /dev/null +++ b/activities/module01/essay-395/H5P.Essay-1.4/scripts/inputfield.js @@ -0,0 +1,258 @@ +var H5P = H5P || {}; + +(function (Essay) { + 'use strict'; + + // CSS Classes + var MAIN_CONTAINER = 'h5p-essay-input-field'; + var INPUT_LABEL = 'h5p-essay-input-field-label'; + var INPUT_FIELD = 'h5p-essay-input-field-textfield'; + var WRAPPER_MESSAGE = 'h5p-essay-input-field-message-wrapper'; + var CHAR_MESSAGE = 'h5p-essay-input-field-message-char'; + var CHAR_MESSAGE_IMPORTANT = 'h5p-essay-input-field-message-char-important'; + var SAVE_MESSAGE = 'h5p-essay-input-field-message-save'; + var ANIMATION_MESSAGE = 'h5p-essay-input-field-message-save-animation'; + var EMPTY_MESSAGE = ' '; + + /** + * @constructor + * @param {object} params - Parameters. + * @param {number} [params.inputFieldSize] - Number of rows for inputfield. + * @param {number} [params.maximumLength] - Maximum text length. + * @param {string} [params.placeholderText] - Placeholder text for input field. + * @param {string} [params.remainingChars] - Label for remaining chars information. + * @param {string} [params.taskDescription] - Task description (HTML). + * @param {object} [params.previousState] - Content state of previous attempt. + * @param {object} [callbacks] - Callbacks. + * @param {function} [callbacks.onInteracted] - Interacted callback. + */ + Essay.InputField = function (params, callbacks) { + var that = this; + + this.params = params; + this.previousState = params.previousState || ''; + + // Callbacks + this.callbacks = callbacks || {}; + this.callbacks.onInteracted = this.callbacks.onInteracted || (function () {}); + + // Sanitization + this.params.taskDescription = this.params.taskDescription || ''; + this.params.placeholderText = this.params.placeholderText || ''; + + // Task description + this.taskDescription = document.createElement('div'); + this.taskDescription.classList.add(INPUT_LABEL); + this.taskDescription.innerHTML = this.params.taskDescription; + + // InputField + this.inputField = document.createElement('textarea'); + this.inputField.classList.add(INPUT_FIELD); + this.inputField.setAttribute('rows', this.params.inputFieldSize); + this.inputField.setAttribute('maxlength', this.params.maximumLength); + this.inputField.setAttribute('placeholder', this.params.placeholderText); + this.setText(this.previousState); + this.oldValue = this.previousState; + + this.containsText = this.oldValue.length > 0; + + // Interacted listener + this.inputField.addEventListener('blur', function () { + if (that.oldValue !== that.getText()) { + that.callbacks.onInteracted({ updateScore: true }); + } + + that.oldValue = that.getText(); + }); + + /* + * Extra listener required to be used in QuestionSet properly + */ + this.inputField.addEventListener('input', function () { + if ( + that.containsText && that.getText().length === 0 || + !that.containsText && that.getText().length > 0 + ) { + that.callbacks.onInteracted(); + } + + that.containsText = that.getText().length > 0; + }); + + this.content = document.createElement('div'); + this.content.appendChild(this.inputField); + + // Container + this.container = document.createElement('div'); + this.container.classList.add(MAIN_CONTAINER); + this.container.appendChild(this.taskDescription); + this.container.appendChild(this.content); + + if (params.statusBar) { + var statusWrapper = document.createElement('div'); + statusWrapper.classList.add(WRAPPER_MESSAGE); + + this.statusChars = document.createElement('div'); + this.statusChars.classList.add(CHAR_MESSAGE); + + statusWrapper.appendChild(this.statusChars); + + ['change', 'keyup', 'paste'].forEach(function (event) { + that.inputField.addEventListener(event, function () { + that.updateMessageSaved(''); + that.updateMessageChars(); + }); + }); + + this.statusSaved = document.createElement('div'); + this.statusSaved.classList.add(SAVE_MESSAGE); + statusWrapper.appendChild(this.statusSaved); + + this.content.appendChild(statusWrapper); + + this.updateMessageChars(); + } + }; + + /** + * Get introduction for H5P.Question. + * @return {Object} DOM elements for introduction. + */ + Essay.InputField.prototype.getIntroduction = function () { + return this.taskDescription; + }; + + /** + * Get content for H5P.Question. + * @return {Object} DOM elements for content. + */ + Essay.InputField.prototype.getContent = function () { + return this.content; + }; + + /** + * Get current text in InputField. + * @return {string} Current text. + */ + Essay.InputField.prototype.getText = function () { + return this.inputField.value; + }; + + /** + * Disable the inputField. + */ + Essay.InputField.prototype.disable = function () { + this.inputField.disabled = true; + }; + + /** + * Enable the inputField. + */ + Essay.InputField.prototype.enable = function () { + this.inputField.disabled = false; + }; + + /** + * Enable the inputField. + */ + Essay.InputField.prototype.focus = function () { + this.inputField.focus(); + }; + + /** + * Set the text for the InputField. + * @param {string|Object} previousState - Previous state that was saved. + */ + Essay.InputField.prototype.setText = function (previousState) { + if (typeof previousState === 'undefined') { + return; + } + if (typeof previousState === 'string') { + this.inputField.innerHTML = previousState; + } + if (typeof previousState === 'object' && !Array.isArray(previousState)) { + this.inputField.innerHTML = previousState.inputField || ''; + } + }; + + /** + * Compute the remaining number of characters. + * @return {number} Number of characters left. + */ + Essay.InputField.prototype.computeRemainingChars = function () { + return this.params.maximumLength - this.inputField.value.length; + }; + + /** + * Update character message field. + */ + Essay.InputField.prototype.updateMessageChars = function () { + if (!this.params.statusBar) { + return; + } + + if (typeof this.params.maximumLength !== 'undefined') { + this.setMessageChars(this.params.remainingChars.replace(/@chars/g, this.computeRemainingChars()), false); + } + else { + // Use EMPTY_MESSAGE to keep height + this.setMessageChars(EMPTY_MESSAGE, false); + } + }; + + /** + * Update the indicator message for saved text. + * @param {string} saved - Message to indicate the text was saved. + */ + Essay.InputField.prototype.updateMessageSaved = function (saved) { + if (!this.params.statusBar) { + return; + } + + // Add/remove blending effect + if (typeof saved === 'undefined' || saved === '') { + this.statusSaved.classList.remove(ANIMATION_MESSAGE); + //this.statusSaved.removeAttribute('tabindex'); + } + else { + this.statusSaved.classList.add(ANIMATION_MESSAGE); + //this.statusSaved.setAttribute('tabindex', 0); + } + this.statusSaved.innerHTML = saved; + }; + + /** + * Set the text for the character message. + * @param {string} message - Message text. + * @param {boolean} important - If true, message will added a particular CSS class. + */ + Essay.InputField.prototype.setMessageChars = function (message, important) { + if (!this.params.statusBar) { + return; + } + + if (typeof message !== 'string') { + return; + } + + if (message === EMPTY_MESSAGE || important) { + /* + * Important messages should be read for a readspeaker by caller and need + * not be accessible when tabbing back again. + */ + this.statusChars.removeAttribute('tabindex'); + } + else { + this.statusChars.setAttribute('tabindex', 0); + } + + this.statusChars.innerHTML = message; + if (important) { + this.statusChars.classList.add(CHAR_MESSAGE_IMPORTANT); + } + else { + this.statusChars.classList.remove(CHAR_MESSAGE_IMPORTANT); + } + }; + +})(H5P.Essay); diff --git a/activities/module01/essay-395/H5P.Essay-1.4/semantics.json b/activities/module01/essay-395/H5P.Essay-1.4/semantics.json new file mode 100644 index 0000000..7ff2bf3 --- /dev/null +++ b/activities/module01/essay-395/H5P.Essay-1.4/semantics.json @@ -0,0 +1,591 @@ +[ + { + "name": "media", + "type": "group", + "label": "Media", + "importance": "medium", + "fields": [ + { + "name": "type", + "type": "library", + "label": "Type", + "importance": "medium", + "options": [ + "H5P.Image 1.1", + "H5P.Video 1.5", + "H5P.Audio 1.4" + ], + "optional": true, + "description": "Optional media to display above the question." + }, + { + "name": "disableImageZooming", + "type": "boolean", + "label": "Disable image zooming", + "importance": "low", + "default": false, + "optional": true, + "widget": "showWhen", + "showWhen": { + "rules": [ + { + "field": "type", + "equals": "H5P.Image 1.1" + } + ] + } + } + ] + }, + { + "name": "taskDescription", + "label": "Task description", + "type": "text", + "widget": "html", + "importance": "high", + "description": "Describe your task here. The task description will appear above text input area.", + "placeholder": "Summarize the book in 500 characters ...", + "enterMode": "div", + "tags": [ + "strong", + "em", + "u", + "a", + "ul", + "ol", + "h2", + "h3", + "hr", + "pre", + "code" + ] + }, + { + "name": "placeholderText", + "label": "Help text", + "type": "text", + "description": "This text should help the user to get started.", + "placeholder": "This book is about ...", + "importance": "low", + "optional": true + }, + { + "name": "solution", + "type": "group", + "label": "Sample solution", + "importance": "high", + "expanded": true, + "description": "You can optionally add a sample solution that's shown after the student created a text. It's called sample solution because there probably is not only one solution.", + "fields": [ + { + "name": "introduction", + "type": "text", + "label": "Introduction", + "importance": "low", + "description": "You can optionally leave the students some explanations about your example. The explanation will only show up if you add an example, too.", + "placeholder": "Please remember that you were not expected to come up with the exact same solution. It's just a good example.", + "optional": true, + "widget": "html", + "enterMode": "div", + "tags": [ + "strong", + "em", + "u", + "a", + "ul", + "ol", + "hr", + "code" + ] + }, + { + "name": "sample", + "type": "text", + "label": "Sample solution text", + "importance": "low", + "description": "The student will see a \"Show solution\" button after submitting if you provide some text here.", + "optional": true, + "widget": "html", + "enterMode": "div", + "tags": [ + "strong", + "a" + ] + } + ] + }, + { + "name": "keywords", + "label": "Keywords", + "importance": "high", + "type": "list", + "widgets": [ + { + "name": "VerticalTabs", + "label": "Default" + } + ], + "min": 1, + "entity": "Keyword", + "field": { + "name": "groupy", + "type": "group", + "label": "Keyword", + "fields": [ + { + "name": "keyword", + "type": "text", + "label": "Keyword", + "description": "Keyword or phrase to look for. Use an asterisk '*' as a wildcard for one or more characters. Use a slash '/' at the beginning and the end to use a regular expression.", + "importance": "medium" + }, + { + "name": "alternatives", + "type": "list", + "label": "Variations", + "description": "Add optional variations for this keyword. Example: For a 'city' add alternatives 'town', 'municipality' etc. Points will be awarded if the user includes any of the specified alternatives.", + "importance": "medium", + "entity": "variation", + "optional": true, + "min": 0, + "field": { + "name": "alternative", + "type": "text", + "label": "Keyword variation" + } + }, + { + "name": "options", + "type": "group", + "label": "Points, Options and Feedback", + "importance": "low", + "fields": [ + { + "name": "points", + "type": "number", + "label": "Points", + "default": 1, + "description": "Points that the user will get if he/she includes this keyword or its alternatives in the answer.", + "min": 0 + }, + { + "name": "occurrences", + "type": "number", + "label": "Occurrences", + "default": 1, + "description": "Define how many occurrences of the keyword or its variations should be awarded with points.", + "min": 1 + }, + { + "name": "caseSensitive", + "type": "boolean", + "label": "Case sensitive", + "default": true, + "description": "Makes sure the user input has to be exactly the same as the answer." + }, + { + "name": "forgiveMistakes", + "type": "boolean", + "label": "Forgive minor mistakes", + "description": "This will accept minor spelling mistakes (3-9 characters: 1 mistake, more than 9 characters: 2 mistakes)." + }, + { + "name": "feedbackIncluded", + "type": "text", + "label": "Feedback if keyword included", + "description": "This feedback will be displayed if the user includes this keyword or its alternatives in the answer.", + "optional": true, + "maxLength": 1000 + }, + { + "name": "feedbackMissed", + "type": "text", + "label": "Feedback if keyword missing", + "description": "This feedback will be displayed if the user doesn’t include this keyword or its alternatives in the answer.", + "optional": true, + "maxLength": 1000 + }, + { + "name": "feedbackIncludedWord", + "type": "select", + "label": "Feedback word shown if keyword included", + "importance": "low", + "description": "This option allows you to specify which word should be shown in front of your feedback if a keyword was found in the text.", + "optional": false, + "default": "keyword", + "options": [ + { + "value": "keyword", + "label": "keyword" + }, + { + "value": "alternative", + "label": "alternative found" + }, + { + "value": "answer", + "label": "answer given" + }, + { + "value": "none", + "label": "none" + } + ] + }, + { + "name": "feedbackMissedWord", + "type": "select", + "label": "Feedback word shown if keyword missing", + "importance": "low", + "description": "This option allows you to specify which word should be shown in front of your feedback if a keyword was not found in the text.", + "optional": false, + "default": "none", + "options": [ + { + "value": "keyword", + "label": "keyword" + }, + { + "value": "none", + "label": "none" + } + ] + } + ] + } + ] + } + }, + { + "name": "overallFeedback", + "type": "group", + "label": "Overall Feedback", + "importance": "low", + "expanded": true, + "fields": [ + { + "name": "overallFeedback", + "type": "list", + "widgets": [ + { + "name": "RangeList", + "label": "Default" + } + ], + "importance": "high", + "label": "Define custom feedback for any score range", + "description": "Click the \"Add range\" button to add as many ranges as you need. Example: 0-20% Bad score, 21-91% Average Score, 91-100% Great Score!", + "entity": "range", + "min": 1, + "defaultNum": 1, + "optional": true, + "field": { + "name": "overallFeedback", + "type": "group", + "importance": "low", + "fields": [ + { + "name": "from", + "type": "number", + "label": "Score Range", + "min": 0, + "max": 100, + "default": 0, + "unit": "%" + }, + { + "name": "to", + "type": "number", + "min": 0, + "max": 100, + "default": 100, + "unit": "%" + }, + { + "name": "feedback", + "type": "text", + "label": "Feedback for defined score range", + "importance": "low", + "placeholder": "Fill in the feedback", + "optional": true + } + ] + } + } + ] + }, + { + "name": "behaviour", + "type": "group", + "label": "Behavioural settings", + "importance": "low", + "description": "These options will let you control how the task behaves.", + "fields": [ + { + "name": "minimumLength", + "label": "Minimum number of characters", + "type": "number", + "description": "Specify the minimum number of characters that the user must enter.", + "importance": "low", + "optional": true, + "min": "0" + }, + { + "name": "maximumLength", + "label": "Maximum number of characters", + "type": "number", + "description": "Specify the maximum number of characters that the user can enter.", + "importance": "low", + "optional": true, + "min": "0" + }, + { + "name": "inputFieldSize", + "label": "Input field size", + "type": "select", + "importance": "low", + "description": "The size of the input field in amount of lines it will cover", + "options": [ + { + "value": "1", + "label": "1 line" + }, + { + "value": "3", + "label": "3 lines" + }, + { + "value": "10", + "label": "10 lines" + } + ], + "default": "10" + }, + { + "name": "enableRetry", + "label": "Enable \"Retry\"", + "type": "boolean", + "importance": "low", + "description": "If checked, learners can retry the task.", + "default": true, + "optional": true + }, + { + "name": "ignoreScoring", + "label": "Ignore scoring", + "type": "boolean", + "importance": "low", + "description": "If checked, learners will only see the feedback that you provided for the keywords, but no score.", + "default": false, + "optional": true + }, + { + "name": "pointsHost", + "label": "Points in host environment", + "type": "number", + "importance": "low", + "description": "Used to award points in host environment merely for answering (not shown to learner).", + "min": 0, + "default": 1, + "widget": "showWhen", + "showWhen": { + "rules": [ + { + "field": "ignoreScoring", + "equals": true + } + ] + } + }, + { + "name": "percentagePassing", + "type": "number", + "label": "Passing percentage", + "description": "Percentage that's necessary for passing", + "optional": true, + "min": 0, + "max": 100, + "widget": "showWhen", + "showWhen": { + "rules": [ + { + "field": "ignoreScoring", + "equals": false + } + ] + } + }, + { + "name": "percentageMastering", + "type": "number", + "label": "Mastering percentage", + "description": "Percentage that's necessary for mastering. Setting the mastering percentage below 100 % will lower the maximum possible score accordingly. It's intended to give some leeway to students, not to \"graciously accept\" solutions that do not contain all keywords.", + "optional": true, + "min": 0, + "max": 100, + "widget": "showWhen", + "showWhen": { + "rules": [ + { + "field": "ignoreScoring", + "equals": false + } + ] + } + }, + { + "name": "overrideCaseSensitive", + "type": "select", + "label": "Override case sensitive", + "importance": "low", + "description": "This option determines if the \"Case sensitive\" option will be activated for all keywords.", + "optional": true, + "options": [ + { + "value": "on", + "label": "Enabled" + }, + { + "value": "off", + "label": "Disabled" + } + ] + }, + { + "name": "overrideForgiveMistakes", + "type": "select", + "label": "Override forgive mistakes", + "importance": "low", + "description": "This option determines if the \"Forgive mistakes\" option will be activated for all keywords.", + "optional": true, + "options": [ + { + "value": "on", + "label": "Enabled" + }, + { + "value": "off", + "label": "Disabled" + } + ] + } + ] + }, + { + "name": "checkAnswer", + "type": "text", + "label": "Text for \"Check\" button", + "importance": "low", + "default": "Check", + "common": true + }, + { + "name": "submitAnswer", + "type": "text", + "label": "Text for \"Submit\" button", + "importance": "low", + "default": "Submit", + "common": true + }, + { + "name": "tryAgain", + "label": "Text for \"Retry\" button", + "type": "text", + "importance": "low", + "default": "Retry", + "common": true + }, + { + "name": "showSolution", + "type": "text", + "label": "Text for \"Show solution\" button", + "importance": "low", + "default": "Show solution", + "common": true + }, + { + "name": "feedbackHeader", + "type": "text", + "label": "Header for panel containing feedback for included/missing keywords", + "importance": "low", + "default": "Feedback", + "common": true + }, + { + "name": "solutionTitle", + "type": "text", + "label": "Label for solution", + "importance": "low", + "default": "Sample solution", + "common": true + }, + { + "name": "remainingChars", + "type": "text", + "label": "Remaining characters", + "importance": "low", + "common": true, + "default": "Remaining characters: @chars", + "description": "Message for remaining characters. You can use @chars which will be replaced by the corresponding number." + }, + { + "name": "notEnoughChars", + "type": "text", + "label": "Not enough characters", + "importance": "low", + "common": true, + "default": "You must enter at least @chars characters!", + "description": "Message to indicate that the text doesn't contain enough characters. You can use @chars which will be replaced by the corresponding number." + }, + { + "name": "messageSave", + "type": "text", + "label": "Save message", + "description": "Message indicating that the text has been saved", + "importance": "low", + "common": true, + "default": "saved" + }, + { + "name": "ariaYourResult", + "type": "text", + "label": "Your result (not displayed)", + "description": "Accessibility text used for readspeakers. @score will be replaced by the number of points. @total will be replaced by the maximum possible points.", + "importance": "low", + "common": true, + "default": "You got @score out of @total points" + }, + { + "name": "ariaNavigatedToSolution", + "type": "text", + "label": "Navigation message (not displayed)", + "description": "Accessibility text used for readspeakers", + "importance": "low", + "common": true, + "default": "Navigated to newly included sample solution after textarea." + }, + { + "name": "ariaCheck", + "type": "text", + "label": "Assistive technology description for \"Check\" button", + "importance": "low", + "common": true, + "default": "Check the answers." + }, + { + "name": "ariaShowSolution", + "type": "text", + "label": "Assistive technology description for \"Show Solution\" button", + "importance": "low", + "common": true, + "default": "Show the solution. You will be provided with a sample solution." + }, + { + "name": "ariaRetry", + "type": "text", + "label": "Assistive technology description for \"Retry\" button", + "importance": "low", + "common": true, + "default": "Retry the task. You can improve your previous answer if the author allowed that." + } +] diff --git a/activities/module01/essay-395/H5P.Essay-1.4/styles/essay.css b/activities/module01/essay-395/H5P.Essay-1.4/styles/essay.css new file mode 100644 index 0000000..7db6b76 --- /dev/null +++ b/activities/module01/essay-395/H5P.Essay-1.4/styles/essay.css @@ -0,0 +1,98 @@ +@keyframes h5p-essay-input-field-message-save-opacity { + from {opacity: 0;} + to {opacity: 1;} +} + +.h5p-essay { +} +.h5p-essay .h5p-essay-title { + width: auto; + overflow-y: auto; +} + +.h5p-essay .h5p-essay-solution-container { + margin: 0 0 0.5em 0; + padding: 1em; + background: #FAFAFA; +} + +.h5p-essay .h5p-essay-solution-title { + font-size: 1.125em; + margin-bottom: 0.5em; +} + +.h5p-essay .h5p-essay-solution-introduction { + font-size: 1em; + line-height: 1.2; + margin-bottom: 1em; +} + +.h5p-essay .h5p-essay-solution-sample { + background: #FFFFFF; + border: 1px solid #e0e0e0; + overflow: auto; + overflow-x: hidden; + list-style: none; + padding: 0; + margin: 0; + flex-shrink: 0; + flex-wrap: wrap; +} + +.h5p-essay .h5p-essay-solution-sample-text { + padding: 0.5em 1em 0.5em 1em; + margin: 0; + line-height: 1.4; +} + +.h5p-essay .h5p-essay-input-field-textfield { + padding: 0.25em 0.4em; + width: 100%; + box-sizing: border-box; + resize: none; + border: 1px solid #C7C7C7; + border-top: 2px solid #C7C7C7; + font-size: 16px; + font-family: Arial, sans-serif; +} + +.h5p-essay .h5p-essay-input-field-textfield:focus { + background-color: #fff; +} + +/* Reduce bottom and top margin of children */ +.h5p-essay .h5p-essay-input-field-label > * { + margin-top: 0.2em; + margin-bottom: 0.2em; +} + +.h5p-essay .h5p-essay-input-field-message-wrapper { + overflow:auto; +} + +.h5p-essay .h5p-essay-input-field-message-char { + font-size: 0.8em; + float: left; +} + +.h5p-essay .h5p-essay-input-field-message-char-important { + font-weight: bold; +} + +.h5p-essay .h5p-essay-input-field-message-save { + font-size: 0.8em; + float: right; +} + +.h5p-essay .h5p-essay-input-field-message-save-animation { + animation-name: h5p-essay-input-field-message-save-opacity; + animation-duration: 1s; +} + +.h5p-essay .h5p-essay-feedback-empty { + color: #999999; +} + +.h5p-essay .h5p-question-explanation-container { + margin: 0 1em; +} diff --git a/activities/module01/essay-395/H5P.Essay-1.4/upgrades.js b/activities/module01/essay-395/H5P.Essay-1.4/upgrades.js new file mode 100644 index 0000000..ea9acc8 --- /dev/null +++ b/activities/module01/essay-395/H5P.Essay-1.4/upgrades.js @@ -0,0 +1,24 @@ +var H5PUpgrades = H5PUpgrades || {}; + +H5PUpgrades['H5P.Essay'] = (function () { + return { + 1: { + /** + * Asynchronous content upgrade hook. + * + * Add new default parameters. + * + * @param {Object} parameters + * @param {function} finished + */ + 2: function (parameters, finished, extras) { + parameters.media = {}; + parameters.behaviour.pointsHost = 1; + parameters.ariaYourResult = 'You got @score out of @total points'; + parameters.ariaNavigatedToSolution = 'Navigated to newly included sample solution after textarea.'; + + finished(null, parameters, extras); + } + } + }; +})(); diff --git a/activities/module01/essay-395/H5P.FontIcons-1.0/fonts/h5p.eot b/activities/module01/essay-395/H5P.FontIcons-1.0/fonts/h5p.eot new file mode 100644 index 0000000..e6d78c9 Binary files /dev/null and b/activities/module01/essay-395/H5P.FontIcons-1.0/fonts/h5p.eot differ diff --git a/activities/module01/essay-395/H5P.FontIcons-1.0/fonts/h5p.svg b/activities/module01/essay-395/H5P.FontIcons-1.0/fonts/h5p.svg new file mode 100644 index 0000000..39f005e --- /dev/null +++ b/activities/module01/essay-395/H5P.FontIcons-1.0/fonts/h5p.svg @@ -0,0 +1,93 @@ + + + + + + +{ + "fontFamily": "h5p", + "description": "Font generated by IcoMoon.", + "majorVersion": 1, + "minorVersion": 1, + "version": "Version 1.1", + "fontId": "h5p", + "psName": "h5p", + "subFamily": "Regular", + "fullName": "h5p" +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/activities/module01/essay-395/H5P.FontIcons-1.0/fonts/h5p.ttf b/activities/module01/essay-395/H5P.FontIcons-1.0/fonts/h5p.ttf new file mode 100644 index 0000000..f2303d0 Binary files /dev/null and b/activities/module01/essay-395/H5P.FontIcons-1.0/fonts/h5p.ttf differ diff --git a/activities/module01/essay-395/H5P.FontIcons-1.0/fonts/h5p.woff b/activities/module01/essay-395/H5P.FontIcons-1.0/fonts/h5p.woff new file mode 100644 index 0000000..acd54ec Binary files /dev/null and b/activities/module01/essay-395/H5P.FontIcons-1.0/fonts/h5p.woff differ diff --git a/activities/module01/essay-395/H5P.FontIcons-1.0/library.json b/activities/module01/essay-395/H5P.FontIcons-1.0/library.json new file mode 100644 index 0000000..8ccf897 --- /dev/null +++ b/activities/module01/essay-395/H5P.FontIcons-1.0/library.json @@ -0,0 +1,14 @@ +{ + "title": "H5P.FontIcons", + "majorVersion": 1, + "minorVersion": 0, + "patchVersion": 6, + "runnable": 0, + "machineName": "H5P.FontIcons", + "author": "Joubel", + "preloadedCss": [ + { + "path": "styles/h5p-font-icons.css" + } + ] +} diff --git a/activities/module01/essay-395/H5P.FontIcons-1.0/styles/h5p-font-icons.css b/activities/module01/essay-395/H5P.FontIcons-1.0/styles/h5p-font-icons.css new file mode 100644 index 0000000..a6c71f9 --- /dev/null +++ b/activities/module01/essay-395/H5P.FontIcons-1.0/styles/h5p-font-icons.css @@ -0,0 +1,10 @@ +@font-face { + font-family: 'H5PFontIcons'; + src: url('../fonts/h5p.eot?105'); + src: url('../fonts/h5p.eot?105#iefix') format('embedded-opentype'), + url('../fonts/h5p.ttf?105') format('truetype'), + url('../fonts/h5p.woff?105') format('woff'), + url('../fonts/h5p.svg?105#H5PFontIcons') format('svg'); + font-weight: normal; + font-style: normal; +} diff --git a/activities/module01/essay-395/H5P.JoubelUI-1.3/css/joubel-help-dialog.css b/activities/module01/essay-395/H5P.JoubelUI-1.3/css/joubel-help-dialog.css new file mode 100644 index 0000000..bd49d6f --- /dev/null +++ b/activities/module01/essay-395/H5P.JoubelUI-1.3/css/joubel-help-dialog.css @@ -0,0 +1,67 @@ +/* Main Container */ +.joubel-help-text-dialog-box { + position: absolute; + width: 100%; + height: 100%; + top: 0; + left: 0; + color: #555; + z-index: 2; +} + +/* Background for help dialog */ +.joubel-help-text-dialog-background { + position: absolute; + width: 100%; + height: 100%; + top: 0; + left: 0; + background: #555555; + opacity: 0.75; +} + +/* ------------------------------------ Main content container ------------------------ */ +.joubel-help-text-dialog-container { + display: block; + position: absolute; + top: 3.5%; + left: 20%; + width: 60%; + background: #fff; + opacity: 1; + max-height: 93%; + overflow: auto; +} + +/* Header */ +.joubel-help-text-header { + font-size: 1.1em; + border-bottom: 1px solid #E0E0E0; + padding: 0.75em 3em 0.75em 1.5em; +} + +/* Body */ +.joubel-help-text-body { + padding: 0.5em 1.5em; + margin: 1em 0 2em; +} + +/* Close help dialog container */ +.joubel-help-text-remove { + position: absolute; + right: 1.5em; + top: 0.8em; + cursor: pointer; +} + +.joubel-help-text-remove:hover { + color: #333; +} + +.joubel-help-text-remove:before { + font-family: 'H5PFontAwesome4'; + content: '\f00d'; + font-size: 1.3em; + right: 0em; + top: 0em; +} diff --git a/activities/module01/essay-395/H5P.JoubelUI-1.3/css/joubel-icon.css b/activities/module01/essay-395/H5P.JoubelUI-1.3/css/joubel-icon.css new file mode 100644 index 0000000..4ff0949 --- /dev/null +++ b/activities/module01/essay-395/H5P.JoubelUI-1.3/css/joubel-icon.css @@ -0,0 +1,152 @@ +[class^="joubel-icon-"], [class*=" joubel-icon-"] { + /* use !important to prevent issues with browser extensions that change fonts */ + font-family: 'H5PFontIcons' !important; + speak: none; + font-size: 1.5em; + line-height: 1.5em; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + word-wrap: normal; + cursor: pointer; + + /* Better Font Rendering =========== */ + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +/* Comment icon */ +.joubel-icon-comment-normal .h5p-icon-shadow:before { + content: "\e90a"; + color: rgb(221, 221, 221); +} +.joubel-icon-comment-normal .h5p-icon-speech-bubble:before { + content: "\e908"; + margin-left: -1em; + color: rgb(206, 114, 193); +} +.joubel-icon-comment-normal .h5p-icon-question:before { + content: "\e906"; + margin-left: -1em; + color: rgb(255, 255, 255); +} +.joubel-icon-comment-normal:hover .h5p-icon-speech-bubble:before { + color: rgb(188, 92, 163); +} +.joubel-icon-comment-normal:active .h5p-icon-speech-bubble:before { + color: rgb(206, 114, 193); + position: relative; + top: 0.05em; + left: 0.05em; +} +.joubel-icon-comment-normal:active .h5p-icon-question:before { + position: relative; + top: 0.05em; + left: 0.05em; +} + +/* Tip icon */ +.joubel-icon-tip-normal .h5p-icon-shadow:before { + content: "\e90a"; + color: rgb(221, 221, 221); +} +.joubel-icon-tip-normal .h5p-icon-speech-bubble:before { + content: "\e908"; + margin-left: -1em; + color: rgb(53, 128, 195); +} +.joubel-icon-tip-normal .h5p-icon-info:before { + content: "\e905"; + margin-left: -1em; + color: rgb(255, 255, 255); +} +.joubel-icon-tip-normal:hover .h5p-icon-speech-bubble:before { + color: rgb(72, 155, 213); +} +.joubel-icon-tip-normal:active .h5p-icon-speech-bubble:before { + color: rgb(72, 155, 213); + position: relative; + top: 0.05em; + left: 0.05em; +} +.joubel-icon-tip-normal:active .h5p-icon-info:before { + position: relative; + top: 0.05em; + left: 0.05em; +} + +/* Edit icon */ +.joubel-icon-edit .h5p-icon-circle:before { + content: "\e90d"; + color: #1d74c8; + font-size: 1.5em; +} +.joubel-icon-edit .h5p-icon-pencil:before { + content: "\e90c"; + color: #1d74c8; + font-size: 0.8em; + text-align: center; + position: absolute; + margin-left: -1.42em; +} +.joubel-icon-edit:hover .h5p-icon-circle:before { + content: "\e90e"; + color: #1d74c8; +} +.joubel-icon-edit:hover .h5p-icon-pencil:before { + color: #ffffff; +} + +/* Approve icon */ +.joubel-icon-approve .h5p-icon-circle:before { + content: "\e90d"; + color: #3ea35f; + font-size: 1.5em; +} +.joubel-icon-approve .h5p-icon-check:before { + content: "\e601"; + color: #3ea35f; + font-size: 0.8em; + text-align: center; + position: absolute; + margin-left: -1.42em; +} +.joubel-icon-approve:hover .h5p-icon-circle:before { + content: "\e90e"; +} +.joubel-icon-approve:hover .h5p-icon-check:before { + color: #ffffff; +} + +/* Cancel icon */ +.joubel-icon-cancel .h5p-icon-circle:before { + content: "\e90d"; + color: #de3354; + font-size: 1.5em; +} +.joubel-icon-cancel .h5p-icon-cross:before { + content: "\e600"; + color: #de3354; + font-size: 0.85em; + text-align: center; + position: absolute; + margin-left: -1.38em; +} +.joubel-icon-cancel:hover .h5p-icon-circle:before { + content: "\e90e"; +} +.joubel-icon-cancel:hover .h5p-icon-cross:before { + color: #ffffff; +} + +/* Custom override CSS */ +.joubel-icon-tip-normal.help-icon:before { + font-family: 'H5PFontAwesome4'; + content: "\f059"; +} + +/* Hide icon layers if using font awesome */ +.joubel-icon-tip-normal.help-icon > span { + display: none; +} diff --git a/activities/module01/essay-395/H5P.JoubelUI-1.3/css/joubel-message-dialog.css b/activities/module01/essay-395/H5P.JoubelUI-1.3/css/joubel-message-dialog.css new file mode 100644 index 0000000..079b4f3 --- /dev/null +++ b/activities/module01/essay-395/H5P.JoubelUI-1.3/css/joubel-message-dialog.css @@ -0,0 +1,25 @@ +@CHARSET "UTF-8"; + +.joubel-message-dialog { + position: absolute; + bottom: 0; + left: 0; + right: 0; + width: 100%; + padding: .3em; + z-index: 11; + box-sizing: border-box; + -moz-box-sizing: border-box; + border-top: 1px solid #ffcd0d; + background-color: #fcffcc; + text-align: center; + font-size: 0.8em; +} +.joubel-message-dialog:before { + font-family: 'H5PFontAwesome4'; + content: '\f05a'; + padding-right: .5em; + font-size: 1.3em; + position: relative; + top: 0.1em; +} \ No newline at end of file diff --git a/activities/module01/essay-395/H5P.JoubelUI-1.3/css/joubel-progress-circle.css b/activities/module01/essay-395/H5P.JoubelUI-1.3/css/joubel-progress-circle.css new file mode 100644 index 0000000..1697ea3 --- /dev/null +++ b/activities/module01/essay-395/H5P.JoubelUI-1.3/css/joubel-progress-circle.css @@ -0,0 +1,56 @@ +.joubel-progress-circle-wrapper{ + display: inline-block; + padding: 0em 1em; +} +.joubel-progress-circle-percentage{ + position: relative; + font-size: 1em; +} + +.joubel-progress-circle-circle{ + -webkit-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + + display: -webkit-box; /* OLD - iOS 6-, Safari 3.1-6 */ + display: -ms-flexbox; /* TWEENER - IE 10 */ + display: -webkit-flex; /* NEW - Chrome */ + display: flex; /* NEW, Spec - Opera 12.1, Firefox 20+ */ + + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + + -webkit-justify-content: center; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + + position: relative; + + top: 0.151em; + left: 0.151em; + text-align: center; + width: 2.7em; + height: 2.7em; + + -webkit-border-radius: 100%; /* Safari 3-4, iOS 1-3.2, Android 1.6- */ + -moz-border-radius: 100%; /* Firefox 1-3.6 */ + border-radius: 100%; /* Opera 10.5, IE 9, Safari 5, Chrome, Firefox 4, iOS 4, Android 2.1+ */ + + background-color: #fff; +} + +.joubel-progress-circle-active-border{ + position: relative; + text-align: center; + width: 3em; + height: 3em; + + -webkit-border-radius: 100%; /* Safari 3-4, iOS 1-3.2, Android 1.6- */ + -moz-border-radius: 100%; /* Firefox 1-3.6 */ + border-radius: 100%; /* Opera 10.5, IE 9, Safari 5, Chrome, Firefox 4, iOS 4, Android 2.1+ */ + + background-color: #1a73d9; +} diff --git a/activities/module01/essay-395/H5P.JoubelUI-1.3/css/joubel-progressbar.css b/activities/module01/essay-395/H5P.JoubelUI-1.3/css/joubel-progressbar.css new file mode 100644 index 0000000..0c48c97 --- /dev/null +++ b/activities/module01/essay-395/H5P.JoubelUI-1.3/css/joubel-progressbar.css @@ -0,0 +1,38 @@ +.h5p-joubelui-progressbar { + width: 100%; + position: absolute; + left: 0; + bottom: 0; + right: 0; + height: .25em; + background: #fff; + -webkit-box-shadow: 0px -1px 3px 0px rgba(1,72,118,0.75); + -moz-box-shadow: 0px -1px 3px 0px rgba(1,72,118,0.75); + box-shadow: 0px -1px 3px 0px rgba(1,72,118,0.75); +} + +.h5p-joubelui-progressbar-slide-status-text { + font-size: 0; + width: 0; + height: 0; +} + +.h5p-joubelui-progressbar-background { + position: absolute; + left: 0; + top: 0; + height: 100%; + width: 0; + background-color: #014876; + -webkit-transition: width .3s ease-in-out; + -moz-transition: width .3s ease-in-out; + -o-transition: width .3s ease-in-out; + transition: width .3s ease-in-out; +} +.h5p-joubelui-drop { + z-index: 1; +} +.drop-element.h5p-joubelui-drop .drop-content { + padding: .2em .8em; + font-weight: bold; +} diff --git a/activities/module01/essay-395/H5P.JoubelUI-1.3/css/joubel-score-bar.css b/activities/module01/essay-395/H5P.JoubelUI-1.3/css/joubel-score-bar.css new file mode 100644 index 0000000..e0b0b61 --- /dev/null +++ b/activities/module01/essay-395/H5P.JoubelUI-1.3/css/joubel-score-bar.css @@ -0,0 +1,159 @@ +.h5p-joubelui-score-bar { + display: inline-flex; + display: -webkit-inline-flexbox; + display: -ms-inline-flexbox; + display: -webkit-inline-flex; + width: 15em; + max-width: 100%; + background: #fff; + border-radius: 1.5em; + padding: 0.625em; + border: 1px solid rgba(0, 0, 0, 0.08); + box-sizing: border-box; + position: relative; +} +.h5p-joubelui-score-bar-visuals { + flex: 1; + -webkit-box-flex: 1; + -webkit-flex: 1; + position: relative; + overflow: visible; +} +.h5p-joubelui-score-bar-progress-wrapper { + position: relative; + margin-right: 1.7em; + height: 0.917em; + border-top-left-radius: 1.5em; + border-bottom-left-radius: 1.5em; + background: #ddd; +} +.h5p-joubelui-score-bar-progress { + overflow: hidden; + white-space: nowrap; + color: transparent; + position: absolute; + left: 0; + top: 0; + height: 100%; + width: 0; + border-top-left-radius: .5em; + border-bottom-left-radius: .5em; + background: #48b57e; /* For browsers not supporting linear-gradient */ + background: linear-gradient(to right, #52ca8d, #48b57e); + -webkit-transition: width 0.4s ease-in-out; + -moz-transition: width 0.4s ease-in-out; + -o-transition: width 0.4s ease-in-out; + transition: width 0.4s ease-in-out; + -webkit-backface-visibility: hidden; +} +/* The star */ +.h5p-joubelui-score-bar-star { + height: 1.8em; + width: 2.1em; + position: absolute; + right: 0; + top: -0.4em; + overflow: visible; +} +.h5p-joubelui-score-bar-full-score.h5p-joubelui-score-bar-animation-active .h5p-joubelui-score-bar-star { + -webkit-animation: pound 0.8s 1; + animation: pound 0.8s 1; +} +@keyframes pound { + from { + transform: scale(0); + } + 20% { + transform: scale(1.4); + } + 60% { + transform: scale(0.8); + } + 80% { + transform: scale(1.2); + } + to { + transform: scale(1); + } +} +@-webkit-keyframes pound { + from { + -webkit-transform: scale(0); + } + 20% { + -webkit-transform: scale(1.4); + } + 60% { + -webkit-transform: scale(0.8); + } + 80% { + -webkit-transform: scale(1.2); + } + to { + -webkit-transform: scale(1); + } +} +/* Styling the star */ +.h5p-joubelui-score-bar-star svg { + overflow: visible; +} +.h5p-joubelui-score-bar-star-shadow { + fill: #fff; +} +.h5p-joubelui-score-bar-star-border { + fill: none; + stroke: #ddd; + stroke-miterlimit: 10; + stroke-width: 3px; +} +.h5p-joubelui-score-bar-star-fill { + fill: #ddd; +} +.h5p-joubelui-score-bar-full-score .h5p-joubelui-score-bar-star-border { + stroke: #ab741a; + stroke-width: 6; +} +.h5p-joubelui-score-bar-star-fill-full-score { + visibility: hidden; + fill: #ffc80b; +} +.h5p-joubelui-score-bar-full-score .h5p-joubelui-score-bar-star-fill { + /* This will be a fallback for browsers not supporting the filter, + i.e. Safari */ + fill: #ffc80b; +} +.h5p-joubelui-score-bar-full-score .h5p-joubelui-score-bar-star-fill-full-score { + visibility: visible; +} + +/* The numeric part on the end (score / maxScore) */ +.h5p-joubelui-score-numeric { + margin: 0em 0.4em; + font-size: 1.333em; + line-height: 0.7; + font-weight: bold; +} +.h5p-score-bar-has-help .h5p-joubelui-score-numeric { + /* Need more space when icon is displayed */ + margin-right: 0.625em; +} +.h5p-joubelui-score-number { + color: #333; +} +.h5p-joubelui-score-number-separator { + color: #757575; + padding: 0 0.1em; +} +.h5p-joubelui-score-bar .joubel-tip-container { + position: absolute; + top: 0.1em; + right: 0.3em; + font-size: 1em; + line-height: 1; + color: #1a73d9; + margin-right: 0.2em; +} +.h5p-joubelui-score-bar .joubel-tip-container > .help-icon { + font-size: 1em; + line-height: 1; +} diff --git a/activities/module01/essay-395/H5P.JoubelUI-1.3/css/joubel-simple-rounded-button.css b/activities/module01/essay-395/H5P.JoubelUI-1.3/css/joubel-simple-rounded-button.css new file mode 100644 index 0000000..a2969b4 --- /dev/null +++ b/activities/module01/essay-395/H5P.JoubelUI-1.3/css/joubel-simple-rounded-button.css @@ -0,0 +1,28 @@ +.joubel-simple-rounded-button { + cursor: pointer; + display: inline-block; + margin: 0.25em 0; + padding: 0.3em 1.2em; + border-radius: 2em; + background-color: #1a73d9; + color: #FFFFFF; +} + +.joubel-simple-rounded-button:hover, +.joubel-simple-rounded-button:focus { + background-color: #1356a3; +} + +.joubel-simple-rounded-button:active { + position: relative; + background-color: #104888; + + -webkit-box-shadow: inset 0 4px 0px #0e407a; + -moz-box-shadow: inset 0 4px 0px #0e407a; + box-shadow: inset 0 4px 0px #0e407a; +} + +.joubel-simple-rounded-button:active .joubel-simple-rounded-button-text { + position: relative; + top: 2px; +} diff --git a/activities/module01/essay-395/H5P.JoubelUI-1.3/css/joubel-slider.css b/activities/module01/essay-395/H5P.JoubelUI-1.3/css/joubel-slider.css new file mode 100644 index 0000000..87caa74 --- /dev/null +++ b/activities/module01/essay-395/H5P.JoubelUI-1.3/css/joubel-slider.css @@ -0,0 +1,29 @@ +.h5p-joubel-ui-slider { + -webkit-transition: -webkit-transform 0.3s ease-in-out; + -moz-transition: -moz-transform 0.3s ease-in-out; + -ms-transition: -ms-transform 0.3s ease-in-out; + transition: transform 0.3s ease-in-out; + + /* Avoid flickering */ + -webkit-transform: translateX(0); + -moz-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + + height: 100%; +} +.h5p-joubel-ui-slide { + position: absolute; + width: 100%; + height: 100%; + + top: 0; + left: 0; + + display: none; +} +.h5p-joubel-ui-slide.current { + display: block; +} diff --git a/activities/module01/essay-395/H5P.JoubelUI-1.3/css/joubel-speech-bubble.css b/activities/module01/essay-395/H5P.JoubelUI-1.3/css/joubel-speech-bubble.css new file mode 100644 index 0000000..937cc1a --- /dev/null +++ b/activities/module01/essay-395/H5P.JoubelUI-1.3/css/joubel-speech-bubble.css @@ -0,0 +1,50 @@ +@CHARSET "UTF-8"; + +.joubel-speech-bubble { + position: absolute; + color: #333; + z-index: 301; + margin-top: 0.45em; + min-width: 1em; + opacity: 0; + transition: opacity 0.5s ease; +} +.joubel-speech-bubble p { + margin: 0.75em 0; +} +.joubel-speech-bubble p:first-child { + margin-top: 0.25em; +} +.joubel-speech-bubble p:last-child { + margin-bottom: 0.25em; +} +.joubel-speech-bubble.show { + opacity: 1; +} +.joubel-speech-bubble-inner { + background: #fbfbfb; + box-shadow: 0 0 0.5em #2c2c2c; + border-radius: 0.5em; + padding: 0.2em 0.5em; + text-align: left; + position: relative; + word-wrap: break-word; /* Long words have to break */ + z-index: 1; +} +.joubel-speech-bubble-inner-tail, +.joubel-speech-bubble-tail { + position: absolute; + /* Setting these in pixels is intentional. We use it when calculating placement of bubble */ + width: 12px; + height: 12px; + background: #fbfbfb; + -webkit-transform: rotate(45deg); + -moz-transform: rotate(45deg); + -ms-transform: rotate(45deg); + -o-transform: rotate(45deg); + transform: rotate(45deg); + z-index: -1; +} +.joubel-speech-bubble-tail { + box-shadow: 0 0 0.5em #2c2c2c; +} diff --git a/activities/module01/essay-395/H5P.JoubelUI-1.3/css/joubel-tip.css b/activities/module01/essay-395/H5P.JoubelUI-1.3/css/joubel-tip.css new file mode 100644 index 0000000..d973f69 --- /dev/null +++ b/activities/module01/essay-395/H5P.JoubelUI-1.3/css/joubel-tip.css @@ -0,0 +1,73 @@ +.joubel-tip-container { + display: inline-block; + font-weight: normal; + color: #777; + cursor: pointer; +} +.joubel-tip-container:hover { + color: #333; +} + +.joubel-tip-container:hover:before { + content: attr(aria-label); + + position: absolute; + left: 50%; + z-index: 5; + + padding: 0.25em 0.75em; + background: #212121; + color: white; + white-space: nowrap; + line-height: 1.5; + box-shadow: 0 0 0.5em #858585; + transform: translate(-50%, -1.25em); +} + +.joubel-tip-container:focus { + outline: 0; + box-shadow: 0px 0px 5px 2px rgba(140,185,240,1); + outline: rgba(140,185,240,1) solid 1px; +} +.using-mouse .joubel-tip-container:focus { + box-shadow: none; +} +.joubel-tip-container.be-quiet:focus { + outline: none; +} +.joubel-tip-container.be-quiet { + pointer-events: none; +} +.joubel-tip-icon { + text-align: center; + font-size: 1.5em; + line-height: 1.5em; + width: 1.5em; + height: 1.5em; + pointer-events: none; +} +.joubel-tip-icon:before { + font-family: Joubel; + content: "\e888"; + + /* Better Font Rendering */ + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.joubel-tip-icon.help-icon:before { + font-family: 'H5PFontAwesome4'; + content: "\f059"; +} + +.joubel-tip-container * { + pointer-events: none; +} + +.joubel-tip-container .hidden-but-read { + position: absolute; + top: 0; + left: 0; + width: 0; + height: 0; + overflow: hidden; +} \ No newline at end of file diff --git a/activities/module01/essay-395/H5P.JoubelUI-1.3/css/joubel-ui.css b/activities/module01/essay-395/H5P.JoubelUI-1.3/css/joubel-ui.css new file mode 100644 index 0000000..95ac94e --- /dev/null +++ b/activities/module01/essay-395/H5P.JoubelUI-1.3/css/joubel-ui.css @@ -0,0 +1,96 @@ +@CHARSET "UTF-8"; + +/* Styling of button */ +.h5peditor .ui-dialog .h5p-joubelui-button, +.h5peditor .h5p-joubelui-button, +.h5p-joubelui-button { + font-size: 1em; + line-height: 1.2; + margin: 0 0.5em 1em; + padding: 0.5em 1.25em; + border-radius: 2em; + + background: #1a73d9; + color: #ffffff; + + cursor: pointer; + border: none; + box-shadow: none; + -webkit-transform: translateZ(0); + transform: translateZ(0); + + display: inline-block; + text-align: center; + text-shadow: none; + text-decoration: none; + vertical-align: baseline; +} +.h5p-joubelui-button:first-child { + margin: 0 0.5em 1em 0; +} + +.h5p-joubelui-button:last-child { + margin: 0 0 1em 0.5em; +} + +.h5p-joubelui-button:first-child:last-child { + margin: 0 0 1em; +} + +/* Truncated buttons */ +.h5p-joubelui-button.truncated { + width: 2.235em; + height: 2.235em; + border-radius: 50%; + padding: 0; + text-align: center; +} + +.h5p-joubelui-button.truncated:before { + padding: 0; +} + +.h5p-joubelui-button:hover, +.h5p-joubelui-button:focus { + background: #1356a3; + color: #fff; + text-decoration: none; + -webkit-transition: initial; + -moz-transition: initial; + -o-transition: initial; + transition: initial; +} +.h5p-joubelui-button:active { + position: relative; + background: #104888; + + -webkit-box-shadow: inset 0 4px 0 #0e407a; + -moz-box-shadow: inset 0 4px 0 #0e407a; + box-shadow: inset 0 4px 0 #0e407a; +} +.h5p-joubelui-button:active .h5p-joubelui-button-text { + position: relative; + top: 2px; +} + +.h5p-joubelui-button:before { + font-family: 'H5PFontAwesome4'; + padding-right: 0.5em; +} + +.h5p-question-try-again:before { + content: "\F01E"; +} + +.h5p-question-show-solution:before { + content: "\F06E"; +} + +.h5p-question-check-answer:before { + content: "\F058"; +} + +/* Remove outline for all elements having tabIndex="-1"*/ +.h5p-content [tabIndex="-1"] { + outline: none; +} diff --git a/activities/module01/essay-395/H5P.JoubelUI-1.3/fonts/joubel.eot b/activities/module01/essay-395/H5P.JoubelUI-1.3/fonts/joubel.eot new file mode 100644 index 0000000..572c2ed Binary files /dev/null and b/activities/module01/essay-395/H5P.JoubelUI-1.3/fonts/joubel.eot differ diff --git a/activities/module01/essay-395/H5P.JoubelUI-1.3/fonts/joubel.svg b/activities/module01/essay-395/H5P.JoubelUI-1.3/fonts/joubel.svg new file mode 100644 index 0000000..bb9e651 --- /dev/null +++ b/activities/module01/essay-395/H5P.JoubelUI-1.3/fonts/joubel.svg @@ -0,0 +1,30 @@ + + + +Generated by IcoMoon + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/activities/module01/essay-395/H5P.JoubelUI-1.3/fonts/joubel.ttf b/activities/module01/essay-395/H5P.JoubelUI-1.3/fonts/joubel.ttf new file mode 100644 index 0000000..fbb17f7 Binary files /dev/null and b/activities/module01/essay-395/H5P.JoubelUI-1.3/fonts/joubel.ttf differ diff --git a/activities/module01/essay-395/H5P.JoubelUI-1.3/fonts/joubel.woff b/activities/module01/essay-395/H5P.JoubelUI-1.3/fonts/joubel.woff new file mode 100644 index 0000000..6c7b727 Binary files /dev/null and b/activities/module01/essay-395/H5P.JoubelUI-1.3/fonts/joubel.woff differ diff --git a/activities/module01/essay-395/H5P.JoubelUI-1.3/js/joubel-help-dialog.js b/activities/module01/essay-395/H5P.JoubelUI-1.3/js/joubel-help-dialog.js new file mode 100644 index 0000000..135c597 --- /dev/null +++ b/activities/module01/essay-395/H5P.JoubelUI-1.3/js/joubel-help-dialog.js @@ -0,0 +1,93 @@ +var H5P = H5P || {}; + +/** + * Class responsible for creating a help text dialog + */ +H5P.JoubelHelpTextDialog = (function ($) { + + var numInstances = 0; + /** + * Display a pop-up containing a message. + * + * @param {H5P.jQuery} $container The container which message dialog will be appended to + * @param {string} message The message + * @param {string} closeButtonTitle The title for the close button + * @return {H5P.jQuery} + */ + function JoubelHelpTextDialog(header, message, closeButtonTitle) { + H5P.EventDispatcher.call(this); + + var self = this; + + numInstances++; + var headerId = 'joubel-help-text-header-' + numInstances; + var helpTextId = 'joubel-help-text-body-' + numInstances; + + var $helpTextDialogBox = $('
', { + 'class': 'joubel-help-text-dialog-box', + 'role': 'dialog', + 'aria-labelledby': headerId, + 'aria-describedby': helpTextId + }); + + $('
', { + 'class': 'joubel-help-text-dialog-background' + }).appendTo($helpTextDialogBox); + + var $helpTextDialogContainer = $('
', { + 'class': 'joubel-help-text-dialog-container' + }).appendTo($helpTextDialogBox); + + $('
', { + 'class': 'joubel-help-text-header', + 'id': headerId, + 'role': 'header', + 'html': header + }).appendTo($helpTextDialogContainer); + + $('
', { + 'class': 'joubel-help-text-body', + 'id': helpTextId, + 'html': message, + 'role': 'document', + 'tabindex': 0 + }).appendTo($helpTextDialogContainer); + + var handleClose = function () { + $helpTextDialogBox.remove(); + self.trigger('closed'); + }; + + var $closeButton = $('
', { + 'class': 'joubel-help-text-remove', + 'role': 'button', + 'title': closeButtonTitle, + 'tabindex': 1, + 'click': handleClose, + 'keydown': function (event) { + // 32 - space, 13 - enter + if ([32, 13].indexOf(event.which) !== -1) { + event.preventDefault(); + handleClose(); + } + } + }).appendTo($helpTextDialogContainer); + + /** + * Get the DOM element + * @return {HTMLElement} + */ + self.getElement = function () { + return $helpTextDialogBox; + }; + + self.focus = function () { + $closeButton.focus(); + }; + } + + JoubelHelpTextDialog.prototype = Object.create(H5P.EventDispatcher.prototype); + JoubelHelpTextDialog.prototype.constructor = JoubelHelpTextDialog; + + return JoubelHelpTextDialog; +}(H5P.jQuery)); diff --git a/activities/module01/essay-395/H5P.JoubelUI-1.3/js/joubel-message-dialog.js b/activities/module01/essay-395/H5P.JoubelUI-1.3/js/joubel-message-dialog.js new file mode 100644 index 0000000..805d76a --- /dev/null +++ b/activities/module01/essay-395/H5P.JoubelUI-1.3/js/joubel-message-dialog.js @@ -0,0 +1,38 @@ +var H5P = H5P || {}; + +/** + * Class responsible for creating auto-disappearing dialogs + */ +H5P.JoubelMessageDialog = (function ($) { + + /** + * Display a pop-up containing a message. + * + * @param {H5P.jQuery} $container The container which message dialog will be appended to + * @param {string} message The message + * @return {H5P.jQuery} + */ + function JoubelMessageDialog ($container, message) { + var timeout; + + var removeDialog = function () { + $warning.remove(); + clearTimeout(timeout); + $container.off('click.messageDialog'); + }; + + // Create warning popup: + var $warning = $('
', { + 'class': 'joubel-message-dialog', + text: message + }).appendTo($container); + + // Remove after 3 seconds or if user clicks anywhere in $container: + timeout = setTimeout(removeDialog, 3000); + $container.on('click.messageDialog', removeDialog); + + return $warning; + } + + return JoubelMessageDialog; +})(H5P.jQuery); diff --git a/activities/module01/essay-395/H5P.JoubelUI-1.3/js/joubel-progress-circle.js b/activities/module01/essay-395/H5P.JoubelUI-1.3/js/joubel-progress-circle.js new file mode 100644 index 0000000..e5cfcdb --- /dev/null +++ b/activities/module01/essay-395/H5P.JoubelUI-1.3/js/joubel-progress-circle.js @@ -0,0 +1,159 @@ +var H5P = H5P || {}; + +/** + * Class responsible for creating a circular progress bar + */ + +H5P.JoubelProgressCircle = (function ($) { + + /** + * Constructor for the Progress Circle + * + * @param {Number} number The amount of progress to display + * @param {string} progressColor Color for the progress meter + * @param {string} backgroundColor Color behind the progress meter + */ + function ProgressCircle(number, progressColor, fillColor, backgroundColor) { + progressColor = progressColor || '#1a73d9'; + fillColor = fillColor || '#f0f0f0'; + backgroundColor = backgroundColor || '#ffffff'; + var progressColorRGB = this.hexToRgb(progressColor); + + //Verify number + try { + number = Number(number); + if (number === '') { + throw 'is empty'; + } + if (isNaN(number)) { + throw 'is not a number'; + } + } catch (e) { + number = 'err'; + } + + //Draw circle + if (number > 100) { + number = 100; + } + + // We can not use rgba, since they will stack on top of each other. + // Instead we create the equivalent of the rgba color + // and applies this to the activeborder and background color. + var progressColorString = 'rgb(' + parseInt(progressColorRGB.r, 10) + + ',' + parseInt(progressColorRGB.g, 10) + + ',' + parseInt(progressColorRGB.b, 10) + ')'; + + // Circle wrapper + var $wrapper = $('
', { + 'class': "joubel-progress-circle-wrapper" + }); + + //Active border indicates progress + var $activeBorder = $('
', { + 'class': "joubel-progress-circle-active-border" + }).appendTo($wrapper); + + //Background circle + var $backgroundCircle = $('
', { + 'class': "joubel-progress-circle-circle" + }).appendTo($activeBorder); + + //Progress text/number + $('', { + 'text': number + '%', + 'class': "joubel-progress-circle-percentage" + }).appendTo($backgroundCircle); + + var deg = number * 3.6; + if (deg <= 180) { + $activeBorder.css('background-image', + 'linear-gradient(' + (90 + deg) + 'deg, transparent 50%, ' + fillColor + ' 50%),' + + 'linear-gradient(90deg, ' + fillColor + ' 50%, transparent 50%)') + .css('border', '2px solid' + backgroundColor) + .css('background-color', progressColorString); + } else { + $activeBorder.css('background-image', + 'linear-gradient(' + (deg - 90) + 'deg, transparent 50%, ' + progressColorString + ' 50%),' + + 'linear-gradient(90deg, ' + fillColor + ' 50%, transparent 50%)') + .css('border', '2px solid' + backgroundColor) + .css('background-color', progressColorString); + } + + this.$activeBorder = $activeBorder; + this.$backgroundCircle = $backgroundCircle; + this.$wrapper = $wrapper; + + this.initResizeFunctionality(); + + return $wrapper; + } + + /** + * Initializes resize functionality for the progress circle + */ + ProgressCircle.prototype.initResizeFunctionality = function () { + var self = this; + + $(window).resize(function () { + // Queue resize + setTimeout(function () { + self.resize(); + }); + }); + + // First resize + setTimeout(function () { + self.resize(); + }, 0); + }; + + /** + * Resize function makes progress circle grow or shrink relative to parent container + */ + ProgressCircle.prototype.resize = function () { + var $parent = this.$wrapper.parent(); + + if ($parent !== undefined && $parent) { + + // Measurements + var fontSize = parseInt($parent.css('font-size'), 10); + + // Static sizes + var fontSizeMultiplum = 3.75; + var progressCircleWidthPx = parseInt((fontSize / 4.5), 10) % 2 === 0 ? parseInt((fontSize / 4.5), 10) + 4 : parseInt((fontSize / 4.5), 10) + 5; + var progressCircleOffset = progressCircleWidthPx / 2; + + var width = fontSize * fontSizeMultiplum; + var height = fontSize * fontSizeMultiplum; + this.$activeBorder.css({ + 'width': width, + 'height': height + }); + + this.$backgroundCircle.css({ + 'width': width - progressCircleWidthPx, + 'height': height - progressCircleWidthPx, + 'top': progressCircleOffset, + 'left': progressCircleOffset + }); + } + }; + + /** + * Hex to RGB conversion + * @param hex + * @returns {{r: Number, g: Number, b: Number}} + */ + ProgressCircle.prototype.hexToRgb = function (hex) { + var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex); + return result ? { + r: parseInt(result[1], 16), + g: parseInt(result[2], 16), + b: parseInt(result[3], 16) + } : null; + }; + + return ProgressCircle; + +}(H5P.jQuery)); diff --git a/activities/module01/essay-395/H5P.JoubelUI-1.3/js/joubel-progressbar.js b/activities/module01/essay-395/H5P.JoubelUI-1.3/js/joubel-progressbar.js new file mode 100644 index 0000000..01274d1 --- /dev/null +++ b/activities/module01/essay-395/H5P.JoubelUI-1.3/js/joubel-progressbar.js @@ -0,0 +1,190 @@ +var H5P = H5P || {}; + +H5P.JoubelProgressbar = (function ($) { + + /** + * Joubel progressbar class + * @method JoubelProgressbar + * @constructor + * @param {number} steps Number of steps + * @param {Object} [options] Additional options + * @param {boolean} [options.disableAria] Disable readspeaker assistance + * @param {string} [options.progressText] A progress text for describing + * current progress out of total progress for readspeakers. + * e.g. "Slide :num of :total" + */ + function JoubelProgressbar(steps, options) { + H5P.EventDispatcher.call(this); + var self = this; + this.options = $.extend({ + progressText: 'Slide :num of :total' + }, options); + this.currentStep = 0; + this.steps = steps; + + this.$progressbar = $('
', { + 'class': 'h5p-joubelui-progressbar', + on: { + click: function () { + self.toggleTooltip(); + return false; + }, + mouseenter: function () { + self.showTooltip(); + }, + mouseleave: function () { + setTimeout(function () { + self.hideTooltip(); + }, 1500); + } + } + }); + this.$background = $('
', { + 'class': 'h5p-joubelui-progressbar-background' + }).appendTo(this.$progressbar); + + $('body').click(function () { + self.toggleTooltip(true); + }); + } + + JoubelProgressbar.prototype = Object.create(H5P.EventDispatcher.prototype); + JoubelProgressbar.prototype.constructor = JoubelProgressbar; + + /** + * Display tooltip + * @method showTooltip + */ + JoubelProgressbar.prototype.showTooltip = function () { + var self = this; + + if (this.currentStep === 0 || this.tooltip !== undefined) { + return; + } + + var parentWidth = self.$progressbar.offset().left + self.$progressbar.width(); + + this.tooltip = new H5P.Drop({ + target: this.$background.get(0), + content: this.currentStep + '/' + this.steps, + classes: 'drop-theme-arrows-bounce h5p-joubelui-drop', + position: 'top right', + openOn: 'always', + tetherOptions: { + attachment: 'bottom center', + targetAttachment: 'top right' + } + }); + this.tooltip.on('open', function () { + var $drop = $(self.tooltip.drop); + var left = $drop.position().left; + var dropWidth = $drop.width(); + + // Need to handle drops getting outside of the progressbar: + if (left < 0) { + $drop.css({marginLeft: (-left) + 'px'}); + } + else if (left + dropWidth > parentWidth) { + $drop.css({marginLeft: (parentWidth - (left + dropWidth)) + 'px'}); + } + }); + }; + + JoubelProgressbar.prototype.updateAria = function () { + var self = this; + if (this.options.disableAria) { + return; + } + + if (!this.$currentStatus) { + this.$currentStatus = $('
', { + 'class': 'h5p-joubelui-progressbar-slide-status-text', + 'aria-live': 'assertive' + }).appendTo(this.$progressbar); + } + var interpolatedProgressText = self.options.progressText + .replace(':num', self.currentStep) + .replace(':total', self.steps); + this.$currentStatus.html(interpolatedProgressText); + }; + + /** + * Hides tooltip + * @method hideTooltip + */ + JoubelProgressbar.prototype.hideTooltip = function () { + if (this.tooltip !== undefined) { + this.tooltip.remove(); + this.tooltip.destroy(); + this.tooltip = undefined; + } + }; + + /** + * Toggles tooltip-visibility + * @method toggleTooltip + * @param {boolean} [closeOnly] Don't show, only close if open + */ + JoubelProgressbar.prototype.toggleTooltip = function (closeOnly) { + if (this.tooltip === undefined && !closeOnly) { + this.showTooltip(); + } + else if (this.tooltip !== undefined) { + this.hideTooltip(); + } + }; + + /** + * Appends to a container + * @method appendTo + * @param {H5P.jquery} $container + */ + JoubelProgressbar.prototype.appendTo = function ($container) { + this.$progressbar.appendTo($container); + }; + + /** + * Update progress + * @method setProgress + * @param {number} step + */ + JoubelProgressbar.prototype.setProgress = function (step) { + // Check for valid value: + if (step > this.steps || step < 0) { + return; + } + this.currentStep = step; + this.$background.css({ + width: ((this.currentStep/this.steps)*100) + '%' + }); + + this.updateAria(); + }; + + /** + * Increment progress with 1 + * @method next + */ + JoubelProgressbar.prototype.next = function () { + this.setProgress(this.currentStep+1); + }; + + /** + * Reset progressbar + * @method reset + */ + JoubelProgressbar.prototype.reset = function () { + this.setProgress(0); + }; + + /** + * Check if last step is reached + * @method isLastStep + * @return {Boolean} + */ + JoubelProgressbar.prototype.isLastStep = function () { + return this.steps === this.currentStep; + }; + + return JoubelProgressbar; +})(H5P.jQuery); diff --git a/activities/module01/essay-395/H5P.JoubelUI-1.3/js/joubel-score-bar.js b/activities/module01/essay-395/H5P.JoubelUI-1.3/js/joubel-score-bar.js new file mode 100644 index 0000000..4d46ceb --- /dev/null +++ b/activities/module01/essay-395/H5P.JoubelUI-1.3/js/joubel-score-bar.js @@ -0,0 +1,225 @@ +var H5P = H5P || {}; + +/** + * @module + */ +H5P.JoubelScoreBar = (function ($) { + + /* Need to use an id for the star SVG since that is the only way to reference + SVG filters */ + var idCounter = 0; + + /** + * Creates a score bar + * @class H5P.JoubelScoreBar + * @param {number} maxScore Maximum score + * @param {string} [label] Makes it easier for readspeakers to identify the scorebar + * @param {string} [helpText] Score explanation + * @param {string} [scoreExplanationButtonLabel] Label for score explanation button + */ + function JoubelScoreBar(maxScore, label, helpText, scoreExplanationButtonLabel) { + var self = this; + + self.maxScore = maxScore; + self.score = 0; + idCounter++; + + /** + * @const {string} + */ + self.STAR_MARKUP = ''; + + /** + * @function appendTo + * @memberOf H5P.JoubelScoreBar# + * @param {H5P.jQuery} $wrapper Dom container + */ + self.appendTo = function ($wrapper) { + self.$scoreBar.appendTo($wrapper); + }; + + /** + * Create the text representation of the scorebar . + * + * @private + * @return {string} + */ + var createLabel = function (score) { + if (!label) { + return ''; + } + + return label.replace(':num', score).replace(':total', self.maxScore); + }; + + /** + * Creates the html for this widget + * + * @method createHtml + * @private + */ + var createHtml = function () { + // Container div + self.$scoreBar = $('
', { + 'class': 'h5p-joubelui-score-bar', + }); + + var $visuals = $('
', { + 'class': 'h5p-joubelui-score-bar-visuals', + appendTo: self.$scoreBar + }); + + // The progress bar wrapper + self.$progressWrapper = $('
', { + 'class': 'h5p-joubelui-score-bar-progress-wrapper', + appendTo: $visuals + }); + + self.$progress = $('
', { + 'class': 'h5p-joubelui-score-bar-progress', + 'html': createLabel(self.score), + appendTo: self.$progressWrapper + }); + + // The star + $('
', { + 'class': 'h5p-joubelui-score-bar-star', + html: self.STAR_MARKUP + }).appendTo($visuals); + + // The score container + var $numerics = $('
', { + 'class': 'h5p-joubelui-score-numeric', + appendTo: self.$scoreBar, + 'aria-hidden': true + }); + + // The current score + self.$scoreCounter = $('', { + 'class': 'h5p-joubelui-score-number h5p-joubelui-score-number-counter', + text: 0, + appendTo: $numerics + }); + + // The separator + $('', { + 'class': 'h5p-joubelui-score-number-separator', + text: '/', + appendTo: $numerics + }); + + // Max score + self.$maxScore = $('', { + 'class': 'h5p-joubelui-score-number h5p-joubelui-score-max', + text: self.maxScore, + appendTo: $numerics + }); + + if (helpText) { + H5P.JoubelUI.createTip(helpText, { + tipLabel: scoreExplanationButtonLabel ? scoreExplanationButtonLabel : helpText, + helpIcon: true + }).appendTo(self.$scoreBar); + self.$scoreBar.addClass('h5p-score-bar-has-help'); + } + }; + + /** + * Set the current score + * @method setScore + * @memberOf H5P.JoubelScoreBar# + * @param {number} score + */ + self.setScore = function (score) { + // Do nothing if score hasn't changed + if (score === self.score) { + return; + } + self.score = score > self.maxScore ? self.maxScore : score; + self.updateVisuals(); + }; + + /** + * Increment score + * @method incrementScore + * @memberOf H5P.JoubelScoreBar# + * @param {number=} incrementBy Optional parameter, defaults to 1 + */ + self.incrementScore = function (incrementBy) { + self.setScore(self.score + (incrementBy || 1)); + }; + + /** + * Set the max score + * @method setMaxScore + * @memberOf H5P.JoubelScoreBar# + * @param {number} maxScore The max score + */ + self.setMaxScore = function (maxScore) { + self.maxScore = maxScore; + }; + + /** + * Updates the progressbar visuals + * @memberOf H5P.JoubelScoreBar# + * @method updateVisuals + */ + self.updateVisuals = function () { + self.$progress.html(createLabel(self.score)); + self.$scoreCounter.text(self.score); + self.$maxScore.text(self.maxScore); + + setTimeout(function () { + // Start the progressbar animation + self.$progress.css({ + width: ((self.score / self.maxScore) * 100) + '%' + }); + + H5P.Transition.onTransitionEnd(self.$progress, function () { + // If fullscore fill the star and start the animation + self.$scoreBar.toggleClass('h5p-joubelui-score-bar-full-score', self.score === self.maxScore); + self.$scoreBar.toggleClass('h5p-joubelui-score-bar-animation-active', self.score === self.maxScore); + + // Only allow the star animation to run once + self.$scoreBar.one("animationend", function() { + self.$scoreBar.removeClass("h5p-joubelui-score-bar-animation-active"); + }); + }, 600); + }, 300); + }; + + /** + * Removes all classes + * @method reset + */ + self.reset = function () { + self.$scoreBar.removeClass('h5p-joubelui-score-bar-full-score'); + }; + + createHtml(); + } + + return JoubelScoreBar; +})(H5P.jQuery); diff --git a/activities/module01/essay-395/H5P.JoubelUI-1.3/js/joubel-simple-rounded-button.js b/activities/module01/essay-395/H5P.JoubelUI-1.3/js/joubel-simple-rounded-button.js new file mode 100644 index 0000000..0ced1e7 --- /dev/null +++ b/activities/module01/essay-395/H5P.JoubelUI-1.3/js/joubel-simple-rounded-button.js @@ -0,0 +1,32 @@ +var H5P = H5P || {}; + +H5P.SimpleRoundedButton = (function ($) { + + /** + * Creates a new tip + */ + function SimpleRoundedButton(text) { + + var $simpleRoundedButton = $('
', { + 'class': 'joubel-simple-rounded-button', + 'title': text, + 'role': 'button', + 'tabindex': '0' + }).keydown(function (e) { + // 32 - space, 13 - enter + if ([32, 13].indexOf(e.which) !== -1) { + $(this).click(); + e.preventDefault(); + } + }); + + $('', { + 'class': 'joubel-simple-rounded-button-text', + 'html': text + }).appendTo($simpleRoundedButton); + + return $simpleRoundedButton; + } + + return SimpleRoundedButton; +}(H5P.jQuery)); diff --git a/activities/module01/essay-395/H5P.JoubelUI-1.3/js/joubel-slider.js b/activities/module01/essay-395/H5P.JoubelUI-1.3/js/joubel-slider.js new file mode 100644 index 0000000..ac41386 --- /dev/null +++ b/activities/module01/essay-395/H5P.JoubelUI-1.3/js/joubel-slider.js @@ -0,0 +1,96 @@ +var H5P = H5P || {}; + +H5P.JoubelSlider = (function ($) { + + /** + * Creates a new Slider + * + * @param {object} [params] Additional parameters + */ + function JoubelSlider(params) { + H5P.EventDispatcher.call(this); + + this.$slider = $('
', $.extend({ + 'class': 'h5p-joubel-ui-slider' + }, params)); + + this.$slides = []; + this.currentIndex = 0; + this.numSlides = 0; + } + JoubelSlider.prototype = Object.create(H5P.EventDispatcher.prototype); + JoubelSlider.prototype.constructor = JoubelSlider; + + JoubelSlider.prototype.addSlide = function ($content) { + $content.addClass('h5p-joubel-ui-slide').css({ + 'left': (this.numSlides*100) + '%' + }); + this.$slider.append($content); + this.$slides.push($content); + + this.numSlides++; + + if(this.numSlides === 1) { + $content.addClass('current'); + } + }; + + JoubelSlider.prototype.attach = function ($container) { + $container.append(this.$slider); + }; + + JoubelSlider.prototype.move = function (index) { + var self = this; + + if(index === 0) { + self.trigger('first-slide'); + } + if(index+1 === self.numSlides) { + self.trigger('last-slide'); + } + self.trigger('move'); + + var $previousSlide = self.$slides[this.currentIndex]; + H5P.Transition.onTransitionEnd(this.$slider, function () { + $previousSlide.removeClass('current'); + self.trigger('moved'); + }); + this.$slides[index].addClass('current'); + + var translateX = 'translateX(' + (-index*100) + '%)'; + this.$slider.css({ + '-webkit-transform': translateX, + '-moz-transform': translateX, + '-ms-transform': translateX, + 'transform': translateX + }); + + this.currentIndex = index; + }; + + JoubelSlider.prototype.remove = function () { + this.$slider.remove(); + }; + + JoubelSlider.prototype.next = function () { + if(this.currentIndex+1 >= this.numSlides) { + return; + } + + this.move(this.currentIndex+1); + }; + + JoubelSlider.prototype.previous = function () { + this.move(this.currentIndex-1); + }; + + JoubelSlider.prototype.first = function () { + this.move(0); + }; + + JoubelSlider.prototype.last = function () { + this.move(this.numSlides-1); + }; + + return JoubelSlider; +})(H5P.jQuery); diff --git a/activities/module01/essay-395/H5P.JoubelUI-1.3/js/joubel-speech-bubble.js b/activities/module01/essay-395/H5P.JoubelUI-1.3/js/joubel-speech-bubble.js new file mode 100644 index 0000000..96c94d4 --- /dev/null +++ b/activities/module01/essay-395/H5P.JoubelUI-1.3/js/joubel-speech-bubble.js @@ -0,0 +1,356 @@ +var H5P = H5P || {}; + +/** + * Class responsible for creating speech bubbles + */ +H5P.JoubelSpeechBubble = (function ($) { + + var $currentSpeechBubble; + var $currentContainer; + var $tail; + var $innerTail; + var removeSpeechBubbleTimeout; + var currentMaxWidth; + + var DEFAULT_MAX_WIDTH = 400; + + var iDevice = navigator.userAgent.match(/iPod|iPhone|iPad/g) ? true : false; + + /** + * Creates a new speech bubble + * + * @param {H5P.jQuery} $container The speaking object + * @param {string} text The text to display + * @param {number} maxWidth The maximum width of the bubble + * @return {H5P.JoubelSpeechBubble} + */ + function JoubelSpeechBubble($container, text, maxWidth) { + maxWidth = maxWidth || DEFAULT_MAX_WIDTH; + currentMaxWidth = maxWidth; + $currentContainer = $container; + + this.isCurrent = function ($tip) { + return $tip.is($currentContainer); + }; + + this.remove = function () { + remove(); + }; + + var fadeOutSpeechBubble = function ($speechBubble) { + if (!$speechBubble) { + return; + } + + // Stop removing bubble + clearTimeout(removeSpeechBubbleTimeout); + + $speechBubble.removeClass('show'); + setTimeout(function () { + if ($speechBubble) { + $speechBubble.remove(); + $speechBubble = undefined; + } + }, 500); + }; + + if ($currentSpeechBubble !== undefined) { + remove(); + } + + var $h5pContainer = getH5PContainer($container); + + // Make sure we fade out old speech bubble + fadeOutSpeechBubble($currentSpeechBubble); + + // Create bubble + $tail = $('
'); + $innerTail = $('
'); + var $innerBubble = $( + '
' + + '
' + text + '
' + + '
' + ).prepend($innerTail); + + $currentSpeechBubble = $( + '
' + ).append([$tail, $innerBubble]) + .appendTo($h5pContainer); + + // Show speech bubble with transition + setTimeout(function () { + $currentSpeechBubble.addClass('show'); + }, 0); + + position($currentSpeechBubble, $currentContainer, maxWidth, $tail, $innerTail); + + // Handle click to close + H5P.$body.on('mousedown.speechBubble', handleOutsideClick); + + // Handle window resizing + H5P.$window.on('resize', '', handleResize); + + // Handle clicks when inside IV which blocks bubbling. + $container.parents('.h5p-dialog') + .on('mousedown.speechBubble', handleOutsideClick); + + if (iDevice) { + H5P.$body.css('cursor', 'pointer'); + } + + return this; + } + + // Remove speechbubble if it belongs to a dom element that is about to be hidden + H5P.externalDispatcher.on('domHidden', function (event) { + if ($currentSpeechBubble !== undefined && event.data.$dom.find($currentContainer).length !== 0) { + remove(); + } + }); + + /** + * Returns the closest h5p container for the given DOM element. + * + * @param {object} $container jquery element + * @return {object} the h5p container (jquery element) + */ + function getH5PContainer($container) { + var $h5pContainer = $container.closest('.h5p-frame'); + + // Check closest h5p frame first, then check for container in case there is no frame. + if (!$h5pContainer.length) { + $h5pContainer = $container.closest('.h5p-container'); + } + + return $h5pContainer; + } + + /** + * Event handler that is called when the window is resized. + */ + function handleResize() { + position($currentSpeechBubble, $currentContainer, currentMaxWidth, $tail, $innerTail); + } + + /** + * Repositions the speech bubble according to the position of the container. + * + * @param {object} $currentSpeechbubble the speech bubble that should be positioned + * @param {object} $container the container to which the speech bubble should point + * @param {number} maxWidth the maximum width of the speech bubble + * @param {object} $tail the tail (the triangle that points to the referenced container) + * @param {object} $innerTail the inner tail (the triangle that points to the referenced container) + */ + function position($currentSpeechBubble, $container, maxWidth, $tail, $innerTail) { + var $h5pContainer = getH5PContainer($container); + + // Calculate offset between the button and the h5p frame + var offset = getOffsetBetween($h5pContainer, $container); + + var direction = (offset.bottom > offset.top ? 'bottom' : 'top'); + var tipWidth = offset.outerWidth * 0.9; // Var needs to be renamed to make sense + var bubbleWidth = tipWidth > maxWidth ? maxWidth : tipWidth; + + var bubblePosition = getBubblePosition(bubbleWidth, offset); + var tailPosition = getTailPosition(bubbleWidth, bubblePosition, offset, $container.width()); + // Need to set font-size, since element is appended to body. + // Using same font-size as parent. In that way it will grow accordingly + // when resizing + var fontSize = 16;//parseFloat($parent.css('font-size')); + + // Set width and position of speech bubble + $currentSpeechBubble.css(bubbleCSS( + direction, + bubbleWidth, + bubblePosition, + fontSize + )); + + var preparedTailCSS = tailCSS(direction, tailPosition); + $tail.css(preparedTailCSS); + $innerTail.css(preparedTailCSS); + } + + /** + * Static function for removing the speechbubble + */ + var remove = function () { + H5P.$body.off('mousedown.speechBubble'); + H5P.$window.off('resize', '', handleResize); + $currentContainer.parents('.h5p-dialog').off('mousedown.speechBubble'); + if (iDevice) { + H5P.$body.css('cursor', ''); + } + if ($currentSpeechBubble !== undefined) { + // Apply transition, then remove speech bubble + $currentSpeechBubble.removeClass('show'); + + // Make sure we remove any old timeout before reassignment + clearTimeout(removeSpeechBubbleTimeout); + removeSpeechBubbleTimeout = setTimeout(function () { + $currentSpeechBubble.remove(); + $currentSpeechBubble = undefined; + }, 500); + } + // Don't return false here. If the user e.g. clicks a button when the bubble is visible, + // we want the bubble to disapear AND the button to receive the event + }; + + /** + * Remove the speech bubble and container reference + */ + function handleOutsideClick(event) { + if (event.target === $currentContainer[0]) { + return; // Button clicks are not outside clicks + } + + remove(); + // There is no current container when a container isn't clicked + $currentContainer = undefined; + } + + /** + * Calculate position for speech bubble + * + * @param {number} bubbleWidth The width of the speech bubble + * @param {object} offset + * @return {object} Return position for the speech bubble + */ + function getBubblePosition(bubbleWidth, offset) { + var bubblePosition = {}; + + var tailOffset = 9; + var widthOffset = bubbleWidth / 2; + + // Calculate top position + bubblePosition.top = offset.top + offset.innerHeight; + + // Calculate bottom position + bubblePosition.bottom = offset.bottom + offset.innerHeight + tailOffset; + + // Calculate left position + if (offset.left < widthOffset) { + bubblePosition.left = 3; + } + else if ((offset.left + widthOffset) > offset.outerWidth) { + bubblePosition.left = offset.outerWidth - bubbleWidth - 3; + } + else { + bubblePosition.left = offset.left - widthOffset + (offset.innerWidth / 2); + } + + return bubblePosition; + } + + /** + * Calculate position for speech bubble tail + * + * @param {number} bubbleWidth The width of the speech bubble + * @param {object} bubblePosition Speech bubble position + * @param {object} offset + * @param {number} iconWidth The width of the tip icon + * @return {object} Return position for the tail + */ + function getTailPosition(bubbleWidth, bubblePosition, offset, iconWidth) { + var tailPosition = {}; + // Magic numbers. Tuned by hand so that the tail fits visually within + // the bounds of the speech bubble. + var leftBoundary = 9; + var rightBoundary = bubbleWidth - 20; + + tailPosition.left = offset.left - bubblePosition.left + (iconWidth / 2) - 6; + if (tailPosition.left < leftBoundary) { + tailPosition.left = leftBoundary; + } + if (tailPosition.left > rightBoundary) { + tailPosition.left = rightBoundary; + } + + tailPosition.top = -6; + tailPosition.bottom = -6; + + return tailPosition; + } + + /** + * Return bubble CSS for the desired growth direction + * + * @param {string} direction The direction the speech bubble will grow + * @param {number} width The width of the speech bubble + * @param {object} position Speech bubble position + * @param {number} fontSize The size of the bubbles font + * @return {object} Return CSS + */ + function bubbleCSS(direction, width, position, fontSize) { + if (direction === 'top') { + return { + width: width + 'px', + bottom: position.bottom + 'px', + left: position.left + 'px', + fontSize: fontSize + 'px', + top: '' + }; + } + else { + return { + width: width + 'px', + top: position.top + 'px', + left: position.left + 'px', + fontSize: fontSize + 'px', + bottom: '' + }; + } + } + + /** + * Return tail CSS for the desired growth direction + * + * @param {string} direction The direction the speech bubble will grow + * @param {object} position Tail position + * @return {object} Return CSS + */ + function tailCSS(direction, position) { + if (direction === 'top') { + return { + bottom: position.bottom + 'px', + left: position.left + 'px', + top: '' + }; + } + else { + return { + top: position.top + 'px', + left: position.left + 'px', + bottom: '' + }; + } + } + + /** + * Calculates the offset between an element inside a container and the + * container. Only works if all the edges of the inner element are inside the + * outer element. + * Width/height of the elements is included as a convenience. + * + * @param {H5P.jQuery} $outer + * @param {H5P.jQuery} $inner + * @return {object} Position offset + */ + function getOffsetBetween($outer, $inner) { + var outer = $outer[0].getBoundingClientRect(); + var inner = $inner[0].getBoundingClientRect(); + + return { + top: inner.top - outer.top, + right: outer.right - inner.right, + bottom: outer.bottom - inner.bottom, + left: inner.left - outer.left, + innerWidth: inner.width, + innerHeight: inner.height, + outerWidth: outer.width, + outerHeight: outer.height + }; + } + + return JoubelSpeechBubble; +})(H5P.jQuery); diff --git a/activities/module01/essay-395/H5P.JoubelUI-1.3/js/joubel-throbber.js b/activities/module01/essay-395/H5P.JoubelUI-1.3/js/joubel-throbber.js new file mode 100644 index 0000000..ef98bfb --- /dev/null +++ b/activities/module01/essay-395/H5P.JoubelUI-1.3/js/joubel-throbber.js @@ -0,0 +1,19 @@ +var H5P = H5P || {}; + +H5P.JoubelThrobber = (function ($) { + + /** + * Creates a new tip + */ + function JoubelThrobber() { + + // h5p-throbber css is described in core + var $throbber = $('
', { + 'class': 'h5p-throbber' + }); + + return $throbber; + } + + return JoubelThrobber; +}(H5P.jQuery)); diff --git a/activities/module01/essay-395/H5P.JoubelUI-1.3/js/joubel-tip.js b/activities/module01/essay-395/H5P.JoubelUI-1.3/js/joubel-tip.js new file mode 100644 index 0000000..0d6e259 --- /dev/null +++ b/activities/module01/essay-395/H5P.JoubelUI-1.3/js/joubel-tip.js @@ -0,0 +1,105 @@ +H5P.JoubelTip = (function ($) { + var $conv = $('
'); + + /** + * Creates a new tip element. + * + * NOTE that this may look like a class but it doesn't behave like one. + * It returns a jQuery object. + * + * @param {string} tipHtml The text to display in the popup + * @param {Object} [behaviour] Options + * @param {string} [behaviour.tipLabel] Set to use a custom label for the tip button (you want this for good A11Y) + * @param {boolean} [behaviour.helpIcon] Set to 'true' to Add help-icon classname to Tip button (changes the icon) + * @param {boolean} [behaviour.showSpeechBubble] Set to 'false' to disable functionality (you may this in the editor) + * @param {boolean} [behaviour.tabcontrol] Set to 'true' if you plan on controlling the tabindex in the parent (tabindex="-1") + * @return {H5P.jQuery|undefined} Tip button jQuery element or 'undefined' if invalid tip + */ + function JoubelTip(tipHtml, behaviour) { + + // Keep track of the popup that appears when you click the Tip button + var speechBubble; + + // Parse tip html to determine text + var tipText = $conv.html(tipHtml).text().trim(); + if (tipText === '') { + return; // The tip has no textual content, i.e. it's invalid. + } + + // Set default behaviour + behaviour = $.extend({ + tipLabel: tipText, + helpIcon: false, + showSpeechBubble: true, + tabcontrol: false + }, behaviour); + + // Create Tip button + var $tipButton = $('
', { + class: 'joubel-tip-container' + (behaviour.showSpeechBubble ? '' : ' be-quiet'), + 'aria-label': behaviour.tipLabel, + 'aria-expanded': false, + role: 'button', + tabindex: (behaviour.tabcontrol ? -1 : 0), + click: function (event) { + // Toggle show/hide popup + toggleSpeechBubble(); + event.preventDefault(); + }, + keydown: function (event) { + if (event.which === 32 || event.which === 13) { // Space & enter key + // Toggle show/hide popup + toggleSpeechBubble(); + event.stopPropagation(); + event.preventDefault(); + } + else { // Any other key + // Toggle hide popup + toggleSpeechBubble(false); + } + }, + // Add markup to render icon + html: '' + + '' + + '' + + '' + + '' + // IMPORTANT: All of the markup elements must have 'pointer-events: none;' + }); + + const $tipAnnouncer = $('
', { + 'class': 'hidden-but-read', + 'aria-live': 'polite', + appendTo: $tipButton, + }); + + /** + * Tip button interaction handler. + * Toggle show or hide the speech bubble popup when interacting with the + * Tip button. + * + * @private + * @param {boolean} [force] 'true' shows and 'false' hides. + */ + var toggleSpeechBubble = function (force) { + if (speechBubble !== undefined && speechBubble.isCurrent($tipButton)) { + // Hide current popup + speechBubble.remove(); + speechBubble = undefined; + + $tipButton.attr('aria-expanded', false); + $tipAnnouncer.html(''); + } + else if (force !== false && behaviour.showSpeechBubble) { + // Create and show new popup + speechBubble = H5P.JoubelSpeechBubble($tipButton, tipHtml); + $tipButton.attr('aria-expanded', true); + $tipAnnouncer.html(tipHtml); + } + }; + + return $tipButton; + } + + return JoubelTip; +})(H5P.jQuery); diff --git a/activities/module01/essay-395/H5P.JoubelUI-1.3/js/joubel-ui.js b/activities/module01/essay-395/H5P.JoubelUI-1.3/js/joubel-ui.js new file mode 100644 index 0000000..3d9388f --- /dev/null +++ b/activities/module01/essay-395/H5P.JoubelUI-1.3/js/joubel-ui.js @@ -0,0 +1,183 @@ +var H5P = H5P || {}; + +/** + * H5P Joubel UI library. + * + * This is a utility library, which does not implement attach. I.e, it has to bee actively used by + * other libraries + * @module + */ +H5P.JoubelUI = (function ($) { + + /** + * The internal object to return + * @class H5P.JoubelUI + * @static + */ + function JoubelUI() {} + + /* Public static functions */ + + /** + * Create a tip icon + * @method H5P.JoubelUI.createTip + * @param {string} text The textual tip + * @param {Object} params Parameters + * @return {H5P.JoubelTip} + */ + JoubelUI.createTip = function (text, params) { + return new H5P.JoubelTip(text, params); + }; + + /** + * Create message dialog + * @method H5P.JoubelUI.createMessageDialog + * @param {H5P.jQuery} $container The dom container + * @param {string} message The message + * @return {H5P.JoubelMessageDialog} + */ + JoubelUI.createMessageDialog = function ($container, message) { + return new H5P.JoubelMessageDialog($container, message); + }; + + /** + * Create help text dialog + * @method H5P.JoubelUI.createHelpTextDialog + * @param {string} header The textual header + * @param {string} message The textual message + * @param {string} closeButtonTitle The title for the close button + * @return {H5P.JoubelHelpTextDialog} + */ + JoubelUI.createHelpTextDialog = function (header, message, closeButtonTitle) { + return new H5P.JoubelHelpTextDialog(header, message, closeButtonTitle); + }; + + /** + * Create progress circle + * @method H5P.JoubelUI.createProgressCircle + * @param {number} number The progress (0 to 100) + * @param {string} progressColor The progress color in hex value + * @param {string} fillColor The fill color in hex value + * @param {string} backgroundColor The background color in hex value + * @return {H5P.JoubelProgressCircle} + */ + JoubelUI.createProgressCircle = function (number, progressColor, fillColor, backgroundColor) { + return new H5P.JoubelProgressCircle(number, progressColor, fillColor, backgroundColor); + }; + + /** + * Create throbber for loading + * @method H5P.JoubelUI.createThrobber + * @return {H5P.JoubelThrobber} + */ + JoubelUI.createThrobber = function () { + return new H5P.JoubelThrobber(); + }; + + /** + * Create simple rounded button + * @method H5P.JoubelUI.createSimpleRoundedButton + * @param {string} text The button label + * @return {H5P.SimpleRoundedButton} + */ + JoubelUI.createSimpleRoundedButton = function (text) { + return new H5P.SimpleRoundedButton(text); + }; + + /** + * Create Slider + * @method H5P.JoubelUI.createSlider + * @param {Object} [params] Parameters + * @return {H5P.JoubelSlider} + */ + JoubelUI.createSlider = function (params) { + return new H5P.JoubelSlider(params); + }; + + /** + * Create Score Bar + * @method H5P.JoubelUI.createScoreBar + * @param {number=} maxScore The maximum score + * @param {string} [label] Makes it easier for readspeakers to identify the scorebar + * @return {H5P.JoubelScoreBar} + */ + JoubelUI.createScoreBar = function (maxScore, label, helpText, scoreExplanationButtonLabel) { + return new H5P.JoubelScoreBar(maxScore, label, helpText, scoreExplanationButtonLabel); + }; + + /** + * Create Progressbar + * @method H5P.JoubelUI.createProgressbar + * @param {number=} numSteps The total numer of steps + * @param {Object} [options] Additional options + * @param {boolean} [options.disableAria] Disable readspeaker assistance + * @param {string} [options.progressText] A progress text for describing + * current progress out of total progress for readspeakers. + * e.g. "Slide :num of :total" + * @return {H5P.JoubelProgressbar} + */ + JoubelUI.createProgressbar = function (numSteps, options) { + return new H5P.JoubelProgressbar(numSteps, options); + }; + + /** + * Create standard Joubel button + * + * @method H5P.JoubelUI.createButton + * @param {object} params + * May hold any properties allowed by jQuery. If href is set, an A tag + * is used, if not a button tag is used. + * @return {H5P.jQuery} The jquery element created + */ + JoubelUI.createButton = function(params) { + var type = 'button'; + if (params.href) { + type = 'a'; + } + else { + params.type = 'button'; + } + if (params.class) { + params.class += ' h5p-joubelui-button'; + } + else { + params.class = 'h5p-joubelui-button'; + } + return $('<' + type + '/>', params); + }; + + /** + * Fix for iframe scoll bug in IOS. When focusing an element that doesn't have + * focus support by default the iframe will scroll the parent frame so that + * the focused element is out of view. This varies dependening on the elements + * of the parent frame. + */ + if (H5P.isFramed && !H5P.hasiOSiframeScrollFix && + /iPad|iPhone|iPod/.test(navigator.userAgent)) { + H5P.hasiOSiframeScrollFix = true; + + // Keep track of original focus function + var focus = HTMLElement.prototype.focus; + + // Override the original focus + HTMLElement.prototype.focus = function () { + // Only focus the element if it supports it natively + if ( (this instanceof HTMLAnchorElement || + this instanceof HTMLInputElement || + this instanceof HTMLSelectElement || + this instanceof HTMLTextAreaElement || + this instanceof HTMLButtonElement || + this instanceof HTMLIFrameElement || + this instanceof HTMLAreaElement) && // HTMLAreaElement isn't supported by Safari yet. + !this.getAttribute('role')) { // Focus breaks if a different role has been set + // In theory this.isContentEditable should be able to recieve focus, + // but it didn't work when tested. + + // Trigger the original focus with the proper context + focus.call(this); + } + }; + } + + return JoubelUI; +})(H5P.jQuery); diff --git a/activities/module01/essay-395/H5P.JoubelUI-1.3/library.json b/activities/module01/essay-395/H5P.JoubelUI-1.3/library.json new file mode 100644 index 0000000..33b8034 --- /dev/null +++ b/activities/module01/essay-395/H5P.JoubelUI-1.3/library.json @@ -0,0 +1,107 @@ +{ + "title": "Joubel UI", + "contentType": "Utility", + "description": "UI utility library", + "majorVersion": 1, + "minorVersion": 3, + "patchVersion": 11, + "runnable": 0, + "coreApi": { + "majorVersion": 1, + "minorVersion": 3 + }, + "machineName": "H5P.JoubelUI", + "author": "Joubel", + "preloadedJs": [ + { + "path": "js/joubel-help-dialog.js" + }, + { + "path": "js/joubel-message-dialog.js" + }, + { + "path": "js/joubel-progress-circle.js" + }, + { + "path": "js/joubel-simple-rounded-button.js" + }, + { + "path": "js/joubel-speech-bubble.js" + }, + { + "path": "js/joubel-throbber.js" + }, + { + "path": "js/joubel-tip.js" + }, + { + "path": "js/joubel-slider.js" + }, + { + "path": "js/joubel-score-bar.js" + }, + { + "path": "js/joubel-progressbar.js" + }, + { + "path": "js/joubel-ui.js" + } + ], + "preloadedCss": [ + { + "path": "css/joubel-help-dialog.css" + }, + { + "path": "css/joubel-message-dialog.css" + }, + { + "path": "css/joubel-progress-circle.css" + }, + { + "path": "css/joubel-simple-rounded-button.css" + }, + { + "path": "css/joubel-speech-bubble.css" + }, + { + "path": "css/joubel-tip.css" + }, + { + "path": "css/joubel-slider.css" + }, + { + "path": "css/joubel-score-bar.css" + }, + { + "path": "css/joubel-progressbar.css" + }, + { + "path": "css/joubel-ui.css" + }, + { + "path": "css/joubel-icon.css" + } + ], + "preloadedDependencies": [ + { + "machineName": "FontAwesome", + "majorVersion": 4, + "minorVersion": 5 + }, + { + "machineName": "H5P.Transition", + "majorVersion": 1, + "minorVersion": 0 + }, + { + "machineName": "Drop", + "majorVersion": 1, + "minorVersion": 0 + }, + { + "machineName": "H5P.FontIcons", + "majorVersion": 1, + "minorVersion": 0 + } + ] +} diff --git a/activities/module01/essay-395/H5P.Question-1.5/images/minus-one.svg b/activities/module01/essay-395/H5P.Question-1.5/images/minus-one.svg new file mode 100644 index 0000000..688eaaa --- /dev/null +++ b/activities/module01/essay-395/H5P.Question-1.5/images/minus-one.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + diff --git a/activities/module01/essay-395/H5P.Question-1.5/images/plus-one.svg b/activities/module01/essay-395/H5P.Question-1.5/images/plus-one.svg new file mode 100644 index 0000000..be4d5f7 --- /dev/null +++ b/activities/module01/essay-395/H5P.Question-1.5/images/plus-one.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + diff --git a/activities/module01/essay-395/H5P.Question-1.5/library.json b/activities/module01/essay-395/H5P.Question-1.5/library.json new file mode 100644 index 0000000..b75b2f2 --- /dev/null +++ b/activities/module01/essay-395/H5P.Question-1.5/library.json @@ -0,0 +1,45 @@ +{ + "title": "Question", + "machineName": "H5P.Question", + "majorVersion": 1, + "minorVersion": 5, + "patchVersion": 1, + "runnable": 0, + "license": "MIT", + "author": "Joubel", + "coreApi": { + "majorVersion": 1, + "minorVersion": 7 + }, + "preloadedCss": [ + { + "path": "styles/question.css" + }, + { + "path": "styles/explainer.css" + } + ], + "preloadedJs": [ + { + "path": "scripts/question.js" + }, + { + "path": "scripts/explainer.js" + }, + { + "path": "scripts/score-points.js" + } + ], + "preloadedDependencies": [ + { + "machineName": "FontAwesome", + "majorVersion": 4, + "minorVersion": 5 + }, + { + "machineName": "H5P.JoubelUI", + "majorVersion": 1, + "minorVersion": 3 + } + ] +} \ No newline at end of file diff --git a/activities/module01/essay-395/H5P.Question-1.5/scripts/explainer.js b/activities/module01/essay-395/H5P.Question-1.5/scripts/explainer.js new file mode 100644 index 0000000..d9ab077 --- /dev/null +++ b/activities/module01/essay-395/H5P.Question-1.5/scripts/explainer.js @@ -0,0 +1,84 @@ +H5P.Question.Explainer = (function ($) { + /** + * Constructor + * + * @class + * @param {string} title + * @param {array} explanations + */ + function Explainer(title, explanations) { + var self = this; + + /** + * Create the DOM structure + */ + var createHTML = function () { + self.$explanation = $('
', { + 'class': 'h5p-question-explanation-container' + }); + + // Add title: + $('
', { + 'class': 'h5p-question-explanation-title', + role: 'heading', + html: title, + appendTo: self.$explanation + }); + + var $explanationList = $('