diff --git a/db/access.php b/db/access.php new file mode 100644 index 000000000000..2e9bb2314bbf --- /dev/null +++ b/db/access.php @@ -0,0 +1,36 @@ +. + +defined('MOODLE_INTERNAL') || die(); + +// Plugin for Moodle 'Multilingual content' drop down menu. +// @package atto_multilang2 +// @copyright 2016 onwards Julen Pardo & Mondragon Unibertsitatea +// @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later. + +$capabilities = array( + 'atto/multilang2:viewlanguagemenu' => array( + 'captype' => 'read', + 'contextlevel' => CONTEXT_COURSE, + 'archetypes' => array( + 'teacher' => CAP_ALLOW, + 'manager' => CAP_ALLOW, + 'editingteacher' => CAP_ALLOW, + 'student' => CAP_PREVENT + ), + ), +); + diff --git a/lang/en/atto_multilang2.php b/lang/en/atto_multilang2.php index ebcb34b2159f..439af25b5872 100644 --- a/lang/en/atto_multilang2.php +++ b/lang/en/atto_multilang2.php @@ -22,3 +22,5 @@ */ $string['pluginname'] = 'Multi-Language Content (v2)'; +$string['multilang2:viewlanguagemenu'] = 'View language dropdown menu in Atto toolbar.'; + diff --git a/lang/es/atto_multilang2.php b/lang/es/atto_multilang2.php index cf49edde3a4c..56524a972f6e 100644 --- a/lang/es/atto_multilang2.php +++ b/lang/es/atto_multilang2.php @@ -22,3 +22,5 @@ */ $string['pluginname'] = 'Contenido Multi-Idioma (v2)'; +$string['multilang2:viewlanguagemenu'] = 'Ver el menĂº de idiomas en la barra de herramientas de Atto.'; + diff --git a/lang/eu/atto_multilang2.php b/lang/eu/atto_multilang2.php index bdee8bf63358..118bcf6fb35e 100644 --- a/lang/eu/atto_multilang2.php +++ b/lang/eu/atto_multilang2.php @@ -22,3 +22,7 @@ */ $string['pluginname'] = 'Eduki Eleanitza (v2)'; +$string['disableforstudents'] = 'Desgaitu ikasleentzat'; +$string['disableforstudents_desc'] = 'Aukeratuta badago, ikasleek ez dute ikusiko hizkuntzen zerrenda azaltzen duen botoia.'; +tring['multilang2:viewlanguagemenu'] = 'Erakutsi hizkuntzen menua Atto tresna barran.'; + diff --git a/lib.php b/lib.php index 2cfc4032bbf6..61f5d2bbff28 100644 --- a/lib.php +++ b/lib.php @@ -1,32 +1,51 @@ -. -/** - * Atto text editor multilanguage plugin lib. - * - * @package atto_multilang2 - * @copyright 2015 onwards Julen Pardo & Mondragon Unibertsitatea - * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */ -defined('MOODLE_INTERNAL') || die(); -/** - * Set parameters for this plugin. - * - * @return array The JSON encoding of the installed languages. - */ -function atto_multilang2_params_for_js() { - $languages = json_encode(get_string_manager()->get_list_of_translations()); - return array('languages' => $languages); -} \ No newline at end of file +. + +/** + * Atto text editor multilanguage plugin lib. + * + * @package atto_multilang2 + * @copyright 2015 onwards Julen Pardo & Mondragon Unibertsitatea + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +defined('MOODLE_INTERNAL') || die(); + +/** + * Set parameters for this plugin. + * + * @return array The JSON encoding of the installed languages. + */ +function atto_multilang2_params_for_js() { + $languages = json_encode(get_string_manager()->get_list_of_translations()); + $capability = get_capability(); + + return array('languages' => $languages, 'capability' => $capability); +} + +/** + * Gets the defined capability for the plugin for the current user, to decide later to show or not to show the plugin. + * + * @return boolean If the user has the capability to see the plugin or not. + */ +function get_capability() { + global $COURSE; + + $context = context_course::instance($COURSE->id); + + return has_capability('atto/multilang2:viewlanguagemenu', $context); +} + diff --git a/yui/build/moodle-atto_multilang2-button/moodle-atto_multilang2-button-coverage.js b/yui/build/moodle-atto_multilang2-button/moodle-atto_multilang2-button-coverage.js index 58358ef6bd8c..4bdd115420f7 100644 --- a/yui/build/moodle-atto_multilang2-button/moodle-atto_multilang2-button-coverage.js +++ b/yui/build/moodle-atto_multilang2-button/moodle-atto_multilang2-button-coverage.js @@ -1,6 +1,6 @@ if (typeof __coverage__ === 'undefined') { __coverage__ = {}; } if (!__coverage__['build/moodle-atto_multilang2-button/moodle-atto_multilang2-button.js']) { - __coverage__['build/moodle-atto_multilang2-button/moodle-atto_multilang2-button.js'] = {"path":"build/moodle-atto_multilang2-button/moodle-atto_multilang2-button.js","s":{"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0},"b":{"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0]},"f":{"1":0,"2":0,"3":0,"4":0,"5":0,"6":0},"fnMap":{"1":{"name":"(anonymous_1)","line":1,"loc":{"start":{"line":1,"column":41},"end":{"line":1,"column":60}}},"2":{"name":"(anonymous_2)","line":52,"loc":{"start":{"line":52,"column":17},"end":{"line":52,"column":28}}},"3":{"name":"(anonymous_3)","line":77,"loc":{"start":{"line":77,"column":29},"end":{"line":77,"column":40}}},"4":{"name":"(anonymous_4)","line":108,"loc":{"start":{"line":108,"column":14},"end":{"line":108,"column":36}}},"5":{"name":"(anonymous_5)","line":133,"loc":{"start":{"line":133,"column":23},"end":{"line":133,"column":34}}},"6":{"name":"(anonymous_6)","line":166,"loc":{"start":{"line":166,"column":27},"end":{"line":166,"column":38}}}},"statementMap":{"1":{"start":{"line":1,"column":0},"end":{"line":194,"column":61}},"2":{"start":{"line":28,"column":0},"end":{"line":40,"column":65}},"3":{"start":{"line":50,"column":0},"end":{"line":192,"column":3}},"4":{"start":{"line":53,"column":8},"end":{"line":53,"column":30}},"5":{"start":{"line":55,"column":8},"end":{"line":55,"column":54}},"6":{"start":{"line":57,"column":8},"end":{"line":64,"column":11}},"7":{"start":{"line":66,"column":8},"end":{"line":66,"column":87}},"8":{"start":{"line":78,"column":8},"end":{"line":80,"column":21}},"9":{"start":{"line":82,"column":8},"end":{"line":82,"column":57}},"10":{"start":{"line":84,"column":8},"end":{"line":91,"column":9}},"11":{"start":{"line":85,"column":12},"end":{"line":90,"column":13}},"12":{"start":{"line":86,"column":16},"end":{"line":89,"column":19}},"13":{"start":{"line":93,"column":8},"end":{"line":93,"column":28}},"14":{"start":{"line":109,"column":8},"end":{"line":112,"column":20}},"15":{"start":{"line":114,"column":8},"end":{"line":114,"column":45}},"16":{"start":{"line":115,"column":8},"end":{"line":115,"column":87}},"17":{"start":{"line":117,"column":8},"end":{"line":117,"column":71}},"18":{"start":{"line":118,"column":8},"end":{"line":118,"column":73}},"19":{"start":{"line":120,"column":8},"end":{"line":120,"column":54}},"20":{"start":{"line":122,"column":8},"end":{"line":122,"column":27}},"21":{"start":{"line":134,"column":8},"end":{"line":138,"column":19}},"22":{"start":{"line":140,"column":8},"end":{"line":155,"column":9}},"23":{"start":{"line":141,"column":12},"end":{"line":141,"column":46}},"24":{"start":{"line":143,"column":12},"end":{"line":149,"column":13}},"25":{"start":{"line":144,"column":16},"end":{"line":144,"column":58}},"26":{"start":{"line":145,"column":16},"end":{"line":147,"column":17}},"27":{"start":{"line":146,"column":20},"end":{"line":146,"column":87}},"28":{"start":{"line":148,"column":16},"end":{"line":148,"column":43}},"29":{"start":{"line":151,"column":15},"end":{"line":155,"column":9}},"30":{"start":{"line":152,"column":12},"end":{"line":154,"column":13}},"31":{"start":{"line":153,"column":16},"end":{"line":153,"column":65}},"32":{"start":{"line":157,"column":8},"end":{"line":157,"column":20}},"33":{"start":{"line":167,"column":8},"end":{"line":171,"column":22}},"34":{"start":{"line":173,"column":8},"end":{"line":173,"column":67}},"35":{"start":{"line":174,"column":8},"end":{"line":174,"column":63}},"36":{"start":{"line":176,"column":8},"end":{"line":178,"column":9}},"37":{"start":{"line":177,"column":12},"end":{"line":177,"column":70}}},"branchMap":{"1":{"line":85,"type":"if","locations":[{"start":{"line":85,"column":12},"end":{"line":85,"column":12}},{"start":{"line":85,"column":12},"end":{"line":85,"column":12}}]},"2":{"line":115,"type":"cond-expr","locations":[{"start":{"line":115,"column":66},"end":{"line":115,"column":74}},{"start":{"line":115,"column":77},"end":{"line":115,"column":86}}]},"3":{"line":140,"type":"if","locations":[{"start":{"line":140,"column":8},"end":{"line":140,"column":8}},{"start":{"line":140,"column":8},"end":{"line":140,"column":8}}]},"4":{"line":143,"type":"if","locations":[{"start":{"line":143,"column":12},"end":{"line":143,"column":12}},{"start":{"line":143,"column":12},"end":{"line":143,"column":12}}]},"5":{"line":151,"type":"if","locations":[{"start":{"line":151,"column":15},"end":{"line":151,"column":15}},{"start":{"line":151,"column":15},"end":{"line":151,"column":15}}]},"6":{"line":152,"type":"if","locations":[{"start":{"line":152,"column":12},"end":{"line":152,"column":12}},{"start":{"line":152,"column":12},"end":{"line":152,"column":12}}]},"7":{"line":176,"type":"if","locations":[{"start":{"line":176,"column":8},"end":{"line":176,"column":8}},{"start":{"line":176,"column":8},"end":{"line":176,"column":8}}]},"8":{"line":176,"type":"binary-expr","locations":[{"start":{"line":176,"column":12},"end":{"line":176,"column":22}},{"start":{"line":176,"column":26},"end":{"line":176,"column":35}}]}},"code":["(function () { YUI.add('moodle-atto_multilang2-button', function (Y, NAME) {","","// This file is part of Moodle - http://moodle.org/","//","// Moodle is free software: you can redistribute it and/or modify","// it under the terms of the GNU General Public License as published by","// the Free Software Foundation, either version 3 of the License, or","// (at your option) any later version.","//","// Moodle is distributed in the hope that it will be useful,","// but WITHOUT ANY WARRANTY; without even the implied warranty of","// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the","// GNU General Public License for more details.","//","// You should have received a copy of the GNU General Public License","// along with Moodle. If not, see .","","/**"," * @package atto_multilang2"," * @copyright 2015 onwards Julen Pardo & Mondragon Unibertsitatea"," * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later"," */","","/**"," * @module moodle-atto_multilang2-button"," */","","var CLASSES = {"," TAG: 'filter-multilang-tag'"," },",""," LANG_WILDCARD = '%lang',"," CONTENT_WILDCARD = '%content',"," ATTR_LANGUAGES = 'languages',"," DEFAULT_LANGUAGE = '{\"en\":\"English (en)\"}',",""," TEMPLATE = '' +"," ' {mlang ' + LANG_WILDCARD + '}' +"," CONTENT_WILDCARD +"," '{mlang} ';","","/**"," * Atto text editor multilanguage plugin."," *"," * @namespace M.atto_multilang2"," * @class button"," * @extends M.editor_atto.EditorPlugin"," */","","Y.namespace('M.atto_multilang2').Button = Y.Base.create('button', Y.M.editor_atto.EditorPlugin, [], {",""," initializer: function() {"," var toolbarItems = [];",""," toolbarItems = this._initializeToolbarItems();",""," this.addToolbarMenu({"," globalItemConfig: {"," callback: this._addTags"," },"," icon: 'icon',"," iconComponent: 'atto_multilang2',"," items: toolbarItems"," });",""," this.get('host').on('atto:selectionchanged', this._checkSelectionChange, this);"," },",""," /**"," * Initializes the toolbar items, which will be the installed languages,"," * received as parameter."," *"," * @method _initializeToolbarItems"," * @private"," * @return {Array} installed language strings"," */"," _initializeToolbarItems: function() {"," var toolbarItems = [],"," languages,"," langCode;",""," languages = JSON.parse(this.get(ATTR_LANGUAGES));",""," for (langCode in languages) {"," if (languages.hasOwnProperty(langCode)) {"," toolbarItems.push({"," text: languages[langCode],"," callbackArgs: langCode"," });"," }"," }",""," return toolbarItems;"," },",""," /**"," * Retrieves the selected text, wraps it with the multilang tags,"," * and replaces the selected text in the editor with with it."," *"," * If there is no content selected, a \" \" will be inserted; otherwhise,"," * it's impossible to place the cursor inside the {mlang} tags."," *"," * @method _addTags"," * @param {EventFacade} e"," * @param {string} langCode the language code"," * @private"," */"," _addTags: function(e, langCode) {"," var selection,"," host = this.get('host'),"," taggedContent = TEMPLATE,"," content;",""," selection = this._getSelectionHTML();"," content = (host.getSelection().toString().length === 0) ? ' ' : selection;",""," taggedContent = taggedContent.replace(LANG_WILDCARD, langCode);"," taggedContent = taggedContent.replace(CONTENT_WILDCARD, content);",""," host.insertContentAtFocusPoint(taggedContent);",""," this.markUpdated();"," },",""," /**"," * Retrieves selected text with its HTML."," * Took from: http://stackoverflow.com/questions/4176923/html-of-selected-text/4177234#4177234"," *"," * @method _getSelectionHTML"," * @private"," * @return {string} selected text's html; empty if nothing selected"," */"," _getSelectionHTML: function() {"," var html = '',"," selection,"," container,"," index,"," lenght;",""," if (typeof window.getSelection !== 'undefined') {"," selection = window.getSelection();",""," if (selection.rangeCount) {"," container = document.createElement('div');"," for (index = 0, lenght = selection.rangeCount; index < lenght; ++index) {"," container.appendChild(selection.getRangeAt(index).cloneContents());"," }"," html = container.innerHTML;"," }",""," } else if (typeof document.selection !== 'undefined') {"," if (document.selection.type === 'Text') {"," html = document.selection.createRange().htmlText;"," }"," }",""," return html;"," },"," /**"," * Listens to every change of the text cursor in the text area. If the"," * cursor is placed within a multilang tag, the whole tag is selected."," *"," * @method _checkSelectionChange"," * @private"," */"," _checkSelectionChange: function() {"," var host = this.get('host'),"," node = host.getSelectionParentNode(),"," nodeValue = Y.one(node).get('text'),"," isTextNode,"," isLangTag;",""," isTextNode = Y.one(node).toString().indexOf('#text') > - 1;"," isLangTag = (nodeValue.match(/\\{mlang/g).length === 1);",""," if (isTextNode && isLangTag) {"," host.setSelection(host.getSelectionFromNode(Y.one(node)));"," }"," }","","}, {"," ATTRS: {"," /**"," * The list of installed languages"," *"," * @attribute languages"," * @type array"," * @default {\"en\":\"English (en)\"}"," */"," languages: DEFAULT_LANGUAGE"," }","});","","}, '@VERSION@', {\"requires\": [\"moodle-editor_atto-plugin\"]});","","}());"]}; + __coverage__['build/moodle-atto_multilang2-button/moodle-atto_multilang2-button.js'] = {"path":"build/moodle-atto_multilang2-button/moodle-atto_multilang2-button.js","s":{"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0},"b":{"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[0,0]},"f":{"1":0,"2":0,"3":0,"4":0,"5":0,"6":0},"fnMap":{"1":{"name":"(anonymous_1)","line":1,"loc":{"start":{"line":1,"column":41},"end":{"line":1,"column":60}}},"2":{"name":"(anonymous_2)","line":53,"loc":{"start":{"line":53,"column":17},"end":{"line":53,"column":28}}},"3":{"name":"(anonymous_3)","line":81,"loc":{"start":{"line":81,"column":29},"end":{"line":81,"column":40}}},"4":{"name":"(anonymous_4)","line":112,"loc":{"start":{"line":112,"column":14},"end":{"line":112,"column":36}}},"5":{"name":"(anonymous_5)","line":137,"loc":{"start":{"line":137,"column":23},"end":{"line":137,"column":34}}},"6":{"name":"(anonymous_6)","line":170,"loc":{"start":{"line":170,"column":27},"end":{"line":170,"column":38}}}},"statementMap":{"1":{"start":{"line":1,"column":0},"end":{"line":200,"column":61}},"2":{"start":{"line":28,"column":0},"end":{"line":41,"column":65}},"3":{"start":{"line":51,"column":0},"end":{"line":197,"column":3}},"4":{"start":{"line":54,"column":8},"end":{"line":55,"column":30}},"5":{"start":{"line":57,"column":8},"end":{"line":70,"column":9}},"6":{"start":{"line":58,"column":12},"end":{"line":58,"column":58}},"7":{"start":{"line":60,"column":12},"end":{"line":67,"column":15}},"8":{"start":{"line":69,"column":12},"end":{"line":69,"column":91}},"9":{"start":{"line":82,"column":8},"end":{"line":84,"column":21}},"10":{"start":{"line":86,"column":8},"end":{"line":86,"column":57}},"11":{"start":{"line":88,"column":8},"end":{"line":95,"column":9}},"12":{"start":{"line":89,"column":12},"end":{"line":94,"column":13}},"13":{"start":{"line":90,"column":16},"end":{"line":93,"column":19}},"14":{"start":{"line":97,"column":8},"end":{"line":97,"column":28}},"15":{"start":{"line":113,"column":8},"end":{"line":116,"column":20}},"16":{"start":{"line":118,"column":8},"end":{"line":118,"column":45}},"17":{"start":{"line":119,"column":8},"end":{"line":119,"column":87}},"18":{"start":{"line":121,"column":8},"end":{"line":121,"column":71}},"19":{"start":{"line":122,"column":8},"end":{"line":122,"column":73}},"20":{"start":{"line":124,"column":8},"end":{"line":124,"column":54}},"21":{"start":{"line":126,"column":8},"end":{"line":126,"column":27}},"22":{"start":{"line":138,"column":8},"end":{"line":142,"column":19}},"23":{"start":{"line":144,"column":8},"end":{"line":159,"column":9}},"24":{"start":{"line":145,"column":12},"end":{"line":145,"column":46}},"25":{"start":{"line":147,"column":12},"end":{"line":153,"column":13}},"26":{"start":{"line":148,"column":16},"end":{"line":148,"column":58}},"27":{"start":{"line":149,"column":16},"end":{"line":151,"column":17}},"28":{"start":{"line":150,"column":20},"end":{"line":150,"column":87}},"29":{"start":{"line":152,"column":16},"end":{"line":152,"column":43}},"30":{"start":{"line":155,"column":15},"end":{"line":159,"column":9}},"31":{"start":{"line":156,"column":12},"end":{"line":158,"column":13}},"32":{"start":{"line":157,"column":16},"end":{"line":157,"column":65}},"33":{"start":{"line":161,"column":8},"end":{"line":161,"column":20}},"34":{"start":{"line":171,"column":8},"end":{"line":175,"column":22}},"35":{"start":{"line":177,"column":8},"end":{"line":177,"column":67}},"36":{"start":{"line":178,"column":8},"end":{"line":178,"column":63}},"37":{"start":{"line":180,"column":8},"end":{"line":182,"column":9}},"38":{"start":{"line":181,"column":12},"end":{"line":181,"column":70}}},"branchMap":{"1":{"line":57,"type":"if","locations":[{"start":{"line":57,"column":8},"end":{"line":57,"column":8}},{"start":{"line":57,"column":8},"end":{"line":57,"column":8}}]},"2":{"line":89,"type":"if","locations":[{"start":{"line":89,"column":12},"end":{"line":89,"column":12}},{"start":{"line":89,"column":12},"end":{"line":89,"column":12}}]},"3":{"line":119,"type":"cond-expr","locations":[{"start":{"line":119,"column":66},"end":{"line":119,"column":74}},{"start":{"line":119,"column":77},"end":{"line":119,"column":86}}]},"4":{"line":144,"type":"if","locations":[{"start":{"line":144,"column":8},"end":{"line":144,"column":8}},{"start":{"line":144,"column":8},"end":{"line":144,"column":8}}]},"5":{"line":147,"type":"if","locations":[{"start":{"line":147,"column":12},"end":{"line":147,"column":12}},{"start":{"line":147,"column":12},"end":{"line":147,"column":12}}]},"6":{"line":155,"type":"if","locations":[{"start":{"line":155,"column":15},"end":{"line":155,"column":15}},{"start":{"line":155,"column":15},"end":{"line":155,"column":15}}]},"7":{"line":156,"type":"if","locations":[{"start":{"line":156,"column":12},"end":{"line":156,"column":12}},{"start":{"line":156,"column":12},"end":{"line":156,"column":12}}]},"8":{"line":180,"type":"if","locations":[{"start":{"line":180,"column":8},"end":{"line":180,"column":8}},{"start":{"line":180,"column":8},"end":{"line":180,"column":8}}]},"9":{"line":180,"type":"binary-expr","locations":[{"start":{"line":180,"column":12},"end":{"line":180,"column":22}},{"start":{"line":180,"column":26},"end":{"line":180,"column":35}}]}},"code":["(function () { YUI.add('moodle-atto_multilang2-button', function (Y, NAME) {","","// This file is part of Moodle - http://moodle.org/","//","// Moodle is free software: you can redistribute it and/or modify","// it under the terms of the GNU General Public License as published by","// the Free Software Foundation, either version 3 of the License, or","// (at your option) any later version.","//","// Moodle is distributed in the hope that it will be useful,","// but WITHOUT ANY WARRANTY; without even the implied warranty of","// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the","// GNU General Public License for more details.","//","// You should have received a copy of the GNU General Public License","// along with Moodle. If not, see .","","/**"," * @package atto_multilang2"," * @copyright 2015 onwards Julen Pardo & Mondragon Unibertsitatea"," * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later"," */","","/**"," * @module moodle-atto_multilang2-button"," */","","var CLASSES = {"," TAG: 'filter-multilang-tag'"," },",""," LANG_WILDCARD = '%lang',"," CONTENT_WILDCARD = '%content',"," ATTR_LANGUAGES = 'languages',"," ATTR_CAPABILITY = 'capability',"," DEFAULT_LANGUAGE = '{\"en\":\"English (en)\"}',",""," TEMPLATE = '' +"," ' {mlang ' + LANG_WILDCARD + '}' +"," CONTENT_WILDCARD +"," '{mlang} ';","","/**"," * Atto text editor multilanguage plugin."," *"," * @namespace M.atto_multilang2"," * @class button"," * @extends M.editor_atto.EditorPlugin"," */","","Y.namespace('M.atto_multilang2').Button = Y.Base.create('button', Y.M.editor_atto.EditorPlugin, [], {",""," initializer: function() {"," var hascapability = this.get(ATTR_CAPABILITY),"," toolbarItems = [];",""," if (hascapability) {"," toolbarItems = this._initializeToolbarItems();",""," this.addToolbarMenu({"," globalItemConfig: {"," callback: this._addTags"," },"," icon: 'icon',"," iconComponent: 'atto_multilang2',"," items: toolbarItems"," });",""," this.get('host').on('atto:selectionchanged', this._checkSelectionChange, this);"," }"," },",""," /**"," * Initializes the toolbar items, which will be the installed languages,"," * received as parameter."," *"," * @method _initializeToolbarItems"," * @private"," * @return {Array} installed language strings"," */"," _initializeToolbarItems: function() {"," var toolbarItems = [],"," languages,"," langCode;",""," languages = JSON.parse(this.get(ATTR_LANGUAGES));",""," for (langCode in languages) {"," if (languages.hasOwnProperty(langCode)) {"," toolbarItems.push({"," text: languages[langCode],"," callbackArgs: langCode"," });"," }"," }",""," return toolbarItems;"," },",""," /**"," * Retrieves the selected text, wraps it with the multilang tags,"," * and replaces the selected text in the editor with with it."," *"," * If there is no content selected, a \" \" will be inserted; otherwhise,"," * it's impossible to place the cursor inside the {mlang} tags."," *"," * @method _addTags"," * @param {EventFacade} e"," * @param {string} langCode the language code"," * @private"," */"," _addTags: function(e, langCode) {"," var selection,"," host = this.get('host'),"," taggedContent = TEMPLATE,"," content;",""," selection = this._getSelectionHTML();"," content = (host.getSelection().toString().length === 0) ? ' ' : selection;",""," taggedContent = taggedContent.replace(LANG_WILDCARD, langCode);"," taggedContent = taggedContent.replace(CONTENT_WILDCARD, content);",""," host.insertContentAtFocusPoint(taggedContent);",""," this.markUpdated();"," },",""," /**"," * Retrieves selected text with its HTML."," * Took from: http://stackoverflow.com/questions/4176923/html-of-selected-text/4177234#4177234"," *"," * @method _getSelectionHTML"," * @private"," * @return {string} selected text's html; empty if nothing selected"," */"," _getSelectionHTML: function() {"," var html = '',"," selection,"," container,"," index,"," lenght;",""," if (typeof window.getSelection !== 'undefined') {"," selection = window.getSelection();",""," if (selection.rangeCount) {"," container = document.createElement('div');"," for (index = 0, lenght = selection.rangeCount; index < lenght; ++index) {"," container.appendChild(selection.getRangeAt(index).cloneContents());"," }"," html = container.innerHTML;"," }",""," } else if (typeof document.selection !== 'undefined') {"," if (document.selection.type === 'Text') {"," html = document.selection.createRange().htmlText;"," }"," }",""," return html;"," },"," /**"," * Listens to every change of the text cursor in the text area. If the"," * cursor is placed within a multilang tag, the whole tag is selected."," *"," * @method _checkSelectionChange"," * @private"," */"," _checkSelectionChange: function() {"," var host = this.get('host'),"," node = host.getSelectionParentNode(),"," nodeValue = Y.one(node).get('text'),"," isTextNode,"," isLangTag;",""," isTextNode = Y.one(node).toString().indexOf('#text') > - 1;"," isLangTag = (nodeValue.match(/\\{mlang/g).length === 1);",""," if (isTextNode && isLangTag) {"," host.setSelection(host.getSelectionFromNode(Y.one(node)));"," }"," }","","}, {"," ATTRS: {"," /**"," * The list of installed languages"," *"," * @attribute languages"," * @type array"," * @default {\"en\":\"English (en)\"}"," */"," languages: DEFAULT_LANGUAGE,"," capability: true"," }","});","","","}, '@VERSION@', {\"requires\": [\"moodle-editor_atto-plugin\"]});","","}());"]}; } var __cov_xlcucJyua6odXhLRctX6xg = __coverage__['build/moodle-atto_multilang2-button/moodle-atto_multilang2-button.js']; -__cov_xlcucJyua6odXhLRctX6xg.s['1']++;YUI.add('moodle-atto_multilang2-button',function(Y,NAME){__cov_xlcucJyua6odXhLRctX6xg.f['1']++;__cov_xlcucJyua6odXhLRctX6xg.s['2']++;var CLASSES={TAG:'filter-multilang-tag'},LANG_WILDCARD='%lang',CONTENT_WILDCARD='%content',ATTR_LANGUAGES='languages',DEFAULT_LANGUAGE='{"en":"English (en)"}',TEMPLATE=''+' {mlang '+LANG_WILDCARD+'}'+CONTENT_WILDCARD+'{mlang} ';__cov_xlcucJyua6odXhLRctX6xg.s['3']++;Y.namespace('M.atto_multilang2').Button=Y.Base.create('button',Y.M.editor_atto.EditorPlugin,[],{initializer:function(){__cov_xlcucJyua6odXhLRctX6xg.f['2']++;__cov_xlcucJyua6odXhLRctX6xg.s['4']++;var toolbarItems=[];__cov_xlcucJyua6odXhLRctX6xg.s['5']++;toolbarItems=this._initializeToolbarItems();__cov_xlcucJyua6odXhLRctX6xg.s['6']++;this.addToolbarMenu({globalItemConfig:{callback:this._addTags},icon:'icon',iconComponent:'atto_multilang2',items:toolbarItems});__cov_xlcucJyua6odXhLRctX6xg.s['7']++;this.get('host').on('atto:selectionchanged',this._checkSelectionChange,this);},_initializeToolbarItems:function(){__cov_xlcucJyua6odXhLRctX6xg.f['3']++;__cov_xlcucJyua6odXhLRctX6xg.s['8']++;var toolbarItems=[],languages,langCode;__cov_xlcucJyua6odXhLRctX6xg.s['9']++;languages=JSON.parse(this.get(ATTR_LANGUAGES));__cov_xlcucJyua6odXhLRctX6xg.s['10']++;for(langCode in languages){__cov_xlcucJyua6odXhLRctX6xg.s['11']++;if(languages.hasOwnProperty(langCode)){__cov_xlcucJyua6odXhLRctX6xg.b['1'][0]++;__cov_xlcucJyua6odXhLRctX6xg.s['12']++;toolbarItems.push({text:languages[langCode],callbackArgs:langCode});}else{__cov_xlcucJyua6odXhLRctX6xg.b['1'][1]++;}}__cov_xlcucJyua6odXhLRctX6xg.s['13']++;return toolbarItems;},_addTags:function(e,langCode){__cov_xlcucJyua6odXhLRctX6xg.f['4']++;__cov_xlcucJyua6odXhLRctX6xg.s['14']++;var selection,host=this.get('host'),taggedContent=TEMPLATE,content;__cov_xlcucJyua6odXhLRctX6xg.s['15']++;selection=this._getSelectionHTML();__cov_xlcucJyua6odXhLRctX6xg.s['16']++;content=host.getSelection().toString().length===0?(__cov_xlcucJyua6odXhLRctX6xg.b['2'][0]++,' '):(__cov_xlcucJyua6odXhLRctX6xg.b['2'][1]++,selection);__cov_xlcucJyua6odXhLRctX6xg.s['17']++;taggedContent=taggedContent.replace(LANG_WILDCARD,langCode);__cov_xlcucJyua6odXhLRctX6xg.s['18']++;taggedContent=taggedContent.replace(CONTENT_WILDCARD,content);__cov_xlcucJyua6odXhLRctX6xg.s['19']++;host.insertContentAtFocusPoint(taggedContent);__cov_xlcucJyua6odXhLRctX6xg.s['20']++;this.markUpdated();},_getSelectionHTML:function(){__cov_xlcucJyua6odXhLRctX6xg.f['5']++;__cov_xlcucJyua6odXhLRctX6xg.s['21']++;var html='',selection,container,index,lenght;__cov_xlcucJyua6odXhLRctX6xg.s['22']++;if(typeof window.getSelection!=='undefined'){__cov_xlcucJyua6odXhLRctX6xg.b['3'][0]++;__cov_xlcucJyua6odXhLRctX6xg.s['23']++;selection=window.getSelection();__cov_xlcucJyua6odXhLRctX6xg.s['24']++;if(selection.rangeCount){__cov_xlcucJyua6odXhLRctX6xg.b['4'][0]++;__cov_xlcucJyua6odXhLRctX6xg.s['25']++;container=document.createElement('div');__cov_xlcucJyua6odXhLRctX6xg.s['26']++;for(index=0,lenght=selection.rangeCount;index-1;__cov_xlcucJyua6odXhLRctX6xg.s['35']++;isLangTag=nodeValue.match(/\{mlang/g).length===1;__cov_xlcucJyua6odXhLRctX6xg.s['36']++;if((__cov_xlcucJyua6odXhLRctX6xg.b['8'][0]++,isTextNode)&&(__cov_xlcucJyua6odXhLRctX6xg.b['8'][1]++,isLangTag)){__cov_xlcucJyua6odXhLRctX6xg.b['7'][0]++;__cov_xlcucJyua6odXhLRctX6xg.s['37']++;host.setSelection(host.getSelectionFromNode(Y.one(node)));}else{__cov_xlcucJyua6odXhLRctX6xg.b['7'][1]++;}}},{ATTRS:{languages:DEFAULT_LANGUAGE}});},'@VERSION@',{'requires':['moodle-editor_atto-plugin']}); +__cov_xlcucJyua6odXhLRctX6xg.s['1']++;YUI.add('moodle-atto_multilang2-button',function(Y,NAME){__cov_xlcucJyua6odXhLRctX6xg.f['1']++;__cov_xlcucJyua6odXhLRctX6xg.s['2']++;var CLASSES={TAG:'filter-multilang-tag'},LANG_WILDCARD='%lang',CONTENT_WILDCARD='%content',ATTR_LANGUAGES='languages',ATTR_CAPABILITY='capability',DEFAULT_LANGUAGE='{"en":"English (en)"}',TEMPLATE=''+' {mlang '+LANG_WILDCARD+'}'+CONTENT_WILDCARD+'{mlang} ';__cov_xlcucJyua6odXhLRctX6xg.s['3']++;Y.namespace('M.atto_multilang2').Button=Y.Base.create('button',Y.M.editor_atto.EditorPlugin,[],{initializer:function(){__cov_xlcucJyua6odXhLRctX6xg.f['2']++;__cov_xlcucJyua6odXhLRctX6xg.s['4']++;var hascapability=this.get(ATTR_CAPABILITY),toolbarItems=[];__cov_xlcucJyua6odXhLRctX6xg.s['5']++;if(hascapability){__cov_xlcucJyua6odXhLRctX6xg.b['1'][0]++;__cov_xlcucJyua6odXhLRctX6xg.s['6']++;toolbarItems=this._initializeToolbarItems();__cov_xlcucJyua6odXhLRctX6xg.s['7']++;this.addToolbarMenu({globalItemConfig:{callback:this._addTags},icon:'icon',iconComponent:'atto_multilang2',items:toolbarItems});__cov_xlcucJyua6odXhLRctX6xg.s['8']++;this.get('host').on('atto:selectionchanged',this._checkSelectionChange,this);}else{__cov_xlcucJyua6odXhLRctX6xg.b['1'][1]++;}},_initializeToolbarItems:function(){__cov_xlcucJyua6odXhLRctX6xg.f['3']++;__cov_xlcucJyua6odXhLRctX6xg.s['9']++;var toolbarItems=[],languages,langCode;__cov_xlcucJyua6odXhLRctX6xg.s['10']++;languages=JSON.parse(this.get(ATTR_LANGUAGES));__cov_xlcucJyua6odXhLRctX6xg.s['11']++;for(langCode in languages){__cov_xlcucJyua6odXhLRctX6xg.s['12']++;if(languages.hasOwnProperty(langCode)){__cov_xlcucJyua6odXhLRctX6xg.b['2'][0]++;__cov_xlcucJyua6odXhLRctX6xg.s['13']++;toolbarItems.push({text:languages[langCode],callbackArgs:langCode});}else{__cov_xlcucJyua6odXhLRctX6xg.b['2'][1]++;}}__cov_xlcucJyua6odXhLRctX6xg.s['14']++;return toolbarItems;},_addTags:function(e,langCode){__cov_xlcucJyua6odXhLRctX6xg.f['4']++;__cov_xlcucJyua6odXhLRctX6xg.s['15']++;var selection,host=this.get('host'),taggedContent=TEMPLATE,content;__cov_xlcucJyua6odXhLRctX6xg.s['16']++;selection=this._getSelectionHTML();__cov_xlcucJyua6odXhLRctX6xg.s['17']++;content=host.getSelection().toString().length===0?(__cov_xlcucJyua6odXhLRctX6xg.b['3'][0]++,' '):(__cov_xlcucJyua6odXhLRctX6xg.b['3'][1]++,selection);__cov_xlcucJyua6odXhLRctX6xg.s['18']++;taggedContent=taggedContent.replace(LANG_WILDCARD,langCode);__cov_xlcucJyua6odXhLRctX6xg.s['19']++;taggedContent=taggedContent.replace(CONTENT_WILDCARD,content);__cov_xlcucJyua6odXhLRctX6xg.s['20']++;host.insertContentAtFocusPoint(taggedContent);__cov_xlcucJyua6odXhLRctX6xg.s['21']++;this.markUpdated();},_getSelectionHTML:function(){__cov_xlcucJyua6odXhLRctX6xg.f['5']++;__cov_xlcucJyua6odXhLRctX6xg.s['22']++;var html='',selection,container,index,lenght;__cov_xlcucJyua6odXhLRctX6xg.s['23']++;if(typeof window.getSelection!=='undefined'){__cov_xlcucJyua6odXhLRctX6xg.b['4'][0]++;__cov_xlcucJyua6odXhLRctX6xg.s['24']++;selection=window.getSelection();__cov_xlcucJyua6odXhLRctX6xg.s['25']++;if(selection.rangeCount){__cov_xlcucJyua6odXhLRctX6xg.b['5'][0]++;__cov_xlcucJyua6odXhLRctX6xg.s['26']++;container=document.createElement('div');__cov_xlcucJyua6odXhLRctX6xg.s['27']++;for(index=0,lenght=selection.rangeCount;index-1;__cov_xlcucJyua6odXhLRctX6xg.s['36']++;isLangTag=nodeValue.match(/\{mlang/g).length===1;__cov_xlcucJyua6odXhLRctX6xg.s['37']++;if((__cov_xlcucJyua6odXhLRctX6xg.b['9'][0]++,isTextNode)&&(__cov_xlcucJyua6odXhLRctX6xg.b['9'][1]++,isLangTag)){__cov_xlcucJyua6odXhLRctX6xg.b['8'][0]++;__cov_xlcucJyua6odXhLRctX6xg.s['38']++;host.setSelection(host.getSelectionFromNode(Y.one(node)));}else{__cov_xlcucJyua6odXhLRctX6xg.b['8'][1]++;}}},{ATTRS:{languages:DEFAULT_LANGUAGE,capability:true}});},'@VERSION@',{'requires':['moodle-editor_atto-plugin']}); diff --git a/yui/build/moodle-atto_multilang2-button/moodle-atto_multilang2-button-debug.js b/yui/build/moodle-atto_multilang2-button/moodle-atto_multilang2-button-debug.js index c994cbea209d..f7f8c5820c95 100644 --- a/yui/build/moodle-atto_multilang2-button/moodle-atto_multilang2-button-debug.js +++ b/yui/build/moodle-atto_multilang2-button/moodle-atto_multilang2-button-debug.js @@ -32,6 +32,7 @@ var CLASSES = { LANG_WILDCARD = '%lang', CONTENT_WILDCARD = '%content', ATTR_LANGUAGES = 'languages', + ATTR_CAPABILITY = 'capability', DEFAULT_LANGUAGE = '{"en":"English (en)"}', TEMPLATE = '' + @@ -50,20 +51,23 @@ var CLASSES = { Y.namespace('M.atto_multilang2').Button = Y.Base.create('button', Y.M.editor_atto.EditorPlugin, [], { initializer: function() { - var toolbarItems = []; - - toolbarItems = this._initializeToolbarItems(); - - this.addToolbarMenu({ - globalItemConfig: { - callback: this._addTags - }, - icon: 'icon', - iconComponent: 'atto_multilang2', - items: toolbarItems - }); - - this.get('host').on('atto:selectionchanged', this._checkSelectionChange, this); + var hascapability = this.get(ATTR_CAPABILITY), + toolbarItems = []; + + if (hascapability) { + toolbarItems = this._initializeToolbarItems(); + + this.addToolbarMenu({ + globalItemConfig: { + callback: this._addTags + }, + icon: 'icon', + iconComponent: 'atto_multilang2', + items: toolbarItems + }); + + this.get('host').on('atto:selectionchanged', this._checkSelectionChange, this); + } }, /** @@ -187,8 +191,10 @@ Y.namespace('M.atto_multilang2').Button = Y.Base.create('button', Y.M.editor_att * @type array * @default {"en":"English (en)"} */ - languages: DEFAULT_LANGUAGE + languages: DEFAULT_LANGUAGE, + capability: true } }); + }, '@VERSION@', {"requires": ["moodle-editor_atto-plugin"]}); diff --git a/yui/build/moodle-atto_multilang2-button/moodle-atto_multilang2-button-min.js b/yui/build/moodle-atto_multilang2-button/moodle-atto_multilang2-button-min.js index 1198170ff0eb..ffd0d7076f28 100644 --- a/yui/build/moodle-atto_multilang2-button/moodle-atto_multilang2-button-min.js +++ b/yui/build/moodle-atto_multilang2-button/moodle-atto_multilang2-button-min.js @@ -1 +1 @@ -YUI.add("moodle-atto_multilang2-button",function(e,t){var n={TAG:"filter-multilang-tag"},r="%lang",i="%content",s="languages",o='{"en":"English (en)"}',u=' {mlang '+r+"}"+i+'{mlang} ';e.namespace("M.atto_multilang2").Button=e.Base.create("button",e.M.editor_atto.EditorPlugin,[],{initializer:function(){var e=[];e=this._initializeToolbarItems(),this.addToolbarMenu({globalItemConfig:{callback:this._addTags},icon:"icon",iconComponent:"atto_multilang2",items:e}),this.get("host").on("atto:selectionchanged",this._checkSelectionChange,this)},_initializeToolbarItems:function(){var e=[],t,n;t=JSON.parse(this.get(s));for(n in t)t.hasOwnProperty(n)&&e.push({text:t[n],callbackArgs:n});return e},_addTags:function(e,t){var n,s=this.get("host"),o=u,a;n=this._getSelectionHTML(),a=s.getSelection().toString().length===0?" ":n,o=o.replace(r,t),o=o.replace(i,a),s.insertContentAtFocusPoint(o),this.markUpdated()},_getSelectionHTML:function(){var e="",t,n,r,i;if(typeof window.getSelection!="undefined"){t=window.getSelection();if(t.rangeCount){n=document.createElement("div");for(r=0,i=t.rangeCount;r-1,s=r.match(/\{mlang/g).length===1,i&&s&&t.setSelection(t.getSelectionFromNode(e.one(n)))}},{ATTRS:{languages:o}})},"@VERSION@",{requires:["moodle-editor_atto-plugin"]}); +YUI.add("moodle-atto_multilang2-button",function(e,t){var n={TAG:"filter-multilang-tag"},r="%lang",i="%content",s="languages",o="capability",u='{"en":"English (en)"}',a=' {mlang '+r+"}"+i+'{mlang} ';e.namespace("M.atto_multilang2").Button=e.Base.create("button",e.M.editor_atto.EditorPlugin,[],{initializer:function(){var e=this.get(o),t=[];e&&(t=this._initializeToolbarItems(),this.addToolbarMenu({globalItemConfig:{callback:this._addTags},icon:"icon",iconComponent:"atto_multilang2",items:t}),this.get("host").on("atto:selectionchanged",this._checkSelectionChange,this))},_initializeToolbarItems:function(){var e=[],t,n;t=JSON.parse(this.get(s));for(n in t)t.hasOwnProperty(n)&&e.push({text:t[n],callbackArgs:n});return e},_addTags:function(e,t){var n,s=this.get("host"),o=a,u;n=this._getSelectionHTML(),u=s.getSelection().toString().length===0?" ":n,o=o.replace(r,t),o=o.replace(i,u),s.insertContentAtFocusPoint(o),this.markUpdated()},_getSelectionHTML:function(){var e="",t,n,r,i;if(typeof window.getSelection!="undefined"){t=window.getSelection();if(t.rangeCount){n=document.createElement("div");for(r=0,i=t.rangeCount;r-1,s=r.match(/\{mlang/g).length===1,i&&s&&t.setSelection(t.getSelectionFromNode(e.one(n)))}},{ATTRS:{languages:u,capability:!0}})},"@VERSION@",{requires:["moodle-editor_atto-plugin"]}); diff --git a/yui/build/moodle-atto_multilang2-button/moodle-atto_multilang2-button.js b/yui/build/moodle-atto_multilang2-button/moodle-atto_multilang2-button.js index c994cbea209d..f7f8c5820c95 100644 --- a/yui/build/moodle-atto_multilang2-button/moodle-atto_multilang2-button.js +++ b/yui/build/moodle-atto_multilang2-button/moodle-atto_multilang2-button.js @@ -32,6 +32,7 @@ var CLASSES = { LANG_WILDCARD = '%lang', CONTENT_WILDCARD = '%content', ATTR_LANGUAGES = 'languages', + ATTR_CAPABILITY = 'capability', DEFAULT_LANGUAGE = '{"en":"English (en)"}', TEMPLATE = '' + @@ -50,20 +51,23 @@ var CLASSES = { Y.namespace('M.atto_multilang2').Button = Y.Base.create('button', Y.M.editor_atto.EditorPlugin, [], { initializer: function() { - var toolbarItems = []; - - toolbarItems = this._initializeToolbarItems(); - - this.addToolbarMenu({ - globalItemConfig: { - callback: this._addTags - }, - icon: 'icon', - iconComponent: 'atto_multilang2', - items: toolbarItems - }); - - this.get('host').on('atto:selectionchanged', this._checkSelectionChange, this); + var hascapability = this.get(ATTR_CAPABILITY), + toolbarItems = []; + + if (hascapability) { + toolbarItems = this._initializeToolbarItems(); + + this.addToolbarMenu({ + globalItemConfig: { + callback: this._addTags + }, + icon: 'icon', + iconComponent: 'atto_multilang2', + items: toolbarItems + }); + + this.get('host').on('atto:selectionchanged', this._checkSelectionChange, this); + } }, /** @@ -187,8 +191,10 @@ Y.namespace('M.atto_multilang2').Button = Y.Base.create('button', Y.M.editor_att * @type array * @default {"en":"English (en)"} */ - languages: DEFAULT_LANGUAGE + languages: DEFAULT_LANGUAGE, + capability: true } }); + }, '@VERSION@', {"requires": ["moodle-editor_atto-plugin"]}); diff --git a/yui/src/button/js/button.js b/yui/src/button/js/button.js index fc8d03811c09..43999ee08977 100644 --- a/yui/src/button/js/button.js +++ b/yui/src/button/js/button.js @@ -30,6 +30,7 @@ var CLASSES = { LANG_WILDCARD = '%lang', CONTENT_WILDCARD = '%content', ATTR_LANGUAGES = 'languages', + ATTR_CAPABILITY = 'capability', DEFAULT_LANGUAGE = '{"en":"English (en)"}', TEMPLATE = '' + @@ -48,20 +49,23 @@ var CLASSES = { Y.namespace('M.atto_multilang2').Button = Y.Base.create('button', Y.M.editor_atto.EditorPlugin, [], { initializer: function() { - var toolbarItems = []; - - toolbarItems = this._initializeToolbarItems(); - - this.addToolbarMenu({ - globalItemConfig: { - callback: this._addTags - }, - icon: 'icon', - iconComponent: 'atto_multilang2', - items: toolbarItems - }); - - this.get('host').on('atto:selectionchanged', this._checkSelectionChange, this); + var hascapability = this.get(ATTR_CAPABILITY), + toolbarItems = []; + + if (hascapability) { + toolbarItems = this._initializeToolbarItems(); + + this.addToolbarMenu({ + globalItemConfig: { + callback: this._addTags + }, + icon: 'icon', + iconComponent: 'atto_multilang2', + items: toolbarItems + }); + + this.get('host').on('atto:selectionchanged', this._checkSelectionChange, this); + } }, /** @@ -185,6 +189,7 @@ Y.namespace('M.atto_multilang2').Button = Y.Base.create('button', Y.M.editor_att * @type array * @default {"en":"English (en)"} */ - languages: DEFAULT_LANGUAGE + languages: DEFAULT_LANGUAGE, + capability: true } -}); \ No newline at end of file +});